RISC-V: cpu: Enable cpuinfo for ACPI systems
authorSunil V L <sunilvl@ventanamicro.com>
Mon, 15 May 2023 05:49:22 +0000 (11:19 +0530)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 1 Jun 2023 15:45:09 +0000 (08:45 -0700)
On ACPI based platforms, few details like ISA need to be read
from the ACPI table. Enable cpuinfo on ACPI based systems.

ACPI has nothing similar to DT compatible property for each CPU.
Hence, cpuinfo will not print "uarch".

Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Link: https://lore.kernel.org/r/20230515054928.2079268-16-sunilvl@ventanamicro.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/cpu.c

index c96aa56cf1c7b2a8856c8eda3da77e4a24b447e0..5de6fb703cc257beec2665cb315c481a671fd95c 100644 (file)
@@ -3,10 +3,12 @@
  * Copyright (C) 2012 Regents of the University of California
  */
 
+#include <linux/acpi.h>
 #include <linux/cpu.h>
 #include <linux/init.h>
 #include <linux/seq_file.h>
 #include <linux/of.h>
+#include <asm/acpi.h>
 #include <asm/cpufeature.h>
 #include <asm/csr.h>
 #include <asm/hwcap.h>
@@ -283,23 +285,35 @@ static void c_stop(struct seq_file *m, void *v)
 static int c_show(struct seq_file *m, void *v)
 {
        unsigned long cpu_id = (unsigned long)v - 1;
-       struct device_node *node = of_get_cpu_node(cpu_id, NULL);
        struct riscv_cpuinfo *ci = per_cpu_ptr(&riscv_cpuinfo, cpu_id);
+       struct device_node *node;
        const char *compat, *isa;
 
        seq_printf(m, "processor\t: %lu\n", cpu_id);
        seq_printf(m, "hart\t\t: %lu\n", cpuid_to_hartid_map(cpu_id));
-       if (!of_property_read_string(node, "riscv,isa", &isa))
-               print_isa(m, isa);
-       print_mmu(m);
-       if (!of_property_read_string(node, "compatible", &compat)
-           && strcmp(compat, "riscv"))
-               seq_printf(m, "uarch\t\t: %s\n", compat);
+
+       if (acpi_disabled) {
+               node = of_get_cpu_node(cpu_id, NULL);
+               if (!of_property_read_string(node, "riscv,isa", &isa))
+                       print_isa(m, isa);
+
+               print_mmu(m);
+               if (!of_property_read_string(node, "compatible", &compat) &&
+                   strcmp(compat, "riscv"))
+                       seq_printf(m, "uarch\t\t: %s\n", compat);
+
+               of_node_put(node);
+       } else {
+               if (!acpi_get_riscv_isa(NULL, cpu_id, &isa))
+                       print_isa(m, isa);
+
+               print_mmu(m);
+       }
+
        seq_printf(m, "mvendorid\t: 0x%lx\n", ci->mvendorid);
        seq_printf(m, "marchid\t\t: 0x%lx\n", ci->marchid);
        seq_printf(m, "mimpid\t\t: 0x%lx\n", ci->mimpid);
        seq_puts(m, "\n");
-       of_node_put(node);
 
        return 0;
 }