Skip to content

Commit 9448d9a

Browse files
charlie-rivospalmer-dabbelt
authored andcommitted
riscv: Add vendor extensions to /proc/cpuinfo
All of the supported vendor extensions that have been listed in riscv_isa_vendor_ext_list can be exported through /proc/cpuinfo. Signed-off-by: Charlie Jenkins <[email protected]> Reviewed-by: Evan Green <[email protected]> Reviewed-by: Conor Dooley <[email protected]> Link: https://lore.kernel.org/r/20240719-support_vendor_extensions-v3-2-0af7587bbec0@rivosinc.com Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 23c996f commit 9448d9a

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

arch/riscv/kernel/cpu.c

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <asm/sbi.h>
1717
#include <asm/smp.h>
1818
#include <asm/pgtable.h>
19+
#include <asm/vendor_extensions.h>
1920

2021
bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
2122
{
@@ -235,7 +236,33 @@ arch_initcall(riscv_cpuinfo_init);
235236

236237
#ifdef CONFIG_PROC_FS
237238

238-
static void print_isa(struct seq_file *f, const unsigned long *isa_bitmap)
239+
#define ALL_CPUS -1
240+
241+
static void print_vendor_isa(struct seq_file *f, int cpu)
242+
{
243+
struct riscv_isavendorinfo *vendor_bitmap;
244+
struct riscv_isa_vendor_ext_data_list *ext_list;
245+
const struct riscv_isa_ext_data *ext_data;
246+
247+
for (int i = 0; i < riscv_isa_vendor_ext_list_size; i++) {
248+
ext_list = riscv_isa_vendor_ext_list[i];
249+
ext_data = riscv_isa_vendor_ext_list[i]->ext_data;
250+
251+
if (cpu == ALL_CPUS)
252+
vendor_bitmap = &ext_list->all_harts_isa_bitmap;
253+
else
254+
vendor_bitmap = &ext_list->per_hart_isa_bitmap[cpu];
255+
256+
for (int j = 0; j < ext_list->ext_data_count; j++) {
257+
if (!__riscv_isa_extension_available(vendor_bitmap->isa, ext_data[j].id))
258+
continue;
259+
260+
seq_printf(f, "_%s", ext_data[j].name);
261+
}
262+
}
263+
}
264+
265+
static void print_isa(struct seq_file *f, const unsigned long *isa_bitmap, int cpu)
239266
{
240267

241268
if (IS_ENABLED(CONFIG_32BIT))
@@ -254,6 +281,8 @@ static void print_isa(struct seq_file *f, const unsigned long *isa_bitmap)
254281
seq_printf(f, "%s", riscv_isa_ext[i].name);
255282
}
256283

284+
print_vendor_isa(f, cpu);
285+
257286
seq_puts(f, "\n");
258287
}
259288

@@ -316,7 +345,7 @@ static int c_show(struct seq_file *m, void *v)
316345
* line.
317346
*/
318347
seq_puts(m, "isa\t\t: ");
319-
print_isa(m, NULL);
348+
print_isa(m, NULL, ALL_CPUS);
320349
print_mmu(m);
321350

322351
if (acpi_disabled) {
@@ -338,7 +367,7 @@ static int c_show(struct seq_file *m, void *v)
338367
* additional extensions not present across all harts.
339368
*/
340369
seq_puts(m, "hart isa\t: ");
341-
print_isa(m, hart_isa[cpu_id].isa);
370+
print_isa(m, hart_isa[cpu_id].isa, cpu_id);
342371
seq_puts(m, "\n");
343372

344373
return 0;

0 commit comments

Comments
 (0)