From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id DAA5B7803D9 for ; Wed, 3 Jan 2024 08:12:56 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=sh6jrnPNpXq8n8xXZOcOmZgnOSfSp93LV5GNE6vaIK4=; c=relaxed/simple; d=groups.io; h=Subject:To:Cc:References:From:Message-ID:Date:User-Agent:MIME-Version:In-Reply-To:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Language:Content-Transfer-Encoding; s=20140610; t=1704269575; v=1; b=KL6KI58xdm27bU2c5Yp/DZr72gV2gCvNHbFHItwecDUhKmbocO10OMFaI9ImC0h1gu6rabin 8g847V2EBx8dAHhntxm5KDueYS144PFWLdn/cpPWWa/GPzYVI8EKSqAoTKG05zChjw0wBMKAtiz piNySXJzEHujz6zDopFDKnRQ= X-Received: by 127.0.0.2 with SMTP id 9qo1YY7687511xSdFg8zpYfS; Wed, 03 Jan 2024 00:12:55 -0800 X-Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web11.13404.1704269573994602500 for ; Wed, 03 Jan 2024 00:12:54 -0800 X-Received: from loongson.cn (unknown [10.20.42.173]) by gateway (Coremail) with SMTP id _____8Cxqur_FpVl+XgBAA--.4985S3; Wed, 03 Jan 2024 16:12:48 +0800 (CST) X-Received: from [10.20.42.173] (unknown [10.20.42.173]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxH+X6FpVlD3kYAA--.7336S3; Wed, 03 Jan 2024 16:12:44 +0800 (CST) Subject: Re: [edk2-devel] [PATCH v5 34/36] OvmfPkg/LoongArchVirt: Support PEI phase To: Chao Li , devel@edk2.groups.io Cc: Ard Biesheuvel , Jiewen Yao , Jordan Justen , Gerd Hoffmann , Xianglai Li References: <20231228100351.1756165-1-lichao@loongson.cn> <20231228100753.1766816-1-lichao@loongson.cn> From: "maobibo" Message-ID: Date: Wed, 3 Jan 2024 16:12:42 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20231228100753.1766816-1-lichao@loongson.cn> X-CM-TRANSID: AQAAf8BxH+X6FpVlD3kYAA--.7336S3 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj9fXoWfCw15Aw1furWxAF1kGr1kCrX_yoW8Kw15uo WjkF92kw45Cws0y34kC34kWr47K3WFga1fXFyrAFWUtFsFyr1YyFWUX3y8Jw1rGr1vq3WD G34fXay8JFWSqFn5l-sFpf9Il3svdjkaLaAFLSUrUUUUbb8apTn2vfkv8UJUUUU8wcxFpf 9Il3svdxBIdaVrn0xqx4xG64xvF2IEw4CE5I8CrVC2j2Jv73VFW2AGmfu7bjvjm3AaLaJ3 UjIYCTnIWjp_UUUYI7kC6x804xWl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI 8IcIk0rVWrJVCq3wAFIxvE14AKwVWUGVWUXwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xG Y2AK021l84ACjcxK6xIIjxv20xvE14v26r1I6r4UM28EF7xvwVC0I7IYx2IY6xkF7I0E14 v26r4j6F4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAF wI0_Gr1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYIkI8VC2zVCFFI 0UMc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUAVWUtwAv7VC2z280 aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcVAKI48JMxk0xIA0c2IEe2 xFo4CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAq x4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r 1DMIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_JFI_Gr1lIxAIcVC0I7IYx2IY6xkF 7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxV W8JVWxJwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU 7MmhUUUUU Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,maobibo@loongson.cn List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: BQmGcyCIMFoAZTtq3NHJQoVPx7686176AA= Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=KL6KI58x; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io 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 > Cc: Jiewen Yao > Cc: Jordan Justen > Cc: Gerd Hoffmann > Signed-off-by: Chao Li > Co-authored-by: Xianglai Li > Co-authored-by: Bibo Mao > --- > 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.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > +#include > +#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.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +// > +// The package level header files this module uses > +// > +#include > + > +// > +// The Library classes this module consumes > +// > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#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.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + @par Glossary: > + - Mem - Memory > +**/ > + > +// > +// The package level header files this module uses > +// > +#include > +// > +// The Library classes this module consumes > +// > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#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.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef PLATFORM_H_ > +#define PLATFORM_H_ > + > +#include > +#include > +#include > + > +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.
> +# > +# 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 -=-=-=-=-=-=-=-=-=-=-=- 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] -=-=-=-=-=-=-=-=-=-=-=-