public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pete Batard" <pete@akeo.ie>
To: Andrei Warkentin <andrey.warkentin@gmail.com>, devel@edk2.groups.io
Cc: ard.biesheuvel@arm.com, leif@nuviainc.com, philmd@redhat.com
Subject: Re: [edk2-platforms][PATCH 1/2] RPi: rip out FdtDxe logic to use internal DTB
Date: Fri, 1 May 2020 11:45:13 +0100	[thread overview]
Message-ID: <5e16e385-a0be-1f0b-b6a0-24d729de135a@akeo.ie> (raw)
In-Reply-To: <20200430211617.120926-2-andrey.warkentin@gmail.com>

Two non-blocking minor remarks inline:

On 2020.04.30 22:16, Andrei Warkentin wrote:
> Initially, FdtDxe used an internal (embedded in UEFI) FDT,
> because it was neither understood how to consume the
> one loaded by the VideoCore firmware, nor understood just
> how important it is to use the DTB provided by config.txt.
> 
> Embedding the DT was a bad idea, because:
> - Permanently stale
> - No overlays
> 
> Also, on devices like the Pi 4 you _have_ to have a DT
> around for the start4 VPU firmware to pick up, otherwise
> the board is left in an inconsistent state. So we're being
> proscriptive now about DT use with config.txt, which means
> this internal DT logic is deadc code.
> 
> Further FdtDxe cleanups are possible and will be handled
> separately, specifically:
> - probably no need to use a separate allocation for patched DT (optimize memory used)
> - suspicious use of EfiBootServicesData (I filed https://github.com/ARM-software/ebbr/issues/45 to sort out the real requirements)
> 
> Testing: Booted Ubuntu 18.04 on Pi 2B (1.2).
> 
> Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
> ---
>   Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c   | 206 ++++----------------
>   Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf |   4 -
>   Platform/RaspberryPi/RPi3/RPi3.fdf             |  11 --
>   Platform/RaspberryPi/RPi4/RPi4.fdf             |   8 -
>   Platform/RaspberryPi/RaspberryPi.dec           |   7 -
>   5 files changed, 38 insertions(+), 198 deletions(-)
> 
> diff --git a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
> index e7143f57..187b9566 100644
> --- a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
> +++ b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
> @@ -335,90 +335,6 @@ CleanSimpleFramebuffer (
>     return EFI_SUCCESS;
>   }
>   
> -#define MAX_CMDLINE_SIZE    512
> -
> -STATIC
> -EFI_STATUS
> -UpdateBootArgs (
> -  VOID
> -  )
> -{
> -  INTN          Node;
> -  INTN          Retval;
> -  EFI_STATUS    Status;
> -  CHAR8         *CommandLine;
> -
> -  //
> -  // Locate the /chosen node
> -  //
> -  Node = fdt_path_offset (mFdtImage, "/chosen");
> -  if (Node < 0) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to locate /chosen node\n", __FUNCTION__));
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  //
> -  // If /chosen/bootargs already exists, we want to add a space character
> -  // before adding the firmware supplied arguments. However, the RpiFirmware
> -  // protocol expects a 32-bit aligned buffer. So let's allocate 4 bytes of
> -  // slack, and skip the first 3 when passing this buffer into libfdt.
> -  //
> -  CommandLine = AllocatePool (MAX_CMDLINE_SIZE) + 4;
> -  if (!CommandLine) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to allocate memory\n", __FUNCTION__));
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  //
> -  // Get the command line from the firmware
> -  //
> -  Status = mFwProtocol->GetCommandLine (MAX_CMDLINE_SIZE, CommandLine + 4);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to retrieve command line\n", __FUNCTION__));
> -    return Status;
> -  }
> -
> -  if (AsciiStrLen (CommandLine + 4) == 0) {
> -    DEBUG ((DEBUG_INFO, "%a: empty command line received\n", __FUNCTION__));
> -    return EFI_SUCCESS;
> -  }
> -
> -  CommandLine[3] = ' ';
> -
> -  Retval = fdt_appendprop_string (mFdtImage, Node, "bootargs", &CommandLine[3]);
> -  if (Retval != 0) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to set /chosen/bootargs property (%d)\n",
> -      __FUNCTION__, Retval));
> -  }
> -
> -  DEBUG_CODE_BEGIN ();
> -    CONST CHAR8    *Prop;
> -    INT32         Length;
> -    INT32         Index;
> -
> -    Node = fdt_path_offset (mFdtImage, "/chosen");
> -    ASSERT (Node >= 0);
> -
> -    Prop = fdt_getprop (mFdtImage, Node, "bootargs", &Length);
> -    ASSERT (Prop != NULL);
> -
> -    DEBUG ((DEBUG_INFO, "Command line set from firmware (length %d):\n'", Length));
> -
> -    for (Index = 0; Index < Length; Index++, Prop++) {
> -      if (*Prop == '\0') {
> -        continue;
> -      }
> -      DEBUG ((DEBUG_INFO, "%c", *Prop));
> -    }
> -
> -    DEBUG ((DEBUG_INFO, "'\n"));
> -  DEBUG_CODE_END ();
> -
> -  FreePool (CommandLine - 4);
> -  return EFI_SUCCESS;
> -}
> -
> -
>   /**
>     @param  ImageHandle   of the loaded driver
>     @param  SystemTable   Pointer to the System Table
> @@ -435,13 +351,10 @@ FdtDxeInitialize (
>     IN EFI_SYSTEM_TABLE   *SystemTable
>     )
>   {
> +  INT32      Retval;
>     EFI_STATUS Status;
> -  EFI_GUID   *FdtGuid;
> -  VOID       *FdtImage;
>     UINTN      FdtSize;
> -  INT32      Retval;
> -  UINT32     BoardRevision;
> -  BOOLEAN    Internal;
> +  VOID       *FdtImage = NULL;

I don't believe the NULL assignation is needed...

>   
>     if (PcdGet32 (PcdOptDeviceTree) == 0) {
>       DEBUG ((DEBUG_INFO, "Device Tree disabled per user configuration\n"));
> @@ -450,77 +363,28 @@ FdtDxeInitialize (
>   
>     Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid, NULL,
>                     (VOID**)&mFwProtocol);
> -  ASSERT_EFI_ERROR (Status);
> +  if (mFwProtocol == NULL) {
> +    /*
> +     * Impossible because of the depex...
> +     */
> +    ASSERT_EFI_ERROR (Status);
> +    return EFI_NOT_FOUND;
> +  }
>   
> -  Internal = FALSE;
>     FdtImage = (VOID*)(UINTN)PcdGet32 (PcdFdtBaseAddress);

