cmd/fdt: add possibilty to have 'extrasize' on fdt resize
authorHannes Schmelzer <hannes.schmelzer@br-automation.com>
Tue, 20 Sep 2016 16:10:43 +0000 (18:10 +0200)
committerSimon Glass <sjg@chromium.org>
Thu, 13 Oct 2016 19:54:10 +0000 (13:54 -0600)
Sometimes devicetree nodes and or properties are added out of the u-boot
console, maybe through some script or manual interaction.

The devicetree as loaded or embedded is quite small, so the devicetree
has to be resized to take up those new nodes/properties.

In original the devicetree was only extended by effective
4 * add_mem_rsv.

With this commit we can add an argument to the "fdt resize" command,
which takes the extrasize to be added.

Signed-off-by: Hannes Schmelzer <hannes.schmelzer@br-automation.com>
Signed-off-by: Hannes Schmelzer <oe5hpm@oevsv.at>
Acked-by: Simon Glass <sjg@chromium.org>
board/compulab/cm_fx6/cm_fx6.c
cmd/fdt.c
common/fdt_support.c
common/image-fdt.c
include/fdt_support.h

index 28e9a8f41ff3cf05e4b7a02b604b44efb1efdf74..5b88bcce598284dcc7aff3e7a878aed5b84dfb55 100644 (file)
@@ -602,7 +602,7 @@ int ft_board_setup(void *blob, bd_t *bd)
        char baseboard_name[16];
        int err;
 
-       fdt_shrink_to_minimum(blob); /* Make room for new properties */
+       fdt_shrink_to_minimum(blob, 0); /* Make room for new properties */
 
        /* MAC addr */
        if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
index 58af7727ba088b34fc62a1bb0ec33dd4946d27ab..b503357dc3a8cf26ca80dd3edfbde628c8cb86b7 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -662,7 +662,12 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
        /* resize the fdt */
        else if (strncmp(argv[1], "re", 2) == 0) {
-               fdt_shrink_to_minimum(working_fdt);
+               uint extrasize;
+               if (argc > 2)
+                       extrasize = simple_strtoul(argv[2], NULL, 16);
+               else
+                       extrasize = 0;
+               fdt_shrink_to_minimum(working_fdt, extrasize);
        }
        else {
                /* Unrecognized command */
@@ -1056,7 +1061,7 @@ static char fdt_help_text[] =
        "fdt systemsetup                     - Do system-specific set up\n"
 #endif
        "fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n"
-       "fdt resize                          - Resize fdt to size + padding to 4k addr\n"
+       "fdt resize [<extrasize>]            - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed\n"
        "fdt print  <path> [<prop>]          - Recursive print starting at <path>\n"
        "fdt list   <path> [<prop>]          - Print one level starting at <path>\n"
        "fdt get value <var> <path> <prop>   - Get <property> and store in <var>\n"
index 202058621ae2016f4457160ef6079b6c539b6608..0609470dfb8bbaddcd4d8a2fab178d1b2fb481c6 100644 (file)
@@ -523,7 +523,7 @@ void fdt_fixup_ethernet(void *fdt)
 }
 
 /* Resize the fdt to its actual size + a bit of padding */
-int fdt_shrink_to_minimum(void *blob)
+int fdt_shrink_to_minimum(void *blob, uint extrasize)
 {
        int i;
        uint64_t addr, size;
@@ -551,6 +551,7 @@ int fdt_shrink_to_minimum(void *blob)
        actualsize = fdt_off_dt_strings(blob) +
                fdt_size_dt_strings(blob) + 5 * sizeof(struct fdt_reserve_entry);
 
+       actualsize += extrasize;
        /* Make it so the fdt ends on a page boundary */
        actualsize = ALIGN(actualsize + ((uintptr_t)blob & 0xfff), 0x1000);
        actualsize = actualsize - ((uintptr_t)blob & 0xfff);
index 3d23608c043ba0095f2b6a773dfb8864971cdd72..5454227fc9963213b18fe799e337333e95fee228 100644 (file)
@@ -503,7 +503,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
                lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob,
                         (phys_size_t)fdt_totalsize(blob));
 
-       ret = fdt_shrink_to_minimum(blob);
+       ret = fdt_shrink_to_minimum(blob, 0);
        if (ret < 0)
                goto err;
        of_size = ret;
index 8f402310f6ba8321de518607eb737bc9d950f8fd..506bc5a9f690b0bb6c8ad108feb3e87056bbda04 100644 (file)
@@ -167,7 +167,15 @@ void ft_pci_setup(void *blob, bd_t *bd);
 int ft_system_setup(void *blob, bd_t *bd);
 
 void set_working_fdt_addr(ulong addr);
-int fdt_shrink_to_minimum(void *blob);
+
+/**
+ * shrink down the given blob to minimum size + some extrasize if required
+ *
+ * @param blob         FDT blob to update
+ * @param extrasize    additional bytes needed
+ * @return 0 if ok, or -FDT_ERR_... on error
+ */
+int fdt_shrink_to_minimum(void *blob, uint extrasize);
 int fdt_increase_size(void *fdt, int add_len);
 
 int fdt_fixup_nor_flash_size(void *blob);