lib: utils: Improve fdt_cpu_fixup() implementation

The fdt_cpu_fixup() should work fine even if HARTs without MMU
are not marked invalid by platform support code.

In future, we plan to treat HARTs without MMU as valid in the
generic platform support so that we can hold these HARTs in
HSM STOPPED state.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Anup Patel 2020-09-07 19:16:27 +05:30 committed by Anup Patel
parent 7ccf6bf54c
commit 9f935a4a43
1 changed files with 11 additions and 2 deletions

View File

@ -21,7 +21,8 @@ void fdt_cpu_fixup(void *fdt)
{
struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
int err, cpu_offset, cpus_offset;
int err, cpu_offset, cpus_offset, len;
const char *mmu_type;
u32 hartid;
err = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 32);
@ -37,7 +38,15 @@ void fdt_cpu_fixup(void *fdt)
if (err)
continue;
if (sbi_platform_hart_invalid(plat, hartid))
/*
* Disable a HART DT node if one of the following is true:
* 1. The HART is marked invalid by platform support
* 2. MMU is not available for the HART
*/
mmu_type = fdt_getprop(fdt, cpu_offset, "mmu-type", &len);
if (sbi_platform_hart_invalid(plat, hartid) ||
!mmu_type || !len)
fdt_setprop_string(fdt, cpu_offset, "status",
"disabled");
}