u-boot.lists.denx.de archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT
@ 2021-09-29  6:47 K900
  2021-09-29 11:43 ` François Ozog
  0 siblings, 1 reply; 4+ messages in thread
From: K900 @ 2021-09-29  6:47 UTC (permalink / raw)
  Cc: K900, Matthias Brugger, Nicolas Saenz Julienne, Peter Robinson,
	Ivan T. Ivanov, Marek Szyprowski, u-boot

We need this to boot with a custom DTB on BCM2711C0-based Pi 4s

Signed-off-by: Ilya Katsnelson <me@0upti.me>
---
 board/raspberrypi/rpi/rpi.c | 63 +++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
index 372b26b6f2..f074540091 100644
--- a/board/raspberrypi/rpi/rpi.c
+++ b/board/raspberrypi/rpi/rpi.c
@@ -495,6 +495,67 @@ void *board_fdt_blob_setup(void)
 	return (void *)fw_dtb_pointer;
 }
 
+void copy_emmc_config(void *our_fdt)
+{
+	/*
+	 * As of 2021-09-28, the Pi 4 has two different revisions, one using a
+	 * B0 stepping of the BCM2711 SoC, and one using a C0 stepping.
+	 *
+	 * The two SoC versions have different, incompatible DMA mappings for
+	 * the on-board eMMC controller, which would normally make them require
+	 * two different DTs.
+	 *
+	 * Unfortunately for us, the different revisions don't actually _use_
+	 * different DTs - instead, the proprietary stage0 bootloader reads the DT,
+	 * patches it in-memory, then passes the corrected DT to the OS.
+	 *
+	 * In our case, the OS is actually U-Boot, and U-Boot can choose to
+	 * completely disregard the firmware-supplied DT and load a custom one
+	 * instead, which is used by, e.g., NixOS.
+	 *
+	 * When that happens, the DT patches applied by the firmware are also
+	 * thrown out, which leads to BCM2711C0 boards being unable to boot
+	 * due to them trying to use the hardcoded DMA mappings in the DT
+	 * (which are for the B0 revision).
+	 *
+	 * Work around that by manually copying the DMA region setup from the
+	 * firmware-provided DT into whatever DT we're actually being asked
+	 * to load.
+	 A*/
+	void *fw_fdt = (void *)fw_dtb_pointer;
+	int fw_emmc_node;
+	int our_emmc_node;
+	int length;
+	const void *fw_value;
+	int result;
+
+	fw_emmc_node = fdt_path_offset(fw_fdt, "emmc2bus");
+	if (fw_emmc_node < 0) {
+		printf("RPi: Failed to find EMMC config in FW DT: %d\n", fw_emmc_node);
+		return;
+	}
+
+	our_emmc_node = fdt_path_offset(our_fdt, "emmc2bus");
+	if (our_emmc_node < 0) {
+		printf("RPi: Failed to find EMMC config in our DT: %d\n", our_emmc_node);
+		return;
+	}
+
+	*fw_value = fdt_getprop(fw_fdt, fw_emmc_node, "dma-ranges", &length);
+	if (!fw_value) {
+		printf("RPi: Failed to get EMMC DMA ranges property from FW DT: %d\n", length);
+		return;
+	}
+
+	result = fdt_setprop(our_fdt, our_emmc_node, "dma-ranges", fw_value, length);
+	if (result != 0) {
+		printf("RPi: Failed to set EMMC DMA ranges property in our DT: %d\n", result);
+		return;
+	}
+
+	printf("RPi: successfully copied FW DT EMMC configuration to our DT!\n");
+}
+
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
 	int node;
@@ -509,5 +570,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
 			   EFI_RESERVED_MEMORY_TYPE);
 #endif
 
+	copy_emmc_config(blob);
+
 	return 0;
 }
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT
  2021-09-29  6:47 [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT K900
@ 2021-09-29 11:43 ` François Ozog
       [not found]   ` <167911632918339@mail.yandex.ru>
  0 siblings, 1 reply; 4+ messages in thread
From: François Ozog @ 2021-09-29 11:43 UTC (permalink / raw)
  To: K900
  Cc: Ilias Apalodimas, Ivan T. Ivanov, Marek Szyprowski,
	Matthias Brugger, Nicolas Saenz Julienne, Peter Robinson, u-boot

Hi

It looks real strange to ignore the authoritative entity and try to patch a
wrong DTB embedded in U-Boot.

Arm SystemReady is definitively aligning to the authoritative entities in
the platform to give U-Boot the right basis on which it can apply
additional overlays (providing it has a way to verify origin and integrity).

Couldn’t you find a cleaner way to just leverage the previous boot DTB ?
There is another discussion thread on similar thing with RISCV.

Le mer. 29 sept. 2021 à 13:30, K900 <me@0upti.me> a écrit :

> We need this to boot with a custom DTB on BCM2711C0-based Pi 4s
>
> Signed-off-by: Ilya Katsnelson <me@0upti.me>
> ---
>  board/raspberrypi/rpi/rpi.c | 63 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 372b26b6f2..f074540091 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -495,6 +495,67 @@ void *board_fdt_blob_setup(void)
>         return (void *)fw_dtb_pointer;
>  }
>
> +void copy_emmc_config(void *our_fdt)
> +{
> +       /*
> +        * As of 2021-09-28, the Pi 4 has two different revisions, one
> using a
> +        * B0 stepping of the BCM2711 SoC, and one using a C0 stepping.
> +        *
> +        * The two SoC versions have different, incompatible DMA mappings
> for
> +        * the on-board eMMC controller, which would normally make them
> require
> +        * two different DTs.
> +        *
> +        * Unfortunately for us, the different revisions don't actually
> _use_
> +        * different DTs - instead, the proprietary stage0 bootloader
> reads the DT,
> +        * patches it in-memory, then passes the corrected DT to the OS.
> +        *
> +        * In our case, the OS is actually U-Boot, and U-Boot can choose to
> +        * completely disregard the firmware-supplied DT and load a custom
> one
> +        * instead, which is used by, e.g., NixOS.
> +        *
> +        * When that happens, the DT patches applied by the firmware are
> also
> +        * thrown out, which leads to BCM2711C0 boards being unable to boot
> +        * due to them trying to use the hardcoded DMA mappings in the DT
> +        * (which are for the B0 revision).
> +        *
> +        * Work around that by manually copying the DMA region setup from
> the
> +        * firmware-provided DT into whatever DT we're actually being asked
> +        * to load.
> +        A*/
> +       void *fw_fdt = (void *)fw_dtb_pointer;
> +       int fw_emmc_node;
> +       int our_emmc_node;
> +       int length;
> +       const void *fw_value;
> +       int result;
> +
> +       fw_emmc_node = fdt_path_offset(fw_fdt, "emmc2bus");
> +       if (fw_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in FW DT: %d\n",
> fw_emmc_node);
> +               return;
> +       }
> +
> +       our_emmc_node = fdt_path_offset(our_fdt, "emmc2bus");
> +       if (our_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in our DT: %d\n",
> our_emmc_node);
> +               return;
> +       }
> +
> +       *fw_value = fdt_getprop(fw_fdt, fw_emmc_node, "dma-ranges",
> &length);
> +       if (!fw_value) {
> +               printf("RPi: Failed to get EMMC DMA ranges property from
> FW DT: %d\n", length);
> +               return;
> +       }
> +
> +       result = fdt_setprop(our_fdt, our_emmc_node, "dma-ranges",
> fw_value, length);
> +       if (result != 0) {
> +               printf("RPi: Failed to set EMMC DMA ranges property in our
> DT: %d\n", result);
> +               return;
> +       }
> +
> +       printf("RPi: successfully copied FW DT EMMC configuration to our
> DT!\n");
> +}
> +
>  int ft_board_setup(void *blob, struct bd_info *bd)
>  {
>         int node;
> @@ -509,5 +570,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>                            EFI_RESERVED_MEMORY_TYPE);
>  #endif
>
> +       copy_emmc_config(blob);
> +
>         return 0;
>  }
> --
> 2.33.0
>
> --
François-Frédéric Ozog | *Director Business Development*
T: +33.67221.6485
francois.ozog@linaro.org | Skype: ffozog

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT
       [not found]   ` <167911632918339@mail.yandex.ru>
