global: Move remaining CONFIG_SYS_SDRAM_* to CFG_SYS_SDRAM_*
[platform/kernel/u-boot.git] / boot / image-board.c
index 0d2e0fc..8813be5 100644 (file)
 #include <common.h>
 #include <bootstage.h>
 #include <cpu_func.h>
+#include <display_options.h>
 #include <env.h>
 #include <fpga.h>
 #include <image.h>
 #include <init.h>
+#include <log.h>
 #include <mapmem.h>
 #include <rtc.h>
 #include <watchdog.h>
 #include <asm/cache.h>
 #include <asm/global_data.h>
 
-#ifndef CONFIG_SYS_BARGSIZE
-#define CONFIG_SYS_BARGSIZE 512
-#endif
-
 DECLARE_GLOBAL_DATA_PTR;
 
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
 /**
  * image_get_ramdisk - get and verify ramdisk image
  * @rd_addr: ramdisk image start address
@@ -43,10 +40,10 @@ DECLARE_GLOBAL_DATA_PTR;
  *     pointer to a ramdisk image header, if image was found and valid
  *     otherwise, return NULL
  */
-static const image_header_t *image_get_ramdisk(ulong rd_addr, u8 arch,
-                                              int verify)
+static const struct legacy_img_hdr *image_get_ramdisk(ulong rd_addr, u8 arch,
+                                                     int verify)
 {
-       const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
+       const struct legacy_img_hdr *rd_hdr = (const struct legacy_img_hdr *)rd_addr;
 
        if (!image_check_magic(rd_hdr)) {
                puts("Bad Magic Number\n");
@@ -86,7 +83,6 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, u8 arch,
 
        return rd_hdr;
 }
-#endif
 
 /*****************************************************************************/
 /* Shared dual-format routines */
@@ -120,8 +116,8 @@ ulong env_get_bootm_low(void)
                return tmp;
        }
 
-#if defined(CONFIG_SYS_SDRAM_BASE)
-       return CONFIG_SYS_SDRAM_BASE;
+#if defined(CFG_SYS_SDRAM_BASE)
+       return CFG_SYS_SDRAM_BASE;
 #elif defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE) || defined(CONFIG_RISCV)
        return gd->bd->bi_dram[0].start;
 #else
