diff mbox series

[U-Boot,v3,13/13] p2771-0000: Add support for framebuffer carveouts

Message ID 20190321181010.27005-14-thierry.reding@gmail.com
State Changes Requested
Delegated to: Simon Glass
Headers show
Series ARM: tegra: Add support for framebuffer carveouts | expand

Commit Message

Thierry Reding March 21, 2019, 6:10 p.m. UTC
From: Thierry Reding <treding@nvidia.com>

If early firmware initialized the display hardware and the display
controllers are scanning out a framebuffer (e.g. a splash screen), make
sure to pass information about the memory location of that framebuffer
to the kernel before booting to avoid the kernel from using that memory
for the buddy allocator.

This same mechanism can also be used in the kernel to set up early SMMU
mappings and avoid SMMU faults caused by the display controller reading
from memory for which it has no mapping.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 board/nvidia/p2771-0000/p2771-0000.c | 66 ++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 4 deletions(-)

Comments

Simon Glass March 22, 2019, 7:53 a.m. UTC | #1
On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote:
>
> From: Thierry Reding <treding@nvidia.com>
>
> If early firmware initialized the display hardware and the display
> controllers are scanning out a framebuffer (e.g. a splash screen), make
> sure to pass information about the memory location of that framebuffer
> to the kernel before booting to avoid the kernel from using that memory
> for the buddy allocator.
>
> This same mechanism can also be used in the kernel to set up early SMMU
> mappings and avoid SMMU faults caused by the display controller reading
> from memory for which it has no mapping.
>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>  board/nvidia/p2771-0000/p2771-0000.c | 66 ++++++++++++++++++++++++++--
>  1 file changed, 62 insertions(+), 4 deletions(-)
>

Reviewed-by: Simon Glass <sjg@chromium.org>
Simon Glass April 12, 2019, 2:12 a.m. UTC | #2
Hi Thierry,

On Fri, 22 Mar 2019 at 01:53, Simon Glass <sjg@chromium.org> wrote:
>
> On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding@gmail.com> wrote:
> >
> > From: Thierry Reding <treding@nvidia.com>
> >
> > If early firmware initialized the display hardware and the display
> > controllers are scanning out a framebuffer (e.g. a splash screen), make
> > sure to pass information about the memory location of that framebuffer
> > to the kernel before booting to avoid the kernel from using that memory
> > for the buddy allocator.
> >
> > This same mechanism can also be used in the kernel to set up early SMMU
> > mappings and avoid SMMU faults caused by the display controller reading
> > from memory for which it has no mapping.
> >
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> >  board/nvidia/p2771-0000/p2771-0000.c | 66 ++++++++++++++++++++++++++--
> >  1 file changed, 62 insertions(+), 4 deletions(-)
> >
>
> Reviewed-by: Simon Glass <sjg@chromium.org>

This doesn't apply for me. Please can you resend it?

Regards,
Simon
diff mbox series

Patch

diff --git a/board/nvidia/p2771-0000/p2771-0000.c b/board/nvidia/p2771-0000/p2771-0000.c
index fe22067f6571..d294c7ae0136 100644
--- a/board/nvidia/p2771-0000/p2771-0000.c
+++ b/board/nvidia/p2771-0000/p2771-0000.c
@@ -5,6 +5,7 @@ 
 
 #include <common.h>
 #include <environment.h>
+#include <fdtdec.h>
 #include <i2c.h>
 #include <linux/libfdt.h>
 #include <asm/arch-tegra/cboot.h>
@@ -56,7 +57,7 @@  int tegra_pcie_board_init(void)
 }
 #endif
 
-int ft_board_setup(void *fdt, bd_t *bd)
+static void ft_mac_address_setup(void *fdt)
 {
 	const void *cboot_fdt = (const void *)cboot_boot_x0;
 	uint8_t mac[ETH_ALEN], local_mac[ETH_ALEN];
@@ -69,13 +70,15 @@  int ft_board_setup(void *fdt, bd_t *bd)
 
 	path = fdt_get_alias(fdt, "ethernet");
 	if (!path)
-		return 0;
+		return;
 
 	debug("ethernet alias found: %s\n", path);
 
 	offset = fdt_path_offset(fdt, path);
-	if (offset < 0)
-		return 0;
+	if (offset < 0) {
+		printf("ethernet alias points to absent node %s\n", path);
+		return;
+	}
 
 	if (is_valid_ethaddr(local_mac)) {
 		err = fdt_setprop(fdt, offset, "local-mac-address", local_mac,
@@ -92,6 +95,61 @@  int ft_board_setup(void *fdt, bd_t *bd)
 				debug("MAC address set: %pM\n", mac);
 		}
 	}
+}
+
+static int ft_copy_carveout(void *dst, const void *src, const char *node)
+{
+	struct fdt_memory fb;
+	int err;
+
+	err = fdtdec_get_carveout(src, node, "memory-region", 0, &fb);
+	if (err < 0) {
+		if (err != -FDT_ERR_NOTFOUND)
+			printf("failed to get carveout for %s: %d\n", node,
+			       err);
+
+		return err;
+	}
+
+	err = fdtdec_set_carveout(dst, node, "memory-region", 0, "framebuffer",
+				  &fb);
+	if (err < 0) {
+		printf("failed to set carveout for %s: %d\n", node, err);
+		return err;
+	}
+
+	return 0;
+}
+
+static void ft_carveout_setup(void *fdt)
+{
+	const void *cboot_fdt = (const void *)cboot_boot_x0;
+	static const char * const nodes[] = {
+		"/host1x@13e00000/display-hub@15200000/display@15200000",
+		"/host1x@13e00000/display-hub@15200000/display@15210000",
+		"/host1x@13e00000/display-hub@15200000/display@15220000",
+	};
+	unsigned int i;
+	int err;
+
+	for (i = 0; i < ARRAY_SIZE(nodes); i++) {
+		printf("copying carveout for %s...\n", nodes[i]);
+
+		err = ft_copy_carveout(fdt, cboot_fdt, nodes[i]);
+		if (err < 0) {
+			if (err != -FDT_ERR_NOTFOUND)
+				printf("failed to copy carveout for %s: %d\n",
+				       nodes[i], err);
+
+			continue;
+		}
+	}
+}
+
+int ft_board_setup(void *fdt, bd_t *bd)
+{
+	ft_mac_address_setup(fdt);
+	ft_carveout_setup(fdt);
 
 	return 0;
 }