Skip to content

Commit 41cad82

Browse files
Andrew Jonespalmer-dabbelt
authored andcommitted
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: b9dcd9e ("RISC-V: Add basic support for SBI v0.2") Signed-off-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20230427163626.101042-1-ajones@ventanamicro.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
1 parent e4ef93e commit 41cad82

6 files changed

Lines changed: 13 additions & 14 deletions

File tree

arch/riscv/include/asm/sbi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ int sbi_remote_hfence_vvma_asid(const struct cpumask *cpu_mask,
295295
unsigned long start,
296296
unsigned long size,
297297
unsigned long asid);
298-
int sbi_probe_extension(int ext);
298+
long sbi_probe_extension(int ext);
299299

300300
/* Check if current SBI specification version is 0.1 or not */
301301
static inline int sbi_spec_is_0_1(void)

arch/riscv/kernel/cpu_ops.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const struct cpu_operations cpu_ops_spinwait = {
2727
void __init cpu_set_ops(int cpuid)
2828
{
2929
#if IS_ENABLED(CONFIG_RISCV_SBI)
30-
if (sbi_probe_extension(SBI_EXT_HSM) > 0) {
30+
if (sbi_probe_extension(SBI_EXT_HSM)) {
3131
if (!cpuid)
3232
pr_info("SBI HSM extension detected\n");
3333
cpu_ops[cpuid] = &cpu_ops_sbi;

arch/riscv/kernel/sbi.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -524,19 +524,18 @@ static void sbi_srst_power_off(void)
524524
* sbi_probe_extension() - Check if an SBI extension ID is supported or not.
525525
* @extid: The extension ID to be probed.
526526
*
527-
* Return: Extension specific nonzero value f yes, -ENOTSUPP otherwise.
527+
* Return: 1 or an extension specific nonzero value if yes, 0 otherwise.
528528
*/
529-
int sbi_probe_extension(int extid)
529+
long sbi_probe_extension(int extid)
530530
{
531531
struct sbiret ret;
532532

533533
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid,
534534
0, 0, 0, 0, 0);
535535
if (!ret.error)
536-
if (ret.value)
537-
return ret.value;
536+
return ret.value;
538537

539-
return -ENOTSUPP;
538+
return 0;
540539
}
541540
EXPORT_SYMBOL(sbi_probe_extension);
542541

@@ -599,26 +598,26 @@ void __init sbi_init(void)
599598
if (!sbi_spec_is_0_1()) {
600599
pr_info("SBI implementation ID=0x%lx Version=0x%lx\n",
601600
sbi_get_firmware_id(), sbi_get_firmware_version());
602-
if (sbi_probe_extension(SBI_EXT_TIME) > 0) {
601+
if (sbi_probe_extension(SBI_EXT_TIME)) {
603602
__sbi_set_timer = __sbi_set_timer_v02;
604603
pr_info("SBI TIME extension detected\n");
605604
} else {
606605
__sbi_set_timer = __sbi_set_timer_v01;
607606
}
608-
if (sbi_probe_extension(SBI_EXT_IPI) > 0) {
607+
if (sbi_probe_extension(SBI_EXT_IPI)) {
609608
__sbi_send_ipi = __sbi_send_ipi_v02;
610609
pr_info("SBI IPI extension detected\n");
611610
} else {
612611
__sbi_send_ipi = __sbi_send_ipi_v01;
613612
}
614-
if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) {
613+
if (sbi_probe_extension(SBI_EXT_RFENCE)) {
615614
__sbi_rfence = __sbi_rfence_v02;
616615
pr_info("SBI RFENCE extension detected\n");
617616
} else {
618617
__sbi_rfence = __sbi_rfence_v01;
619618
}
620619
if ((sbi_spec_version >= sbi_mk_version(0, 3)) &&
621-
(sbi_probe_extension(SBI_EXT_SRST) > 0)) {
620+
sbi_probe_extension(SBI_EXT_SRST)) {
622621
pr_info("SBI SRST extension detected\n");
623622
pm_power_off = sbi_srst_power_off;
624623
sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot;

arch/riscv/kvm/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static int __init riscv_kvm_init(void)
7575
return -ENODEV;
7676
}
7777

78-
if (sbi_probe_extension(SBI_EXT_RFENCE) <= 0) {
78+
if (!sbi_probe_extension(SBI_EXT_RFENCE)) {
7979
kvm_info("require SBI RFENCE extension\n");
8080
return -ENODEV;
8181
}

drivers/cpuidle/cpuidle-riscv-sbi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ static int __init sbi_cpuidle_init(void)
613613
* 2) SBI HSM extension is available
614614
*/
615615
if ((sbi_spec_version < sbi_mk_version(0, 3)) ||
616-
sbi_probe_extension(SBI_EXT_HSM) <= 0) {
616+
!sbi_probe_extension(SBI_EXT_HSM)) {
617617
pr_info("HSM suspend not available\n");
618618
return 0;
619619
}

drivers/perf/riscv_pmu_sbi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ static int __init pmu_sbi_devinit(void)
924924
struct platform_device *pdev;
925925

926926
if (sbi_spec_version < sbi_mk_version(0, 3) ||
927-
sbi_probe_extension(SBI_EXT_PMU) <= 0) {
927+
!sbi_probe_extension(SBI_EXT_PMU)) {
928928
return 0;
929929
}
930930

0 commit comments

Comments
 (0)