...since no code actually uses that variable before we assign it here. 
But I don't see a problem keeping it.

>     Retval = fdt_check_header (FdtImage);
> -  if (Retval == 0) {
> -    /*
> -     * Have FDT passed via config.txt.
> -     */
> -    FdtSize = fdt_totalsize (FdtImage);
> -    DEBUG ((DEBUG_INFO, "Device Tree passed via config.txt (0x%lx bytes)\n", FdtSize));
> -    Status = EFI_SUCCESS;
> -  } else {
> -    /*
> -     * Use one of the embedded FDT's.
> -     */
> -    Internal = TRUE;
> -    DEBUG ((DEBUG_INFO, "No/Bad Device Tree found at address 0x%p (%a), "
> -      "looking up internal one...\n", FdtImage, fdt_strerror (Retval)));
> +  if (Retval != 0) {
>       /*
> -     * Query the board revision to differentiate between models.
> +     * Any one of:
> +     * - Invalid config.txt device_tree_address (not PcdFdtBaseAddress)
> +     * - Missing FDT for your Pi variant (if not overriding via device_tree=)
>        */
> -    Status = mFwProtocol->GetModelRevision (&BoardRevision);
> -    if (EFI_ERROR (Status)) {
> -      DEBUG ((DEBUG_ERROR, "Failed to get board type: %r\n", Status));
> -      DEBUG ((DEBUG_INFO, "Using default internal Device Tree\n"));
> -      FdtGuid = &gRaspberryPiDefaultFdtGuid;
> -    } else {
> -      // www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
> -      switch ((BoardRevision >> 4) & 0xFF) {
> -      case 0x08:
> -        DEBUG ((DEBUG_INFO, "Using Raspberry Pi 3 Model B internal Device Tree\n"));
> -        FdtGuid = &gRaspberryPi3ModelBFdtGuid;
> -        break;
> -      case 0x0D:
> -        DEBUG ((DEBUG_INFO, "Using Raspberry Pi 3 Model B+ internal Device Tree\n"));
> -        FdtGuid = &gRaspberryPi3ModelBPlusFdtGuid;
> -        break;
> -      case 0x11:
> -        DEBUG ((DEBUG_INFO, "Using Raspberry Pi 4 Model B internal Device Tree\n"));
> -        FdtGuid = &gRaspberryPi4ModelBFdtGuid;
> -        break;
> -      default:
> -        DEBUG ((DEBUG_INFO, "Using default internal Device Tree\n"));
> -        FdtGuid = &gRaspberryPiDefaultFdtGuid;
> -        break;
> -      }
> -    }
> -    do {
> -      Status = GetSectionFromAnyFv (FdtGuid, EFI_SECTION_RAW, 0, &FdtImage, &FdtSize);
> -      if (Status == EFI_SUCCESS) {
> -        if (fdt_check_header (FdtImage) != 0) {
> -          Status = EFI_INCOMPATIBLE_VERSION;
> -        }
> -      }
> -      // No retry needed if we are successful or are dealing with the default Fdt.
> -      if ( (Status == EFI_SUCCESS) ||
> -           (CompareGuid (FdtGuid, &gRaspberryPiDefaultFdtGuid)) )
> -        break;
> -      // Otherwise, try one more time with the default Fdt. An example of this
> -      // is if we detected a non-default Fdt, that isn't included in the FDF.
> -      DEBUG ((DEBUG_INFO, "Internal Device Tree was not found for this platform, "
> -        "falling back to default...\n"));
> -      FdtGuid = &gRaspberryPiDefaultFdtGuid;
> -    } while (1);
> +    DEBUG ((DEBUG_ERROR, "No devicetree passed via config.txt\n"));
> +    return EFI_NOT_FOUND;
>     }
>   
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "Failed to locate Device Tree: %r\n", Status));
> -    return Status;
> -  }
> +  FdtSize = fdt_totalsize (FdtImage);
> +  DEBUG ((DEBUG_INFO, "Devicetree passed via config.txt (0x%lx bytes)\n", FdtSize));

