|
@@ -0,0 +1,310 @@
|
|
|
+/**@file
|
|
|
+ Platform PEI driver
|
|
|
+
|
|
|
+ Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
|
|
+ Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
|
|
+ Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>
|
|
|
+
|
|
|
+ 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/DebugLib.h>
|
|
|
+#include <Library/HobLib.h>
|
|
|
+#include <Library/IoLib.h>
|
|
|
+#include <Library/MemoryAllocationLib.h>
|
|
|
+#include <Library/PcdLib.h>
|
|
|
+#include <Library/PciLib.h>
|
|
|
+#include <Library/PeimEntryPoint.h>
|
|
|
+#include <Library/PeiServicesLib.h>
|
|
|
+#include <Library/ResourcePublicationLib.h>
|
|
|
+#include <Guid/MemoryTypeInformation.h>
|
|
|
+#include <Ppi/MasterBootMode.h>
|
|
|
+#include <IndustryStandard/Pci22.h>
|
|
|
+
|
|
|
+#include <SiFiveU5MCCoreplex.h>
|
|
|
+
|
|
|
+#include "Platform.h"
|
|
|
+
|
|
|
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
|
|
|
+ { EfiACPIMemoryNVS, 0x004 },
|
|
|
+ { EfiACPIReclaimMemory, 0x008 },
|
|
|
+ { EfiReservedMemoryType, 0x004 },
|
|
|
+ { EfiRuntimeServicesData, 0x024 },
|
|
|
+ { EfiRuntimeServicesCode, 0x030 },
|
|
|
+ { EfiBootServicesCode, 0x180 },
|
|
|
+ { EfiBootServicesData, 0xF00 },
|
|
|
+ { EfiMaxMemoryType, 0x000 }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {
|
|
|
+ {
|
|
|
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
|
|
+ &gEfiPeiMasterBootModePpiGuid,
|
|
|
+ NULL
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+STATIC EFI_BOOT_MODE mBootMode = BOOT_WITH_FULL_CONFIGURATION;
|
|
|
+
|
|
|
+VOID
|
|
|
+AddIoMemoryBaseSizeHob (
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryBase,
|
|
|
+ UINT64 MemorySize
|
|
|
+ )
|
|
|
+{
|
|
|
+ BuildResourceDescriptorHob (
|
|
|
+ EFI_RESOURCE_MEMORY_MAPPED_IO,
|
|
|
+ EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
|
|
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
|
|
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
|
|
+ EFI_RESOURCE_ATTRIBUTE_TESTED,
|
|
|
+ MemoryBase,
|
|
|
+ MemorySize
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+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
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+AddIoMemoryRangeHob (
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryBase,
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryLimit
|
|
|
+ )
|
|
|
+{
|
|
|
+ AddIoMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+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
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+VOID
|
|
|
+AddMemoryRangeHob (
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryBase,
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryLimit
|
|
|
+ )
|
|
|
+{
|
|
|
+ AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+VOID
|
|
|
+AddUntestedMemoryBaseSizeHob (
|
|
|
+ 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,
|
|
|
+ MemoryBase,
|
|
|
+ MemorySize
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+AddUntestedMemoryRangeHob (
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryBase,
|
|
|
+ EFI_PHYSICAL_ADDRESS MemoryLimit
|
|
|
+ )
|
|
|
+{
|
|
|
+ AddUntestedMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+AddPciResource (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ //
|
|
|
+ // Platform-specific
|
|
|
+ //
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+MemMapInitialization (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ //
|
|
|
+ // Create Memory Type Information HOB
|
|
|
+ //
|
|
|
+ BuildGuidDataHob (
|
|
|
+ &gEfiMemoryTypeInformationGuid,
|
|
|
+ mDefaultMemoryTypeInformation,
|
|
|
+ sizeof(mDefaultMemoryTypeInformation)
|
|
|
+ );
|
|
|
+
|
|
|
+ //
|
|
|
+ // Add PCI IO Port space available for PCI resource allocations.
|
|
|
+ //
|
|
|
+ AddPciResource ();
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+MiscInitialization (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ //
|
|
|
+ // Build the CPU HOB with guest RAM size dependent address width and 16-bits
|
|
|
+ // of IO space. (Side note: unlike other HOBs, the CPU HOB is needed during
|
|
|
+ // S3 resume as well, so we build it unconditionally.)
|
|
|
+ //
|
|
|
+ BuildCpuHob (32, 32);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ Check if system retunrs from S3.
|
|
|
+
|
|
|
+ @return BOOLEAN TRUE, system returned from S3
|
|
|
+ FALSE, system is not returned from S3
|
|
|
+
|
|
|
+**/
|
|
|
+BOOLEAN
|
|
|
+CheckResumeFromS3 (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ //
|
|
|
+ //Platform implementation-specific
|
|
|
+ //
|
|
|
+ return FALSE;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+VOID
|
|
|
+BootModeInitialization (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+
|
|
|
+ if (CheckResumeFromS3 () == TRUE) {
|
|
|
+ DEBUG ((DEBUG_INFO, "This is wake from S3\n"));
|
|
|
+ } else {
|
|
|
+ DEBUG ((DEBUG_INFO, "This is normal boot\n"));
|
|
|
+ }
|
|
|
+ Status = PeiServicesSetBootMode (mBootMode);
|
|
|
+ ASSERT_EFI_ERROR (Status);
|
|
|
+
|
|
|
+ Status = PeiServicesInstallPpi (mPpiBootMode);
|
|
|
+ ASSERT_EFI_ERROR (Status);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ Build processor information for U54 Coreplex processor.
|
|
|
+
|
|
|
+ @return EFI_SUCCESS Status.
|
|
|
+
|
|
|
+**/
|
|
|
+EFI_STATUS
|
|
|
+BuildCoreInformationHob (
|
|
|
+ VOID
|
|
|
+)
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+ RISC_V_PROCESSOR_SMBIOS_HOB_DATA *SmbiosHobPtr;
|
|
|
+
|
|
|
+ Status = CreateU5MCCoreplexProcessorSpecificDataHob (0);
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ ASSERT(FALSE);
|
|
|
+ }
|
|
|
+ Status = CreateU5MCProcessorSmbiosDataHob (0, &SmbiosHobPtr);
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ ASSERT(FALSE);
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG ((DEBUG_INFO, "U5 MC Coreplex SMBIOS DATA HOB at address 0x%x\n", SmbiosHobPtr));
|
|
|
+
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ 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"));
|
|
|
+
|
|
|
+ BootModeInitialization ();
|
|
|
+ DEBUG ((DEBUG_INFO, "Platform BOOT mode initiated.\n"));
|
|
|
+ PublishPeiMemory ();
|
|
|
+ DEBUG ((DEBUG_INFO, "PEI memory published.\n"));
|
|
|
+ InitializeRamRegions ();
|
|
|
+ DEBUG ((DEBUG_INFO, "Platform RAM regions initiated.\n"));
|
|
|
+
|
|
|
+ if (mBootMode != BOOT_ON_S3_RESUME) {
|
|
|
+ PeiFvInitialization ();
|
|
|
+ MemMapInitialization ();
|
|
|
+ }
|
|
|
+
|
|
|
+ MiscInitialization ();
|
|
|
+ Status = BuildCoreInformationHob ();
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ DEBUG ((DEBUG_ERROR, "Fail to build processor informstion HOB.\n"));
|
|
|
+ ASSERT(FALSE);
|
|
|
+ }
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|