• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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