diff options
Diffstat (limited to 'arch/mips64/sgi-ip27/ip27-init.c')
-rw-r--r-- | arch/mips64/sgi-ip27/ip27-init.c | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/arch/mips64/sgi-ip27/ip27-init.c b/arch/mips64/sgi-ip27/ip27-init.c index 882e58f33..fea427a16 100644 --- a/arch/mips64/sgi-ip27/ip27-init.c +++ b/arch/mips64/sgi-ip27/ip27-init.c @@ -15,6 +15,7 @@ #include <asm/smp.h> #include <asm/processor.h> #include <asm/sn/launch.h> +#include <asm/sn/sn_private.h> #define CPU_NONE (cpuid_t)-1 @@ -23,11 +24,17 @@ #define CPUMASK_CLRB(p, bit) (p) &= ~(1ULL << (bit)) #define CPUMASK_TSTB(p, bit) ((p) & (1ULL << (bit))) +#define CNODEMASK_CLRALL(p) (p) = 0 +#define CNODEMASK_TSTB(p, bit) ((p) & (1ULL << (bit))) +#define CNODEMASK_SETB(p, bit) ((p) |= 1ULL << (bit)) + cpumask_t boot_cpumask; static volatile cpumask_t boot_barrier; hubreg_t region_mask = 0; static int fine_mode = 0; int maxcpus; +static spinlock_t hub_mask_lock = SPIN_LOCK_UNLOCKED; +static cnodemask_t hub_init_mask; cnodeid_t nasid_to_compact_node[MAX_NASIDS]; nasid_t compact_to_nasid_node[MAX_COMPACT_NODES]; @@ -194,6 +201,7 @@ void mlreset (void) initpdas(); gen_region_mask(®ion_mask, numnodes); + CNODEMASK_CLRALL(hub_init_mask); /* * Set all nodes' calias sizes to 8k @@ -269,28 +277,67 @@ void sn_mp_setup(void) #endif } +void per_hub_init(cnodeid_t cnode) +{ + cnodemask_t done; + + spin_lock(&hub_mask_lock); + /* Test our bit. */ + if (!(done = CNODEMASK_TSTB(hub_init_mask, cnode))) { + /* Turn our bit on in the mask. */ + CNODEMASK_SETB(hub_init_mask, cnode); + } + spin_unlock(&hub_mask_lock); + + /* + * Do the actual initialization if it hasn't been done yet. + * We don't need to hold a lock for this work. + */ + if (!done) { + hub_rtc_init(cnode); + } +} + +/* + * This is similar to hard_smp_processor_id(). + */ +cpuid_t getcpuid(void) +{ + klcpu_t *klcpu; + + klcpu = nasid_slice_to_cpuinfo(get_nasid(),LOCAL_HUB_L(PI_CPU_NUM)); + return klcpu->cpu_info.virtid; +} + void per_cpu_init(void) { #if 0 cpuid_t cpu = getcpuid(); +#endif cnodeid_t cnode = get_compact_nodeid(); +#if 0 intr_init(); +#endif + set_cp0_status(ST0_IM, 0); + cpu_time_init(); per_hub_init(cnode); +#if 0 install_cpuintr(cpu); install_tlbintr(cpu); #endif } -/* - * This is similar to hard_smp_processor_id(). - */ -cpuid_t getcpuid(void) +cnodeid_t get_compact_nodeid(void) { - klcpu_t *klcpu; + nasid_t nasid; - klcpu = nasid_slice_to_cpuinfo(get_nasid(),LOCAL_HUB_L(PI_CPU_NUM)); - return klcpu->cpu_info.virtid; + nasid = get_nasid(); + /* + * Map the physical node id to a virtual node id (virtual node ids + * are contiguous). + */ + return NASID_TO_COMPACT_NODEID(nasid); } #ifdef CONFIG_SMP @@ -318,8 +365,8 @@ void cboot(void) { atomic_inc(&numstarted); CPUMASK_CLRB(boot_barrier, getcpuid()); /* needs atomicity */ -#if 0 per_cpu_init(); +#if 0 ecc_init(); bte_lateinit(); init_mfhi_war(); @@ -337,7 +384,7 @@ void allowboot(void) extern void bootstrap(void); sn_mp_setup(); - per_cpu_init(); + /* Master has already done per_cpu_init() */ #if 0 bte_lateinit(); ecc_init(); |