@ 2021-09-29 12:46     ` François Ozog
       [not found]       ` <2894051632919727@iva2-957330f6752d.qloud-c.yandex.net>
  0 siblings, 1 reply; 4+ messages in thread
From: François Ozog @ 2021-09-29 12:46 UTC (permalink / raw)
  To: Ilya K
  Cc: Ilias Apalodimas, Ivan T. Ivanov, Marek Szyprowski,
	Matthias Brugger, Nicolas Saenz Julienne, Peter Robinson, u-boot

On Wed, 29 Sept 2021 at 14:29, Ilya K <me@0upti.me> wrote:

> There is no DTB embedded in U-Boot here - the DTB comes from the
> distribution that U-Boot is booting (in my case NixOS, but it's likely
> other similar setups are affected as well).
>
That's exactly what we (Arm/Linaro) try to avoid from now on with
SystemReady: the DTB shall never come booted OS but is a trustable
"property" of the board. You can look are
https://arm-software.github.io/ebbr/ for more details. RISC-V community
also adopted the specification to allow effective decoupling between the
booted payloads and the firmware.
Of course, non SystemReady systems can use whatever scheme they see fit.
And that may be your case. But at the same time, I think there is a path to
properly leverage the DTB provided by the Videocore firmware.

> The goal here is to have a generic image that can boot on both revisions
> of the board, and this is basically the only way to do that (outside of
> maybe adding a way to load an entire separate DT for the C0 revision, which
> will require lots of work on the distribution/kernel side as well). We
> could potentially just keep the firmware-provided DTB, and not load the
> distro-provided one, but this will be messy with mainline kernels, as those
> have diverged to use a somewhat different DT layout by now.
>
Taking the firmware DTB is the new norm and I think Peter from Red Hat, who
is in the Linaro group that deals with this firmware/OS interface may share
his views (may be different from mine though ;-)
Now for your particular case, it seems you may need to do what you
described. I guess it is a call for Arm, Linaro, RPI foundation, Beagle
foundation and 96Boards to get together on the SystemReady/DTB front.

