arm: mach-k3: am62p: Fixup CPU core, CAN-FD and Video-codec nodes in fdt
authorAparna Patra <a-patra@ti.com>
Wed, 8 Jan 2025 04:49:36 +0000 (10:19 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 14 Jan 2025 21:50:07 +0000 (15:50 -0600)
AM62P SOC is available in multiple variants:
-CPU cores (Cortex-A) AM62Px1 (1 core),
 AM62Px2 (2 cores), AM62Px4 (4 cores)
-With and without CAN-FD & Video-codec support

Remove the relevant FDT nodes by reading the actual configuration
from the SoC registers, with that change it is possible to have a single
dts/dtb file handling the different variant at runtime.

Signed-off-by: Aparna Patra <a-patra@ti.com>
Reviewed-by: Bryan Brattlof <bb@ti.com>
arch/arm/mach-k3/am62px/am62p5_fdt.c
arch/arm/mach-k3/include/mach/am62p_hardware.h

index 29c832d..e88760e 100644 (file)
@@ -7,8 +7,42 @@
 #include "../common_fdt.h"
 #include <fdt_support.h>
 
+static void fdt_fixup_cores_wdt_nodes_am62p(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@f0000/watchdog@e0%d0000", core_nr);
+               fdt_del_node_path(blob, node_path);
+       }
+}
+
+static void fdt_fixup_video_codec_nodes_am62p(void *blob, bool has_video_codec)
+{
+       if (!has_video_codec)
+               fdt_del_node_path(blob, "/bus@f0000/video-codec@30210000");
+}
+
+static void fdt_fixup_canfd_nodes_am62p(void *blob, bool has_canfd)
+{
+       if (!has_canfd) {
+               fdt_del_node_path(blob, "/bus@f0000/can@20701000");
+               fdt_del_node_path(blob, "/bus@f0000/can@20711000");
+       }
+}
+
 int ft_system_setup(void *blob, struct bd_info *bd)
 {
+       fdt_fixup_cores_wdt_nodes_am62p(blob, k3_get_core_nr());
+       fdt_fixup_video_codec_nodes_am62p(blob, k3_has_video_codec());
+       fdt_fixup_canfd_nodes_am62p(blob, k3_has_canfd());
        fdt_fixup_reserved(blob, "tfa", CONFIG_K3_ATF_LOAD_ADDR, 0x80000);
        fdt_fixup_reserved(blob, "optee", CONFIG_K3_OPTEE_LOAD_ADDR, 0x1800000);
 
index 923466c..3395627 100644 (file)
 #define MCU_CTRL_MMR0_BASE                     0x04500000
 #define WKUP_CTRL_MMR0_BASE                    0x43000000
 
+#define CTRLMMR_WKUP_JTAG_DEVICE_ID            (WKUP_CTRL_MMR0_BASE + 0x18)
+#define JTAG_DEV_CORE_NR_MASK                  GENMASK(19, 18)
+#define JTAG_DEV_CORE_NR_SHIFT                 18
+#define JTAG_DEV_CANFD_MASK                    BIT(15)
+#define JTAG_DEV_CANFD_SHIFT                   15
+#define JTAG_DEV_VIDEO_CODEC_MASK                      BIT(14)
+#define JTAG_DEV_VIDEO_CODEC_SHIFT                     14
+
 #define CTRLMMR_MAIN_DEVSTAT                   (WKUP_CTRL_MMR0_BASE + 0x30)
 #define MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK     GENMASK(6, 3)
 #define MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT    3
 
 #define TI_SRAM_SCRATCH_BOARD_EEPROM_START     0x43c30000
 
+static inline int k3_get_core_nr(void)
+{
+       u32 dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
+
+       return ((dev_id & JTAG_DEV_CORE_NR_MASK) >> JTAG_DEV_CORE_NR_SHIFT) + 1;
+}
+
+static inline int k3_has_video_codec(void)
+{
+       u32 dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
+
+       return !((dev_id & JTAG_DEV_VIDEO_CODEC_MASK) >> JTAG_DEV_VIDEO_CODEC_SHIFT);
+}
+
+static inline int k3_has_canfd(void)
+{
+       u32 dev_id = readl(CTRLMMR_WKUP_JTAG_DEVICE_ID);
+
+       return (dev_id & JTAG_DEV_CANFD_MASK) >> JTAG_DEV_CANFD_SHIFT;
+}
+
 #if defined(CONFIG_SYS_K3_SPL_ATF) && !defined(__ASSEMBLY__)
 
 static const u32 put_device_ids[] = {};