
From: Thierry Reding treding@nvidia.com
Support multiple reserved memory regions per device to support platforms that use both a framebuffer and color conversion lookup table for early boot display splash.
While at it, also pass along the name, compatible strings and flags of the carveouts.
Signed-off-by: Thierry Reding treding@nvidia.com --- board/nvidia/p2371-2180/p2371-2180.c | 55 +++++++++++++++++++++------- board/nvidia/p2771-0000/p2771-0000.c | 55 +++++++++++++++++++++------- board/nvidia/p3450-0000/p3450-0000.c | 55 +++++++++++++++++++++------- 3 files changed, 126 insertions(+), 39 deletions(-)
diff --git a/board/nvidia/p2371-2180/p2371-2180.c b/board/nvidia/p2371-2180/p2371-2180.c index 137c7d3b12c3..f5126c552b00 100644 --- a/board/nvidia/p2371-2180/p2371-2180.c +++ b/board/nvidia/p2371-2180/p2371-2180.c @@ -10,6 +10,7 @@ #include <i2c.h> #include <log.h> #include <net.h> +#include <stdlib.h> #include <linux/bitops.h> #include <linux/libfdt.h> #include <asm/arch/gpio.h> @@ -125,24 +126,52 @@ static void ft_mac_address_setup(void *fdt)
static int ft_copy_carveout(void *dst, const void *src, const char *node) { - struct fdt_memory fb; + unsigned int index = 0; int err;
- err = fdtdec_get_carveout(src, node, "memory-region", 0, &fb, NULL, - NULL, NULL, NULL); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", node, + while (true) { + const char **compatibles = NULL; + unsigned int num_compatibles; + struct fdt_memory carveout; + unsigned long flags; + char *copy = NULL; + const char *name; + + err = fdtdec_get_carveout(src, node, "memory-region", index, + &carveout, &name, &compatibles, + &num_compatibles, &flags); + if (err < 0) { + if (err != -FDT_ERR_NOTFOUND) + printf("failed to get carveout for %s: %d\n", + node, err); + + return err; + } + + if (name) { + const char *ptr = strchr(name, '@'); + + if (ptr) { + copy = strndup(name, ptr - name); + name = copy; + } + } else { + name = "carveout"; + } + + err = fdtdec_set_carveout(dst, node, "memory-region", index, + &carveout, name, compatibles, + num_compatibles, flags); + if (err < 0) { + printf("failed to set carveout for %s: %d\n", node, err); + return err; + }
- return err; - } + if (copy) + free(copy);
- err = fdtdec_set_carveout(dst, node, "memory-region", 0, &fb, - "framebuffer", NULL, 0, 0); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, err); - return err; + index++; }
return 0; diff --git a/board/nvidia/p2771-0000/p2771-0000.c b/board/nvidia/p2771-0000/p2771-0000.c index 3d2653d1f075..46c36a22db5e 100644 --- a/board/nvidia/p2771-0000/p2771-0000.c +++ b/board/nvidia/p2771-0000/p2771-0000.c @@ -9,6 +9,7 @@ #include <i2c.h> #include <log.h> #include <net.h> +#include <stdlib.h> #include <linux/libfdt.h> #include <asm/arch-tegra/cboot.h> #include "../p2571/max77620_init.h" @@ -101,24 +102,52 @@ static void ft_mac_address_setup(void *fdt)
static int ft_copy_carveout(void *dst, const void *src, const char *node) { - struct fdt_memory fb; + unsigned int index = 0; int err;
- err = fdtdec_get_carveout(src, node, "memory-region", 0, &fb, NULL, - NULL, NULL, NULL); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", node, + while (true) { + const char **compatibles = NULL; + unsigned int num_compatibles; + struct fdt_memory carveout; + unsigned long flags; + char *copy = NULL; + const char *name; + + err = fdtdec_get_carveout(src, node, "memory-region", index, + &carveout, &name, &compatibles, + &num_compatibles, &flags); + if (err < 0) { + if (err != -FDT_ERR_NOTFOUND) + printf("failed to get carveout for %s: %d\n", + node, err); + + return err; + } + + if (name) { + const char *ptr = strchr(name, '@'); + + if (ptr) { + copy = strndup(name, ptr - name); + name = copy; + } + } else { + name = "carveout"; + } + + err = fdtdec_set_carveout(dst, node, "memory-region", index, + &carveout, name, compatibles, + num_compatibles, flags); + if (err < 0) { + printf("failed to set carveout for %s: %d\n", node, err); + return err; + }
- return err; - } + if (copy) + free(copy);
- err = fdtdec_set_carveout(dst, node, "memory-region", 0, &fb, - "framebuffer", NULL, 0, 0); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, err); - return err; + index++; }
return 0; diff --git a/board/nvidia/p3450-0000/p3450-0000.c b/board/nvidia/p3450-0000/p3450-0000.c index cdedea18a176..2c709d9b8117 100644 --- a/board/nvidia/p3450-0000/p3450-0000.c +++ b/board/nvidia/p3450-0000/p3450-0000.c @@ -12,6 +12,7 @@ #include <linux/bitops.h> #include <linux/libfdt.h> #include <pca953x.h> +#include <stdlib.h> #include <asm/arch-tegra/cboot.h> #include <asm/arch/gpio.h> #include <asm/arch/pinmux.h> @@ -125,24 +126,52 @@ static void ft_mac_address_setup(void *fdt)
static int ft_copy_carveout(void *dst, const void *src, const char *node) { - struct fdt_memory fb; + unsigned int index = 0; int err;
- err = fdtdec_get_carveout(src, node, "memory-region", 0, &fb, NULL, - NULL, NULL, NULL); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", node, + while (true) { + const char **compatibles = NULL; + unsigned int num_compatibles; + struct fdt_memory carveout; + unsigned long flags; + char *copy = NULL; + const char *name; + + err = fdtdec_get_carveout(src, node, "memory-region", index, + &carveout, &name, &compatibles, + &num_compatibles, &flags); + if (err < 0) { + if (err != -FDT_ERR_NOTFOUND) + printf("failed to get carveout for %s: %d\n", + node, err); + + return err; + } + + if (name) { + const char *ptr = strchr(name, '@'); + + if (ptr) { + copy = strndup(name, ptr - name); + name = copy; + } + } else { + name = "carveout"; + } + + err = fdtdec_set_carveout(dst, node, "memory-region", index, + &carveout, name, compatibles, + num_compatibles, flags); + if (err < 0) { + printf("failed to set carveout for %s: %d\n", node, err); + return err; + }
- return err; - } + if (copy) + free(copy);
- err = fdtdec_set_carveout(dst, node, "memory-region", 0, &fb, - "framebuffer", NULL, 0, 0); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, err); - return err; + index++; }
return 0;