@@ -112,10 +112,26 @@ static void acpi_dsdt_add_pci_osc(Aml *dev)
112
112
UUID = aml_touuid ("E5C937D0-3553-4D7A-9117-EA4D19C3434D" );
113
113
ifctx = aml_if (aml_equal (aml_arg (0 ), UUID ));
114
114
ifctx1 = aml_if (aml_equal (aml_arg (2 ), aml_int (0 )));
115
- uint8_t byte_list [1 ] = {1 };
116
- buf = aml_buffer (1 , byte_list );
115
+ uint8_t byte_list [] = {
116
+ 0x1 << 0 /* support for functions other than function 0 */ |
117
+ 0x1 << 5 /* support for function 5 */
118
+ };
119
+ buf = aml_buffer (ARRAY_SIZE (byte_list ), byte_list );
117
120
aml_append (ifctx1 , aml_return (buf ));
118
121
aml_append (ifctx , ifctx1 );
122
+
123
+ /*
124
+ * PCI Firmware Specification 3.1
125
+ * 4.6.5. _DSM for Ignoring PCI Boot Configurations
126
+ */
127
+ /* Arg2: Function Index: 5 */
128
+ ifctx1 = aml_if (aml_equal (aml_arg (2 ), aml_int (5 )));
129
+ /*
130
+ * 0 - The operating system must not ignore the PCI configuration that
131
+ * firmware has done at boot time.
132
+ */
133
+ aml_append (ifctx1 , aml_return (aml_int (0 )));
134
+ aml_append (ifctx , ifctx1 );
119
135
aml_append (method , ifctx );
120
136
121
137
byte_list [0 ] = 0 ;
@@ -130,6 +146,8 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
130
146
Aml * method , * crs , * dev , * rbuf ;
131
147
PCIBus * bus = cfg -> bus ;
132
148
CrsRangeSet crs_range_set ;
149
+ CrsRangeEntry * entry ;
150
+ int i ;
133
151
134
152
/* start to construct the tables for pxb */
135
153
crs_range_set_init (& crs_range_set );
@@ -168,15 +186,15 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
168
186
* 1. The resources the pci-brige/pcie-root-port need.
169
187
* 2. The resources the devices behind pxb need.
170
188
*/
171
- crs = build_crs (PCI_HOST_BRIDGE (BUS (bus )-> parent ), & crs_range_set );
189
+ crs = build_crs (PCI_HOST_BRIDGE (BUS (bus )-> parent ), & crs_range_set ,
190
+ cfg -> pio .base , 0 , 0 , 0 );
172
191
aml_append (dev , aml_name_decl ("_CRS" , crs ));
173
192
174
193
acpi_dsdt_add_pci_osc (dev );
175
194
176
195
aml_append (scope , dev );
177
196
}
178
197
}
179
- crs_range_set_free (& crs_range_set );
180
198
181
199
/* tables for the main */
182
200
dev = aml_device ("%s" , "PCI0" );
@@ -194,36 +212,55 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
194
212
aml_append (method , aml_return (aml_int (cfg -> ecam .base )));
195
213
aml_append (dev , method );
196
214
215
+ /*
216
+ * At this point crs_range_set has all the ranges used by pci
217
+ * busses *other* than PCI0. These ranges will be excluded from
218
+ * the PCI0._CRS.
219
+ */
197
220
rbuf = aml_resource_template ();
198
221
aml_append (rbuf ,
199
222
aml_word_bus_number (AML_MIN_FIXED , AML_MAX_FIXED , AML_POS_DECODE ,
200
223
0x0000 , 0x0000 , nr_pcie_buses - 1 , 0x0000 ,
201
224
nr_pcie_buses ));
202
225
if (cfg -> mmio32 .size ) {
203
- aml_append (rbuf ,
204
- aml_dword_memory (AML_POS_DECODE , AML_MIN_FIXED , AML_MAX_FIXED ,
205
- AML_NON_CACHEABLE , AML_READ_WRITE , 0x0000 ,
206
- cfg -> mmio32 .base ,
207
- cfg -> mmio32 .base + cfg -> mmio32 .size - 1 ,
208
- 0x0000 ,
209
- cfg -> mmio32 .size ));
226
+ crs_replace_with_free_ranges (crs_range_set .mem_ranges ,
227
+ cfg -> mmio32 .base ,
228
+ cfg -> mmio32 .base + cfg -> mmio32 .size - 1 );
229
+ for (i = 0 ; i < crs_range_set .mem_ranges -> len ; i ++ ) {
230
+ entry = g_ptr_array_index (crs_range_set .mem_ranges , i );
231
+ aml_append (rbuf ,
232
+ aml_dword_memory (AML_POS_DECODE , AML_MIN_FIXED , AML_MAX_FIXED ,
233
+ AML_NON_CACHEABLE , AML_READ_WRITE , 0x0000 ,
234
+ entry -> base , entry -> limit ,
235
+ 0x0000 , entry -> limit - entry -> base + 1 ));
236
+ }
210
237
}
211
238
if (cfg -> pio .size ) {
212
- aml_append (rbuf ,
213
- aml_dword_io (AML_MIN_FIXED , AML_MAX_FIXED , AML_POS_DECODE ,
214
- AML_ENTIRE_RANGE , 0x0000 , 0x0000 ,
215
- cfg -> pio .size - 1 ,
216
- cfg -> pio .base ,
217
- cfg -> pio .size ));
239
+ crs_replace_with_free_ranges (crs_range_set .io_ranges ,
240
+ 0x0000 ,
241
+ cfg -> pio .size - 1 );
242
+ for (i = 0 ; i < crs_range_set .io_ranges -> len ; i ++ ) {
243
+ entry = g_ptr_array_index (crs_range_set .io_ranges , i );
244
+ aml_append (rbuf ,
245
+ aml_dword_io (AML_MIN_FIXED , AML_MAX_FIXED , AML_POS_DECODE ,
246
+ AML_ENTIRE_RANGE , 0x0000 , entry -> base ,
247
+ entry -> limit , cfg -> pio .base ,
248
+ entry -> limit - entry -> base + 1 ));
249
+ }
218
250
}
219
251
if (cfg -> mmio64 .size ) {
220
- aml_append (rbuf ,
221
- aml_qword_memory (AML_POS_DECODE , AML_MIN_FIXED , AML_MAX_FIXED ,
222
- AML_NON_CACHEABLE , AML_READ_WRITE , 0x0000 ,
223
- cfg -> mmio64 .base ,
224
- cfg -> mmio64 .base + cfg -> mmio64 .size - 1 ,
225
- 0x0000 ,
226
- cfg -> mmio64 .size ));
252
+ crs_replace_with_free_ranges (crs_range_set .mem_64bit_ranges ,
253
+ cfg -> mmio64 .base ,
254
+ cfg -> mmio64 .base + cfg -> mmio64 .size - 1 );
255
+ for (i = 0 ; i < crs_range_set .mem_64bit_ranges -> len ; i ++ ) {
256
+ entry = g_ptr_array_index (crs_range_set .mem_64bit_ranges , i );
257
+ aml_append (rbuf ,
258
+ aml_qword_memory (AML_POS_DECODE , AML_MIN_FIXED , AML_MAX_FIXED ,
259
+ AML_NON_CACHEABLE , AML_READ_WRITE , 0x0000 ,
260
+ entry -> base ,
261
+ entry -> limit , 0x0000 ,
262
+ entry -> limit - entry -> base + 1 ));
263
+ }
227
264
}
228
265
aml_append (dev , aml_name_decl ("_CRS" , rbuf ));
229
266
@@ -242,4 +279,6 @@ void acpi_dsdt_add_gpex(Aml *scope, struct GPEXConfig *cfg)
242
279
aml_append (dev_res0 , aml_name_decl ("_CRS" , crs ));
243
280
aml_append (dev , dev_res0 );
244
281
aml_append (scope , dev );
282
+
283
+ crs_range_set_free (& crs_range_set );
245
284
}
0 commit comments