lib: utils: Add a fdt_cpu_fixup() helper

Add a helper routine to updates the "status" property of a CPU node
in the device tree to "disabled" if that hart is in disabled state.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
Bin Meng
2020-03-17 07:59:48 -07:00
committed by Anup Patel
parent 1071f05663
commit dd9439fbac
2 changed files with 38 additions and 0 deletions

View File

@@ -9,6 +9,18 @@
#ifndef __FDT_HELPER_H__ #ifndef __FDT_HELPER_H__
#define __FDT_HELPER_H__ #define __FDT_HELPER_H__
/**
* Fix up the CPU node in the device tree
*
* This routine updates the "status" property of a CPU node in the device tree
* to "disabled" if that hart is in disabled state in OpenSBI.
*
* It is recommended that platform codes call this helper in their final_init()
*
* @param fdt: device tree blob
*/
void fdt_cpu_fixup(void *fdt);
/** /**
* Fix up the PLIC node in the device tree * Fix up the PLIC node in the device tree
* *

View File

@@ -12,6 +12,32 @@
#include <sbi/sbi_platform.h> #include <sbi/sbi_platform.h>
#include <sbi/sbi_scratch.h> #include <sbi/sbi_scratch.h>
void fdt_cpu_fixup(void *fdt)
{
struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
char cpu_node[32] = "";
int cpu_offset;
int err;
u32 i;
err = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 32);
if (err < 0)
return;
/* assume hart ids are continuous */
for (i = 0; i < sbi_platform_hart_count(plat); i++) {
sbi_sprintf(cpu_node, "/cpus/cpu@%d", i);
cpu_offset = fdt_path_offset(fdt, cpu_node);
if (sbi_platform_hart_disabled(plat, i))
fdt_setprop_string(fdt, cpu_offset, "status",
"disabled");
memset(cpu_node, 0, sizeof(cpu_node));
}
}
void fdt_plic_fixup(void *fdt, const char *compat) void fdt_plic_fixup(void *fdt, const char *compat)
{ {
u32 *cells; u32 *cells;