This PEIM will parse coreboot table in memory and report resource information into pei core.\r
This file contains the main entrypoint of the PEIM.\r
\r
-Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
#include "CbSupportPei.h"\r
#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1\r
\r
EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
- { EfiACPIReclaimMemory, 0x008 },\r
- { EfiACPIMemoryNVS, 0x004 },\r
- { EfiReservedMemoryType, 0x004 },\r
- { EfiRuntimeServicesData, 0x080 },\r
- { EfiRuntimeServicesCode, 0x080 },\r
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },\r
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },\r
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },\r
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },\r
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },\r
{ EfiMaxMemoryType, 0 }\r
};\r
\r
}\r
}\r
\r
+/**\r
+ Based on memory base, size and type, build resource descripter HOB.\r
+\r
+ @param Base Memory base address.\r
+ @param Size Memory size.\r
+ @param Type Memory type.\r
+ @param Param A pointer to CB_MEM_INFO.\r
+\r
+ @retval EFI_SUCCESS if it completed successfully.\r
+**/\r
+EFI_STATUS\r
+CbMemInfoCallback (\r
+ UINT64 Base,\r
+ UINT64 Size,\r
+ UINT32 Type,\r
+ VOID *Param\r
+ )\r
+{\r
+ CB_MEM_INFO *MemInfo;\r
+ UINTN Attribue;\r
+\r
+ Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_TESTED |\r
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
+\r
+ if ((Base < 0x100000) && ((Base + Size) > 0x100000)) {\r
+ Size -= (0x100000 - Base);\r
+ Base = 0x100000;\r
+ }\r
+\r
+ MemInfo = (CB_MEM_INFO *)Param;\r
+ if (Base >= 0x100000) {\r
+ if (Type == CB_MEM_RAM) {\r
+ if (Base < 0x100000000ULL) {\r
+ MemInfo->UsableLowMemTop = (UINT32)(Base + Size);\r
+ } else {\r
+ Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
+ }\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_SYSTEM_MEMORY,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ );\r
+ } else if (Type == CB_MEM_TABLE) {\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_MEMORY_RESERVED,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ );\r
+ MemInfo->SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;\r
+ } else if (Type == CB_MEM_RESERVED) {\r
+ if ((MemInfo->SystemLowMemTop == 0) || (Base < MemInfo->SystemLowMemTop)) {\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_MEMORY_RESERVED,\r
+ Attribue,\r
+ (EFI_PHYSICAL_ADDRESS)Base,\r
+ Size\r
+ ); \r
+ }\r
+ }\r
+ }\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
This is the entrypoint of PEIM\r
\r
IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 LowMemorySize, HighMemorySize;\r
- UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
+ EFI_STATUS Status;\r
+ UINT64 LowMemorySize;\r
+ UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
UINT32 RegEax;\r
UINT8 PhysicalAddressBits;\r
FRAME_BUFFER_INFO* pFbInfo;\r
ACPI_BOARD_INFO* pAcpiBoardInfo;\r
UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
+ UINTN PmEvtBase;\r
+ UINTN PmGpeEnBase;\r
+ CB_MEM_INFO CbMemInfo;\r
\r
- LowMemorySize = 0;\r
- HighMemorySize = 0;\r
-\r
- Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
- if (EFI_ERROR(Status))\r
- return Status;\r
-\r
- DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
- DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
-\r
- ASSERT (LowMemorySize > 0);\r
-\r
+ //\r
+ // Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED \r
+ // is intentionally omitted to prevent erasing of the coreboot header \r
+ // record before it is processed by CbParseMemoryInfo.\r
+ //\r
BuildResourceDescriptorHob (\r
EFI_RESOURCE_SYSTEM_MEMORY,\r
(\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_TESTED |\r
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
(UINT64)(0x60000)\r
);\r
\r
- BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
- EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_TESTED |\r
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
- ),\r
- (EFI_PHYSICAL_ADDRESS)(0x100000),\r
- (UINT64) (LowMemorySize - 0x100000)\r
- );\r
-\r
- if (HighMemorySize > 0) {\r
- BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
- EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
- ),\r
- (EFI_PHYSICAL_ADDRESS)(0x100000000ULL),\r
- HighMemorySize\r
- );\r
+ ZeroMem (&CbMemInfo, sizeof(CbMemInfo));\r
+ Status = CbParseMemoryInfo (CbMemInfoCallback, (VOID *)&CbMemInfo);\r
+ if (EFI_ERROR(Status)) {\r
+ return Status;\r
}\r
\r
+ LowMemorySize = CbMemInfo.UsableLowMemTop;\r
+ DEBUG ((EFI_D_INFO, "Low memory 0x%lx\n", LowMemorySize));\r
+ DEBUG ((EFI_D_INFO, "SystemLowMemTop 0x%x\n", CbMemInfo.SystemLowMemTop));\r
+\r
//\r
// Should be 64k aligned\r
//\r
if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS)\r
&& ((UINTN)pCbHeader > BASE_4KB)) {\r
DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader));\r
- PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+ Status = PcdSet32S (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
//\r
//\r
// Create guid hob for acpi board information\r
//\r
- Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
+ Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue, &PmEvtBase, &PmGpeEnBase);\r
ASSERT_EFI_ERROR (Status);\r
pAcpiBoardInfo = NULL;\r
pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
pAcpiBoardInfo->ResetValue = (UINT8)ResetValue;\r
+ pAcpiBoardInfo->PmEvtBase = (UINT64)PmEvtBase;\r
+ pAcpiBoardInfo->PmGpeEnBase = (UINT64)PmGpeEnBase;\r
DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
\r
//\r
DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n"));\r
}\r
\r
+ //\r
+ // Parse platform specific information from coreboot. \r
+ //\r
+ Status = CbParsePlatformInfo ();\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+\r
//\r
// Mask off all legacy 8259 interrupt sources\r
//\r