|
@@ -10,6 +10,8 @@
|
|
|
* files.
|
|
|
*/
|
|
|
|
|
|
+#include <dm.h>
|
|
|
+#include <dm/device-internal.h>
|
|
|
#include <image.h>
|
|
|
#include <log.h>
|
|
|
#include <malloc.h>
|
|
@@ -24,6 +26,9 @@
|
|
|
#define PFE_FIRMWARE_FIT_CNF_NAME "config@1"
|
|
|
|
|
|
static const void *pfe_fit_addr;
|
|
|
+#ifdef CONFIG_CHAIN_OF_TRUST
|
|
|
+static const void *pfe_esbc_hdr_addr;
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
|
* PFE elf firmware loader.
|
|
@@ -169,7 +174,7 @@ int pfe_spi_flash_init(void)
|
|
|
struct spi_flash *pfe_flash;
|
|
|
struct udevice *new;
|
|
|
int ret = 0;
|
|
|
- void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
|
|
|
+ void *addr = malloc(CONFIG_SYS_LS_PFE_FW_LENGTH);
|
|
|
|
|
|
if (!addr)
|
|
|
return -ENOMEM;
|
|
@@ -179,21 +184,56 @@ int pfe_spi_flash_init(void)
|
|
|
CONFIG_ENV_SPI_MAX_HZ,
|
|
|
CONFIG_ENV_SPI_MODE,
|
|
|
&new);
|
|
|
+ if (ret) {
|
|
|
+ printf("SF: failed to probe spi\n");
|
|
|
+ free(addr);
|
|
|
+ device_remove(new, DM_REMOVE_NORMAL);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
pfe_flash = dev_get_uclass_priv(new);
|
|
|
if (!pfe_flash) {
|
|
|
printf("SF: probe for pfe failed\n");
|
|
|
free(addr);
|
|
|
+ device_remove(new, DM_REMOVE_NORMAL);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
ret = spi_flash_read(pfe_flash,
|
|
|
CONFIG_SYS_LS_PFE_FW_ADDR,
|
|
|
- CONFIG_SYS_QE_FMAN_FW_LENGTH,
|
|
|
+ CONFIG_SYS_LS_PFE_FW_LENGTH,
|
|
|
addr);
|
|
|
- if (ret)
|
|
|
+ if (ret) {
|
|
|
printf("SF: read for pfe failed\n");
|
|
|
+ free(addr);
|
|
|
+ spi_flash_free(pfe_flash);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
+#ifdef CONFIG_CHAIN_OF_TRUST
|
|
|
+ void *hdr_addr = malloc(CONFIG_SYS_LS_PFE_ESBC_LENGTH);
|
|
|
+
|
|
|
+ if (!hdr_addr) {
|
|
|
+ free(addr);
|
|
|
+ spi_flash_free(pfe_flash);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = spi_flash_read(pfe_flash,
|
|
|
+ CONFIG_SYS_LS_PFE_ESBC_ADDR,
|
|
|
+ CONFIG_SYS_LS_PFE_ESBC_LENGTH,
|
|
|
+ hdr_addr);
|
|
|
+ if (ret) {
|
|
|
+ printf("SF: failed to read pfe esbc header\n");
|
|
|
+ free(addr);
|
|
|
+ free(hdr_addr);
|
|
|
+ spi_flash_free(pfe_flash);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ pfe_esbc_hdr_addr = hdr_addr;
|
|
|
+#endif
|
|
|
pfe_fit_addr = addr;
|
|
|
spi_flash_free(pfe_flash);
|
|
|
|
|
@@ -233,7 +273,7 @@ int pfe_firmware_init(void)
|
|
|
goto err;
|
|
|
|
|
|
#ifdef CONFIG_CHAIN_OF_TRUST
|
|
|
- pfe_esbc_hdr = CONFIG_SYS_LS_PFE_ESBC_ADDR;
|
|
|
+ pfe_esbc_hdr = (uintptr_t)pfe_esbc_hdr_addr;
|
|
|
pfe_img_addr = (uintptr_t)pfe_fit_addr;
|
|
|
if (fsl_check_boot_mode_secure() != 0) {
|
|
|
/*
|