From: Roy Pledge <roy.ple...@freescale.com>

Add support for device tree fixup for the QBMan nodes in ARM platforms

Signed-off-by: Roy Pledge <roy.ple...@freescale.com>
Signed-off-by: Gong Qianyu <qianyu.g...@nxp.com>
---
 arch/arm/cpu/armv8/fsl-layerscape/fdt.c            | 87 ++++++++++++++++++++++
 .../arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c |  3 +
 .../include/asm/arch-fsl-layerscape/immap_lsch2.h  |  2 +
 include/configs/ls1043a_common.h                   |  2 +
 4 files changed, 94 insertions(+)

diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c 
b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
index eafdd71..2a3e621 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
@@ -8,6 +8,8 @@
 #include <libfdt.h>
 #include <fdt_support.h>
 #include <phy.h>
+#include <asm/io.h>
+#include <asm/arch/speed.h>
 #ifdef CONFIG_FSL_LSCH3
 #include <asm/arch/fdt.h>
 #endif
@@ -179,8 +181,86 @@ static void fdt_fixup_smmu(void *blob)
 }
 #endif
 
+#ifdef CONFIG_SYS_DPAA_QBMAN
+#define BMAN_IP_REV_1 0xBF8
+#define BMAN_IP_REV_2 0xBFC
+void fdt_fixup_bportals(void *blob)
+{
+       int off, err;
+       unsigned int maj, min;
+       unsigned int ip_cfg;
+
+       u32 rev_1 = in_be32(CONFIG_SYS_FSL_BMAN_ADDR + BMAN_IP_REV_1);
+       u32 rev_2 = in_be32(CONFIG_SYS_FSL_BMAN_ADDR + BMAN_IP_REV_2);
+       char compat[64];
+       int compat_len;
+
+       maj = (rev_1 >> 8) & 0xff;
+       min = rev_1 & 0xff;
+
+       ip_cfg = rev_2 & 0xff;
+
+       compat_len = sprintf(compat, "fsl,bman-portal-%u.%u.%u",
+                                maj, min, ip_cfg) + 1;
+       compat_len += sprintf(compat + compat_len, "fsl,bman-portal") + 1;
+
+       off = fdt_node_offset_by_compatible(blob, -1, "fsl,bman-portal");
+       while (off != -FDT_ERR_NOTFOUND) {
+               err = fdt_setprop(blob, off, "compatible", compat, compat_len);
+               if (err < 0) {
+                       printf("ERROR: unable to create props for %s: %s\n",
+                              fdt_get_name(blob, off, NULL),
+                                                fdt_strerror(err));
+                       return;
+               }
+
+               off = fdt_node_offset_by_compatible(blob, off,
+                                                   "fsl,bman-portal");
+       }
+}
+
+#define QMAN_IP_REV_1 0xBF8
+#define QMAN_IP_REV_2 0xBFC
+void fdt_fixup_qportals(void *blob)
+{
+       int off, err;
+       unsigned int maj, min;
+       unsigned int ip_cfg;
+       u32 rev_1 = in_be32(CONFIG_SYS_FSL_QMAN_ADDR + QMAN_IP_REV_1);
+       u32 rev_2 = in_be32(CONFIG_SYS_FSL_QMAN_ADDR + QMAN_IP_REV_2);
+       char compat[64];
+       int compat_len;
+
+       maj = (rev_1 >> 8) & 0xff;
+       min = rev_1 & 0xff;
+       ip_cfg = rev_2 & 0xff;
+
+       compat_len = sprintf(compat, "fsl,qman-portal-%u.%u.%u",
+                                       maj, min, ip_cfg) + 1;
+       compat_len += sprintf(compat + compat_len, "fsl,qman-portal") + 1;
+
+       off = fdt_node_offset_by_compatible(blob, -1, "fsl,qman-portal");
+       while (off != -FDT_ERR_NOTFOUND) {
+               err = fdt_setprop(blob, off, "compatible", compat, compat_len);
+               if (err < 0) {
+                       printf("ERROR: unable to create props for %s: %s\n",
+                              fdt_get_name(blob, off, NULL),
+                              fdt_strerror(err));
+                       return;
+               }
+
+               off = fdt_node_offset_by_compatible(blob, off,
+                                                   "fsl,qman-portal");
+       }
+}
+#endif
+
 void ft_cpu_setup(void *blob, bd_t *bd)
 {
+       struct sys_info sysinfo;
+
+       get_sys_info(&sysinfo);
+
 #ifdef CONFIG_MP
        ft_fixup_cpu(blob);
 #endif
@@ -201,4 +281,11 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_LSCH3
        fdt_fixup_smmu(blob);
 #endif
+
+#ifdef CONFIG_SYS_DPAA_QBMAN
+       fdt_fixup_bportals(blob);
+       fdt_fixup_qportals(blob);
+       do_fixup_by_compat_u32(blob, "fsl,qman",
+                              "clock-frequency", sysinfo.freq_qman, 1);
+#endif
 }
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c 
b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
index 6f6a588..99a9c36 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
@@ -117,6 +117,9 @@ void get_sys_info(struct sys_info *sys_info)
 
        sys_info->freq_localbus = sys_info->freq_systembus / ccr;
 #endif
+#ifdef CONFIG_SYS_DPAA_QBMAN
+       sys_info->freq_qman = sys_info->freq_systembus / 2;
+#endif
 }
 
 int get_clocks(void)
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h 
b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
index 21b803f..e3ca7cb 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
@@ -24,6 +24,8 @@
 #define CONFIG_SYS_FSL_RST_ADDR                        (CONFIG_SYS_IMMR + 
0x00ee00b0)
 #define CONFIG_SYS_FSL_SCFG_ADDR               (CONFIG_SYS_IMMR + 0x00570000)
 #define CONFIG_SYS_FSL_FMAN_ADDR               (CONFIG_SYS_IMMR + 0x00a00000)
+#define CONFIG_SYS_FSL_BMAN_ADDR                (CONFIG_SYS_IMMR + 0x00890000)
+#define CONFIG_SYS_FSL_QMAN_ADDR                (CONFIG_SYS_IMMR + 0x00880000)
 #define CONFIG_SYS_FSL_SERDES_ADDR             (CONFIG_SYS_IMMR + 0x00ea0000)
 #define CONFIG_SYS_FSL_DCFG_ADDR               (CONFIG_SYS_IMMR + 0x00ee0000)
 #define CONFIG_SYS_FSL_CLK_ADDR                        (CONFIG_SYS_IMMR + 
0x00ee1000)
diff --git a/include/configs/ls1043a_common.h b/include/configs/ls1043a_common.h
index 677d281..8220f6b 100644
--- a/include/configs/ls1043a_common.h
+++ b/include/configs/ls1043a_common.h
@@ -209,6 +209,8 @@
 #define CONFIG_SYS_FDT_PAD             (0x3000 + CONFIG_SYS_QE_FMAN_FW_LENGTH)
 #endif
 
+#define CONFIG_SYS_DPAA_QBMAN          /* Support Q/Bman */
+
 /* Miscellaneous configurable options */
 #define CONFIG_SYS_LOAD_ADDR   (CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000)
 #define CONFIG_ARCH_EARLY_INIT_R
-- 
2.1.0.27.g96db324

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to