Part Number: DRA722
Hi,
Default only SD boot mode is supported for the early boot use-case, so can I know the changes to add the QSPI early boot ?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Part Number: DRA722
Hi,
Default only SD boot mode is supported for the early boot use-case, so can I know the changes to add the QSPI early boot ?
Hi,
Add the below changes to the u-boot source code for the QSPI early boot support.
diff --git a/common/spl/spl_spi.c b/common/spl/spl_spi.c old mode 100644 new mode 100755 index c826df2591..e73e53fcda --- a/common/spl/spl_spi.c +++ b/common/spl/spl_spi.c @@ -13,9 +13,50 @@ #include <spi_flash.h> #include <errno.h> #include <spl.h> +#include <remoteproc.h> DECLARE_GLOBAL_DATA_PTR; +u32 spl_spi_load_core(struct rproc *cfg_arg) +{ + struct spi_flash *flash; + struct rproc *cfg = cfg_arg; + struct image_header *header; + u32 temp_load_addr, temp_load_size; + + debug("spl: loading remote core image %s\n", cfg->firmware_name); + + flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, + CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, + CONFIG_SF_DEFAULT_MODE); + if (!flash) { + puts("SPI probe failed.\n"); + hang(); + } + + if (cfg->spi_offset == 0) + return 1; + + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); + + spi_flash_read(flash, cfg->spi_offset, + 128, (void *)header); + if (image_get_magic(header) != IH_MAGIC) { + printf("mkimage signature not found\n"); + return 1; + } + + temp_load_addr = (u32)(cfg->load_addr) - sizeof(struct image_header); + + temp_load_size = image_get_data_size(header) + + sizeof(struct image_header); + spi_flash_read(flash, cfg->spi_offset, + temp_load_size, (void *)temp_load_addr); + + return 0; +} + #ifdef CONFIG_SPL_OS_BOOT /* * Load the kernel, check for a valid header we can parse, and if found load diff --git a/drivers/remoteproc/dsp_rproc.c b/drivers/remoteproc/dsp_rproc.c old mode 100644 new mode 100755 index 9e15724371..5a87caa480 --- a/drivers/remoteproc/dsp_rproc.c +++ b/drivers/remoteproc/dsp_rproc.c @@ -562,7 +562,8 @@ struct rproc dsp1_config = { .start_core = dsp_start_core, .config_mmu = dsp_config_mmu, .config_peripherals = dsp1_config_peripherals, - .intmem_to_l3_mapping = &dsp1_intmem_to_l3_mapping + .intmem_to_l3_mapping = &dsp1_intmem_to_l3_mapping, + .spi_offset = CONFIGS_SYS_SPI_DSP1_OFFS }; struct rproc dsp2_config = { @@ -578,7 +579,8 @@ struct rproc dsp2_config = { .start_core = dsp_start_core, .config_mmu = dsp_config_mmu, .config_peripherals = dsp2_config_peripherals, - .intmem_to_l3_mapping = &dsp2_intmem_to_l3_mapping + .intmem_to_l3_mapping = &dsp2_intmem_to_l3_mapping, + .spi_offset = CONFIGS_SYS_SPI_DSP2_OFFS }; struct rproc *dsp_rproc_cfg_arr[RPROC_END_ENUMS] = { @@ -708,6 +710,24 @@ static int dsp_probe(struct udevice *dev) cfg = dsp_rproc_cfg_arr[dsp->id]; loadaddr = cfg->load_addr; + +#ifdef CONFIG_SPL_BUILD + if(BOOT_DEVICE_SPI == spl_boot_device()) + { + ret = spl_spi_load_core(cfg); + if(ret) { + dev_err(dev, "Firmware %s loading is failed\n", cfg->firmware_name); + } + else + { + INIT_LIST_HEAD(&dsp->mappings); + ret = spl_pre_boot_dsp_core(dev, dsp->id); + } + return ret; + } + +#endif + size = load_firmware(cfg->firmware_name, &loadaddr); if (!size) { dev_err(dev, "Firmware loading failed\n"); diff --git a/drivers/remoteproc/ipu_rproc.c b/drivers/remoteproc/ipu_rproc.c index 963897018b..8a174447e4 100644 --- a/drivers/remoteproc/ipu_rproc.c +++ b/drivers/remoteproc/ipu_rproc.c @@ -525,7 +525,8 @@ struct rproc ipu1_config = { .firmware_name = "dra7-ipu1-fw.lzop", .config_mmu = ipu_config_mmu, .config_peripherals = ipu1_config_peripherals, - .intmem_to_l3_mapping = &ipu1_intmem_to_l3_mapping + .intmem_to_l3_mapping = &ipu1_intmem_to_l3_mapping, + .spi_offset = CONFIGS_SYS_SPI_IPU1_OFFS }; struct rproc ipu2_config = { @@ -539,7 +540,8 @@ struct rproc ipu2_config = { .firmware_name = "dra7-ipu2-fw.lzop", .config_mmu = ipu_config_mmu, .config_peripherals = ipu2_config_peripherals, - .intmem_to_l3_mapping = &ipu2_intmem_to_l3_mapping + .intmem_to_l3_mapping = &ipu2_intmem_to_l3_mapping, + .spi_offset = CONFIGS_SYS_SPI_IPU2_OFFS }; struct rproc *rproc_cfg_arr[2] = { @@ -699,12 +701,29 @@ static int ipu_probe(struct udevice *dev) cfg = rproc_cfg_arr[priv->id]; loadaddr = cfg->load_addr; + +#ifdef CONFIG_SPL_BUILD + if(BOOT_DEVICE_SPI == spl_boot_device()) + { + ret = spl_spi_load_core(cfg); + if(ret) { + dev_err(dev, "Firmware %s loading is failed\n", cfg->firmware_name); + } + else + { + INIT_LIST_HEAD(&priv->mappings); + ret = spl_pre_boot_core(dev, priv->id); + } + return ret; + } + +#endif + size = load_firmware(cfg->firmware_name, &loadaddr); if (!size) { dev_err(dev, "Firmware loading failed\n"); return -EINVAL; } - INIT_LIST_HEAD(&priv->mappings); ret = spl_pre_boot_core(dev, priv->id); diff --git a/include/configs/dra7xx_evm.h b/include/configs/dra7xx_evm.h index 51dcae3d29..8ac8b312b9 100644 --- a/include/configs/dra7xx_evm.h +++ b/include/configs/dra7xx_evm.h @@ -85,6 +85,28 @@ #define CONFIG_SYS_SPI_KERNEL_OFFS 0x1E0000 #define CONFIG_SYS_SPI_ARGS_OFFS 0x140000 #define CONFIG_SYS_SPI_ARGS_SIZE 0x80000 + +#define CONFIGS_SYS_SPI_KERNEL_SIZE 0x800000 +#define CONFIGS_SYS_SPI_LOGO_OFFS (CONFIGS_SYS_SPI_KERNEL_SIZE +\ + (0x1E0000)) +#define CONFIGS_SYS_SPI_LOGO_SIZE 0x80000 +#define CONFIGS_SYS_SPI_RPROC_BIN_OFFS (CONFIGS_SYS_SPI_LOGO_OFFS +\ + CONFIGS_SYS_SPI_LOGO_SIZE) + +#define CONFIGS_SYS_SPI_RPROC_BIN_SIZE 0x1000000 +#define CONFIGS_SYS_SPI_IPU1_BIN_SIZE 0x400000 +#define CONFIGS_SYS_SPI_IPU2_BIN_SIZE 0x400000 +#define CONFIGS_SYS_SPI_DSP1_BIN_SIZE 0x400000 +#define CONFIGS_SYS_SPI_DSP2_BIN_SIZE 0x400000 +#define CONFIGS_SYS_SPI_IPU1_OFFS (CONFIGS_SYS_SPI_RPROC_BIN_OFFS) +#define CONFIGS_SYS_SPI_IPU2_OFFS (CONFIGS_SYS_SPI_IPU1_OFFS +\ + CONFIGS_SYS_SPI_IPU1_BIN_SIZE) +#define CONFIGS_SYS_SPI_DSP1_OFFS (CONFIGS_SYS_SPI_IPU2_OFFS +\ + CONFIGS_SYS_SPI_IPU2_BIN_SIZE) +#define CONFIGS_SYS_SPI_DSP2_OFFS (CONFIGS_SYS_SPI_DSP1_OFFS +\ + CONFIGS_SYS_SPI_DSP1_BIN_SIZE) + + #if defined(CONFIG_QSPI_BOOT) #define CONFIG_SYS_REDUNDAND_ENVIRONMENT #define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED diff --git a/include/remoteproc.h b/include/remoteproc.h old mode 100644 new mode 100755 index 4193618d5f..d7a7649c86 --- a/include/remoteproc.h +++ b/include/remoteproc.h @@ -415,6 +415,7 @@ struct rproc { struct rproc_intmem_to_l3_mapping *intmem_to_l3_mapping; u32 trace_pa; u32 trace_len; + u32 spi_offset; }; extern struct rproc *rproc_cfg_arr[2]; diff --git a/include/spl.h b/include/spl.h index fcbb6035fe..faaef30fdf 100644 --- a/include/spl.h +++ b/include/spl.h @@ -12,6 +12,7 @@ #include <linux/compiler.h> #include <asm/spl.h> #include <handoff.h> +#include <remoteproc.h> /* Value in r0 indicates we booted from U-Boot */ #define UBOOT_NOT_LOADED_FROM_SPL 0x13578642 @@ -399,6 +400,8 @@ int spl_spi_load(struct spl_image_info *spl_image, unsigned int offs_override, void *buffer); +u32 spl_spi_load_core(struct rproc *cfg_arg); + /** * spl_invoke_atf - boot using an ARM trusted firmware image */
Refer the below thread as a reference for flashing the images to the QSPI memory.
Thanks
Gaviraju