]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c
PrmPkg: Add PlatformGuid
[mirror_edk2.git] / OvmfPkg / AcpiPlatformDxe / CloudHvAcpi.c
CommitLineData
7594c5bf
SB
1/** @file\r
2 OVMF ACPI Cloud Hypervisor support\r
3\r
4 Copyright (c) 2021, Intel Corporation. All rights reserved.\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
d50d9e55
SB
10#include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS\r
11#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h> // hvm_start_info\r
12#include <Library/BaseLib.h> // CpuDeadLoop()\r
13#include <Library/DebugLib.h> // DEBUG()\r
14#include <Library/PcdLib.h> // PcdGet32()\r
7594c5bf
SB
15\r
16#include "AcpiPlatform.h"\r
17\r
18// Get the ACPI tables from EBDA start\r
19EFI_STATUS\r
20EFIAPI\r
21InstallCloudHvTables (\r
22 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol\r
23 )\r
24{\r
25 EFI_STATUS Status;\r
26 UINTN TableHandle;\r
27\r
d50d9e55
SB
28 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
29 VOID *CurrentTableEntry;\r
30 UINTN CurrentTablePointer;\r
31 EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;\r
32 UINTN Index;\r
33 UINTN NumberOfTableEntries;\r
34 EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt2Table;\r
35 EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;\r
36 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *AcpiRsdpStructurePtr;\r
37 UINT32 *PVHResetVectorData;\r
38 struct hvm_start_info *pvh_start_info;\r
7594c5bf
SB
39\r
40 Fadt2Table = NULL;\r
41 DsdtTable = NULL;\r
42 TableHandle = 0;\r
43 NumberOfTableEntries = 0;\r
d50d9e55
SB
44 AcpiRsdpStructurePtr = NULL;\r
45 PVHResetVectorData = NULL;\r
46 pvh_start_info = NULL;\r
47\r
48 PVHResetVectorData = (VOID *)(UINTN)PcdGet32 (PcdXenPvhStartOfDayStructPtr);\r
49 if (PVHResetVectorData == 0) {\r
50 return EFI_NOT_FOUND;\r
51 }\r
52\r
53 pvh_start_info = (struct hvm_start_info *)(UINTN)PVHResetVectorData[0];\r
54 AcpiRsdpStructurePtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)pvh_start_info->rsdp_paddr;\r
7594c5bf
SB
55\r
56 // If XSDT table is found, just install its tables.\r
57 // Otherwise, try to find and install the RSDT tables.\r
58 //\r
59 if (AcpiRsdpStructurePtr->XsdtAddress) {\r
60 //\r
61 // Retrieve the addresses of XSDT and\r
62 // calculate the number of its table entries.\r
63 //\r
64 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)\r
65 AcpiRsdpStructurePtr->XsdtAddress;\r
66 NumberOfTableEntries = (Xsdt->Length -\r
67 sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /\r
68 sizeof (UINT64);\r
69\r
70 //\r
71 // Install ACPI tables found in XSDT.\r
72 //\r
73 for (Index = 0; Index < NumberOfTableEntries; Index++) {\r
74 //\r
75 // Get the table entry from XSDT\r
76 //\r
77 CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +\r
78 sizeof (EFI_ACPI_DESCRIPTION_HEADER) +\r
79 Index * sizeof (UINT64));\r
80 CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;\r
81 CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;\r
82\r
83 //\r
84 // Install the XSDT tables\r
85 //\r
86 Status = AcpiProtocol->InstallAcpiTable (\r
87 AcpiProtocol,\r
88 CurrentTable,\r
89 CurrentTable->Length,\r
90 &TableHandle\r
91 );\r
92\r
93 if (EFI_ERROR (Status)) {\r
94 ASSERT_EFI_ERROR (Status);\r
95 return Status;\r
96 }\r
97\r
98 //\r
99 // Get the X-DSDT table address from the table FADT\r
100 //\r
101 if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) {\r
102 Fadt2Table = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)\r
103 (UINTN)CurrentTablePointer;\r
104 DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->XDsdt;\r
105 }\r
106 }\r
107 } else {\r
108 return EFI_NOT_FOUND;\r
109 }\r
110\r
111 //\r
112 // Install DSDT table. If we reached this point without finding the DSDT,\r
113 // then we're out of sync with the hypervisor, and cannot continue.\r
114 //\r
115 if (DsdtTable == NULL) {\r
116 DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __FUNCTION__));\r
117 ASSERT (FALSE);\r
118 CpuDeadLoop ();\r
119 }\r
120\r
121 Status = AcpiProtocol->InstallAcpiTable (\r
122 AcpiProtocol,\r
123 DsdtTable,\r
124 DsdtTable->Length,\r
125 &TableHandle\r
126 );\r
127 if (EFI_ERROR (Status)) {\r
128 ASSERT_EFI_ERROR (Status);\r
129 return Status;\r
130 }\r
131\r
132 return EFI_SUCCESS;\r
133}\r