ARM: tegra: Support multiple reserved memory regions

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>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Tom Warren <twarren@nvidia.com>
This commit is contained in:
Thierry Reding 2021-09-03 15:16:22 +02:00 committed by Tom Warren
parent b9aad37591
commit db8a0306c9
3 changed files with 126 additions and 39 deletions

View File

@ -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;

View File

@ -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;

View File

@ -11,6 +11,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>
@ -124,24 +125,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;