public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
@ 2024-05-24  2:07 Linus Liu
  0 siblings, 0 replies; 2+ messages in thread
From: Linus Liu @ 2024-05-24  2:07 UTC (permalink / raw)
  To: devel; +Cc: Benny Lin, Gua Guo, Chasel Chiu, James Lu, Dhaval Sharma

Add FDT detection and comsume FDT when needed.
Move some x86 speciifc function in the x86 folder.
Create HandOffHbo via FDT memory node.

Cc: Benny Lin <benny.lin@intel.com>
Cc: Gua Guo <gua.guo@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: James Lu <james.lu@intel.com>
Cc: Dhaval Sharma <dhaval@rivosinc.com>

Signed-off-by: Linus Liu <linus.liu@intel.com>
---
 UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c               | 428 +++++++++-----------
 UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c                       |  12 +
 UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} |  32 +-
 UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c                       |  50 +++
 UefiPayloadPkg/UefiPayloadEntry/PrintHob.c                               |   6 +-
 UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c                  |   6 -
 UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c                        |  12 +
 UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c}  |  31 +-
 UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf             |  20 +-
 UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h                       |  68 ++++
 UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf                |  16 +-
 UefiPayloadPkg/UefiPayloadPkg.dsc                                        |  29 +-
 12 files changed, 443 insertions(+), 267 deletions(-)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
 #include "UefiPayloadEntry.h"
 #include <Library/FdtLib.h>
 #include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
 
 #define MEMORY_ATTRIBUTE_MASK  (EFI_RESOURCE_ATTRIBUTE_PRESENT             |        \
                                        EFI_RESOURCE_ATTRIBUTE_INITIALIZED         | \
@@ -23,6 +25,15 @@
                                        EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
                                        EFI_RESOURCE_ATTRIBUTE_TESTED      )
 
+EFI_MEMORY_TYPE_INFORMATION  mDefaultMemoryTypeInformation[] = {
+  { EfiACPIReclaimMemory,   FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory)   },
+  { EfiACPIMemoryNVS,       FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS)       },
+  { EfiReservedMemoryType,  FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType)  },
+  { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+  { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+  { EfiMaxMemoryType,       0                                                   }
+};
+
 extern VOID  *mHobList;
 
 CHAR8  *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
   IN CONST VOID  *HobStart
   );
 
+/**
+  Add HOB into HOB list
+  @param[in]  Hob    The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+  IN EFI_PEI_HOB_POINTERS  *Hob
+  );
+
+/**
+  Found the Resource Descriptor HOB that contains a range (Base, Top)
+  @param[in] HobList    Hob start address
+  @param[in] Base       Memory start address
+  @param[in] Top        Memory end address.
+  @retval     The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+  IN VOID                  *HobList,
+  IN EFI_PHYSICAL_ADDRESS  Base,
+  IN EFI_PHYSICAL_ADDRESS  Top
+  );
+
+/**
+  Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+  @param[in] HobList                 Hob start address
+  @param[in] MinimalNeededSize       Minimal needed size.
+  @param[in] ExceptResourceHob       Ignore this Resource Descriptor.
+  @retval     The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+  IN VOID                         *HobList,
+  IN UINTN                        MinimalNeededSize,
+  IN EFI_HOB_RESOURCE_DESCRIPTOR  *ExceptResourceHob
+  );
+
+/**
+  Check the HOB and decide if it is need inside Payload
+  Payload maintainer may make decision which HOB is need or needn't
+  Then add the check logic in the function.
+  @param[in] Hob The HOB to check
+  @retval TRUE  If HOB is need inside Payload
+  @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+  EFI_PEI_HOB_POINTERS  Hob
+  );
+
+/**
+  Check the HOB and decide if it is need inside Payload
+
+  Payload maintainer may make decision which HOB is need or needn't
+  Then add the check logic in the function.
+
+  @param[in] Hob The HOB to check
+
+  @retval TRUE  If HOB is need inside Payload
+  @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+  EFI_PEI_HOB_POINTERS  Hob
+  );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+  VOID
+  );
+
 /**
   Find the first substring.
   @param  String    Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
   return EFI_SUCCESS;
 }
 
-/**
-  Add HOB into HOB list
-  @param[in]  Hob    The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
-  IN EFI_PEI_HOB_POINTERS  *Hob
-  )
-{
-  EFI_PEI_HOB_POINTERS  NewHob;
-
-  if (Hob->Raw == NULL) {
-    return;
-  }
-
-  NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
-  ASSERT (NewHob.Header != NULL);
-  if (NewHob.Header == NULL) {
-    return;
-  }
-
-  CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
-  Found the Resource Descriptor HOB that contains a range (Base, Top)
-  @param[in] HobList    Hob start address
-  @param[in] Base       Memory start address
-  @param[in] Top        Memory end address.
-  @retval     The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
-  IN VOID                  *HobList,
-  IN EFI_PHYSICAL_ADDRESS  Base,
-  IN EFI_PHYSICAL_ADDRESS  Top
-  )
-{
-  EFI_PEI_HOB_POINTERS         Hob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
-
-  for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
-    //
-    // Skip all HOBs except Resource Descriptor HOBs
-    //
-    if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not describe tested system memory
-    //
-    ResourceHob = Hob.ResourceDescriptor;
-    if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
-      continue;
-    }
-
-    if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
-    //
-    if (Base < ResourceHob->PhysicalStart) {
-      continue;
-    }
-
-    if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
-      continue;
-    }
-
-    return ResourceHob;
-  }
-
-  return NULL;
-}
-
-/**
-  Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
-  @param[in] HobList                 Hob start address
-  @param[in] MinimalNeededSize       Minimal needed size.
-  @param[in] ExceptResourceHob       Ignore this Resource Descriptor.
-  @retval     The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
-  IN VOID                         *HobList,
-  IN UINTN                        MinimalNeededSize,
-  IN EFI_HOB_RESOURCE_DESCRIPTOR  *ExceptResourceHob
-  )
-{
-  EFI_PEI_HOB_POINTERS         Hob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ReturnResourceHob;
-
-  ReturnResourceHob = NULL;
-
-  for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
-    //
-    // Skip all HOBs except Resource Descriptor HOBs
-    //
-    if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not describe tested system memory
-    //
-    ResourceHob = Hob.ResourceDescriptor;
-    if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
-      continue;
-    }
-
-    if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
-      continue;
-    }
-
-    //
-    // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
-    //
-    if (ResourceHob == ExceptResourceHob) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that are beyond 4G
-    //
-    if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that are too small
-    //
-    if (ResourceHob->ResourceLength < MinimalNeededSize) {
-      continue;
-    }
-
-    //
-    // Return the topest Resource Descriptor
-    //
-    if (ReturnResourceHob == NULL) {
-      ReturnResourceHob = ResourceHob;
-    } else {
-      if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
-        ReturnResourceHob = ResourceHob;
-      }
-    }
-  }
-
-  return ReturnResourceHob;
-}
-
-/**
-  Check the HOB and decide if it is need inside Payload
-  Payload maintainer may make decision which HOB is need or needn't
-  Then add the check logic in the function.
-  @param[in] Hob The HOB to check
-  @retval TRUE  If HOB is need inside Payload
-  @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
-  EFI_PEI_HOB_POINTERS  Hob
-  )
-{
-  if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
-    return FALSE;
-  }
-
-  if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
-    if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
-      return FALSE;
-    }
-  }
-
-  // Arrive here mean the HOB is need
-  return TRUE;
-}
-
 /**
   It will build Fv HOBs based on information from bootloaders.
   @param[out] DxeFv          The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
 
   Status = FdtCheckHeader (Fdt);
   if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
     return EFI_UNSUPPORTED;
   }
 
   ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
   if (ConfigNode <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
   Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
   if (Config1Node <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
   ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
   if (ImageNode <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
 }
 
 /**
-  It will build HOBs based on information from bootloaders.
-  @param[in]  BootloaderParameter   The starting memory address of bootloader parameter block.
-  @param[out] DxeFv                 The pointer to the DXE FV in memory.
-  @retval EFI_SUCCESS        If it completed successfully.
-  @retval Others             If it failed to build required HOBs.
+ *
+  Create new HOB for new HOB list
+
+  @param[in]  BootloaderParameter  The HOB to be added into the HOB list.
 **/
