lib: fdt_domain: Default boot-hart to coldboot HART for multi-domain boot When "boot-hart" is not specified, dom->boot_hartid was left as -1U, causing domain context switching to fail. Default it to the coldboot HART to enable SMP boot in multi-domain setups, consistent with how next-arg1 is handled. Also update its description in domain_support.md. Signed-off-by: Yu-Chien Peter Lin <peter.lin@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260327054936.3462935-1-peter.lin@sifive.com Signed-off-by: Anup Patel <anup@brainfault.org>
diff --git a/docs/domain_support.md b/docs/domain_support.md index 93186c4..c01e445 100644 --- a/docs/domain_support.md +++ b/docs/domain_support.md
@@ -173,9 +173,9 @@ Any region of a domain defined in DT node cannot have only M-bits set in access permissions i.e. it cannot be an m-mode only accessible region. * **boot-hart** (Optional) - The DT node phandle of the HART booting the - domain instance. If coldboot HART is assigned to the domain instance then - this DT property is ignored and the coldboot HART is assumed to be the - boot HART of the domain instance. + domain instance. If not specified, defaults to the coldboot HART. Note that + if the coldboot HART is assigned to this domain, it will be forced as + the boot HART regardless of this property. * **next-arg1** (Optional) - The 64 bit next booting stage arg1 for the domain instance. If this DT property is not available and coldboot HART is not assigned to the domain instance then **next booting stage arg1 of coldboot HART**
diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c index b2fa863..1b03953 100644 --- a/lib/utils/fdt/fdt_domain.c +++ b/lib/utils/fdt/fdt_domain.c
@@ -396,16 +396,13 @@ dom->fw_region_inited = root.fw_region_inited; /* Read "boot-hart" DT property */ - val32 = -1U; + val32 = current_hartid(); val = fdt_getprop(fdt, domain_offset, "boot-hart", &len); if (val && len >= 4) { cpu_offset = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*val)); if (cpu_offset >= 0 && fdt_node_is_enabled(fdt, cpu_offset)) fdt_parse_hart_id(fdt, cpu_offset, &val32); - } else { - if (domain_offset == *cold_domain_offset) - val32 = current_hartid(); } dom->boot_hartid = val32;