VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c@ 108793

Last change on this file since 108793 was 105670, checked in by vboxsync, 8 months ago

Devices/EFI/FirmwareNew: Merge edk2-stable-202405 and make it build on aarch64, bugref:4643

  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1/** @file
2
3
4 Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8**/
9
10#include "UefiPayloadEntry.h"
11
12/**
13 Find the board related info from ACPI table
14
15 @param AcpiTableBase ACPI table start address in memory
16 @param AcpiBoardInfo Pointer to the acpi board info strucutre
17
18 @retval RETURN_SUCCESS Successfully find out all the required information.
19 @retval RETURN_NOT_FOUND Failed to find the required info.
20
21**/
22RETURN_STATUS
23ParseAcpiInfo (
24 IN UINT64 AcpiTableBase,
25 OUT ACPI_BOARD_INFO *AcpiBoardInfo
26 )
27{
28 EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
29 EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
30 UINT32 *Entry32;
31 UINTN Entry32Num;
32 EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;
33 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
34 UINT64 *Entry64;
35 UINTN Entry64Num;
36 UINTN Idx;
37 UINT32 *Signature;
38 EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;
39 EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;
40
41 Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;
42 DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));
43 DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));
44
45 //
46 // Search Rsdt First
47 //
48 Fadt = NULL;
49 MmCfgHdr = NULL;
50 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);
51 if (Rsdt != NULL) {
52 Entry32 = (UINT32 *)(Rsdt + 1);
53 Entry32Num = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) >> 2;
54 for (Idx = 0; Idx < Entry32Num; Idx++) {
55 Signature = (UINT32 *)(UINTN)Entry32[Idx];
56 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
57 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
58 DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));
59 }
60
61 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {
62 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
63 DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));
64 }
65
66 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
67 goto Done;
68 }
69 }
70 }
71
72 //
73 // Search Xsdt Second
74 //
75 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);
76 if (Xsdt != NULL) {
77 Entry64 = (UINT64 *)(Xsdt + 1);
78 Entry64Num = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) >> 3;
79 for (Idx = 0; Idx < Entry64Num; Idx++) {
80 Signature = (UINT32 *)(UINTN)Entry64[Idx];
81 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
82 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;
83 DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));
84 }
85
86 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {
87 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;
88 DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));
89 }
90
91 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {
92 goto Done;
93 }
94 }
95 }
96
97 if (Fadt == NULL) {
98 return RETURN_NOT_FOUND;
99 }
100
101Done:
102
103 AcpiBoardInfo->PmCtrlRegBase = Fadt->Pm1aCntBlk;
104 AcpiBoardInfo->PmTimerRegBase = Fadt->PmTmrBlk;
105 AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;
106 AcpiBoardInfo->ResetValue = Fadt->ResetValue;
107 AcpiBoardInfo->PmEvtBase = Fadt->Pm1aEvtBlk;
108 AcpiBoardInfo->PmGpeEnBase = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;
109
110 if (MmCfgHdr != NULL) {
111 MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8 *)MmCfgHdr + sizeof (*MmCfgHdr));
112 AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;
113 AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;
114 } else {
115 AcpiBoardInfo->PcieBaseAddress = 0;
116 AcpiBoardInfo->PcieBaseSize = 0;
117 }
118
119 DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBase));
120 DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegBase));
121 DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAddress));
122 DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue));
123 DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase));
124 DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase));
125 DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));
126 DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));
127
128 //
129 // Verify values for proper operation
130 //
131 ASSERT (Fadt->Pm1aCntBlk != 0);
132 ASSERT (Fadt->PmTmrBlk != 0);
133 ASSERT (Fadt->ResetReg.Address != 0);
134 ASSERT (Fadt->Pm1aEvtBlk != 0);
135 ASSERT (Fadt->Gpe0Blk != 0);
136
137 return RETURN_SUCCESS;
138}
139
140/**
141 Build ACPI board info HOB using infomation from ACPI table
142
143 @param AcpiTableBase ACPI table start address in memory
144
145 @retval A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HOB failure.
146**/
147ACPI_BOARD_INFO *
148BuildHobFromAcpi (
149 IN UINT64 AcpiTableBase
150 )
151{
152 EFI_STATUS Status;
153 ACPI_BOARD_INFO AcpiBoardInfo;
154 ACPI_BOARD_INFO *NewAcpiBoardInfo;
155
156 NewAcpiBoardInfo = NULL;
157 Status = ParseAcpiInfo (AcpiTableBase, &AcpiBoardInfo);
158 ASSERT_EFI_ERROR (Status);
159 if (!EFI_ERROR (Status)) {
160 NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));
161 ASSERT (NewAcpiBoardInfo != NULL);
162 CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));
163 DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));
164 }
165
166 return NewAcpiBoardInfo;
167}
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette