RISC-V: Don't fail in riscv_of_parent_hartid() for disabled HARTs
authorAnup Patel <apatel@ventanamicro.com>
Fri, 27 Oct 2023 15:42:53 +0000 (21:12 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:37 +0000 (11:59 +0100)
[ Upstream commit c4676f8dc1e12e68d6511f9ed89707fdad4c962c ]

The riscv_of_processor_hartid() used by riscv_of_parent_hartid() fails
for HARTs disabled in the DT. This results in the following warning
thrown by the RISC-V INTC driver for the E-core on SiFive boards:

[    0.000000] riscv-intc: unable to find hart id for /cpus/cpu@0/interrupt-controller

The riscv_of_parent_hartid() is only expected to read the hartid
from the DT so we directly call of_get_cpu_hwid() instead of calling
riscv_of_processor_hartid().

Fixes: ad635e723e17 ("riscv: cpu: Add 64bit hartid support on RV64")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Link: https://lore.kernel.org/r/20231027154254.355853-2-apatel@ventanamicro.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/riscv/kernel/cpu.c

index c17dacb..157ace8 100644 (file)
@@ -125,13 +125,14 @@ old_interface:
  */
 int riscv_of_parent_hartid(struct device_node *node, unsigned long *hartid)
 {
-       int rc;
-
        for (; node; node = node->parent) {
                if (of_device_is_compatible(node, "riscv")) {
-                       rc = riscv_of_processor_hartid(node, hartid);
-                       if (!rc)
-                               return 0;
+                       *hartid = (unsigned long)of_get_cpu_hwid(node, 0);
+                       if (*hartid == ~0UL) {
+                               pr_warn("Found CPU without hart ID\n");
+                               return -ENODEV;
+                       }
+                       return 0;
                }
        }