Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / arch / powerpc / cpu / mpc85xx / fdt.c
index d4c3d9df9b8fe314fe17d97ef51d6371aaf2d09b..55f191f202f9a87f413e82618d95844485006a7d 100644 (file)
@@ -1,24 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2007-2011 Freescale Semiconductor, Inc.
  *
  * (C) Copyright 2000
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
-#include <libfdt.h>
+#include <clock_legacy.h>
+#include <env.h>
+#include <log.h>
+#include <time.h>
+#include <linux/libfdt.h>
 #include <fdt_support.h>
 #include <asm/processor.h>
 #include <linux/ctype.h>
 #include <asm/io.h>
+#include <asm/fsl_fdt.h>
 #include <asm/fsl_portals.h>
+#include <fsl_qbman.h>
 #include <hwconfig.h>
 #ifdef CONFIG_FSL_ESDHC
 #include <fsl_esdhc.h>
 #endif
-#include "../../../../drivers/qe/qe.h"         /* For struct qe_firmware */
+#ifdef CONFIG_SYS_DPAA_FMAN
+#include <fsl_fman.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -89,7 +96,7 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)
         * Extract hwconfig from environment.
         * Search for tdm entry in hwconfig.
         */
-       ret = getenv_f("hwconfig", buffer, sizeof(buffer));
+       ret = env_get_f("hwconfig", buffer, sizeof(buffer));
        if (ret > 0)
                tdm_hwconfig_enabled = hwconfig_f("tdm", buffer);
 
@@ -177,6 +184,39 @@ static inline void ft_fixup_l3cache(void *blob, int off)
 #define ft_fixup_l3cache(x, y)
 #endif
 
+#if defined(CONFIG_L2_CACHE) || \
+       defined(CONFIG_BACKSIDE_L2_CACHE) || \
+       defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2)
+static inline void ft_fixup_l2cache_compatible(void *blob, int off)
+{
+       int len;
+       struct cpu_type *cpu = identify_cpu(SVR_SOC_VER(get_svr()));
+
+       if (cpu) {
+               char buf[40];
+
+               if (isdigit(cpu->name[0])) {
+                       /* MPCxxxx, where xxxx == 4-digit number */
+                       len = sprintf(buf, "fsl,mpc%s-l2-cache-controller",
+                               cpu->name) + 1;
+               } else {
+                       /* Pxxxx or Txxxx, where xxxx == 4-digit number */
+                       len = sprintf(buf, "fsl,%c%s-l2-cache-controller",
+                       tolower(cpu->name[0]), cpu->name + 1) + 1;
+               }
+
+               /*
+                * append "cache" after the NULL character that the previous
+                * sprintf wrote.  This is how a device tree stores multiple
+                * strings in a property.
+                */
+               len += sprintf(buf + len, "cache") + 1;
+
+               fdt_setprop(blob, off, "compatible", buf, len);
+       }
+}
+#endif
+
 #if defined(CONFIG_L2_CACHE)
 /* return size in kilobytes */
 static inline u32 l2cache_size(void)
@@ -212,9 +252,8 @@ static inline u32 l2cache_size(void)
 
 static inline void ft_fixup_l2cache(void *blob)
 {
-       int len, off;
+       int off;
        u32 *ph;
-       struct cpu_type *cpu = identify_cpu(SVR_SOC_VER(get_svr()));
 
        const u32 line_size = 32;
        const u32 num_ways = 8;
@@ -240,28 +279,7 @@ static inline void ft_fixup_l2cache(void *blob)
                return ;
        }
 
-       if (cpu) {
-               char buf[40];
-
-               if (isdigit(cpu->name[0])) {
-                       /* MPCxxxx, where xxxx == 4-digit number */
-                       len = sprintf(buf, "fsl,mpc%s-l2-cache-controller",
-                               cpu->name) + 1;
-               } else {
-                       /* Pxxxx or Txxxx, where xxxx == 4-digit number */
-                       len = sprintf(buf, "fsl,%c%s-l2-cache-controller",
-                               tolower(cpu->name[0]), cpu->name + 1) + 1;
-               }
-
-               /*
-                * append "cache" after the NULL character that the previous
-                * sprintf wrote.  This is how a device tree stores multiple
-                * strings in a property.
-                */
-               len += sprintf(buf + len, "cache") + 1;
-
-               fdt_setprop(blob, off, "compatible", buf, len);
-       }
+       ft_fixup_l2cache_compatible(blob, off);
        fdt_setprop(blob, off, "cache-unified", NULL, 0);
        fdt_setprop_cell(blob, off, "cache-block-size", line_size);
        fdt_setprop_cell(blob, off, "cache-size", size);
@@ -334,7 +352,7 @@ static inline void ft_fixup_l2cache(void *blob)
                        fdt_setprop_cell(blob, l2_off, "cache-size", size);
                        fdt_setprop_cell(blob, l2_off, "cache-sets", num_sets);
                        fdt_setprop_cell(blob, l2_off, "cache-level", 2);
