Path: blob/master/arch/mips/sgi-ip27/ip27-klconfig.c
10817 views
/*1* Copyright (C) 1999, 2000 Ralf Baechle ([email protected])2* Copyright (C) 1999, 2000 Silicon Graphics, Inc.3*/4#include <linux/init.h>5#include <linux/kernel.h>6#include <linux/sched.h>7#include <linux/interrupt.h>8#include <linux/kernel_stat.h>9#include <linux/param.h>10#include <linux/timex.h>11#include <linux/mm.h>1213#include <asm/sn/klconfig.h>14#include <asm/sn/arch.h>15#include <asm/sn/gda.h>1617klinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)18{19int index, j;2021if (kli == (klinfo_t *)NULL) {22index = 0;23} else {24for (j = 0; j < KLCF_NUM_COMPS(brd); j++)25if (kli == KLCF_COMP(brd, j))26break;27index = j;28if (index == KLCF_NUM_COMPS(brd)) {29printk("find_component: Bad pointer: 0x%p\n", kli);30return (klinfo_t *)NULL;31}32index++; /* next component */33}3435for (; index < KLCF_NUM_COMPS(brd); index++) {36kli = KLCF_COMP(brd, index);37if (KLCF_COMP_TYPE(kli) == struct_type)38return kli;39}4041/* Didn't find it. */42return (klinfo_t *)NULL;43}4445klinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)46{47return find_component(brd, (klinfo_t *)NULL, struct_type);48}4950lboard_t *find_lboard(lboard_t *start, unsigned char brd_type)51{52/* Search all boards stored on this node. */53while (start) {54if (start->brd_type == brd_type)55return start;56start = KLCF_NEXT(start);57}58/* Didn't find it. */59return (lboard_t *)NULL;60}6162lboard_t *find_lboard_class(lboard_t *start, unsigned char brd_type)63{64/* Search all boards stored on this node. */65while (start) {66if (KLCLASS(start->brd_type) == KLCLASS(brd_type))67return start;68start = KLCF_NEXT(start);69}7071/* Didn't find it. */72return (lboard_t *)NULL;73}7475cnodeid_t get_cpu_cnode(cpuid_t cpu)76{77return CPUID_TO_COMPACT_NODEID(cpu);78}7980klcpu_t *nasid_slice_to_cpuinfo(nasid_t nasid, int slice)81{82lboard_t *brd;83klcpu_t *acpu;8485if (!(brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27)))86return (klcpu_t *)NULL;8788if (!(acpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU)))89return (klcpu_t *)NULL;9091do {92if ((acpu->cpu_info.physid) == slice)93return acpu;94} while ((acpu = (klcpu_t *)find_component(brd, (klinfo_t *)acpu,95KLSTRUCT_CPU)));96return (klcpu_t *)NULL;97}9899klcpu_t *sn_get_cpuinfo(cpuid_t cpu)100{101nasid_t nasid;102int slice;103klcpu_t *acpu;104gda_t *gdap = GDA;105cnodeid_t cnode;106107if (!(cpu < MAXCPUS)) {108printk("sn_get_cpuinfo: illegal cpuid 0x%lx\n", cpu);109return NULL;110}111112cnode = get_cpu_cnode(cpu);113if (cnode == INVALID_CNODEID)114return NULL;115116if ((nasid = gdap->g_nasidtable[cnode]) == INVALID_NASID)117return NULL;118119for (slice = 0; slice < CPUS_PER_NODE; slice++) {120acpu = nasid_slice_to_cpuinfo(nasid, slice);121if (acpu && acpu->cpu_info.virtid == cpu)122return acpu;123}124return NULL;125}126127int get_cpu_slice(cpuid_t cpu)128{129klcpu_t *acpu;130131if ((acpu = sn_get_cpuinfo(cpu)) == NULL)132return -1;133return acpu->cpu_info.physid;134}135136137