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