powerpc/powernv: remove FW_FEATURE_OPALv3 and just use FW_FEATURE_OPAL
authorStewart Smith <stewart@linux.vnet.ibm.com>
Wed, 9 Dec 2015 06:18:20 +0000 (17:18 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 17 Dec 2015 11:40:54 +0000 (22:40 +1100)
Long ago, only in the lab, there was OPALv1 and OPALv2. Now there is
just OPALv3, with nobody ever expecting anything on pre-OPALv3 to
be cared about or supported by mainline kernels.

So, let's remove FW_FEATURE_OPALv3 and instead use FW_FEATURE_OPAL
exclusively.

Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/firmware.h
arch/powerpc/platforms/powernv/eeh-powernv.c
arch/powerpc/platforms/powernv/idle.c
arch/powerpc/platforms/powernv/opal-xscom.c
arch/powerpc/platforms/powernv/opal.c
arch/powerpc/platforms/powernv/pci-ioda.c
arch/powerpc/platforms/powernv/setup.c
arch/powerpc/platforms/powernv/smp.c
drivers/cpufreq/powernv-cpufreq.c
drivers/cpuidle/cpuidle-powernv.c

index 50af5e5ea86fdae7a03708d50409c999fe092760..b0629249778b31ed536613d371d4005dd2e6fc11 100644 (file)
@@ -51,7 +51,6 @@
 #define FW_FEATURE_BEST_ENERGY ASM_CONST(0x0000000080000000)
 #define FW_FEATURE_TYPE1_AFFINITY ASM_CONST(0x0000000100000000)
 #define FW_FEATURE_PRRN                ASM_CONST(0x0000000200000000)
-#define FW_FEATURE_OPALv3      ASM_CONST(0x0000000400000000)
 
 #ifndef __ASSEMBLY__
 
@@ -69,7 +68,7 @@ enum {
                FW_FEATURE_SET_MODE | FW_FEATURE_BEST_ENERGY |
                FW_FEATURE_TYPE1_AFFINITY | FW_FEATURE_PRRN,
        FW_FEATURE_PSERIES_ALWAYS = 0,
-       FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv3,
+       FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL,
        FW_FEATURE_POWERNV_ALWAYS = 0,
        FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
        FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
index e1c90725522a1a8bf263ed3b7bb0c25e1317518a..5f152b95ca0c8493536d787a51d741ae628adb8a 100644 (file)
@@ -48,8 +48,8 @@ static int pnv_eeh_init(void)
        struct pci_controller *hose;
        struct pnv_phb *phb;
 
-       if (!firmware_has_feature(FW_FEATURE_OPALv3)) {
-               pr_warn("%s: OPALv3 is required !\n",
+       if (!firmware_has_feature(FW_FEATURE_OPAL)) {
+               pr_warn("%s: OPAL is required !\n",
                        __func__);
                return -EINVAL;
        }
index 59d735d2e5c053853d0a1795a54787a006b42130..15bfbcd5debc2db9e8e44930b66f5cdda5717a39 100644 (file)
@@ -242,7 +242,7 @@ static int __init pnv_init_idle_states(void)
        if (cpuidle_disable != IDLE_NO_OVERRIDE)
                goto out;
 
-       if (!firmware_has_feature(FW_FEATURE_OPALv3))
+       if (!firmware_has_feature(FW_FEATURE_OPAL))
                goto out;
 
        power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
index 7634d1c62299b44063169989ef32a27c9ae5ce9d..d0ac535cf5d7c783ad0ee0ded359d2eeb48ccd68 100644 (file)
@@ -126,7 +126,7 @@ static const struct scom_controller opal_scom_controller = {
 
 static int opal_xscom_init(void)
 {
-       if (firmware_has_feature(FW_FEATURE_OPALv3))
+       if (firmware_has_feature(FW_FEATURE_OPAL))
                scom_init(&opal_scom_controller);
        return 0;
 }
index 5ce51d9b4ca6fd7f345562441a5c232d55b3d670..aad0033d65d1e3ad0b4aaaa7aa921c27ba70e348 100644 (file)
@@ -98,10 +98,9 @@ int __init early_init_dt_scan_opal(unsigned long node,
        pr_debug("OPAL Entry = 0x%llx (sizep=%p runtimesz=%d)\n",
                 opal.size, sizep, runtimesz);
 
-       powerpc_firmware_features |= FW_FEATURE_OPAL;
        if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) {
-               powerpc_firmware_features |= FW_FEATURE_OPALv3;
-               pr_info("OPAL V3 detected !\n");
+               powerpc_firmware_features |= FW_FEATURE_OPAL;
+               pr_info("OPAL detected !\n");
        } else {
                panic("OPAL != V3 detected, no longer supported.\n");
        }
@@ -348,17 +347,15 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
         * enough room and be done with it
         */
        spin_lock_irqsave(&opal_write_lock, flags);
-       if (firmware_has_feature(FW_FEATURE_OPALv3)) {
-               rc = opal_console_write_buffer_space(vtermno, &olen);
-               len = be64_to_cpu(olen);
-               if (rc || len < total_len) {
-                       spin_unlock_irqrestore(&opal_write_lock, flags);
-                       /* Closed -> drop characters */
-                       if (rc)
-                               return total_len;
-                       opal_poll_events(NULL);
-                       return -EAGAIN;
-               }
+       rc = opal_console_write_buffer_space(vtermno, &olen);
+       len = be64_to_cpu(olen);
+       if (rc || len < total_len) {
+               spin_unlock_irqrestore(&opal_write_lock, flags);
+               /* Closed -> drop characters */
+               if (rc)
+                       return total_len;
+               opal_poll_events(NULL);
+               return -EAGAIN;
        }
 
        /* We still try to handle partial completions, though they
index 414fd1a00fda85b243dcb2839a4929b09be4a52c..cdd5fa942aedc4fa780b0c7d80438b11813ad401 100644 (file)
@@ -344,7 +344,7 @@ static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb)
                return;
        }
 
-       if (!firmware_has_feature(FW_FEATURE_OPALv3)) {
+       if (!firmware_has_feature(FW_FEATURE_OPAL)) {
                pr_info("  Firmware too old to support M64 window\n");
                return;
        }
index 54583fc417bed6db1655e1bc0aac8137d57cb3a8..1acb0c72d9231d980080af3acbae7120b720c67c 100644 (file)
@@ -90,8 +90,8 @@ static void pnv_show_cpuinfo(struct seq_file *m)
        if (root)
                model = of_get_property(root, "model", NULL);
        seq_printf(m, "machine\t\t: PowerNV %s\n", model);
-       if (firmware_has_feature(FW_FEATURE_OPALv3))
-               seq_printf(m, "firmware\t: OPAL v3\n");
+       if (firmware_has_feature(FW_FEATURE_OPAL))
+               seq_printf(m, "firmware\t: OPAL\n");
        else
                seq_printf(m, "firmware\t: BML\n");
        of_node_put(root);
@@ -220,9 +220,9 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
 {
        xics_kexec_teardown_cpu(secondary);
 
-       /* On OPAL v3, we return all CPUs to firmware */
+       /* On OPAL, we return all CPUs to firmware */
 
-       if (!firmware_has_feature(FW_FEATURE_OPALv3))
+       if (!firmware_has_feature(FW_FEATURE_OPAL))
                return;
 
        if (secondary) {
index 9b968a3151035c03aa458a0cb3e810d90dae8dab..ad7b1a3dbed0970cd7c5c474d5f78eb90565822e 100644 (file)
@@ -61,14 +61,15 @@ static int pnv_smp_kick_cpu(int nr)
        unsigned long start_here =
                        __pa(ppc_function_entry(generic_secondary_smp_init));
        long rc;
+       uint8_t status;
 
        BUG_ON(nr < 0 || nr >= NR_CPUS);
 
        /*
-        * If we already started or OPALv3 is not supported, we just
+        * If we already started or OPAL is not supported, we just
         * kick the CPU via the PACA
         */
-       if (paca[nr].cpu_start || !firmware_has_feature(FW_FEATURE_OPALv3))
+       if (paca[nr].cpu_start || !firmware_has_feature(FW_FEATURE_OPAL))
                goto kick;
 
        /*
@@ -77,55 +78,42 @@ static int pnv_smp_kick_cpu(int nr)
         * first time. OPAL v3 allows us to query OPAL to know if it
         * has the CPUs, so we do that
         */
-       if (firmware_has_feature(FW_FEATURE_OPALv3)) {
-               uint8_t status;
-
-               rc = opal_query_cpu_status(pcpu, &status);
-               if (rc != OPAL_SUCCESS) {
-                       pr_warn("OPAL Error %ld querying CPU %d state\n",
-                               rc, nr);
-                       return -ENODEV;
-               }
+       rc = opal_query_cpu_status(pcpu, &status);
+       if (rc != OPAL_SUCCESS) {
+               pr_warn("OPAL Error %ld querying CPU %d state\n", rc, nr);
+               return -ENODEV;
+       }
 
-               /*
-                * Already started, just kick it, probably coming from
-                * kexec and spinning
-                */
-               if (status == OPAL_THREAD_STARTED)
-                       goto kick;
+       /*
+        * Already started, just kick it, probably coming from
+        * kexec and spinning
+        */
+       if (status == OPAL_THREAD_STARTED)
+               goto kick;
 
-               /*
-                * Available/inactive, let's kick it
-                */
-               if (status == OPAL_THREAD_INACTIVE) {
-                       pr_devel("OPAL: Starting CPU %d (HW 0x%x)...\n",
-                                nr, pcpu);
-                       rc = opal_start_cpu(pcpu, start_here);
-                       if (rc != OPAL_SUCCESS) {
-                               pr_warn("OPAL Error %ld starting CPU %d\n",
-                                       rc, nr);
-                               return -ENODEV;
-                       }
-               } else {
-                       /*
-                        * An unavailable CPU (or any other unknown status)
-                        * shouldn't be started. It should also
-                        * not be in the possible map but currently it can
-                        * happen
-                        */
-                       pr_devel("OPAL: CPU %d (HW 0x%x) is unavailable"
-                                " (status %d)...\n", nr, pcpu, status);
+       /*
+        * Available/inactive, let's kick it
+        */
+       if (status == OPAL_THREAD_INACTIVE) {
+               pr_devel("OPAL: Starting CPU %d (HW 0x%x)...\n", nr, pcpu);
+               rc = opal_start_cpu(pcpu, start_here);
+               if (rc != OPAL_SUCCESS) {
+                       pr_warn("OPAL Error %ld starting CPU %d\n", rc, nr);
                        return -ENODEV;
                }
        } else {
                /*
-                * On OPAL v2, we just kick it and hope for the best,
-                * we must not test the error from opal_start_cpu() or
-                * we would fail to get CPUs from kexec.
+                * An unavailable CPU (or any other unknown status)
+                * shouldn't be started. It should also
+                * not be in the possible map but currently it can
+                * happen
                 */
-               opal_start_cpu(pcpu, start_here);
+               pr_devel("OPAL: CPU %d (HW 0x%x) is unavailable"
+                        " (status %d)...\n", nr, pcpu, status);
+               return -ENODEV;
        }
- kick:
+
+kick:
        return smp_generic_kick_cpu(nr);
 }
 
index cb501386eb6ef6beee5f91b6cd54840d31b38611..547890fd9572179eba4c6ce81caf5bbc8b06b947 100644 (file)
@@ -586,7 +586,7 @@ static int __init powernv_cpufreq_init(void)
        int rc = 0;
 
        /* Don't probe on pseries (guest) platforms */
-       if (!firmware_has_feature(FW_FEATURE_OPALv3))
+       if (!firmware_has_feature(FW_FEATURE_OPAL))
                return -ENODEV;
 
        /* Discover pstates from device tree and init */
index 845bafcfa7929fd66cbb5eb966b16e0f3320de7f..e12dc30d8864e007fa5b70cc2969a1f00c9cf2b2 100644 (file)
@@ -264,7 +264,7 @@ static int powernv_idle_probe(void)
        if (cpuidle_disable != IDLE_NO_OVERRIDE)
                return -ENODEV;
 
-       if (firmware_has_feature(FW_FEATURE_OPALv3)) {
+       if (firmware_has_feature(FW_FEATURE_OPAL)) {
                cpuidle_state_table = powernv_states;
                /* Device tree can indicate more idle states */
                max_idle_state = powernv_add_idle_states();