Commit e4d54f71 authored by Stewart Smith's avatar Stewart Smith Committed by Michael Ellerman

powerpc/powernv: remove FW_FEATURE_OPALv3 and just use FW_FEATURE_OPAL

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: default avatarStewart Smith <stewart@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 7261aafc
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#define FW_FEATURE_BEST_ENERGY ASM_CONST(0x0000000080000000) #define FW_FEATURE_BEST_ENERGY ASM_CONST(0x0000000080000000)
#define FW_FEATURE_TYPE1_AFFINITY ASM_CONST(0x0000000100000000) #define FW_FEATURE_TYPE1_AFFINITY ASM_CONST(0x0000000100000000)
#define FW_FEATURE_PRRN ASM_CONST(0x0000000200000000) #define FW_FEATURE_PRRN ASM_CONST(0x0000000200000000)
#define FW_FEATURE_OPALv3 ASM_CONST(0x0000000400000000)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
...@@ -69,7 +68,7 @@ enum { ...@@ -69,7 +68,7 @@ enum {
FW_FEATURE_SET_MODE | FW_FEATURE_BEST_ENERGY | FW_FEATURE_SET_MODE | FW_FEATURE_BEST_ENERGY |
FW_FEATURE_TYPE1_AFFINITY | FW_FEATURE_PRRN, FW_FEATURE_TYPE1_AFFINITY | FW_FEATURE_PRRN,
FW_FEATURE_PSERIES_ALWAYS = 0, 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_POWERNV_ALWAYS = 0,
FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1, FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1, FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
......
...@@ -48,8 +48,8 @@ static int pnv_eeh_init(void) ...@@ -48,8 +48,8 @@ static int pnv_eeh_init(void)
struct pci_controller *hose; struct pci_controller *hose;
struct pnv_phb *phb; struct pnv_phb *phb;
if (!firmware_has_feature(FW_FEATURE_OPALv3)) { if (!firmware_has_feature(FW_FEATURE_OPAL)) {
pr_warn("%s: OPALv3 is required !\n", pr_warn("%s: OPAL is required !\n",
__func__); __func__);
return -EINVAL; return -EINVAL;
} }
......
...@@ -242,7 +242,7 @@ static int __init pnv_init_idle_states(void) ...@@ -242,7 +242,7 @@ static int __init pnv_init_idle_states(void)
if (cpuidle_disable != IDLE_NO_OVERRIDE) if (cpuidle_disable != IDLE_NO_OVERRIDE)
goto out; goto out;
if (!firmware_has_feature(FW_FEATURE_OPALv3)) if (!firmware_has_feature(FW_FEATURE_OPAL))
goto out; goto out;
power_mgt = of_find_node_by_path("/ibm,opal/power-mgt"); power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
......
...@@ -126,7 +126,7 @@ static const struct scom_controller opal_scom_controller = { ...@@ -126,7 +126,7 @@ static const struct scom_controller opal_scom_controller = {
static int opal_xscom_init(void) 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); scom_init(&opal_scom_controller);
return 0; return 0;
} }
......
...@@ -98,10 +98,9 @@ int __init early_init_dt_scan_opal(unsigned long node, ...@@ -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", pr_debug("OPAL Entry = 0x%llx (sizep=%p runtimesz=%d)\n",
opal.size, sizep, runtimesz); opal.size, sizep, runtimesz);
powerpc_firmware_features |= FW_FEATURE_OPAL;
if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) { if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) {
powerpc_firmware_features |= FW_FEATURE_OPALv3; powerpc_firmware_features |= FW_FEATURE_OPAL;
pr_info("OPAL V3 detected !\n"); pr_info("OPAL detected !\n");
} else { } else {
panic("OPAL != V3 detected, no longer supported.\n"); 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) ...@@ -348,17 +347,15 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
* enough room and be done with it * enough room and be done with it
*/ */
spin_lock_irqsave(&opal_write_lock, flags); spin_lock_irqsave(&opal_write_lock, flags);
if (firmware_has_feature(FW_FEATURE_OPALv3)) { rc = opal_console_write_buffer_space(vtermno, &olen);
rc = opal_console_write_buffer_space(vtermno, &olen); len = be64_to_cpu(olen);
len = be64_to_cpu(olen); if (rc || len < total_len) {
if (rc || len < total_len) { spin_unlock_irqrestore(&opal_write_lock, flags);
spin_unlock_irqrestore(&opal_write_lock, flags); /* Closed -> drop characters */
/* Closed -> drop characters */ if (rc)
if (rc) return total_len;
return total_len; opal_poll_events(NULL);
opal_poll_events(NULL); return -EAGAIN;
return -EAGAIN;
}
} }
/* We still try to handle partial completions, though they /* We still try to handle partial completions, though they
......
...@@ -344,7 +344,7 @@ static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb) ...@@ -344,7 +344,7 @@ static void __init pnv_ioda_parse_m64_window(struct pnv_phb *phb)
return; 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"); pr_info(" Firmware too old to support M64 window\n");
return; return;
} }
......
...@@ -90,8 +90,8 @@ static void pnv_show_cpuinfo(struct seq_file *m) ...@@ -90,8 +90,8 @@ static void pnv_show_cpuinfo(struct seq_file *m)
if (root) if (root)
model = of_get_property(root, "model", NULL); model = of_get_property(root, "model", NULL);
seq_printf(m, "machine\t\t: PowerNV %s\n", model); seq_printf(m, "machine\t\t: PowerNV %s\n", model);
if (firmware_has_feature(FW_FEATURE_OPALv3)) if (firmware_has_feature(FW_FEATURE_OPAL))
seq_printf(m, "firmware\t: OPAL v3\n"); seq_printf(m, "firmware\t: OPAL\n");
else else
seq_printf(m, "firmware\t: BML\n"); seq_printf(m, "firmware\t: BML\n");
of_node_put(root); of_node_put(root);
...@@ -220,9 +220,9 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) ...@@ -220,9 +220,9 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
{ {
xics_kexec_teardown_cpu(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; return;
if (secondary) { if (secondary) {
......
...@@ -61,14 +61,15 @@ static int pnv_smp_kick_cpu(int nr) ...@@ -61,14 +61,15 @@ static int pnv_smp_kick_cpu(int nr)
unsigned long start_here = unsigned long start_here =
__pa(ppc_function_entry(generic_secondary_smp_init)); __pa(ppc_function_entry(generic_secondary_smp_init));
long rc; long rc;
uint8_t status;
BUG_ON(nr < 0 || nr >= NR_CPUS); 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 * 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; goto kick;
/* /*
...@@ -77,55 +78,42 @@ static int pnv_smp_kick_cpu(int nr) ...@@ -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 * first time. OPAL v3 allows us to query OPAL to know if it
* has the CPUs, so we do that * has the CPUs, so we do that
*/ */
if (firmware_has_feature(FW_FEATURE_OPALv3)) { rc = opal_query_cpu_status(pcpu, &status);
uint8_t status; if (rc != OPAL_SUCCESS) {
pr_warn("OPAL Error %ld querying CPU %d state\n", rc, nr);
rc = opal_query_cpu_status(pcpu, &status); return -ENODEV;
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 * Already started, just kick it, probably coming from
* kexec and spinning * kexec and spinning
*/ */
if (status == OPAL_THREAD_STARTED) if (status == OPAL_THREAD_STARTED)
goto kick; goto kick;
/* /*
* Available/inactive, let's kick it * Available/inactive, let's kick it
*/ */
if (status == OPAL_THREAD_INACTIVE) { if (status == OPAL_THREAD_INACTIVE) {
pr_devel("OPAL: Starting CPU %d (HW 0x%x)...\n", pr_devel("OPAL: Starting CPU %d (HW 0x%x)...\n", nr, pcpu);
nr, pcpu); rc = opal_start_cpu(pcpu, start_here);
rc = opal_start_cpu(pcpu, start_here); if (rc != OPAL_SUCCESS) {
if (rc != OPAL_SUCCESS) { pr_warn("OPAL Error %ld starting CPU %d\n", rc, nr);
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);
return -ENODEV; return -ENODEV;
} }
} else { } else {
/* /*
* On OPAL v2, we just kick it and hope for the best, * An unavailable CPU (or any other unknown status)
* we must not test the error from opal_start_cpu() or * shouldn't be started. It should also
* we would fail to get CPUs from kexec. * 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); return smp_generic_kick_cpu(nr);
} }
......
...@@ -586,7 +586,7 @@ static int __init powernv_cpufreq_init(void) ...@@ -586,7 +586,7 @@ static int __init powernv_cpufreq_init(void)
int rc = 0; int rc = 0;
/* Don't probe on pseries (guest) platforms */ /* Don't probe on pseries (guest) platforms */
if (!firmware_has_feature(FW_FEATURE_OPALv3)) if (!firmware_has_feature(FW_FEATURE_OPAL))
return -ENODEV; return -ENODEV;
/* Discover pstates from device tree and init */ /* Discover pstates from device tree and init */
......
...@@ -264,7 +264,7 @@ static int powernv_idle_probe(void) ...@@ -264,7 +264,7 @@ static int powernv_idle_probe(void)
if (cpuidle_disable != IDLE_NO_OVERRIDE) if (cpuidle_disable != IDLE_NO_OVERRIDE)
return -ENODEV; return -ENODEV;
if (firmware_has_feature(FW_FEATURE_OPALv3)) { if (firmware_has_feature(FW_FEATURE_OPAL)) {
cpuidle_state_table = powernv_states; cpuidle_state_table = powernv_states;
/* Device tree can indicate more idle states */ /* Device tree can indicate more idle states */
max_idle_state = powernv_add_idle_states(); max_idle_state = powernv_add_idle_states();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment