arm64: renesas: Split R-Car Gen3 and Gen4 common board code
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Thu, 12 Dec 2024 13:38:27 +0000 (14:38 +0100)
committerMarek Vasut <marek.vasut+renesas@mailbox.org>
Sun, 29 Dec 2024 15:55:31 +0000 (16:55 +0100)
Split common board code for R-Car Gen3 and Gen4 into separate files.
The R-Car Gen3 board code contains fixups specific to TFA which are
no longer required on R-Car Gen4, keep those fixups in its own file
so they would not interfere with Gen4.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
14 files changed:
board/beacon/beacon-rzg2m/Makefile
board/hoperun/hihope-rzg2/Makefile
board/renesas/condor/Makefile
board/renesas/draak/Makefile
board/renesas/eagle/Makefile
board/renesas/ebisu/Makefile
board/renesas/rcar-common/common.c
board/renesas/rcar-common/gen3-common.c [new file with mode: 0644]
board/renesas/rcar-common/gen4-common.c
board/renesas/salvator-x/Makefile
board/renesas/ulcb/Makefile
board/renesas/v3hsk/Makefile
board/renesas/v3msk/Makefile
board/silinux/ek874/Makefile

index 9131a92..332b41f 100644 (file)
@@ -6,4 +6,4 @@
 # SPDX-License-Identifier: GPL-2.0+
 #
 
-obj-y  := beacon-rzg2m.o ../../renesas/rcar-common/common.o
+obj-y  := beacon-rzg2m.o ../../renesas/rcar-common/gen3-common.o ../../renesas/rcar-common/common.o
index e989e7a..700e26d 100644 (file)
@@ -6,4 +6,4 @@
 # SPDX-License-Identifier: GPL-2.0+
 #
 
-obj-y  := hihope-rzg2.o ../../renesas/rcar-common/common.o
+obj-y  := hihope-rzg2.o ../../renesas/rcar-common/gen3-common.o ../../renesas/rcar-common/common.o
index cb965cd..fe3a2fd 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ../rcar-common/common.o
+obj-y  := ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index 8859cf9..3ed7800 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := draak.o ../rcar-common/common.o
+obj-y  := draak.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index 98164b5..3f5fdab 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ../rcar-common/v3-common.o ../rcar-common/common.o
+obj-y  := ../rcar-common/v3-common.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index 283d3a4..8139391 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ../rcar-common/common.o
+obj-y  := ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index 499c314..4e35e01 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* If the firmware passed a device tree use it for e.g. U-Boot DRAM setup. */
-extern u64 rcar_atf_boot_args[];
-
-#define FDT_RPC_PATH   "/soc/spi@ee200000"
-
-static void apply_atf_overlay(void *fdt_blob)
-{
-       void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
-
-       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
-               fdt_overlay_apply_node(fdt_blob, 0, atf_fdt_blob, 0);
-}
-
-int fdtdec_board_setup(const void *fdt_blob)
-{
-       apply_atf_overlay((void *)fdt_blob);
-
-       return 0;
-}
-
 int dram_init(void)
 {
        return fdtdec_setup_mem_size_base();
@@ -58,158 +38,4 @@ int __weak board_init(void)
        return 0;
 }
 
-#if defined(CONFIG_RCAR_GEN3)
-#define RST_BASE       0xE6160000
-#define RST_CA57RESCNT (RST_BASE + 0x40)
-#define RST_CA53RESCNT (RST_BASE + 0x44)
-#define RST_RSTOUTCR   (RST_BASE + 0x58)
-#define RST_CA57_CODE  0xA5A5000F
-#define RST_CA53_CODE  0x5A5A000F
-
-void __weak reset_cpu(void)
-{
-       unsigned long midr, cputype;
-
-       asm volatile("mrs %0, midr_el1" : "=r" (midr));
-       cputype = (midr >> 4) & 0xfff;
-
-       if (cputype == 0xd03)
-               writel(RST_CA53_CODE, RST_CA53RESCNT);
-       else if (cputype == 0xd07)
-               writel(RST_CA57_CODE, RST_CA57RESCNT);
-       else
-               hang();
-}
-#elif defined(CONFIG_RCAR_GEN4)
-#define RST_BASE       0xE6160000 /* Domain0 */
-#define RST_SRESCR0    (RST_BASE + 0x18)
-#define RST_SPRES      0x5AA58000
-
-void __weak reset_cpu(void)
-{
-       writel(RST_SPRES, RST_SRESCR0);
-}
-#else
-#error Neither CONFIG_RCAR_GEN3 nor CONFIG_RCAR_GEN4 are set
-#endif
-
-#if defined(CONFIG_OF_BOARD_SETUP)
-static int is_mem_overlap(void *blob, int first_mem_node, int curr_mem_node)
-{
-       struct fdt_resource first_mem_res, curr_mem_res;
-       int curr_mem_reg, first_mem_reg = 0;
-       int ret;
-
-       for (;;) {
-               ret = fdt_get_resource(blob, first_mem_node, "reg",
-                                      first_mem_reg++, &first_mem_res);
-               if (ret) /* No more entries, no overlap found */
-                       return 0;
-
-               curr_mem_reg = 0;
-               for (;;) {
-                       ret = fdt_get_resource(blob, curr_mem_node, "reg",
-                                              curr_mem_reg++, &curr_mem_res);
-                       if (ret) /* No more entries, check next tuple */
-                               break;
-
-                       if (curr_mem_res.end < first_mem_res.start)
-                               continue;
-
-                       if (curr_mem_res.start >= first_mem_res.end)
-                               continue;
-
-                       log_debug("Overlap found: 0x%llx..0x%llx / 0x%llx..0x%llx\n",
-                                 first_mem_res.start, first_mem_res.end,
-                                 curr_mem_res.start, curr_mem_res.end);
-
-                       return 1;
-               }
-       }
-
-       return 0;
-}
-
-static void scrub_duplicate_memory(void *blob)
-{
-       /*
-        * Scrub duplicate /memory@* node entries here. Some R-Car DTs might
-        * contain multiple /memory@* nodes, however fdt_fixup_memory_banks()
-        * either generates single /memory node or updates the first /memory
-        * node. Any remaining memory nodes are thus potential duplicates.
-        *
-        * However, it is not possible to delete all the memory nodes right
-        * away, since some of those might not be DRAM memory nodes, but some
-        * sort of other memory. Thus, delete only the memory nodes which are
-        * in the R-Car3 DBSC ranges.
-        */
-       int mem = 0, first_mem_node = 0;
-
-       for (;;) {
-               mem = fdt_node_offset_by_prop_value(blob, mem,
-                                                   "device_type", "memory", 7);
-               if (mem < 0)
-                       break;
-               if (!fdtdec_get_is_enabled(blob, mem))
-                       continue;
-
-               /* First memory node, patched by U-Boot */
-               if (!first_mem_node) {
-                       first_mem_node = mem;
-                       continue;
-               }
-
-               /* Check the remaining nodes and delete duplicates */
-               if (!is_mem_overlap(blob, first_mem_node, mem))
-                       continue;
-
-               /* Delete duplicate node, start again */
-               fdt_del_node(blob, mem);
-               first_mem_node = 0;
-               mem = 0;
-       }
-}
-
-static void update_rpc_status(void *blob)
-{
-       void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
-       int offset, enabled;
-
-       /*
-        * Check if the DT fragment received from TF-A had its RPC-IF device node
-        * enabled.
-        */
-       if (fdt_magic(atf_fdt_blob) != FDT_MAGIC)
-               return;
-
-       offset = fdt_path_offset(atf_fdt_blob, FDT_RPC_PATH);
-       if (offset < 0)
-               return;
-
-       enabled = fdtdec_get_is_enabled(atf_fdt_blob, offset);
-       if (!enabled)
-               return;
-
-       /*
-        * Find the RPC-IF device node, and enable it if it has a flash subnode.
-        */
-       offset = fdt_path_offset(blob, FDT_RPC_PATH);
-       if (offset < 0)
-               return;
-
-       if (fdt_subnode_offset(blob, offset, "flash") < 0)
-               return;
-
-       fdt_status_okay(blob, offset);
-}
-
-int ft_board_setup(void *blob, struct bd_info *bd)
-{
-       apply_atf_overlay(blob);
-       scrub_duplicate_memory(blob);
-       update_rpc_status(blob);
-
-       return 0;
-}
-#endif
 #endif
diff --git a/board/renesas/rcar-common/gen3-common.c b/board/renesas/rcar-common/gen3-common.c
new file mode 100644 (file)
index 0000000..4291e1d
--- /dev/null
@@ -0,0 +1,185 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * board/renesas/rcar-common/gen3-common.c
+ *
+ * Copyright (C) 2013 Renesas Electronics Corporation
+ * Copyright (C) 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
+ * Copyright (C) 2015 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ */
+
+#include <dm.h>
+#include <fdt_support.h>
+#include <hang.h>
+#include <init.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <dm/uclass-internal.h>
+#include <asm/arch/renesas.h>
+#include <linux/libfdt.h>
+
+#ifdef CONFIG_RCAR_64
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* If the firmware passed a device tree use it for e.g. U-Boot DRAM setup. */
+extern u64 rcar_atf_boot_args[];
+
+#define FDT_RPC_PATH   "/soc/spi@ee200000"
+
+static void apply_atf_overlay(void *fdt_blob)
+{
+       void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
+
+       if (fdt_magic(atf_fdt_blob) == FDT_MAGIC)
+               fdt_overlay_apply_node(fdt_blob, 0, atf_fdt_blob, 0);
+}
+
+int fdtdec_board_setup(const void *fdt_blob)
+{
+       apply_atf_overlay((void *)fdt_blob);
+
+       return 0;
+}
+
+#define RST_BASE       0xE6160000
+#define RST_CA57RESCNT (RST_BASE + 0x40)
+#define RST_CA53RESCNT (RST_BASE + 0x44)
+#define RST_RSTOUTCR   (RST_BASE + 0x58)
+#define RST_CA57_CODE  0xA5A5000F
+#define RST_CA53_CODE  0x5A5A000F
+
+void __weak reset_cpu(void)
+{
+       unsigned long midr, cputype;
+
+       asm volatile("mrs %0, midr_el1" : "=r" (midr));
+       cputype = (midr >> 4) & 0xfff;
+
+       if (cputype == 0xd03)
+               writel(RST_CA53_CODE, RST_CA53RESCNT);
+       else if (cputype == 0xd07)
+               writel(RST_CA57_CODE, RST_CA57RESCNT);
+       else
+               hang();
+}
+
+#if defined(CONFIG_OF_BOARD_SETUP)
+static int is_mem_overlap(void *blob, int first_mem_node, int curr_mem_node)
+{
+       struct fdt_resource first_mem_res, curr_mem_res;
+       int curr_mem_reg, first_mem_reg = 0;
+       int ret;
+
+       for (;;) {
+               ret = fdt_get_resource(blob, first_mem_node, "reg",
+                                      first_mem_reg++, &first_mem_res);
+               if (ret) /* No more entries, no overlap found */
+                       return 0;
+
+               curr_mem_reg = 0;
+               for (;;) {
+                       ret = fdt_get_resource(blob, curr_mem_node, "reg",
+                                              curr_mem_reg++, &curr_mem_res);
+                       if (ret) /* No more entries, check next tuple */
+                               break;
+
+                       if (curr_mem_res.end < first_mem_res.start)
+                               continue;
+
+                       if (curr_mem_res.start >= first_mem_res.end)
+                               continue;
+
+                       log_debug("Overlap found: 0x%llx..0x%llx / 0x%llx..0x%llx\n",
+                                 first_mem_res.start, first_mem_res.end,
+                                 curr_mem_res.start, curr_mem_res.end);
+
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+static void scrub_duplicate_memory(void *blob)
+{
+       /*
+        * Scrub duplicate /memory@* node entries here. Some R-Car DTs might
+        * contain multiple /memory@* nodes, however fdt_fixup_memory_banks()
+        * either generates single /memory node or updates the first /memory
+        * node. Any remaining memory nodes are thus potential duplicates.
+        *
+        * However, it is not possible to delete all the memory nodes right
+        * away, since some of those might not be DRAM memory nodes, but some
+        * sort of other memory. Thus, delete only the memory nodes which are
+        * in the R-Car3 DBSC ranges.
+        */
+       int mem = 0, first_mem_node = 0;
+
+       for (;;) {
+               mem = fdt_node_offset_by_prop_value(blob, mem,
+                                                   "device_type", "memory", 7);
+               if (mem < 0)
+                       break;
+               if (!fdtdec_get_is_enabled(blob, mem))
+                       continue;
+
+               /* First memory node, patched by U-Boot */
+               if (!first_mem_node) {
+                       first_mem_node = mem;
+                       continue;
+               }
+
+               /* Check the remaining nodes and delete duplicates */
+               if (!is_mem_overlap(blob, first_mem_node, mem))
+                       continue;
+
+               /* Delete duplicate node, start again */
+               fdt_del_node(blob, mem);
+               first_mem_node = 0;
+               mem = 0;
+       }
+}
+
+static void update_rpc_status(void *blob)
+{
+       void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
+       int offset, enabled;
+
+       /*
+        * Check if the DT fragment received from TF-A had its RPC-IF device node
+        * enabled.
+        */
+       if (fdt_magic(atf_fdt_blob) != FDT_MAGIC)
+               return;
+
+       offset = fdt_path_offset(atf_fdt_blob, FDT_RPC_PATH);
+       if (offset < 0)
+               return;
+
+       enabled = fdtdec_get_is_enabled(atf_fdt_blob, offset);
+       if (!enabled)
+               return;
+
+       /*
+        * Find the RPC-IF device node, and enable it if it has a flash subnode.
+        */
+       offset = fdt_path_offset(blob, FDT_RPC_PATH);
+       if (offset < 0)
+               return;
+
+       if (fdt_subnode_offset(blob, offset, "flash") < 0)
+               return;
+
+       fdt_status_okay(blob, offset);
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+       apply_atf_overlay(blob);
+       scrub_duplicate_memory(blob);
+       update_rpc_status(blob);
+
+       return 0;
+}
+#endif
+#endif
index 36a51bc..2abe966 100644 (file)
@@ -74,3 +74,17 @@ int board_init(void)
 
        return 0;
 }
+
+#define RST_BASE       0xE6160000 /* Domain0 */
+#define RST_SRESCR0    (RST_BASE + 0x18)
+#define RST_SPRES      0x5AA58000
+
+void __weak reset_cpu(void)
+{
+       writel(RST_SPRES, RST_SRESCR0);
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+       return 0;
+}
index 0fc69ba..fe7c78e 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := salvator-x.o ../rcar-common/common.o
+obj-y  := salvator-x.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index ec2f161..c3c2f39 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ulcb.o cpld.o ../rcar-common/common.o
+obj-y  := ulcb.o cpld.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 endif
index b29114c..ee04f67 100644 (file)
@@ -10,6 +10,6 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ../rcar-common/v3-common.o ../rcar-common/common.o
+obj-y  := ../rcar-common/v3-common.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 obj-$(CONFIG_SYSRESET) += cpld.o
 endif
index f8c4bcd..63e06a4 100644 (file)
@@ -10,6 +10,6 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../rcar-common/gen3-spl.o
 else
-obj-y  := ../rcar-common/v3-common.o ../rcar-common/common.o
+obj-y  := ../rcar-common/v3-common.o ../rcar-common/gen3-common.o ../rcar-common/common.o
 obj-$(CONFIG_SYSRESET) += cpld.o
 endif
index 6917a24..879da9e 100644 (file)
@@ -9,5 +9,5 @@
 ifdef CONFIG_XPL_BUILD
 obj-y  := ../../renesas/rcar-common/gen3-spl.o
 else
-obj-y  := ek874.o ../../renesas/rcar-common/common.o
+obj-y  := ek874.o ../../renesas/rcar-common/gen3-common.o ../../renesas/rcar-common/common.o
 endif