1 /** @file 2 ACPI Table Protocol Driver 3 4 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef _ACPI_TABLE_H_ 16 #define _ACPI_TABLE_H_ 17 18 19 #include <PiDxe.h> 20 21 #include <Protocol/AcpiTable.h> 22 #include <Guid/Acpi.h> 23 #include <Protocol/AcpiSystemDescriptionTable.h> 24 25 #include <Library/BaseLib.h> 26 #include <Library/DebugLib.h> 27 #include <Library/UefiLib.h> 28 #include <Library/BaseMemoryLib.h> 29 #include <Library/UefiDriverEntryPoint.h> 30 #include <Library/MemoryAllocationLib.h> 31 #include <Library/UefiBootServicesTableLib.h> 32 #include <Library/PcdLib.h> 33 34 // 35 // Statements that include other files 36 // 37 #include <IndustryStandard/Acpi.h> 38 39 #include "AcpiSdt.h" 40 41 // 42 // Great than or equal to 2.0. 43 // 44 #define ACPI_TABLE_VERSION_GTE_2_0 (EFI_ACPI_TABLE_VERSION_2_0 | \ 45 EFI_ACPI_TABLE_VERSION_3_0 | \ 46 EFI_ACPI_TABLE_VERSION_4_0 | \ 47 EFI_ACPI_TABLE_VERSION_5_0) 48 49 // 50 // Private Driver Data 51 // 52 // 53 // ACPI Table Linked List Signature. 54 // 55 #define EFI_ACPI_TABLE_LIST_SIGNATURE SIGNATURE_32 ('E', 'A', 'T', 'L') 56 57 // 58 // ACPI Table Linked List Entry definition. 59 // 60 // Signature must be set to EFI_ACPI_TABLE_LIST_SIGNATURE 61 // Link is the linked list data. 62 // Version is the versions of the ACPI tables that this table belongs in. 63 // Table is a pointer to the table. 64 // PageAddress is the address of the pages allocated for the table. 65 // NumberOfPages is the number of pages allocated at PageAddress. 66 // Handle is used to identify a particular table. 67 // 68 typedef struct { 69 UINT32 Signature; 70 LIST_ENTRY Link; 71 EFI_ACPI_TABLE_VERSION Version; 72 EFI_ACPI_COMMON_HEADER *Table; 73 EFI_PHYSICAL_ADDRESS PageAddress; 74 UINTN NumberOfPages; 75 UINTN Handle; 76 } EFI_ACPI_TABLE_LIST; 77 78 // 79 // Containment record for ACPI Table linked list. 80 // 81 #define EFI_ACPI_TABLE_LIST_FROM_LINK(_link) CR (_link, EFI_ACPI_TABLE_LIST, Link, EFI_ACPI_TABLE_LIST_SIGNATURE) 82 83 // 84 // The maximum number of tables this driver supports 85 // 86 #define EFI_ACPI_MAX_NUM_TABLES 20 87 88 // 89 // Protocol private structure definition 90 // 91 // 92 // ACPI support protocol instance signature definition. 93 // 94 #define EFI_ACPI_TABLE_SIGNATURE SIGNATURE_32 ('S', 'T', 'A', 'E') 95 96 // 97 // ACPI support protocol instance data structure 98 // 99 typedef struct { 100 UINTN Signature; 101 EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp1; // Pointer to RSD_PTR structure 102 EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp3; // Pointer to RSD_PTR structure 103 EFI_ACPI_DESCRIPTION_HEADER *Rsdt1; // Pointer to RSDT table header 104 EFI_ACPI_DESCRIPTION_HEADER *Rsdt3; // Pointer to RSDT table header 105 EFI_ACPI_DESCRIPTION_HEADER *Xsdt; // Pointer to XSDT table header 106 EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt1; // Pointer to FADT table header 107 EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt3; // Pointer to FADT table header 108 EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs1; // Pointer to FACS table header 109 EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs3; // Pointer to FACS table header 110 EFI_ACPI_DESCRIPTION_HEADER *Dsdt1; // Pointer to DSDT table header 111 EFI_ACPI_DESCRIPTION_HEADER *Dsdt3; // Pointer to DSDT table header 112 LIST_ENTRY TableList; 113 UINTN NumberOfTableEntries1; // Number of ACPI 1.0 tables 114 UINTN NumberOfTableEntries3; // Number of ACPI 3.0 tables 115 UINTN CurrentHandle; 116 EFI_ACPI_TABLE_PROTOCOL AcpiTableProtocol; 117 EFI_ACPI_SDT_PROTOCOL AcpiSdtProtocol; 118 LIST_ENTRY NotifyList; 119 } EFI_ACPI_TABLE_INSTANCE; 120 121 // 122 // ACPI table protocol instance containing record macro 123 // 124 #define EFI_ACPI_TABLE_INSTANCE_FROM_THIS(a) \ 125 CR (a, \ 126 EFI_ACPI_TABLE_INSTANCE, \ 127 AcpiTableProtocol, \ 128 EFI_ACPI_TABLE_SIGNATURE \ 129 ) 130 131 // 132 // Protocol Constructor functions 133 // 134 135 /** 136 Constructor for the ACPI support protocol. Initializes instance 137 data. 138 139 @param AcpiTableInstance Instance to construct 140 141 @return EFI_SUCCESS Instance initialized. 142 @return EFI_OUT_OF_RESOURCES Unable to allocate required resources. 143 144 **/ 145 EFI_STATUS 146 AcpiTableAcpiTableConstructor ( 147 EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance 148 ); 149 150 151 /** 152 Entry point of the ACPI table driver. 153 Creates and initializes an instance of the ACPI Table 154 Protocol and installs it on a new handle. 155 156 @param ImageHandle A handle for the image that is initializing this driver 157 @param SystemTable A pointer to the EFI system table 158 159 @return EFI_SUCCESS Driver initialized successfully 160 @return EFI_LOAD_ERROR Failed to Initialize or has been loaded 161 @return EFI_OUT_OF_RESOURCES Could not allocate needed resources 162 163 **/ 164 EFI_STATUS 165 EFIAPI 166 InitializeAcpiTableDxe ( 167 IN EFI_HANDLE ImageHandle, 168 IN EFI_SYSTEM_TABLE *SystemTable 169 ); 170 171 /** 172 173 This function finds the table specified by the handle and returns a pointer to it. 174 If the handle is not found, EFI_NOT_FOUND is returned and the contents of Table are 175 undefined. 176 177 @param[in] Handle Table to find. 178 @param[in] TableList Table list to search 179 @param[out] Table Pointer to table found. 180 181 @retval EFI_SUCCESS The function completed successfully. 182 @retval EFI_NOT_FOUND No table found matching the handle specified. 183 184 **/ 185 EFI_STATUS 186 FindTableByHandle ( 187 IN UINTN Handle, 188 IN LIST_ENTRY *TableList, 189 OUT EFI_ACPI_TABLE_LIST **Table 190 ); 191 192 /** 193 194 This function calculates and updates an UINT8 checksum. 195 196 @param[in] Buffer Pointer to buffer to checksum 197 @param[in] Size Number of bytes to checksum 198 @param[in] ChecksumOffset Offset to place the checksum result in 199 200 @retval EFI_SUCCESS The function completed successfully. 201 202 **/ 203 EFI_STATUS 204 AcpiPlatformChecksum ( 205 IN VOID *Buffer, 206 IN UINTN Size, 207 IN UINTN ChecksumOffset 208 ); 209 210 /** 211 This function invokes ACPI notification. 212 213 @param[in] AcpiTableInstance Instance to AcpiTable 214 @param[in] Version Version(s) to set. 215 @param[in] Handle Handle of the table. 216 **/ 217 VOID 218 SdtNotifyAcpiList ( 219 IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance, 220 IN EFI_ACPI_TABLE_VERSION Version, 221 IN UINTN Handle 222 ); 223 224 /** 225 This function initializes AcpiSdt protocol in ACPI table instance. 226 227 @param[in] AcpiTableInstance Instance to construct 228 **/ 229 VOID 230 SdtAcpiTableAcpiSdtConstructor ( 231 IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance 232 ); 233 234 // 235 // export PrivateData symbol, because we need that in AcpiSdtProtol implementation 236 // 237 extern EFI_HANDLE mHandle; 238 extern EFI_ACPI_TABLE_INSTANCE *mPrivateData; 239 240 #endif 241