summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKanoj Sarcar <kanoj@engr.sgi.com>2000-04-04 20:49:44 +0000
committerKanoj Sarcar <kanoj@engr.sgi.com>2000-04-04 20:49:44 +0000
commit91e096ed92faa6c3ab6c703ee42bd0ad76b8957b (patch)
tree25340fb6232bd9de844a0dc1c7020b68c3dc6c2a /arch
parent09b51a8bad6352607cc40618d3be5a7525eb4470 (diff)
Added a few klconfig functions from IRIX. This triggered some house cleaning,
ie, moving type declarations into sn/types.h and moving klconfig code from ip27-init.c into ip27-klconfig.c.
Diffstat (limited to 'arch')
-rw-r--r--arch/mips64/sgi-ip27/ip27-init.c63
-rw-r--r--arch/mips64/sgi-ip27/ip27-klconfig.c123
-rw-r--r--arch/mips64/sgi-ip27/ip27-memory.c2
-rw-r--r--arch/mips64/sgi-ip27/ip27-timer.c2
4 files changed, 122 insertions, 68 deletions
diff --git a/arch/mips64/sgi-ip27/ip27-init.c b/arch/mips64/sgi-ip27/ip27-init.c
index 5c0ab4062..1c4caad15 100644
--- a/arch/mips64/sgi-ip27/ip27-init.c
+++ b/arch/mips64/sgi-ip27/ip27-init.c
@@ -15,9 +15,6 @@
#include <asm/processor.h>
#include <asm/sn/launch.h>
-typedef unsigned long cpumask_t; /* into asm/sn/types.h */
-typedef unsigned long cpuid_t;
-
#define CPUMASK_CLRALL(p) (p) = 0
#define CPUMASK_SETB(p, bit) (p) |= 1 << (bit)
#define CPUMASK_CLRB(p, bit) (p) &= ~(1ULL << (bit))
@@ -57,51 +54,6 @@ int is_fine_dirmode(void)
>> NSRI_REGIONSIZE_SHFT) & REGIONSIZE_FINE);
}
-lboard_t * find_lboard_real(lboard_t *start, unsigned char brd_type)
-{
- /* Search all boards stored on this node. */
- while (start) {
- if (start->brd_type == brd_type)
- return start;
- start = KLCF_NEXT(start);
- }
- /* Didn't find it. */
- return (lboard_t *)NULL;
-}
-
-klinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)
-{
- int index, j;
-
- if (kli == (klinfo_t *)NULL) {
- index = 0;
- } else {
- for (j = 0; j < KLCF_NUM_COMPS(brd); j++)
- if (kli == KLCF_COMP(brd, j))
- break;
- index = j;
- if (index == KLCF_NUM_COMPS(brd)) {
- printk("find_component: Bad pointer: 0x%p\n", kli);
- return (klinfo_t *)NULL;
- }
- index++; /* next component */
- }
-
- for (; index < KLCF_NUM_COMPS(brd); index++) {
- kli = KLCF_COMP(brd, index);
- if (KLCF_COMP_TYPE(kli) == struct_type)
- return kli;
- }
-
- /* Didn't find it. */
- return (klinfo_t *)NULL;
-}
-
-klinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)
-{
- return find_component(brd, (klinfo_t *)NULL, struct_type);
-}
-
nasid_t get_actual_nasid(lboard_t *brd)
{
klhub_t *hub;
@@ -127,7 +79,7 @@ int do_cpumask(cnodeid_t cnode, nasid_t nasid, cpumask_t *boot_cpumask,
int cpus_found = 0;
cpuid_t cpuid;
- brd = find_lboard_real((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
+ brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
do {
acpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU);
@@ -148,7 +100,7 @@ int do_cpumask(cnodeid_t cnode, nasid_t nasid, cpumask_t *boot_cpumask,
}
brd = KLCF_NEXT(brd);
if (brd)
- brd = find_lboard_real(brd,KLTYPE_IP27);
+ brd = find_lboard(brd,KLTYPE_IP27);
else
break;
} while (brd);
@@ -321,12 +273,11 @@ void allowboot(void)
if (CPUMASK_TSTB(boot_cpumask, cpu)) {
num_cpus++;
- /*
- * Launch a slave into bootstrap().
- * It doesn't take an argument, and we'll
- * take care of sp and gp when we get there.
- */
-/* cputonasid/cputoslice not working yet */
+ /*
+ * Launch a slave into bootstrap().
+ * It doesn't take an argument, and we'll
+ * take care of sp and gp when we get there.
+ */
LAUNCH_SLAVE(cputonasid(cpu), cputoslice(cpu), 0, 0, 0, 0);
}
}
diff --git a/arch/mips64/sgi-ip27/ip27-klconfig.c b/arch/mips64/sgi-ip27/ip27-klconfig.c
index 54073abfd..e1ca1e19a 100644
--- a/arch/mips64/sgi-ip27/ip27-klconfig.c
+++ b/arch/mips64/sgi-ip27/ip27-klconfig.c
@@ -13,21 +13,124 @@
#include <linux/mm.h>
#include <asm/sn/klconfig.h>
+#include <asm/sn/arch.h>
+#include <asm/sn/gda.h>
-lboard_t *find_lboard(unsigned int type)
+klinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)
{
- lboard_t *b;
+ int index, j;
- for (
-b = KL_CONFIG_INFO(get_nasid());
-b;
-b = KLCF_NEXT(b)) {
- if (KLCF_REMOTE(b))
- continue; /* Skip remote boards. */
+ if (kli == (klinfo_t *)NULL) {
+ index = 0;
+ } else {
+ for (j = 0; j < KLCF_NUM_COMPS(brd); j++)
+ if (kli == KLCF_COMP(brd, j))
+ break;
+ index = j;
+ if (index == KLCF_NUM_COMPS(brd)) {
+ printk("find_component: Bad pointer: 0x%p\n", kli);
+ return (klinfo_t *)NULL;
+ }
+ index++; /* next component */
+ }
+
+ for (; index < KLCF_NUM_COMPS(brd); index++) {
+ kli = KLCF_COMP(brd, index);
+ if (KLCF_COMP_TYPE(kli) == struct_type)
+ return kli;
+ }
+
+ /* Didn't find it. */
+ return (klinfo_t *)NULL;
+}
- if (b->brd_type == type)
- return (lboard_t *) b;
+klinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)
+{
+ return find_component(brd, (klinfo_t *)NULL, struct_type);
+}
+
+lboard_t * find_lboard(lboard_t *start, unsigned char brd_type)
+{
+ /* Search all boards stored on this node. */
+ while (start) {
+ if (start->brd_type == brd_type)
+ return start;
+ start = KLCF_NEXT(start);
}
+ /* Didn't find it. */
+ return (lboard_t *)NULL;
+}
+cnodeid_t get_cpu_cnode(int cpu)
+{
+ return CPUID_TO_COMPACT_NODEID(cpu);
+}
+
+klcpu_t * nasid_slice_to_cpuinfo(nasid_t nasid, int slice)
+{
+ lboard_t *brd;
+ klcpu_t *acpu;
+
+ if (!(brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27)))
+ return (klcpu_t *)NULL;
+
+ if (!(acpu = (klcpu_t *)find_first_component(brd, KLSTRUCT_CPU)))
+ return (klcpu_t *)NULL;
+
+ do {
+ if ((acpu->cpu_info.physid) == slice)
+ return acpu;
+ } while ((acpu = (klcpu_t *)find_component(brd, (klinfo_t *)acpu,
+ KLSTRUCT_CPU)));
+ return (klcpu_t *)NULL;
+}
+
+klcpu_t * sn_get_cpuinfo(cpuid_t cpu)
+{
+ nasid_t nasid;
+ int slice;
+ klcpu_t *acpu;
+ gda_t *gdap = GDA;
+ cnodeid_t cnode;
+
+ if (!(cpu < MAXCPUS)) {
+ printk("sn_get_cpuinfo: illegal cpuid 0x%lx\n", cpu);
+ return NULL;
+ }
+
+ cnode = get_cpu_cnode(cpu);
+ if (cnode == INVALID_CNODEID)
+ return NULL;
+
+ if ((nasid = gdap->g_nasidtable[cnode]) == INVALID_NASID)
+ return NULL;
+
+ for (slice = 0; slice < CPUS_PER_NODE; slice++) {
+ acpu = nasid_slice_to_cpuinfo(nasid, slice);
+ if (acpu && acpu->cpu_info.virtid == cpu)
+ return acpu;
+ }
return NULL;
}
+
+int get_cpu_slice(cpuid_t cpu)
+{
+ klcpu_t *acpu;
+
+ if ((acpu = sn_get_cpuinfo(cpu)) == NULL)
+ return -1;
+ return acpu->cpu_info.physid;
+}
+
+void alloc_cpupda(int i)
+{
+ cnodeid_t node;
+ nasid_t nasid;
+
+ node = get_cpu_cnode(i);
+ nasid = COMPACT_TO_NASID_NODEID(node);
+
+ cputonasid(i) = nasid;
+ cputocnode(i) = node;
+ cputoslice(i) = get_cpu_slice(i);
+}
diff --git a/arch/mips64/sgi-ip27/ip27-memory.c b/arch/mips64/sgi-ip27/ip27-memory.c
index 0394d2ca0..abd0c10e1 100644
--- a/arch/mips64/sgi-ip27/ip27-memory.c
+++ b/arch/mips64/sgi-ip27/ip27-memory.c
@@ -124,7 +124,7 @@ static pfn_t slot_psize_compute(cnodeid_t node, int slot)
nasid = COMPACT_TO_NASID_NODEID(node);
/* Find the node board */
- brd = find_lboard_real((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
+ brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IP27);
if (!brd)
return 0;
diff --git a/arch/mips64/sgi-ip27/ip27-timer.c b/arch/mips64/sgi-ip27/ip27-timer.c
index 5b74fffc0..6f9abac50 100644
--- a/arch/mips64/sgi-ip27/ip27-timer.c
+++ b/arch/mips64/sgi-ip27/ip27-timer.c
@@ -258,7 +258,7 @@ void __init time_init(void)
xtime.tv_usec = 0;
/* Don't use ARCS. ARCS is fragile. Klconfig is simple and sane. */
- board = find_lboard(KLTYPE_IP27);
+ board = find_lboard(KL_CONFIG_INFO(get_nasid()), KLTYPE_IP27);
if (!board)
panic("Can't find board info for myself.");