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 > > 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 > --- > .../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.
> + > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +// > +// 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.
> +# > +#**/ > + > +[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] -=-=-=-=-=-=-=-=-=-=-=-