diff options
Diffstat (limited to 'arch/x86/kernel/apic/x2apic_uv_x.c')
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 2bda6935297..ef0ae207a7c 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -105,7 +105,7 @@ static void uv_vector_allocation_domain(int cpu, struct cpumask *retmask)  	cpumask_set_cpu(cpu, retmask);  } -static int uv_wakeup_secondary(int phys_apicid, unsigned long start_rip) +static int __cpuinit uv_wakeup_secondary(int phys_apicid, unsigned long start_rip)  {  #ifdef CONFIG_SMP  	unsigned long val; @@ -562,7 +562,7 @@ void __init uv_system_init(void)  	union uvh_node_id_u node_id;  	unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size;  	int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; -	int max_pnode = 0; +	int gnode_extra, max_pnode = 0;  	unsigned long mmr_base, present, paddr;  	unsigned short pnode_mask; @@ -574,6 +574,13 @@ void __init uv_system_init(void)  	mmr_base =  	    uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) &  	    ~UV_MMR_ENABLE; +	pnode_mask = (1 << n_val) - 1; +	node_id.v = uv_read_local_mmr(UVH_NODE_ID); +	gnode_extra = (node_id.s.node_id & ~((1 << n_val) - 1)) >> 1; +	gnode_upper = ((unsigned long)gnode_extra  << m_val); +	printk(KERN_DEBUG "UV: N %d, M %d, gnode_upper 0x%lx, gnode_extra 0x%x\n", +			n_val, m_val, gnode_upper, gnode_extra); +  	printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base);  	for(i = 0; i < UVH_NODE_PRESENT_TABLE_DEPTH; i++) @@ -583,15 +590,18 @@ void __init uv_system_init(void)  	bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades();  	uv_blade_info = kmalloc(bytes, GFP_KERNEL); +	BUG_ON(!uv_blade_info);  	get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size);  	bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes();  	uv_node_to_blade = kmalloc(bytes, GFP_KERNEL); +	BUG_ON(!uv_node_to_blade);  	memset(uv_node_to_blade, 255, bytes);  	bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus();  	uv_cpu_to_blade = kmalloc(bytes, GFP_KERNEL); +	BUG_ON(!uv_cpu_to_blade);  	memset(uv_cpu_to_blade, 255, bytes);  	blade = 0; @@ -607,11 +617,6 @@ void __init uv_system_init(void)  		}  	} -	pnode_mask = (1 << n_val) - 1; -	node_id.v = uv_read_local_mmr(UVH_NODE_ID); -	gnode_upper = (((unsigned long)node_id.s.node_id) & -		       ~((1 << n_val) - 1)) << m_val; -  	uv_bios_init();  	uv_bios_get_sn_info(0, &uv_type, &sn_partition_id,  			    &sn_coherency_id, &sn_region_size); @@ -634,6 +639,7 @@ void __init uv_system_init(void)  		uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask;  		uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;  		uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; +		uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra;  		uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base;  		uv_cpu_hub_info(cpu)->coherency_domain_number = sn_coherency_id;  		uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu;  |