-EFI_STATUS
-BuildHobs (
-  IN  UINTN                       BootloaderParameter,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **DxeFv
+VOID
+CreatNewHobForHoblist (
+  IN UINTN  BootloaderParameter
   )
 {
-  EFI_PEI_HOB_POINTERS          Hob;
-  UINTN                         MinimalNeededSize;
-  EFI_PHYSICAL_ADDRESS          FreeMemoryBottom;
-  EFI_PHYSICAL_ADDRESS          FreeMemoryTop;
-  EFI_PHYSICAL_ADDRESS          MemoryBottom;
-  EFI_PHYSICAL_ADDRESS          MemoryTop;
-  EFI_HOB_RESOURCE_DESCRIPTOR   *PhitResourceHob;
-  EFI_HOB_RESOURCE_DESCRIPTOR   *ResourceHob;
-  UINT8                         *GuidHob;
-  EFI_HOB_FIRMWARE_VOLUME       *FvHob;
-  UNIVERSAL_PAYLOAD_ACPI_TABLE  *AcpiTable;
-  ACPI_BOARD_INFO               *AcpiBoardInfo;
-  EFI_HOB_HANDOFF_INFO_TABLE    *HobInfo;
+  EFI_PEI_HOB_POINTERS         Hob;
+  UINTN                        MinimalNeededSize;
+  EFI_PHYSICAL_ADDRESS         FreeMemoryBottom;
+  EFI_PHYSICAL_ADDRESS         FreeMemoryTop;
+  EFI_PHYSICAL_ADDRESS         MemoryBottom;
+  EFI_PHYSICAL_ADDRESS         MemoryTop;
+  EFI_HOB_RESOURCE_DESCRIPTOR  *PhitResourceHob;
+  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
+  EFI_HOB_HANDOFF_INFO_TABLE   *HobInfo;
 
   Hob.Raw           = (UINT8 *)BootloaderParameter;
   MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
     //
     ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
     if (ResourceHob == NULL) {
-      return EFI_NOT_FOUND;
+      return;
     }
 
     MemoryBottom     = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
     //
     ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
     if (ResourceHob == NULL) {
-      return EFI_NOT_FOUND;
+      return;
     }
 
     MemoryBottom     = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
 
   HobInfo           = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
   HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
-  //
-  // From now on, mHobList will point to the new Hob range.
-  //
 
-  //
-  // Create an empty FvHob for the DXE FV that contains DXE core.
-  //
-  BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
   //
   // Since payload created new Hob, move all hobs except PHIT from boot loader hob list.
   //
@@ -573,7 +466,57 @@ BuildHobs (
     Hob.Raw = GET_NEXT_HOB (Hob);
   }
 
-  BuildFitLoadablesFvHob (DxeFv);
+  return;
+}
+
+/**
+  It will build HOBs based on information from bootloaders.
+  @param[in]  NewFdtBase     The pointer to New FdtBase.
+  @param[out] DxeFv          The pointer to the DXE FV in memory.
+  @retval EFI_SUCCESS        If it completed successfully.
+  @retval Others             If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+  IN  UINTN                       NewFdtBase,
+  OUT EFI_FIRMWARE_VOLUME_HEADER  **DxeFv
+  )
+{
+  UINT8                          *GuidHob;
+  UINT32                         FdtSize;
+  EFI_HOB_FIRMWARE_VOLUME        *FvHob;
+  UNIVERSAL_PAYLOAD_ACPI_TABLE   *AcpiTable;
+  ACPI_BOARD_INFO                *AcpiBoardInfo;
+  UNIVERSAL_PAYLOAD_DEVICE_TREE  *Fdt;
+
+  if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+    //
+    // Back up FDT in Reserved memory region
+    //
+
+    GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+    if (GuidHob != NULL) {
+      Fdt =  (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+      if (Fdt != NULL) {
+        DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+        FdtSize = 4 * EFI_PAGE_SIZE;
+        CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+        Fdt->DeviceTreeAddress = NewFdtBase;
+      }
+    }
+  }
+
+  //
+  // To create Memory Type Information HOB
+  //
+  GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+  if (GuidHob == NULL) {
+    BuildGuidDataHob (
+      &gEfiMemoryTypeInformationGuid,
+      mDefaultMemoryTypeInformation,
+      sizeof (mDefaultMemoryTypeInformation)
+      );
+  }
 
   //
   // Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
     }
   }
 
+  //
+  // Create an empty FvHob for the DXE FV that contains DXE core.
+  //
+  BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+  BuildFitLoadablesFvHob (DxeFv);
   //
   // Update DXE FV information to first fv hob in the hob list, which
   // is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
 
 /**
   Entry point to the C language phase of UEFI payload.
-  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @param[in]   BootloaderParameter  The starting address of FDT .
   @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
 **/
 EFI_STATUS
 EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
   IN UINTN  BootloaderParameter
   )
 {
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
   PHYSICAL_ADDRESS            DxeCoreEntryPoint;
   EFI_PEI_HOB_POINTERS        Hob;
   EFI_FIRMWARE_VOLUME_HEADER  *DxeFv;
+  PHYSICAL_ADDRESS            HobListPtr;
+  VOID                        *FdtBase;
+  VOID                        *FdtBaseResvd;
 
-  mHobList = (VOID *)BootloaderParameter;
-  DxeFv    = NULL;
+  if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+    mHobList = (VOID *)NULL;
+  } else {
+    mHobList = (VOID *)BootloaderParameter;
+  }
+
+  DxeFv = NULL;
   // Call constructor for all libraries
   ProcessLibraryConstructorList ();
 
   DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
   DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+  DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+  DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+  HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+  //
