]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: net: fsl-mc: add support for MC reserved memory
authorLaurentiu Tudor <laurentiu.tudor@nxp.com>
Wed, 27 Sep 2023 15:30:47 +0000 (18:30 +0300)
committerPeng Fan <peng.fan@nxp.com>
Tue, 10 Oct 2023 02:13:33 +0000 (10:13 +0800)
Add support for declaring in device tree the reserved memory ranges
required for MC. Since the MC firmware acts as any DMA master present
in the SoC, the reserved memory ranges need also be identity mapped
in the SMMU, so create the required 'iommu-addresses' property in
the reserved memory nodes.
For now this support is used only on LX2160A SoCs.

Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
board/freescale/lx2160a/lx2160a.c
drivers/net/fsl-mc/mc.c
include/fsl-mc/fsl_mc.h

index 2883848550af17494ac0cc474e6277b8e1e3f382..b3187a14214a4a163337b07964dbabc4b77a9f3c 100644 (file)
@@ -836,6 +836,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
 #ifdef CONFIG_FSL_MC_ENET
        fdt_fsl_mc_fixup_iommu_map_entry(blob);
        fdt_fixup_board_enet(blob);
+       fdt_reserve_mc_mem(blob, 0x4000);
 #endif
        fdt_fixup_icid(blob);
 
index 984616fb65c09e8cadced1a5c4c6e6499a76c73b..f5c5057bec100293f0ad0eecf6a204e2c3e53361 100644 (file)
@@ -30,6 +30,8 @@
 #include <fsl-mc/fsl_qbman_portal.h>
 #include <fsl-mc/ldpaa_wriop.h>
 #include <net/ldpaa_eth.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch-fsl-layerscape/fsl_icid.h>
 
 #define MC_RAM_BASE_ADDR_ALIGNMENT  (512UL * 1024 * 1024)
 #define MC_RAM_BASE_ADDR_ALIGNMENT_MASK        (~(MC_RAM_BASE_ADDR_ALIGNMENT - 1))
@@ -929,6 +931,114 @@ unsigned long mc_get_dram_block_size(void)
        return dram_block_size;
 }
 
+/**
+ * Populate the device tree with MC reserved memory ranges.
+ */
+void fdt_reserve_mc_mem(void *blob, u32 mc_icid)
+{
+       u32 phandle, mc_ph;
+       int noff, ret, i;
+       char mem_name[16];
+       struct fdt_memory mc_mem_ranges[] = {
+               {
+                       .start = 0,
+                       .end = 0
+               },
+               {
+                       .start = CFG_SYS_FSL_MC_BASE,
+                       .end = CFG_SYS_FSL_MC_BASE + CFG_SYS_FSL_MC_SIZE - 1
+               },
+               {
+                       .start = CFG_SYS_FSL_NI_BASE,
+                       .end = CFG_SYS_FSL_NI_BASE + CFG_SYS_FSL_NI_SIZE - 1
+               },
+               {
+                       .start = CFG_SYS_FSL_QBMAN_BASE,
+                       .end = CFG_SYS_FSL_QBMAN_BASE +
+                                       CFG_SYS_FSL_QBMAN_SIZE - 1
+               },
+               {
+                       .start = CFG_SYS_FSL_PEBUF_BASE,
+                       .end = CFG_SYS_FSL_PEBUF_BASE +
+                                       CFG_SYS_FSL_PEBUF_SIZE - 1
+               },
+               {
+                       .start = CFG_SYS_FSL_CCSR_BASE,
+                       .end = CFG_SYS_FSL_CCSR_BASE + CFG_SYS_FSL_CCSR_SIZE - 1
+               }
+       };
+
+       mc_mem_ranges[0].start = gd->arch.resv_ram;
+       mc_mem_ranges[0].end = mc_mem_ranges[0].start +
+                               mc_get_dram_block_size() - 1;
+
+       for (i = 0; i < ARRAY_SIZE(mc_mem_ranges); i++) {
+               noff = fdt_node_offset_by_compatible(blob, -1, "fsl,qoriq-mc");
+               if (noff < 0) {
+                       printf("WARN: failed to get MC node: %d\n", noff);
+                       return;
+               }
+               mc_ph = fdt_get_phandle(blob, noff);
+               if (!mc_ph) {
+                       mc_ph = fdt_create_phandle(blob, noff);
+                       if (!mc_ph) {
+                               printf("WARN: failed to get MC node phandle\n");
+                               return;
+                       }
+               }
+
+               sprintf(mem_name, "mc-mem%d", i);
+               ret = fdtdec_add_reserved_memory(blob, mem_name,
+                                                &mc_mem_ranges[i], NULL, 0,
+                                                &phandle, 0);
+               if (ret < 0) {
+                       printf("ERROR: failed to reserve MC memory: %d\n", ret);
+                       return;
+               }
+
+               noff = fdt_node_offset_by_phandle(blob, phandle);
+               if (noff < 0) {
+                       printf("ERROR: failed get resvmem node offset: %d\n",
+                              noff);
+                       return;
+               }
+               ret = fdt_setprop_u32(blob, noff, "iommu-addresses", mc_ph);
+               if (ret < 0) {
+                       printf("ERROR: failed to set 'iommu-addresses': %d\n",
+                              ret);
+                       return;
+               }
+               ret = fdt_appendprop_u64(blob, noff, "iommu-addresses",
+                                        mc_mem_ranges[i].start);
+               if (ret < 0) {
+                       printf("ERROR: failed to set 'iommu-addresses': %d\n",
+                              ret);
+                       return;
+               }
+               ret = fdt_appendprop_u64(blob, noff, "iommu-addresses",
+                                        mc_mem_ranges[i].end -
+                                               mc_mem_ranges[i].start + 1);
+               if (ret < 0) {
+                       printf("ERROR: failed to set 'iommu-addresses': %d\n",
+                              ret);
+                       return;
+               }
+
+               noff = fdt_node_offset_by_phandle(blob, mc_ph);
+               if (noff < 0) {
+                       printf("ERROR: failed get MC node offset: %d\n", noff);
+                       return;
+               }
+               ret = fdt_appendprop_u32(blob, noff, "memory-region", phandle);
+               if (ret < 0) {
+                       printf("ERROR: failed to set 'memory-region': %d\n",
+                              ret);
+               }
+       }
+
+       fdt_set_iommu_prop(blob, noff, fdt_get_smmu_phandle(blob), &mc_icid, 1);
+}
+
 int fsl_mc_ldpaa_init(struct bd_info *bis)
 {
        int i;
index c701dc1084b9fb9c4fbbf7395e3a8ca1465d0f6a..258738dfc8c263333f890dccde5a5b2b65615503 100644 (file)
@@ -66,6 +66,7 @@ int get_mc_boot_status(void);
 int get_dpl_apply_status(void);
 int is_lazy_dpl_addr_valid(void);
 void fdt_fixup_mc_ddr(u64 *base, u64 *size);
+void fdt_reserve_mc_mem(void *blob, u32 mc_icid);
 #ifdef CFG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET
 int get_aiop_apply_status(void);
 #endif