If we're going to modify that line, maybe we want to switch to using 
'%ld' instead of '0x%lx' as hex sizes aren't enormously helpful when 
dealing with user-handled files.

But that's not something I want to respin this patch for, especially for 
debug output, so 0x%lx is fine too.

>   
>     /*
>      * Probably overkill.
> @@ -529,12 +393,19 @@ FdtDxeInitialize (
>     Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData,
>                     EFI_SIZE_TO_PAGES (FdtSize), (EFI_PHYSICAL_ADDRESS*)&mFdtImage);
>     if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "Failed to allocate Device Tree: %r\n", Status));
> -    return Status;
> +    DEBUG ((DEBUG_ERROR, "Failed to allocate devicetree: %r\n", Status));
> +    goto out;
>     }
>   
>     Retval = fdt_open_into (FdtImage, mFdtImage, FdtSize);
> -  ASSERT (Retval == 0);
> +  if (Retval != 0) {
> +     DEBUG ((DEBUG_ERROR, "fdt_open_into failed: %d\n", Retval));
> +     goto out;
> +  }
> +
> +  /*
> +   * These are all best-effort.
> +   */
>   
>     Status = SanitizePSCI ();
>     if (EFI_ERROR (Status)) {
> @@ -566,19 +437,18 @@ FdtDxeInitialize (
>       Print (L"Failed to update USB compatible properties: %r\n", Status);
>     }
>   
> -  if (Internal) {
> -    /*
> -     * A GPU-provided DTB already has the full command line.
> -     */
> -    Status = UpdateBootArgs ();
> -    if (EFI_ERROR (Status)) {
> -      Print (L"Failed to update boot arguments: %r\n", Status);
> -    }
> -  }
> -
> -  DEBUG ((DEBUG_INFO, "Installed Device Tree at address 0x%p\n", mFdtImage));
> +  DEBUG ((DEBUG_INFO, "Installed devicetree at address %p\n", mFdtImage));
>     Status = gBS->InstallConfigurationTable (&gFdtTableGuid, mFdtImage);
> -  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +     DEBUG ((DEBUG_ERROR, "Couldn't register devicetree: %r\n", Status));
> +     goto out;
> +  }
>   
> +out:
> +  if (EFI_ERROR(Status)) {
> +    if (mFdtImage != NULL) {
> +      gBS->FreePages ((EFI_PHYSICAL_ADDRESS) mFdtImage, EFI_SIZE_TO_PAGES (FdtSize));
> +    }
> +  }
>     return Status;
>   }
> diff --git a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
> index fc37353f..49ba5ba1 100644
> --- a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
> +++ b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
> @@ -35,10 +35,6 @@
>   
>   [Guids]
>     gFdtTableGuid
> -  gRaspberryPi3ModelBFdtGuid
> -  gRaspberryPi3ModelBPlusFdtGuid
> -  gRaspberryPi4ModelBFdtGuid
> -  gRaspberryPiDefaultFdtGuid
>   
>   [Protocols]
>     gRaspberryPiFirmwareProtocolGuid              ## CONSUMES
> diff --git a/Platform/RaspberryPi/RPi3/RPi3.fdf b/Platform/RaspberryPi/RPi3/RPi3.fdf
> index daedc443..e854cd21 100644
> --- a/Platform/RaspberryPi/RPi3/RPi3.fdf
> +++ b/Platform/RaspberryPi/RPi3/RPi3.fdf
> @@ -303,17 +303,6 @@ READ_LOCK_STATUS   = TRUE
>     #
>     INF Platform/RaspberryPi/Drivers/LogoDxe/LogoDxe.inf
>   
> -  #
> -  # Device Tree support (used by FdtDxe)
> -  # GUIDs should match gRaspberryPi#####FdtGuid's from the .dec
> -  #
> -  FILE FREEFORM = DF5DA223-1D27-47C3-8D1B-9A41B55A18BC {
> -    SECTION RAW = Platform/RaspberryPi/$(PLATFORM_NAME)/DeviceTree/bcm2710-rpi-3-b.dtb
> -  }
> -  FILE FREEFORM = 3D523012-73FE-40E5-892E-1A4DF60F3C0C {
> -    SECTION RAW = Platform/RaspberryPi/$(PLATFORM_NAME)/DeviceTree/bcm2710-rpi-3-b-plus.dtb
> -  }
> -
>   [FV.FVMAIN_COMPACT]
>   FvAlignment        = 16
>   ERASE_POLARITY     = 1
> diff --git a/Platform/RaspberryPi/RPi4/RPi4.fdf b/Platform/RaspberryPi/RPi4/RPi4.fdf
> index c3e9cfc4..b1f7aa23 100644
> --- a/Platform/RaspberryPi/RPi4/RPi4.fdf
> +++ b/Platform/RaspberryPi/RPi4/RPi4.fdf
> @@ -307,14 +307,6 @@ READ_LOCK_STATUS   = TRUE
>     #
>     INF Platform/RaspberryPi/Drivers/LogoDxe/LogoDxe.inf
>   
> -  #
> -  # Device Tree support (used by FdtDxe)
> -  # GUIDs should match gRaspberryPi#####FdtGuid's from the .dec
> -  #
> - FILE FREEFORM = 80AB6833-CAE4-4CEE-B59D-EB2039B05551 {
> -    SECTION RAW = Platform/RaspberryPi/$(PLATFORM_NAME)/DeviceTree/bcm2711-rpi-4-b.dtb
> -  }
> -
>   [FV.FVMAIN_COMPACT]
>   FvAlignment        = 16
>   ERASE_POLARITY     = 1
> diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec
> index b66322be..66ef6186 100644
> --- a/Platform/RaspberryPi/RaspberryPi.dec
> +++ b/Platform/RaspberryPi/RaspberryPi.dec
> @@ -26,13 +26,6 @@
>     gRaspberryPiTokenSpaceGuid = {0xCD7CC258, 0x31DB, 0x11E6, {0x9F, 0xD3, 0x63, 0xB0, 0xB8, 0xEE, 0xD6, 0xB5}}
>     gRaspberryPiEventResetGuid = {0xCD7CC258, 0x31DB, 0x11E6, {0x9F, 0xD3, 0x63, 0xB4, 0xB4, 0xE4, 0xD4, 0xB4}}
>     gConfigDxeFormSetGuid = {0xCD7CC258, 0x31DB, 0x22E6, {0x9F, 0x22, 0x63, 0xB0, 0xB8, 0xEE, 0xD6, 0xB5}}
> -  # GUIDs used by FdtDxe to serve a Device Tree at runtime. Not all of these need to apply
> -  # to the current platform or match an actual FDF binary, but they need to be defined.
> -  gRaspberryPi3ModelBFdtGuid = { 0xDF5DA223, 0x1D27, 0x47C3, { 0x8D, 0x1B, 0x9A, 0x41, 0xB5, 0x5A, 0x18, 0xBC } }
> -  gRaspberryPi3ModelBPlusFdtGuid = { 0x3D523012, 0x73FE, 0x40E5, { 0x89, 0x2E, 0x1A, 0x4D, 0xF6, 0x0F, 0x3C, 0x0C } }
> -  gRaspberryPi4ModelBFdtGuid = { 0x80AB6833, 0xCAE4, 0x4CEE, { 0xB5, 0x9D, 0xEB, 0x20, 0x39, 0xB0, 0x55, 0x51 } }
> -  # Default Fdt to serve if the hardware model can't be detected. Should match one of the above.
> -  gRaspberryPiDefaultFdtGuid = {0xDF5DA223, 0x1D27, 0x47C3, { 0x8D, 0x1B, 0x9A, 0x41, 0xB5, 0x5A, 0x18, 0xBC}}
>   
>   [PcdsFixedAtBuild.common]
>     #
> 

