RISC-V: Align SBI probe implementation with spec
Subsystems (6)
PATCH v2 1/1 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.
---
v2:
- Added Fixes tag and Conor's r-b
arch/riscv/include/asm/sbi.h | 2 +- arch/riscv/kernel/cpu_ops.c | 2 +- arch/riscv/kernel/sbi.c | 17 ++++++++--------- arch/riscv/kvm/main.c | 2 +- drivers/cpuidle/cpuidle-riscv-sbi.c | 2 +- drivers/perf/riscv_pmu_sbi.c | 2 +- 6 files changed, 13 insertions(+), 14 deletions(-)
arch/riscv/include/asm/sbi.h +1 -1
@@ -296,7 +296,7 @@ int sbi_remote_hfence_vvma_asid(const struct cpumask *cpu_mask,unsigned long start, unsigned long size, 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 */ static inline int sbi_spec_is_0_1 (void )
arch/riscv/kernel/cpu_ops.c +1 -1
@@ -27,7 +27,7 @@ const struct cpu_operations cpu_ops_spinwait = {void __init cpu_set_ops (int cpuid) {#if IS_ENABLED (CONFIG_RISCV_SBI ) -if (sbi_probe_extension (SBI_EXT_HSM ) >0 ) { +if (sbi_probe_extension (SBI_EXT_HSM )) {if (!cpuid)pr_info ("SBI HSM extension detected\n" ); cpu_ops[cpuid] = &cpu_ops_sbi;
arch/riscv/kernel/sbi.c +8 -9
@@ -581,19 +581,18 @@ static void sbi_srst_power_off(void)* sbi_probe_extension() - Check if an SBI extension ID is supported or not. * @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; ret =sbi_ecall (SBI_EXT_BASE ,SBI_EXT_BASE_PROBE_EXT , extid,0 ,0 ,0 ,0 ,0 );if (!ret.error) -if (ret.value) -return ret.value; +return ret.value; -return -ENOTSUPP ; +return 0 ; }EXPORT_SYMBOL (sbi_probe_extension);
@@ -665,26 +664,26 @@ void __init sbi_init(void)if (!sbi_spec_is_0_1 ()) {pr_info ("SBI implementation ID=0x%lx Version=0x%lx\n" ,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;pr_info ("SBI TIME extension detected\n" ); }else { __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;pr_info ("SBI IPI extension detected\n" ); }else { __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;pr_info ("SBI RFENCE extension detected\n" ); }else { __sbi_rfence = __sbi_rfence_v01; }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" ); pm_power_off = sbi_srst_power_off; sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot;
arch/riscv/kvm/main.c +1 -1
@@ -75,7 +75,7 @@ static int __init riscv_kvm_init(void)return -ENODEV ; } -if (sbi_probe_extension (SBI_EXT_RFENCE ) <=0 ) { +if (!sbi_probe_extension (SBI_EXT_RFENCE )) {kvm_info ("require SBI RFENCE extension\n" );return -ENODEV ; }
drivers/cpuidle/cpuidle-riscv-sbi.c +1 -1
@@ -613,7 +613,7 @@ static int __init sbi_cpuidle_init(void)* 2) SBI HSM extension is available */ 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" );return 0 ; }
drivers/perf/riscv_pmu_sbi.c +1 -1
@@ -924,7 +924,7 @@ static int __init pmu_sbi_devinit(void)struct platform_device *pdev;if (sbi_spec_version <sbi_mk_version (0 ,3 ) || -sbi_probe_extension (SBI_EXT_PMU ) <=0 ) { + !sbi_probe_extension (SBI_EXT_PMU )) {return 0 ; }
Signature · 1 line
2.39.2
Palmer Dabbelt
AppliedPATCH v2 1/1 RISC-V: Align SBI probe implementation with spec
Quoted 8 lines · Andrew Jones
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.[...]
Applied, thanks!
[1/1] RISC-V: Align SBI probe implementation with spec
https://git.kernel.org/palmer/c/41cad8284d5e
Best regards,
Signature · 1 line
Palmer Dabbelt <[email protected]>