+  // Found hob list node
+  //
+  if (HobListPtr != 0) {
+    FdtBase = (VOID *)BootloaderParameter;
+    if (FdtCheckHeader (FdtBase) == 0) {
+      CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+    } else {
+      CreatNewHobForHoblist (BootloaderParameter);
+    }
+
+    FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+    // Build HOB based on information from Bootloader
+    Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+  }
+
+  // Call constructor for all libraries again since hobs were built
+  ProcessLibraryConstructorList ();
 
   DEBUG_CODE (
     //
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
     PrintHob (mHobList);
     );
 
-  // Initialize floating point operating environment to be compliant with UEFI spec.
-  InitializeFloatingPointUnits ();
-
-  // Build HOB based on information from Bootloader
-  Status = BuildHobs (BootloaderParameter, &DxeFv);
-  ASSERT_EFI_ERROR (Status);
-
   FixUpPcdDatabase (DxeFv);
   Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
   ASSERT_EFI_ERROR (Status);
 
-  //
-  // Mask off all legacy 8259 interrupt sources
-  //
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
   Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
   HandOffToDxeCore (DxeCoreEntryPoint, Hob);
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 
 #define STACK_SIZE       0x20000
 #define IDT_ENTRY_COUNT  32
 
+extern VOID  *mHobList;
+
 typedef struct _X64_IDT_TABLE {
   //
   // Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
   UINT32                   Index;
   X64_IDT_TABLE            *IdtTableForX64;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
 /** @file
   Ia32-specific functionality for DxeLoad.
 
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 
 #define STACK_SIZE       0x20000
 #define IDT_ENTRY_COUNT  32
 
+extern VOID  *mHobList;
+
 typedef struct _X64_IDT_TABLE {
   //
   // Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
   UINT32                   Index;
   X64_IDT_TABLE            *IdtTableForX64;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
@@ -379,3 +389,17 @@ HandOffToDxeCore (
     CpuDeadLoop ();
   }
 }
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+  IN UINTN  BootloaderParameter
+  )
+{
+  return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
 
 #include "UefiPayloadEntry.h"
 
+/**
+  Allocates one or more pages of type EfiBootServicesData.
+
+  Allocates the number of pages of MemoryType and returns a pointer to the
+  allocated buffer.  The buffer returned is aligned on a 4KB boundary.
+  If Pages is 0, then NULL is returned.
+  If there is not enough memory availble to satisfy the request, then NULL
+  is returned.
+
+  @param   Pages                 The number of 4 KB pages to allocate.
+  @param   MemoryType            The MemoryType
+  @return  A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+  IN UINTN            Pages,
+  IN EFI_MEMORY_TYPE  MemoryType
+  )
+{
+  EFI_PEI_HOB_POINTERS        Hob;
+  EFI_PHYSICAL_ADDRESS        Offset;
+  EFI_HOB_HANDOFF_INFO_TABLE  *HobTable;
+
+  Hob.Raw  = GetHobList ();
+  HobTable = Hob.HandoffInformationTable;
+
+  if (Pages == 0) {
+    return NULL;
+  }
+
+  // Make sure allocation address is page alligned.
+  Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+  if (Offset != 0) {
+    HobTable->EfiFreeMemoryTop -= Offset;
+  }
+
+  //
+  // Check available memory for the allocation
+  //
+  if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+    return NULL;
+  }
+
+  HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+  BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+  return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
 /**
   Allocates one or more pages of type EfiBootServicesData.
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
 }
 
 /**
-  Print the information in Resource Discriptor Hob.
+  Print the information in Resource Descriptor Hob.
   @param[in]  HobStart       A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
   @param[in]  HobLength      The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
   @retval EFI_SUCCESS        If it completed successfully.
 **/
 EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
   IN  VOID    *HobStart,
   IN  UINT16  HobLength
   )
