From: Chaitanya Sakinam <chaitanya.saki...@nxp.com>

Read Linux PPFE firmware from flash partition and pass it to Linux through
FDT entry. So that we can avoid placing PPFE firmware in Linux rootfs.
(FDT may increase at max by 64KB)

Signed-off-by: Chaitanya Sakinam <chaitanya.saki...@nxp.com>
Signed-off-by: Anji J <anji.jagarlm...@nxp.com>
Signed-off-by: Biwen Li <biwen...@nxp.com>
---
Change in v2:
        - update subject and description

 arch/arm/cpu/armv8/fsl-layerscape/fdt.c |  3 ++
 drivers/net/pfe_eth/pfe_firmware.c      | 58 ++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c 
b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
index 7f29aa4725..16a252ecbe 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
@@ -534,6 +534,9 @@ void ft_cpu_setup(void *blob, struct bd_info *bd)
 #ifdef CONFIG_SYS_DPAA_FMAN
        fdt_fixup_fman_firmware(blob);
 #endif
+#ifdef CONFIG_FSL_PFE
+       fdt_fixup_pfe_firmware(blob);
+#endif
 #ifndef CONFIG_ARCH_LS1012A
        fsl_fdt_disable_usb(blob);
 #endif
diff --git a/drivers/net/pfe_eth/pfe_firmware.c 
b/drivers/net/pfe_eth/pfe_firmware.c
index eee70a2e73..f8534e50f9 100644
--- a/drivers/net/pfe_eth/pfe_firmware.c
+++ b/drivers/net/pfe_eth/pfe_firmware.c
@@ -262,7 +262,8 @@ int pfe_firmware_init(void)
        uintptr_t pfe_img_addr = 0;
 #endif
        int ret = 0;
-       int fw_count;
+       int fw_count, max_fw_count;
+       const char *p;
 
        ret = pfe_spi_flash_init();
        if (ret)
@@ -293,6 +294,61 @@ int pfe_firmware_init(void)
        }
 #endif
 
+       p = env_get("load_util");
+       if (!p) {
+               max_fw_count = 2;
+       } else {
+               max_fw_count = simple_strtoul(p, NULL, 10);
+               if (max_fw_count)
+                       max_fw_count = 3;
+               else
+                       max_fw_count = 2;
+       }
+
+       for (fw_count = 0; fw_count < max_fw_count; fw_count++) {
+               switch (fw_count) {
+               case 0:
+                       pfe_firmware_name = "class_slowpath";
+                       break;
+               case 1:
+                       pfe_firmware_name = "tmu_slowpath";
+                       break;
+               case 2:
+                       pfe_firmware_name = "util_slowpath";
+                       break;
+               }
+
+               if (pfe_get_fw(&raw_image_addr, &raw_image_size,
+                              pfe_firmware_name)) {
+                       printf("%s firmware couldn't be found in FIT image\n",
+                              pfe_firmware_name);
+                       break;
+               }
+               pfe_firmware = malloc(raw_image_size);
+               if (!pfe_firmware)
+                       return -ENOMEM;
+               memcpy((void *)pfe_firmware, (void *)raw_image_addr,
+                      raw_image_size);
+
+               switch (fw_count) {
+               case 0:
+                       env_set_addr("class_elf_firmware", pfe_firmware);
+                       env_set_addr("class_elf_size", (void *)raw_image_size);
+                       break;
+               case 1:
+                       env_set_addr("tmu_elf_firmware", pfe_firmware);
+                       env_set_addr("tmu_elf_size", (void *)raw_image_size);
+                       break;
+               case 2:
+                       env_set_addr("util_elf_firmware", pfe_firmware);
+                       env_set_addr("util_elf_size", (void *)raw_image_size);
+                       break;
+               }
+       }
+
+       raw_image_addr = NULL;
+       pfe_firmware = NULL;
+       raw_image_size = 0;
        for (fw_count = 0; fw_count < 2; fw_count++) {
                if (fw_count == 0)
                        pfe_firmware_name = "class";
-- 
2.17.1

Reply via email to