public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "maobibo" <maobibo@loongson.cn>
To: Chao Li <lichao@loongson.cn>, devel@edk2.groups.io
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Jiewen Yao <jiewen.yao@intel.com>,
	Jordan Justen <jordan.l.justen@intel.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Xianglai Li <lixianglai@loongson.cn>
Subject: Re: [edk2-devel] [PATCH v5 34/36] OvmfPkg/LoongArchVirt: Support PEI phase
Date: Wed, 3 Jan 2024 16:12:42 +0800	[thread overview]
Message-ID: <e01ecd70-d834-a0b9-e851-828d1bfa330e@loongson.cn> (raw)
In-Reply-To: <20231228100753.1766816-1-lichao@loongson.cn>



On 2023/12/28 下午6:07, Chao Li wrote:
> Platfrom PEI module for LoongArch platfrom initialization.
> 
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4584
> 
> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Signed-off-by: Chao Li <lichao@loongson.cn>
> Co-authored-by: Xianglai Li <lixianglai@loongson.cn>
> Co-authored-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   OvmfPkg/LoongArchVirt/PlatformPei/Fv.c        |  39 ++
>   OvmfPkg/LoongArchVirt/PlatformPei/MemDetect.c | 201 +++++++++
>   OvmfPkg/LoongArchVirt/PlatformPei/Platform.c  | 393 ++++++++++++++++++
>   OvmfPkg/LoongArchVirt/PlatformPei/Platform.h  | 146 +++++++
>   .../LoongArchVirt/PlatformPei/PlatformPei.inf |  72 ++++
>   5 files changed, 851 insertions(+)
>   create mode 100644 OvmfPkg/LoongArchVirt/PlatformPei/Fv.c
>   create mode 100644 OvmfPkg/LoongArchVirt/PlatformPei/MemDetect.c
>   create mode 100644 OvmfPkg/LoongArchVirt/PlatformPei/Platform.c
>   create mode 100644 OvmfPkg/LoongArchVirt/PlatformPei/Platform.h
>   create mode 100644 OvmfPkg/LoongArchVirt/PlatformPei/PlatformPei.inf
> 
> diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/Fv.c b/OvmfPkg/LoongArchVirt/PlatformPei/Fv.c
> new file mode 100644
> index 0000000000..d46326f135
> --- /dev/null
> +++ b/OvmfPkg/LoongArchVirt/PlatformPei/Fv.c
> @@ -0,0 +1,39 @@
> +/** @file
> +  Build FV related hobs for platform.
> +
> +  Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Library/DebugLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PcdLib.h>
> +#include "Platform.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 (
> +    FixedPcdGet64 (PcdOvmfSecPeiTempRamBase),
> +    FixedPcdGet32 (PcdOvmfSecPeiTempRamSize),
> +    EfiBootServicesData
> +    );
> +
> +  return EFI_SUCCESS;
> +}
> diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/MemDetect.c b/OvmfPkg/LoongArchVirt/PlatformPei/MemDetect.c
> new file mode 100644
> index 0000000000..9c90413524
> --- /dev/null
> +++ b/OvmfPkg/LoongArchVirt/PlatformPei/MemDetect.c
> @@ -0,0 +1,201 @@
> +/** @file
> +  Memory Detection for Virtual Machines.
> +
> +  Copyright (c) 2024 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/DebugLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PeimEntryPoint.h>
> +#include <Library/QemuFwCfgLib.h>
> +#include <Library/ResourcePublicationLib.h>
> +#include <Register/LoongArch64/Csr.h>
> +#include "Platform.h"
> +
> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS  (128)
> +#define LOONGARCH_FW_RAM_TOP                BASE_256MB
> +
> +/**
> +  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   = FixedPcdGet64 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize);
> +  RamTop = LOONGARCH_FW_RAM_TOP;
> +  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;
> +  MEMMAP_ENTRY          MemoryMapEntry;
> +  MEMMAP_ENTRY          *StartEntry;
> +  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);
> +  }
> +
> +  //
> +  // When 0 address protection is enabled,
> +  // 0-4k memory needs to be preallocated to prevent UEFI applications from allocating use,
> +  // such as grub
> +  //
> +  if (PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT0) {
> +    BuildMemoryAllocationHob (
> +      0,
> +      EFI_PAGE_SIZE,
> +      EfiBootServicesData
> +      );
> +  }
> +}
> +
> +/**
> +  Gets the Virtual Memory Map of corresponding platforms.
> +
> +  This Virtual Memory Map is used by initialize the MMU on corresponding
> +  platforms.
> +
> +  @param[out]   MemoryTable    Array of MEMORY_REGION_DESCRIPTOR
> +                               describing a Physical-to-Virtual Memory
> +                               mapping. This array must be ended by a
> +                               zero-filled entry. The allocated memory
> +                               will not be freed.
> +**/
> +VOID
> +EFIAPI
> +GetMemoryMapPolicy (
> +  OUT MEMORY_REGION_DESCRIPTOR  **MemoryTable
> +  )
> +{
> +  EFI_STATUS                Status;
> +  FIRMWARE_CONFIG_ITEM      FwCfgItem;
> +  UINTN                     FwCfgSize;
> +  MEMMAP_ENTRY              MemoryMapEntry;
> +  MEMMAP_ENTRY              *StartEntry;
> +  MEMMAP_ENTRY              *pEntry;
> +  UINTN                     Processed;
> +  MEMORY_REGION_DESCRIPTOR  *VirtualMemoryTable;
> +  UINTN                     Index = 0;
> +
> +  ASSERT (MemoryTable != NULL);
> +
> +  VirtualMemoryTable = AllocatePool (
> +                         sizeof (MEMORY_REGION_DESCRIPTOR) *
> +                         MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
> +                         );
> +
> +  //
> +  // Add the 0x10000000-0x20000000. In the virtual machine, this area use for CPU UART, flash, PIC etc.
> +  //
> +  VirtualMemoryTable[Index].PhysicalBase = 0x10000000;
> +  VirtualMemoryTable[Index].VirtualBase  = VirtualMemoryTable[Index].PhysicalBase;
> +  VirtualMemoryTable[Index].Length       = 0x10000000;
> +  VirtualMemoryTable[Index].Attributes   = PAGE_VALID | PLV_KERNEL |  CACHE_SUC | PAGE_DIRTY | PAGE_GLOBAL;
> +  ++Index;
> +
> +  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));
> +    ZeroMem (&VirtualMemoryTable[Index], sizeof (MEMORY_REGION_DESCRIPTOR));
> +    *MemoryTable = VirtualMemoryTable;
> +    return;
> +  }
> +
> +  if (FwCfgSize % sizeof MemoryMapEntry != 0) {
> +    DEBUG ((DEBUG_ERROR, "no MemoryMapEntry FwCfgSize:%d\n", FwCfgSize));
> +  }
> +
> +  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));
> +    VirtualMemoryTable[Index].PhysicalBase = pEntry->BaseAddr;
> +    VirtualMemoryTable[Index].VirtualBase  = VirtualMemoryTable[Index].PhysicalBase;
> +    VirtualMemoryTable[Index].Length       = pEntry->Length;
> +    VirtualMemoryTable[Index].Attributes   = PAGE_VALID | PLV_KERNEL |  CACHE_CC | PAGE_DIRTY | PAGE_GLOBAL;
> +    ++Index;
> +  }
> +
> +  FreePages (StartEntry, EFI_SIZE_TO_PAGES (FwCfgSize));
> +  // End of Table
> +  ZeroMem (&VirtualMemoryTable[Index], sizeof (MEMORY_REGION_DESCRIPTOR));
> +  *MemoryTable = VirtualMemoryTable;
> +}
> diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c
> new file mode 100644
> index 0000000000..6282c413c7
> --- /dev/null
> +++ b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c
> @@ -0,0 +1,393 @@
> +/** @file
> +  Platform PEI driver
> +
> +  Copyright (c) 2024 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/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/MpInitLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PeimEntryPoint.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/ResourcePublicationLib.h>
> +#include <Library/PlatformHookLib.h>
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Library/QemuFwCfgLib.h>
> +#include <Guid/FdtHob.h>
> +#include <libfdt.h>
> +#include <Ppi/MasterBootMode.h>
> +#include <Register/LoongArch64/Cpucfg.h>
> +#include <Register/LoongArch64/Csr.h>
> +
> +#include "Platform.h"
> +
> +VOID
> +SaveRtcRegisterAddressHob (
> +  UINT64  RtcRegisterBase
> +  );
> +
> +/* 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
> +};
> +
> +STATIC EFI_BOOT_MODE  mBootMode = BOOT_WITH_FULL_CONFIGURATION;
> +
> +/**
> +  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)
> +    );
> +}
> +
> +/** Get the Rtc base address from the DT.
> +
> +  This function fetches the node referenced in the "loongson,ls7a-rtc"
> +  property of the "reg" node and returns the base address of
> +  the RTC.
> +
> +  @param [in]   Fdt                   Pointer to a Flattened Device Tree (Fdt).
> +  @param [out]  RtcBaseAddress  If success, contains the base address
> +                                      of the Rtc.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_NOT_FOUND           RTC info not found in DT.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +GetRtcAddress (
> +  IN  CONST VOID    *Fdt,
> +  OUT       UINT64  *RtcBaseAddress
> +  )
> +{
> +  INT32         Node;
> +  INT32         Prev;
> +  CONST CHAR8   *Type;
> +  INT32         Len;
> +  CONST UINT64  *RegProp;
> +  EFI_STATUS    Status;
> +
> +  if ((Fdt == NULL) || (fdt_check_header (Fdt) != 0)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = EFI_NOT_FOUND;
> +  for (Prev = 0; ; Prev = Node) {
> +    Node = fdt_next_node (Fdt, Prev, NULL);
> +    if (Node < 0) {
> +      break;
> +    }
> +
> +    //
> +    // Check for memory node
> +    //
> +    Type = fdt_getprop (Fdt, Node, "compatible", &Len);
> +    if ((Type) && (AsciiStrnCmp (Type, "loongson,ls7a-rtc", Len) == 0)) {
> +      //
> +      // Get the 'reg' property of this node. For now, we will assume
> +      // two 8 byte quantities for base and size, respectively.
> +      //
> +      RegProp = fdt_getprop (Fdt, Node, "reg", &Len);
> +      if ((RegProp != 0) && (Len == (2 * sizeof (UINT64)))) {
> +        *RtcBaseAddress = SwapBytes64 (RegProp[0]);
> +        Status          = RETURN_SUCCESS;
> +        DEBUG ((DEBUG_INFO, "%a Len %d RtcBase %llx\n", __func__, Len, *RtcBaseAddress));
> +        break;
> +      } else {
> +        DEBUG ((DEBUG_ERROR, "%a: Failed to parse FDT rtc node\n", __FUNCTION__));
> +        break;
> +      }
> +    }
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  Misc Initialization.
> +
> +  @param  VOID
> +
> +  @return  VOID
> +**/
> +VOID
> +MiscInitialization (
> +  VOID
> +  )
> +{
> +  CPUCFG_REG1_INFO_DATA  CpucfgReg1Data;
> +  UINT8                  CpuPhysMemAddressWidth;
> +
> +  DEBUG ((DEBUG_INFO, "==%a==\n", __func__));
> +
> +  //
> +  // Get the the CPU physical memory address width.
> +  //
> +  AsmCpucfg (CPUCFG_REG1_INFO, &CpucfgReg1Data.Uint32);
> +
> +  CpuPhysMemAddressWidth = (UINT8)(CpucfgReg1Data.Bits.PALEN + 1);
> +
> +  //
> +  // Creat CPU HOBs.
> +  //
> +  BuildCpuHob (CpuPhysMemAddressWidth, FixedPcdGet8 (PcdPrePiCpuIoSize));
> +}
> +
> +/**
> +  add fdt hand off block.
> +
> +  @param  VOID
> +
> +  @return  VOID
> +**/
> +VOID
> +AddFdtHob (
> +  VOID
> +  )
> +{
> +  VOID           *Base;
> +  VOID           *NewBase;
> +  UINTN          FdtSize;
> +  UINTN          FdtPages;
> +  UINT64         *FdtHobData;
> +  UINT64         RtcBaseAddress;
> +  RETURN_STATUS  Status;
> +
> +  Base = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress);
> +  ASSERT (Base != NULL);
> +
> +  Status = GetRtcAddress (Base, &RtcBaseAddress);
> +  if (RETURN_ERROR (Status)) {
> +    return;
> +  }
> +
> +  SaveRtcRegisterAddressHob (RtcBaseAddress);
> +
> +  FdtSize  = fdt_totalsize (Base) + PcdGet32 (PcdDeviceTreeAllocationPadding);
> +  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
> +ReportSystemMemorySize (
> +  VOID
> +  )
> +{
> +  UINT64  RamSize;
> +
> +  QemuFwCfgSelectItem (QemuFwCfgItemRamSize);
> +  RamSize = QemuFwCfgRead64 ();
> +  DEBUG ((
> +    DEBUG_INFO,
> +    "%a: QEMU reports %dM system memory\n",
> +    __FUNCTION__,
> +    RamSize/1024/1024
> +    ));
> +
> +  //
> +  // Assert false if QEMU report system memory size is less then 256M.
> +  //
> +  if (RamSize <= SIZE_256MB) {
> +    ASSERT (FALSE);
> +  }
> +}
> +
> +/**
> +  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;
> +  UINTN                     TranslationTableSize;
> +  MEMORY_REGION_DESCRIPTOR  *MemoryTable;
> +
> +  DEBUG ((DEBUG_INFO, "Platform PEIM Loaded\n"));
> +
> +  Status = PeiServicesSetBootMode (mBootMode);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PeiServicesInstallPpi (&mPpiListBootMode);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  ReportSystemMemorySize ();
> +
> +  PublishPeiMemory ();
> +
> +  PeiFvInitialization ();
> +  InitializeRamRegions ();
> +  MemMapInitialization ();
> +
> +  Status = PlatformHookSerialPortInitialize ();
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Collect numbers of on line processors and all of APs APIC ID
> +  // TODO: Current, the NULL library is used, this library will be populated in the future.
> +  //
> +  CollectAllProcessorResource ();
> +
> +  MiscInitialization ();
> +
> +  AddFdtHob ();
> +
> +  GetMemoryMapPolicy (&MemoryTable);
> +  Status = ConfigureMemoryManagementUnit (
> +             MemoryTable,
> +             NULL,
> +             &TranslationTableSize
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  //
> +  // Open MMU.
> +  //
> +  DEBUG ((DEBUG_INFO, "Open MMU start.\n"));
> +  CsrXChg (LOONGARCH_CSR_CRMD, BIT4, BIT4|BIT3);
> +  DEBUG ((DEBUG_INFO, "Open MMU done.\n"));
> +
> +  MpInitLibInitialize ();
> +
> +  return EFI_SUCCESS;
> +}
> diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/Platform.h b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.h
> new file mode 100644
> index 0000000000..0774b0e54a
> --- /dev/null
> +++ b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.h
> @@ -0,0 +1,146 @@
> +/** @file
> +  Platform PEI module include file.
> +
> +  Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef PLATFORM_H_
> +#define PLATFORM_H_
> +
> +#include <IndustryStandard/E820.h>
> +#include <IndustryStandard/Pci22.h>
> +#include <Library/CpuMmuLib.h>
> +
> +typedef struct {
> +  UINT64    BaseAddr;
> +  UINT64    Length;
> +  UINT32    Type;
> +  UINT32    Reserved;
> +} MEMMAP_ENTRY;
> +
> +VOID
> +EFIAPI
> +CollectAllProcessorResource (
> +  VOID
> +  );
> +
> +VOID
> +EFIAPI
> +SaveProcessorResource (
> +  VOID
> +  );
> +
> +/**
> +  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
> +  );
> +
> +/**
> +  Gets the Virtual Memory Map of corresponding platforms.
> +
> +  This Virtual Memory Map is used by initialize the MMU on corresponding
> +  platforms.
> +
> +  @param[out]   MemoryTable    Array of MEMORY_REGION_DESCRIPTOR
> +                               describing a Physical-to-Virtual Memory
> +                               mapping. This array must be ended by a
> +                               zero-filled entry. The allocated memory
> +                               will not be freed.
> +**/
> +VOID
> +EFIAPI
> +GetMemoryMapPolicy (
> +  OUT MEMORY_REGION_DESCRIPTOR  **MemoryTable
> +  );
> +
> +/**
> +  Create a page table and initialize the memory management unit(MMU).
> +
> +  @param[in]  MemoryTable           A pointer to a memory ragion table.
> +  @param[out] TranslationTableBase  A pointer to a translation table base address.
> +  @param[out] TranslationTableSize  A pointer to a translation table base size.
> +
> +  @retval  EFI_SUCCESS                Configure MMU successfully.
> +           EFI_INVALID_PARAMETER      MemoryTable is NULL.
> +           EFI_UNSUPPORTED            Out of memory space or size not aligned.
> +**/
> +EFI_STATUS
> +EFIAPI
> +ConfigureMemoryManagementUnit (
> +  IN  MEMORY_REGION_DESCRIPTOR  *MemoryTable,
> +  OUT VOID                      **TranslationTableBase OPTIONAL,
> +  OUT UINTN                     *TranslationTableSize  OPTIONAL
> +  );
> +
> +#endif // PLATFORM_H_
> diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/PlatformPei.inf b/OvmfPkg/LoongArchVirt/PlatformPei/PlatformPei.inf
> new file mode 100644
> index 0000000000..e793a4da85
> --- /dev/null
> +++ b/OvmfPkg/LoongArchVirt/PlatformPei/PlatformPei.inf
> @@ -0,0 +1,72 @@
> +## @file
> +#  Platform PEI driver
> +#
> +#  Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 1.29
> +  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]
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  OvmfPkg/OvmfPkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> +
> +[Ppis]
> +  gEfiPeiMasterBootModePpiGuid
> +
> +[Guids]
> +  gEfiMemoryTypeInformationGuid
> +  gFdtHobGuid
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  CollectApResourceLib
> +  CpuMmuLib
> +  DebugLib
> +  HobLib
> +  IoLib
> +  MemoryAllocationLib
> +  MpInitLib
> +  PcdLib
> +  PeiResourcePublicationLib
> +  PeiServicesLib
> +  PeiServicesTablePointerLib
> +  PeimEntryPoint
> +  PlatformHookLib
> +  QemuFwCfgLib
> +  RealTimeClockLib
> +  TimerLib
> +
> +[Pcd]
> +  gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress
> +  gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeAllocationPadding
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask
> +
> +[FixedPcd]
> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase
> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
> +  gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize
> +  gUefiCpuPkgTokenSpaceGuid.PcdCpuExceptionVectorBaseAddress
> +
> +[Depex]
> +  TRUE
> 
Reviewed-by: Bibo Mao <maobibo@loongson.cn>



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



  reply	other threads:[~2024-01-03  8:12 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-28 10:03 [edk2-devel] [PATCH v5 00/36] Enable LoongArch virtual machine in edk2 Chao Li
2023-12-28 10:04 ` [edk2-devel] [PATCH v5 01/36] MdePkg: Add the header file named Csr.h for LoongArch64 Chao Li
2023-12-28 10:04 ` [edk2-devel] [PATCH v5 02/36] MdePkg: Add LoongArch64 FPU function set into BaseCpuLib Chao Li
2023-12-28 10:04 ` [edk2-devel] [PATCH v5 03/36] MdePkg: Add LoongArch64 exception function set into BaseLib Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 04/36] MdePkg: Add LoongArch64 local interrupt " Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 06/36] MdePkg: Add read stable counter operation for LoongArch Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 07/36] MdePkg: Add CSR " Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 08/36] MdePkg: Add IOCSR " Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 09/36] MdePkg: Add a new library named PeiServicesTablePointerLibKs0 Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 10/36] UefiCpuPkg: Add LoongArch64 CPU Timer library Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 11/36] UefiCpuPkg: Add CPU exception library for LoongArch Chao Li
2023-12-28 10:05 ` [edk2-devel] [PATCH v5 12/36] UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 13/36] UefiCpuPkg: Add LoongArch64CpuMmuLib " Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 14/36] UefiCpuPkg: Add multiprocessor library for LoongArch64 Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 15/36] UefiCpuPkg: Add CpuDxe driver " Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 16/36] EmbeddedPkg: Add PcdPrePiCpuIoSize width for LOONGARCH64 Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 17/36] ArmVirtPkg: Move PCD of FDT base address and FDT padding to OvmfPkg Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 18/36] UefiCpuPkg: Add a new CPU IO 2 driver named CpuMmio2Dxe Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 19/36] ArmVirtPkg: Enable CpuMmio2Dxe Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 20/36] OvmfPkg/RiscVVirt: " Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 21/36] OvmfPkg/RiscVVirt: Remove PciCpuIo2Dxe from RiscVVirt Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 22/36] ArmVirtPkg: Move the FdtSerialPortAddressLib to OvmfPkg Chao Li
2023-12-28 10:06 ` [edk2-devel] [PATCH v5 23/36] ArmVirtPkg: Move PcdTerminalTypeGuidBuffer and PcdUninstallMemAttrProtocol into OvmfPkg Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 24/36] ArmVirtPkg: Move PlatformBootManagerLib to OvmfPkg Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 25/36] OvmfPkg/LoongArchVirt: Add stable timer driver Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 26/36] OvmfPkg/LoongArchVirt: Add a NULL library named CollectApResouceLibNull Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 27/36] OvmfPkg/LoongArchVirt: Add serial port hook library Chao Li
2024-01-03 10:07   ` maobibo
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 28/36] OvmfPkg/LoongArchVirt: Add the early serial port output library Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 29/36] OvmfPkg/LoongArchVirt: Add real time clock library Chao Li
2024-01-03 10:07   ` maobibo
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 30/36] OvmfPkg/LoongArchVirt: Add NorFlashQemuLib Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 31/36] OvmfPkg/LoongArchVirt: Add FdtQemuFwCfgLib Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 32/36] OvmfPkg/LoongArchVirt: Add reset system library Chao Li
2024-01-04  1:28   ` maobibo
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 33/36] OvmfPkg/LoongArchVirt: Support SEC phase Chao Li
2024-01-04  1:49   ` maobibo
2024-01-04  6:28     ` Chao Li
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 34/36] OvmfPkg/LoongArchVirt: Support PEI phase Chao Li
2024-01-03  8:12   ` maobibo [this message]
2023-12-28 10:07 ` [edk2-devel] [PATCH v5 35/36] OvmfPkg/LoongArchVirt: Add build file Chao Li
2023-12-28 10:08 ` [edk2-devel] [PATCH v5 36/36] OvmfPkg/LoongArchVirt: Add self introduction file Chao Li
     [not found] ` <17A4F6E18EBFD408.18542@groups.io>
2023-12-29  6:27   ` [edk2-devel] [PATCH v5 20/36] OvmfPkg/RiscVVirt: Enable CpuMmio2Dxe Chao Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e01ecd70-d834-a0b9-e851-828d1bfa330e@loongson.cn \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox