From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: chasel.chiu@intel.com) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by groups.io with SMTP; Wed, 25 Sep 2019 02:54:40 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2019 02:54:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,547,1559545200"; d="scan'208";a="189625707" Received: from pgsmsx104.gar.corp.intel.com ([10.221.44.91]) by fmsmga007.fm.intel.com with ESMTP; 25 Sep 2019 02:54:38 -0700 Received: from pgsmsx112.gar.corp.intel.com ([169.254.3.2]) by PGSMSX104.gar.corp.intel.com ([169.254.3.196]) with mapi id 14.03.0439.000; Wed, 25 Sep 2019 17:54:37 +0800 From: "Chiu, Chasel" To: "Kubacki, Michael A" , "devel@edk2.groups.io" CC: "Desimone, Nathaniel L" , "Sinha, Ankit" , Jeremy Soller Subject: Re: [edk2-platforms][PATCH V2 10/15] KabylakeOpenBoardPkg/GalagoPro3: Add modules Thread-Topic: [edk2-platforms][PATCH V2 10/15] KabylakeOpenBoardPkg/GalagoPro3: Add modules Thread-Index: AQHVcwPaAdL65fuH0kObedslYexRaqc8KFsg Date: Wed, 25 Sep 2019 09:54:36 +0000 Message-ID: <3C3EFB470A303B4AB093197B6777CCEC504E21E8@PGSMSX112.gar.corp.intel.com> References: <20190924181248.12816-1-michael.a.kubacki@intel.com> <20190924181248.12816-11-michael.a.kubacki@intel.com> In-Reply-To: <20190924181248.12816-11-michael.a.kubacki@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYzhkOTU4ZDAtOGViOC00OTFkLWI0NTctYjk0MWM1NTE1N2Q3IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiSzMxM0RSa1pIZ3d1Zm9vU1NpOEJtSzU4bm92eUVvTkc4XC9iblZJWTFQb3padjBrUmU0MURqMkR6WFJQZzRDb1gifQ== x-ctpclassification: CTP_NT x-originating-ip: [172.30.20.206] MIME-Version: 1.0 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Chasel Chiu > -----Original Message----- > From: Kubacki, Michael A > Sent: Wednesday, September 25, 2019 2:13 AM > To: devel@edk2.groups.io > Cc: Chiu, Chasel ; Desimone, Nathaniel L > ; Sinha, Ankit ; > Jeremy Soller > Subject: [edk2-platforms][PATCH V2 10/15] > KabylakeOpenBoardPkg/GalagoPro3: Add modules >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2207 >=20 > Adds the modules used for System 76 Galago Pro 3 board support. >=20 > This override should be removed in a future cleanup change. That is outsi= de > the scope of this change which is to move the contents from > ClevoOpenBoardPkg/N1xxWU to KabylakeOpenBoardPkg/GalagoPro3. >=20 > Cc: Chasel Chiu > Cc: Nate DeSimone > Cc: Ankit Sinha > Cc: Jeremy Soller > Signed-off-by: Michael Kubacki > --- >=20 > Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Intel/ > MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.inf | 67 > ++ > Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Include/GalagoPro3Id.h > | 2 +- >=20 > Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Intel/ > MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.c | 640 > ++++++++++++++++++++ > 3 files changed, 708 insertions(+), 1 deletion(-) >=20 > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Inte > l/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.inf > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Inte > l/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.inf > new file mode 100644 > index 0000000000..76dd67d1a8 > --- /dev/null > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/I > +++ ntel/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem. > +++ inf > @@ -0,0 +1,67 @@ > +### @file > +# Component information file for the Platform Init Pre-Memory PEI module= . > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
# # > +SPDX-License-Identifier: BSD-2-Clause-Patent # ### > + > +[Defines] > + INF_VERSION =3D 0x00010017 > + BASE_NAME =3D PlatformInitPreMem > + FILE_GUID =3D > EEEE611D-F78F-4FB9-B868-55907F169280 > + VERSION_STRING =3D 1.0 > + MODULE_TYPE =3D PEIM > + ENTRY_POINT =3D PlatformInitPreMemEntryPoint > + > +[LibraryClasses] > + BaseMemoryLib > + BoardInitLib > + DebugLib > + HobLib > + IoLib > + MemoryAllocationLib > + MtrrLib > + PeimEntryPoint > + PeiServicesLib > + ReportFvLib > + TestPointCheckLib > + TimerLib > + > +[Packages] > + MinPlatformPkg/MinPlatformPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + MdePkg/MdePkg.dec > + UefiCpuPkg/UefiCpuPkg.dec > + > +[Pcd] > + gMinPlatformPkgTokenSpaceGuid.PcdFspWrapperBootMode > ## CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdFlashAreaBaseAddress ## > CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdFlashAreaSize ## > CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdStopAfterDebugInit ## > CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdStopAfterMemInit ## > CONSUMES > + > +[FixedPcd] > + gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiAcpiReclaimMemorySize > ## CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiAcpiNvsMemorySize > ## CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiReservedMemorySize > ## CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiRtDataMemorySize > ## CONSUMES > + gMinPlatformPkgTokenSpaceGuid.PcdPlatformEfiRtCodeMemorySize > ## CONSUMES > + > +[Sources] > + PlatformInitPreMem.c > + > +[Ppis] > + gEfiPeiMemoryDiscoveredPpiGuid > + gEfiPeiMasterBootModePpiGuid ## PRODUCES > + gEfiPeiBootInRecoveryModePpiGuid ## PRODUCES > + gEfiPeiReadOnlyVariable2PpiGuid > + gPeiBaseMemoryTestPpiGuid > + gPeiPlatformMemorySizePpiGuid > + > +[Guids] > + gEfiMemoryTypeInformationGuid > + > +[Depex] > + gEfiPeiReadOnlyVariable2PpiGuid > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Include/GalagoPro3Id. > h > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Include/GalagoPro3Id. > h > index 5999f18edf..d85a7dcf52 100644 > --- > a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Include/GalagoPro3Id. > h > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Include/GalagoPro3I > +++ d.h > @@ -8,6 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef > _GALAGO_PRO_3_ID_H_ #define _GALAGO_PRO_3_ID_H_ >=20 > -#define BoardIdGalagoPro3 0x60 > +#define BoardIdGalagoPro3 0x20 >=20 > #endif > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Inte > l/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.c > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/Inte > l/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem.c > new file mode 100644 > index 0000000000..b784026c1b > --- /dev/null > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Override/Platform/I > +++ ntel/MinPlatformPkg/PlatformInit/PlatformInitPei/PlatformInitPreMem. > +++ c > @@ -0,0 +1,640 @@ > +/** @file > + Source code file for Platform Init Pre-Memory PEI module > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.
> +SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include #include > + #include > + > +EFI_STATUS > +EFIAPI > +MemoryDiscoveredPpiNotifyCallback ( > + IN CONST EFI_PEI_SERVICES **PeiServices, > + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, > + IN VOID *Ppi > + ); > + > +EFI_STATUS > +EFIAPI > +GetPlatformMemorySize ( > + IN EFI_PEI_SERVICES **PeiServices, > + IN PEI_PLATFORM_MEMORY_SIZE_PPI *This, > + IN OUT UINT64 *MemorySize > + ); > + > +/** > + > + This function checks the memory range in PEI. > + > + @param PeiServices Pointer to PEI Services. > + @param This Pei memory test PPI pointer. > + @param BeginAddress Beginning of the memory address to be > checked. > + @param MemoryLength Bytes of memory range to be checked. > + @param Operation Type of memory check operation to be > performed. > + @param ErrorAddress Return the address of the error memory > address. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval EFI_DEVICE_ERROR Memory test failed. It's not safe to use > this range of memory. > + > +**/ > +EFI_STATUS > +EFIAPI > +BaseMemoryTest ( > + IN EFI_PEI_SERVICES **PeiServices, > + IN PEI_BASE_MEMORY_TEST_PPI *This, > + IN EFI_PHYSICAL_ADDRESS BeginAddress, > + IN UINT64 MemoryLength, > + IN PEI_MEMORY_TEST_OP Operation, > + OUT EFI_PHYSICAL_ADDRESS *ErrorAddress > + ); > + > +static EFI_PEI_NOTIFY_DESCRIPTOR mMemDiscoveredNotifyList =3D { > + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | > +EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gEfiPeiMemoryDiscoveredPpiGuid, > + (EFI_PEIM_NOTIFY_ENTRY_POINT) MemoryDiscoveredPpiNotifyCallback }; > + > +GLOBAL_REMOVE_IF_UNREFERENCED EFI_PEI_PPI_DESCRIPTOR > +mPpiListRecoveryBootMode =3D { > + (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gEfiPeiBootInRecoveryModePpiGuid, > + NULL > +}; > + > +GLOBAL_REMOVE_IF_UNREFERENCED EFI_PEI_PPI_DESCRIPTOR > mPpiBootMode =3D { > + (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gEfiPeiMasterBootModePpiGuid, > + NULL > +}; > + > +static PEI_BASE_MEMORY_TEST_PPI mPeiBaseMemoryTestPpi =3D > { BaseMemoryTest }; > + > +static PEI_PLATFORM_MEMORY_SIZE_PPI mMemoryMemorySizePpi =3D { > +GetPlatformMemorySize }; > + > +static EFI_PEI_PPI_DESCRIPTOR mMemPpiList[] =3D { > + { > + EFI_PEI_PPI_DESCRIPTOR_PPI, > + &gPeiBaseMemoryTestPpiGuid, > + &mPeiBaseMemoryTestPpi > + }, > + { > + (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), > + &gPeiPlatformMemorySizePpiGuid, > + &mMemoryMemorySizePpi > + }, > +}; > + > +/// > +/// Memory Reserved should be between 125% to 150% of the Current > +required memory /// otherwise BdsMisc.c would do a reset to make it > 125% to avoid s4 resume issues. > +/// > +GLOBAL_REMOVE_IF_UNREFERENCED EFI_MEMORY_TYPE_INFORMATION > mDefaultMemoryTypeInformation[] =3D { > + { EfiACPIReclaimMemory, FixedPcdGet32 > (PcdPlatformEfiAcpiReclaimMemorySize) }, // ASL > + { EfiACPIMemoryNVS, FixedPcdGet32 > (PcdPlatformEfiAcpiNvsMemorySize) }, // ACPI NVS (including S3 > related) > + { EfiReservedMemoryType, FixedPcdGet32 > (PcdPlatformEfiReservedMemorySize) }, // BIOS Reserved (including S3 > related) > + { EfiRuntimeServicesData, FixedPcdGet32 > (PcdPlatformEfiRtDataMemorySize) }, // Runtime Service Data > + { EfiRuntimeServicesCode, FixedPcdGet32 > (PcdPlatformEfiRtCodeMemorySize) }, // Runtime Service Code > + { EfiMaxMemoryType, 0 } > +}; > + > +VOID > +BuildMemoryTypeInformation ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices; > + UINTN DataSize; > + EFI_MEMORY_TYPE_INFORMATION > MemoryData[EfiMaxMemoryType + 1]; > + > + // > + // Locate system configuration variable // Status =3D > + PeiServicesLocatePpi( > + &gEfiPeiReadOnlyVariable2PpiGuid, // GUID > + 0, // INSTANCE > + NULL, // > EFI_PEI_PPI_DESCRIPTOR > + (VOID **) &VariableServices // PPI > + ); > + ASSERT_EFI_ERROR(Status); > + > + DataSize =3D sizeof (MemoryData); > + Status =3D VariableServices->GetVariable ( > + VariableServices, > + > EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME, > + &gEfiMemoryTypeInformationGuid, > + NULL, > + &DataSize, > + &MemoryData > + ); > + if (EFI_ERROR(Status)) { > + DataSize =3D sizeof (mDefaultMemoryTypeInformation); > + CopyMem(MemoryData, mDefaultMemoryTypeInformation, > DataSize); } > + > + /// > + /// Build the GUID'd HOB for DXE > + /// > + BuildGuidDataHob ( > + &gEfiMemoryTypeInformationGuid, > + MemoryData, > + DataSize > + ); > +} > + > +EFI_STATUS > +EFIAPI > +GetPlatformMemorySize ( > + IN EFI_PEI_SERVICES **PeiServices, > + IN PEI_PLATFORM_MEMORY_SIZE_PPI *This, > + IN OUT UINT64 *MemorySize > + ) > +{ > + EFI_STATUS Status; > + EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable; > + UINTN DataSize; > + EFI_MEMORY_TYPE_INFORMATION > MemoryData[EfiMaxMemoryType + 1]; > + UINTN Index; > + EFI_BOOT_MODE BootMode; > + UINTN IndexNumber; > + > +#define PEI_MIN_MEMORY_SIZE (EFI_PHYSICAL_ADDRESS) > ((320 * 0x100000)) > + > + *MemorySize =3D PEI_MIN_MEMORY_SIZE; > + Status =3D PeiServicesLocatePpi ( > + &gEfiPeiReadOnlyVariable2PpiGuid, > + 0, > + NULL, > + (VOID **)&Variable > + ); > + > + ASSERT_EFI_ERROR (Status); > + > + Status =3D PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR > + (Status); > + > + DataSize =3D sizeof (MemoryData); > + > + Status =3D Variable->GetVariable ( > + Variable, > + > EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME, > + &gEfiMemoryTypeInformationGuid, > + NULL, > + &DataSize, > + &MemoryData > + ); > + IndexNumber =3D sizeof (mDefaultMemoryTypeInformation) / sizeof > + (EFI_MEMORY_TYPE_INFORMATION); > + > + // > + // Accumulate maximum amount of memory needed // > + > + DEBUG((DEBUG_ERROR, "PEI_MIN_MEMORY_SIZE:%dKB \n", > + DivU64x32(*MemorySize,1024))); DEBUG((DEBUG_ERROR, > "IndexNumber:%d > + MemoryDataNumber%d \n", IndexNumber,DataSize/ sizeof > (EFI_MEMORY_TYPE_INFORMATION))); if (EFI_ERROR (Status)) { > + // > + // Start with minimum memory > + // > + for (Index =3D 0; Index < IndexNumber; Index++) { > + DEBUG((DEBUG_ERROR, "Index[%d].Type =3D > %d .NumberOfPages=3D0x%x\n", > Index,mDefaultMemoryTypeInformation[Index].Type,mDefaultMemoryTypeI > nformation[Index].NumberOfPages)); > + *MemorySize +=3D > mDefaultMemoryTypeInformation[Index].NumberOfPages * EFI_PAGE_SIZE; > + } > + DEBUG((DEBUG_ERROR, "No memory type, Total platform > memory:%dKB > + \n", DivU64x32(*MemorySize,1024))); } else { > + // > + // Start with at least 0x200 pages of memory for the DXE Core and th= e > DXE Stack > + // > + for (Index =3D 0; Index < IndexNumber; Index++) { > + DEBUG((DEBUG_ERROR, "Index[%d].Type =3D > %d .NumberOfPages=3D0x%x\n", > Index,MemoryData[Index].Type,MemoryData[Index].NumberOfPages)); > + *MemorySize +=3D MemoryData[Index].NumberOfPages * > EFI_PAGE_SIZE; > + > + } > + DEBUG((DEBUG_ERROR, "has memory type, Total platform > memory:%dKB > + \n", DivU64x32(*MemorySize,1024))); } > + > + return EFI_SUCCESS; > +} > + > +/** > + > + This function checks the memory range in PEI. > + > + @param PeiServices Pointer to PEI Services. > + @param This Pei memory test PPI pointer. > + @param BeginAddress Beginning of the memory address to be > checked. > + @param MemoryLength Bytes of memory range to be checked. > + @param Operation Type of memory check operation to be > performed. > + @param ErrorAddress Return the address of the error memory > address. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval EFI_DEVICE_ERROR Memory test failed. It's not safe to use > this range of memory. > + > +**/ > +EFI_STATUS > +EFIAPI > +BaseMemoryTest ( > + IN EFI_PEI_SERVICES **PeiServices, > + IN PEI_BASE_MEMORY_TEST_PPI *This, > + IN EFI_PHYSICAL_ADDRESS BeginAddress, > + IN UINT64 MemoryLength, > + IN PEI_MEMORY_TEST_OP Operation, > + OUT EFI_PHYSICAL_ADDRESS *ErrorAddress > + ) > +{ > + UINT32 TestPattern; > + UINT32 SpanSize; > + EFI_PHYSICAL_ADDRESS TempAddress; > + > +#define MEMORY_TEST_PATTERN 0x5A5A5A5A > +#define MEMORY_TEST_COVER_SPAN 0x40000 > + > + TestPattern =3D MEMORY_TEST_PATTERN; > + SpanSize =3D 0; > + > + // > + // Make sure we don't try and test anything above the max physical > + address range // ASSERT (BeginAddress + MemoryLength < > MAX_ADDRESS); > + > + switch (Operation) { > + case Extensive: > + SpanSize =3D 0x4; > + break; > + > + case Sparse: > + case Quick: > + SpanSize =3D MEMORY_TEST_COVER_SPAN; > + break; > + > + case Ignore: > + goto Done; > + break; > + } > + // > + // Write the test pattern into memory range // TempAddress =3D > + BeginAddress; while (TempAddress < BeginAddress + MemoryLength) { > + (*(UINT32 *) (UINTN) TempAddress) =3D TestPattern; > + TempAddress +=3D SpanSize; > + } > + // > + // Read pattern from memory and compare it // TempAddress =3D > + BeginAddress; while (TempAddress < BeginAddress + MemoryLength) { > + if ((*(UINT32 *) (UINTN) TempAddress) !=3D TestPattern) { > + *ErrorAddress =3D TempAddress; > + return EFI_DEVICE_ERROR; > + } > + > + TempAddress +=3D SpanSize; > + } > + > +Done: > + > + return EFI_SUCCESS; > +} > + > +/** > + Set Cache Mtrr. > +**/ > +VOID > +SetCacheMtrr ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + EFI_PEI_HOB_POINTERS Hob; > + MTRR_SETTINGS MtrrSetting; > + UINT64 MemoryBase; > + UINT64 MemoryLength; > + UINT64 LowMemoryLength; > + UINT64 HighMemoryLength; > + EFI_BOOT_MODE BootMode; > + EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute; > + UINT64 CacheMemoryLength; > + > + /// > + /// Reset all MTRR setting. > + /// > + ZeroMem(&MtrrSetting, sizeof(MTRR_SETTINGS)); > + > + /// > + /// Cache the Flash area as WP to boost performance /// Status =3D > + MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + (UINTN) PcdGet32 (PcdFlashAreaBaseAddress), > + (UINTN) PcdGet32 (PcdFlashAreaSize), > + CacheWriteProtected > + ); > + ASSERT_EFI_ERROR (Status); > + > + /// > + /// Update MTRR setting from MTRR buffer for Flash Region to be WP to > + boost performance /// MtrrSetAllMtrrs (&MtrrSetting); > + > + /// > + /// Set low to 1 MB. Since 1MB cacheability will always be set /// > + until override by CSM. > + /// Initialize high memory to 0. > + /// > + LowMemoryLength =3D 0x100000; > + HighMemoryLength =3D 0; > + ResourceAttribute =3D ( > + 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 > + ); > + > + Status =3D PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR > + (Status); > + > + if (BootMode !=3D BOOT_ON_S3_RESUME) { > + ResourceAttribute |=3D EFI_RESOURCE_ATTRIBUTE_TESTED; } > + > + Status =3D PeiServicesGetHobList ((VOID **) &Hob.Raw); while > + (!END_OF_HOB_LIST (Hob)) { > + if (Hob.Header->HobType =3D=3D EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { > + if ((Hob.ResourceDescriptor->ResourceType =3D=3D > EFI_RESOURCE_SYSTEM_MEMORY) || > + ((Hob.ResourceDescriptor->ResourceType =3D=3D > EFI_RESOURCE_MEMORY_RESERVED) && > + (Hob.ResourceDescriptor->ResourceAttribute =3D=3D > ResourceAttribute)) > + ) { > + if (Hob.ResourceDescriptor->PhysicalStart >=3D 0x100000000ULL) { > + HighMemoryLength +=3D > Hob.ResourceDescriptor->ResourceLength; > + } else if (Hob.ResourceDescriptor->PhysicalStart >=3D 0x100000) = { > + LowMemoryLength +=3D > Hob.ResourceDescriptor->ResourceLength; > + } > + } > + } > + > + Hob.Raw =3D GET_NEXT_HOB (Hob); > + } > + > + DEBUG ((DEBUG_INFO, "Memory Length (Below 4GB) =3D %lx.\n", > + LowMemoryLength)); DEBUG ((DEBUG_INFO, "Memory Length (Above > 4GB) =3D > + %lx.\n", HighMemoryLength)); > + > + /// > + /// Assume size of main memory is multiple of 256MB /// > + MemoryLength =3D (LowMemoryLength + 0xFFFFFFF) & 0xF0000000; > MemoryBase > + =3D 0; > + > + CacheMemoryLength =3D MemoryLength; > + /// > + /// Programming MTRRs to avoid override SPI region with UC when MAX > + TOLUD Length >=3D 3.5GB /// if (MemoryLength > 0xDC000000) { > + CacheMemoryLength =3D 0xC0000000; > + Status =3D MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + MemoryBase, > + CacheMemoryLength, > + CacheWriteBack > + ); > + ASSERT_EFI_ERROR (Status); > + > + MemoryBase =3D 0xC0000000; > + CacheMemoryLength =3D MemoryLength - 0xC0000000; > + if (MemoryLength > 0xE0000000) { > + CacheMemoryLength =3D 0x20000000; > + Status =3D MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + MemoryBase, > + CacheMemoryLength, > + CacheWriteBack > + ); > + ASSERT_EFI_ERROR (Status); > + > + MemoryBase =3D 0xE0000000; > + CacheMemoryLength =3D MemoryLength - 0xE0000000; > + } > + } > + > + Status =3D MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + MemoryBase, > + CacheMemoryLength, > + CacheWriteBack > + ); > + ASSERT_EFI_ERROR (Status); > + > + if (LowMemoryLength !=3D MemoryLength) { > + MemoryBase =3D LowMemoryLength; > + MemoryLength -=3D LowMemoryLength; > + Status =3D MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + MemoryBase, > + MemoryLength, > + CacheUncacheable > + ); > + ASSERT_EFI_ERROR (Status); > + } > + > + /// > + /// VGA-MMIO - 0xA0000 to 0xC0000 to be UC /// Status =3D > + MtrrSetMemoryAttributeInMtrrSettings ( > + &MtrrSetting, > + 0xA0000, > + 0x20000, > + CacheUncacheable > + ); > + ASSERT_EFI_ERROR (Status); > + > + /// > + /// Update MTRR setting from MTRR buffer /// MtrrSetAllMtrrs > + (&MtrrSetting); > + > + return ; > +} > + > +VOID > +ReportCpuHob ( > + VOID > + ) > +{ > + UINT8 PhysicalAddressBits; > + UINT32 RegEax; > + > + AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL); if (RegEax >=3D > + 0x80000008) { > + AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL); > + PhysicalAddressBits =3D (UINT8) RegEax; } else { > + PhysicalAddressBits =3D 36; > + } > + > + /// > + /// Create a CPU hand-off information > + /// > + BuildCpuHob (PhysicalAddressBits, 16); } > + > +/** > + Install Firmware Volume Hob's once there is main memory > + > + @param[in] PeiServices General purpose services available to > every PEIM. > + @param[in] NotifyDescriptor Notify that this module published. > + @param[in] Ppi PPI that was installed. > + > + @retval EFI_SUCCESS The function completed successfully. > +**/ > +EFI_STATUS > +EFIAPI > +MemoryDiscoveredPpiNotifyCallback ( > + IN CONST EFI_PEI_SERVICES **PeiServices, > + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, > + IN VOID *Ppi > + ) > +{ > + EFI_STATUS Status; > + EFI_BOOT_MODE BootMode; > + > + Status =3D BoardInitAfterMemoryInit (); ASSERT_EFI_ERROR (Status); > + > + Status =3D PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR > + (Status); > + > + > + ReportCpuHob (); > + > + TestPointMemoryDiscoveredMtrrFunctional (); > + > + TestPointMemoryDiscoveredMemoryResourceFunctional (); > + > + /// > + /// If S3 resume, then we are done > + /// > + if (BootMode =3D=3D BOOT_ON_S3_RESUME) { > + return EFI_SUCCESS; > + } > + > + TestPointMemoryDiscoveredDmaProtectionEnabled (); > + > + if (PcdGetBool (PcdStopAfterMemInit)) { > + CpuDeadLoop (); > + } > + > + return Status; > +} > + > + > +/** > + This function handles PlatformInit task after PeiReadOnlyVariable2 > +PPI produced > + > + @param[in] PeiServices Pointer to PEI Services Table. > + > + @retval EFI_SUCCESS The function completes successfully > + @retval others > +**/ > +EFI_STATUS > +EFIAPI > +PlatformInitPreMem ( > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + EFI_STATUS Status; > + EFI_BOOT_MODE BootMode; > + > + // > + // Start board detection > + // > + BoardDetect (); > + > + BoardDebugInit (); > + > + TestPointDebugInitDone (); > + > + if (PcdGetBool (PcdStopAfterDebugInit)) { > + CpuDeadLoop (); > + } > + > + BootMode =3D BoardBootModeDetect (); > + Status =3D PeiServicesSetBootMode (BootMode); ASSERT_EFI_ERROR > + (Status); if (BootMode =3D=3D BOOT_IN_RECOVERY_MODE) { > + Status =3D PeiServicesInstallPpi (&mPpiListRecoveryBootMode); } //= / > + /// Signal possible dependent modules that there has been a /// final > + boot mode determination, it is used to build BIST /// Hob for Dxe > + use. > + /// > + Status =3D PeiServicesInstallPpi (&mPpiBootMode); ASSERT_EFI_ERROR > + (Status); > + > + BuildMemoryTypeInformation (); > + > + if (!PcdGetBool(PcdFspWrapperBootMode)) { > + Status =3D PeiServicesInstallPpi (mMemPpiList); > + ASSERT_EFI_ERROR (Status); > + } > + > + Status =3D BoardInitBeforeMemoryInit (); ASSERT_EFI_ERROR (Status); > + > + return Status; > +} > + > + > +/** > + Platform Init before memory PEI module entry point > + > + @param[in] FileHandle Not used. > + @param[in] PeiServices General purpose services available > to every PEIM. > + > + @retval EFI_SUCCESS The function completes > successfully > + @retval EFI_OUT_OF_RESOURCES Insufficient resources to create > database > +**/ > +EFI_STATUS > +EFIAPI > +PlatformInitPreMemEntryPoint ( > + IN EFI_PEI_FILE_HANDLE FileHandle, > + IN CONST EFI_PEI_SERVICES **PeiServices > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D PlatformInitPreMem (PeiServices); > + > + /// > + /// After code reorangized, memorycallback will run because the PPI > + is already /// installed when code run to here, it is supposed that > + the InstallEfiMemory is /// done before. > + /// > + Status =3D PeiServicesNotifyPpi (&mMemDiscoveredNotifyList); > + > + return Status; > +} > -- > 2.16.2.windows.1