]> git.proxmox.com Git - mirror_edk2.git/blame - ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmVirtPkg / XenAcpiPlatformDxe / XenAcpiPlatformDxe.c
CommitLineData
402dde68
SZ
1/** @file\r
2 Xen ARM ACPI Platform Driver using Xen ARM multiboot protocol\r
3\r
4 Copyright (C) 2016, Linaro Ltd. All rights reserved.\r
5\r
9792fb0e 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
402dde68
SZ
7\r
8**/\r
9\r
10#include <Library/BaseLib.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/UefiBootServicesTableLib.h>\r
13#include <Library/UefiDriverEntryPoint.h>\r
14\r
15#include <Protocol/AcpiTable.h>\r
16#include <Protocol/FdtClient.h>\r
17\r
18#include <IndustryStandard/Acpi.h>\r
19\r
20/**\r
21 Get the address of Xen ACPI Root System Description Pointer (RSDP)\r
22 structure.\r
23\r
24 @param RsdpStructurePtr Return pointer to RSDP structure\r
25\r
26 @return EFI_SUCCESS Find Xen RSDP structure successfully.\r
27 @return EFI_NOT_FOUND Don't find Xen RSDP structure.\r
28 @return EFI_ABORTED Find Xen RSDP structure, but it's not integrated.\r
29\r
30**/\r
31STATIC\r
32EFI_STATUS\r
33EFIAPI\r
34GetXenArmAcpiRsdp (\r
2b16a4fb 35 OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr\r
402dde68
SZ
36 )\r
37{\r
2b16a4fb
MK
38 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr;\r
39 EFI_STATUS Status;\r
40 FDT_CLIENT_PROTOCOL *FdtClient;\r
41 CONST UINT64 *Reg;\r
42 UINT32 RegSize;\r
43 UINTN AddressCells, SizeCells;\r
44 UINT64 RegBase;\r
45 UINT8 Sum;\r
402dde68
SZ
46\r
47 RsdpStructurePtr = NULL;\r
2b16a4fb 48 FdtClient = NULL;\r
402dde68
SZ
49 //\r
50 // Get the RSDP structure address from DeviceTree\r
51 //\r
2b16a4fb
MK
52 Status = gBS->LocateProtocol (\r
53 &gFdtClientProtocolGuid,\r
54 NULL,\r
55 (VOID **)&FdtClient\r
56 );\r
402dde68
SZ
57 ASSERT_EFI_ERROR (Status);\r
58\r
2b16a4fb
MK
59 Status = FdtClient->FindCompatibleNodeReg (\r
60 FdtClient,\r
61 "xen,guest-acpi",\r
62 (CONST VOID **)&Reg,\r
63 &AddressCells,\r
64 &SizeCells,\r
65 &RegSize\r
66 );\r
402dde68 67 if (EFI_ERROR (Status)) {\r
2b16a4fb
MK
68 DEBUG ((\r
69 DEBUG_WARN,\r
70 "%a: No 'xen,guest-acpi' compatible DT node found\n",\r
71 __FUNCTION__\r
72 ));\r
402dde68
SZ
73 return EFI_NOT_FOUND;\r
74 }\r
75\r
cfc8d51c
AB
76 ASSERT (AddressCells == 2);\r
77 ASSERT (SizeCells == 2);\r
402dde68
SZ
78 ASSERT (RegSize == 2 * sizeof (UINT64));\r
79\r
2b16a4fb 80 RegBase = SwapBytes64 (Reg[0]);\r
6244c892
LE
81 RsdpStructurePtr =\r
82 (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)RegBase;\r
402dde68 83\r
2b16a4fb
MK
84 if (RsdpStructurePtr && (RsdpStructurePtr->Revision >= 2)) {\r
85 Sum = CalculateSum8 (\r
86 (CONST UINT8 *)RsdpStructurePtr,\r
87 sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER)\r
88 );\r
402dde68
SZ
89 if (Sum != 0) {\r
90 return EFI_ABORTED;\r
91 }\r
92 }\r
93\r
94 *RsdpPtr = RsdpStructurePtr;\r
95 return EFI_SUCCESS;\r
96}\r
97\r
98/**\r
99 Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tables\r
100 into the RSDT/XSDT using InstallAcpiTable. Some signature of the installed\r
101 ACPI tables are: FACP, APIC, GTDT, DSDT.\r
102\r
103 @param AcpiProtocol Protocol instance pointer.\r
104\r
105 @return EFI_SUCCESS The table was successfully inserted.\r
106 @return EFI_INVALID_PARAMETER Either AcpiTableBuffer is NULL, TableHandle is\r
107 NULL, or AcpiTableBufferSize and the size\r
108 field embedded in the ACPI table pointed to\r
109 by AcpiTableBuffer are not in sync.\r
110 @return EFI_OUT_OF_RESOURCES Insufficient resources exist to complete the request.\r
111\r
112**/\r
113STATIC\r
114EFI_STATUS\r
115EFIAPI\r
116InstallXenArmTables (\r
2b16a4fb 117 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol\r
402dde68
SZ
118 )\r
119{\r
2b16a4fb
MK
120 EFI_STATUS Status;\r
121 UINTN TableHandle;\r
122 VOID *CurrentTableEntry;\r
123 UINTN CurrentTablePointer;\r
124 EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;\r
125 UINTN Index;\r
126 UINTN NumberOfTableEntries;\r
127 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr;\r
128 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
129 EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtTable;\r
130 EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;\r
402dde68
SZ
131\r
132 XenAcpiRsdpStructurePtr = NULL;\r
2b16a4fb
MK
133 FadtTable = NULL;\r
134 DsdtTable = NULL;\r
135 TableHandle = 0;\r
136 NumberOfTableEntries = 0;\r
402dde68
SZ
137\r
138 //\r
139 // Try to find Xen ARM ACPI tables\r
140 //\r
141 Status = GetXenArmAcpiRsdp (&XenAcpiRsdpStructurePtr);\r
142 if (EFI_ERROR (Status)) {\r
c5b3a56e 143 DEBUG ((DEBUG_INFO, "%a: No RSDP table found\n", __FUNCTION__));\r
402dde68
SZ
144 return Status;\r
145 }\r
146\r
147 //\r
148 // If XSDT table is find, just install its tables.\r
149 //\r
150 if (XenAcpiRsdpStructurePtr->XsdtAddress) {\r
151 //\r
152 // Retrieve the addresses of XSDT and\r
153 // calculate the number of its table entries.\r
154 //\r
2b16a4fb
MK
155 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)\r
156 XenAcpiRsdpStructurePtr->XsdtAddress;\r
402dde68 157 NumberOfTableEntries = (Xsdt->Length -\r
2b16a4fb
MK
158 sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /\r
159 sizeof (UINT64);\r
402dde68
SZ
160 //\r
161 // Install ACPI tables found in XSDT.\r
162 //\r
163 for (Index = 0; Index < NumberOfTableEntries; Index++) {\r
164 //\r
165 // Get the table entry from XSDT\r
166 //\r
2b16a4fb
MK
167 CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +\r
168 sizeof (EFI_ACPI_DESCRIPTION_HEADER) +\r
169 Index * sizeof (UINT64));\r
170 CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;\r
171 CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;\r
402dde68
SZ
172\r
173 //\r
174 // Install the XSDT tables\r
175 //\r
176 Status = AcpiProtocol->InstallAcpiTable (\r
2b16a4fb
MK
177 AcpiProtocol,\r
178 CurrentTable,\r
179 CurrentTable->Length,\r
180 &TableHandle\r
181 );\r
402dde68
SZ
182\r
183 if (EFI_ERROR (Status)) {\r
184 return Status;\r
185 }\r
186\r
187 //\r
188 // Get the FACS and DSDT table address from the table FADT\r
189 //\r
2b16a4fb 190 if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) {\r
402dde68 191 FadtTable = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)\r
2b16a4fb
MK
192 (UINTN)CurrentTablePointer;\r
193 DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtTable->Dsdt;\r
402dde68
SZ
194 }\r
195 }\r
196 }\r
197\r
198 //\r
199 // Install DSDT table.\r
200 //\r
201 Status = AcpiProtocol->InstallAcpiTable (\r
2b16a4fb
MK
202 AcpiProtocol,\r
203 DsdtTable,\r
204 DsdtTable->Length,\r
205 &TableHandle\r
206 );\r
402dde68
SZ
207 if (EFI_ERROR (Status)) {\r
208 return Status;\r
209 }\r
210\r
211 return EFI_SUCCESS;\r
212}\r
213\r
214STATIC\r
215EFI_ACPI_TABLE_PROTOCOL *\r
216FindAcpiTableProtocol (\r
217 VOID\r
218 )\r
219{\r
2b16a4fb
MK
220 EFI_STATUS Status;\r
221 EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
402dde68
SZ
222\r
223 AcpiTable = NULL;\r
2b16a4fb
MK
224 Status = gBS->LocateProtocol (\r
225 &gEfiAcpiTableProtocolGuid,\r
226 NULL,\r
227 (VOID **)&AcpiTable\r
228 );\r
402dde68
SZ
229 ASSERT_EFI_ERROR (Status);\r
230 return AcpiTable;\r
231}\r
232\r
233/**\r
234 Entrypoint of Xen ARM Acpi Platform driver.\r
235\r
236 @param ImageHandle\r
237 @param SystemTable\r
238\r
239 @return EFI_SUCCESS\r
240 @return EFI_LOAD_ERROR\r
241 @return EFI_OUT_OF_RESOURCES\r
242\r
243**/\r
402dde68
SZ
244EFI_STATUS\r
245EFIAPI\r
246XenAcpiPlatformEntryPoint (\r
2b16a4fb
MK
247 IN EFI_HANDLE ImageHandle,\r
248 IN EFI_SYSTEM_TABLE *SystemTable\r
402dde68
SZ
249 )\r
250{\r
2b16a4fb 251 EFI_STATUS Status;\r
402dde68
SZ
252\r
253 Status = InstallXenArmTables (FindAcpiTableProtocol ());\r
254 return Status;\r
255}\r