Home | History | Annotate | Download | only in AcpiTableDxe
      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