Skip to content

Commit 0f24254

Browse files
charlie-rivospalmer-dabbelt
authored andcommitted
riscv: Introduce vendor variants of extension helpers
Vendor extensions are maintained in per-vendor structs (separate from standard extensions which live in riscv_isa). Create vendor variants for the existing extension helpers to interface with the riscv_isa_vendor bitmaps. Signed-off-by: Charlie Jenkins <[email protected]> Reviewed-by: Conor Dooley <[email protected]> Reviewed-by: Andy Chiu <[email protected]> Link: https://lore.kernel.org/r/20240719-support_vendor_extensions-v3-3-0af7587bbec0@rivosinc.com Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 9448d9a commit 0f24254

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

arch/riscv/include/asm/vendor_extensions.h

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,91 @@ extern const size_t riscv_isa_vendor_ext_list_size;
4242
#define VENDOR_EXT_ALL_CPUS -1
4343

4444
bool __riscv_isa_vendor_extension_available(int cpu, unsigned long vendor, unsigned int bit);
45+
#define riscv_cpu_isa_vendor_extension_available(cpu, vendor, ext) \
46+
__riscv_isa_vendor_extension_available(cpu, vendor, RISCV_ISA_VENDOR_EXT_##ext)
4547
#define riscv_isa_vendor_extension_available(vendor, ext) \
4648
__riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, \
4749
RISCV_ISA_VENDOR_EXT_##ext)
4850

51+
static __always_inline bool __riscv_has_extension_likely(const unsigned long vendor,
52+
const unsigned long ext)
53+
{
54+
asm goto(ALTERNATIVE("j %l[l_no]", "nop", %[vendor], %[ext], 1)
55+
:
56+
: [vendor] "i" (vendor), [ext] "i" (ext)
57+
:
58+
: l_no);
59+
60+
return true;
61+
l_no:
62+
return false;
63+
}
64+
65+
static __always_inline bool __riscv_has_extension_unlikely(const unsigned long vendor,
66+
const unsigned long ext)
67+
{
68+
asm goto(ALTERNATIVE("nop", "j %l[l_yes]", %[vendor], %[ext], 1)
69+
:
70+
: [vendor] "i" (vendor), [ext] "i" (ext)
71+
:
72+
: l_yes);
73+
74+
return false;
75+
l_yes:
76+
return true;
77+
}
78+
79+
static __always_inline bool riscv_has_vendor_extension_likely(const unsigned long vendor,
80+
const unsigned long ext)
81+
{
82+
if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT))
83+
return false;
84+
85+
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE))
86+
return __riscv_has_extension_likely(vendor,
87+
ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE);
88+
89+
return __riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, ext);
90+
}
91+
92+
static __always_inline bool riscv_has_vendor_extension_unlikely(const unsigned long vendor,
93+
const unsigned long ext)
94+
{
95+
if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT))
96+
return false;
97+
98+
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE))
99+
return __riscv_has_extension_unlikely(vendor,
100+
ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE);
101+
102+
return __riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, ext);
103+
}
104+
105+
static __always_inline bool riscv_cpu_has_vendor_extension_likely(const unsigned long vendor,
106+
int cpu, const unsigned long ext)
107+
{
108+
if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT))
109+
return false;
110+
111+
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) &&
112+
__riscv_has_extension_likely(vendor, ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE))
113+
return true;
114+
115+
return __riscv_isa_vendor_extension_available(cpu, vendor, ext);
116+
}
117+
118+
static __always_inline bool riscv_cpu_has_vendor_extension_unlikely(const unsigned long vendor,
119+
int cpu,
120+
const unsigned long ext)
121+
{
122+
if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT))
123+
return false;
124+
125+
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE) &&
126+
__riscv_has_extension_unlikely(vendor, ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE))
127+
return true;
128+
129+
return __riscv_isa_vendor_extension_available(cpu, vendor, ext);
130+
}
131+
49132
#endif /* _ASM_VENDOR_EXTENSIONS_H */

drivers/perf/riscv_pmu_sbi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1064,7 +1064,8 @@ static int pmu_sbi_setup_irqs(struct riscv_pmu *pmu, struct platform_device *pde
10641064
riscv_cached_mimpid(0) == 0) {
10651065
riscv_pmu_irq_num = THEAD_C9XX_RV_IRQ_PMU;
10661066
riscv_pmu_use_irq = true;
1067-
} else if (riscv_isa_vendor_extension_available(ANDES_VENDOR_ID, XANDESPMU) &&
1067+
} else if (riscv_has_vendor_extension_unlikely(ANDES_VENDOR_ID,
1068+
RISCV_ISA_VENDOR_EXT_XANDESPMU) &&
10681069
IS_ENABLED(CONFIG_ANDES_CUSTOM_PMU)) {
10691070
riscv_pmu_irq_num = ANDES_SLI_CAUSE_BASE + ANDES_RV_IRQ_PMOVI;
10701071
riscv_pmu_use_irq = true;

0 commit comments

Comments
 (0)