-                       fdt_setprop(blob, l2_off, "compatible", "cache", 6);
+                       ft_fixup_l2cache_compatible(blob, l2_off);
                }
 
                if (l3_off < 0) {
@@ -487,126 +505,7 @@ static void ft_fixup_qe_snum(void *blob)
 }
 #endif
 
-/**
- * fdt_fixup_fman_firmware -- insert the Fman firmware into the device tree
- *
- * The binding for an Fman firmware node is documented in
- * Documentation/powerpc/dts-bindings/fsl/dpaa/fman.txt.  This node contains
- * the actual Fman firmware binary data.  The operating system is expected to
- * be able to parse the binary data to determine any attributes it needs.
- */
-#ifdef CONFIG_SYS_DPAA_FMAN
-void fdt_fixup_fman_firmware(void *blob)
-{
-       int rc, fmnode, fwnode = -1;
-       uint32_t phandle;
-       struct qe_firmware *fmanfw;
-       const struct qe_header *hdr;
-       unsigned int length;
-       uint32_t crc;
-       const char *p;
-
-       /* The first Fman we find will contain the actual firmware. */
-       fmnode = fdt_node_offset_by_compatible(blob, -1, "fsl,fman");
-       if (fmnode < 0)
-               /* Exit silently if there are no Fman devices */
-               return;
-
-       /* If we already have a firmware node, then also exit silently. */
-       if (fdt_node_offset_by_compatible(blob, -1, "fsl,fman-firmware") > 0)
-               return;
-
-       /* If the environment variable is not set, then exit silently */
-       p = getenv("fman_ucode");
-       if (!p)
-               return;
-
-       fmanfw = (struct qe_firmware *) simple_strtoul(p, NULL, 16);
-       if (!fmanfw)
-               return;
-
-       hdr = &fmanfw->header;
-       length = be32_to_cpu(hdr->length);
-
-       /* Verify the firmware. */
-       if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
-               (hdr->magic[2] != 'F')) {
-               printf("Data at %p is not an Fman firmware\n", fmanfw);
-               return;
-       }
-
-       if (length > CONFIG_SYS_QE_FMAN_FW_LENGTH) {
-               printf("Fman firmware at %p is too large (size=%u)\n",
-                      fmanfw, length);
-               return;
-       }
-
-       length -= sizeof(u32);  /* Subtract the size of the CRC */
-       crc = be32_to_cpu(*(u32 *)((void *)fmanfw + length));
-       if (crc != crc32_no_comp(0, (void *)fmanfw, length)) {
-               printf("Fman firmware at %p has invalid CRC\n", fmanfw);
-               return;
-       }
-
-       /* Increase the size of the fdt to make room for the node. */
-       rc = fdt_increase_size(blob, fmanfw->header.length);
-       if (rc < 0) {
-               printf("Unable to make room for Fman firmware: %s\n",
-                       fdt_strerror(rc));
-               return;
-       }
-
-       /* Create the firmware node. */
-       fwnode = fdt_add_subnode(blob, fmnode, "fman-firmware");
-       if (fwnode < 0) {
-               char s[64];
-               fdt_get_path(blob, fmnode, s, sizeof(s));
-               printf("Could not add firmware node to %s: %s\n", s,
-                      fdt_strerror(fwnode));
-               return;
-       }
-       rc = fdt_setprop_string(blob, fwnode, "compatible", "fsl,fman-firmware");
-       if (rc < 0) {
-               char s[64];
-               fdt_get_path(blob, fwnode, s, sizeof(s));
-               printf("Could not add compatible property to node %s: %s\n", s,
-                      fdt_strerror(rc));
-               return;
-       }
-       phandle = fdt_create_phandle(blob, fwnode);
-       if (!phandle) {
-               char s[64];
-               fdt_get_path(blob, fwnode, s, sizeof(s));
-               printf("Could not add phandle property to node %s: %s\n", s,
-                      fdt_strerror(rc));
-               return;
-       }
-       rc = fdt_setprop(blob, fwnode, "fsl,firmware", fmanfw, fmanfw->header.length);
-       if (rc < 0) {
-               char s[64];
-               fdt_get_path(blob, fwnode, s, sizeof(s));
-               printf("Could not add firmware property to node %s: %s\n", s,
-                      fdt_strerror(rc));
-               return;
-       }
-
-       /* Find all other Fman nodes and point them to the firmware node. */
-       while ((fmnode = fdt_node_offset_by_compatible(blob, fmnode, "fsl,fman")) > 0) {
-               rc = fdt_setprop_cell(blob, fmnode, "fsl,firmware-phandle", phandle);
-               if (rc < 0) {
-                       char s[64];
-                       fdt_get_path(blob, fmnode, s, sizeof(s));
-                       printf("Could not add pointer property to node %s: %s\n",
-                              s, fdt_strerror(rc));
-                       return;
-               }
-       }
-}
-#else
-#define fdt_fixup_fman_firmware(x)
-#endif
-
-#if defined(CONFIG_PPC_P4080)
+#if defined(CONFIG_ARCH_P4080)
 static void fdt_fixup_usb(void *fdt)
 {
        ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
@@ -627,8 +526,8 @@ static void fdt_fixup_usb(void *fdt)
 #define fdt_fixup_usb(x)
 #endif
 
-#if defined(CONFIG_PPC_T2080) || defined(CONFIG_PPC_T4240) || \
-       defined(CONFIG_PPC_T4160) || defined(CONFIG_PPC_T4080)
+#if defined(CONFIG_ARCH_T2080) || defined(CONFIG_ARCH_T4240) || \
+       defined(CONFIG_ARCH_T4160)
 void fdt_fixup_dma3(void *blob)
 {
        /* the 3rd DMA is not functional if SRIO2 is chosen */
@@ -636,7 +535,7 @@ void fdt_fixup_dma3(void *blob)
        ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 
 #define CONFIG_SYS_ELO3_DMA3 (0xffe000000 + 0x102300)
-#if defined(CONFIG_PPC_T2080)
+#if defined(CONFIG_ARCH_T2080)
        u32 srds_prtcl_s2 = in_be32(&gur->rcwsr[4]) &
                                    FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
        srds_prtcl_s2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
@@ -645,8 +544,7 @@ void fdt_fixup_dma3(void *blob)
        case 0x29:
        case 0x2d:
        case 0x2e:
-#elif defined(CONFIG_PPC_T4240) || defined(CONFIG_PPC_T4160) || \
-       defined(CONFIG_PPC_T4080)
+#elif defined(CONFIG_ARCH_T4240) || defined(CONFIG_ARCH_T4160)
        u32 srds_prtcl_s4 = in_be32(&gur->rcwsr[4]) &
                                    FSL_CORENET2_RCWSR4_SRDS4_PRTCL;
        srds_prtcl_s4 >>= FSL_CORENET2_RCWSR4_SRDS4_PRTCL_SHIFT;
@@ -672,7 +570,7 @@ void fdt_fixup_dma3(void *blob)
 #define fdt_fixup_dma3(x)
 #endif
 
-#if defined(CONFIG_PPC_T1040)
+#if defined(CONFIG_ARCH_T1040)
 static void fdt_fixup_l2_switch(void *blob)
 {
        uchar l2swaddr[6];
@@ -686,7 +584,7 @@ static void fdt_fixup_l2_switch(void *blob)
                return;
 
        /* Get MAC address for the l2switch from "l2switchaddr"*/
-       if (!eth_getenv_enetaddr("l2switchaddr", l2swaddr)) {
+       if (!eth_env_get_enetaddr("l2switchaddr", l2swaddr)) {
                printf("Warning: MAC address for l2switch not found\n");
                memset(l2swaddr, 0, sizeof(l2swaddr));
        }
@@ -718,8 +616,6 @@ void ft_cpu_setup(void *blob, bd_t *bd)
        }
 #endif
 
-       fdt_fixup_ethernet(blob);
-
        fdt_add_enet_stashing(blob);
 
 #ifndef CONFIG_FSL_TBCLK_EXTRA_DIV
@@ -742,16 +638,14 @@ void ft_cpu_setup(void *blob, bd_t *bd)
        do_fixup_by_prop_u32(blob, "device_type", "soc", 4,
                "bus-frequency", bd->bi_busfreq, 1);
 
-       do_fixup_by_compat_u32(blob, "fsl,pq3-localbus",
-               "bus-frequency", gd->arch.lbc_clk, 1);
-       do_fixup_by_compat_u32(blob, "fsl,elbc",
-               "bus-frequency", gd->arch.lbc_clk, 1);
 #ifdef CONFIG_QE
        ft_qe_setup(blob);
        ft_fixup_qe_snum(blob);
 #endif
 
+#ifdef CONFIG_SYS_DPAA_FMAN
        fdt_fixup_fman_firmware(blob);
+#endif
 
 #ifdef CONFIG_SYS_NS16550
        do_fixup_by_compat_u32(blob, "ns16550",
@@ -880,8 +774,15 @@ int ft_verify_fdt(void *fdt)
 
        /* First check the CCSR base address */
        off = fdt_node_offset_by_prop_value(fdt, -1, "device_type", "soc", 4);
-       if (off > 0)
-               addr = fdt_get_base_address(fdt, off);
+       if (off > 0) {
+               int size;
+               u32 naddr;
+               const fdt32_t *prop;
+
+               naddr = fdt_address_cells(fdt, off);
+               prop = fdt_getprop(fdt, off, "ranges", &size);
+               addr = fdt_translate_address(fdt, off, prop + naddr);
+       }
 
        if (!addr) {
                printf("Warning: could not determine base CCSR address in "
@@ -943,3 +844,13 @@ int ft_verify_fdt(void *fdt)
 
        return 1;
 }
+
+void fdt_del_diu(void *blob)
+{
+       int nodeoff = 0;
+
+       while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
+                               "fsl,diu")) >= 0) {
+               fdt_del_node(blob, nodeoff);
+       }
+}