diff options
Diffstat (limited to 'arch/x86/kernel/apic')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/es7000_32.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 47 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/ipi.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/numaq_32.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_phys.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 42 | 
8 files changed, 46 insertions, 74 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 8c7c042ecad..0a1c2830ec6 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -140,7 +140,6 @@ int x2apic_mode;  #ifdef CONFIG_X86_X2APIC  /* x2apic enabled before OS handover */  static int x2apic_preenabled; -static int disable_x2apic;  static __init int setup_nox2apic(char *str)  {  	if (x2apic_enabled()) { @@ -149,7 +148,6 @@ static __init int setup_nox2apic(char *str)  		return 0;  	} -	disable_x2apic = 1;  	setup_clear_cpu_cap(X86_FEATURE_X2APIC);  	return 0;  } diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c index 69328ac8de9..8952a589028 100644 --- a/arch/x86/kernel/apic/es7000_32.c +++ b/arch/x86/kernel/apic/es7000_32.c @@ -652,7 +652,8 @@ static int es7000_mps_oem_check_cluster(struct mpc_table *mpc, char *oem,  	return ret && es7000_apic_is_cluster();  } -struct apic apic_es7000_cluster = { +/* We've been warned by a false positive warning.Use __refdata to keep calm. */ +struct apic __refdata apic_es7000_cluster = {  	.name				= "es7000",  	.probe				= probe_es7000, diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 4d0216fcb36..d2ed6c5ddc8 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1716,25 +1716,19 @@ __apicdebuginit(void) print_IO_APIC(void)  	return;  } -__apicdebuginit(void) print_APIC_bitfield(int base) +__apicdebuginit(void) print_APIC_field(int base)  { -	unsigned int v; -	int i, j; +	int i;  	if (apic_verbosity == APIC_QUIET)  		return; -	printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG); -	for (i = 0; i < 8; i++) { -		v = apic_read(base + i*0x10); -		for (j = 0; j < 32; j++) { -			if (v & (1<<j)) -				printk("1"); -			else -				printk("0"); -		} -		printk("\n"); -	} +	printk(KERN_DEBUG); + +	for (i = 0; i < 8; i++) +		printk(KERN_CONT "%08x", apic_read(base + i*0x10)); + +	printk(KERN_CONT "\n");  }  __apicdebuginit(void) print_local_APIC(void *dummy) @@ -1745,7 +1739,7 @@ __apicdebuginit(void) print_local_APIC(void *dummy)  	if (apic_verbosity == APIC_QUIET)  		return; -	printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n", +	printk(KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",  		smp_processor_id(), hard_smp_processor_id());  	v = apic_read(APIC_ID);  	printk(KERN_INFO "... APIC ID:      %08x (%01x)\n", v, read_apic_id()); @@ -1786,11 +1780,11 @@ __apicdebuginit(void) print_local_APIC(void *dummy)  	printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);  	printk(KERN_DEBUG "... APIC ISR field:\n"); -	print_APIC_bitfield(APIC_ISR); +	print_APIC_field(APIC_ISR);  	printk(KERN_DEBUG "... APIC TMR field:\n"); -	print_APIC_bitfield(APIC_TMR); +	print_APIC_field(APIC_TMR);  	printk(KERN_DEBUG "... APIC IRR field:\n"); -	print_APIC_bitfield(APIC_IRR); +	print_APIC_field(APIC_IRR);  	if (APIC_INTEGRATED(ver)) {             /* !82489DX */  		if (maxlvt > 3)         /* Due to the Pentium erratum 3AP. */ @@ -3799,6 +3793,9 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,  	mmr_pnode = uv_blade_to_pnode(mmr_blade);  	uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value); +	if (cfg->move_in_progress) +		send_cleanup_vector(cfg); +  	return irq;  } @@ -4187,28 +4184,20 @@ fake_ioapic_page:  	}  } -static int __init ioapic_insert_resources(void) +void __init ioapic_insert_resources(void)  {  	int i;  	struct resource *r = ioapic_resources;  	if (!r) { -		if (nr_ioapics > 0) { +		if (nr_ioapics > 0)  			printk(KERN_ERR  				"IO APIC resources couldn't be allocated.\n"); -			return -1; -		} -		return 0; +		return;  	}  	for (i = 0; i < nr_ioapics; i++) {  		insert_resource(&iomem_resource, r);  		r++;  	} - -	return 0;  } - -/* Insert the IO APIC resources after PCI initialization has occured to handle - * IO APICS that are mapped in on a BAR in PCI space. */ -late_initcall(ioapic_insert_resources); diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c index e6b4f517fcf..08385e090a6 100644 --- a/arch/x86/kernel/apic/ipi.c +++ b/arch/x86/kernel/apic/ipi.c @@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)  	unsigned long mask = cpumask_bits(cpumask)[0];  	unsigned long flags; +	if (WARN_ONCE(!mask, "empty IPI mask")) +		return; +  	local_irq_save(flags);  	WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]);  	__default_send_IPI_dest_field(mask, vector, apic->dest_logical); diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index 533e59c6fc8..ca96e68f0d2 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c @@ -493,7 +493,8 @@ static void numaq_setup_portio_remap(void)  		(u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD);  } -struct apic apic_numaq = { +/* Use __refdata to keep false positive warning calm.	*/ +struct apic __refdata apic_numaq = {  	.name				= "NUMAQ",  	.probe				= probe_numaq, diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 8e4cbb255c3..a5371ec3677 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c @@ -17,11 +17,13 @@ static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)  	return x2apic_enabled();  } -/* Start with all IRQs pointing to boot CPU.  IRQ balancing will shift them. */ - +/* + * need to use more than cpu 0, because we need more vectors when + * MSI-X are used. + */  static const struct cpumask *x2apic_target_cpus(void)  { -	return cpumask_of(0); +	return cpu_online_mask;  }  /* @@ -170,7 +172,7 @@ static unsigned long set_apic_id(unsigned int id)  static int x2apic_cluster_phys_pkg_id(int initial_apicid, int index_msb)  { -	return current_cpu_data.initial_apicid >> index_msb; +	return initial_apicid >> index_msb;  }  static void x2apic_send_IPI_self(int vector) diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index a284359627e..a8989aadc99 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c @@ -27,11 +27,13 @@ static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)  		return 0;  } -/* Start with all IRQs pointing to boot CPU.  IRQ balancing will shift them. */ - +/* + * need to use more than cpu 0, because we need more vectors when + * MSI-X are used. + */  static const struct cpumask *x2apic_target_cpus(void)  { -	return cpumask_of(0); +	return cpu_online_mask;  }  static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask) @@ -162,7 +164,7 @@ static unsigned long set_apic_id(unsigned int id)  static int x2apic_phys_pkg_id(int initial_apicid, int index_msb)  { -	return current_cpu_data.initial_apicid >> index_msb; +	return initial_apicid >> index_msb;  }  static void x2apic_send_IPI_self(int vector) diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 096d19aea2f..601159374e8 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -46,7 +46,7 @@ static int early_get_nodeid(void)  	return node_id.s.node_id;  } -static int uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) +static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)  {  	if (!strcmp(oem_id, "SGI")) {  		if (!strcmp(oem_table_id, "UVL")) @@ -253,7 +253,7 @@ static void uv_send_IPI_self(int vector)  	apic_write(APIC_SELF_IPI, vector);  } -struct apic apic_x2apic_uv_x = { +struct apic __refdata apic_x2apic_uv_x = {  	.name				= "UV large system",  	.probe				= NULL, @@ -261,7 +261,7 @@ struct apic apic_x2apic_uv_x = {  	.apic_id_registered		= uv_apic_id_registered,  	.irq_delivery_mode		= dest_Fixed, -	.irq_dest_mode			= 1, /* logical */ +	.irq_dest_mode			= 0, /* physical */  	.target_cpus			= uv_target_cpus,  	.disable_esr			= 0, @@ -362,12 +362,6 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)  	BUG();  } -static __init void map_low_mmrs(void) -{ -	init_extra_mapping_uc(UV_GLOBAL_MMR32_BASE, UV_GLOBAL_MMR32_SIZE); -	init_extra_mapping_uc(UV_LOCAL_MMR_BASE, UV_LOCAL_MMR_SIZE); -} -  enum map_type {map_wb, map_uc};  static __init void map_high(char *id, unsigned long base, int shift, @@ -395,26 +389,6 @@ static __init void map_gru_high(int max_pnode)  		map_high("GRU", gru.s.base, shift, max_pnode, map_wb);  } -static __init void map_config_high(int max_pnode) -{ -	union uvh_rh_gam_cfg_overlay_config_mmr_u cfg; -	int shift = UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_SHFT; - -	cfg.v = uv_read_local_mmr(UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR); -	if (cfg.s.enable) -		map_high("CONFIG", cfg.s.base, shift, max_pnode, map_uc); -} - -static __init void map_mmr_high(int max_pnode) -{ -	union uvh_rh_gam_mmr_overlay_config_mmr_u mmr; -	int shift = UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT; - -	mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR); -	if (mmr.s.enable) -		map_high("MMR", mmr.s.base, shift, max_pnode, map_uc); -} -  static __init void map_mmioh_high(int max_pnode)  {  	union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh; @@ -566,8 +540,6 @@ void __init uv_system_init(void)  	unsigned long mmr_base, present, paddr;  	unsigned short pnode_mask; -	map_low_mmrs(); -  	m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG);  	m_val = m_n_config.s.m_skt;  	n_val = m_n_config.s.n_skt; @@ -591,6 +563,8 @@ 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); +	for (blade = 0; blade < uv_num_possible_blades(); blade++) +		uv_blade_info[blade].memory_nid = -1;  	get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); @@ -629,6 +603,9 @@ void __init uv_system_init(void)  		lcpu = uv_blade_info[blade].nr_possible_cpus;  		uv_blade_info[blade].nr_possible_cpus++; +		/* Any node on the blade, else will contain -1. */ +		uv_blade_info[blade].memory_nid = nid; +  		uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base;  		uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size;  		uv_cpu_hub_info(cpu)->m_val = m_val; @@ -662,11 +639,10 @@ void __init uv_system_init(void)  		pnode = (paddr >> m_val) & pnode_mask;  		blade = boot_pnode_to_blade(pnode);  		uv_node_to_blade[nid] = blade; +		max_pnode = max(pnode, max_pnode);  	}  	map_gru_high(max_pnode); -	map_mmr_high(max_pnode); -	map_config_high(max_pnode);  	map_mmioh_high(max_pnode);  	uv_cpu_init();  |