public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Abdul Lateef Attar via groups.io" <AbdulLateef.Attar=amd.com@groups.io>
To: devel@edk2.groups.io, ndhillon@marvell.com
Cc: quic_llindhol@quicinc.com, mw@semihalf.com, sbalcerak@marvell.com
Subject: Re: [edk2-devel] [edk2-platforms PATCH v3 5/7] Silicon/Marvell: Driver to publish device tree
Date: Fri, 08 Mar 2024 07:57:49 -0800	[thread overview]
Message-ID: <d749655e-4c4a-43dc-9094-f5dd75fa273d@amd.com> (raw)
In-Reply-To: <20240118011817.4348-6-ndhillon@marvell.com>

[-- Attachment #1: Type: text/plain, Size: 12670 bytes --]

Hi Narinder,
     Patch looks good with minor comment inline.
Thanks
AbduL

On 18-01-2024 06:48, Narinder Dhillon via groups.io wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
>
>
> From: Narinder Dhillon<ndhillon@marvell.com>
>
> This patch adds driver that can provide device tree to OS if user so
> wishes. PCD's are used to enable this, default is not to take this
> action.
>
> Signed-off-by: Narinder Dhillon<ndhillon@marvell.com>
> ---
>   .../Drivers/Fdt/FdtPlatformDxe/FdtPlatform.c  | 259 ++++++++++++++++++
>   .../Fdt/FdtPlatformDxe/FdtPlatformDxe.inf     |  49 ++++
>   .../MarvellSiliconPkg/MarvellSiliconPkg.dec   |  20 ++
>   3 files changed, 328 insertions(+)
>   create mode 100644 Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatform.c
>   create mode 100644 Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatformDxe.inf
>
> diff --git a/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatform.c b/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatform.c
> new file mode 100644
> index 0000000000..cc3b853dff
> --- /dev/null
> +++ b/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatform.c
> @@ -0,0 +1,259 @@
> +/** @file
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +https://spdx.org/licenses
> +
> +  Copyright (C) 2023 Marvell
> +
> +  Copyright (c) 2015, ARM Ltd. All rights reserved.<BR>
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <Library/PcdLib.h>
> +#include <Library/BdsLib.h>
> +#include <Pi/PiBootMode.h>
> +#include <Pi/PiHob.h>
> +#include <Library/HobLib.h>
> +#include <Library/HiiLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +
> +#include <Guid/FdtHob.h>
> +#include <libfdt.h>
> +
> +//
> +// Internal variables
> +//
> +
> +VOID       *mFdtBlobBase;
> +
> +EFI_STATUS
> +DeleteFdtNode (
> +  IN  VOID    *FdtAddr,
> +  CONST CHAR8 *NodePath,
> +  CONST CHAR8 *Compatible
> +)
> +{
> +  INTN        Offset = -1;
> +  INTN        Return;
> +
> +  if ((NodePath != NULL) && (Compatible != NULL)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (NodePath != NULL) {
> +    Offset = fdt_path_offset (FdtAddr, NodePath);
> +
> +    DEBUG ((DEBUG_INFO, "Offset: %d\n", Offset));
> +
> +    if (Offset < 0) {
> +      DEBUG ((DEBUG_ERROR, "Error getting the device node %a offset: %a\n",
> +              NodePath, fdt_strerror (Offset)));
> +      return EFI_NOT_FOUND;
> +    }
> +  }
> +
> +  if (Compatible != NULL) {
> +    Offset = fdt_node_offset_by_compatible (FdtAddr, -1, Compatible);
> +
> +    DEBUG ((DEBUG_INFO, "Offset: %d\n", Offset));
> +
> +    if (Offset < 0) {
> +      DEBUG ((DEBUG_ERROR, "Error getting the device node for %a offset: %a\n",
> +              Compatible, fdt_strerror (Offset)));
> +      return EFI_NOT_FOUND;
> +    }
> +  }
> +
> +  if (Offset >= 0) {
> +    Return = fdt_del_node (FdtAddr, Offset);
> +
> +    DEBUG ((DEBUG_INFO, "Return: %d\n", Return));
> +
> +    if (Return < 0) {
> +      DEBUG ((DEBUG_ERROR, "Error deleting the device node %a: %a\n",
> +              NodePath, fdt_strerror (Return)));
> +      return EFI_NOT_FOUND;
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +DeleteRtcNode (
> +  IN  VOID    *FdtAddr
> +  )
> +{
> +  INT32 Offset, NameLen, Return;
> +  BOOLEAN Found;
> +  CONST CHAR8 *Name;
> +
> +  Found = FALSE;
> +  for (Offset = fdt_next_node(FdtAddr, 0, NULL);
> +    Offset >= 0;
> +    Offset = fdt_next_node(FdtAddr, Offset, NULL)) {
> +
> +    Name = fdt_get_name(FdtAddr, Offset, &NameLen);
> +    if (!Name) {
> +      continue;
> +    }
> +
> +    if ((Name[0] == 'r') && (Name[1] == 't') && (Name[2] == 'c')) {
> +      Found = TRUE;
> +      break;
> +    }
> +  }
> +
> +  if (Found == TRUE) {
> +    Return = fdt_del_node (FdtAddr, Offset);
> +
> +    if (Return < 0) {
> +      DEBUG ((DEBUG_ERROR, "Error deleting the device node %a\n", Name));
> +      return EFI_NOT_FOUND;
> +    }
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FdtFixup(
> +  IN VOID *FdtAddr
> +  )
> +{
> +  EFI_STATUS Status = EFI_SUCCESS;
> +
> +  if (FeaturePcdGet(PcdFixupFdt)) {
> +    Status |= DeleteFdtNode (FdtAddr, (CHAR8*)PcdGetPtr (PcdFdtConfigRootNode), NULL);
> +
> +    // Hide the RTC
> +    Status |= DeleteRtcNode (FdtAddr);
> +  }
> +
> +  if (!EFI_ERROR(Status)) {
> +    fdt_pack(FdtAddr);
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Install the FDT specified by its device path in text form.
> +
> +  @retval  EFI_SUCCESS            The FDT was installed.
> +  @retval  EFI_NOT_FOUND          Failed to locate a protocol or a file.
> +  @retval  EFI_INVALID_PARAMETER  Invalid device path.
> +  @retval  EFI_UNSUPPORTED        Device path not supported.
> +  @retval  EFI_OUT_OF_RESOURCES   An allocation failed.
> +**/
> +STATIC
> +EFI_STATUS
> +InstallFdt (
> +    VOID
> +)
> +{
> +  EFI_STATUS                          Status;
> +  UINTN                               FdtBlobSize;
> +  VOID                                *FdtConfigurationTableBase;
> +  VOID                                *HobList;
> +  EFI_HOB_GUID_TYPE                   *GuidHob;
> +
> +  //
> +  // Get the HOB list.  If it is not present, then ASSERT.
> +  //
> +  HobList = GetHobList ();
> +  ASSERT (HobList != NULL);
> +
> +  //
> +  // Search for FDT GUID HOB.  If it is not present, then
> +  // there's nothing we can do. It may not exist on the update path.
> +  //
> +  GuidHob = GetNextGuidHob (&gFdtHobGuid, HobList);
> +  if (GuidHob != NULL) {
> +    mFdtBlobBase = (VOID *)*(UINT64 *)(GET_GUID_HOB_DATA (GuidHob));
> +    FdtBlobSize = fdt_totalsize((VOID *)mFdtBlobBase);
> +
> +    //
> +    // Ensure that the FDT header is valid and that the Size of the Device Tree
> +    // is smaller than the size of the read file
> +    //
> +    if (fdt_check_header (mFdtBlobBase)) {
> +        DEBUG ((DEBUG_ERROR, "InstallFdt() - FDT blob seems to be corrupt\n"));
> +        mFdtBlobBase = NULL;
> +        Status = EFI_LOAD_ERROR;
> +        goto Error;
> +    }
> +  } else {
> +    Status = EFI_NOT_FOUND;
> +    goto Error;
> +  }
> +
> +  Status = EFI_SUCCESS;
> +
> +  if (FeaturePcdGet(PcdPublishFdt)) {
> +    FdtConfigurationTableBase = AllocateRuntimeCopyPool (FdtBlobSize, mFdtBlobBase);
> +
> +    if (FdtConfigurationTableBase == NULL) {
> +        goto Error;
> +    }
> +
> +    Status = FdtFixup((VOID*)FdtConfigurationTableBase);
> +
> +    if (EFI_ERROR (Status)) {
> +      FreePool (FdtConfigurationTableBase);
> +      goto Error;
> +    }
> +
> +    //
> +    // Install the FDT into the Configuration Table
> +    //
> +    Status = gBS->InstallConfigurationTable (
> +                  &gFdtTableGuid,
> +                  FdtConfigurationTableBase
> +                );
> +
> +    if (EFI_ERROR (Status)) {
> +      FreePool (FdtConfigurationTableBase);
> +    }
> +  }
> +
> +Error:
> +  return Status;
> +}
> +
> +/**
> +  Main entry point of the FDT platform driver.
> +
> +  @param[in]  ImageHandle   The firmware allocated handle for the present driver
> +                            UEFI image.
> +  @param[in]  *SystemTable  A pointer to the EFI System table.
> +
> +  @retval  EFI_SUCCESS           The driver was initialized.
> +  @retval  EFI_OUT_OF_RESOURCES  The "End of DXE" event could not be allocated or
> +                                 there was not enough memory in pool to install
> +                                 the Shell Dynamic Command protocol.
> +  @retval  EFI_LOAD_ERROR        Unable to add the HII package.
> +
> +**/
> +EFI_STATUS
> +FdtPlatformEntryPoint (
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  //
> +  // Install the Device Tree from its expected location
> +  //

[Abdul] check the PCD for publishing the FDT instead of checking in 
InstallFdt()

Table will be published only if the feature is enabled.

if (FeaturePcdGet(PcdPublishFdt)) {
	
  InstallFdt ();

}

> +  Status = InstallFdt ();
> +
> +  ASSERT_EFI_ERROR(Status);
> +
> +  return Status;
> +}
> diff --git a/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatformDxe.inf b/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatformDxe.inf
> new file mode 100644
> index 0000000000..4e254f17cb
> --- /dev/null
> +++ b/Silicon/Marvell/Drivers/Fdt/FdtPlatformDxe/FdtPlatformDxe.inf
> @@ -0,0 +1,49 @@
> +#/** @file
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#https://spdx.org/licenses
> +#
> +#  Copyright (C) 2023 Marvell
> +#
> +#  Copyright (c) 2015, ARM Ltd. All rights reserved.<BR>
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION     = 0x00010006
> +  BASE_NAME       = FdtPlatformDxe
> +  FILE_GUID       = 6e9a4c69-57c6-4fcd-b083-4f2c3bdb6051
> +  MODULE_TYPE     = UEFI_DRIVER
> +  VERSION_STRING  = 0.1
> +  ENTRY_POINT     = FdtPlatformEntryPoint
> +
> +[Sources.common]
> +  FdtPlatform.c
> +
> +[Packages]
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  Platform/ARM/ARM.dec
> +  Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec
> +
> +[LibraryClasses]
> +  UefiDriverEntryPoint
> +  BaseMemoryLib
> +  DebugLib
> +  FdtLib
> +  HobLib
> +
> +[Guids]
> +  gFdtHobGuid
> +  gFdtTableGuid
> +
> +[FeaturePcd]
> +  gMarvellSiliconTokenSpaceGuid.PcdPublishFdt
> +  gMarvellSiliconTokenSpaceGuid.PcdFixupFdt
> +
> +[FixedPcd]
> +  gMarvellSiliconTokenSpaceGuid.PcdFdtConfigRootNode
> +
> +[Depex]
> +  TRUE
> diff --git a/Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec b/Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec
> index 1e17152f13..d3106f0c5d 100644
> --- a/Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec
> +++ b/Silicon/Marvell/MarvellSiliconPkg/MarvellSiliconPkg.dec
> @@ -28,6 +28,7 @@
>     gShellEepromHiiGuid = { 0xb2f4c714, 0x147f, 0x4ff7, { 0x82, 0x1b, 0xce, 0x7b, 0x91, 0x7f, 0x5f, 0x2f } }
>     gShellFUpdateHiiGuid = { 0x9b5d2176, 0x590a, 0x49db, { 0x89, 0x5d, 0x4a, 0x70, 0xfe, 0xad, 0xbe, 0x24 } }
>     gShellSfHiiGuid = { 0x03a67756, 0x8cde, 0x4638, { 0x82, 0x34, 0x4a, 0x0f, 0x6d, 0x58, 0x81, 0x39 } }
> +  gShellDumpFdtHiiGuid = { 0x8afa7610, 0x62b1, 0x46aa, { 0xb5, 0x34, 0xc3, 0xde, 0xff, 0x39, 0x77, 0x8c } }
>
>   [LibraryClasses]
>     ArmadaBoardDescLib|Include/Library/ArmadaBoardDescLib.h
> @@ -42,6 +43,8 @@
>     # that depend on the lowlevel platform initialization having been completed
>     gMarvellPlatformInitCompleteProtocolGuid = { 0x465b8cf7, 0x016f, 0x4ba6, { 0xbe, 0x6b, 0x28, 0x0e, 0x3a, 0x7d, 0x38, 0x6f } }
>
> +  gMrvlFdtClientProtocolGuid = { 0xE11FACA0, 0x4710, 0x4C8E, { 0xA7, 0xA2, 0x01, 0xBA, 0xA2, 0x59, 0x1B, 0x4C } }
> +
>   [PcdsFixedAtBuild.common]
>   #Board description
>     gMarvellSiliconTokenSpaceGuid.PcdMaxCpCount|0x2|UINT8|0x30000072
> @@ -198,6 +201,23 @@
>     gMarvellSiliconTokenSpaceGuid.PcdOpTeeRegionBase|0x0|UINT64|0x50000004
>     gMarvellSiliconTokenSpaceGuid.PcdOpTeeRegionSize|0x0|UINT32|0x50000005
>
> +# FDT
> +  # FDT configuration node to be stripped before passing to OS
> +  gMarvellSiliconTokenSpaceGuid.PcdFdtConfigRootNode|"/marvell,ebf"|VOID*|0x50000090
> +
> +  gMarvellSiliconTokenSpaceGuid.PcdNodeDramBase|0x10000000000|UINT64|0x00000004
> +  gMarvellSiliconTokenSpaceGuid.PcdIoBaseAddress|0x800000000000|UINT64|0x00000005
> +  gMarvellSiliconTokenSpaceGuid.PcdNodeIoBaseAddress|0x100000000000|UINT64|0x00000006
> +  gMarvellSiliconTokenSpaceGuid.PcdIoSize|0xF0000000000|UINT64|0x00000007
> +
> +  gMarvellSiliconTokenSpaceGuid.PcdGtiWatchdogBase64|0x802000000000|UINT64|0x00000008
> +
> +[PcdsFeatureFlag.common]
> +  # Publish FDT to the OS as Configuration Table with gFdtTableGuid
> +  gMarvellSiliconTokenSpaceGuid.PcdPublishFdt|FALSE|BOOLEAN|0x50000091
> +  # Fixup the FDT or not (taken into consideration only when PcdPublishFdt = TRUE)
> +  gMarvellSiliconTokenSpaceGuid.PcdFixupFdt|TRUE|BOOLEAN|0x50000092
> +
>   [Protocols]
>     gMarvellBoardDescProtocolGuid            = { 0xebed8738, 0xd4a6, 0x4001, { 0xa9, 0xc9, 0x52, 0xb0, 0xcb, 0x7d, 0xdb, 0xf9 }}
>     gMarvellEepromProtocolGuid               = { 0x71954bda, 0x60d3, 0x4ef8, { 0x8e, 0x3c, 0x0e, 0x33, 0x9f, 0x3b, 0xc2, 0x2b }}
> --
> 2.34.1
>
>
>
> 
>
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116550): https://edk2.groups.io/g/devel/message/116550
Mute This Topic: https://groups.io/mt/103800162/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



[-- Attachment #2: Type: text/html, Size: 13665 bytes --]

  reply	other threads:[~2024-03-08 15:57 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-18  1:18 [edk2-devel] [edk2-platforms PATCH v3 0/7] Silicon/Marvell/OdysseyPkg Narinder Dhillon
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 1/7] Silicon/Marvell: New Marvell Odyssey processor Narinder Dhillon
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 2/7] Silicon/Marvell: Odyssey SmcLib Narinder Dhillon
2024-03-08 15:29   ` Abdul Lateef Attar via groups.io
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 3/7] Silicon/Marvell: Odyssey watchdog driver Narinder Dhillon
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 4/7] Silicon/Marvell: Device tree driver Narinder Dhillon
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 5/7] Silicon/Marvell: Driver to publish device tree Narinder Dhillon
2024-03-08 15:57   ` Abdul Lateef Attar via groups.io [this message]
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 6/7] Silicon/Marvell: Command to dump " Narinder Dhillon
2024-01-18  1:18 ` [edk2-devel] [edk2-platforms PATCH v3 7/7] Silicon/Marvell: Odyssey project description files Narinder Dhillon

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=d749655e-4c4a-43dc-9094-f5dd75fa273d@amd.com \
    --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