>
>
29.09.2021, 14:43, "François Ozog" <francois.ozog@linaro.org>:
>
> Hi
>
> It looks real strange to ignore the authoritative entity and try to patch
> a wrong DTB embedded in U-Boot.
>
> Arm SystemReady is definitively aligning to the authoritative entities in
> the platform to give U-Boot the right basis on which it can apply
> additional overlays (providing it has a way to verify origin and integrity).
>
> Couldn’t you find a cleaner way to just leverage the previous boot DTB ?
> There is another discussion thread on similar thing with RISCV.
>
> Le mer. 29 sept. 2021 à 13:30, K900 <me@0upti.me> a écrit :
>
> We need this to boot with a custom DTB on BCM2711C0-based Pi 4s
>
> Signed-off-by: Ilya Katsnelson <me@0upti.me>
> ---
>  board/raspberrypi/rpi/rpi.c | 63 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 372b26b6f2..f074540091 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -495,6 +495,67 @@ void *board_fdt_blob_setup(void)
>         return (void *)fw_dtb_pointer;
>  }
>
> +void copy_emmc_config(void *our_fdt)
> +{
> +       /*
> +        * As of 2021-09-28, the Pi 4 has two different revisions, one
> using a
> +        * B0 stepping of the BCM2711 SoC, and one using a C0 stepping.
> +        *
> +        * The two SoC versions have different, incompatible DMA mappings
> for
> +        * the on-board eMMC controller, which would normally make them
> require
> +        * two different DTs.
> +        *
> +        * Unfortunately for us, the different revisions don't actually
> _use_
> +        * different DTs - instead, the proprietary stage0 bootloader
> reads the DT,
> +        * patches it in-memory, then passes the corrected DT to the OS.
> +        *
> +        * In our case, the OS is actually U-Boot, and U-Boot can choose to
> +        * completely disregard the firmware-supplied DT and load a custom
> one
> +        * instead, which is used by, e.g., NixOS.
> +        *
> +        * When that happens, the DT patches applied by the firmware are
> also
> +        * thrown out, which leads to BCM2711C0 boards being unable to boot
> +        * due to them trying to use the hardcoded DMA mappings in the DT
> +        * (which are for the B0 revision).
> +        *
> +        * Work around that by manually copying the DMA region setup from
> the
> +        * firmware-provided DT into whatever DT we're actually being asked
> +        * to load.
> +        A*/
> +       void *fw_fdt = (void *)fw_dtb_pointer;
> +       int fw_emmc_node;
> +       int our_emmc_node;
> +       int length;
> +       const void *fw_value;
> +       int result;
> +
> +       fw_emmc_node = fdt_path_offset(fw_fdt, "emmc2bus");
> +       if (fw_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in FW DT: %d\n",
> fw_emmc_node);
> +               return;
> +       }
> +
> +       our_emmc_node = fdt_path_offset(our_fdt, "emmc2bus");
> +       if (our_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in our DT: %d\n",
> our_emmc_node);
> +               return;
> +       }
> +
> +       *fw_value = fdt_getprop(fw_fdt, fw_emmc_node, "dma-ranges",
> &length);
> +       if (!fw_value) {
> +               printf("RPi: Failed to get EMMC DMA ranges property from
> FW DT: %d\n", length);
> +               return;
> +       }
> +
> +       result = fdt_setprop(our_fdt, our_emmc_node, "dma-ranges",
> fw_value, length);
> +       if (result != 0) {
> +               printf("RPi: Failed to set EMMC DMA ranges property in our
> DT: %d\n", result);
> +               return;
> +       }
> +
> +       printf("RPi: successfully copied FW DT EMMC configuration to our
> DT!\n");
> +}
> +
>  int ft_board_setup(void *blob, struct bd_info *bd)
>  {
>         int node;
> @@ -509,5 +570,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>                            EFI_RESERVED_MEMORY_TYPE);
>  #endif
>
> +       copy_emmc_config(blob);
> +
>         return 0;
>  }
> --
> 2.33.0
>
>
> --
> *François-Frédéric Ozog* | *Director Business Development*
> T: +33.67221.6485
> francois.ozog@linaro.org | Skype: ffozog
>
>
>

-- 
François-Frédéric Ozog | *Director Business Development*
T: +33.67221.6485
francois.ozog@linaro.org | Skype: ffozog

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT
       [not found]       ` <2894051632919727@iva2-957330f6752d.qloud-c.yandex.net>
@ 2021-09-29 13:03         ` François Ozog
  0 siblings, 0 replies; 4+ messages in thread
From: François Ozog @ 2021-09-29 13:03 UTC (permalink / raw)
  To: Ilya K
  Cc: Ilias Apalodimas, Ivan T. Ivanov, Marek Szyprowski,
	Matthias Brugger, Nicolas Saenz Julienne, Peter Robinson, u-boot

On Wed, 29 Sept 2021 at 14:51, Ilya K <me@0upti.me> wrote:

> Now that you mention EBBR: I've actually looked at what TianoCore does
> here, and they report different ACPI tables based on the SoC revision as
> well. It's probably a better option in the long run, but we already have
> people running NixOS on Pi4s the way it's currently set up, with u-boot and
> custom DTBs, so this might be an acceptable short term solution...
>
I am afraid so... The long run goal shall be clear though, hence I seized
the opportunity to re-state SystemReady guidelines.

>
> 15:46, September 29, 2021, "François Ozog" <francois.ozog@linaro.org>:
>
>
>
> On Wed, 29 Sept 2021 at 14:29, Ilya K <me@0upti.me> wrote:
>
> There is no DTB embedded in U-Boot here - the DTB comes from the
> distribution that U-Boot is booting (in my case NixOS, but it's likely
> other similar setups are affected as well).
>
> That's exactly what we (Arm/Linaro) try to avoid from now on with
> SystemReady: the DTB shall never come booted OS but is a trustable
> "property" of the board. You can look are
> https://arm-software.github.io/ebbr/ for more details. RISC-V community
> also adopted the specification to allow effective decoupling between the
> booted payloads and the firmware.
> Of course, non SystemReady systems can use whatever scheme they see fit.
> And that may be your case. But at the same time, I think there is a path to
> properly leverage the DTB provided by the Videocore firmware.
>
> The goal here is to have a generic image that can boot on both revisions
> of the board, and this is basically the only way to do that (outside of
> maybe adding a way to load an entire separate DT for the C0 revision, which
> will require lots of work on the distribution/kernel side as well). We
> could potentially just keep the firmware-provided DTB, and not load the
> distro-provided one, but this will be messy with mainline kernels, as those
> have diverged to use a somewhat different DT layout by now.
>
> Taking the firmware DTB is the new norm and I think Peter from Red Hat,
> who is in the Linaro group that deals with this firmware/OS interface may
> share his views (may be different from mine though ;-)
> Now for your particular case, it seems you may need to do what you
> described. I guess it is a call for Arm, Linaro, RPI foundation, Beagle
> foundation and 96Boards to get together on the SystemReady/DTB front.
>
>
>
> 29.09.2021, 14:43, "François Ozog" <francois.ozog@linaro.org>:
>
> Hi
>
> It looks real strange to ignore the authoritative entity and try to patch
> a wrong DTB embedded in U-Boot.
>
> Arm SystemReady is definitively aligning to the authoritative entities in
> the platform to give U-Boot the right basis on which it can apply
> additional overlays (providing it has a way to verify origin and integrity).
>
> Couldn’t you find a cleaner way to just leverage the previous boot DTB ?
> There is another discussion thread on similar thing with RISCV.
>
> Le mer. 29 sept. 2021 à 13:30, K900 <me@0upti.me> a écrit :
>
> We need this to boot with a custom DTB on BCM2711C0-based Pi 4s
>
> Signed-off-by: Ilya Katsnelson <me@0upti.me>
> ---
>  board/raspberrypi/rpi/rpi.c | 63 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 372b26b6f2..f074540091 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -495,6 +495,67 @@ void *board_fdt_blob_setup(void)
>         return (void *)fw_dtb_pointer;
>  }
>
> +void copy_emmc_config(void *our_fdt)
> +{
> +       /*
> +        * As of 2021-09-28, the Pi 4 has two different revisions, one
> using a
> +        * B0 stepping of the BCM2711 SoC, and one using a C0 stepping.
> +        *
> +        * The two SoC versions have different, incompatible DMA mappings
> for
> +        * the on-board eMMC controller, which would normally make them
> require
> +        * two different DTs.
> +        *
> +        * Unfortunately for us, the different revisions don't actually
> _use_
> +        * different DTs - instead, the proprietary stage0 bootloader
> reads the DT,
> +        * patches it in-memory, then passes the corrected DT to the OS.
> +        *
> +        * In our case, the OS is actually U-Boot, and U-Boot can choose to
> +        * completely disregard the firmware-supplied DT and load a custom
> one
> +        * instead, which is used by, e.g., NixOS.
> +        *
> +        * When that happens, the DT patches applied by the firmware are
> also
> +        * thrown out, which leads to BCM2711C0 boards being unable to boot
> +        * due to them trying to use the hardcoded DMA mappings in the DT
> +        * (which are for the B0 revision).
> +        *
> +        * Work around that by manually copying the DMA region setup from
> the
> +        * firmware-provided DT into whatever DT we're actually being asked
> +        * to load.
> +        A*/
> +       void *fw_fdt = (void *)fw_dtb_pointer;
> +       int fw_emmc_node;
> +       int our_emmc_node;
> +       int length;
> +       const void *fw_value;
> +       int result;
> +
> +       fw_emmc_node = fdt_path_offset(fw_fdt, "emmc2bus");
> +       if (fw_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in FW DT: %d\n",
> fw_emmc_node);
> +               return;
> +       }
> +
> +       our_emmc_node = fdt_path_offset(our_fdt, "emmc2bus");
> +       if (our_emmc_node < 0) {
> +               printf("RPi: Failed to find EMMC config in our DT: %d\n",
> our_emmc_node);
> +               return;
> +       }
> +
> +       *fw_value = fdt_getprop(fw_fdt, fw_emmc_node, "dma-ranges",
> &length);
> +       if (!fw_value) {
> +               printf("RPi: Failed to get EMMC DMA ranges property from
> FW DT: %d\n", length);
> +               return;
> +       }
> +
> +       result = fdt_setprop(our_fdt, our_emmc_node, "dma-ranges",
> fw_value, length);
> +       if (result != 0) {
> +               printf("RPi: Failed to set EMMC DMA ranges property in our
> DT: %d\n", result);
> +               return;
> +       }
> +
> +       printf("RPi: successfully copied FW DT EMMC configuration to our
> DT!\n");
> +}
> +
>  int ft_board_setup(void *blob, struct bd_info *bd)
>  {
>         int node;
> @@ -509,5 +570,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>                            EFI_RESERVED_MEMORY_TYPE);
>  #endif
>
> +       copy_emmc_config(blob);
> +
>         return 0;
>  }
> --
> 2.33.0
>
>
> --
> *François-Frédéric Ozog* | *Director Business Development*
> T: +33.67221.6485
> francois.ozog@linaro.org | Skype: ffozog
>
>
>
>
> --
> François-Frédéric Ozog | *Director Business Development*
> T: +33.67221.6485
> francois.ozog@linaro.org | Skype: ffozog
>
>
>
> --
> Sent from Yandex.Mail for mobile



-- 
François-Frédéric Ozog | *Director Business Development*
T: +33.67221.6485
francois.ozog@linaro.org | Skype: ffozog

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-09-29 13:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-29  6:47 [RFC PATCH] rpi: copy the EMMC controller configuration from firmware-supplied DT K900
2021-09-29 11:43 ` François Ozog
     [not found]   ` <167911632918339@mail.yandex.ru>
2021-09-29 12:46     ` François Ozog
     [not found]       ` <2894051632919727@iva2-957330f6752d.qloud-c.yandex.net>
2021-09-29 13:03         ` François Ozog

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).