+++ /dev/null
-/** @file\r
-ACPI Platform Driver\r
-\r
-Copyright (c) 2013-2016 Intel Corporation.\r
-\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <Protocol/AcpiTable.h>\r
-#include <IndustryStandard/Pci22.h>\r
-#include "AcpiPlatform.h"\r
-\r
-//\r
-// Global Variable\r
-//\r
-EFI_GLOBAL_NVS_AREA_PROTOCOL mGlobalNvsArea;\r
-EFI_ACPI_SDT_PROTOCOL *mAcpiSdt;\r
-\r
-EFI_ACPI_HANDLE mDsdtHandle = NULL;\r
-\r
-\r
-EFI_STATUS\r
-LocateSupportProtocol (\r
- IN EFI_GUID *Protocol,\r
- OUT VOID **Instance,\r
- IN UINT32 Type\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Locate the first instance of a protocol. If the protocol requested is an\r
- FV protocol, then it will return the first FV that contains the ACPI table\r
- storage file.\r
-\r
-Arguments:\r
-\r
- Protocol The protocol to find.\r
- Instance Return pointer to the first instance of the protocol\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS The function completed successfully.\r
- EFI_NOT_FOUND The protocol could not be located.\r
- EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN NumberOfHandles;\r
- EFI_FV_FILETYPE FileType;\r
- UINT32 FvStatus;\r
- EFI_FV_FILE_ATTRIBUTES Attributes;\r
- UINTN Size;\r
- UINTN i;\r
-\r
- FvStatus = 0;\r
-\r
- //\r
- // Locate protocol.\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- Protocol,\r
- NULL,\r
- &NumberOfHandles,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
-\r
- //\r
- // Defined errors at this time are not found and out of resources.\r
- //\r
- return Status;\r
- }\r
-\r
-\r
-\r
- //\r
- // Looking for FV with ACPI storage file\r
- //\r
-\r
- for (i = 0; i < NumberOfHandles; i++) {\r
- //\r
- // Get the protocol on this handle\r
- // This should not fail because of LocateHandleBuffer\r
- //\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[i],\r
- Protocol,\r
- Instance\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (!Type) {\r
- //\r
- // Not looking for the FV protocol, so find the first instance of the\r
- // protocol. There should not be any errors because our handle buffer\r
- // should always contain at least one or LocateHandleBuffer would have\r
- // returned not found.\r
- //\r
- break;\r
- }\r
-\r
- //\r
- // See if it has the ACPI storage file\r
- //\r
-\r
- Status = ((EFI_FIRMWARE_VOLUME2_PROTOCOL*) (*Instance))->ReadFile (*Instance,\r
- (EFI_GUID*)PcdGetPtr (PcdAcpiTableStorageFile),\r
- NULL,\r
- &Size,\r
- &FileType,\r
- &Attributes,\r
- &FvStatus\r
- );\r
-\r
- //\r
- // If we found it, then we are done\r
- //\r
- if (Status == EFI_SUCCESS) {\r
- break;\r
- }\r
- }\r
-\r
- //\r
- // Our exit status is determined by the success of the previous operations\r
- // If the protocol was found, Instance already points to it.\r
- //\r
-\r
- //\r
- // Free any allocated buffers\r
- //\r
- gBS->FreePool (HandleBuffer);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-VOID\r
-DsdtTableUpdate (\r
- IN OUT EFI_ACPI_DESCRIPTION_HEADER *TableHeader,\r
- IN OUT EFI_ACPI_TABLE_VERSION *Version\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Update the DSDT table\r
-\r
- Arguments:\r
-\r
- Table - The table to be set\r
- Version - Version to publish\r
-\r
- Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
-\r
- UINT8 *CurrPtr;\r
- UINT8 *DsdtPointer;\r
- UINT32 *Signature;\r
- UINT8 *Operation;\r
- UINT32 *Address;\r
- UINT16 *Size;\r
- //\r
- // Loop through the ASL looking for values that we must fix up.\r
- //\r
- CurrPtr = (UINT8 *) TableHeader;\r
- for (DsdtPointer = CurrPtr;\r
- DsdtPointer <= (CurrPtr + ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length);\r
- DsdtPointer++\r
- )\r
- {\r
- Signature = (UINT32 *) DsdtPointer;\r
- switch (*Signature) {\r
- //\r
- // MNVS operation region\r
- //\r
- case (SIGNATURE_32 ('M', 'N', 'V', 'S')):\r
- //\r
- // Conditional match. For Region Objects, the Operator will always be the\r
- // byte immediately before the specific name. Therefore, subtract 1 to check\r
- // the Operator.\r
- //\r
- Operation = DsdtPointer - 1;\r
- if (*Operation == AML_OPREGION_OP) {\r
- Address = (UINT32 *) (DsdtPointer + 6);\r
- *Address = (UINT32) (UINTN) mGlobalNvsArea.Area;\r
- Size = (UINT16 *) (DsdtPointer + 11);\r
- *Size = sizeof (EFI_GLOBAL_NVS_AREA);\r
- }\r
- break;\r
-\r
- //\r
- // Update processor PBLK register I/O base address\r
- //\r
- case (SIGNATURE_32 ('P', 'R', 'I', 'O')):\r
- //\r
- // Conditional match. Update the following ASL code:\r
- // Processor (CPU0, 0x01, 0x4F495250, 0x06) {}\r
- // The 3rd parameter will be updated to the actual PBLK I/O base address.\r
- // the Operator.\r
- //\r
- Operation = DsdtPointer - 8;\r
- if ((*Operation == AML_EXT_OP) && (*(Operation + 1) == AML_EXT_PROCESSOR_OP)) {\r
- *(UINT32 *)DsdtPointer = PcdGet16(PcdPmbaIoBaseAddress);\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
-}\r
-\r
-\r
-VOID\r
-ApicTableUpdate (\r
- IN OUT EFI_ACPI_DESCRIPTION_HEADER *TableHeader,\r
- IN OUT EFI_ACPI_TABLE_VERSION *Version\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Update the processors information in the APIC table\r
-\r
- Arguments:\r
-\r
- Table - The table to be set\r
- Version - Version to publish\r
-\r
- Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_MP_SERVICES_PROTOCOL *MpService;\r
- UINT8 *CurrPtr;\r
- UINT8 *EndPtr;\r
- UINT8 CurrIoApic;\r
- UINT8 CurrProcessor;\r
- UINTN NumberOfCPUs;\r
- UINTN NumberOfEnabledCPUs;\r
- EFI_PROCESSOR_INFORMATION MpContext;\r
- ACPI_APIC_STRUCTURE_PTR *ApicPtr;\r
-\r
- CurrIoApic = 0;\r
- CurrProcessor = 0;\r
- //\r
- // Find the MP Protocol. This is an MP platform, so MP protocol must be\r
- // there.\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiMpServiceProtocolGuid,\r
- NULL,\r
- (VOID**)&MpService\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Failed to get MP information, doesn't publish the invalid table\r
- //\r
- *Version = EFI_ACPI_TABLE_VERSION_NONE;\r
- return;\r
- }\r
-\r
- //\r
- // Determine the number of processors\r
- //\r
- MpService->GetNumberOfProcessors (\r
- MpService,\r
- &NumberOfCPUs,\r
- &NumberOfEnabledCPUs\r
- );\r
-\r
- CurrPtr = (UINT8*) &(TableHeader[1]);\r
- CurrPtr = CurrPtr + 8; // Size of Local APIC Address & Flag\r
- EndPtr = (UINT8*) TableHeader;\r
- EndPtr = EndPtr + TableHeader->Length;\r
-\r
- while (CurrPtr < EndPtr) {\r
-\r
- ApicPtr = (ACPI_APIC_STRUCTURE_PTR*) CurrPtr;\r
- switch (ApicPtr->AcpiApicCommon.Type) {\r
-\r
- case EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC:\r
- ApicPtr->AcpiLocalApic.Flags = 0;\r
- ApicPtr->AcpiLocalApic.ApicId = 0;\r
- Status = MpService->GetProcessorInfo (\r
- MpService,\r
- CurrProcessor,\r
- &MpContext\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- if (MpContext.StatusFlag & PROCESSOR_ENABLED_BIT) {\r
- ApicPtr->AcpiLocalApic.Flags = EFI_ACPI_3_0_LOCAL_APIC_ENABLED;\r
- }\r
- ApicPtr->AcpiLocalApic.ApicId = (UINT8)MpContext.ProcessorId;\r
- }\r
- CurrProcessor++;\r
- break;\r
-\r
- case EFI_ACPI_1_0_IO_APIC:\r
- //\r
- // IO APIC entries can be patched here\r
- //\r
- if (CurrIoApic == 0) {\r
- //\r
- // Update SOC internel IOAPIC base\r
- //\r
- ApicPtr->AcpiIoApic.IoApicId = PcdGet8 (PcdIoApicSettingIoApicId);\r
- ApicPtr->AcpiIoApic.IoApicAddress = (UINT32)PcdGet64(PcdIoApicBaseAddress);\r
- ApicPtr->AcpiIoApic.GlobalSystemInterruptBase = 0;\r
- } else {\r
- //\r
- // Porting is required to update other IOAPIC entries if available\r
- //\r
- ASSERT (0);\r
- }\r
- CurrIoApic++;\r
- break;\r
-\r
- default:\r
- break;\r
- };\r
- CurrPtr = CurrPtr + ApicPtr->AcpiApicCommon.Length;\r
- }\r
-}\r
-\r
-VOID\r
-AcpiUpdateTable (\r
- IN OUT EFI_ACPI_DESCRIPTION_HEADER *TableHeader,\r
- IN OUT EFI_ACPI_TABLE_VERSION *Version\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Set the correct table revision upon the setup value\r
-\r
- Arguments:\r
-\r
- Table - The table to be set\r
- Version - Version to publish\r
-\r
- Returns:\r
-\r
- None\r
-\r
---*/\r
-\r
-{\r
- EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtHeader1;\r
- EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtHeader2;\r
- EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtHeader3;\r
- EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *AllocationStructurePtr;\r
-\r
- if (TableHeader != NULL && Version != NULL) {\r
-\r
- *Version = EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0;\r
- //\r
- // Here we use all 3.0 signature because all version use same signature if they supported\r
- //\r
- switch (TableHeader->Signature) {\r
- //\r
- // "APIC" Multiple APIC Description Table\r
- //\r
- case EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE:\r
- ApicTableUpdate (TableHeader, Version);\r
- break;\r
- //\r
- // "DSDT" Differentiated System Description Table\r
- //\r
- case EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:\r
- DsdtTableUpdate (TableHeader, Version);\r
- break;\r
-\r
- //\r
- // "FACP" Fixed ACPI Description Table (FADT)\r
- //\r
- case EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE:\r
- *Version = EFI_ACPI_TABLE_VERSION_NONE;\r
- if (TableHeader->Revision == EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
- *Version = EFI_ACPI_TABLE_VERSION_1_0B;\r
- FadtHeader1 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *) TableHeader;\r
- FadtHeader1->SmiCmd = PcdGet16(PcdSmmActivationPort);\r
- FadtHeader1->Pm1aEvtBlk = PcdGet16(PcdPm1blkIoBaseAddress);\r
- FadtHeader1->Pm1aCntBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1C;\r
- FadtHeader1->PmTmrBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1T;\r
- FadtHeader1->Gpe0Blk = PcdGet16(PcdGpe0blkIoBaseAddress);\r
- } else if (TableHeader->Revision == EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
- *Version = EFI_ACPI_TABLE_VERSION_2_0;\r
- FadtHeader2 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) TableHeader;\r
- FadtHeader2->SmiCmd = PcdGet16(PcdSmmActivationPort);\r
- FadtHeader2->Pm1aEvtBlk = PcdGet16(PcdPm1blkIoBaseAddress);\r
- FadtHeader2->Pm1aCntBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1C;\r
- FadtHeader2->PmTmrBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1T;\r
- FadtHeader2->Gpe0Blk = PcdGet16(PcdGpe0blkIoBaseAddress);\r
- FadtHeader2->XPm1aEvtBlk.Address = FadtHeader2->Pm1aEvtBlk;\r
- FadtHeader2->XPm1aCntBlk.Address = FadtHeader2->Pm1aCntBlk;\r
- FadtHeader2->XPmTmrBlk.Address = FadtHeader2->PmTmrBlk;\r
- FadtHeader2->XGpe0Blk.Address = FadtHeader2->Gpe0Blk;\r
- } else if (TableHeader->Revision == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
- *Version = EFI_ACPI_TABLE_VERSION_3_0;\r
- FadtHeader3 = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) TableHeader;\r
- FadtHeader3->SmiCmd = PcdGet16(PcdSmmActivationPort);\r
- FadtHeader3->Pm1aEvtBlk = PcdGet16(PcdPm1blkIoBaseAddress);\r
- FadtHeader3->Pm1aCntBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1C;\r
- FadtHeader3->PmTmrBlk = PcdGet16(PcdPm1blkIoBaseAddress) + R_QNC_PM1BLK_PM1T;\r
- FadtHeader3->Gpe0Blk = PcdGet16(PcdGpe0blkIoBaseAddress);\r
- FadtHeader3->XPm1aEvtBlk.Address = FadtHeader3->Pm1aEvtBlk;\r
- FadtHeader3->XPm1aCntBlk.Address = FadtHeader3->Pm1aCntBlk;\r
- FadtHeader3->XPmTmrBlk.Address = FadtHeader3->PmTmrBlk;\r
- FadtHeader3->XGpe0Blk.Address = FadtHeader3->Gpe0Blk;\r
- }\r
- break;\r
- //\r
- // "FACS" Firmware ACPI Control Structure\r
- //\r
- case EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE:\r
- break;\r
- //\r
- // "SSDT" Secondary System Description Table\r
- //\r
- case EFI_ACPI_3_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "HPET" IA-PC High Precision Event Timer Table\r
- //\r
- case EFI_ACPI_3_0_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE:\r
- //\r
- // If HPET is disabled in setup, don't publish the table.\r
- //\r
- if (mGlobalNvsArea.Area->HpetEnable == 0) {\r
- *Version = EFI_ACPI_TABLE_VERSION_NONE;\r
- }\r
- ((EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *) TableHeader)->BaseAddressLower32Bit.Address\r
- = PcdGet64 (PcdHpetBaseAddress);\r
- break;\r
- //\r
- // "SPCR" Serial Port Concole Redirection Table\r
- //\r
- case EFI_ACPI_3_0_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "MCFG" PCI Express Memory Mapped Configuration Space Base Address Description Table\r
- //\r
- case EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE:\r
- AllocationStructurePtr = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)\r
- ((UINT8 *)TableHeader + sizeof(EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER));\r
- AllocationStructurePtr->BaseAddress = PcdGet64(PcdPciExpressBaseAddress);\r
- break;\r
- // Lakeport platform doesn't support the following table\r
- /*\r
- //\r
- // "ECDT" Embedded Controller Boot Resources Table\r
- //\r
- case EFI_ACPI_3_0_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "PSDT" Persistent System Description Table\r
- //\r
- case EFI_ACPI_3_0_PERSISTENT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "SBST" Smart Battery Specification Table\r
- //\r
- case EFI_ACPI_3_0_SMART_BATTERY_SPECIFICATION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "SLIT" System Locality Information Table\r
- //\r
- case EFI_ACPI_3_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "SRAT" Static Resource Affinity Table\r
- //\r
- case EFI_ACPI_3_0_STATIC_RESOURCE_AFFINITY_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "XSDT" Extended System Description Table\r
- //\r
- case EFI_ACPI_3_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "BOOT" MS Simple Boot Spec\r
- //\r
- case EFI_ACPI_3_0_SIMPLE_BOOT_FLAG_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "CPEP" Corrected Platform Error Polling Table\r
- //\r
- case EFI_ACPI_3_0_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "DBGP" MS Debug Port Spec\r
- //\r
- case EFI_ACPI_3_0_DEBUG_PORT_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "ETDT" Event Timer Description Table\r
- //\r
- case EFI_ACPI_3_0_EVENT_TIMER_DESCRIPTION_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "SPMI" Server Platform Management Interface Table\r
- //\r
- case EFI_ACPI_3_0_SERVER_PLATFORM_MANAGEMENT_INTERFACE_TABLE_SIGNATURE:\r
- break;\r
- //\r
- // "TCPA" Trusted Computing Platform Alliance Capabilities Table\r
- //\r
- case EFI_ACPI_3_0_TRUSTED_COMPUTING_PLATFORM_ALLIANCE_CAPABILITIES_TABLE_SIGNATURE:\r
- break;\r
- */\r
- default:\r
- break;\r
- }\r
- }\r
-}\r
-\r
-//\r
-// Description:\r
-// Entrypoint of Acpi Platform driver\r
-// In:\r
-// ImageHandle\r
-// SystemTable\r
-// Out:\r
-// EFI_SUCCESS\r
-// EFI_LOAD_ERROR\r
-// EFI_OUT_OF_RESOURCES\r
-//\r
-\r
-EFI_STATUS\r
-AcpiPlatformEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
- EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;\r
- INTN Instance;\r
- EFI_ACPI_COMMON_HEADER *CurrentTable;\r
- UINTN TableHandle;\r
- UINT32 FvStatus;\r
- UINTN Size;\r
- EFI_ACPI_TABLE_VERSION Version;\r
- EFI_HANDLE Handle;\r
- UINTN Index;\r
- PCI_DEVICE_INFO *PciDeviceInfo;\r
- EFI_ACPI_HANDLE PciRootHandle;\r
- BOOLEAN UpdatePRT;\r
- BOOLEAN UpdatePRW;\r
- PCI_DEVICE_SETTING *mConfigData;\r
-\r
- DEBUG((DEBUG_INFO, "ACPI Platform start...\n"));\r
-\r
- Instance = 0;\r
- TableHandle = 0;\r
- CurrentTable = NULL;\r
- mConfigData = NULL;\r
-\r
- //\r
- // Initialize the EFI Driver Library\r
- //\r
-\r
- ASSERT (sizeof (EFI_GLOBAL_NVS_AREA) == 512);\r
-\r
- Status = gBS->AllocatePool (\r
- EfiACPIMemoryNVS,\r
- sizeof (EFI_GLOBAL_NVS_AREA),\r
- (VOID**)&mGlobalNvsArea.Area\r
- );\r
-\r
- Handle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &Handle,\r
- &gEfiGlobalNvsAreaProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &mGlobalNvsArea\r
- );\r
-\r
- ASSERT_EFI_ERROR (Status);\r
- if (!EFI_ERROR (Status)) {\r
- SetMem (\r
- mGlobalNvsArea.Area,\r
- sizeof (EFI_GLOBAL_NVS_AREA),\r
- 0\r
- );\r
- }\r
-\r
- //\r
- // Initialize the data. Eventually, this will be controlled by setup options.\r
- //\r
- mGlobalNvsArea.Area->HpetEnable = PcdGetBool (PcdHpetEnable);\r
- mGlobalNvsArea.Area->Pm1blkIoBaseAddress = PcdGet16(PcdPm1blkIoBaseAddress);\r
- mGlobalNvsArea.Area->PmbaIoBaseAddress = PcdGet16(PcdPmbaIoBaseAddress);\r
- mGlobalNvsArea.Area->Gpe0blkIoBaseAddress = PcdGet16(PcdGpe0blkIoBaseAddress);\r
- mGlobalNvsArea.Area->GbaIoBaseAddress = PcdGet16(PcdGbaIoBaseAddress);\r
- mGlobalNvsArea.Area->SmbaIoBaseAddress = PcdGet16(PcdSmbaIoBaseAddress);\r
- mGlobalNvsArea.Area->WdtbaIoBaseAddress = PcdGet16(PcdWdtbaIoBaseAddress);\r
- mGlobalNvsArea.Area->HpetBaseAddress = (UINT32)PcdGet64(PcdHpetBaseAddress);\r
- mGlobalNvsArea.Area->HpetSize = (UINT32)PcdGet64(PcdHpetSize);\r
- mGlobalNvsArea.Area->PciExpressBaseAddress= (UINT32)PcdGet64(PcdPciExpressBaseAddress);\r
- mGlobalNvsArea.Area->PciExpressSize = (UINT32)PcdGet64(PcdPciExpressSize);\r
- mGlobalNvsArea.Area->RcbaMmioBaseAddress = (UINT32)PcdGet64(PcdRcbaMmioBaseAddress);\r
- mGlobalNvsArea.Area->RcbaMmioSize = (UINT32)PcdGet64(PcdRcbaMmioSize);\r
- mGlobalNvsArea.Area->IoApicBaseAddress = (UINT32)PcdGet64(PcdIoApicBaseAddress);\r
- mGlobalNvsArea.Area->IoApicSize = (UINT32)PcdGet64(PcdIoApicSize);\r
- mGlobalNvsArea.Area->TpmPresent = (UINT32)(FALSE);\r
- mGlobalNvsArea.Area->DBG2Present = (UINT32)(FALSE);\r
- mGlobalNvsArea.Area->PlatformType = (UINT32)PcdGet16 (PcdPlatformType);\r
-\r
- //\r
- // Configure platform IO expander I2C Slave Address.\r
- //\r
- if (mGlobalNvsArea.Area->PlatformType == Galileo) {\r
- if (PlatformLegacyGpioGetLevel (R_QNC_GPIO_RGLVL_RESUME_WELL, GALILEO_DETERMINE_IOEXP_SLA_RESUMEWELL_GPIO)) {\r
- mGlobalNvsArea.Area->AlternateSla = FALSE;\r
- } else {\r
- mGlobalNvsArea.Area->AlternateSla = TRUE;\r
- }\r
- }\r
-\r
- //\r
- // Find the AcpiTable protocol\r
- //\r
- Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID**)&AcpiTable);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_ABORTED;\r
- }\r
-\r
- //\r
- // Initialize MADT table\r
- //\r
- Status = MadtTableInitialize (&CurrentTable, &Size);\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Perform any table specific updates.\r
- //\r
- AcpiUpdateTable ((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable, &Version);\r
-\r
- //\r
- // Update the check sum\r
- // It needs to be zeroed before the checksum calculation\r
- //\r
- ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum = 0;\r
- ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum =\r
- CalculateCheckSum8 ((VOID *)CurrentTable, CurrentTable->Length);\r
-\r
- //\r
- // Add the table\r
- //\r
- TableHandle = 0;\r
- Status = AcpiTable->InstallAcpiTable (\r
- AcpiTable,\r
- CurrentTable,\r
- CurrentTable->Length,\r
- &TableHandle\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- CurrentTable = NULL;\r
-\r
- //\r
- // Init Pci Device PRT PRW information structure from PCD\r
- //\r
- mConfigData = (PCI_DEVICE_SETTING *)AllocateZeroPool (sizeof (PCI_DEVICE_SETTING));\r
- ASSERT (mConfigData != NULL);\r
- InitPciDeviceInfoStructure (mConfigData);\r
- //\r
- // Get the Acpi SDT protocol for manipulation on acpi table\r
- //\r
- Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **)&mAcpiSdt);\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Locate the firmware volume protocol\r
- //\r
- Status = LocateSupportProtocol (&gEfiFirmwareVolume2ProtocolGuid, (VOID**)&FwVol, 1);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_ABORTED;\r
- }\r
- //\r
- // Read tables from the storage file.\r
- //\r
-\r
- while (Status == EFI_SUCCESS) {\r
-\r
- Status = FwVol->ReadSection (\r
- FwVol,\r
- (EFI_GUID*)PcdGetPtr (PcdAcpiTableStorageFile),\r
- EFI_SECTION_RAW,\r
- Instance,\r
- (VOID**)&CurrentTable,\r
- &Size,\r
- &FvStatus\r
- );\r
-\r
- if (!EFI_ERROR(Status)) {\r
- //\r
- // Perform any table specific updates.\r
- //\r
- AcpiUpdateTable ((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable, &Version);\r
-\r
- //\r
- // Update the check sum\r
- // It needs to be zeroed before the checksum calculation\r
- //\r
- ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum = 0;\r
- ((EFI_ACPI_SDT_HEADER *)CurrentTable)->Checksum =\r
- CalculateCheckSum8 ((VOID *)CurrentTable, CurrentTable->Length);\r
-\r
- //\r
- // Add the table\r
- //\r
- TableHandle = 0;\r
- Status = AcpiTable->InstallAcpiTable (\r
- AcpiTable,\r
- CurrentTable,\r
- ((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable)->Length,\r
- &TableHandle\r
- );\r
- if (EFI_ERROR(Status)) {\r
- return EFI_ABORTED;\r
- }\r
- //\r
- // If this table is the DSDT table, then update the _PRT and _PRW based on\r
- // the settings from pcds\r
- //\r
- if (CurrentTable->Signature == EFI_ACPI_2_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) {\r
- //\r
- // Create the root handle for DSDT table\r
- //\r
- Status = mAcpiSdt->OpenSdt (TableHandle, &mDsdtHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- PciRootHandle = NULL;\r
- PciRootHandle = SdtGetRootBridgeHandle (mAcpiSdt, mDsdtHandle);\r
- ASSERT (PciRootHandle != NULL);\r
-\r
- PciDeviceInfo = NULL;\r
- for (Index = 0; Index < mConfigData->PciDeviceInfoNumber; Index++) {\r
- PciDeviceInfo = &(mConfigData->PciDeviceInfo[Index]);\r
-\r
- //\r
- // Check whether this is a valid item\r
- //\r
- if ((PciDeviceInfo->BridgeAddress != 0xFFFFFFFF) && (PciDeviceInfo->DeviceAddress != 0xFFFFFFFF)) {\r
-\r
- //DEBUG ((EFI_D_ERROR, "Valid pci info structure: bridge address:0x%x, device address:0x%x\n", PciDeviceInfo->BridgeAddress, PciDeviceInfo->DeviceAddress));\r
-\r
- UpdatePRT = FALSE;\r
- UpdatePRW = FALSE;\r
-\r
- SdtCheckPciDeviceInfoChanged (PciDeviceInfo, &UpdatePRT, &UpdatePRW);\r
- //\r
- // Check whether there is any valid pci routing item\r
- //\r
- if (UpdatePRT) {\r
- //\r
- // Update the pci routing information\r
- //\r
- //DEBUG ((EFI_D_ERROR, "Update _PRT\n"));\r
- SdtUpdatePciRouting (mAcpiSdt, PciRootHandle, PciDeviceInfo);\r
- }\r
- //\r
- // Check whether there is any valid pci routing item\r
- //\r
- if (UpdatePRW) {\r
- //\r
- // Update the pci wakeup information\r
- //\r
- //DEBUG ((EFI_D_ERROR, "Update _PRW\n"));\r
- SdtUpdatePowerWake (mAcpiSdt, PciRootHandle, PciDeviceInfo);\r
- }\r
- }\r
- }\r
- Status = mAcpiSdt->Close (PciRootHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Mark the root handle as modified , let SDT protocol recaculate the checksum\r
- //\r
- ((EFI_AML_HANDLE *)mDsdtHandle)->Modified = TRUE;\r
- Status = mAcpiSdt->Close (mDsdtHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- //\r
- // Increment the instance\r
- //\r
- Instance++;\r
- CurrentTable = NULL;\r
- }\r
- }\r
-\r
- gBS->FreePool (mConfigData);\r
- return EFI_SUCCESS;\r
-}\r