]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/image.c
driver/serial: delete at91rm9200_usart
[karo-tx-uboot.git] / common / image.c
index 385464d3eb0d6a79e37172c984119ff6d8421c5e..e542a5736710ec94ef547158211c0365bc2372e3 100644 (file)
@@ -74,7 +74,7 @@ static const image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
 #include <image.h>
 #endif /* !USE_HOSTCC*/
 
-static table_entry_t uimage_arch[] = {
+static const table_entry_t uimage_arch[] = {
        {       IH_ARCH_INVALID,        NULL,           "Invalid ARCH", },
        {       IH_ARCH_ALPHA,          "alpha",        "Alpha",        },
        {       IH_ARCH_ARM,            "arm",          "ARM",          },
@@ -96,7 +96,7 @@ static table_entry_t uimage_arch[] = {
        {       -1,                     "",             "",             },
 };
 
-static table_entry_t uimage_os[] = {
+static const table_entry_t uimage_os[] = {
        {       IH_OS_INVALID,  NULL,           "Invalid OS",           },
        {       IH_OS_LINUX,    "linux",        "Linux",                },
 #if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC)
@@ -129,7 +129,7 @@ static table_entry_t uimage_os[] = {
        {       -1,             "",             "",                     },
 };
 
-static table_entry_t uimage_type[] = {
+static const table_entry_t uimage_type[] = {
        {       IH_TYPE_INVALID,    NULL,         "Invalid Image",      },
        {       IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image",   },
        {       IH_TYPE_FIRMWARE,   "firmware",   "Firmware",           },
@@ -144,7 +144,7 @@ static table_entry_t uimage_type[] = {
        {       -1,                 "",           "",                   },
 };
 
-static table_entry_t uimage_comp[] = {
+static const table_entry_t uimage_comp[] = {
        {       IH_COMP_NONE,   "none",         "uncompressed",         },
        {       IH_COMP_BZIP2,  "bzip2",        "bzip2 compressed",     },
        {       IH_COMP_GZIP,   "gzip",         "gzip compressed",      },
@@ -454,6 +454,22 @@ phys_size_t getenv_bootm_size(void)
 #endif
 }
 
+phys_size_t getenv_bootm_mapsize(void)
+{
+       phys_size_t tmp;
+       char *s = getenv ("bootm_mapsize");
+       if (s) {
+               tmp = (phys_size_t)simple_strtoull (s, NULL, 16);
+               return tmp;
+       }
+
+#if defined(CONFIG_SYS_BOOTMAPSZ)
+       return CONFIG_SYS_BOOTMAPSZ;
+#else
+       return getenv_bootm_size();
+#endif
+}
+
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 {
        if (to == from)
@@ -516,11 +532,11 @@ static void genimg_print_time (time_t timestamp)
  *     long entry name if translation succeeds
  *     msg otherwise
  */
-char *get_table_entry_name (table_entry_t *table, char *msg, int id)
+char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
 {
        for (; table->id >= 0; ++table) {
                if (table->id == id)
-#if defined(USE_HOSTCC) || defined(CONFIG_RELOC_FIXUP_WORKS)
+#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
                        return table->lname;
 #else
                        return table->lname + gd->reloc_off;
@@ -563,10 +579,10 @@ const char *genimg_get_comp_name (uint8_t comp)
  *     entry id if translation succeeds
  *     -1 otherwise
  */
-int get_table_entry_id (table_entry_t *table,
+int get_table_entry_id(const table_entry_t *table,
                const char *table_name, const char *name)
 {
-       table_entry_t *t;
+       const table_entry_t *t;
 #ifdef USE_HOSTCC
        int first = 1;
 
@@ -585,10 +601,10 @@ int get_table_entry_id (table_entry_t *table,
        fprintf (stderr, "\n");
 #else
        for (t = table; t->id >= 0; ++t) {
-#ifdef CONFIG_RELOC_FIXUP_WORKS
-               if (t->sname && strcmp(t->sname, name) == 0)
-#else
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
                if (t->sname && strcmp(t->sname + gd->reloc_off, name) == 0)
+#else
+               if (t->sname && strcmp(t->sname, name) == 0)
 #endif
                        return (t->id);
        }
@@ -1169,15 +1185,44 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
 #define CONFIG_SYS_FDT_PAD 0x3000
 #endif
 
+#if defined(CONFIG_OF_LIBFDT)
+/**
+ * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
+ * @fdt_blob: pointer to fdt blob base address
+ *
+ * Adds the memreserve regions in the dtb to the lmb block.  Adding the
+ * memreserve regions prevents u-boot from using them to store the initrd
+ * or the fdt blob.
+ */
+void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
+{
+       uint64_t addr, size;
+       int i, total;
+
+       if (fdt_check_header (fdt_blob) != 0)
+               return;
+
+       total = fdt_num_mem_rsv(fdt_blob);
+       for (i = 0; i < total; i++) {
+               if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
+                       continue;
+               printf("   reserving fdt memory region: addr=%llx size=%llx\n",
+                       (unsigned long long)addr, (unsigned long long)size);
+               lmb_reserve(lmb, addr, size);
+       }
+}
+
 /**
  * boot_relocate_fdt - relocate flat device tree
  * @lmb: pointer to lmb handle, will be used for memory mgmt
- * @bootmap_base: base address of the bootmap region
  * @of_flat_tree: pointer to a char* variable, will hold fdt start address
  * @of_size: pointer to a ulong variable, will hold fdt length
  *
- * boot_relocate_fdt() determines if the of_flat_tree address is within
- * the bootmap and if not relocates it into that region
+ * boot_relocate_fdt() allocates a region of memory within the bootmap and
+ * relocates the of_flat_tree into that region, even if the fdt is already in
+ * the bootmap.  It also expands the size of the fdt by CONFIG_SYS_FDT_PAD
+ * bytes.
  *
  * of_flat_tree and of_size are set to final (after relocation) values
  *
@@ -1185,13 +1230,12 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
  *      0 - success
  *      1 - failure
  */
-#if defined(CONFIG_SYS_BOOTMAPSZ)
-int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
-               char **of_flat_tree, ulong *of_size)
+int boot_relocate_fdt (struct lmb *lmb, char **of_flat_tree, ulong *of_size)
 {
-       char    *fdt_blob = *of_flat_tree;
-       ulong   relocate = 0;
+       void    *fdt_blob = *of_flat_tree;
+       void    *of_start = 0;
        ulong   of_len = 0;
+       int     err;
 
        /* nothing to do */
        if (*of_size == 0)
@@ -1202,62 +1246,32 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
                goto error;
        }
 
-#ifndef CONFIG_SYS_NO_FLASH
-       /* move the blob if it is in flash (set relocate) */
-       if (addr2info ((ulong)fdt_blob) != NULL)
-               relocate = 1;
-#endif
-
-       /*
-        * The blob needs to be inside the boot mapping.
-        */
-       if (fdt_blob < (char *)bootmap_base)
-               relocate = 1;
-
-       if ((fdt_blob + *of_size + CONFIG_SYS_FDT_PAD) >=
-                       ((char *)CONFIG_SYS_BOOTMAPSZ + bootmap_base))
-               relocate = 1;
-
-       /* move flattend device tree if needed */
-       if (relocate) {
-               int err;
-               ulong of_start = 0;
-
-               /* position on a 4K boundary before the alloc_current */
-               /* Pad the FDT by a specified amount */
-               of_len = *of_size + CONFIG_SYS_FDT_PAD;
-               of_start = (unsigned long)lmb_alloc_base(lmb, of_len, 0x1000,
-                               (CONFIG_SYS_BOOTMAPSZ + bootmap_base));
-
-               if (of_start == 0) {
-                       puts("device tree - allocation error\n");
-                       goto error;
-               }
+       /* position on a 4K boundary before the alloc_current */
+       /* Pad the FDT by a specified amount */
+       of_len = *of_size + CONFIG_SYS_FDT_PAD;
+       of_start = (void *)(unsigned long)lmb_alloc_base(lmb, of_len, 0x1000,
+                       getenv_bootm_mapsize() + getenv_bootm_low());
 
-               debug ("## device tree at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",
-                       (ulong)fdt_blob, (ulong)fdt_blob + *of_size - 1,
-                       of_len, of_len);
+       if (of_start == 0) {
+               puts("device tree - allocation error\n");
+               goto error;
+       }
 
-               printf ("   Loading Device Tree to %08lx, end %08lx ... ",
-                       of_start, of_start + of_len - 1);
+       debug ("## device tree at %p ... %p (len=%ld [0x%lX])\n",
+               fdt_blob, fdt_blob + *of_size - 1, of_len, of_len);
 
-               err = fdt_open_into (fdt_blob, (void *)of_start, of_len);
-               if (err != 0) {
-                       fdt_error ("fdt move failed");
-                       goto error;
-               }
-               puts ("OK\n");
+       printf ("   Loading Device Tree to %p, end %p ... ",
+               of_start, of_start + of_len - 1);
 
-               *of_flat_tree = (char *)of_start;
-               *of_size = of_len;
-       } else {
-               *of_flat_tree = fdt_blob;
-               of_len = *of_size + CONFIG_SYS_FDT_PAD;
-               lmb_reserve(lmb, (ulong)fdt_blob, of_len);
-               fdt_set_totalsize(*of_flat_tree, of_len);
-
-               *of_size = of_len;
+       err = fdt_open_into (fdt_blob, of_start, of_len);
+       if (err != 0) {
+               fdt_error ("fdt move failed");
+               goto error;
        }
+       puts ("OK\n");
+
+       *of_flat_tree = of_start;
+       *of_size = of_len;
 
        set_working_fdt_addr(*of_flat_tree);
        return 0;
@@ -1265,7 +1279,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
 error:
        return 1;
 }
-#endif /* CONFIG_SYS_BOOTMAPSZ */
+#endif /* CONFIG_OF_LIBFDT */
 
 /**
  * boot_get_fdt - main fdt handling routine
@@ -1594,11 +1608,9 @@ error:
  * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @cmd_start: pointer to a ulong variable, will hold cmdline start
  * @cmd_end: pointer to a ulong variable, will hold cmdline end
- * @bootmap_base: ulong variable, holds offset in physical memory to
- * base of bootmap
  *
  * boot_get_cmdline() allocates space for kernel command line below
- * BOOTMAPSZ + bootmap_base address. If "bootargs" U-boot environemnt
+ * BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-boot environemnt
  * variable is present its contents is copied to allocated kernel
  * command line.
  *
@@ -1606,14 +1618,13 @@ error:
  *      0 - success
  *     -1 - failure
  */
-int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
-                       ulong bootmap_base)
+int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
 {
        char *cmdline;
        char *s;
 
        cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
-                                        CONFIG_SYS_BOOTMAPSZ + bootmap_base);
+                               getenv_bootm_mapsize() + getenv_bootm_low());
 
        if (cmdline == NULL)
                return -1;
@@ -1637,21 +1648,19 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
  * boot_get_kbd - allocate and initialize kernel copy of board info
  * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @kbd: double pointer to board info data
- * @bootmap_base: ulong variable, holds offset in physical memory to
- * base of bootmap
  *
  * boot_get_kbd() allocates space for kernel copy of board info data below
- * BOOTMAPSZ + bootmap_base address and kernel board info is initialized with
- * the current u-boot board info data.
+ * BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized
+ * with the current u-boot board info data.
  *
  * returns:
  *      0 - success
  *     -1 - failure
  */
-int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base)
+int boot_get_kbd (struct lmb *lmb, bd_t **kbd)
 {
        *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
-                                     CONFIG_SYS_BOOTMAPSZ + bootmap_base);
+                               getenv_bootm_mapsize() + getenv_bootm_low());
        if (*kbd == NULL)
                return -1;