[PATCH] ppc64: remove firmware features from cpu_spec
authorStephen Rothwell <sfr@canb.auug.org.au>
Wed, 3 Aug 2005 04:32:30 +0000 (14:32 +1000)
committerPaul Mackerras <paulus@samba.org>
Mon, 29 Aug 2005 00:53:34 +0000 (10:53 +1000)
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@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/ppc64/kernel/cputable.c
arch/ppc64/kernel/lparcfg.c
arch/ppc64/kernel/pSeries_iommu.c
arch/ppc64/kernel/pSeries_setup.c
arch/ppc64/kernel/pSeries_smp.c
arch/ppc64/kernel/process.c
arch/ppc64/kernel/sysfs.c
arch/ppc64/kernel/time.c
include/asm-ppc64/cputable.h

index 77cec42f9525897c960f85f86ee4793e2597cd77..84fdd27498a5709dc35cbd5186dcc565e52ebfba 100644 (file)
@@ -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,
        }
 };
 
index 02e96627fa6604999b3ac6aafd926fea185e2676..938353848cd0756a27e4979c8c8b7f34ac575686 100644 (file)
@@ -377,7 +377,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
 
        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;
        }
index 69130522a87e17fed1d7de09562b4069aa0f2aba..a5786be9c654e26571c4864345a7f5a703f4c0eb 100644 (file)
@@ -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 {
index 5bec956e44a043775ffbd264807cebced14dfc77..d3975ac71cfbd7007f69375fd10ac2ec19d9d252 100644 (file)
@@ -231,11 +231,11 @@ static void __init pSeries_setup_arch(void)
 
        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(void)
 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");
 }
index 62c55a123560cf6850dc1c10c5a171c953a7290c..8312d324aaae4cd53e86cb8c73028c4599ab9b32 100644 (file)
@@ -326,7 +326,7 @@ static void __devinit smp_xics_setup_cpu(int 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);
index f7cae05e40fb2cbfcfb255998ec938c6eee72676..390f434283af1a14f4fd8dde4185deeae725dad0 100644 (file)
@@ -206,7 +206,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
 /* 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;
index 02b8ac4e016883cfc5e4bfa0e151995346d4dc55..90b653c724fa98b0fdae4524aa26ffd415d8ca38 100644 (file)
@@ -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 */
 }
index 909462e1adeaf7cc1bab5ec9b766315d2ee63ec8..1c05cee05315f58c06a5685e4db8a61583d89cc7 100644 (file)
@@ -372,7 +372,7 @@ int timer_interrupt(struct pt_regs * regs)
 
 /* 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);
        }
index d67fa9e2607908477b8517df6a5ffe8bb9934337..d55698a60e756416d4e99cc83981b80c9aebfd3f 100644 (file)
@@ -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_feature(unsigned long feature)
 }
 
 
+/* 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