]> git.sur5r.net Git - u-boot/commitdiff
fdt: refactor fdt resize code
authorKumar Gala <galak@kernel.crashing.org>
Fri, 15 Aug 2008 13:24:42 +0000 (08:24 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 26 Aug 2008 21:43:36 +0000 (23:43 +0200)
Move the fdt resizing code out of ppc specific boot code and into
common fdt support code.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
common/fdt_support.c
include/fdt_support.h
lib_ppc/bootm.c

index 405b9dbda977f74d08a48bdf4e62919d8545bc7d..c0ca9e0600937237075677b5db0d65e8b48f884f 100644 (file)
@@ -531,3 +531,42 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev)
                       fdt_strerror(err));
 }
 #endif /* defined(CONFIG_MPC83XX) || defined(CONFIG_MPC85xx) */
+
+/* Resize the fdt to its actual size + a bit of padding */
+int fdt_resize(void *blob)
+{
+       int i;
+       uint64_t addr, size;
+       int total, ret;
+       uint actualsize;
+
+       if (!blob)
+               return 0;
+
+       total = fdt_num_mem_rsv(blob);
+       for (i = 0; i < total; i++) {
+               fdt_get_mem_rsv(blob, i, &addr, &size);
+               if (addr == (uint64_t)(u32)blob) {
+                       fdt_del_mem_rsv(blob, i);
+                       break;
+               }
+       }
+
+       /* Calculate the actual size of the fdt */
+       actualsize = fdt_off_dt_strings(blob) +
+               fdt_size_dt_strings(blob);
+
+       /* Make it so the fdt ends on a page boundary */
+       actualsize = ALIGN(actualsize, 0x1000);
+       actualsize = actualsize - ((uint)blob & 0xfff);
+
+       /* Change the fdt header to reflect the correct size */
+       fdt_set_totalsize(blob, actualsize);
+
+       /* Add the new reservation */
+       ret = fdt_add_mem_rsv(blob, (uint)blob, actualsize);
+       if (ret < 0)
+               return ret;
+
+       return actualsize;
+}
index f14ab68ffb8736c66e4cf9d84fd9343513b62f27..aa0fc5801af16d573f887ff39219570524523986 100644 (file)
@@ -69,6 +69,7 @@ void ft_pci_setup(void *blob, bd_t *bd);
 #endif
 
 void set_working_fdt_addr(void *addr);
+int fdt_resize(void *blob);
 
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */
index b86169a93babffb6248980fe8ed1dc13d1b2f989..300e00a2dab6df3d737ef89748009c43c26f8266 100644 (file)
@@ -162,38 +162,14 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 
        /* Fixup the fdt memreserve now that we know how big it is */
        if (of_flat_tree) {
-               int j;
-               uint64_t addr, size;
-               int total = fdt_num_mem_rsv(of_flat_tree);
-               uint actualsize;
-
-               for (j = 0; j < total; j++) {
-                       fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
-                       if (addr == (uint64_t)(u32)of_flat_tree) {
-                               fdt_del_mem_rsv(of_flat_tree, j);
-                               break;
-                       }
-               }
-
                /* Delete the old LMB reservation */
                lmb_free(lmb, (phys_addr_t)(u32)of_flat_tree,
                                (phys_size_t)fdt_totalsize(of_flat_tree));
 
-               /* Calculate the actual size of the fdt */
-               actualsize = fdt_off_dt_strings(of_flat_tree) +
-                       fdt_size_dt_strings(of_flat_tree);
-
-               /* Make it so the fdt ends on a page boundary */
-               actualsize = ALIGN(actualsize, 0x1000);
-               actualsize = actualsize - ((uint)of_flat_tree & 0xfff);
-
-               /* Change the fdt header to reflect the correct size */
-               fdt_set_totalsize(of_flat_tree, actualsize);
-               of_size = actualsize;
-
-               /* Add the new reservation */
-               ret = fdt_add_mem_rsv(of_flat_tree, (uint)of_flat_tree,
-                               of_size);
+               ret = fdt_resize(of_flat_tree);
+               if (ret < 0)
+                       goto error;
+               of_size = ret;
 
                /* Create a new LMB reservation */
                lmb_reserve(lmb, (ulong)of_flat_tree, of_size);