Reviewed-by: Pete Batard <pete@akeo.ie>
Tested-on: Pi 3B, Pi 3B+, Pi 4B, with and without a Device Tree provided

  reply	other threads:[~2020-05-01 10:45 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-30 21:16 [edk2-platforms][PATCH 0/2] Rip out "internal DTB" support in FdtDxe Andrei Warkentin
2020-04-30 21:16 ` [edk2-platforms][PATCH 1/2] RPi: rip out FdtDxe logic to use internal DTB Andrei Warkentin
2020-05-01 10:45   ` Pete Batard [this message]
2020-05-01 13:19   ` Ard Biesheuvel
2020-05-01 15:11     ` Pete Batard
2020-05-01 15:13       ` Ard Biesheuvel
2020-05-01 15:16         ` Pete Batard
2020-05-01 16:56           ` [edk2-devel] " Andrei Warkentin
2020-05-01 17:04             ` Ard Biesheuvel
2020-04-30 21:16 ` [edk2-platforms][PATCH 2/2] RPi: remove any mention of an "internal DTB" Andrei Warkentin
2020-05-01 10:47   ` Pete Batard
2020-05-01 17:08 ` [edk2-platforms][PATCH 0/2] Rip out "internal DTB" support in FdtDxe Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5e16e385-a0be-1f0b-b6a0-24d729de135a@akeo.ie \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox