public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [edk2-platforms RESEND v2 3/5] AmdMinBoardPkg: Implement BoardInitLib for PEI phase
       [not found] <c27559a99b68dc7a6abf881c7a17d09b6f469a31.1716212901.git.AbdulLateef.Attar@amd.com>
@ 2024-05-20 13:49 ` Abdul Lateef Attar via groups.io
  2024-05-20 13:54   ` Chang, Abner via groups.io
  0 siblings, 1 reply; 2+ messages in thread
From: Abdul Lateef Attar via groups.io @ 2024-05-20 13:49 UTC (permalink / raw)
  To: devel; +Cc: Abdul Lateef Attar, Abner Chang, Paul Grimes

PeiBoardInitPreMemLib library provides board-specific
initialization functions for the PEI phase.

Cc: Abner Chang <abner.chang@amd.com>
Cc: Paul Grimes <paul.grimes@amd.com>
Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
---
 .../AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec     |   8 +
 .../AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc     |   5 +
 .../PeiBoardInitPreMemLib/AmdMemoryInfoHob.h  |  50 ++++
 .../PeiBoardInitPreMemLib.c                   | 229 ++++++++++++++++++
 .../PeiBoardInitPreMemLib.inf                 |  45 ++++
 .../PeiBoardInitPreMemLib/PeiMemoryInit.c     | 198 +++++++++++++++
 .../PeiBoardInitPreMemLib/PeiMemoryInit.h     |  50 ++++
 7 files changed, 585 insertions(+)
 create mode 100644 Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMemoryInfoHob.h
 create mode 100644 Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.c
 create mode 100644 Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf
 create mode 100644 Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.c
 create mode 100644 Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.h

diff --git a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
index 03d1d77c34..98768af210 100644
--- a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
+++ b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
@@ -19,6 +19,10 @@
 
 [Guids]
   gAmdMinBoardPkgTokenSpaceGuid  = {0xd4d23d79, 0x73bf, 0x460a, {0xa1, 0xc7, 0x85, 0xa3, 0xca, 0x71, 0xb9, 0x4c}}
+  gAmdMemoryInfoHobGuid          = { 0x1bce3d14, 0xa5fe, 0x4a0b, { 0x9a, 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}}
+
+[Ppis]
+  gAmdMemoryInfoHobPpiGuid       = { 0xba16e587, 0x1d66, 0x41b7, { 0x9b, 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}}
 
 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   #
@@ -41,3 +45,7 @@
   gAmdMinBoardPkgTokenSpaceGuid.PcdAmdFlashFvAdvancedSecuritySize    |0x00000000|UINT32|0x10000008
   gAmdMinBoardPkgTokenSpaceGuid.PcdAmdFlashFvAdvancedSecurityOffset  |0x00000000|UINT32|0x10000009
 
+  # SMRAM size
+  # Holds the SMRAM area size, which is reserved for SMRAM operation
+  # default value 128MB
+  gAmdMinBoardPkgTokenSpaceGuid.PcdAmdSmramAreaSize                  |0x08000000|UINT64|0x20000100
diff --git a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
index be33089a45..7e356a2a67 100644
--- a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
+++ b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
@@ -22,6 +22,9 @@
   MinPlatformPkg/MinPlatformPkg.dec
   UefiCpuPkg/UefiCpuPkg.dec
 
+[PcdsDynamicDefault]
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize|0x10000000
+
 [LibraryClasses]
   SpcrDeviceLib|AmdMinBoardPkg/Library/SpcrDeviceLib/SpcrDeviceLib.inf
   ReportFvLib|AmdMinBoardPkg/Library/PeiReportFvLib/PeiReportFvLib.inf
@@ -38,6 +41,7 @@
 
 [LibraryClasses.common.PEIM]
   SetCacheMtrrLib|AmdMinBoardPkg/Library/SetCacheMtrrLib/SetCacheMtrrLib.inf
+  BoardInitLib|AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf
 
 [Components]
   AmdMinBoardPkg/Library/SpcrDeviceLib/SpcrDeviceLib.inf
@@ -45,6 +49,7 @@
 [Components.IA32]
   AmdMinBoardPkg/Library/SetCacheMtrrLib/SetCacheMtrrLib.inf
   AmdMinBoardPkg/Library/PeiReportFvLib/PeiReportFvLib.inf
+  AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf
 
 [Components.X64]
   AmdMinBoardPkg/PciHotPlug/PciHotPlugInit.inf
diff --git a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMemoryInfoHob.h b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMemoryInfoHob.h
new file mode 100644
index 0000000000..b596b3bdf3
--- /dev/null
+++ b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMemoryInfoHob.h
@@ -0,0 +1,50 @@
+/** @file
+  Defines AMD memory info hob.
+
+  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef AMD_MEMORY_INFO_HOB_H_
+#define AMD_MEMORY_INFO_HOB_H_
+
+#pragma pack (push, 1)
+
+/// Memory descriptor structure for each memory range
+typedef struct {
+  UINT64    Base;                           ///< Base address of memory rang
+  UINT64    Size;                           ///< Size of memory rang
+  UINT32    Attribute;                      ///< Attribute of memory rang
+  UINT32    Reserved;                       ///< For alignment purpose
+} AMD_MEMORY_RANGE_DESCRIPTOR;
+
+/// Memory info HOB structure
+typedef struct  {
+  UINT32                         Version;               ///< Version of HOB structure
+  BOOLEAN                        Reserved1;
+  UINT16                         Reserved2;
+  BOOLEAN                        Reserved3;
+  UINT8                          Reserved4;
+  BOOLEAN                        Reserved5;
+  UINT32                         Reserved6;
+  UINT32                         Reserved7;
+  UINT32                         NumberOfDescriptor;    ///< Number of memory range descriptor
+  AMD_MEMORY_RANGE_DESCRIPTOR    Ranges[1];             ///< Memory ranges array
+} AMD_MEMORY_INFO_HOB;
+
+#pragma pack (pop)
+
+/// Memory attribute in the memory range descriptor = AVAILABLE
+#define AMD_MEMORY_ATTRIBUTE_AVAILABLE  0x1
+
+/// Memory attribute in the memory range descriptor = UMA
+#define AMD_MEMORY_ATTRIBUTE_UMA  0x2
+
+/// Memory attribute in the memory range descriptor = MMIO
+#define AMD_MEMORY_ATTRIBUTE_MMIO  0x3
+
+/// Memory attribute in the memory range descriptor = RESERVED
+#define AMD_MEMORY_ATTRIBUTE_RESERVED  0x4
+
+#endif
diff --git a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.c b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.c
new file mode 100644
index 0000000000..af96969471
--- /dev/null
+++ b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.c
@@ -0,0 +1,229 @@
+/** @file
+  BoardInitLib library implementation for pre-mem PEI phase.
+
+Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BoardInitLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include "PeiMemoryInit.h"
+
+EFI_PEI_NOTIFY_DESCRIPTOR  mNotifyList = {
+  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+  &gAmdMemoryInfoHobPpiGuid,
+  EndofAmdMemoryInfoHobPpiGuidCallBack
+};
+
+/**
+  Get Pcie base address from MSR and set PcdPciExpressBaseSize
+
+  @retval EFI_SUCCESS   PcdPciExpressBaseSize value set successfully.
+**/
+EFI_STATUS
+EFIAPI
+SetPcieBaseSize (
+  VOID
+  )
+{
+  EFI_STATUS  Status;
+  UINT64      PcieBaseSize;
+  UINT8       BusRange;
+
+  Status = EFI_SUCCESS;
+
+  // Gather the value of PcdPciExpressBaseSize from MSR
+  BusRange     =  RShiftU64 (AsmReadMsr64 (0xC0010058), 2) & 0xF;
+  PcieBaseSize =  MultU64x64 (LShiftU64 (1, BusRange), SIZE_1MB);
+  PcdSet64S (PcdPciExpressBaseSize, (UINT64)PcieBaseSize);
+  return Status;
+}
+
+/**
+  This board service detects the board type.
+
+  @retval EFI_SUCCESS   The board was detected successfully.
+  @retval EFI_NOT_FOUND The board could not be detected.
+**/
+EFI_STATUS
+EFIAPI
+BoardDetect (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  This board service initializes board-specific debug devices.
+
+  @retval EFI_SUCCESS   Board-specific debug initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardDebugInit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  This board service detects the boot mode.
+
+  @retval EFI_BOOT_MODE The boot mode.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_BOOT_MODE
+EFIAPI
+BoardBootModeDetect (
+  VOID
+  )
+{
+  return BOOT_WITH_FULL_CONFIGURATION;
+}
+
+/**
+  A hook for board-specific initialization prior to memory initialization.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitBeforeMemoryInit (
+  VOID
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = PeiServicesNotifyPpi (&mNotifyList);
+  ASSERT_EFI_ERROR (Status);
+  Status = SetPcieBaseSize ();
+  ASSERT_EFI_ERROR (Status);
+  return (Status);
+}
+
+/**
+  A hook for board-specific initialization after memory initialization.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitAfterMemoryInit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific initialization prior to disabling temporary RAM.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitBeforeTempRamExit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific initialization after disabling temporary RAM.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitAfterTempRamExit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific initialization prior to silicon initialization.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitBeforeSiliconInit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific initialization after silicon initialization.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitAfterSiliconInit (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific initialization after PCI enumeration.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitAfterPciEnumeration (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific functionality for the ReadyToBoot event.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitReadyToBoot (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/**
+  A hook for board-specific functionality for the ExitBootServices event.
+
+  @retval EFI_SUCCESS   The board initialization was successful.
+  @retval EFI_NOT_READY The board has not been detected yet.
+**/
+EFI_STATUS
+EFIAPI
+BoardInitEndOfFirmware (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
diff --git a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf
new file mode 100644
index 0000000000..9f3cfd47c4
--- /dev/null
+++ b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.inf
@@ -0,0 +1,45 @@
+## @file
+# Board Init Library for AMD Platforms.
+#
+# Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 1.29
+  BASE_NAME                      = PeiBoardInitPreMemLib
+  FILE_GUID                      = A394D6BE-4433-4564-8FEB-2C90DD9ECE5B
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = BoardInitLib
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  HobLib
+  PcdLib
+
+[Packages]
+  AmdMinBoardPkg/AmdMinBoardPkg.dec
+  MdePkg/MdePkg.dec
+  MinPlatformPkg/MinPlatformPkg.dec
+
+[Sources]
+  AmdMemoryInfoHob.h
+  PeiMemoryInit.h
+  PeiBoardInitPreMemLib.c
+  PeiMemoryInit.c
+
+[Guids]
+  gAmdMemoryInfoHobGuid
+  gEfiSmmSmramMemoryGuid
+
+[Ppis]
+  gAmdMemoryInfoHobPpiGuid                                          ## CONSUMES
+  gPeiPlatformMemorySizePpiGuid                                     ## CONSUMES
+
+[Pcd]
+  gAmdMinBoardPkgTokenSpaceGuid.PcdAmdSmramAreaSize
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize                    ## CONSUMES
diff --git a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.c b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.c
new file mode 100644
index 0000000000..03f08214e2
--- /dev/null
+++ b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.c
@@ -0,0 +1,198 @@
+/** @file
+
+Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "PeiMemoryInit.h"
+#include "AmdMemoryInfoHob.h"
+
+/**
+  A Callback routine only AmdMemoryInfoHob is ready.
+
+  @param[in]  PeiServices       General purpose services available to every PEIM.
+  @param[in]  NotifyDescriptor  The descriptor for the notification event.
+  @param[in]  Ppi               The context of the notification.
+
+  @retval EFI_SUCCESS   Platform Pre Memory initialization is successful.
+          EFI_STATUS    Various failure from underlying routine calls.
+**/
+EFI_STATUS
+EFIAPI
+EndofAmdMemoryInfoHobPpiGuidCallBack (
+  IN EFI_PEI_SERVICES           **PeiServices,
+  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
+  IN VOID                       *Ppi
+  )
+{
+  PEI_PLATFORM_MEMORY_SIZE_PPI    *PlatformMemorySizePpi;
+  EFI_STATUS                      Status;
+  UINT64                          MemorySize;
+  AMD_MEMORY_INFO_HOB             *AmdMemoryInfoHob;
+  AMD_MEMORY_RANGE_DESCRIPTOR     *AmdMemoryInfoRange;
+  EFI_HOB_GUID_TYPE               *GuidHob;
+  EFI_PEI_HOB_POINTERS            Hob;
+  UINTN                           Index;
+  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *SmramHobDescriptorBlock;
+  EFI_PHYSICAL_ADDRESS            SmramBaseAddress;
+  UINT8                           SmramRanges;
+  UINTN                           DataSize;
+
+  SmramBaseAddress = 0;
+  SmramRanges      = 0;
+
+  // Locate AMD_MEMORY_INFO_HOB Guided HOB and retrieve data
+  AmdMemoryInfoHob = NULL;
+  GuidHob          = GetFirstGuidHob (&gAmdMemoryInfoHobGuid);
+  if (GuidHob != NULL) {
+    AmdMemoryInfoHob = GET_GUID_HOB_DATA (GuidHob);
+  }
+
+  if (AmdMemoryInfoHob == NULL) {
+    DEBUG ((DEBUG_ERROR, "Error: Could not locate AMD_MEMORY_INFO_HOB.\n"));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  DEBUG ((DEBUG_INFO, "AMD_MEMORY_INFO_HOB at 0x%X\n", AmdMemoryInfoHob));
+  DEBUG ((DEBUG_INFO, "  Version: 0x%X\n", AmdMemoryInfoHob->Version));
+  DEBUG ((DEBUG_INFO, "  NumberOfDescriptor: 0x%X\n", AmdMemoryInfoHob->NumberOfDescriptor));
+
+  //
+  // Build Descriptors
+  //
+  DEBUG ((DEBUG_INFO, "\nAMD HOB Descriptors:"));
+  for (Index = 0; Index < AmdMemoryInfoHob->NumberOfDescriptor; Index++) {
+    AmdMemoryInfoRange = (AMD_MEMORY_RANGE_DESCRIPTOR *)&(AmdMemoryInfoHob->Ranges[Index]);
+
+    DEBUG ((DEBUG_INFO, "\n Index: %d\n", Index));
+    DEBUG ((DEBUG_INFO, "   Base: 0x%lX\n", AmdMemoryInfoRange->Base));
+    DEBUG ((DEBUG_INFO, "   Size: 0x%lX\n", AmdMemoryInfoRange->Size));
+    DEBUG ((DEBUG_INFO, "   Attribute: 0x%X\n", AmdMemoryInfoRange->Attribute));
+
+    switch (AmdMemoryInfoRange->Attribute) {
+      case AMD_MEMORY_ATTRIBUTE_AVAILABLE:
+        if (AmdMemoryInfoRange->Base < SIZE_4GB) {
+          SmramRanges = 1u;
+          // Set SMRAM base at heighest range below 4GB
+          SmramBaseAddress = AmdMemoryInfoRange->Base + AmdMemoryInfoRange->Size - FixedPcdGet32 (PcdAmdSmramAreaSize);
+          BuildResourceDescriptorHob (
+            EFI_RESOURCE_MEMORY_RESERVED,
+            (EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
+            SmramBaseAddress,
+            FixedPcdGet32 (PcdAmdSmramAreaSize)
+            );
+          DEBUG ((
+            DEBUG_INFO,
+            "SMRAM RESERVED_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
+            SmramBaseAddress,
+            FixedPcdGet32 (PcdAmdSmramAreaSize)
+            ));
+
+          AmdMemoryInfoRange->Size -= FixedPcdGet32 (PcdAmdSmramAreaSize);
+        }
+
+        if (AmdMemoryInfoRange->Size) {
+          BuildResourceDescriptorHob (
+            EFI_RESOURCE_SYSTEM_MEMORY,
+            SYSTEM_MEMORY_ATTRIBUTES,
+            AmdMemoryInfoRange->Base,
+            AmdMemoryInfoRange->Size
+            );
+
+          DEBUG ((
+            DEBUG_INFO,
+            "SYSTEM_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
+            AmdMemoryInfoRange->Base,
+            AmdMemoryInfoRange->Size
+            ));
+        }
+
+        break;
+
+      case AMD_MEMORY_ATTRIBUTE_MMIO:
+        BuildResourceDescriptorHob (
+          EFI_RESOURCE_MEMORY_MAPPED_IO,
+          MEMORY_MAPPED_IO_ATTRIBUTES,
+          AmdMemoryInfoRange->Base,
+          AmdMemoryInfoRange->Size
+          );
+
+        DEBUG ((
+          DEBUG_INFO,
+          "MMIO: Base = 0x%lX, Size = 0x%lX\n",
+          AmdMemoryInfoRange->Base,
+          AmdMemoryInfoRange->Size
+          ));
+        break;
+
+      case AMD_MEMORY_ATTRIBUTE_RESERVED:
+      case AMD_MEMORY_ATTRIBUTE_UMA:
+      default:
+        BuildResourceDescriptorHob (
+          EFI_RESOURCE_MEMORY_RESERVED,
+          0,
+          AmdMemoryInfoRange->Base,
+          AmdMemoryInfoRange->Size
+          );
+
+        DEBUG ((
+          DEBUG_INFO,
+          "RESERVED_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
+          AmdMemoryInfoRange->Base,
+          AmdMemoryInfoRange->Size
+          ));
+        break;
+    }
+  }
+
+  ASSERT (SmramRanges > 0);
+  DataSize  = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK);
+  DataSize += ((SmramRanges - 1) * sizeof (EFI_SMRAM_DESCRIPTOR));
+
+  Hob.Raw = BuildGuidHob (
+              &gEfiSmmSmramMemoryGuid,
+              DataSize
+              );
+  ASSERT (Hob.Raw);
+
+  SmramHobDescriptorBlock                              = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)(Hob.Raw);
+  SmramHobDescriptorBlock->NumberOfSmmReservedRegions  = SmramRanges;
+  SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = SmramBaseAddress;
+  SmramHobDescriptorBlock->Descriptor[0].CpuStart      = SmramBaseAddress;
+  SmramHobDescriptorBlock->Descriptor[0].PhysicalSize  = FixedPcdGet32 (PcdAmdSmramAreaSize);
+  SmramHobDescriptorBlock->Descriptor[0].RegionState   = EFI_SMRAM_CLOSED | EFI_CACHEABLE;
+
+  Status = PeiServicesLocatePpi (
+             &gPeiPlatformMemorySizePpiGuid,
+             0,
+             NULL,
+             (VOID **)&PlatformMemorySizePpi
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  Status = PlatformMemorySizePpi->GetPlatformMemorySize (
+                                    PeiServices,
+                                    PlatformMemorySizePpi,
+                                    &MemorySize
+                                    );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "%a: Error(%r) in getting Platform Memory size.\n",
+      __func__,
+      Status
+      ));
+    return Status;
+  }
+
+  DEBUG ((
+    DEBUG_INFO,
+    "Installing PeiMemory, BaseAddress = 0x%x, Size = 0x%x\n",
+    0,
+    MemorySize
+    ));
+  Status = PeiServicesInstallPeiMemory (0, MemorySize);
+  ASSERT_EFI_ERROR (Status);
+  return Status;
+}
diff --git a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.h b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.h
new file mode 100644
index 0000000000..726db25543
--- /dev/null
+++ b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemoryInit.h
@@ -0,0 +1,50 @@
+/** @file
+  This file contains definitions required for memory initialization in PEI phase.
+
+  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef PEI_MEMORY_INIT_PEI_H_
+#define PEI_MEMORY_INIT_PEI_H_
+
+#include <Uefi/UefiBaseType.h>
+#include <Pi/PiPeiCis.h>
+#include <Library/PeiServicesLib.h>
+#include <Ppi/PlatformMemorySize.h>
+#include <Guid/SmramMemoryReserve.h>
+#include <Library/HobLib.h>
+#include <Library/DebugLib.h>
+
+#define SYSTEM_MEMORY_ATTRIBUTES  (                \
+  EFI_RESOURCE_ATTRIBUTE_PRESENT |                 \
+  EFI_RESOURCE_ATTRIBUTE_INITIALIZED |             \
+  EFI_RESOURCE_ATTRIBUTE_TESTED |                  \
+  EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |             \
+  EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |       \
+  EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \
+  EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE      \
+  )
+
+#define MEMORY_MAPPED_IO_ATTRIBUTES  ( \
+  EFI_RESOURCE_ATTRIBUTE_PRESENT |     \
+  EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
+  EFI_RESOURCE_ATTRIBUTE_TESTED |      \
+  EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE   \
+  )
+
+/**
+  A Callback routine only AmdMemoryInfoHob is ready.
+
+  @retval EFI_SUCCESS   Platform Pre Memory initialization is successfull.
+          EFI_STATUS    Various failure from underlying routine calls.
+**/
+EFI_STATUS
+EFIAPI
+EndofAmdMemoryInfoHobPpiGuidCallBack (
+  IN EFI_PEI_SERVICES           **PeiServices,
+  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
+  IN VOID                       *Ppi
+  );
+
+#endif // PEI_MEMORY_INIT_PEI_H_
-- 
2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119082): https://edk2.groups.io/g/devel/message/119082
Mute This Topic: https://groups.io/mt/106203334/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

* Re: [edk2-devel] [edk2-platforms RESEND v2 3/5] AmdMinBoardPkg: Implement BoardInitLib for PEI phase
  2024-05-20 13:49 ` [edk2-devel] [edk2-platforms RESEND v2 3/5] AmdMinBoardPkg: Implement BoardInitLib for PEI phase Abdul Lateef Attar via groups.io
@ 2024-05-20 13:54   ` Chang, Abner via groups.io
  0 siblings, 0 replies; 2+ messages in thread
From: Chang, Abner via groups.io @ 2024-05-20 13:54 UTC (permalink / raw)
  To: Attar, AbdulLateef (Abdul Lateef), devel@edk2.groups.io
  Cc: Attar, AbdulLateef (Abdul Lateef), Grimes, Paul

[AMD Official Use Only - AMD Internal Distribution Only]

Reviewed-by: Abner Chang <abner.chang@amd.com>

> -----Original Message-----
> From: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
> Sent: Monday, May 20, 2024 9:50 PM
> To: devel@edk2.groups.io
> Cc: Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Chang,
> Abner <Abner.Chang@amd.com>; Grimes, Paul <Paul.Grimes@amd.com>
> Subject: [edk2-platforms RESEND v2 3/5] AmdMinBoardPkg: Implement
> BoardInitLib for PEI phase
>
> PeiBoardInitPreMemLib library provides board-specific
> initialization functions for the PEI phase.
>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Paul Grimes <paul.grimes@amd.com>
> Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
> ---
>  .../AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec     |   8 +
>  .../AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc     |   5 +
>  .../PeiBoardInitPreMemLib/AmdMemoryInfoHob.h  |  50 ++++
>  .../PeiBoardInitPreMemLib.c                   | 229 ++++++++++++++++++
>  .../PeiBoardInitPreMemLib.inf                 |  45 ++++
>  .../PeiBoardInitPreMemLib/PeiMemoryInit.c     | 198 +++++++++++++++
>  .../PeiBoardInitPreMemLib/PeiMemoryInit.h     |  50 ++++
>  7 files changed, 585 insertions(+)
>  create mode 100644
> Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMem
> oryInfoHob.h
>  create mode 100644
> Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardI
> nitPreMemLib.c
>  create mode 100644
> Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardI
> nitPreMemLib.inf
>  create mode 100644
> Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemor
> yInit.c
>  create mode 100644
> Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMemor
> yInit.h
>
> diff --git a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
> b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
> index 03d1d77c34..98768af210 100644
> --- a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
> +++ b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dec
> @@ -19,6 +19,10 @@
>
>  [Guids]
>    gAmdMinBoardPkgTokenSpaceGuid  = {0xd4d23d79, 0x73bf, 0x460a, {0xa1,
> 0xc7, 0x85, 0xa3, 0xca, 0x71, 0xb9, 0x4c}}
> +  gAmdMemoryInfoHobGuid          = { 0x1bce3d14, 0xa5fe, 0x4a0b, { 0x9a,
> 0x8d, 0x69, 0xca, 0x5d, 0x98, 0x38, 0xd3}}
> +
> +[Ppis]
> +  gAmdMemoryInfoHobPpiGuid       = { 0xba16e587, 0x1d66, 0x41b7, { 0x9b,
> 0x52, 0xca, 0x4f, 0x2c, 0xad, 0x0d, 0xc8}}
>
>  [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
>    #
> @@ -41,3 +45,7 @@
>    gAmdMinBoardPkgTokenSpaceGuid.PcdAmdFlashFvAdvancedSecuritySize
> |0x00000000|UINT32|0x10000008
>    gAmdMinBoardPkgTokenSpaceGuid.PcdAmdFlashFvAdvancedSecurityOffset
> |0x00000000|UINT32|0x10000009
>
> +  # SMRAM size
> +  # Holds the SMRAM area size, which is reserved for SMRAM operation
> +  # default value 128MB
> +  gAmdMinBoardPkgTokenSpaceGuid.PcdAmdSmramAreaSize
> |0x08000000|UINT64|0x20000100
> diff --git a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
> b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
> index be33089a45..7e356a2a67 100644
> --- a/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
> +++ b/Platform/AMD/AmdMinBoardPkg/AmdMinBoardPkg.dsc
> @@ -22,6 +22,9 @@
>    MinPlatformPkg/MinPlatformPkg.dec
>    UefiCpuPkg/UefiCpuPkg.dec
>
> +[PcdsDynamicDefault]
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize|0x10000000
> +
>  [LibraryClasses]
>    SpcrDeviceLib|AmdMinBoardPkg/Library/SpcrDeviceLib/SpcrDeviceLib.inf
>    ReportFvLib|AmdMinBoardPkg/Library/PeiReportFvLib/PeiReportFvLib.inf
> @@ -38,6 +41,7 @@
>
>  [LibraryClasses.common.PEIM]
>
> SetCacheMtrrLib|AmdMinBoardPkg/Library/SetCacheMtrrLib/SetCacheMtrrLi
> b.inf
> +
> BoardInitLib|AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInit
> PreMemLib.inf
>
>  [Components]
>    AmdMinBoardPkg/Library/SpcrDeviceLib/SpcrDeviceLib.inf
> @@ -45,6 +49,7 @@
>  [Components.IA32]
>    AmdMinBoardPkg/Library/SetCacheMtrrLib/SetCacheMtrrLib.inf
>    AmdMinBoardPkg/Library/PeiReportFvLib/PeiReportFvLib.inf
> +
> AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoardInitPreMemLib.in
> f
>
>  [Components.X64]
>    AmdMinBoardPkg/PciHotPlug/PciHotPlugInit.inf
> diff --git
> a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMe
> moryInfoHob.h
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMe
> moryInfoHob.h
> new file mode 100644
> index 0000000000..b596b3bdf3
> --- /dev/null
> +++
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/AmdMe
> moryInfoHob.h
> @@ -0,0 +1,50 @@
> +/** @file
> +  Defines AMD memory info hob.
> +
> +  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef AMD_MEMORY_INFO_HOB_H_
> +#define AMD_MEMORY_INFO_HOB_H_
> +
> +#pragma pack (push, 1)
> +
> +/// Memory descriptor structure for each memory range
> +typedef struct {
> +  UINT64    Base;                           ///< Base address of memory rang
> +  UINT64    Size;                           ///< Size of memory rang
> +  UINT32    Attribute;                      ///< Attribute of memory rang
> +  UINT32    Reserved;                       ///< For alignment purpose
> +} AMD_MEMORY_RANGE_DESCRIPTOR;
> +
> +/// Memory info HOB structure
> +typedef struct  {
> +  UINT32                         Version;               ///< Version of HOB structure
> +  BOOLEAN                        Reserved1;
> +  UINT16                         Reserved2;
> +  BOOLEAN                        Reserved3;
> +  UINT8                          Reserved4;
> +  BOOLEAN                        Reserved5;
> +  UINT32                         Reserved6;
> +  UINT32                         Reserved7;
> +  UINT32                         NumberOfDescriptor;    ///< Number of memory range
> descriptor
> +  AMD_MEMORY_RANGE_DESCRIPTOR    Ranges[1];             ///< Memory
> ranges array
> +} AMD_MEMORY_INFO_HOB;
> +
> +#pragma pack (pop)
> +
> +/// Memory attribute in the memory range descriptor = AVAILABLE
> +#define AMD_MEMORY_ATTRIBUTE_AVAILABLE  0x1
> +
> +/// Memory attribute in the memory range descriptor = UMA
> +#define AMD_MEMORY_ATTRIBUTE_UMA  0x2
> +
> +/// Memory attribute in the memory range descriptor = MMIO
> +#define AMD_MEMORY_ATTRIBUTE_MMIO  0x3
> +
> +/// Memory attribute in the memory range descriptor = RESERVED
> +#define AMD_MEMORY_ATTRIBUTE_RESERVED  0x4
> +
> +#endif
> diff --git
> a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.c
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.c
> new file mode 100644
> index 0000000000..af96969471
> --- /dev/null
> +++
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.c
> @@ -0,0 +1,229 @@
> +/** @file
> +  BoardInitLib library implementation for pre-mem PEI phase.
> +
> +Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Library/BoardInitLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include "PeiMemoryInit.h"
> +
> +EFI_PEI_NOTIFY_DESCRIPTOR  mNotifyList = {
> +  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> +  &gAmdMemoryInfoHobPpiGuid,
> +  EndofAmdMemoryInfoHobPpiGuidCallBack
> +};
> +
> +/**
> +  Get Pcie base address from MSR and set PcdPciExpressBaseSize
> +
> +  @retval EFI_SUCCESS   PcdPciExpressBaseSize value set successfully.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SetPcieBaseSize (
> +  VOID
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT64      PcieBaseSize;
> +  UINT8       BusRange;
> +
> +  Status = EFI_SUCCESS;
> +
> +  // Gather the value of PcdPciExpressBaseSize from MSR
> +  BusRange     =  RShiftU64 (AsmReadMsr64 (0xC0010058), 2) & 0xF;
> +  PcieBaseSize =  MultU64x64 (LShiftU64 (1, BusRange), SIZE_1MB);
> +  PcdSet64S (PcdPciExpressBaseSize, (UINT64)PcieBaseSize);
> +  return Status;
> +}
> +
> +/**
> +  This board service detects the board type.
> +
> +  @retval EFI_SUCCESS   The board was detected successfully.
> +  @retval EFI_NOT_FOUND The board could not be detected.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardDetect (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This board service initializes board-specific debug devices.
> +
> +  @retval EFI_SUCCESS   Board-specific debug initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardDebugInit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This board service detects the boot mode.
> +
> +  @retval EFI_BOOT_MODE The boot mode.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_BOOT_MODE
> +EFIAPI
> +BoardBootModeDetect (
> +  VOID
> +  )
> +{
> +  return BOOT_WITH_FULL_CONFIGURATION;
> +}
> +
> +/**
> +  A hook for board-specific initialization prior to memory initialization.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitBeforeMemoryInit (
> +  VOID
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = PeiServicesNotifyPpi (&mNotifyList);
> +  ASSERT_EFI_ERROR (Status);
> +  Status = SetPcieBaseSize ();
> +  ASSERT_EFI_ERROR (Status);
> +  return (Status);
> +}
> +
> +/**
> +  A hook for board-specific initialization after memory initialization.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitAfterMemoryInit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific initialization prior to disabling temporary RAM.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitBeforeTempRamExit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific initialization after disabling temporary RAM.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitAfterTempRamExit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific initialization prior to silicon initialization.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitBeforeSiliconInit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific initialization after silicon initialization.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitAfterSiliconInit (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific initialization after PCI enumeration.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitAfterPciEnumeration (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific functionality for the ReadyToBoot event.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitReadyToBoot (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  A hook for board-specific functionality for the ExitBootServices event.
> +
> +  @retval EFI_SUCCESS   The board initialization was successful.
> +  @retval EFI_NOT_READY The board has not been detected yet.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BoardInitEndOfFirmware (
> +  VOID
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> diff --git
> a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.inf
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.inf
> new file mode 100644
> index 0000000000..9f3cfd47c4
> --- /dev/null
> +++
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiBoar
> dInitPreMemLib.inf
> @@ -0,0 +1,45 @@
> +## @file
> +# Board Init Library for AMD Platforms.
> +#
> +# Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 1.29
> +  BASE_NAME                      = PeiBoardInitPreMemLib
> +  FILE_GUID                      = A394D6BE-4433-4564-8FEB-2C90DD9ECE5B
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = BoardInitLib
> +
> +[LibraryClasses]
> +  BaseLib
> +  DebugLib
> +  HobLib
> +  PcdLib
> +
> +[Packages]
> +  AmdMinBoardPkg/AmdMinBoardPkg.dec
> +  MdePkg/MdePkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +
> +[Sources]
> +  AmdMemoryInfoHob.h
> +  PeiMemoryInit.h
> +  PeiBoardInitPreMemLib.c
> +  PeiMemoryInit.c
> +
> +[Guids]
> +  gAmdMemoryInfoHobGuid
> +  gEfiSmmSmramMemoryGuid
> +
> +[Ppis]
> +  gAmdMemoryInfoHobPpiGuid                                          ## CONSUMES
> +  gPeiPlatformMemorySizePpiGuid                                     ## CONSUMES
> +
> +[Pcd]
> +  gAmdMinBoardPkgTokenSpaceGuid.PcdAmdSmramAreaSize
> +  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize                    ## CONSUMES
> diff --git
> a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.c
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.c
> new file mode 100644
> index 0000000000..03f08214e2
> --- /dev/null
> +++
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.c
> @@ -0,0 +1,198 @@
> +/** @file
> +
> +Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "PeiMemoryInit.h"
> +#include "AmdMemoryInfoHob.h"
> +
> +/**
> +  A Callback routine only AmdMemoryInfoHob is ready.
> +
> +  @param[in]  PeiServices       General purpose services available to every
> PEIM.
> +  @param[in]  NotifyDescriptor  The descriptor for the notification event.
> +  @param[in]  Ppi               The context of the notification.
> +
> +  @retval EFI_SUCCESS   Platform Pre Memory initialization is successful.
> +          EFI_STATUS    Various failure from underlying routine calls.
> +**/
> +EFI_STATUS
> +EFIAPI
> +EndofAmdMemoryInfoHobPpiGuidCallBack (
> +  IN EFI_PEI_SERVICES           **PeiServices,
> +  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
> +  IN VOID                       *Ppi
> +  )
> +{
> +  PEI_PLATFORM_MEMORY_SIZE_PPI    *PlatformMemorySizePpi;
> +  EFI_STATUS                      Status;
> +  UINT64                          MemorySize;
> +  AMD_MEMORY_INFO_HOB             *AmdMemoryInfoHob;
> +  AMD_MEMORY_RANGE_DESCRIPTOR     *AmdMemoryInfoRange;
> +  EFI_HOB_GUID_TYPE               *GuidHob;
> +  EFI_PEI_HOB_POINTERS            Hob;
> +  UINTN                           Index;
> +  EFI_SMRAM_HOB_DESCRIPTOR_BLOCK  *SmramHobDescriptorBlock;
> +  EFI_PHYSICAL_ADDRESS            SmramBaseAddress;
> +  UINT8                           SmramRanges;
> +  UINTN                           DataSize;
> +
> +  SmramBaseAddress = 0;
> +  SmramRanges      = 0;
> +
> +  // Locate AMD_MEMORY_INFO_HOB Guided HOB and retrieve data
> +  AmdMemoryInfoHob = NULL;
> +  GuidHob          = GetFirstGuidHob (&gAmdMemoryInfoHobGuid);
> +  if (GuidHob != NULL) {
> +    AmdMemoryInfoHob = GET_GUID_HOB_DATA (GuidHob);
> +  }
> +
> +  if (AmdMemoryInfoHob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "Error: Could not locate
> AMD_MEMORY_INFO_HOB.\n"));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  DEBUG ((DEBUG_INFO, "AMD_MEMORY_INFO_HOB at 0x%X\n",
> AmdMemoryInfoHob));
> +  DEBUG ((DEBUG_INFO, "  Version: 0x%X\n", AmdMemoryInfoHob-
> >Version));
> +  DEBUG ((DEBUG_INFO, "  NumberOfDescriptor: 0x%X\n",
> AmdMemoryInfoHob->NumberOfDescriptor));
> +
> +  //
> +  // Build Descriptors
> +  //
> +  DEBUG ((DEBUG_INFO, "\nAMD HOB Descriptors:"));
> +  for (Index = 0; Index < AmdMemoryInfoHob->NumberOfDescriptor;
> Index++) {
> +    AmdMemoryInfoRange = (AMD_MEMORY_RANGE_DESCRIPTOR
> *)&(AmdMemoryInfoHob->Ranges[Index]);
> +
> +    DEBUG ((DEBUG_INFO, "\n Index: %d\n", Index));
> +    DEBUG ((DEBUG_INFO, "   Base: 0x%lX\n", AmdMemoryInfoRange-
> >Base));
> +    DEBUG ((DEBUG_INFO, "   Size: 0x%lX\n", AmdMemoryInfoRange->Size));
> +    DEBUG ((DEBUG_INFO, "   Attribute: 0x%X\n", AmdMemoryInfoRange-
> >Attribute));
> +
> +    switch (AmdMemoryInfoRange->Attribute) {
> +      case AMD_MEMORY_ATTRIBUTE_AVAILABLE:
> +        if (AmdMemoryInfoRange->Base < SIZE_4GB) {
> +          SmramRanges = 1u;
> +          // Set SMRAM base at heighest range below 4GB
> +          SmramBaseAddress = AmdMemoryInfoRange->Base +
> AmdMemoryInfoRange->Size - FixedPcdGet32 (PcdAmdSmramAreaSize);
> +          BuildResourceDescriptorHob (
> +            EFI_RESOURCE_MEMORY_RESERVED,
> +            (EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
> EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),
> +            SmramBaseAddress,
> +            FixedPcdGet32 (PcdAmdSmramAreaSize)
> +            );
> +          DEBUG ((
> +            DEBUG_INFO,
> +            "SMRAM RESERVED_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
> +            SmramBaseAddress,
> +            FixedPcdGet32 (PcdAmdSmramAreaSize)
> +            ));
> +
> +          AmdMemoryInfoRange->Size -= FixedPcdGet32
> (PcdAmdSmramAreaSize);
> +        }
> +
> +        if (AmdMemoryInfoRange->Size) {
> +          BuildResourceDescriptorHob (
> +            EFI_RESOURCE_SYSTEM_MEMORY,
> +            SYSTEM_MEMORY_ATTRIBUTES,
> +            AmdMemoryInfoRange->Base,
> +            AmdMemoryInfoRange->Size
> +            );
> +
> +          DEBUG ((
> +            DEBUG_INFO,
> +            "SYSTEM_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
> +            AmdMemoryInfoRange->Base,
> +            AmdMemoryInfoRange->Size
> +            ));
> +        }
> +
> +        break;
> +
> +      case AMD_MEMORY_ATTRIBUTE_MMIO:
> +        BuildResourceDescriptorHob (
> +          EFI_RESOURCE_MEMORY_MAPPED_IO,
> +          MEMORY_MAPPED_IO_ATTRIBUTES,
> +          AmdMemoryInfoRange->Base,
> +          AmdMemoryInfoRange->Size
> +          );
> +
> +        DEBUG ((
> +          DEBUG_INFO,
> +          "MMIO: Base = 0x%lX, Size = 0x%lX\n",
> +          AmdMemoryInfoRange->Base,
> +          AmdMemoryInfoRange->Size
> +          ));
> +        break;
> +
> +      case AMD_MEMORY_ATTRIBUTE_RESERVED:
> +      case AMD_MEMORY_ATTRIBUTE_UMA:
> +      default:
> +        BuildResourceDescriptorHob (
> +          EFI_RESOURCE_MEMORY_RESERVED,
> +          0,
> +          AmdMemoryInfoRange->Base,
> +          AmdMemoryInfoRange->Size
> +          );
> +
> +        DEBUG ((
> +          DEBUG_INFO,
> +          "RESERVED_MEMORY: Base = 0x%lX, Size = 0x%lX\n",
> +          AmdMemoryInfoRange->Base,
> +          AmdMemoryInfoRange->Size
> +          ));
> +        break;
> +    }
> +  }
> +
> +  ASSERT (SmramRanges > 0);
> +  DataSize  = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK);
> +  DataSize += ((SmramRanges - 1) * sizeof (EFI_SMRAM_DESCRIPTOR));
> +
> +  Hob.Raw = BuildGuidHob (
> +              &gEfiSmmSmramMemoryGuid,
> +              DataSize
> +              );
> +  ASSERT (Hob.Raw);
> +
> +  SmramHobDescriptorBlock                              =
> (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)(Hob.Raw);
> +  SmramHobDescriptorBlock->NumberOfSmmReservedRegions  =
> SmramRanges;
> +  SmramHobDescriptorBlock->Descriptor[0].PhysicalStart =
> SmramBaseAddress;
> +  SmramHobDescriptorBlock->Descriptor[0].CpuStart      =
> SmramBaseAddress;
> +  SmramHobDescriptorBlock->Descriptor[0].PhysicalSize  = FixedPcdGet32
> (PcdAmdSmramAreaSize);
> +  SmramHobDescriptorBlock->Descriptor[0].RegionState   =
> EFI_SMRAM_CLOSED | EFI_CACHEABLE;
> +
> +  Status = PeiServicesLocatePpi (
> +             &gPeiPlatformMemorySizePpiGuid,
> +             0,
> +             NULL,
> +             (VOID **)&PlatformMemorySizePpi
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PlatformMemorySizePpi->GetPlatformMemorySize (
> +                                    PeiServices,
> +                                    PlatformMemorySizePpi,
> +                                    &MemorySize
> +                                    );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "%a: Error(%r) in getting Platform Memory size.\n",
> +      __func__,
> +      Status
> +      ));
> +    return Status;
> +  }
> +
> +  DEBUG ((
> +    DEBUG_INFO,
> +    "Installing PeiMemory, BaseAddress = 0x%x, Size = 0x%x\n",
> +    0,
> +    MemorySize
> +    ));
> +  Status = PeiServicesInstallPeiMemory (0, MemorySize);
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> diff --git
> a/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.h
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.h
> new file mode 100644
> index 0000000000..726db25543
> --- /dev/null
> +++
> b/Platform/AMD/AmdMinBoardPkg/Library/PeiBoardInitPreMemLib/PeiMem
> oryInit.h
> @@ -0,0 +1,50 @@
> +/** @file
> +  This file contains definitions required for memory initialization in PEI phase.
> +
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#ifndef PEI_MEMORY_INIT_PEI_H_
> +#define PEI_MEMORY_INIT_PEI_H_
> +
> +#include <Uefi/UefiBaseType.h>
> +#include <Pi/PiPeiCis.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Ppi/PlatformMemorySize.h>
> +#include <Guid/SmramMemoryReserve.h>
> +#include <Library/HobLib.h>
> +#include <Library/DebugLib.h>
> +
> +#define SYSTEM_MEMORY_ATTRIBUTES  (                \
> +  EFI_RESOURCE_ATTRIBUTE_PRESENT |                 \
> +  EFI_RESOURCE_ATTRIBUTE_INITIALIZED |             \
> +  EFI_RESOURCE_ATTRIBUTE_TESTED |                  \
> +  EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |             \
> +  EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |       \
> +  EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \
> +  EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE      \
> +  )
> +
> +#define MEMORY_MAPPED_IO_ATTRIBUTES  ( \
> +  EFI_RESOURCE_ATTRIBUTE_PRESENT |     \
> +  EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
> +  EFI_RESOURCE_ATTRIBUTE_TESTED |      \
> +  EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE   \
> +  )
> +
> +/**
> +  A Callback routine only AmdMemoryInfoHob is ready.
> +
> +  @retval EFI_SUCCESS   Platform Pre Memory initialization is successfull.
> +          EFI_STATUS    Various failure from underlying routine calls.
> +**/
> +EFI_STATUS
> +EFIAPI
> +EndofAmdMemoryInfoHobPpiGuidCallBack (
> +  IN EFI_PEI_SERVICES           **PeiServices,
> +  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
> +  IN VOID                       *Ppi
> +  );
> +
> +#endif // PEI_MEMORY_INIT_PEI_H_
> --
> 2.34.1



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



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

end of thread, other threads:[~2024-05-20 13:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <c27559a99b68dc7a6abf881c7a17d09b6f469a31.1716212901.git.AbdulLateef.Attar@amd.com>
2024-05-20 13:49 ` [edk2-devel] [edk2-platforms RESEND v2 3/5] AmdMinBoardPkg: Implement BoardInitLib for PEI phase Abdul Lateef Attar via groups.io
2024-05-20 13:54   ` Chang, Abner via groups.io

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