Преглед изворни кода

x86: make UV support configurable

Make X86 SGI Ultraviolet support configurable. Saves about 13K of text size
on my modest config.

   text    data     bss     dec     hex filename
6770537 1158680  694356 8623573  8395d5 vmlinux
6757492 1157664  694228 8609384  835e68 vmlinux.nouv

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Nick Piggin пре 16 година
родитељ
комит
03b486322e

+ 7 - 0
arch/x86/Kconfig

@@ -391,6 +391,13 @@ config X86_RDC321X
 	  as R-8610-(G).
 	  as R-8610-(G).
 	  If you don't have one of these chips, you should say N here.
 	  If you don't have one of these chips, you should say N here.
 
 
+config X86_UV
+	bool "SGI Ultraviolet"
+	depends on X86_64
+	help
+	  This option is needed in order to support SGI Ultraviolet systems.
+	  If you don't have one of these, you should say N here.
+
 config SCHED_OMIT_FRAME_POINTER
 config SCHED_OMIT_FRAME_POINTER
 	def_bool y
 	def_bool y
 	prompt "Single-depth WCHAN output"
 	prompt "Single-depth WCHAN output"

+ 3 - 3
arch/x86/include/asm/uv/uv.h

@@ -3,7 +3,7 @@
 
 
 enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
 enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
 
 
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86_UV
 
 
 extern enum uv_system_type get_uv_system_type(void);
 extern enum uv_system_type get_uv_system_type(void);
 extern int is_uv_system(void);
 extern int is_uv_system(void);
@@ -15,7 +15,7 @@ extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 						 unsigned long va,
 						 unsigned long va,
 						 unsigned int cpu);
 						 unsigned int cpu);
 
 
-#else	/* X86_64 */
+#else	/* X86_UV */
 
 
 static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
 static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
 static inline int is_uv_system(void)	{ return 0; }
 static inline int is_uv_system(void)	{ return 0; }
@@ -28,6 +28,6 @@ uv_flush_tlb_others(const struct cpumask *cpumask, struct mm_struct *mm,
 		    unsigned long va, unsigned int cpu)
 		    unsigned long va, unsigned int cpu)
 { return cpumask; }
 { return cpumask; }
 
 
-#endif	/* X86_64 */
+#endif	/* X86_UV */
 
 
 #endif	/* _ASM_X86_UV_UV_H */
 #endif	/* _ASM_X86_UV_UV_H */

+ 3 - 2
arch/x86/kernel/Makefile

@@ -115,10 +115,11 @@ obj-$(CONFIG_SWIOTLB)			+= pci-swiotlb_64.o # NB rename without _64
 ###
 ###
 # 64 bit specific files
 # 64 bit specific files
 ifeq ($(CONFIG_X86_64),y)
 ifeq ($(CONFIG_X86_64),y)
-        obj-y				+= genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
-	obj-y				+= bios_uv.o uv_irq.o uv_sysfs.o
+        obj-y				+= genapic_64.o genapic_flat_64.o
         obj-y				+= genx2apic_cluster.o
         obj-y				+= genx2apic_cluster.o
         obj-y				+= genx2apic_phys.o
         obj-y				+= genx2apic_phys.o
+	obj-$(CONFIG_X86_UV)		+= genx2apic_uv_x.o tlb_uv.o
+	obj-$(CONFIG_X86_UV)		+= bios_uv.o uv_irq.o uv_sysfs.o
         obj-$(CONFIG_X86_PM_TIMER)	+= pmtimer_64.o
         obj-$(CONFIG_X86_PM_TIMER)	+= pmtimer_64.o
         obj-$(CONFIG_AUDIT)		+= audit_64.o
         obj-$(CONFIG_AUDIT)		+= audit_64.o
 
 

+ 2 - 0
arch/x86/kernel/efi.c

