public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pete Batard" <pete@akeo.ie>
To: Ard Biesheuvel <ard.biesheuvel@arm.com>,
	Andrei Warkentin <andrey.warkentin@gmail.com>,
	devel@edk2.groups.io
Cc: 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 16:11:28 +0100	[thread overview]
Message-ID: <4538b8ec-dc41-ec16-2ef5-011be3e90849@akeo.ie> (raw)
In-Reply-To: <77f961d0-55a2-4e85-f8e6-478c6499cd21@arm.com>

On 2020.05.01 14:19, Ard Biesheuvel wrote:
> On 4/30/20 11:16 PM, 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;
>>     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;
>> +  }
> 
> Do we need this change?

Looking at what we are doing elsewhere, I thing we should go with:

   ASSERT_EFI_ERROR (Status);
   if (EFI_ERROR (Status)) {
     return Status;
   }

The ASSERT_EFI_ERROR () on its own was not enough for RELEASE, so we 
definitely want to return an error code here if needed, and I guess 
that, technically, we could consider that LocateProtocol () may succeed 
and return a NULL value for mFwProtocol, but I doubt that's a valid 
consideration.

Regards,

/Pete

> 
>> -  Internal = FALSE;
>>     FdtImage = (VOID*)(UINTN)PcdGet32 (PcdFdtBaseAddress);
>>     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));
>>     /*
>>      * 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]
>>     #
>>
> 


  reply	other threads:[~2020-05-01 15:11 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
2020-05-01 13:19   ` Ard Biesheuvel
2020-05-01 15:11     ` Pete Batard [this message]
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=4538b8ec-dc41-ec16-2ef5-011be3e90849@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