@@ -620,7 +620,7 @@ PrintFv3Hob (
 HOB_PRINT_HANDLER_TABLE  mHobHandles[] = {
   { EFI_HOB_TYPE_HANDOFF,             "EFI_HOB_TYPE_HANDOFF",             PrintHandOffHob            },
   { EFI_HOB_TYPE_MEMORY_ALLOCATION,   "EFI_HOB_TYPE_MEMORY_ALLOCATION",   PrintMemoryAllocationHob   },
-  { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+  { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
   { EFI_HOB_TYPE_GUID_EXTENSION,      "EFI_HOB_TYPE_GUID_EXTENSION",      PrintGuidHob               },
   { EFI_HOB_TYPE_FV,                  "EFI_HOB_TYPE_FV",                  PrintFvHob                 },
   { EFI_HOB_TYPE_CPU,                 "EFI_HOB_TYPE_CPU",                 PrintCpuHob                },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
   Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
   ASSERT_EFI_ERROR (Status);
 
-  //
-  // Mask off all legacy 8259 interrupt sources
-  //
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
   Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
   HandOffToDxeCore (DxeCoreEntryPoint, Hob);
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "X64/VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 #define STACK_SIZE  0x20000
 
+extern VOID  *mHobList;
+
 /**
    Transfers control to DxeCore.
 
@@ -40,6 +43,15 @@ HandOffToDxeCore (
   VOID   *GhcbBase;
   UINTN  GhcbSize;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
 /** @file
   x64-specifc functionality for DxeLoad.
 
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
 #include "X64/VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 #define STACK_SIZE  0x20000
 
+extern VOID  *mHobList;
+
 /**
    Transfers control to DxeCore.
 
@@ -40,6 +44,15 @@ HandOffToDxeCore (
   VOID   *GhcbBase;
   UINTN  GhcbSize;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
@@ -106,3 +119,17 @@ HandOffToDxeCore (
     TopOfStack
     );
 }
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+  IN UINTN  BootloaderParameter
+  )
+{
+  return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
 [Sources.Ia32]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
-  Ia32/DxeLoadFunc.c
+  Ia32/DxeLoadFuncFit.c
   Ia32/IdtVectorAsm.nasm
 
 [Sources.X64]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
-  X64/DxeLoadFunc.c
+  X64/DxeLoadFuncFit.c
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
   PeCoffLib
   CpuLib
   FdtLib
+  CustomFdtNodeParserLib
+  PcdLib
 
 [Guids]
   gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
   gUniversalPayloadAcpiTableGuid
   gUniversalPayloadPciRootBridgeInfoGuid
   gUniversalPayloadSmbios3TableGuid
+  gUniversalPayloadDeviceTreeGuid
 
 [FeaturePcd.IA32]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
@@ -78,7 +81,6 @@
 [FeaturePcd.X64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables       ## CONSUMES
 
-
 [Pcd.IA32,Pcd.X64]
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard                       ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase                            ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize                            ## CONSUMES
-
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
   gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy       ## SOMETIMES_CONSUMES
+  gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+  MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+  GCC:*_*_*_CC_FLAGS  = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
 #include <UniversalPayload/UniversalPayload.h>
 #include <UniversalPayload/ExtraData.h>
 #include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
 #include <Guid/PcdDataBaseSignatureGuid.h>
 
 #define LEGACY_8259_MASK_REGISTER_MASTER  0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
   OUT PHYSICAL_ADDRESS            *DxeCoreEntryPoint
   );
 
+/**
+  It will Parse FDT -node based on information.
+  @param[in]  FdtBase   The starting memory address of FdtBase
+  @retval HobList   The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+  IN VOID  *FdtBase
+  );
+
+/**
+  It will Parse FDT -custom node based on information.
+  @param[in]  FdtBase The starting memory address of FdtBase
+  @param[in]  HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+  IN VOID  *FdtBase,
+  IN VOID  *HostList
+  );
+
 /**
    Transfers control to DxeCore.
 
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
   IN   UINT64  AcpiTableBase
   );
 
+/**
+  Allocates one or more pages .
+
+  Allocates the number of pages of MemoryType and returns a pointer to the
+  allocated buffer.  The buffer returned is aligned on a 4KB boundary.
+  If Pages is 0, then NULL is returned.
+  If there is not enough memory availble to satisfy the request, then NULL
+  is returned.
+
+  @param   Pages                 The number of 4 KB pages to allocate.
+  @param   MemoryType            The Memorytype
+  @return  A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+  IN UINTN            Pages,
+  IN EFI_MEMORY_TYPE  MemoryType
+  );
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   FdtPrt  The starting address of FDT .
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+  IN UINTN  BootloaderParameter
+  );
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+  IN UINTN  BootloaderParameter
+  );
+
 #endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
-
 [Defines]
   INF_VERSION                    = 1.30
   BASE_NAME                      = UniversalPayloadEntry
   FILE_GUID                      = D4F0F269-1209-4A66-8039-C4D5A700EA4E
   MODULE_TYPE                    = SEC
   VERSION_STRING                 = 1.0
-
 #
 # The following information is for reference only and not required by the build tools.
 #
 #  VALID_ARCHITECTURES           = IA32 X64
 #
-
 [Sources]
   UniversalPayloadEntry.c
   LoadDxeCore.c
   MemoryAllocation.c
   PrintHob.c
   AcpiTable.c
-
 [Sources.Ia32]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
   Ia32/DxeLoadFunc.c
   Ia32/IdtVectorAsm.nasm
-
 [Sources.X64]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
   X64/DxeLoadFunc.c
-
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
   UefiPayloadPkg/UefiPayloadPkg.dec
-
 [LibraryClasses]
   BaseMemoryLib
   DebugLib
@@ -69,14 +62,12 @@
   gUniversalPayloadAcpiTableGuid
   gUniversalPayloadPciRootBridgeInfoGuid
   gUniversalPayloadSmbios3TableGuid
-
+  gUniversalPayloadBaseGuid
+  gUniversalPayloadDeviceTreeGuid
 [FeaturePcd.IA32]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
-
 [FeaturePcd.X64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables       ## CONSUMES
-
-
 [Pcd.IA32,Pcd.X64]
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard                       ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase                            ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize                            ## CONSUMES
-
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
   gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy       ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
   # ELF: Build UniversalPayload file as UniversalPayload.elf
   # FIT: Build UniversalPayload file as UniversalPayload.fit
   #
-  DEFINE UNIVERSAL_PAYLOAD            = FALSE
+  DEFINE UNIVERSAL_PAYLOAD            = TRUE
   DEFINE UNIVERSAL_PAYLOAD_FORMAT     = ELF
 
   #
@@ -226,6 +226,7 @@
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
   HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+  CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
 
   #
   # UEFI & PI
@@ -470,6 +471,8 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+  gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|TRUE
+
 
   gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }
@@ -513,7 +516,15 @@
 !endif
 !endif
 
+
 [PcdsPatchableInModule.X64]
+  #
+  # The following parameters are set by Library/PlatformHookLib
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
 !if $(NETWORK_DRIVER_ENABLE) == TRUE
   gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
 !endif
@@ -635,7 +646,13 @@
     !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
       UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
     !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
-      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+        <LibraryClasses>
+          FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+          CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+          NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+          NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+      }
     !else
       UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
     !endif
@@ -648,7 +665,13 @@
     !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
       UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
     !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
-      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+        <LibraryClasses>
+          FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+          CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+          NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+          NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+      }
     !else
       UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
     !endif
-- 
2.39.2.windows.1



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



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

* [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
@ 2024-05-24  2:24 Linus Liu
  0 siblings, 0 replies; 2+ messages in thread
From: Linus Liu @ 2024-05-24  2:24 UTC (permalink / raw)
  To: devel; +Cc: Benny Lin, Gua Guo, Chasel Chiu, James Lu, Dhaval Sharma

Add FDT detection and comsume FDT when needed.
Move some x86 speciifc function in the x86 folder.
Create HandOffHbo via FDT memory node.

Cc: Benny Lin <benny.lin@intel.com>
Cc: Gua Guo <gua.guo@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: James Lu <james.lu@intel.com>
Cc: Dhaval Sharma <dhaval@rivosinc.com>

Signed-off-by: Linus Liu <linus.liu@intel.com>
---
 UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c               | 428 +++++++++-----------
 UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c                       |  12 +
 UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} |  32 +-
 UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c                       |  50 +++
 UefiPayloadPkg/UefiPayloadEntry/PrintHob.c                               |   6 +-
 UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c                  |   6 -
 UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c                        |  12 +
 UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c}  |  31 +-
 UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf             |  20 +-
 UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h                       |  68 ++++
 UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf                |  16 +-
 UefiPayloadPkg/UefiPayloadPkg.dsc                                        |  29 +-
 12 files changed, 443 insertions(+), 267 deletions(-)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
 #include "UefiPayloadEntry.h"
 #include <Library/FdtLib.h>
 #include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
 
 #define MEMORY_ATTRIBUTE_MASK  (EFI_RESOURCE_ATTRIBUTE_PRESENT             |        \
                                        EFI_RESOURCE_ATTRIBUTE_INITIALIZED         | \
@@ -23,6 +25,15 @@
                                        EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
                                        EFI_RESOURCE_ATTRIBUTE_TESTED      )
 
+EFI_MEMORY_TYPE_INFORMATION  mDefaultMemoryTypeInformation[] = {
+  { EfiACPIReclaimMemory,   FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory)   },
+  { EfiACPIMemoryNVS,       FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS)       },
+  { EfiReservedMemoryType,  FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType)  },
+  { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+  { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+  { EfiMaxMemoryType,       0                                                   }
+};
+
 extern VOID  *mHobList;
 
 CHAR8  *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
   IN CONST VOID  *HobStart
   );
 
+/**
+  Add HOB into HOB list
+  @param[in]  Hob    The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+  IN EFI_PEI_HOB_POINTERS  *Hob
+  );
+
+/**
+  Found the Resource Descriptor HOB that contains a range (Base, Top)
+  @param[in] HobList    Hob start address
+  @param[in] Base       Memory start address
+  @param[in] Top        Memory end address.
+  @retval     The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+  IN VOID                  *HobList,
+  IN EFI_PHYSICAL_ADDRESS  Base,
+  IN EFI_PHYSICAL_ADDRESS  Top
+  );
+
+/**
+  Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+  @param[in] HobList                 Hob start address
+  @param[in] MinimalNeededSize       Minimal needed size.
+  @param[in] ExceptResourceHob       Ignore this Resource Descriptor.
+  @retval     The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+  IN VOID                         *HobList,
+  IN UINTN                        MinimalNeededSize,
+  IN EFI_HOB_RESOURCE_DESCRIPTOR  *ExceptResourceHob
+  );
+
+/**
+  Check the HOB and decide if it is need inside Payload
+  Payload maintainer may make decision which HOB is need or needn't
+  Then add the check logic in the function.
+  @param[in] Hob The HOB to check
+  @retval TRUE  If HOB is need inside Payload
+  @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+  EFI_PEI_HOB_POINTERS  Hob
+  );
+
+/**
+  Check the HOB and decide if it is need inside Payload
+
+  Payload maintainer may make decision which HOB is need or needn't
+  Then add the check logic in the function.
+
+  @param[in] Hob The HOB to check
+
+  @retval TRUE  If HOB is need inside Payload
+  @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+  EFI_PEI_HOB_POINTERS  Hob
+  );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+  VOID
+  );
+
 /**
   Find the first substring.
   @param  String    Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
   return EFI_SUCCESS;
 }
 
-/**
-  Add HOB into HOB list
-  @param[in]  Hob    The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
-  IN EFI_PEI_HOB_POINTERS  *Hob
-  )
-{
-  EFI_PEI_HOB_POINTERS  NewHob;
-
-  if (Hob->Raw == NULL) {
-    return;
-  }
-
-  NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
-  ASSERT (NewHob.Header != NULL);
-  if (NewHob.Header == NULL) {
-    return;
-  }
-
-  CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
-  Found the Resource Descriptor HOB that contains a range (Base, Top)
-  @param[in] HobList    Hob start address
-  @param[in] Base       Memory start address
-  @param[in] Top        Memory end address.
-  @retval     The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
-  IN VOID                  *HobList,
-  IN EFI_PHYSICAL_ADDRESS  Base,
-  IN EFI_PHYSICAL_ADDRESS  Top
-  )
-{
-  EFI_PEI_HOB_POINTERS         Hob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
-
-  for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
-    //
-    // Skip all HOBs except Resource Descriptor HOBs
-    //
-    if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not describe tested system memory
-    //
-    ResourceHob = Hob.ResourceDescriptor;
-    if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
-      continue;
-    }
-
-    if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
-    //
-    if (Base < ResourceHob->PhysicalStart) {
-      continue;
-    }
-
-    if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
-      continue;
-    }
-
-    return ResourceHob;
-  }
-
-  return NULL;
-}
-
-/**
-  Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
-  @param[in] HobList                 Hob start address
-  @param[in] MinimalNeededSize       Minimal needed size.
-  @param[in] ExceptResourceHob       Ignore this Resource Descriptor.
-  @retval     The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
-  IN VOID                         *HobList,
-  IN UINTN                        MinimalNeededSize,
-  IN EFI_HOB_RESOURCE_DESCRIPTOR  *ExceptResourceHob
-  )
-{
-  EFI_PEI_HOB_POINTERS         Hob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
-  EFI_HOB_RESOURCE_DESCRIPTOR  *ReturnResourceHob;
-
-  ReturnResourceHob = NULL;
-
-  for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
-    //
-    // Skip all HOBs except Resource Descriptor HOBs
-    //
-    if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that do not describe tested system memory
-    //
-    ResourceHob = Hob.ResourceDescriptor;
-    if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
-      continue;
-    }
-
-    if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
-      continue;
-    }
-
-    //
-    // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
-    //
-    if (ResourceHob == ExceptResourceHob) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that are beyond 4G
-    //
-    if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
-      continue;
-    }
-
-    //
-    // Skip Resource Descriptor HOBs that are too small
-    //
-    if (ResourceHob->ResourceLength < MinimalNeededSize) {
-      continue;
-    }
-
-    //
-    // Return the topest Resource Descriptor
-    //
-    if (ReturnResourceHob == NULL) {
-      ReturnResourceHob = ResourceHob;
-    } else {
-      if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
-        ReturnResourceHob = ResourceHob;
-      }
-    }
-  }
-
-  return ReturnResourceHob;
-}
-
-/**
-  Check the HOB and decide if it is need inside Payload
-  Payload maintainer may make decision which HOB is need or needn't
-  Then add the check logic in the function.
-  @param[in] Hob The HOB to check
-  @retval TRUE  If HOB is need inside Payload
-  @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
-  EFI_PEI_HOB_POINTERS  Hob
-  )
-{
-  if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
-    return FALSE;
-  }
-
-  if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
-    if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
-      return FALSE;
-    }
-  }
-
-  // Arrive here mean the HOB is need
-  return TRUE;
-}
-
 /**
   It will build Fv HOBs based on information from bootloaders.
   @param[out] DxeFv          The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
 
   Status = FdtCheckHeader (Fdt);
   if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
     return EFI_UNSUPPORTED;
   }
 
   ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
   if (ConfigNode <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
   Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
   if (Config1Node <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
   ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
   if (ImageNode <= 0) {
+    DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
     return EFI_NOT_FOUND;
   }
 
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
 }
 
 /**
-  It will build HOBs based on information from bootloaders.
-  @param[in]  BootloaderParameter   The starting memory address of bootloader parameter block.
-  @param[out] DxeFv                 The pointer to the DXE FV in memory.
-  @retval EFI_SUCCESS        If it completed successfully.
-  @retval Others             If it failed to build required HOBs.
+ *
+  Create new HOB for new HOB list
+
+  @param[in]  BootloaderParameter  The HOB to be added into the HOB list.
 **/
-EFI_STATUS
-BuildHobs (
-  IN  UINTN                       BootloaderParameter,
-  OUT EFI_FIRMWARE_VOLUME_HEADER  **DxeFv
+VOID
+CreatNewHobForHoblist (
+  IN UINTN  BootloaderParameter
   )
 {
-  EFI_PEI_HOB_POINTERS          Hob;
-  UINTN                         MinimalNeededSize;
-  EFI_PHYSICAL_ADDRESS          FreeMemoryBottom;
-  EFI_PHYSICAL_ADDRESS          FreeMemoryTop;
-  EFI_PHYSICAL_ADDRESS          MemoryBottom;
-  EFI_PHYSICAL_ADDRESS          MemoryTop;
-  EFI_HOB_RESOURCE_DESCRIPTOR   *PhitResourceHob;
-  EFI_HOB_RESOURCE_DESCRIPTOR   *ResourceHob;
-  UINT8                         *GuidHob;
-  EFI_HOB_FIRMWARE_VOLUME       *FvHob;
-  UNIVERSAL_PAYLOAD_ACPI_TABLE  *AcpiTable;
-  ACPI_BOARD_INFO               *AcpiBoardInfo;
-  EFI_HOB_HANDOFF_INFO_TABLE    *HobInfo;
+  EFI_PEI_HOB_POINTERS         Hob;
+  UINTN                        MinimalNeededSize;
+  EFI_PHYSICAL_ADDRESS         FreeMemoryBottom;
+  EFI_PHYSICAL_ADDRESS         FreeMemoryTop;
+  EFI_PHYSICAL_ADDRESS         MemoryBottom;
+  EFI_PHYSICAL_ADDRESS         MemoryTop;
+  EFI_HOB_RESOURCE_DESCRIPTOR  *PhitResourceHob;
+  EFI_HOB_RESOURCE_DESCRIPTOR  *ResourceHob;
+  EFI_HOB_HANDOFF_INFO_TABLE   *HobInfo;
 
   Hob.Raw           = (UINT8 *)BootloaderParameter;
   MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
     //
     ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
     if (ResourceHob == NULL) {
-      return EFI_NOT_FOUND;
+      return;
     }
 
     MemoryBottom     = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
     //
     ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
     if (ResourceHob == NULL) {
-      return EFI_NOT_FOUND;
+      return;
     }
 
     MemoryBottom     = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
 
   HobInfo           = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
   HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
-  //
-  // From now on, mHobList will point to the new Hob range.
-  //
 
-  //
-  // Create an empty FvHob for the DXE FV that contains DXE core.
-  //
-  BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
   //
   // Since payload created new Hob, move all hobs except PHIT from boot loader hob list.
   //
@@ -573,7 +466,57 @@ BuildHobs (
     Hob.Raw = GET_NEXT_HOB (Hob);
   }
 
-  BuildFitLoadablesFvHob (DxeFv);
+  return;
+}
+
+/**
+  It will build HOBs based on information from bootloaders.
+  @param[in]  NewFdtBase     The pointer to New FdtBase.
+  @param[out] DxeFv          The pointer to the DXE FV in memory.
+  @retval EFI_SUCCESS        If it completed successfully.
+  @retval Others             If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+  IN  UINTN                       NewFdtBase,
+  OUT EFI_FIRMWARE_VOLUME_HEADER  **DxeFv
+  )
+{
+  UINT8                          *GuidHob;
+  UINT32                         FdtSize;
+  EFI_HOB_FIRMWARE_VOLUME        *FvHob;
+  UNIVERSAL_PAYLOAD_ACPI_TABLE   *AcpiTable;
+  ACPI_BOARD_INFO                *AcpiBoardInfo;
+  UNIVERSAL_PAYLOAD_DEVICE_TREE  *Fdt;
+
+  if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+    //
+    // Back up FDT in Reserved memory region
+    //
+
+    GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+    if (GuidHob != NULL) {
+      Fdt =  (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+      if (Fdt != NULL) {
+        DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+        FdtSize = 4 * EFI_PAGE_SIZE;
+        CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+        Fdt->DeviceTreeAddress = NewFdtBase;
+      }
+    }
+  }
+
+  //
+  // To create Memory Type Information HOB
+  //
+  GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+  if (GuidHob == NULL) {
+    BuildGuidDataHob (
+      &gEfiMemoryTypeInformationGuid,
+      mDefaultMemoryTypeInformation,
+      sizeof (mDefaultMemoryTypeInformation)
+      );
+  }
 
   //
   // Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
     }
   }
 
+  //
+  // Create an empty FvHob for the DXE FV that contains DXE core.
+  //
+  BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+  BuildFitLoadablesFvHob (DxeFv);
   //
   // Update DXE FV information to first fv hob in the hob list, which
   // is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
 
 /**
   Entry point to the C language phase of UEFI payload.
-  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @param[in]   BootloaderParameter  The starting address of FDT .
   @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
 **/
 EFI_STATUS
 EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
   IN UINTN  BootloaderParameter
   )
 {
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
   PHYSICAL_ADDRESS            DxeCoreEntryPoint;
   EFI_PEI_HOB_POINTERS        Hob;
   EFI_FIRMWARE_VOLUME_HEADER  *DxeFv;
+  PHYSICAL_ADDRESS            HobListPtr;
+  VOID                        *FdtBase;
+  VOID                        *FdtBaseResvd;
 
-  mHobList = (VOID *)BootloaderParameter;
-  DxeFv    = NULL;
+  if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+    mHobList = (VOID *)NULL;
+  } else {
+    mHobList = (VOID *)BootloaderParameter;
+  }
+
+  DxeFv = NULL;
   // Call constructor for all libraries
   ProcessLibraryConstructorList ();
 
   DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
   DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+  DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+  DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+  HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+  //
+  // Found hob list node
+  //
+  if (HobListPtr != 0) {
+    FdtBase = (VOID *)BootloaderParameter;
+    if (FdtCheckHeader (FdtBase) == 0) {
+      CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+    } else {
+      CreatNewHobForHoblist (BootloaderParameter);
+    }
+
+    FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+    // Build HOB based on information from Bootloader
+    Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+  }
+
+  // Call constructor for all libraries again since hobs were built
+  ProcessLibraryConstructorList ();
 
   DEBUG_CODE (
     //
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
     PrintHob (mHobList);
     );
 
-  // Initialize floating point operating environment to be compliant with UEFI spec.
-  InitializeFloatingPointUnits ();
-
-  // Build HOB based on information from Bootloader
-  Status = BuildHobs (BootloaderParameter, &DxeFv);
-  ASSERT_EFI_ERROR (Status);
-
   FixUpPcdDatabase (DxeFv);
   Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
   ASSERT_EFI_ERROR (Status);
 
-  //
-  // Mask off all legacy 8259 interrupt sources
-  //
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
   Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
   HandOffToDxeCore (DxeCoreEntryPoint, Hob);
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 
 #define STACK_SIZE       0x20000
 #define IDT_ENTRY_COUNT  32
 
+extern VOID  *mHobList;
+
 typedef struct _X64_IDT_TABLE {
   //
   // Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
   UINT32                   Index;
   X64_IDT_TABLE            *IdtTableForX64;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
 /** @file
   Ia32-specific functionality for DxeLoad.
 
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 
 #define STACK_SIZE       0x20000
 #define IDT_ENTRY_COUNT  32
 
+extern VOID  *mHobList;
+
 typedef struct _X64_IDT_TABLE {
   //
   // Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
   UINT32                   Index;
   X64_IDT_TABLE            *IdtTableForX64;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
@@ -379,3 +389,17 @@ HandOffToDxeCore (
     CpuDeadLoop ();
   }
 }
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+  IN UINTN  BootloaderParameter
+  )
+{
+  return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
 
 #include "UefiPayloadEntry.h"
 
+/**
+  Allocates one or more pages of type EfiBootServicesData.
+
+  Allocates the number of pages of MemoryType and returns a pointer to the
+  allocated buffer.  The buffer returned is aligned on a 4KB boundary.
+  If Pages is 0, then NULL is returned.
+  If there is not enough memory availble to satisfy the request, then NULL
+  is returned.
+
+  @param   Pages                 The number of 4 KB pages to allocate.
+  @param   MemoryType            The MemoryType
+  @return  A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+  IN UINTN            Pages,
+  IN EFI_MEMORY_TYPE  MemoryType
+  )
+{
+  EFI_PEI_HOB_POINTERS        Hob;
+  EFI_PHYSICAL_ADDRESS        Offset;
+  EFI_HOB_HANDOFF_INFO_TABLE  *HobTable;
+
+  Hob.Raw  = GetHobList ();
+  HobTable = Hob.HandoffInformationTable;
+
+  if (Pages == 0) {
+    return NULL;
+  }
+
+  // Make sure allocation address is page alligned.
+  Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+  if (Offset != 0) {
+    HobTable->EfiFreeMemoryTop -= Offset;
+  }
+
+  //
+  // Check available memory for the allocation
+  //
+  if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+    return NULL;
+  }
+
+  HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+  BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+  return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
 /**
   Allocates one or more pages of type EfiBootServicesData.
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
 }
 
 /**
-  Print the information in Resource Discriptor Hob.
+  Print the information in Resource Descriptor Hob.
   @param[in]  HobStart       A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
   @param[in]  HobLength      The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
   @retval EFI_SUCCESS        If it completed successfully.
 **/
 EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
   IN  VOID    *HobStart,
   IN  UINT16  HobLength
   )
@@ -620,7 +620,7 @@ PrintFv3Hob (
 HOB_PRINT_HANDLER_TABLE  mHobHandles[] = {
   { EFI_HOB_TYPE_HANDOFF,             "EFI_HOB_TYPE_HANDOFF",             PrintHandOffHob            },
   { EFI_HOB_TYPE_MEMORY_ALLOCATION,   "EFI_HOB_TYPE_MEMORY_ALLOCATION",   PrintMemoryAllocationHob   },
-  { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+  { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
   { EFI_HOB_TYPE_GUID_EXTENSION,      "EFI_HOB_TYPE_GUID_EXTENSION",      PrintGuidHob               },
   { EFI_HOB_TYPE_FV,                  "EFI_HOB_TYPE_FV",                  PrintFvHob                 },
   { EFI_HOB_TYPE_CPU,                 "EFI_HOB_TYPE_CPU",                 PrintCpuHob                },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
   Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
   ASSERT_EFI_ERROR (Status);
 
-  //
-  // Mask off all legacy 8259 interrupt sources
-  //
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
-  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
   Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
   HandOffToDxeCore (DxeCoreEntryPoint, Hob);
 
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
 #include "X64/VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 #define STACK_SIZE  0x20000
 
+extern VOID  *mHobList;
+
 /**
    Transfers control to DxeCore.
 
@@ -40,6 +43,15 @@ HandOffToDxeCore (
   VOID   *GhcbBase;
   UINTN  GhcbSize;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
 /** @file
   x64-specifc functionality for DxeLoad.
 
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+  Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PcdLib.h>
 #include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
 #include "X64/VirtualMemory.h"
 #include "UefiPayloadEntry.h"
 #define STACK_SIZE  0x20000
 
+extern VOID  *mHobList;
+
 /**
    Transfers control to DxeCore.
 
@@ -40,6 +44,15 @@ HandOffToDxeCore (
   VOID   *GhcbBase;
   UINTN  GhcbSize;
 
+  // Initialize floating point operating environment to be compliant with UEFI spec.
+  InitializeFloatingPointUnits ();
+
+  //
+  // Mask off all legacy 8259 interrupt sources
+  //
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+  IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
   //
   // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
   //
@@ -106,3 +119,17 @@ HandOffToDxeCore (
     TopOfStack
     );
 }
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+  IN UINTN  BootloaderParameter
+  )
+{
+  return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
 [Sources.Ia32]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
-  Ia32/DxeLoadFunc.c
+  Ia32/DxeLoadFuncFit.c
   Ia32/IdtVectorAsm.nasm
 
 [Sources.X64]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
-  X64/DxeLoadFunc.c
+  X64/DxeLoadFuncFit.c
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
   PeCoffLib
   CpuLib
   FdtLib
+  CustomFdtNodeParserLib
+  PcdLib
 
 [Guids]
   gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
   gUniversalPayloadAcpiTableGuid
   gUniversalPayloadPciRootBridgeInfoGuid
   gUniversalPayloadSmbios3TableGuid
+  gUniversalPayloadDeviceTreeGuid
 
 [FeaturePcd.IA32]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
@@ -78,7 +81,6 @@
 [FeaturePcd.X64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables       ## CONSUMES
 
-
 [Pcd.IA32,Pcd.X64]
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard                       ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase                            ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize                            ## CONSUMES
-
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
   gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy       ## SOMETIMES_CONSUMES
+  gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+  gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+  MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+  GCC:*_*_*_CC_FLAGS  = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
 #include <UniversalPayload/UniversalPayload.h>
 #include <UniversalPayload/ExtraData.h>
 #include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
 #include <Guid/PcdDataBaseSignatureGuid.h>
 
 #define LEGACY_8259_MASK_REGISTER_MASTER  0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
   OUT PHYSICAL_ADDRESS            *DxeCoreEntryPoint
   );
 
+/**
+  It will Parse FDT -node based on information.
+  @param[in]  FdtBase   The starting memory address of FdtBase
+  @retval HobList   The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+  IN VOID  *FdtBase
+  );
+
+/**
+  It will Parse FDT -custom node based on information.
+  @param[in]  FdtBase The starting memory address of FdtBase
+  @param[in]  HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+  IN VOID  *FdtBase,
+  IN VOID  *HostList
+  );
+
 /**
    Transfers control to DxeCore.
 
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
   IN   UINT64  AcpiTableBase
   );
 
+/**
+  Allocates one or more pages .
+
+  Allocates the number of pages of MemoryType and returns a pointer to the
+  allocated buffer.  The buffer returned is aligned on a 4KB boundary.
+  If Pages is 0, then NULL is returned.
+  If there is not enough memory availble to satisfy the request, then NULL
+  is returned.
+
+  @param   Pages                 The number of 4 KB pages to allocate.
+  @param   MemoryType            The Memorytype
+  @return  A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+  IN UINTN            Pages,
+  IN EFI_MEMORY_TYPE  MemoryType
+  );
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   FdtPrt  The starting address of FDT .
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+  IN UINTN  BootloaderParameter
+  );
+
+/**
+  Entry point to the C language phase of UEFI payload.
+  @param[in]   BootloaderParameter    The starting address of bootloader parameter block.
+  @retval      It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+  IN UINTN  BootloaderParameter
+  );
+
 #endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
-
 [Defines]
   INF_VERSION                    = 1.30
   BASE_NAME                      = UniversalPayloadEntry
   FILE_GUID                      = D4F0F269-1209-4A66-8039-C4D5A700EA4E
   MODULE_TYPE                    = SEC
   VERSION_STRING                 = 1.0
-
 #
 # The following information is for reference only and not required by the build tools.
 #
 #  VALID_ARCHITECTURES           = IA32 X64
 #
-
 [Sources]
   UniversalPayloadEntry.c
   LoadDxeCore.c
   MemoryAllocation.c
   PrintHob.c
   AcpiTable.c
-
 [Sources.Ia32]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
   Ia32/DxeLoadFunc.c
   Ia32/IdtVectorAsm.nasm
-
 [Sources.X64]
   X64/VirtualMemory.h
   X64/VirtualMemory.c
   X64/DxeLoadFunc.c
-
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
   UefiPayloadPkg/UefiPayloadPkg.dec
-
 [LibraryClasses]
   BaseMemoryLib
   DebugLib
@@ -69,14 +62,12 @@
   gUniversalPayloadAcpiTableGuid
   gUniversalPayloadPciRootBridgeInfoGuid
   gUniversalPayloadSmbios3TableGuid
-
+  gUniversalPayloadBaseGuid
+  gUniversalPayloadDeviceTreeGuid
 [FeaturePcd.IA32]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
-
 [FeaturePcd.X64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables       ## CONSUMES
-
-
 [Pcd.IA32,Pcd.X64]
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard                       ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase                            ## CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize                            ## CONSUMES
-
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
   gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
   gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy       ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
   # ELF: Build UniversalPayload file as UniversalPayload.elf
   # FIT: Build UniversalPayload file as UniversalPayload.fit
   #
-  DEFINE UNIVERSAL_PAYLOAD            = FALSE
+  DEFINE UNIVERSAL_PAYLOAD            = TRUE
   DEFINE UNIVERSAL_PAYLOAD_FORMAT     = ELF
 
   #
@@ -226,6 +226,7 @@
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
   HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+  CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
 
   #
   # UEFI & PI
@@ -470,6 +471,8 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
   gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+  gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|TRUE
+
 
   gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
   gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }
@@ -513,7 +516,15 @@
 !endif
 !endif
 
+
 [PcdsPatchableInModule.X64]
+  #
+  # The following parameters are set by Library/PlatformHookLib
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
 !if $(NETWORK_DRIVER_ENABLE) == TRUE
   gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
 !endif
@@ -635,7 +646,13 @@
     !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
       UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
     !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
-      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+        <LibraryClasses>
+          FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+          CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+          NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+          NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+      }
     !else
       UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
     !endif
@@ -648,7 +665,13 @@
     !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
       UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
     !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
-      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+      UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+        <LibraryClasses>
+          FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+          CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+          NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+          NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+      }
     !else
       UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
     !endif
-- 
2.39.2.windows.1



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



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

end of thread, other threads:[~2024-05-24  2:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-24  2:07 [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support Linus Liu
  -- strict thread matches above, loose matches on Subject: below --
2024-05-24  2:24 Linus Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox