Thanks,
Chao
--------
Platform PEI module for LoongArch platform initialization.REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4054Cc: Bibo Mao <maobibo@loongson.cn>Cc: Chao Li <lichao@loongson.cn>Cc: Leif Lindholm <quic_llindhol@quicinc.com>Cc: Liming Gao <gaoliming@byosoft.com.cn>Cc: Michael D Kinney <michael.d.kinney@intel.com>Signed-off-by: xianglai li <lixianglai@loongson.cn>---.../Loongson/LoongArchQemuPkg/Loongson.dec | 23 ++.../Loongson/LoongArchQemuPkg/Loongson.dsc | 64 +++++.../Loongson/LoongArchQemuPkg/Loongson.fdf | 51 ++++.../LoongArchQemuPkg/PlatformPei/Fv.c | 58 ++++.../LoongArchQemuPkg/PlatformPei/MemDetect.c | 104 +++++++.../LoongArchQemuPkg/PlatformPei/Platform.c | 261 ++++++++++++++++++.../LoongArchQemuPkg/PlatformPei/Platform.h | 86 ++++++.../PlatformPei/PlatformPei.inf | 72 +++++8 files changed, 719 insertions(+)create mode 100644 Platform/Loongson/LoongArchQemuPkg/PlatformPei/Fv.ccreate mode 100644 Platform/Loongson/LoongArchQemuPkg/PlatformPei/MemDetect.ccreate mode 100644 Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.ccreate mode 100644 Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.hcreate mode 100644 Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.infdiff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dec b/Platform/Loongson/LoongArchQemuPkg/Loongson.decindex 61f600b20d..aeae75a678 100644--- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dec+++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dec@@ -32,7 +32,30 @@[PcdsFixedAtBuild, PcdsDynamic]gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvBase|0x0|UINT64|0x00000000gLoongArchQemuPkgTokenSpaceGuid.PcdFlashPeiFvSize|0x0|UINT32|0x00000001+ gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvBase|0x0|UINT64|0x00000003+ gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvSize|0x0|UINT32|0x00000004+ gLoongArchQemuPkgTokenSpaceGuid.PcdDeviceTreeBase|0x0|UINT64|0x00000009+ gLoongArchQemuPkgTokenSpaceGuid.PcdDeviceTreePadding|256|UINT32|0x0000000a+gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase|0|UINT64|0x0000000bgLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize|0|UINT32|0x0000000c+ gLoongArchQemuPkgTokenSpaceGuid.PcdUefiRamTop|0x0|UINT64|0x0000000d+ gLoongArchQemuPkgTokenSpaceGuid.PcdRamRegionsBottom|0x0|UINT64|0x0000000egLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvBase|0x0|UINT64|0x0000000fgLoongArchQemuPkgTokenSpaceGuid.PcdFlashSecFvSize|0x0|UINT32|0x00000010++## In the PcdsFixedAtBuild.LOONGARCH64 area, numbers start at 0x10000.+[PcdsFixedAtBuild.LOONGARCH64]+ gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize|32|UINT8|0x00010000+ gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|0|UINT8|0x00010001++## In the PcdsDynamic area, numbers start at 0x20000.+[PcdsDynamic]+ gLoongArchQemuPkgTokenSpaceGuid.PcdRamSize|0x40000000|UINT64|0x00020000+ gLoongArchQemuPkgTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x00020001+ gLoongArchQemuPkgTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00020002+ gLoongArchQemuPkgTokenSpaceGuid.PcdSwapPageDir|0x0|UINT64|0x00020003+ gLoongArchQemuPkgTokenSpaceGuid.PcdInvalidPgd|0x0|UINT64|0x00020004+ gLoongArchQemuPkgTokenSpaceGuid.PcdInvalidPud|0x0|UINT64|0x00020005+ gLoongArchQemuPkgTokenSpaceGuid.PcdInvalidPmd|0x0|UINT64|0x00020006+ gLoongArchQemuPkgTokenSpaceGuid.PcdInvalidPte|0x0|UINT64|0x00020007diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dscindex b506f70625..b78a7e3b49 100644--- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc+++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc@@ -56,16 +56,53 @@[LibraryClasses.common]PcdLib | MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf+ TimerLib | Platform/Loongson/LoongArchQemuPkg/Library/StableTimerLib/TimerLib.infPrintLib | MdePkg/Library/BasePrintLib/BasePrintLib.infBaseMemoryLib | MdePkg/Library/BaseMemoryLib/BaseMemoryLib.infBaseLib | MdePkg/Library/BaseLib/BaseLib.inf+ PerformanceLib | MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.infPeCoffLib | MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf+ CacheMaintenanceLib | MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf+ UefiDecompressLib | MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.infPeCoffGetEntryPointLib | MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.infIoLib | MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.infSerialPortLib | Platform/Loongson/LoongArchQemuPkg/Library/SerialPortLib/SerialPortLib.infDebugPrintErrorLevelLib | MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf+ FdtLib | EmbeddedPkg/Library/FdtLib/FdtLib.infPeCoffExtraActionLib | MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.infDebugAgentLib | MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf+ PeiServicesLib | MdePkg/Library/PeiServicesLib/PeiServicesLib.inf++[LibraryClasses.common.SEC]+ ReportStatusCodeLib | MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf+ HobLib | MdePkg/Library/PeiHobLib/PeiHobLib.inf+ MemoryAllocationLib | MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf++[LibraryClasses.common.PEI_CORE]+ HobLib | MdePkg/Library/PeiHobLib/PeiHobLib.inf+ PeiServicesTablePointerLib | Platform/Loongson/LoongArchQemuPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf+ MemoryAllocationLib | MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf+ PeiCoreEntryPoint | MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf+ ReportStatusCodeLib | MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf+ OemHookStatusCodeLib | MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf+ PeCoffGetEntryPointLib | MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf+ QemuFwCfgLib | Platform/Loongson/LoongArchQemuPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf+ MmuLib | Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuBaseLibPei.inf++[LibraryClasses.common.PEIM]+ HobLib | MdePkg/Library/PeiHobLib/PeiHobLib.inf+ PeiServicesTablePointerLib | Platform/Loongson/LoongArchQemuPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf+ MemoryAllocationLib | MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf+ PeimEntryPoint | MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf+ ReportStatusCodeLib | MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf+ OemHookStatusCodeLib | MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf+ PeCoffGetEntryPointLib | MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf+ PeiResourcePublicationLib | MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf+ ExtractGuidedSectionLib | MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf+ PcdLib | MdePkg/Library/PeiPcdLib/PeiPcdLib.inf+ QemuFwCfgS3Lib | OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf+ QemuFwCfgLib | Platform/Loongson/LoongArchQemuPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf+ MmuLib | Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuBaseLibPei.inf#################################################################################@@ -111,8 +148,16 @@# ASSERT_BREAKPOINT_ENABLED 0x10# ASSERT_DEADLOOP_ENABLED 0x20+#######################################################################################gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase | 0x10000gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize | 0x10000+ gLoongArchQemuPkgTokenSpaceGuid.PcdDeviceTreeBase | 0x200000+ #+ # minimal memory for uefi bios should be 512M+ # 0x00000000 - 0x10000000+ # 0x90000000 - 0xA0000000+ #+ gLoongArchQemuPkgTokenSpaceGuid.PcdUefiRamTop | 0x10000000[Components]@@ -120,3 +165,22 @@# SEC Phase modules#Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf++ #+ # PEI Phase modules+ #+ MdeModulePkg/Core/Pei/PeiMain.inf+ MdeModulePkg/Universal/PCD/Pei/Pcd.inf {+ <LibraryClasses>+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf+ }+ MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf+ MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {+ <LibraryClasses>+ NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf+ }++ Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.inf {+ <LibraryClasses>+ PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf+ }diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdfindex 9685795cda..8e257f2392 100644--- a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf+++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf@@ -45,9 +45,60 @@ READ_LOCK_STATUS = TRUEINF Platform/Loongson/LoongArchQemuPkg/Sec/SecMain.inf+#####################################################################################################+[FV.PEIFV]+FvNameGuid = 6f856a84-de7d-4af9-93a3-342b4ecb46eb+BlockSize = $(BLOCK_SIZE)+FvAlignment = 16+ERASE_POLARITY = 1+MEMORY_MAPPED = TRUE+STICKY_WRITE = TRUE+LOCK_CAP = TRUE+LOCK_STATUS = TRUE+READ_DISABLED_CAP = TRUE+READ_ENABLED_CAP = TRUE+READ_STATUS = TRUE+READ_LOCK_CAP = TRUE+READ_LOCK_STATUS = TRUE+WRITE_DISABLED_CAP = TRUE+WRITE_ENABLED_CAP = TRUE+WRITE_STATUS = TRUE+WRITE_LOCK_CAP = TRUE+WRITE_LOCK_STATUS = TRUE++APRIORI PEI {+ INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf+}++#+# PEI Phase modules+#++INF MdeModulePkg/Core/Pei/PeiMain.inf+INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf+INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf+INF Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.inf+#####################################################################################################[Rule.Common.SEC]FILE SEC = $(NAMED_GUID) {TE TE Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efiUI STRING ="$(MODULE_NAME)" Optional}++#####################################################################################################+[Rule.Common.PEI_CORE]+ FILE PEI_CORE = $(NAMED_GUID) {+ TE TE Align=Auto $(INF_OUTPUT)/$(MODULE_NAME).efi+ UI STRING ="$(MODULE_NAME)" Optional+ }++#####################################################################################################+[Rule.Common.PEIM]+ FILE PEIM = $(NAMED_GUID) {+ PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex+ PE32 PE32 Align=Auto $(INF_OUTPUT)/$(MODULE_NAME).efi+ UI STRING="$(MODULE_NAME)" Optional+ }++#####################################################################################################diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Fv.c b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Fv.cnew file mode 100644index 0000000000..06b2807d6c--- /dev/null+++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Fv.c@@ -0,0 +1,58 @@+/** @file+ Build FV related hobs for platform.++ Copyright (c) 2022 Loongson Technology Corporation Limited. All rights reserved.<BR>++ SPDX-License-Identifier: BSD-2-Clause-Patent++**/++#include "PiPei.h"+#include "Platform.h"+#include <Library/DebugLib.h>+#include <Library/HobLib.h>+#include <Library/PeiServicesLib.h>+#include <Library/PcdLib.h>++/**+ Publish PEI & DXE (Decompressed) Memory based FVs to let PEI+ and DXE know about them.++ @retval EFI_SUCCESS Platform PEI FVs were initialized successfully.+**/+EFI_STATUS+PeiFvInitialization (+ VOID+ )+{+ DEBUG ((DEBUG_INFO, "Platform PEI Firmware Volume Initialization\n"));++ //+ // Create a memory allocation HOB for the PEI FV.+ //+ BuildMemoryAllocationHob (+ PcdGet64 (PcdSecPeiTempRamBase),+ PcdGet32 (PcdSecPeiTempRamSize),+ EfiBootServicesData+ );++ //+ // Let DXE know about the DXE FV+ //+ BuildFvHob (PcdGet64 (PcdFlashDxeFvBase), PcdGet32 (PcdFlashDxeFvSize));++ //+ // Let PEI know about the DXE FV so it can find the DXE Core+ //+ DEBUG ((DEBUG_INFO, "DXEFV base:%p size:%x\n", (VOID *) (UINTN)PcdGet64 (PcdFlashDxeFvBase),+ PcdGet32 (PcdFlashDxeFvSize)));+ PeiServicesInstallFvInfoPpi (+ NULL,+ (VOID *) (UINTN)PcdGet64 (PcdFlashDxeFvBase),+ PcdGet32 (PcdFlashDxeFvSize),+ NULL,+ NULL+ );++ return EFI_SUCCESS;+}diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/MemDetect.c b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/MemDetect.cnew file mode 100644index 0000000000..fad4cff8d8--- /dev/null+++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/MemDetect.c@@ -0,0 +1,104 @@+/** @file+ Memory Detection for Virtual Machines.++ Copyright (c) 2022 Loongson Technology Corporation Limited. All rights reserved.<BR>++ SPDX-License-Identifier: BSD-2-Clause-Patent++**/++//+// The package level header files this module uses+//+#include <PiPei.h>++//+// The Library classes this module consumes+//+#include <Library/BaseMemoryLib.h>+#include <Library/MemoryAllocationLib.h>+#include <Library/DebugLib.h>+#include <Library/HobLib.h>+#include <Library/IoLib.h>+#include <Library/PcdLib.h>+#include <Library/PeimEntryPoint.h>+#include <Library/ResourcePublicationLib.h>+#include <Library/QemuFwCfgLib.h>+#include "Platform.h"++/**+ Publish PEI core memory++ @return EFI_SUCCESS The PEIM initialized successfully.+**/+EFI_STATUS+PublishPeiMemory (+ VOID+ )+{+ EFI_STATUS Status;+ UINT64 Base;+ UINT64 Size;+ UINT64 RamTop;++ //+ // Determine the range of memory to use during PEI+ //+ Base = PcdGet64 (PcdSecPeiTempRamBase) + PcdGet32 (PcdSecPeiTempRamSize);+ RamTop = PcdGet64 (PcdUefiRamTop);+ Size = RamTop - Base;++ //+ // Publish this memory to the PEI Core+ //+ Status = PublishSystemMemory (Base, Size);+ ASSERT_EFI_ERROR (Status);++ DEBUG ((DEBUG_INFO, "Publish Memory Initialize done.\n"));+ return Status;+}++/**+ Peform Memory Detection+ Publish system RAM and reserve memory regions+**/+VOID+InitializeRamRegions (+ VOID+ )+{+ EFI_STATUS Status;+ FIRMWARE_CONFIG_ITEM FwCfgItem;+ UINTN FwCfgSize;+ LOONGARCH_MEMMAP_ENTRY MemoryMapEntry;+ LOONGARCH_MEMMAP_ENTRY *StartEntry;+ LOONGARCH_MEMMAP_ENTRY *pEntry;+ UINTN Processed;++ Status = QemuFwCfgFindFile ("etc/memmap", &FwCfgItem, &FwCfgSize);+ if (EFI_ERROR (Status)) {+ DEBUG ((DEBUG_ERROR, "%a %d read etc/memmap error Status %d \n", __func__, __LINE__, Status));+ return ;+ }+ if (FwCfgSize % sizeof MemoryMapEntry != 0) {+ DEBUG ((DEBUG_ERROR, "no MemoryMapEntry FwCfgSize:%d\n", FwCfgSize));+ return ;+ }++ QemuFwCfgSelectItem (FwCfgItem);+ StartEntry = AllocatePages (EFI_SIZE_TO_PAGES (FwCfgSize));+ QemuFwCfgReadBytes (FwCfgSize, StartEntry);+ for (Processed = 0; Processed < (FwCfgSize / sizeof MemoryMapEntry); Processed++) {+ pEntry = StartEntry + Processed;+ if (pEntry->Length == 0) {+ continue;+ }++ DEBUG ((DEBUG_INFO, "MemmapEntry Base %p length %p type %d\n", pEntry->BaseAddr, pEntry->Length, pEntry->Type));+ if (pEntry->Type != EfiAcpiAddressRangeMemory) {+ continue;+ }++ AddMemoryRangeHob ( pEntry->BaseAddr, pEntry->BaseAddr + pEntry->Length);+ }+}diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.cnew file mode 100644index 0000000000..262e2750e4--- /dev/null+++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c@@ -0,0 +1,261 @@+/** @file+ Platform PEI driver++ Copyright (c) 2022 Loongson Technology Corporation Limited. All rights reserved.<BR>++ SPDX-License-Identifier: BSD-2-Clause-Patent++ @par Glossary:+ - Mem - Memory+**/++//+// The package level header files this module uses+//+#include <PiPei.h>+//+// The Library classes this module consumes+//+#include <Library/DebugLib.h>+#include <Library/HobLib.h>+#include <Library/IoLib.h>+#include <Library/MemoryAllocationLib.h>+#include <Library/BaseMemoryLib.h>+#include <Library/PcdLib.h>+#include <Library/PeimEntryPoint.h>+#include <Library/PeiServicesLib.h>+#include <Library/ResourcePublicationLib.h>+#include <Guid/MemoryTypeInformation.h>+#include <Library/QemuFwCfgLib.h>+#include <Library/MmuLib.h>+#include <Guid/FdtHob.h>+#include <libfdt.h>+#include <Ppi/MasterBootMode.h>++#include "Platform.h"++/* TODO */+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {+ { EfiReservedMemoryType, 0x004 },+ { EfiRuntimeServicesData, 0x024 },+ { EfiRuntimeServicesCode, 0x030 },+ { EfiBootServicesCode, 0x180 },+ { EfiBootServicesData, 0xF00 },+ { EfiMaxMemoryType, 0x000 }+};++//+// Module globals+//+CONST EFI_PEI_PPI_DESCRIPTOR mPpiListBootMode = {+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),+ &gEfiPeiMasterBootModePpiGuid,+ NULL+};++/**+ Create Reserved type memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddReservedMemoryBaseSizeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ UINT64 MemorySize+ )+{+ BuildResourceDescriptorHob (+ EFI_RESOURCE_MEMORY_RESERVED,+ EFI_RESOURCE_ATTRIBUTE_PRESENT |+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |+ EFI_RESOURCE_ATTRIBUTE_TESTED,+ MemoryBase,+ MemorySize+ );+}+/**+ Create system type memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddMemoryBaseSizeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ UINT64 MemorySize+ )+{+ BuildResourceDescriptorHob (+ EFI_RESOURCE_SYSTEM_MEMORY,+ EFI_RESOURCE_ATTRIBUTE_PRESENT |+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |+ EFI_RESOURCE_ATTRIBUTE_TESTED,+ MemoryBase,+ MemorySize+ );+}++/**+ Create memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddMemoryRangeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ EFI_PHYSICAL_ADDRESS MemoryLimit+ )+{+ AddMemoryBaseSizeHob (MemoryBase, (UINT64) (MemoryLimit - MemoryBase));+}+/**+ Create memory type information hand off block.++ @param VOID++ @return VOID+**/+VOID+MemMapInitialization (+ VOID+ )+{+ DEBUG ((DEBUG_INFO, "==%a==\n", __func__));+ //+ // Create Memory Type Information HOB+ //+ BuildGuidDataHob (+ &gEfiMemoryTypeInformationGuid,+ mDefaultMemoryTypeInformation,+ sizeof (mDefaultMemoryTypeInformation)+ );+}++/**+ Misc Initialization.++ @param VOID++ @return VOID+**/+VOID+MiscInitialization (+ VOID+ )+{+ DEBUG ((DEBUG_INFO, "==%a==\n", __func__));+ //+ // Creat CPU HOBs.+ //+ BuildCpuHob (PcdGet8 (PcdPrePiCpuMemorySize), PcdGet8 (PcdPrePiCpuIoSize));+}+/**+ add fdt hand off block.++ @param VOID++ @return VOID+**/+VOID+AddFdtHob (VOID)+{+ VOID *Base;+ VOID *NewBase;+ UINTN FdtSize;+ UINTN FdtPages;+ UINT64 *FdtHobData;++ Base = (VOID*)(UINTN)PcdGet64 (PcdDeviceTreeBase);+ ASSERT (Base != NULL);++ FdtSize = fdt_totalsize (Base) + PcdGet32 (PcdDeviceTreePadding);+ FdtPages = EFI_SIZE_TO_PAGES (FdtSize);+ NewBase = AllocatePages (FdtPages);+ ASSERT (NewBase != NULL);+ fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages));++ FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof *FdtHobData);+ ASSERT (FdtHobData != NULL);+ *FdtHobData = (UINTN)NewBase;+}++/**+ Fetch the size of system memory from QEMU.++ @param VOID++ @return VOID+**/+VOID+SystemMemorySizeInitialization (+ VOID+ )+{+ UINT64 RamSize;+ RETURN_STATUS PcdStatus;++ QemuFwCfgSelectItem (QemuFwCfgItemRamSize);+ RamSize= QemuFwCfgRead64 ();+ DEBUG ((DEBUG_INFO, "%a: QEMU reports %dM system memory\n", __FUNCTION__,+ RamSize/1024/1024));++ //+ // If the fw_cfg key or fw_cfg entirely is unavailable, no change to PCD.+ //+ if (RamSize == 0) {+ return;+ }++ //+ // Otherwise, set RamSize to PCD.+ //+ PcdStatus = PcdSet64S (PcdRamSize, RamSize);+ ASSERT_RETURN_ERROR (PcdStatus);+}++/**+ Perform Platform PEI initialization.++ @param FileHandle Handle of the file being invoked.+ @param PeiServices Describes the list of possible PEI Services.++ @return EFI_SUCCESS The PEIM initialized successfully.+**/+EFI_STATUS+EFIAPI+InitializePlatform (+ IN EFI_PEI_FILE_HANDLE FileHandle,+ IN CONST EFI_PEI_SERVICES **PeiServices+ )+{+ EFI_STATUS Status;++ DEBUG ((DEBUG_INFO, "Platform PEIM Loaded\n"));++ Status = PeiServicesInstallPpi (&mPpiListBootMode);+ ASSERT_EFI_ERROR (Status);++ SystemMemorySizeInitialization ();+ PublishPeiMemory ();+ PeiFvInitialization ();+ InitializeRamRegions ();+ MemMapInitialization ();+ MiscInitialization ();+ AddFdtHob ();+ ConfigureMmu ();++ return EFI_SUCCESS;+}diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.h b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.hnew file mode 100644index 0000000000..38d358b335--- /dev/null+++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.h@@ -0,0 +1,86 @@+/** @file+ Platform PEI module include file.++ Copyright (c) 2022 Loongson Technology Corporation Limited. All rights reserved.<BR>++ SPDX-License-Identifier: BSD-2-Clause-Patent++**/++#ifndef PLATFORM_H_+#define PLATFORM_H_++#include <IndustryStandard/Pci22.h>++/**+ Create system type memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddMemoryBaseSizeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ UINT64 MemorySize+ );++/**+ Create memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddMemoryRangeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ EFI_PHYSICAL_ADDRESS MemoryLimit+ );++/**+ Create Reserved type memory range hand off block.++ @param MemoryBase memory base address.+ @param MemoryLimit memory length.++ @return VOID+**/+VOID+AddReservedMemoryBaseSizeHob (+ EFI_PHYSICAL_ADDRESS MemoryBase,+ UINT64 MemorySize+ );+/**+ Publish PEI core memory++ @return EFI_SUCCESS The PEIM initialized successfully.+**/+EFI_STATUS+PublishPeiMemory (+ VOID+ );+/**+ Publish system RAM and reserve memory regions++ @return VOID+**/+VOID+InitializeRamRegions (+ VOID+ );++/**+ Publish PEI & DXE (Decompressed) Memory based FVs to let PEI+ and DXE know about them.++ @retval EFI_SUCCESS Platform PEI FVs were initialized successfully.+**/+EFI_STATUS+PeiFvInitialization (+ VOID+ );++#endif // PLATFORM_H_diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.inf b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.infnew file mode 100644index 0000000000..417c5e586a--- /dev/null+++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/PlatformPei.inf@@ -0,0 +1,72 @@+## @file+# Platform PEI driver+#+# Copyright (c) 2022 Loongson Technology Corporation Limited. All rights reserved.<BR>+#+# SPDX-License-Identifier: BSD-2-Clause-Patent+#+##++[Defines]+ INF_VERSION = 0x00010005+ BASE_NAME = PlatformPei+ FILE_GUID = 4c0e81e5-e8e3-4eef-b24b-19b686e9ab53+ MODULE_TYPE = PEIM+ VERSION_STRING = 1.0+ ENTRY_POINT = InitializePlatform++#+# VALID_ARCHITECTURES = LOONGARCH64+#++[Sources]+ Fv.c+ MemDetect.c+ Platform.c++[Packages]+ MdePkg/MdePkg.dec+ MdeModulePkg/MdeModulePkg.dec+ EmbeddedPkg/EmbeddedPkg.dec+ Platform/Loongson/LoongArchQemuPkg/Loongson.dec+ OvmfPkg/OvmfPkg.dec++[Ppis]+ gEfiPeiMasterBootModePpiGuid++[Guids]+ gEfiMemoryTypeInformationGuid+ gFdtHobGuid++[LibraryClasses]+ DebugLib+ BaseMemoryLib+ HobLib+ IoLib+ PeiResourcePublicationLib+ PeiServicesLib+ PeiServicesTablePointerLib+ PeimEntryPoint+ QemuFwCfgLib+ PcdLib+ TimerLib+ MmuLib+ MemoryAllocationLib++[Pcd]+ gLoongArchQemuPkgTokenSpaceGuid.PcdRamSize+ gLoongArchQemuPkgTokenSpaceGuid.PcdDeviceTreeBase+ gLoongArchQemuPkgTokenSpaceGuid.PcdDeviceTreePadding++[FixedPcd]+ gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvBase+ gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvSize+ gLoongArchQemuPkgTokenSpaceGuid.PcdRamRegionsBottom+ gLoongArchQemuPkgTokenSpaceGuid.PcdUefiRamTop+ gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamBase+ gLoongArchQemuPkgTokenSpaceGuid.PcdSecPeiTempRamSize+ gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize+ gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize++[Depex]+ TRUE--2.31.1- - - - - -Groups.io Links: You receive all messages sent to this group.View/Reply Online (#96277): https://edk2.groups.io/g/devel/message/96277Mute This Topic: https://groups.io/mt/94955174/6496846Group Owner: devel+owner@edk2.groups.ioUnsubscribe: https://edk2.groups.io/g/devel/unsub [lichao@loongson.cn]- - - - - -