@@ -177,29 +173,29 @@ void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
        if (to == from)
                return;
 
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
-       if (to > from) {
-               from += len;
-               to += len;
-       }
-       while (len > 0) {
-               size_t tail = (len > chunksz) ? chunksz : len;
-
-               WATCHDOG_RESET();
+       if (IS_ENABLED(CONFIG_HW_WATCHDOG) || IS_ENABLED(CONFIG_WATCHDOG)) {
                if (to > from) {
-                       to -= tail;
-                       from -= tail;
+                       from += len;
+                       to += len;
                }
-               memmove(to, from, tail);
-               if (to < from) {
-                       to += tail;
-                       from += tail;
+               while (len > 0) {
+                       size_t tail = (len > chunksz) ? chunksz : len;
+
+                       schedule();
+                       if (to > from) {
+                               to -= tail;
+                               from -= tail;
+                       }
+                       memmove(to, from, tail);
+                       if (to < from) {
+                               to += tail;
+                               from += tail;
+                       }
+                       len -= tail;
                }
-               len -= tail;
+       } else {
+               memmove(to, from, len);
        }
-#else  /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
-       memmove(to, from, len);
-#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
 }
 
 /**
@@ -277,9 +273,9 @@ ulong genimg_get_kernel_addr(char * const img_addr)
 int genimg_get_format(const void *img_addr)
 {
        if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
-               const image_header_t *hdr;
+               const struct legacy_img_hdr *hdr;
 
-               hdr = (const image_header_t *)img_addr;
+               hdr = (const struct legacy_img_hdr *)img_addr;
                if (image_check_magic(hdr))
                        return IMAGE_FORMAT_LEGACY;
        }
@@ -305,7 +301,7 @@ int genimg_get_format(const void *img_addr)
  *     0, no FIT support or no configuration found
  *     1, configuration found
  */
-int genimg_has_config(bootm_headers_t *images)
+int genimg_has_config(struct bootm_headers *images)
 {
        if (CONFIG_IS_ENABLED(FIT) && images->fit_uname_cfg)
                return 1;
@@ -317,23 +313,27 @@ int genimg_has_config(bootm_headers_t *images)
  * select_ramdisk() - Select and locate the ramdisk to use
  *
  * @images: pointer to the bootm images structure
- * @select: name of ramdisk to select, or NULL for any
+ * @select: name of ramdisk to select, or hex address, NULL for any
  * @arch: expected ramdisk architecture
  * @rd_datap: pointer to a ulong variable, will hold ramdisk pointer
  * @rd_lenp: pointer to a ulong variable, will hold ramdisk length
  * Return: 0 if OK, -ENOPKG if no ramdisk (but an error should not be reported),
  *     other -ve value on other error
  */
-static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
+static int select_ramdisk(struct bootm_headers *images, const char *select, u8 arch,
                          ulong *rd_datap, ulong *rd_lenp)
 {
+       const char *fit_uname_config;
+       const char *fit_uname_ramdisk;
+       bool done_select = !select;
+       bool done = false;
+       int rd_noffset;
        ulong rd_addr;
        char *buf;
 
-#if CONFIG_IS_ENABLED(FIT)
-               const char *fit_uname_config = images->fit_uname_cfg;
-               const char *fit_uname_ramdisk = NULL;
-               int rd_noffset;
+       if (CONFIG_IS_ENABLED(FIT)) {
+               fit_uname_config = images->fit_uname_cfg;
+               fit_uname_ramdisk = NULL;
 
                if (select) {
                        ulong default_addr;
@@ -348,49 +348,48 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
                        else
                                default_addr = image_load_addr;
 
-                       if (fit_parse_conf(select, default_addr,
-                                          &rd_addr, &fit_uname_config)) {
+                       if (fit_parse_conf(select, default_addr, &rd_addr,
+                                          &fit_uname_config)) {
                                debug("*  ramdisk: config '%s' from image at 0x%08lx\n",
                                      fit_uname_config, rd_addr);
+                               done_select = true;
                        } else if (fit_parse_subimage(select, default_addr,
                                                      &rd_addr,
                                                      &fit_uname_ramdisk)) {
                                debug("*  ramdisk: subimage '%s' from image at 0x%08lx\n",
                                      fit_uname_ramdisk, rd_addr);
-                       } else
-#endif
-                       {
-                               rd_addr = hextoul(select, NULL);
-                               debug("*  ramdisk: cmdline image address = 0x%08lx\n",
-                                     rd_addr);
+                               done_select = true;
                        }
-#if CONFIG_IS_ENABLED(FIT)
-               } else {
-                       /* use FIT configuration provided in first bootm
-                        * command argument. If the property is not defined,
-                        * quit silently (with -ENOPKG)
-                        */
-                       rd_addr = map_to_sysmem(images->fit_hdr_os);
-                       rd_noffset = fit_get_node_from_config(images,
-                                                             FIT_RAMDISK_PROP,
-                                                             rd_addr);
-                       if (rd_noffset == -ENOENT)
-                               return -ENOPKG;
-                       else if (rd_noffset < 0)
-                               return rd_noffset;
                }
-#endif
-
-               /*
-                * Check if there is an initrd image at the
-                * address provided in the second bootm argument
-                * check image type, for FIT images get FIT node.
+       }
+       if (!done_select) {
+               rd_addr = hextoul(select, NULL);
+               debug("*  ramdisk: cmdline image address = 0x%08lx\n", rd_addr);
+       }
+       if (CONFIG_IS_ENABLED(FIT) && !select) {
+               /* use FIT configuration provided in first bootm
+                * command argument. If the property is not defined,
+                * quit silently (with -ENOPKG)
                 */
-               buf = map_sysmem(rd_addr, 0);
-               switch (genimg_get_format(buf)) {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-               case IMAGE_FORMAT_LEGACY: {
-                       const image_header_t *rd_hdr;
+               rd_addr = map_to_sysmem(images->fit_hdr_os);
+               rd_noffset = fit_get_node_from_config(images, FIT_RAMDISK_PROP,
+                                                     rd_addr);
+               if (rd_noffset == -ENOENT)
+                       return -ENOPKG;
+               else if (rd_noffset < 0)
+                       return rd_noffset;
+       }
+
+       /*
+        * Check if there is an initrd image at the
+        * address provided in the second bootm argument
+        * check image type, for FIT images get FIT node.
+        */
+       buf = map_sysmem(rd_addr, 0);
+       switch (genimg_get_format(buf)) {
+       case IMAGE_FORMAT_LEGACY:
+               if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
+                       const struct legacy_img_hdr *rd_hdr;
 
                        printf("## Loading init Ramdisk from Legacy Image at %08lx ...\n",
                               rd_addr);
@@ -404,15 +403,15 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
 
                        *rd_datap = image_get_data(rd_hdr);
                        *rd_lenp = image_get_data_size(rd_hdr);
-                       break;
+                       done = true;
                }
-#endif
-#if CONFIG_IS_ENABLED(FIT)
-               case IMAGE_FORMAT_FIT:
-                       rd_noffset = fit_image_load(images,
-                                                   rd_addr, &fit_uname_ramdisk,
-                                                   &fit_uname_config, arch,
-                                                   IH_TYPE_RAMDISK,
+               break;
+       case IMAGE_FORMAT_FIT:
+               if (CONFIG_IS_ENABLED(FIT)) {
+                       rd_noffset = fit_image_load(images, rd_addr,
+                                                   &fit_uname_ramdisk,
+                                                   &fit_uname_config,
+                                                   arch, IH_TYPE_RAMDISK,
                                                    BOOTSTAGE_ID_FIT_RD_START,
                                                    FIT_LOAD_OPTIONAL_NON_ZERO,
                                                    rd_datap, rd_lenp);
@@ -422,29 +421,41 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
                        images->fit_hdr_rd = map_sysmem(rd_addr, 0);
                        images->fit_uname_rd = fit_uname_ramdisk;
                        images->fit_noffset_rd = rd_noffset;
-                       break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-               case IMAGE_FORMAT_ANDROID:
-                       android_image_get_ramdisk((void *)images->os.start,
-                                                 rd_datap, rd_lenp);
-                       break;
-#endif
-               default:
-                       if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
-                               char *end = NULL;
-
-                               if (select)
-                                       end = strchr(select, ':');
-                               if (end) {
-                                       *rd_lenp = hextoul(++end, NULL);
-                                       *rd_datap = rd_addr;
-                                       break;
-                               }
+                       done = true;
+               }
+               break;
+       case IMAGE_FORMAT_ANDROID:
+               if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
+                       void *ptr = map_sysmem(images->os.start, 0);
+                       int ret;
+
+                       ret = android_image_get_ramdisk(ptr, rd_datap, rd_lenp);
+                       unmap_sysmem(ptr);
+                       if (ret)
+                               return ret;
+                       done = true;
+               }
+               break;
+       }
+
+       if (!done) {
+               if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
+                       char *end = NULL;
+
+                       if (select)
+                               end = strchr(select, ':');
+                       if (end) {
+                               *rd_lenp = hextoul(++end, NULL);
+                               *rd_datap = rd_addr;
+                               done = true;
                        }
+               }
+
+               if (!done) {
                        puts("Wrong Ramdisk Image Format\n");
                        return -EINVAL;
                }
+       }
 
        return 0;
 }
@@ -471,7 +482,7 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
  *     1, if ramdisk image is found but corrupted, or invalid
  *     rd_start and rd_end are set to 0 if no ramdisk exists
  */
-int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
+int boot_get_ramdisk(int argc, char *const argv[], struct bootm_headers *images,
                     u8 arch, ulong *rd_start, ulong *rd_end)
 {
        ulong rd_data, rd_len;
@@ -635,7 +646,7 @@ error:
        return -1;
 }
 
-int boot_get_setup(bootm_headers_t *images, u8 arch,
+int boot_get_setup(struct bootm_headers *images, u8 arch,
                   ulong *setup_start, ulong *setup_len)
 {
        if (!CONFIG_IS_ENABLED(FIT))
@@ -644,7 +655,7 @@ int boot_get_setup(bootm_headers_t *images, u8 arch,
        return boot_get_setup_fit(images, arch, setup_start, setup_len);
 }
 
-int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
+int boot_get_fpga(int argc, char *const argv[], struct bootm_headers *images,
                  u8 arch, const ulong *ld_start, ulong * const ld_len)
 {
        ulong tmp_img_addr, img_data, img_len;
@@ -707,14 +718,14 @@ int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
                                                 img_len, BIT_FULL);
                        if (err)
                                err = fpga_load(devnum, (const void *)img_data,
-                                               img_len, BIT_FULL);
+                                               img_len, BIT_FULL, 0);
                } else {
                        name = "partial";
                        err = fpga_loadbitstream(devnum, (char *)img_data,
                                                 img_len, BIT_PARTIAL);
                        if (err)
                                err = fpga_load(devnum, (const void *)img_data,
-                                               img_len, BIT_PARTIAL);
+                                               img_len, BIT_PARTIAL, 0);
                }
 
                if (err)
@@ -747,7 +758,7 @@ static void fit_loadable_process(u8 img_type,
                        fit_loadable_handler->handler(img_data, img_len);
 }
 
-int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
+int boot_get_loadable(int argc, char *const argv[], struct bootm_headers *images,
                      u8 arch, const ulong *ld_start, ulong * const ld_len)
 {
        /*
@@ -833,7 +844,7 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
  * @cmd_start: pointer to a ulong variable, will hold cmdline start
  * @cmd_end: pointer to a ulong variable, will hold cmdline end
  *
- * boot_get_cmdline() allocates space for kernel command line below
+ * This allocates space for kernel command line below
  * BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
  * variable is present its contents is copied to allocated kernel
  * command line.
@@ -844,10 +855,19 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
  */
 int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 {
+       int barg;
        char *cmdline;
        char *s;
 
-       cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
+       /*
+        * Help the compiler detect that this function is only called when
+        * CONFIG_SYS_BOOT_GET_CMDLINE is enabled
+        */
+       if (!IS_ENABLED(CONFIG_SYS_BOOT_GET_CMDLINE))
+               return 0;
+
+       barg = IF_ENABLED_INT(CONFIG_SYS_BOOT_GET_CMDLINE, CONFIG_SYS_BARGSIZE);
+       cmdline = (char *)(ulong)lmb_alloc_base(lmb, barg, 0xf,
                                env_get_bootm_mapsize() + env_get_bootm_low());
        if (!cmdline)
                return -1;
@@ -893,21 +913,22 @@ int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
 
        debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
 
-#if defined(DEBUG)
-       if (IS_ENABLED(CONFIG_CMD_BDI))
+       if (_DEBUG && IS_ENABLED(CONFIG_CMD_BDI))
                do_bdinfo(NULL, 0, 0, NULL);
-#endif
 
        return 0;
 }
 
-int image_setup_linux(bootm_headers_t *images)
+int image_setup_linux(struct bootm_headers *images)
 {
        ulong of_size = images->ft_len;
        char **of_flat_tree = &images->ft_addr;
-       struct lmb *lmb = &images->lmb;
+       struct lmb *lmb = images_lmb(images);
        int ret;
 
+       /* This function cannot be called without lmb support */
+       if (!CONFIG_IS_ENABLED(LMB))
+               return -EFAULT;
        if (CONFIG_IS_ENABLED(OF_LIBFDT))
                boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);