[PATCH v1 3/3] arm: mach-k3: am62: Fixup CPU core counts in fdt
Francesco Dolcini
francesco at dolcini.it
Wed Jul 12 15:47:30 CEST 2023
From: Emanuele Ghidoli <emanuele.ghidoli at toradex.com>
AM62x SoC is available in multiple variant with a different
amount of CPU cores (Cortex-A) available, AM62x1, AM62x2, AM62x4
have respectively 1, 2 or 4 cores.
Update the FDT with the actual core count as read from the SoC registers,
with that change is possible to have a single dts/dtb file handling
the different variant at runtime.
A similar approach is implemented for example on i.MX8 and STM32MP1 SoC.
Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli at toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini at toradex.com>
---
arch/arm/mach-k3/common.c | 48 +++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
index f86ccaedc94f..5ee1851e3aaa 100644
--- a/arch/arm/mach-k3/common.c
+++ b/arch/arm/mach-k3/common.c
@@ -431,10 +431,58 @@ int fdt_fixup_msmc_ram(void *blob, char *parent_path, char *node_name)
}
#if defined(CONFIG_OF_SYSTEM_SETUP)
+static int fdt_del_node_path(void *blob, const char *path)
+{
+ int rc;
+ int nodeoff;
+
+ nodeoff = fdt_path_offset(blob, path);
+ if (nodeoff < 0)
+ return 0; /* Not found, skip it */
+
+ rc = fdt_del_node(blob, nodeoff);
+ if (rc < 0)
+ printf("Unable to delete node %s, err=%s\n", path, fdt_strerror(rc));
+ else
+ debug("Deleted node %s\n", path);
+ return rc;
+}
+
+static void fdt_fixup_cores_nodes_am625(void *blob, int core_nr)
+{
+ char node_path[32];
+
+ if (core_nr < 1)
+ return;
+
+ for (; core_nr < 4; core_nr++) {
+ snprintf(node_path, sizeof(node_path), "/cpus/cpu@%d", core_nr);
+ fdt_del_node_path(blob, node_path);
+ snprintf(node_path, sizeof(node_path), "/cpus/cpu-map/cluster0/core%d", core_nr);
+ fdt_del_node_path(blob, node_path);
+ snprintf(node_path, sizeof(node_path), "/bus at f0000/watchdog at e0%d0000", core_nr);
+ fdt_del_node_path(blob, node_path);
+ }
+}
+
+static int k3_get_core_nr(void)
+{
+#if defined(CONFIG_SOC_K3_AM625)
+ u32 full_devid = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
+
+ return (full_devid & JTAG_DEV_CORE_NR_MASK) >> JTAG_DEV_CORE_NR_SHIFT;
+#else
+ return -1;
+#endif
+}
+
int ft_system_setup(void *blob, struct bd_info *bd)
{
int ret = 0;
+ if (IS_ENABLED(CONFIG_SOC_K3_AM625))
+ fdt_fixup_cores_nodes_am625(blob, k3_get_core_nr());
+
if (IS_ENABLED(CONFIG_SOC_K3_J721S2) ||
IS_ENABLED(CONFIG_SOC_K3_AM654) ||
IS_ENABLED(CONFIG_SOC_K3_J721E)) {
--
2.25.1
More information about the U-Boot
mailing list