Commit 41cad828 authored by Andrew Jones's avatar Andrew Jones Committed by Palmer Dabbelt

RISC-V: Align SBI probe implementation with spec

sbi_probe_extension() is specified with "Returns 0 if the given SBI
extension ID (EID) is not available, or 1 if it is available unless
defined as any other non-zero value by the implementation."
Additionally, sbiret.value is a long. Fix the implementation to
ensure any nonzero long value is considered a success, rather
than only positive int values.

Fixes: b9dcd9e4 ("RISC-V: Add basic support for SBI v0.2")
Signed-off-by: default avatarAndrew Jones <ajones@ventanamicro.com>
Reviewed-by: default avatarConor Dooley <conor.dooley@microchip.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20230427163626.101042-1-ajones@ventanamicro.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent e4ef93ed
...@@ -295,7 +295,7 @@ int sbi_remote_hfence_vvma_asid(const struct cpumask *cpu_mask, ...@@ -295,7 +295,7 @@ int sbi_remote_hfence_vvma_asid(const struct cpumask *cpu_mask,
unsigned long start, unsigned long start,
unsigned long size, unsigned long size,
unsigned long asid); unsigned long asid);
int sbi_probe_extension(int ext); long sbi_probe_extension(int ext);
/* Check if current SBI specification version is 0.1 or not */ /* Check if current SBI specification version is 0.1 or not */
static inline int sbi_spec_is_0_1(void) static inline int sbi_spec_is_0_1(void)
......
...@@ -27,7 +27,7 @@ const struct cpu_operations cpu_ops_spinwait = { ...@@ -27,7 +27,7 @@ const struct cpu_operations cpu_ops_spinwait = {
void __init cpu_set_ops(int cpuid) void __init cpu_set_ops(int cpuid)
{ {
#if IS_ENABLED(CONFIG_RISCV_SBI) #if IS_ENABLED(CONFIG_RISCV_SBI)
if (sbi_probe_extension(SBI_EXT_HSM) > 0) { if (sbi_probe_extension(SBI_EXT_HSM)) {
if (!cpuid) if (!cpuid)
pr_info("SBI HSM extension detected\n"); pr_info("SBI HSM extension detected\n");
cpu_ops[cpuid] = &cpu_ops_sbi; cpu_ops[cpuid] = &cpu_ops_sbi;
......
...@@ -524,19 +524,18 @@ static void sbi_srst_power_off(void) ...@@ -524,19 +524,18 @@ static void sbi_srst_power_off(void)
* sbi_probe_extension() - Check if an SBI extension ID is supported or not. * sbi_probe_extension() - Check if an SBI extension ID is supported or not.
* @extid: The extension ID to be probed. * @extid: The extension ID to be probed.
* *
* Return: Extension specific nonzero value f yes, -ENOTSUPP otherwise. * Return: 1 or an extension specific nonzero value if yes, 0 otherwise.
*/ */
int sbi_probe_extension(int extid) long sbi_probe_extension(int extid)
{ {
struct sbiret ret; struct sbiret ret;
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid, ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid,
0, 0, 0, 0, 0); 0, 0, 0, 0, 0);
if (!ret.error) if (!ret.error)
if (ret.value) return ret.value;
return ret.value;
return -ENOTSUPP; return 0;
} }
EXPORT_SYMBOL(sbi_probe_extension); EXPORT_SYMBOL(sbi_probe_extension);
...@@ -599,26 +598,26 @@ void __init sbi_init(void) ...@@ -599,26 +598,26 @@ void __init sbi_init(void)
if (!sbi_spec_is_0_1()) { if (!sbi_spec_is_0_1()) {
pr_info("SBI implementation ID=0x%lx Version=0x%lx\n", pr_info("SBI implementation ID=0x%lx Version=0x%lx\n",
sbi_get_firmware_id(), sbi_get_firmware_version()); sbi_get_firmware_id(), sbi_get_firmware_version());
if (sbi_probe_extension(SBI_EXT_TIME) > 0) { if (sbi_probe_extension(SBI_EXT_TIME)) {
__sbi_set_timer = __sbi_set_timer_v02; __sbi_set_timer = __sbi_set_timer_v02;
pr_info("SBI TIME extension detected\n"); pr_info("SBI TIME extension detected\n");
} else { } else {
__sbi_set_timer = __sbi_set_timer_v01; __sbi_set_timer = __sbi_set_timer_v01;
} }
if (sbi_probe_extension(SBI_EXT_IPI) > 0) { if (sbi_probe_extension(SBI_EXT_IPI)) {
__sbi_send_ipi = __sbi_send_ipi_v02; __sbi_send_ipi = __sbi_send_ipi_v02;
pr_info("SBI IPI extension detected\n"); pr_info("SBI IPI extension detected\n");
} else { } else {
__sbi_send_ipi = __sbi_send_ipi_v01; __sbi_send_ipi = __sbi_send_ipi_v01;
} }
if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { if (sbi_probe_extension(SBI_EXT_RFENCE)) {
__sbi_rfence = __sbi_rfence_v02; __sbi_rfence = __sbi_rfence_v02;
pr_info("SBI RFENCE extension detected\n"); pr_info("SBI RFENCE extension detected\n");
} else { } else {
__sbi_rfence = __sbi_rfence_v01; __sbi_rfence = __sbi_rfence_v01;
} }
if ((sbi_spec_version >= sbi_mk_version(0, 3)) && if ((sbi_spec_version >= sbi_mk_version(0, 3)) &&
(sbi_probe_extension(SBI_EXT_SRST) > 0)) { sbi_probe_extension(SBI_EXT_SRST)) {
pr_info("SBI SRST extension detected\n"); pr_info("SBI SRST extension detected\n");
pm_power_off = sbi_srst_power_off; pm_power_off = sbi_srst_power_off;
sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot; sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot;
......
...@@ -75,7 +75,7 @@ static int __init riscv_kvm_init(void) ...@@ -75,7 +75,7 @@ static int __init riscv_kvm_init(void)
return -ENODEV; return -ENODEV;
} }
if (sbi_probe_extension(SBI_EXT_RFENCE) <= 0) { if (!sbi_probe_extension(SBI_EXT_RFENCE)) {
kvm_info("require SBI RFENCE extension\n"); kvm_info("require SBI RFENCE extension\n");
return -ENODEV; return -ENODEV;
} }
......
...@@ -613,7 +613,7 @@ static int __init sbi_cpuidle_init(void) ...@@ -613,7 +613,7 @@ static int __init sbi_cpuidle_init(void)
* 2) SBI HSM extension is available * 2) SBI HSM extension is available
*/ */
if ((sbi_spec_version < sbi_mk_version(0, 3)) || if ((sbi_spec_version < sbi_mk_version(0, 3)) ||
sbi_probe_extension(SBI_EXT_HSM) <= 0) { !sbi_probe_extension(SBI_EXT_HSM)) {
pr_info("HSM suspend not available\n"); pr_info("HSM suspend not available\n");
return 0; return 0;
} }
......
...@@ -924,7 +924,7 @@ static int __init pmu_sbi_devinit(void) ...@@ -924,7 +924,7 @@ static int __init pmu_sbi_devinit(void)
struct platform_device *pdev; struct platform_device *pdev;
if (sbi_spec_version < sbi_mk_version(0, 3) || if (sbi_spec_version < sbi_mk_version(0, 3) ||
sbi_probe_extension(SBI_EXT_PMU) <= 0) { !sbi_probe_extension(SBI_EXT_PMU)) {
return 0; return 0;
} }
......
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