[PATCH] 1/4 remove firmware features from cpu_spec

Stephen Rothwell sfr at canb.auug.org.au
Wed Aug 3 14:32:30 EST 2005


The firmware_features field of struct cpu_spec should really be a separate
variable as the firmware features do not depend on the chip and the
bitmask is constructed independently.  By removing it, we save 112 bytes
from the cpu_specs array and we access the bitmask directly instead of via
the cur_cpu_spec pointer.

Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
-- 
Cheers,
Stephen Rothwell                    sfr at canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff -ruNp linus/arch/ppc64/kernel/cputable.c linus-firmware.1/arch/ppc64/kernel/cputable.c
--- linus/arch/ppc64/kernel/cputable.c	2005-07-15 14:37:43.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/cputable.c	2005-07-22 16:48:41.000000000 +1000
@@ -23,6 +23,7 @@
 
 struct cpu_spec* cur_cpu_spec = NULL;
 EXPORT_SYMBOL(cur_cpu_spec);
+unsigned long ppc64_firmware_features;
 
 /* NOTE:
  * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
@@ -60,7 +61,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Power3+ */
 		.pvr_mask		= 0xffff0000,
@@ -73,7 +73,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Northstar */
 		.pvr_mask		= 0xffff0000,
@@ -86,7 +85,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Pulsar */
 		.pvr_mask		= 0xffff0000,
@@ -99,7 +97,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* I-star */
 		.pvr_mask		= 0xffff0000,
@@ -112,7 +109,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* S-star */
 		.pvr_mask		= 0xffff0000,
@@ -125,7 +121,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power3,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Power4 */
 		.pvr_mask		= 0xffff0000,
@@ -138,7 +133,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power4,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Power4+ */
 		.pvr_mask		= 0xffff0000,
@@ -151,7 +145,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power4,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* PPC970 */
 		.pvr_mask		= 0xffff0000,
@@ -166,7 +159,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_ppc970,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* PPC970FX */
 		.pvr_mask		= 0xffff0000,
@@ -181,7 +173,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_ppc970,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* PPC970MP */
 		.pvr_mask		= 0xffff0000,
@@ -196,7 +187,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_ppc970,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Power5 */
 		.pvr_mask		= 0xffff0000,
@@ -211,7 +201,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power4,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* Power5 */
 		.pvr_mask		= 0xffff0000,
@@ -226,7 +215,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power4,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* BE DD1.x */
 		.pvr_mask		= 0xffff0000,
@@ -241,7 +229,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_be,
-		.firmware_features	= COMMON_PPC64_FW,
 	},
 	{	/* default match */
 		.pvr_mask		= 0x00000000,
@@ -254,7 +241,6 @@ struct cpu_spec	cpu_specs[] = {
 		.icache_bsize		= 128,
 		.dcache_bsize		= 128,
 		.cpu_setup		= __setup_cpu_power4,
-		.firmware_features	= COMMON_PPC64_FW,
 	}
 };
 
diff -ruNp linus/arch/ppc64/kernel/lparcfg.c linus-firmware.1/arch/ppc64/kernel/lparcfg.c
--- linus/arch/ppc64/kernel/lparcfg.c	2005-06-27 16:08:00.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/lparcfg.c	2005-07-22 16:38:40.000000000 +1000
@@ -377,7 +377,7 @@ static int lparcfg_data(struct seq_file 
 
 	partition_active_processors = lparcfg_count_active_processors();
 
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR) {
 		unsigned long h_entitled, h_unallocated;
 		unsigned long h_aggregation, h_resource;
 		unsigned long pool_idle_time, pool_procs;
@@ -571,7 +571,7 @@ int __init lparcfg_init(void)
 	mode_t mode = S_IRUSR;
 
 	/* Allow writing if we have FW_FEATURE_SPLPAR */
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR) {
 		lparcfg_fops.write = lparcfg_write;
 		mode |= S_IWUSR;
 	}
