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.

[FAQ] DRA722: Steps to add QSPI early boot support in vision SDK 3.8 or PSDKLA 6

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