Home | History | Annotate | Download | only in AcpiPlatform
      1 /** @file
      2 Update the _PRT and _PRW method for pci devices
      3 
      4 Copyright (c) 2013-2015 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 
     15 **/
     16 #ifndef _ACPI_PCI_UPDATE_H_
     17 #define _ACPI_PCI_UPDATE_H_
     18 
     19 
     20 //
     21 // Primary OpCode
     22 //
     23 #define AML_ZERO_OP                  0x00
     24 #define AML_ONE_OP                   0x01
     25 #define AML_ALIAS_OP                 0x06
     26 #define AML_NAME_OP                  0x08
     27 #define AML_BYTE_PREFIX              0x0a
     28 #define AML_WORD_PREFIX              0x0b
     29 #define AML_DWORD_PREFIX             0x0c
     30 #define AML_STRING_PREFIX            0x0d
     31 #define AML_QWORD_PREFIX             0x0e
     32 #define AML_SCOPE_OP                 0x10
     33 #define AML_BUFFER_OP                0x11
     34 #define AML_PACKAGE_OP               0x12
     35 #define AML_VAR_PACKAGE_OP           0x13
     36 #define AML_METHOD_OP                0x14
     37 #define AML_DUAL_NAME_PREFIX         0x2e
     38 #define AML_MULTI_NAME_PREFIX        0x2f
     39 #define AML_NAME_CHAR_A              0x41
     40 #define AML_NAME_CHAR_B              0x42
     41 #define AML_NAME_CHAR_C              0x43
     42 #define AML_NAME_CHAR_D              0x44
     43 #define AML_NAME_CHAR_E              0x45
     44 #define AML_NAME_CHAR_F              0x46
     45 #define AML_NAME_CHAR_G              0x47
     46 #define AML_NAME_CHAR_H              0x48
     47 #define AML_NAME_CHAR_I              0x49
     48 #define AML_NAME_CHAR_J              0x4a
     49 #define AML_NAME_CHAR_K              0x4b
     50 #define AML_NAME_CHAR_L              0x4c
     51 #define AML_NAME_CHAR_M              0x4d
     52 #define AML_NAME_CHAR_N              0x4e
     53 #define AML_NAME_CHAR_O              0x4f
     54 #define AML_NAME_CHAR_P              0x50
     55 #define AML_NAME_CHAR_Q              0x51
     56 #define AML_NAME_CHAR_R              0x52
     57 #define AML_NAME_CHAR_S              0x53
     58 #define AML_NAME_CHAR_T              0x54
     59 #define AML_NAME_CHAR_U              0x55
     60 #define AML_NAME_CHAR_V              0x56
     61 #define AML_NAME_CHAR_W              0x57
     62 #define AML_NAME_CHAR_X              0x58
     63 #define AML_NAME_CHAR_Y              0x59
     64 #define AML_NAME_CHAR_Z              0x5a
     65 #define AML_ROOT_CHAR                0x5c
     66 #define AML_PARENT_PREFIX_CHAR       0x5e
     67 #define AML_NAME_CHAR__              0x5f
     68 #define AML_LOCAL0                   0x60
     69 #define AML_LOCAL1                   0x61
     70 #define AML_LOCAL2                   0x62
     71 #define AML_LOCAL3                   0x63
     72 #define AML_LOCAL4                   0x64
     73 #define AML_LOCAL5                   0x65
     74 #define AML_LOCAL6                   0x66
     75 #define AML_LOCAL7                   0x67
     76 #define AML_ARG0                     0x68
     77 #define AML_ARG1                     0x69
     78 #define AML_ARG2                     0x6a
     79 #define AML_ARG3                     0x6b
     80 #define AML_ARG4                     0x6c
     81 #define AML_ARG5                     0x6d
     82 #define AML_ARG6                     0x6e
     83 #define AML_STORE_OP                 0x70
     84 #define AML_REF_OF_OP                0x71
     85 #define AML_ADD_OP                   0x72
     86 #define AML_CONCAT_OP                0x73
     87 #define AML_SUBTRACT_OP              0x74
     88 #define AML_INCREMENT_OP             0x75
     89 #define AML_DECREMENT_OP             0x76
     90 #define AML_MULTIPLY_OP              0x77
     91 #define AML_DIVIDE_OP                0x78
     92 #define AML_SHIFT_LEFT_OP            0x79
     93 #define AML_SHIFT_RIGHT_OP           0x7a
     94 #define AML_AND_OP                   0x7b
     95 #define AML_NAND_OP                  0x7c
     96 #define AML_OR_OP                    0x7d
     97 #define AML_NOR_OP                   0x7e
     98 #define AML_XOR_OP                   0x7f
     99 #define AML_NOT_OP                   0x80
    100 #define AML_FIND_SET_LEFT_BIT_OP     0x81
    101 #define AML_FIND_SET_RIGHT_BIT_OP    0x82
    102 #define AML_DEREF_OF_OP              0x83
    103 #define AML_CONCAT_RES_OP            0x84
    104 #define AML_MOD_OP                   0x85
    105 #define AML_NOTIFY_OP                0x86
    106 #define AML_SIZE_OF_OP               0x87
    107 #define AML_INDEX_OP                 0x88
    108 #define AML_MATCH_OP                 0x89
    109 #define AML_CREATE_DWORD_FIELD_OP    0x8a
    110 #define AML_CREATE_WORD_FIELD_OP     0x8b
    111 #define AML_CREATE_BYTE_FIELD_OP     0x8c
    112 #define AML_CREATE_BIT_FIELD_OP      0x8d
    113 #define AML_OBJECT_TYPE_OP           0x8e
    114 #define AML_CREATE_QWORD_FIELD_OP    0x8f
    115 #define AML_LAND_OP                  0x90
    116 #define AML_LOR_OP                   0x91
    117 #define AML_LNOT_OP                  0x92
    118 #define AML_LEQUAL_OP                0x93
    119 #define AML_LGREATER_OP              0x94
    120 #define AML_LLESS_OP                 0x95
    121 #define AML_TO_BUFFER_OP             0x96
    122 #define AML_TO_DEC_STRING_OP         0x97
    123 #define AML_TO_HEX_STRING_OP         0x98
    124 #define AML_TO_INTEGER_OP            0x99
    125 #define AML_TO_STRING_OP             0x9c
    126 #define AML_COPY_OBJECT_OP           0x9d
    127 #define AML_MID_OP                   0x9e
    128 #define AML_CONTINUE_OP              0x9f
    129 #define AML_IF_OP                    0xa0
    130 #define AML_ELSE_OP                  0xa1
    131 #define AML_WHILE_OP                 0xa2
    132 #define AML_NOOP_OP                  0xa3
    133 #define AML_RETURN_OP                0xa4
    134 #define AML_BREAK_OP                 0xa5
    135 #define AML_BREAK_POINT_OP           0xcc
    136 #define AML_ONES_OP                  0xff
    137 
    138 //
    139 // Extended OpCode
    140 //
    141 #define AML_EXT_OP                   0x5b
    142 
    143 #define AML_EXT_MUTEX_OP             0x01
    144 #define AML_EXT_EVENT_OP             0x02
    145 #define AML_EXT_COND_REF_OF_OP       0x12
    146 #define AML_EXT_CREATE_FIELD_OP      0x13
    147 #define AML_EXT_LOAD_TABLE_OP        0x1f
    148 #define AML_EXT_LOAD_OP              0x20
    149 #define AML_EXT_STALL_OP             0x21
    150 #define AML_EXT_SLEEP_OP             0x22
    151 #define AML_EXT_ACQUIRE_OP           0x23
    152 #define AML_EXT_SIGNAL_OP            0x24
    153 #define AML_EXT_WAIT_OP              0x25
    154 #define AML_EXT_RESET_OP             0x26
    155 #define AML_EXT_RELEASE_OP           0x27
    156 #define AML_EXT_FROM_BCD_OP          0x28
    157 #define AML_EXT_TO_BCD_OP            0x29
    158 #define AML_EXT_UNLOAD_OP            0x2a
    159 #define AML_EXT_REVISION_OP          0x30
    160 #define AML_EXT_DEBUG_OP             0x31
    161 #define AML_EXT_FATAL_OP             0x32
    162 #define AML_EXT_TIMER_OP             0x33
    163 #define AML_EXT_REGION_OP            0x80
    164 #define AML_EXT_FIELD_OP             0x81
    165 #define AML_EXT_DEVICE_OP            0x82
    166 #define AML_EXT_PROCESSOR_OP         0x83
    167 #define AML_EXT_POWER_RES_OP         0x84
    168 #define AML_EXT_THERMAL_ZONE_OP      0x85
    169 #define AML_EXT_INDEX_FIELD_OP       0x86
    170 #define AML_EXT_BANK_FIELD_OP        0x87
    171 #define AML_EXT_DATA_REGION_OP       0x88
    172 
    173 #pragma pack(1)
    174 
    175 typedef struct {
    176   UINT32    BridgeAddress;
    177   UINT32    DeviceAddress;
    178   UINT8     INTA[2];    // the first member record the 8259 link, the second member record the io apic irq number
    179   UINT8     INTB[2];
    180   UINT8     INTC[2];
    181   UINT8     INTD[2];
    182 
    183   UINT8     GPEPin;
    184   UINT8     SxNum;
    185 } PCI_DEVICE_INFO;
    186 
    187 #pragma pack()
    188 
    189 #define PCI_DEVICE_INFO_MAX_NUM  50
    190 #define CURRENT_PCI_DEVICE_NUM   13
    191 
    192 #define  PIRQ_LINKA       1
    193 #define  PIRQ_LINKB       2
    194 #define  PIRQ_LINKC       3
    195 #define  PIRQ_LINKD       4
    196 #define  PIRQ_LINKE       5
    197 #define  PIRQ_LINKF       6
    198 #define  PIRQ_LINKG       7
    199 #define  PIRQ_LINKH       8
    200 #define  PIRQ_INVALID  0xFF
    201 
    202 typedef struct _PCI_DEVICE_SETTING{
    203   UINT8    PciDeviceInfoNumber;
    204   PCI_DEVICE_INFO PciDeviceInfo[PCI_DEVICE_INFO_MAX_NUM];
    205 }PCI_DEVICE_SETTING;
    206 
    207 typedef struct _AML_BYTE_ENCODING AML_BYTE_ENCODING;
    208 
    209 //
    210 // AML Handle Entry definition.
    211 //
    212 //  Signature must be set to EFI_AML_HANDLE_SIGNATURE or EFI_AML_ROOT_HANDLE_SIGNATURE
    213 //  Buffer is the ACPI node buffer pointer, the first/second bytes are opcode.
    214 //         This buffer should not be freed.
    215 //  Size is the total size of this ACPI node buffer.
    216 //
    217 typedef struct {
    218   UINT32                  Signature;
    219   UINT8                   *Buffer;
    220   UINTN                   Size;
    221   AML_BYTE_ENCODING       *AmlByteEncoding;
    222   BOOLEAN                 Modified;
    223 } EFI_AML_HANDLE;
    224 
    225 typedef UINT32 AML_OP_PARSE_INDEX;
    226 
    227 typedef UINT32 AML_OP_PARSE_FORMAT;
    228 
    229 typedef UINT32 AML_OP_ATTRIBUTE;
    230 
    231 struct _AML_BYTE_ENCODING {
    232   UINT8                      OpCode;
    233   UINT8                      SubOpCode;
    234   AML_OP_PARSE_INDEX         MaxIndex;
    235   AML_OP_PARSE_FORMAT        Format[6];
    236   AML_OP_ATTRIBUTE           Attribute;
    237 };
    238 
    239 
    240 //
    241 // Check device info fucntion prototype
    242 //
    243 typedef
    244 BOOLEAN
    245 (* CHECK_HANDLE_INFO) (
    246   IN EFI_ACPI_SDT_PROTOCOL  *AcpiSdt,
    247   IN EFI_ACPI_HANDLE        CheckHandle,
    248   IN VOID                   *Context
    249   );
    250 
    251 extern EFI_ACPI_HANDLE mDsdtHandle;
    252 extern EFI_ACPI_SDT_PROTOCOL *mAcpiSdt;
    253 
    254 /**
    255   Init Pci Device Structure
    256 
    257   @param mConfigData    - Pointer of Pci Device information Structure
    258 
    259 **/
    260 VOID
    261 InitPciDeviceInfoStructure (
    262   PCI_DEVICE_SETTING            *mConfigData
    263   );
    264 /**
    265   update pci routing information in acpi table based on pcd settings
    266 
    267   @param AcpiSdt          Pointer to Acpi SDT protocol
    268   @param DsdtHandle       ACPI root handle
    269   @param PciDeviceInfo    Pointer to PCI_DEVICE_INFO
    270 
    271 **/
    272 EFI_STATUS
    273 SdtUpdatePciRouting (
    274   IN EFI_ACPI_SDT_PROTOCOL  *AcpiSdt,
    275   IN EFI_ACPI_HANDLE        DsdtHandle,
    276   IN PCI_DEVICE_INFO        *PciDeviceInfo
    277   );
    278 
    279 
    280 /**
    281   update power resource wake up information in acpi table based on pcd settings
    282 
    283   @param AcpiSdt          Pointer to Acpi SDT protocol
    284   @param DsdtHandle       ACPI root handle
    285   @param PciDeviceInfo    Pointer to PCI_DEVICE_INFO
    286 
    287 **/
    288 EFI_STATUS
    289 SdtUpdatePowerWake (
    290   IN EFI_ACPI_SDT_PROTOCOL  *AcpiSdt,
    291   IN EFI_ACPI_HANDLE        DsdtHandle,
    292   IN PCI_DEVICE_INFO        *PciDeviceInfo
    293   );
    294 
    295 /**
    296   Get the root bridge handle by scanning the acpi table
    297 
    298   @param AcpiSdt          Pointer to Acpi SDT protocol
    299   @param DsdtHandle       ACPI root handle
    300 
    301   @retval EFI_ACPI_HANDLE the handle of the root bridge
    302 **/
    303 EFI_ACPI_HANDLE
    304 SdtGetRootBridgeHandle (
    305   IN EFI_ACPI_SDT_PROTOCOL  *AcpiSdt,
    306   IN EFI_ACPI_HANDLE        DsdtHandle
    307   );
    308 
    309 /**
    310   Check input Pci device info is changed from the default values
    311   @param PciDeviceInfo    Pointer to PCI_DEVICE_INFO
    312   @param UpdatePRT        Pointer to BOOLEAN
    313   @param UpdatePRW        Pointer to BOOLEAN
    314 
    315 **/
    316 VOID
    317 SdtCheckPciDeviceInfoChanged (
    318   IN PCI_DEVICE_INFO        *PciDeviceInfo,
    319   IN BOOLEAN                *UpdatePRT,
    320   IN BOOLEAN                *UpdatePRW
    321   );
    322 #endif
    323