diff -ruNp linus/arch/ppc64/kernel/pSeries_iommu.c linus-firmware.1/arch/ppc64/kernel/pSeries_iommu.c
--- linus/arch/ppc64/kernel/pSeries_iommu.c	2005-06-27 16:08:00.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/pSeries_iommu.c	2005-07-22 16:38:57.000000000 +1000
@@ -546,7 +546,7 @@ void iommu_init_early_pSeries(void)
 	}
 
 	if (systemcfg->platform & PLATFORM_LPAR) {
-		if (cur_cpu_spec->firmware_features & FW_FEATURE_MULTITCE) {
+		if (ppc64_firmware_features & FW_FEATURE_MULTITCE) {
 			ppc_md.tce_build = tce_buildmulti_pSeriesLP;
 			ppc_md.tce_free	 = tce_freemulti_pSeriesLP;
 		} else {
diff -ruNp linus/arch/ppc64/kernel/pSeries_setup.c linus-firmware.1/arch/ppc64/kernel/pSeries_setup.c
--- linus/arch/ppc64/kernel/pSeries_setup.c	2005-07-08 15:18:27.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/pSeries_setup.c	2005-07-22 16:40:08.000000000 +1000
@@ -231,11 +231,11 @@ static void __init pSeries_setup_arch(vo
 
 	pSeries_nvram_init();
 
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR)
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR)
 		vpa_init(boot_cpuid);
 
 	/* Choose an idle loop */
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR) {
 		if (get_paca()->lppaca.shared_proc) {
 			printk(KERN_INFO "Using shared processor idle loop\n");
 			ppc_md.idle_loop = pseries_shared_idle;
@@ -260,7 +260,7 @@ static int __init pSeries_init_panel(voi
 arch_initcall(pSeries_init_panel);
 
 
-/* Build up the firmware_features bitmask field
+/* Build up the ppc64_firmware_features bitmask field
  * using contents of device-tree/ibm,hypertas-functions.
  * Ultimately this functionality may be moved into prom.c prom_init().
  */
@@ -272,7 +272,7 @@ void __init fw_feature_init(void)
 
 	DBG(" -> fw_feature_init()\n");
 
-	cur_cpu_spec->firmware_features = 0;
+	ppc64_firmware_features = 0;
 	dn = of_find_node_by_path("/rtas");
 	if (dn == NULL) {
 		printk(KERN_ERR "WARNING ! Cannot find RTAS in device-tree !\n");
@@ -288,7 +288,7 @@ void __init fw_feature_init(void)
 				if ((firmware_features_table[i].name) &&
 				    (strcmp(firmware_features_table[i].name,hypertas))==0) {
 					/* we have a match */
-					cur_cpu_spec->firmware_features |= 
+					ppc64_firmware_features |= 
 						(firmware_features_table[i].val);
 					break;
 				} 
@@ -302,7 +302,7 @@ void __init fw_feature_init(void)
 	of_node_put(dn);
  no_rtas:
 	printk(KERN_INFO "firmware_features = 0x%lx\n", 
-	       cur_cpu_spec->firmware_features);
+	       ppc64_firmware_features);
 
 	DBG(" <- fw_feature_init()\n");
 }
diff -ruNp linus/arch/ppc64/kernel/pSeries_smp.c linus-firmware.1/arch/ppc64/kernel/pSeries_smp.c
--- linus/arch/ppc64/kernel/pSeries_smp.c	2005-06-27 16:08:00.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/pSeries_smp.c	2005-07-22 16:40:18.000000000 +1000
@@ -326,7 +326,7 @@ static void __devinit smp_xics_setup_cpu
 	if (cpu != boot_cpuid)
 		xics_setup_cpu();
 
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR)
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR)
 		vpa_init(cpu);
 
 	cpu_clear(cpu, of_spin_map);
diff -ruNp linus/arch/ppc64/kernel/process.c linus-firmware.1/arch/ppc64/kernel/process.c
--- linus/arch/ppc64/kernel/process.c	2005-06-28 10:05:26.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/process.c	2005-07-22 16:40:26.000000000 +1000
@@ -206,7 +206,7 @@ struct task_struct *__switch_to(struct t
 /* purr is nothing but processor time base                          */
 
 #if defined(CONFIG_PPC_PSERIES)
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR) {
 		struct cpu_usage *cu = &__get_cpu_var(cpu_usage_array);
 		long unsigned start_tb, current_tb;
 		start_tb = old_thread->start_tb;
diff -ruNp linus/arch/ppc64/kernel/sysfs.c linus-firmware.1/arch/ppc64/kernel/sysfs.c
--- linus/arch/ppc64/kernel/sysfs.c	2005-07-08 15:18:27.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/sysfs.c	2005-07-22 16:40:34.000000000 +1000
@@ -154,7 +154,7 @@ void ppc64_enable_pmcs(void)
 
 #ifdef CONFIG_PPC_PSERIES
 	/* instruct hypervisor to maintain PMCs */
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR)
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR)
 		get_paca()->lppaca.pmcregs_in_use = 1;
 #endif /* CONFIG_PPC_PSERIES */
 }
diff -ruNp linus/arch/ppc64/kernel/time.c linus-firmware.1/arch/ppc64/kernel/time.c
--- linus/arch/ppc64/kernel/time.c	2005-07-01 09:58:50.000000000 +1000
+++ linus-firmware.1/arch/ppc64/kernel/time.c	2005-07-22 16:40:43.000000000 +1000
@@ -372,7 +372,7 @@ int timer_interrupt(struct pt_regs * reg
 
 /* collect purr register values often, for accurate calculations */
 #if defined(CONFIG_PPC_PSERIES)
-	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+	if (ppc64_firmware_features & FW_FEATURE_SPLPAR) {
 		struct cpu_usage *cu = &__get_cpu_var(cpu_usage_array);
 		cu->current_tb = mfspr(SPRN_PURR);
 	}
diff -ruNp linus/include/asm-ppc64/cputable.h linus-firmware.1/include/asm-ppc64/cputable.h
--- linus/include/asm-ppc64/cputable.h	2005-07-08 15:18:28.000000000 +1000
+++ linus-firmware.1/include/asm-ppc64/cputable.h	2005-07-22 16:42:23.000000000 +1000
@@ -56,11 +56,6 @@ struct cpu_spec {
 	 * BHT, SPD, etc... from head.S before branching to identify_machine
 	 */
 	cpu_setup_t	cpu_setup;
-
-	/* This is used to identify firmware features which are available
-	 * to the kernel.
-	 */
-	unsigned long   firmware_features;
 };
 
 extern struct cpu_spec		cpu_specs[];
@@ -72,6 +67,11 @@ static inline unsigned long cpu_has_feat
 }
 
 
+/* This is used to identify firmware features which are available
+ * to the kernel.
+ */
+extern unsigned long		ppc64_firmware_features;
+
 /* firmware feature bitmask values */
 #define FIRMWARE_MAX_FEATURES 63
 



More information about the Linuxppc64-dev mailing list