@@ -366,10 +366,12 @@ void __init efi_init(void)
 					SMBIOS_TABLE_GUID)) {
 					SMBIOS_TABLE_GUID)) {
 			efi.smbios = config_tables[i].table;
 			efi.smbios = config_tables[i].table;
 			printk(" SMBIOS=0x%lx ", config_tables[i].table);
 			printk(" SMBIOS=0x%lx ", config_tables[i].table);
+#ifdef CONFIG_X86_UV
 		} else if (!efi_guidcmp(config_tables[i].guid,
 		} else if (!efi_guidcmp(config_tables[i].guid,
 					UV_SYSTEM_TABLE_GUID)) {
 					UV_SYSTEM_TABLE_GUID)) {
 			efi.uv_systab = config_tables[i].table;
 			efi.uv_systab = config_tables[i].table;
 			printk(" UVsystab=0x%lx ", config_tables[i].table);
 			printk(" UVsystab=0x%lx ", config_tables[i].table);
+#endif
 		} else if (!efi_guidcmp(config_tables[i].guid,
 		} else if (!efi_guidcmp(config_tables[i].guid,
 					HCDP_TABLE_GUID)) {
 					HCDP_TABLE_GUID)) {
 			efi.hcdp = config_tables[i].table;
 			efi.hcdp = config_tables[i].table;

+ 2 - 0
arch/x86/kernel/entry_64.S

@@ -982,8 +982,10 @@ apicinterrupt IRQ_MOVE_CLEANUP_VECTOR \
 	irq_move_cleanup_interrupt smp_irq_move_cleanup_interrupt
 	irq_move_cleanup_interrupt smp_irq_move_cleanup_interrupt
 #endif
 #endif
 
 
+#ifdef CONFIG_X86_UV
 apicinterrupt UV_BAU_MESSAGE \
 apicinterrupt UV_BAU_MESSAGE \
 	uv_bau_message_intr1 uv_bau_message_interrupt
 	uv_bau_message_intr1 uv_bau_message_interrupt
+#endif
 apicinterrupt LOCAL_TIMER_VECTOR \
 apicinterrupt LOCAL_TIMER_VECTOR \
 	apic_timer_interrupt smp_apic_timer_interrupt
 	apic_timer_interrupt smp_apic_timer_interrupt
 
 

+ 2 - 0
arch/x86/kernel/genapic_64.c

@@ -32,7 +32,9 @@ extern struct genapic apic_x2apic_cluster;
 struct genapic __read_mostly *genapic = &apic_flat;
 struct genapic __read_mostly *genapic = &apic_flat;
 
 
 static struct genapic *apic_probe[] __initdata = {
 static struct genapic *apic_probe[] __initdata = {
+#ifdef CONFIG_X86_UV
 	&apic_x2apic_uv_x,
 	&apic_x2apic_uv_x,
+#endif
 	&apic_x2apic_phys,
 	&apic_x2apic_phys,
 	&apic_x2apic_cluster,
 	&apic_x2apic_cluster,
 	&apic_physflat,
 	&apic_physflat,

+ 1 - 1
arch/x86/kernel/io_apic.c

@@ -3765,7 +3765,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
 }
 }
 #endif /* CONFIG_HT_IRQ */
 #endif /* CONFIG_HT_IRQ */
 
 
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_X86_UV
 /*
 /*
  * Re-target the irq to the specified CPU and enable the specified MMR located
  * Re-target the irq to the specified CPU and enable the specified MMR located
  * on the specified blade to allow the sending of MSIs to the specified CPU.
  * on the specified blade to allow the sending of MSIs to the specified CPU.

+ 2 - 2
drivers/misc/Kconfig

@@ -170,7 +170,7 @@ config ENCLOSURE_SERVICES
 config SGI_XP
 config SGI_XP
 	tristate "Support communication between SGI SSIs"
 	tristate "Support communication between SGI SSIs"
 	depends on NET
 	depends on NET
-	depends on (IA64_GENERIC || IA64_SGI_SN2 || IA64_SGI_UV || X86_64) && SMP
+	depends on (IA64_GENERIC || IA64_SGI_SN2 || IA64_SGI_UV || X86_UV) && SMP
 	select IA64_UNCACHED_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
 	select IA64_UNCACHED_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
 	select GENERIC_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
 	select GENERIC_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
 	select SGI_GRU if (IA64_GENERIC || IA64_SGI_UV || X86_64) && SMP
 	select SGI_GRU if (IA64_GENERIC || IA64_SGI_UV || X86_64) && SMP
@@ -197,7 +197,7 @@ config HP_ILO
 
 
 config SGI_GRU
 config SGI_GRU
 	tristate "SGI GRU driver"
 	tristate "SGI GRU driver"
-	depends on (X86_64 || IA64_SGI_UV || IA64_GENERIC) && SMP
+	depends on (X86_UV || IA64_SGI_UV || IA64_GENERIC) && SMP
 	default n
 	default n
 	select MMU_NOTIFIER
 	select MMU_NOTIFIER
 	---help---
 	---help---