diff options
author | Bob Moore <robert.moore@intel.com> | 2005-10-21 00:00:00 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-12-10 00:22:54 -0500 |
commit | 0897831bb54eb36fd9e2a22da7f0f64be1b20d09 (patch) | |
tree | 8d77687ce8ebcfb62d6012d2d3c44f6a904b3c15 /drivers/acpi/resources | |
parent | 50eca3eb89d73d9f0aa070b126c7ee6a616016ab (diff) |
[ACPI] ACPICA 20051021
Implemented support for the EM64T and other x86_64
processors. This essentially entails recognizing
that these processors support non-aligned memory
transfers. Previously, all 64-bit processors were assumed
to lack hardware support for non-aligned transfers.
Completed conversion of the Resource Manager to nearly
full table-driven operation. Specifically, the resource
conversion code (convert AML to internal format and the
reverse) and the debug code to dump internal resource
descriptors are fully table-driven, reducing code and data
size and improving maintainability.
The OSL interfaces for Acquire and Release Lock now use a
64-bit flag word on 64-bit processors instead of a fixed
32-bit word. (Alexey Starikovskiy)
Implemented support within the resource conversion code
for the Type-Specific byte within the various ACPI 3.0
*WordSpace macros.
Fixed some issues within the resource conversion code for
the type-specific flags for both Memory and I/O address
resource descriptors. For Memory, implemented support
for the MTP and TTP flags. For I/O, split the TRS and TTP
flags into two separate fields.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/resources')
-rw-r--r-- | drivers/acpi/resources/rsaddr.c | 745 | ||||
-rw-r--r-- | drivers/acpi/resources/rscalc.c | 71 | ||||
-rw-r--r-- | drivers/acpi/resources/rsdump.c | 1207 | ||||
-rw-r--r-- | drivers/acpi/resources/rsinfo.c | 115 | ||||
-rw-r--r-- | drivers/acpi/resources/rsio.c | 333 | ||||
-rw-r--r-- | drivers/acpi/resources/rsirq.c | 393 | ||||
-rw-r--r-- | drivers/acpi/resources/rslist.c | 92 | ||||
-rw-r--r-- | drivers/acpi/resources/rsmemory.c | 303 | ||||
-rw-r--r-- | drivers/acpi/resources/rsmisc.c | 814 | ||||
-rw-r--r-- | drivers/acpi/resources/rsutils.c | 269 | ||||
-rw-r--r-- | drivers/acpi/resources/rsxface.c | 2 |
11 files changed, 1767 insertions, 2577 deletions
diff --git a/drivers/acpi/resources/rsaddr.c b/drivers/acpi/resources/rsaddr.c index 6f48ebf3304e..4ac942badbc0 100644 --- a/drivers/acpi/resources/rsaddr.c +++ b/drivers/acpi/resources/rsaddr.c | |||
@@ -47,683 +47,334 @@ | |||
47 | #define _COMPONENT ACPI_RESOURCES | 47 | #define _COMPONENT ACPI_RESOURCES |
48 | ACPI_MODULE_NAME("rsaddr") | 48 | ACPI_MODULE_NAME("rsaddr") |
49 | 49 | ||
50 | /* Local prototypes */ | ||
51 | static void | ||
52 | acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags); | ||
53 | |||
54 | static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource); | ||
55 | |||
56 | static void | ||
57 | acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags); | ||
58 | |||
59 | static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource); | ||
60 | |||
61 | static void | ||
62 | acpi_rs_set_address_common(union aml_resource *aml, | ||
63 | struct acpi_resource *resource); | ||
64 | |||
65 | static u8 | ||
66 | acpi_rs_get_address_common(struct acpi_resource *resource, | ||
67 | union aml_resource *aml); | ||
68 | |||
69 | /******************************************************************************* | ||
70 | * | ||
71 | * FUNCTION: acpi_rs_decode_general_flags | ||
72 | * | ||
73 | * PARAMETERS: Resource - Address resource data struct | ||
74 | * Flags - Raw AML flag byte | ||
75 | * | ||
76 | * RETURN: Decoded flag bits in resource struct | ||
77 | * | ||
78 | * DESCRIPTION: Decode a general flag byte to an address resource struct | ||
79 | * | ||
80 | ******************************************************************************/ | ||
81 | |||
82 | static void | ||
83 | acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags) | ||
84 | { | ||
85 | ACPI_FUNCTION_ENTRY(); | ||
86 | |||
87 | /* Producer / Consumer - flag bit[0] */ | ||
88 | |||
89 | resource->address.producer_consumer = (u32) (flags & 0x01); | ||
90 | |||
91 | /* Decode (_DEC) - flag bit[1] */ | ||
92 | |||
93 | resource->address.decode = (u32) ((flags >> 1) & 0x01); | ||
94 | |||
95 | /* Min Address Fixed (_MIF) - flag bit[2] */ | ||
96 | |||
97 | resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01); | ||
98 | |||
99 | /* Max Address Fixed (_MAF) - flag bit[3] */ | ||
100 | |||
101 | resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01); | ||
102 | } | ||
103 | |||
104 | /******************************************************************************* | ||
105 | * | ||
106 | * FUNCTION: acpi_rs_encode_general_flags | ||
107 | * | ||
108 | * PARAMETERS: Resource - Address resource data struct | ||
109 | * | ||
110 | * RETURN: Encoded general flag byte | ||
111 | * | ||
112 | * DESCRIPTION: Construct a general flag byte from an address resource struct | ||
113 | * | ||
114 | ******************************************************************************/ | ||
115 | |||
116 | static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource) | ||
117 | { | ||
118 | ACPI_FUNCTION_ENTRY(); | ||
119 | |||
120 | return ((u8) | ||
121 | |||
122 | /* Producer / Consumer - flag bit[0] */ | ||
123 | ((resource->address.producer_consumer & 0x01) | | ||
124 | /* Decode (_DEC) - flag bit[1] */ | ||
125 | ((resource->address.decode & 0x01) << 1) | | ||
126 | /* Min Address Fixed (_MIF) - flag bit[2] */ | ||
127 | ((resource->address.min_address_fixed & 0x01) << 2) | | ||
128 | /* Max Address Fixed (_MAF) - flag bit[3] */ | ||
129 | ((resource->address.max_address_fixed & 0x01) << 3)) | ||
130 | ); | ||
131 | } | ||
132 | |||
133 | /******************************************************************************* | 50 | /******************************************************************************* |
134 | * | 51 | * |
135 | * FUNCTION: acpi_rs_decode_specific_flags | 52 | * acpi_rs_convert_address16 - All WORD (16-bit) address resources |
136 | * | ||
137 | * PARAMETERS: Resource - Address resource data struct | ||
138 | * Flags - Raw AML flag byte | ||
139 | * | ||
140 | * RETURN: Decoded flag bits in attribute struct | ||
141 | * | ||
142 | * DESCRIPTION: Decode a type-specific flag byte to an attribute struct. | ||
143 | * Type-specific flags are only defined for the Memory and IO | ||
144 | * resource types. | ||
145 | * | 53 | * |
146 | ******************************************************************************/ | 54 | ******************************************************************************/ |
55 | struct acpi_rsconvert_info acpi_rs_convert_address16[5] = { | ||
56 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16, | ||
57 | ACPI_RS_SIZE(struct acpi_resource_address16), | ||
58 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)}, | ||
147 | 59 | ||
148 | static void | 60 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16, |
149 | acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags) | 61 | sizeof(struct aml_resource_address16), |
150 | { | 62 | 0}, |
151 | ACPI_FUNCTION_ENTRY(); | ||
152 | |||
153 | if (resource->address.resource_type == ACPI_MEMORY_RANGE) { | ||
154 | /* Write Status (_RW) - flag bit[0] */ | ||
155 | |||
156 | resource->address.attribute.memory.read_write_attribute = | ||
157 | (u16) (flags & 0x01); | ||
158 | 63 | ||
159 | /* Memory Attributes (_MEM) - flag bits[2:1] */ | 64 | /* Resource Type, General Flags, and Type-Specific Flags */ |
160 | 65 | ||
161 | resource->address.attribute.memory.cache_attribute = | 66 | {ACPI_RSC_ADDRESS, 0, 0, 0}, |
162 | (u16) ((flags >> 1) & 0x03); | ||
163 | } else if (resource->address.resource_type == ACPI_IO_RANGE) { | ||
164 | /* Ranges (_RNG) - flag bits[1:0] */ | ||
165 | |||
166 | resource->address.attribute.io.range_attribute = | ||
167 | (u16) (flags & 0x03); | ||
168 | |||
169 | /* Translations (_TTP and _TRS) - flag bits[5:4] */ | ||
170 | |||
171 | resource->address.attribute.io.translation_attribute = | ||
172 | (u16) ((flags >> 4) & 0x03); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | /******************************************************************************* | ||
177 | * | ||
178 | * FUNCTION: acpi_rs_encode_specific_flags | ||
179 | * | ||
180 | * PARAMETERS: Resource - Address resource data struct | ||
181 | * | ||
182 | * RETURN: Encoded type-specific flag byte | ||
183 | * | ||
184 | * DESCRIPTION: Construct a type-specific flag byte from an attribute struct. | ||
185 | * Type-specific flags are only defined for the Memory and IO | ||
186 | * resource types. | ||
187 | * | ||
188 | ******************************************************************************/ | ||
189 | |||
190 | static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource) | ||
191 | { | ||
192 | ACPI_FUNCTION_ENTRY(); | ||
193 | |||
194 | if (resource->address.resource_type == ACPI_MEMORY_RANGE) { | ||
195 | return ((u8) | ||
196 | |||
197 | /* Write Status (_RW) - flag bit[0] */ | ||
198 | ((resource->address.attribute.memory. | ||
199 | read_write_attribute & 0x01) | | ||
200 | /* Memory Attributes (_MEM) - flag bits[2:1] */ | ||
201 | ((resource->address.attribute.memory. | ||
202 | cache_attribute & 0x03) << 1))); | ||
203 | } else if (resource->address.resource_type == ACPI_IO_RANGE) { | ||
204 | return ((u8) | ||
205 | |||
206 | /* Ranges (_RNG) - flag bits[1:0] */ | ||
207 | ((resource->address.attribute.io. | ||
208 | range_attribute & 0x03) | | ||
209 | /* Translations (_TTP and _TRS) - flag bits[5:4] */ | ||
210 | ((resource->address.attribute.io. | ||
211 | translation_attribute & 0x03) << 4))); | ||
212 | } | ||
213 | |||
214 | return (0); | ||
215 | } | ||
216 | |||
217 | /******************************************************************************* | ||
218 | * | ||
219 | * FUNCTION: acpi_rs_set_address_common | ||
220 | * | ||
221 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
222 | * Resource - Pointer to the internal resource struct | ||
223 | * | ||
224 | * RETURN: None | ||
225 | * | ||
226 | * DESCRIPTION: Convert common flag fields from a resource descriptor to an | ||
227 | * AML descriptor | ||
228 | * | ||
229 | ******************************************************************************/ | ||
230 | |||
231 | static void | ||
232 | acpi_rs_set_address_common(union aml_resource *aml, | ||
233 | struct acpi_resource *resource) | ||
234 | { | ||
235 | ACPI_FUNCTION_ENTRY(); | ||
236 | |||
237 | /* Set the Resource Type (Memory, Io, bus_number, etc.) */ | ||
238 | |||
239 | aml->address.resource_type = (u8) resource->data.address.resource_type; | ||
240 | |||
241 | /* Set the general flags */ | ||
242 | |||
243 | aml->address.flags = acpi_rs_encode_general_flags(&resource->data); | ||
244 | |||
245 | /* Set the type-specific flags */ | ||
246 | |||
247 | aml->address.specific_flags = | ||
248 | acpi_rs_encode_specific_flags(&resource->data); | ||
249 | } | ||
250 | |||
251 | /******************************************************************************* | ||
252 | * | ||
253 | * FUNCTION: acpi_rs_get_address_common | ||
254 | * | ||
255 | * PARAMETERS: Resource - Pointer to the internal resource struct | ||
256 | * Aml - Pointer to the AML resource descriptor | ||
257 | * | ||
258 | * RETURN: TRUE if the resource_type field is OK, FALSE otherwise | ||
259 | * | ||
260 | * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor | ||
261 | * to an internal resource descriptor | ||
262 | * | ||
263 | ******************************************************************************/ | ||
264 | |||
265 | static u8 | ||
266 | acpi_rs_get_address_common(struct acpi_resource *resource, | ||
267 | union aml_resource *aml) | ||
268 | { | ||
269 | ACPI_FUNCTION_ENTRY(); | ||
270 | |||
271 | /* Validate resource type */ | ||
272 | |||
273 | if ((aml->address.resource_type > 2) | ||
274 | && (aml->address.resource_type < 0xC0)) { | ||
275 | return (FALSE); | ||
276 | } | ||
277 | |||
278 | /* Get the Resource Type (Memory, Io, bus_number, etc.) */ | ||
279 | |||
280 | resource->data.address.resource_type = aml->address.resource_type; | ||
281 | |||
282 | /* Get the General Flags */ | ||
283 | |||
284 | acpi_rs_decode_general_flags(&resource->data, aml->address.flags); | ||
285 | |||
286 | /* Get the Type-Specific Flags */ | ||
287 | |||
288 | acpi_rs_decode_specific_flags(&resource->data, | ||
289 | aml->address.specific_flags); | ||
290 | return (TRUE); | ||
291 | } | ||
292 | |||
293 | /******************************************************************************* | ||
294 | * | ||
295 | * FUNCTION: acpi_rs_get_address16 | ||
296 | * | ||
297 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
298 | * aml_resource_length - Length of the resource from the AML header | ||
299 | * Resource - Where the internal resource is returned | ||
300 | * | ||
301 | * RETURN: Status | ||
302 | * | ||
303 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
304 | * internal resource descriptor, simplifying bitflags and handling | ||
305 | * alignment and endian issues if necessary. | ||
306 | * | ||
307 | ******************************************************************************/ | ||
308 | |||
309 | acpi_status | ||
310 | acpi_rs_get_address16(union aml_resource * aml, | ||
311 | u16 aml_resource_length, struct acpi_resource * resource) | ||
312 | { | ||
313 | ACPI_FUNCTION_TRACE("rs_get_address16"); | ||
314 | |||
315 | /* Get the Resource Type, general flags, and type-specific flags */ | ||
316 | |||
317 | if (!acpi_rs_get_address_common(resource, aml)) { | ||
318 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); | ||
319 | } | ||
320 | 67 | ||
321 | /* | 68 | /* |
322 | * Get the following contiguous fields from the AML descriptor: | 69 | * These fields are contiguous in both the source and destination: |
323 | * Address Granularity | 70 | * Address Granularity |
324 | * Address Range Minimum | 71 | * Address Range Minimum |
325 | * Address Range Maximum | 72 | * Address Range Maximum |
326 | * Address Translation Offset | 73 | * Address Translation Offset |
327 | * Address Length | 74 | * Address Length |
328 | */ | 75 | */ |
329 | acpi_rs_move_data(&resource->data.address16.granularity, | 76 | {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.granularity), |
330 | &aml->address16.granularity, 5, | 77 | AML_OFFSET(address16.granularity), |
331 | ACPI_MOVE_TYPE_16_TO_32); | 78 | 5}, |
332 | |||
333 | /* Get the optional resource_source (index and string) */ | ||
334 | |||
335 | resource->length = | ||
336 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16) + | ||
337 | acpi_rs_get_resource_source(aml_resource_length, | ||
338 | sizeof(struct aml_resource_address16), | ||
339 | &resource->data.address16. | ||
340 | resource_source, aml, NULL); | ||
341 | 79 | ||
342 | /* Complete the resource header */ | 80 | /* Optional resource_source (Index and String) */ |
343 | 81 | ||
344 | resource->type = ACPI_RESOURCE_TYPE_ADDRESS16; | 82 | {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source), |
345 | return_ACPI_STATUS(AE_OK); | 83 | 0, |
346 | } | 84 | sizeof(struct aml_resource_address16)} |
85 | }; | ||
347 | 86 | ||
348 | /******************************************************************************* | 87 | /******************************************************************************* |
349 | * | 88 | * |
350 | * FUNCTION: acpi_rs_set_address16 | 89 | * acpi_rs_convert_address32 - All DWORD (32-bit) address resources |
351 | * | ||
352 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
353 | * Aml - Where the AML descriptor is returned | ||
354 | * | ||
355 | * RETURN: Status | ||
356 | * | ||
357 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
358 | * external AML resource descriptor. | ||
359 | * | 90 | * |
360 | ******************************************************************************/ | 91 | ******************************************************************************/ |
361 | 92 | ||
362 | acpi_status | 93 | struct acpi_rsconvert_info acpi_rs_convert_address32[5] = { |
363 | acpi_rs_set_address16(struct acpi_resource *resource, union aml_resource *aml) | 94 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32, |
364 | { | 95 | ACPI_RS_SIZE(struct acpi_resource_address32), |
365 | acpi_size descriptor_length; | 96 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)}, |
366 | 97 | ||
367 | ACPI_FUNCTION_TRACE("rs_set_address16"); | 98 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32, |
99 | sizeof(struct aml_resource_address32), | ||
100 | 0}, | ||
368 | 101 | ||
369 | /* Set the Resource Type, General Flags, and Type-Specific Flags */ | 102 | /* Resource Type, General Flags, and Type-Specific Flags */ |
370 | 103 | ||
371 | acpi_rs_set_address_common(aml, resource); | 104 | {ACPI_RSC_ADDRESS, 0, 0, 0}, |
372 | 105 | ||
373 | /* | 106 | /* |
374 | * Set the following contiguous fields in the AML descriptor: | 107 | * These fields are contiguous in both the source and destination: |
375 | * Address Granularity | 108 | * Address Granularity |
376 | * Address Range Minimum | 109 | * Address Range Minimum |
377 | * Address Range Maximum | 110 | * Address Range Maximum |
378 | * Address Translation Offset | 111 | * Address Translation Offset |
379 | * Address Length | 112 | * Address Length |
380 | */ | 113 | */ |
381 | acpi_rs_move_data(&aml->address16.granularity, | 114 | {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.granularity), |
382 | &resource->data.address16.granularity, 5, | 115 | AML_OFFSET(address32.granularity), |
383 | ACPI_MOVE_TYPE_32_TO_16); | 116 | 5}, |
384 | |||
385 | /* Resource Source Index and Resource Source are optional */ | ||
386 | 117 | ||
387 | descriptor_length = acpi_rs_set_resource_source(aml, | 118 | /* Optional resource_source (Index and String) */ |
388 | sizeof(struct | ||
389 | aml_resource_address16), | ||
390 | &resource->data. | ||
391 | address16. | ||
392 | resource_source); | ||
393 | 119 | ||
394 | /* Complete the AML descriptor header */ | 120 | {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source), |
395 | 121 | 0, | |
396 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS16, | 122 | sizeof(struct aml_resource_address32)} |
397 | descriptor_length, aml); | 123 | }; |
398 | return_ACPI_STATUS(AE_OK); | ||
399 | } | ||
400 | 124 | ||
401 | /******************************************************************************* | 125 | /******************************************************************************* |
402 | * | 126 | * |
403 | * FUNCTION: acpi_rs_get_address32 | 127 | * acpi_rs_convert_address64 - All QWORD (64-bit) address resources |
404 | * | ||
405 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
406 | * aml_resource_length - Length of the resource from the AML header | ||
407 | * Resource - Where the internal resource is returned | ||
408 | * | ||
409 | * RETURN: Status | ||
410 | * | ||
411 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
412 | * internal resource descriptor, simplifying bitflags and handling | ||
413 | * alignment and endian issues if necessary. | ||
414 | * | 128 | * |
415 | ******************************************************************************/ | 129 | ******************************************************************************/ |
416 | 130 | ||
417 | acpi_status | 131 | struct acpi_rsconvert_info acpi_rs_convert_address64[5] = { |
418 | acpi_rs_get_address32(union aml_resource *aml, | 132 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64, |
419 | u16 aml_resource_length, struct acpi_resource *resource) | 133 | ACPI_RS_SIZE(struct acpi_resource_address64), |
420 | { | 134 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)}, |
421 | 135 | ||
422 | ACPI_FUNCTION_TRACE("rs_get_address32"); | 136 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64, |
137 | sizeof(struct aml_resource_address64), | ||
138 | 0}, | ||
423 | 139 | ||
424 | /* Get the Resource Type, general flags, and type-specific flags */ | 140 | /* Resource Type, General Flags, and Type-Specific Flags */ |
425 | 141 | ||
426 | if (!acpi_rs_get_address_common(resource, (void *)aml)) { | 142 | {ACPI_RSC_ADDRESS, 0, 0, 0}, |
427 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); | ||
428 | } | ||
429 | 143 | ||
430 | /* | 144 | /* |
431 | * Get the following contiguous fields from the AML descriptor: | 145 | * These fields are contiguous in both the source and destination: |
432 | * Address Granularity | 146 | * Address Granularity |
433 | * Address Range Minimum | 147 | * Address Range Minimum |
434 | * Address Range Maximum | 148 | * Address Range Maximum |
435 | * Address Translation Offset | 149 | * Address Translation Offset |
436 | * Address Length | 150 | * Address Length |
437 | */ | 151 | */ |
438 | acpi_rs_move_data(&resource->data.address32.granularity, | 152 | {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.granularity), |
439 | &aml->address32.granularity, 5, | 153 | AML_OFFSET(address64.granularity), |
440 | ACPI_MOVE_TYPE_32_TO_32); | 154 | 5}, |
441 | 155 | ||
442 | /* Get the optional resource_source (index and string) */ | 156 | /* Optional resource_source (Index and String) */ |
443 | 157 | ||
444 | resource->length = | 158 | {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source), |
445 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32) + | 159 | 0, |
446 | acpi_rs_get_resource_source(aml_resource_length, | 160 | sizeof(struct aml_resource_address64)} |
447 | sizeof(struct aml_resource_address32), | 161 | }; |
448 | &resource->data.address32. | ||
449 | resource_source, aml, NULL); | ||
450 | |||
451 | /* Complete the resource header */ | ||
452 | |||
453 | resource->type = ACPI_RESOURCE_TYPE_ADDRESS32; | ||
454 | return_ACPI_STATUS(AE_OK); | ||
455 | } | ||
456 | 162 | ||
457 | /******************************************************************************* | 163 | /******************************************************************************* |
458 | * | 164 | * |
459 | * FUNCTION: acpi_rs_set_address32 | 165 | * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources |
460 | * | ||
461 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
462 | * Aml - Where the AML descriptor is returned | ||
463 | * | ||
464 | * RETURN: Status | ||
465 | * | ||
466 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
467 | * external AML resource descriptor. | ||
468 | * | 166 | * |
469 | ******************************************************************************/ | 167 | ******************************************************************************/ |
470 | 168 | ||
471 | acpi_status | 169 | struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = { |
472 | acpi_rs_set_address32(struct acpi_resource *resource, union aml_resource *aml) | 170 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, |
473 | { | 171 | ACPI_RS_SIZE(struct acpi_resource_extended_address64), |
474 | acpi_size descriptor_length; | 172 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)}, |
173 | |||
174 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64, | ||
175 | sizeof(struct aml_resource_extended_address64), | ||
176 | 0}, | ||
475 | 177 | ||
476 | ACPI_FUNCTION_TRACE("rs_set_address32"); | 178 | /* Resource Type, General Flags, and Type-Specific Flags */ |
477 | 179 | ||
478 | /* Set the Resource Type, General Flags, and Type-Specific Flags */ | 180 | {ACPI_RSC_ADDRESS, 0, 0, 0}, |
479 | 181 | ||
480 | acpi_rs_set_address_common(aml, resource); | 182 | /* Revision ID */ |
481 | 183 | ||
184 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_iD), | ||
185 | AML_OFFSET(ext_address64.revision_iD), | ||
186 | 1}, | ||
482 | /* | 187 | /* |
483 | * Set the following contiguous fields in the AML descriptor: | 188 | * These fields are contiguous in both the source and destination: |
484 | * Address Granularity | 189 | * Address Granularity |
485 | * Address Range Minimum | 190 | * Address Range Minimum |
486 | * Address Range Maximum | 191 | * Address Range Maximum |
487 | * Address Translation Offset | 192 | * Address Translation Offset |
488 | * Address Length | 193 | * Address Length |
194 | * Type-Specific Attribute | ||
489 | */ | 195 | */ |
490 | acpi_rs_move_data(&aml->address32.granularity, | 196 | {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.ext_address64.granularity), |
491 | &resource->data.address32.granularity, 5, | 197 | AML_OFFSET(ext_address64.granularity), |
492 | ACPI_MOVE_TYPE_32_TO_32); | 198 | 6} |
493 | 199 | }; | |
494 | /* Resource Source Index and Resource Source are optional */ | ||
495 | |||
496 | descriptor_length = acpi_rs_set_resource_source(aml, | ||
497 | sizeof(struct | ||
498 | aml_resource_address32), | ||
499 | &resource->data. | ||
500 | address32. | ||
501 | resource_source); | ||
502 | |||
503 | /* Complete the AML descriptor header */ | ||
504 | |||
505 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS32, | ||
506 | descriptor_length, aml); | ||
507 | return_ACPI_STATUS(AE_OK); | ||
508 | } | ||
509 | 200 | ||
510 | /******************************************************************************* | 201 | /******************************************************************************* |
511 | * | 202 | * |
512 | * FUNCTION: acpi_rs_get_address64 | 203 | * acpi_rs_convert_general_flags - Flags common to all address descriptors |
513 | * | ||
514 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
515 | * aml_resource_length - Length of the resource from the AML header | ||
516 | * Resource - Where the internal resource is returned | ||
517 | * | ||
518 | * RETURN: Status | ||
519 | * | ||
520 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
521 | * internal resource descriptor, simplifying bitflags and handling | ||
522 | * alignment and endian issues if necessary. | ||
523 | * | 204 | * |
524 | ******************************************************************************/ | 205 | ******************************************************************************/ |
525 | 206 | ||
526 | acpi_status | 207 | static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = { |
527 | acpi_rs_get_address64(union aml_resource *aml, | 208 | {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags), |
528 | u16 aml_resource_length, struct acpi_resource *resource) | 209 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)}, |
529 | { | ||
530 | ACPI_FUNCTION_TRACE("rs_get_address64"); | ||
531 | 210 | ||
532 | /* Get the Resource Type, general Flags, and type-specific Flags */ | 211 | /* Resource Type (Memory, Io, bus_number, etc.) */ |
533 | 212 | ||
534 | if (!acpi_rs_get_address_common(resource, aml)) { | 213 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type), |
535 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); | 214 | AML_OFFSET(address.resource_type), |
536 | } | 215 | 1}, |
537 | 216 | ||
538 | /* | 217 | /* General Flags - Consume, Decode, min_fixed, max_fixed */ |
539 | * Get the following contiguous fields from the AML descriptor: | ||
540 | * Address Granularity | ||
541 | * Address Range Minimum | ||
542 | * Address Range Maximum | ||
543 | * Address Translation Offset | ||
544 | * Address Length | ||
545 | */ | ||
546 | acpi_rs_move_data(&resource->data.address64.granularity, | ||
547 | &aml->address64.granularity, 5, | ||
548 | ACPI_MOVE_TYPE_64_TO_64); | ||
549 | 218 | ||
550 | /* Get the optional resource_source (index and string) */ | 219 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer), |
220 | AML_OFFSET(address.flags), | ||
221 | 0}, | ||
551 | 222 | ||
552 | resource->length = | 223 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode), |
553 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64) + | 224 | AML_OFFSET(address.flags), |
554 | acpi_rs_get_resource_source(aml_resource_length, | 225 | 1}, |
555 | sizeof(struct aml_resource_address64), | ||
556 | &resource->data.address64. | ||
557 | resource_source, aml, NULL); | ||
558 | 226 | ||
559 | /* Complete the resource header */ | 227 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed), |
228 | AML_OFFSET(address.flags), | ||
229 | 2}, | ||
560 | 230 | ||
561 | resource->type = ACPI_RESOURCE_TYPE_ADDRESS64; | 231 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed), |
562 | return_ACPI_STATUS(AE_OK); | 232 | AML_OFFSET(address.flags), |
563 | } | 233 | 3} |
234 | }; | ||
564 | 235 | ||
565 | /******************************************************************************* | 236 | /******************************************************************************* |
566 | * | 237 | * |
567 | * FUNCTION: acpi_rs_set_address64 | 238 | * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors |
568 | * | ||
569 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
570 | * Aml - Where the AML descriptor is returned | ||
571 | * | ||
572 | * RETURN: Status | ||
573 | * | ||
574 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
575 | * external AML resource descriptor. | ||
576 | * | 239 | * |
577 | ******************************************************************************/ | 240 | ******************************************************************************/ |
578 | 241 | ||
579 | acpi_status | 242 | static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = { |
580 | acpi_rs_set_address64(struct acpi_resource *resource, union aml_resource *aml) | 243 | {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags), |
581 | { | 244 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)}, |
582 | acpi_size descriptor_length; | ||
583 | 245 | ||
584 | ACPI_FUNCTION_TRACE("rs_set_address64"); | 246 | /* Memory-specific flags */ |
585 | 247 | ||
586 | /* Set the Resource Type, General Flags, and Type-Specific Flags */ | 248 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect), |
249 | AML_OFFSET(address.specific_flags), | ||
250 | 0}, | ||
587 | 251 | ||
588 | acpi_rs_set_address_common(aml, resource); | 252 | {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching), |
253 | AML_OFFSET(address.specific_flags), | ||
254 | 1}, | ||
589 | 255 | ||
590 | /* | 256 | {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type), |
591 | * Set the following contiguous fields in the AML descriptor: | 257 | AML_OFFSET(address.specific_flags), |
592 | * Address Granularity | 258 | 3}, |
593 | * Address Range Minimum | 259 | |
594 | * Address Range Maximum | 260 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation), |
595 | * Address Translation Offset | 261 | AML_OFFSET(address.specific_flags), |
596 | * Address Length | 262 | 5} |
597 | */ | 263 | }; |
598 | acpi_rs_move_data(&aml->address64.granularity, | 264 | |
599 | &resource->data.address64.granularity, 5, | 265 | /******************************************************************************* |
600 | ACPI_MOVE_TYPE_64_TO_64); | 266 | * |
267 | * acpi_rs_convert_io_flags - Flags common to I/O address descriptors | ||
268 | * | ||
269 | ******************************************************************************/ | ||
601 | 270 | ||
602 | /* Resource Source Index and Resource Source are optional */ | 271 | static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = { |
272 | {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags), | ||
273 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)}, | ||
603 | 274 | ||
604 | descriptor_length = acpi_rs_set_resource_source(aml, | 275 | /* I/O-specific flags */ |
605 | sizeof(struct | ||
606 | aml_resource_address64), | ||
607 | &resource->data. | ||
608 | address64. | ||
609 | resource_source); | ||
610 | 276 | ||
611 | /* Complete the AML descriptor header */ | 277 | {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type), |
278 | AML_OFFSET(address.specific_flags), | ||
279 | 0}, | ||
612 | 280 | ||
613 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS64, | 281 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation), |
614 | descriptor_length, aml); | 282 | AML_OFFSET(address.specific_flags), |
615 | return_ACPI_STATUS(AE_OK); | 283 | 4}, |
616 | } | 284 | |
285 | {ACPI_RSC_1BITFLAG, | ||
286 | ACPI_RS_OFFSET(data.address.info.io.translation_type), | ||
287 | AML_OFFSET(address.specific_flags), | ||
288 | 5} | ||
289 | }; | ||
617 | 290 | ||
618 | /******************************************************************************* | 291 | /******************************************************************************* |
619 | * | 292 | * |
620 | * FUNCTION: acpi_rs_get_ext_address64 | 293 | * FUNCTION: acpi_rs_get_address_common |
621 | * | 294 | * |
622 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | 295 | * PARAMETERS: Resource - Pointer to the internal resource struct |
623 | * aml_resource_length - Length of the resource from the AML header | 296 | * Aml - Pointer to the AML resource descriptor |
624 | * Resource - Where the internal resource is returned | ||
625 | * | 297 | * |
626 | * RETURN: Status | 298 | * RETURN: TRUE if the resource_type field is OK, FALSE otherwise |
627 | * | 299 | * |
628 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | 300 | * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor |
629 | * internal resource descriptor, simplifying bitflags and handling | 301 | * to an internal resource descriptor |
630 | * alignment and endian issues if necessary. | ||
631 | * | 302 | * |
632 | ******************************************************************************/ | 303 | ******************************************************************************/ |
633 | 304 | ||
634 | acpi_status | 305 | u8 |
635 | acpi_rs_get_ext_address64(union aml_resource *aml, | 306 | acpi_rs_get_address_common(struct acpi_resource *resource, |
636 | u16 aml_resource_length, | 307 | union aml_resource *aml) |
637 | struct acpi_resource *resource) | ||
638 | { | 308 | { |
309 | ACPI_FUNCTION_ENTRY(); | ||
639 | 310 | ||
640 | ACPI_FUNCTION_TRACE("rs_get_ext_address64"); | 311 | /* Validate the Resource Type */ |
641 | |||
642 | /* Get the Resource Type, general flags, and type-specific flags */ | ||
643 | 312 | ||
644 | if (!acpi_rs_get_address_common(resource, aml)) { | 313 | if ((aml->address.resource_type > 2) |
645 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); | 314 | && (aml->address.resource_type < 0xC0)) { |
315 | return (FALSE); | ||
646 | } | 316 | } |
647 | 317 | ||
648 | /* | 318 | /* Get the Resource Type and General Flags */ |
649 | * Get and validate the Revision ID | ||
650 | * Note: Only one revision ID is currently supported | ||
651 | */ | ||
652 | resource->data.ext_address64.revision_iD = | ||
653 | aml->ext_address64.revision_iD; | ||
654 | if (aml->ext_address64.revision_iD != | ||
655 | AML_RESOURCE_EXTENDED_ADDRESS_REVISION) { | ||
656 | return_ACPI_STATUS(AE_SUPPORT); | ||
657 | } | ||
658 | 319 | ||
659 | /* | 320 | (void)acpi_rs_convert_aml_to_resource(resource, aml, |
660 | * Get the following contiguous fields from the AML descriptor: | 321 | acpi_rs_convert_general_flags); |
661 | * Address Granularity | 322 | |
662 | * Address Range Minimum | 323 | /* Get the Type-Specific Flags (Memory and I/O descriptors only) */ |
663 | * Address Range Maximum | ||
664 | * Address Translation Offset | ||
665 | * Address Length | ||
666 | * Type-Specific Attribute | ||
667 | */ | ||
668 | acpi_rs_move_data(&resource->data.ext_address64.granularity, | ||
669 | &aml->ext_address64.granularity, 6, | ||
670 | ACPI_MOVE_TYPE_64_TO_64); | ||
671 | 324 | ||
672 | /* Complete the resource header */ | 325 | if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) { |
326 | (void)acpi_rs_convert_aml_to_resource(resource, aml, | ||
327 | acpi_rs_convert_mem_flags); | ||
328 | } else if (resource->data.address.resource_type == ACPI_IO_RANGE) { | ||
329 | (void)acpi_rs_convert_aml_to_resource(resource, aml, | ||
330 | acpi_rs_convert_io_flags); | ||
331 | } else { | ||
332 | /* Generic resource type, just grab the type_specific byte */ | ||
673 | 333 | ||
674 | resource->type = ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64; | 334 | resource->data.address.info.type_specific = |
675 | resource->length = | 335 | aml->address.specific_flags; |
676 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_address64); | 336 | } |
677 | return_ACPI_STATUS(AE_OK); | 337 | |
338 | return (TRUE); | ||
678 | } | 339 | } |
679 | 340 | ||
680 | /******************************************************************************* | 341 | /******************************************************************************* |
681 | * | 342 | * |
682 | * FUNCTION: acpi_rs_set_ext_address64 | 343 | * FUNCTION: acpi_rs_set_address_common |
683 | * | 344 | * |
684 | * PARAMETERS: Resource - Pointer to the resource descriptor | 345 | * PARAMETERS: Aml - Pointer to the AML resource descriptor |
685 | * Aml - Where the AML descriptor is returned | 346 | * Resource - Pointer to the internal resource struct |
686 | * | 347 | * |
687 | * RETURN: Status | 348 | * RETURN: None |
688 | * | 349 | * |
689 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | 350 | * DESCRIPTION: Convert common flag fields from a resource descriptor to an |
690 | * external AML resource descriptor. | 351 | * AML descriptor |
691 | * | 352 | * |
692 | ******************************************************************************/ | 353 | ******************************************************************************/ |
693 | 354 | ||
694 | acpi_status | 355 | void |
695 | acpi_rs_set_ext_address64(struct acpi_resource *resource, | 356 | acpi_rs_set_address_common(union aml_resource *aml, |
696 | union aml_resource *aml) | 357 | struct acpi_resource *resource) |
697 | { | 358 | { |
698 | ACPI_FUNCTION_TRACE("rs_set_ext_address64"); | 359 | ACPI_FUNCTION_ENTRY(); |
699 | 360 | ||
700 | /* Set the Resource Type, General Flags, and Type-Specific Flags */ | 361 | /* Set the Resource Type and General Flags */ |
701 | 362 | ||
702 | acpi_rs_set_address_common(aml, resource); | 363 | (void)acpi_rs_convert_resource_to_aml(resource, aml, |
364 | acpi_rs_convert_general_flags); | ||
703 | 365 | ||
704 | /* Only one Revision ID is currently supported */ | 366 | /* Set the Type-Specific Flags (Memory and I/O descriptors only) */ |
705 | 367 | ||
706 | aml->ext_address64.revision_iD = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; | 368 | if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) { |
707 | aml->ext_address64.reserved = 0; | 369 | (void)acpi_rs_convert_resource_to_aml(resource, aml, |
370 | acpi_rs_convert_mem_flags); | ||
371 | } else if (resource->data.address.resource_type == ACPI_IO_RANGE) { | ||
372 | (void)acpi_rs_convert_resource_to_aml(resource, aml, | ||
373 | acpi_rs_convert_io_flags); | ||
374 | } else { | ||
375 | /* Generic resource type, just copy the type_specific byte */ | ||
708 | 376 | ||
709 | /* | 377 | aml->address.specific_flags = |
710 | * Set the following contiguous fields in the AML descriptor: | 378 | resource->data.address.info.type_specific; |
711 | * Address Granularity | 379 | } |
712 | * Address Range Minimum | ||
713 | * Address Range Maximum | ||
714 | * Address Translation Offset | ||
715 | * Address Length | ||
716 | * Type-Specific Attribute | ||
717 | */ | ||
718 | acpi_rs_move_data(&aml->ext_address64.granularity, | ||
719 | &resource->data.address64.granularity, 6, | ||
720 | ACPI_MOVE_TYPE_64_TO_64); | ||
721 | |||
722 | /* Complete the AML descriptor header */ | ||
723 | |||
724 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64, | ||
725 | sizeof(struct | ||
726 | aml_resource_extended_address64), | ||
727 | aml); | ||
728 | return_ACPI_STATUS(AE_OK); | ||
729 | } | 380 | } |
diff --git a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c index d170dee07ce9..c29d3a447278 100644 --- a/drivers/acpi/resources/rscalc.c +++ b/drivers/acpi/resources/rscalc.c | |||
@@ -52,7 +52,7 @@ ACPI_MODULE_NAME("rscalc") | |||
52 | /* Local prototypes */ | 52 | /* Local prototypes */ |
53 | static u8 acpi_rs_count_set_bits(u16 bit_field); | 53 | static u8 acpi_rs_count_set_bits(u16 bit_field); |
54 | 54 | ||
55 | static acpi_size | 55 | static acpi_rs_length |
56 | acpi_rs_struct_option_length(struct acpi_resource_source *resource_source); | 56 | acpi_rs_struct_option_length(struct acpi_resource_source *resource_source); |
57 | 57 | ||
58 | static u32 | 58 | static u32 |
@@ -100,7 +100,7 @@ static u8 acpi_rs_count_set_bits(u16 bit_field) | |||
100 | * | 100 | * |
101 | ******************************************************************************/ | 101 | ******************************************************************************/ |
102 | 102 | ||
103 | static acpi_size | 103 | static acpi_rs_length |
104 | acpi_rs_struct_option_length(struct acpi_resource_source *resource_source) | 104 | acpi_rs_struct_option_length(struct acpi_resource_source *resource_source) |
105 | { | 105 | { |
106 | ACPI_FUNCTION_ENTRY(); | 106 | ACPI_FUNCTION_ENTRY(); |
@@ -111,7 +111,7 @@ acpi_rs_struct_option_length(struct acpi_resource_source *resource_source) | |||
111 | * resource_source_index (1). | 111 | * resource_source_index (1). |
112 | */ | 112 | */ |
113 | if (resource_source->string_ptr) { | 113 | if (resource_source->string_ptr) { |
114 | return ((acpi_size) resource_source->string_length + 1); | 114 | return ((acpi_rs_length) (resource_source->string_length + 1)); |
115 | } | 115 | } |
116 | 116 | ||
117 | return (0); | 117 | return (0); |
@@ -184,7 +184,7 @@ acpi_status | |||
184 | acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | 184 | acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) |
185 | { | 185 | { |
186 | acpi_size aml_size_needed = 0; | 186 | acpi_size aml_size_needed = 0; |
187 | acpi_size segment_size; | 187 | acpi_rs_length total_size; |
188 | 188 | ||
189 | ACPI_FUNCTION_TRACE("rs_get_aml_length"); | 189 | ACPI_FUNCTION_TRACE("rs_get_aml_length"); |
190 | 190 | ||
@@ -199,7 +199,7 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
199 | 199 | ||
200 | /* Get the base size of the (external stream) resource descriptor */ | 200 | /* Get the base size of the (external stream) resource descriptor */ |
201 | 201 | ||
202 | segment_size = acpi_gbl_aml_resource_sizes[resource->type]; | 202 | total_size = acpi_gbl_aml_resource_sizes[resource->type]; |
203 | 203 | ||
204 | /* | 204 | /* |
205 | * Augment the base size for descriptors with optional and/or | 205 | * Augment the base size for descriptors with optional and/or |
@@ -216,13 +216,14 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
216 | if (resource->data.vendor.byte_length > 7) { | 216 | if (resource->data.vendor.byte_length > 7) { |
217 | /* Base size of a Large resource descriptor */ | 217 | /* Base size of a Large resource descriptor */ |
218 | 218 | ||
219 | segment_size = | 219 | total_size = |
220 | sizeof(struct aml_resource_large_header); | 220 | sizeof(struct aml_resource_large_header); |
221 | } | 221 | } |
222 | 222 | ||
223 | /* Add the size of the vendor-specific data */ | 223 | /* Add the size of the vendor-specific data */ |
224 | 224 | ||
225 | segment_size += resource->data.vendor.byte_length; | 225 | total_size = (acpi_rs_length) |
226 | (total_size + resource->data.vendor.byte_length); | ||
226 | break; | 227 | break; |
227 | 228 | ||
228 | case ACPI_RESOURCE_TYPE_END_TAG: | 229 | case ACPI_RESOURCE_TYPE_END_TAG: |
@@ -230,7 +231,7 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
230 | * End Tag: | 231 | * End Tag: |
231 | * We are done -- return the accumulated total size. | 232 | * We are done -- return the accumulated total size. |
232 | */ | 233 | */ |
233 | *size_needed = aml_size_needed + segment_size; | 234 | *size_needed = aml_size_needed + total_size; |
234 | 235 | ||
235 | /* Normal exit */ | 236 | /* Normal exit */ |
236 | 237 | ||
@@ -241,10 +242,11 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
241 | * 16-Bit Address Resource: | 242 | * 16-Bit Address Resource: |
242 | * Add the size of the optional resource_source info | 243 | * Add the size of the optional resource_source info |
243 | */ | 244 | */ |
244 | segment_size += | 245 | total_size = (acpi_rs_length) |
245 | acpi_rs_struct_option_length(&resource->data. | 246 | (total_size + |
246 | address16. | 247 | acpi_rs_struct_option_length(&resource->data. |
247 | resource_source); | 248 | address16. |
249 | resource_source)); | ||
248 | break; | 250 | break; |
249 | 251 | ||
250 | case ACPI_RESOURCE_TYPE_ADDRESS32: | 252 | case ACPI_RESOURCE_TYPE_ADDRESS32: |
@@ -252,10 +254,11 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
252 | * 32-Bit Address Resource: | 254 | * 32-Bit Address Resource: |
253 | * Add the size of the optional resource_source info | 255 | * Add the size of the optional resource_source info |
254 | */ | 256 | */ |
255 | segment_size += | 257 | total_size = (acpi_rs_length) |
256 | acpi_rs_struct_option_length(&resource->data. | 258 | (total_size + |
257 | address32. | 259 | acpi_rs_struct_option_length(&resource->data. |
258 | resource_source); | 260 | address32. |
261 | resource_source)); | ||
259 | break; | 262 | break; |
260 | 263 | ||
261 | case ACPI_RESOURCE_TYPE_ADDRESS64: | 264 | case ACPI_RESOURCE_TYPE_ADDRESS64: |
@@ -263,10 +266,11 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
263 | * 64-Bit Address Resource: | 266 | * 64-Bit Address Resource: |
264 | * Add the size of the optional resource_source info | 267 | * Add the size of the optional resource_source info |
265 | */ | 268 | */ |
266 | segment_size += | 269 | total_size = (acpi_rs_length) |
267 | acpi_rs_struct_option_length(&resource->data. | 270 | (total_size + |
268 | address64. | 271 | acpi_rs_struct_option_length(&resource->data. |
269 | resource_source); | 272 | address64. |
273 | resource_source)); | ||
270 | break; | 274 | break; |
271 | 275 | ||
272 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: | 276 | case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: |
@@ -275,16 +279,14 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
275 | * Add the size of each additional optional interrupt beyond the | 279 | * Add the size of each additional optional interrupt beyond the |
276 | * required 1 (4 bytes for each u32 interrupt number) | 280 | * required 1 (4 bytes for each u32 interrupt number) |
277 | */ | 281 | */ |
278 | segment_size += (((acpi_size) | 282 | total_size = (acpi_rs_length) |
279 | resource->data.extended_irq. | 283 | (total_size + |
280 | interrupt_count - 1) * 4); | 284 | ((resource->data.extended_irq.interrupt_count - |
281 | 285 | 1) * 4) + | |
282 | /* Add the size of the optional resource_source info */ | 286 | /* Add the size of the optional resource_source info */ |
283 | 287 | acpi_rs_struct_option_length(&resource->data. | |
284 | segment_size += | 288 | extended_irq. |
285 | acpi_rs_struct_option_length(&resource->data. | 289 | resource_source)); |
286 | extended_irq. | ||
287 | resource_source); | ||
288 | break; | 290 | break; |
289 | 291 | ||
290 | default: | 292 | default: |
@@ -293,7 +295,7 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | |||
293 | 295 | ||
294 | /* Update the total */ | 296 | /* Update the total */ |
295 | 297 | ||
296 | aml_size_needed += segment_size; | 298 | aml_size_needed += total_size; |
297 | 299 | ||
298 | /* Point to the next object */ | 300 | /* Point to the next object */ |
299 | 301 | ||
@@ -341,7 +343,7 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
341 | while (bytes_parsed < aml_buffer_length) { | 343 | while (bytes_parsed < aml_buffer_length) { |
342 | /* The next byte in the stream is the resource descriptor type */ | 344 | /* The next byte in the stream is the resource descriptor type */ |
343 | 345 | ||
344 | resource_type = acpi_rs_get_resource_type(*aml_buffer); | 346 | resource_type = acpi_ut_get_resource_type(aml_buffer); |
345 | 347 | ||
346 | /* Get the base stream size and structure sizes for the descriptor */ | 348 | /* Get the base stream size and structure sizes for the descriptor */ |
347 | 349 | ||
@@ -352,10 +354,7 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
352 | 354 | ||
353 | /* Get the Length field from the input resource descriptor */ | 355 | /* Get the Length field from the input resource descriptor */ |
354 | 356 | ||
355 | resource_length = | 357 | resource_length = acpi_ut_get_resource_length(aml_buffer); |
356 | acpi_rs_get_resource_length(ACPI_CAST_PTR | ||
357 | (union aml_resource, | ||
358 | aml_buffer)); | ||
359 | 358 | ||
360 | /* Augment the size for descriptors with optional fields */ | 359 | /* Augment the size for descriptors with optional fields */ |
361 | 360 | ||
diff --git a/drivers/acpi/resources/rsdump.c b/drivers/acpi/resources/rsdump.c index 2f8990845b2d..27172a3d55d7 100644 --- a/drivers/acpi/resources/rsdump.c +++ b/drivers/acpi/resources/rsdump.c | |||
@@ -43,6 +43,7 @@ | |||
43 | 43 | ||
44 | #include <acpi/acpi.h> | 44 | #include <acpi/acpi.h> |
45 | #include <acpi/acresrc.h> | 45 | #include <acpi/acresrc.h> |
46 | #include <acpi/acdisasm.h> | ||
46 | 47 | ||
47 | #define _COMPONENT ACPI_RESOURCES | 48 | #define _COMPONENT ACPI_RESOURCES |
48 | ACPI_MODULE_NAME("rsdump") | 49 | ACPI_MODULE_NAME("rsdump") |
@@ -61,108 +62,448 @@ static void acpi_rs_out_integer64(char *title, u64 value); | |||
61 | 62 | ||
62 | static void acpi_rs_out_title(char *title); | 63 | static void acpi_rs_out_title(char *title); |
63 | 64 | ||
64 | static void acpi_rs_dump_byte_list(u32 length, u8 * data); | 65 | static void acpi_rs_dump_byte_list(u16 length, u8 * data); |
65 | 66 | ||
66 | static void acpi_rs_dump_dword_list(u32 length, u32 * data); | 67 | static void acpi_rs_dump_dword_list(u8 length, u32 * data); |
67 | 68 | ||
68 | static void acpi_rs_dump_short_byte_list(u32 length, u32 * data); | 69 | static void acpi_rs_dump_short_byte_list(u8 length, u8 * data); |
69 | 70 | ||
70 | static void | 71 | static void |
71 | acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); | 72 | acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); |
72 | 73 | ||
73 | static void acpi_rs_dump_address_common(union acpi_resource_data *resource); | 74 | static void acpi_rs_dump_address_common(union acpi_resource_data *resource); |
74 | 75 | ||
76 | static void | ||
77 | acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table); | ||
78 | |||
79 | #define ACPI_RSD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_resource_data,f) | ||
80 | #define ACPI_PRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f) | ||
81 | #define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_rsdump_info)) | ||
82 | |||
75 | /******************************************************************************* | 83 | /******************************************************************************* |
76 | * | 84 | * |
77 | * FUNCTION: acpi_rs_out* | 85 | * Resource Descriptor info tables |
78 | * | ||
79 | * PARAMETERS: Title - Name of the resource field | ||
80 | * Value - Value of the resource field | ||
81 | * | ||
82 | * RETURN: None | ||
83 | * | 86 | * |
84 | * DESCRIPTION: Miscellaneous helper functions to consistently format the | 87 | * Note: The first table entry must be a Title or Literal and must contain |
85 | * output of the resource dump routines | 88 | * the table length (number of table entries) |
86 | * | 89 | * |
87 | ******************************************************************************/ | 90 | ******************************************************************************/ |
88 | 91 | ||
89 | static void acpi_rs_out_string(char *title, char *value) | 92 | struct acpi_rsdump_info acpi_rs_dump_irq[6] = { |
90 | { | 93 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL}, |
91 | acpi_os_printf("%27s : %s\n", title, value); | 94 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering", |
92 | } | 95 | acpi_gbl_HEdecode}, |
96 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity", | ||
97 | acpi_gbl_LLdecode}, | ||
98 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing", | ||
99 | acpi_gbl_SHRdecode}, | ||
100 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count), | ||
101 | "Interrupt Count", NULL}, | ||
102 | {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]), | ||
103 | "Interrupt List", NULL} | ||
104 | }; | ||
105 | |||
106 | struct acpi_rsdump_info acpi_rs_dump_dma[6] = { | ||
107 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL}, | ||
108 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed", | ||
109 | acpi_gbl_TYPdecode}, | ||
110 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering", | ||
111 | acpi_gbl_BMdecode}, | ||
112 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type", | ||
113 | acpi_gbl_SIZdecode}, | ||
114 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count", | ||
115 | NULL}, | ||
116 | {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List", | ||
117 | NULL} | ||
118 | }; | ||
119 | |||
120 | struct acpi_rsdump_info acpi_rs_dump_start_dpf[3] = { | ||
121 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf), | ||
122 | "Start-Dependent-Functions", NULL}, | ||
123 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority), | ||
124 | "Compatibility Priority", acpi_gbl_config_decode}, | ||
125 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness), | ||
126 | "Performance/Robustness", acpi_gbl_config_decode} | ||
127 | }; | ||
128 | |||
129 | struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = { | ||
130 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf), | ||
131 | "End-Dependent-Functions", NULL} | ||
132 | }; | ||
133 | |||
134 | struct acpi_rsdump_info acpi_rs_dump_io[6] = { | ||
135 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL}, | ||
136 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding", | ||
137 | acpi_gbl_io_decode}, | ||
138 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL}, | ||
139 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL}, | ||
140 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL}, | ||
141 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length", | ||
142 | NULL} | ||
143 | }; | ||
144 | |||
145 | struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = { | ||
146 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io), | ||
147 | "Fixed I/O", NULL}, | ||
148 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL}, | ||
149 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length), | ||
150 | "Address Length", NULL} | ||
151 | }; | ||
152 | |||
153 | struct acpi_rsdump_info acpi_rs_dump_vendor[3] = { | ||
154 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor), | ||
155 | "Vendor Specific", NULL}, | ||
156 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL}, | ||
157 | {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data", | ||
158 | NULL} | ||
159 | }; | ||
160 | |||
161 | struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = { | ||
162 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "end_tag", | ||
163 | NULL} | ||
164 | }; | ||
165 | |||
166 | struct acpi_rsdump_info acpi_rs_dump_memory24[6] = { | ||
167 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24), | ||
168 | "24-Bit Memory Range", NULL}, | ||
169 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect), | ||
170 | "Write Protect", acpi_gbl_RWdecode}, | ||
171 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum", | ||
172 | NULL}, | ||
173 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum", | ||
174 | NULL}, | ||
175 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment", | ||
176 | NULL}, | ||
177 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length), | ||
178 | "Address Length", NULL} | ||
179 | }; | ||
180 | |||
181 | struct acpi_rsdump_info acpi_rs_dump_memory32[6] = { | ||
182 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32), | ||
183 | "32-Bit Memory Range", NULL}, | ||
184 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect), | ||
185 | "Write Protect", acpi_gbl_RWdecode}, | ||
186 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum", | ||
187 | NULL}, | ||
188 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum", | ||
189 | NULL}, | ||
190 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment", | ||
191 | NULL}, | ||
192 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length), | ||
193 | "Address Length", NULL} | ||
194 | }; | ||
195 | |||
196 | struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = { | ||
197 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32), | ||
198 | "32-Bit Fixed Memory Range", NULL}, | ||
199 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect), | ||
200 | "Write Protect", acpi_gbl_RWdecode}, | ||
201 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address", | ||
202 | NULL}, | ||
203 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length), | ||
204 | "Address Length", NULL} | ||
205 | }; | ||
206 | |||
207 | struct acpi_rsdump_info acpi_rs_dump_address16[8] = { | ||
208 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16), | ||
209 | "16-Bit WORD Address Space", NULL}, | ||
210 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | ||
211 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity", | ||
212 | NULL}, | ||
213 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum", | ||
214 | NULL}, | ||
215 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum", | ||
216 | NULL}, | ||
217 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset), | ||
218 | "Translation Offset", NULL}, | ||
219 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length), | ||
220 | "Address Length", NULL}, | ||
221 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL} | ||
222 | }; | ||
223 | |||
224 | struct acpi_rsdump_info acpi_rs_dump_address32[8] = { | ||
225 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32), | ||
226 | "32-Bit DWORD Address Space", NULL}, | ||
227 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | ||
228 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity", | ||
229 | NULL}, | ||
230 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum", | ||
231 | NULL}, | ||
232 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum", | ||
233 | NULL}, | ||
234 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset), | ||
235 | "Translation Offset", NULL}, | ||
236 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length), | ||
237 | "Address Length", NULL}, | ||
238 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL} | ||
239 | }; | ||
240 | |||
241 | struct acpi_rsdump_info acpi_rs_dump_address64[8] = { | ||
242 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64), | ||
243 | "64-Bit QWORD Address Space", NULL}, | ||
244 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | ||
245 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity", | ||
246 | NULL}, | ||
247 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum", | ||
248 | NULL}, | ||
249 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum", | ||
250 | NULL}, | ||
251 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset), | ||
252 | "Translation Offset", NULL}, | ||
253 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length), | ||
254 | "Address Length", NULL}, | ||
255 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL} | ||
256 | }; | ||
257 | |||
258 | struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = { | ||
259 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64), | ||
260 | "64-Bit Extended Address Space", NULL}, | ||
261 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | ||
262 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity), | ||
263 | "Granularity", NULL}, | ||
264 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum), | ||
265 | "Address Minimum", NULL}, | ||
266 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum), | ||
267 | "Address Maximum", NULL}, | ||
268 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset), | ||
269 | "Translation Offset", NULL}, | ||
270 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length), | ||
271 | "Address Length", NULL}, | ||
272 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific), | ||
273 | "Type-Specific Attribute", NULL} | ||
274 | }; | ||
275 | |||
276 | struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = { | ||
277 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq), | ||
278 | "Extended IRQ", NULL}, | ||
279 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer), | ||
280 | "Type", acpi_gbl_consume_decode}, | ||
281 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering), | ||
282 | "Triggering", acpi_gbl_HEdecode}, | ||
283 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity", | ||
284 | acpi_gbl_LLdecode}, | ||
285 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing", | ||
286 | acpi_gbl_SHRdecode}, | ||
287 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL, | ||
288 | NULL}, | ||
289 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count), | ||
290 | "Interrupt Count", NULL}, | ||
291 | {ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]), | ||
292 | "Interrupt List", NULL} | ||
293 | }; | ||
294 | |||
295 | struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = { | ||
296 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg), | ||
297 | "Generic Register", NULL}, | ||
298 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID", | ||
299 | NULL}, | ||
300 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width", | ||
301 | NULL}, | ||
302 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset", | ||
303 | NULL}, | ||
304 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size), | ||
305 | "Access Size", NULL}, | ||
306 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL} | ||
307 | }; | ||
93 | 308 | ||
94 | static void acpi_rs_out_integer8(char *title, u8 value) | 309 | /* |
95 | { | 310 | * Tables used for common address descriptor flag fields |
96 | acpi_os_printf("%27s : %2.2X\n", title, value); | 311 | */ |
97 | } | 312 | static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = { |
98 | 313 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL, | |
99 | static void acpi_rs_out_integer16(char *title, u16 value) | 314 | NULL}, |
100 | { | 315 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer), |
101 | acpi_os_printf("%27s : %4.4X\n", title, value); | 316 | "Consumer/Producer", acpi_gbl_consume_decode}, |
102 | } | 317 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode", |
103 | 318 | acpi_gbl_DECdecode}, | |
104 | static void acpi_rs_out_integer32(char *title, u32 value) | 319 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed), |
105 | { | 320 | "Min Relocatability", acpi_gbl_min_decode}, |
106 | acpi_os_printf("%27s : %8.8X\n", title, value); | 321 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed), |
107 | } | 322 | "Max Relocatability", acpi_gbl_max_decode} |
108 | 323 | }; | |
109 | static void acpi_rs_out_integer64(char *title, u64 value) | 324 | |
110 | { | 325 | static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = { |
111 | acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); | 326 | {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags), |
112 | } | 327 | "Resource Type", "Memory Range"}, |
328 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect), | ||
329 | "Write Protect", acpi_gbl_RWdecode}, | ||
330 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching), | ||
331 | "Caching", acpi_gbl_MEMdecode}, | ||
332 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type), | ||
333 | "Range Type", acpi_gbl_MTPdecode}, | ||
334 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation), | ||
335 | "Translation", acpi_gbl_TTPdecode} | ||
336 | }; | ||
337 | |||
338 | static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = { | ||
339 | {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags), | ||
340 | "Resource Type", "I/O Range"}, | ||
341 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type), | ||
342 | "Range Type", acpi_gbl_RNGdecode}, | ||
343 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation), | ||
344 | "Translation", acpi_gbl_TTPdecode}, | ||
345 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type), | ||
346 | "Translation Type", acpi_gbl_TRSdecode} | ||
347 | }; | ||
113 | 348 | ||
114 | static void acpi_rs_out_title(char *title) | 349 | /* |
115 | { | 350 | * Table used to dump _PRT contents |
116 | acpi_os_printf("%27s : ", title); | 351 | */ |
117 | } | 352 | static struct acpi_rsdump_info acpi_rs_dump_prt[5] = { |
353 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL}, | ||
354 | {ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL}, | ||
355 | {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL}, | ||
356 | {ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL}, | ||
357 | {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL} | ||
358 | }; | ||
118 | 359 | ||
119 | /******************************************************************************* | 360 | /******************************************************************************* |
120 | * | 361 | * |
121 | * FUNCTION: acpi_rs_dump*List | 362 | * FUNCTION: acpi_rs_dump_descriptor |
122 | * | 363 | * |
123 | * PARAMETERS: Length - Number of elements in the list | 364 | * PARAMETERS: Resource |
124 | * Data - Start of the list | ||
125 | * | 365 | * |
126 | * RETURN: None | 366 | * RETURN: None |
127 | * | 367 | * |
128 | * DESCRIPTION: Miscellaneous functions to dump lists of raw data | 368 | * DESCRIPTION: |
129 | * | 369 | * |
130 | ******************************************************************************/ | 370 | ******************************************************************************/ |
131 | 371 | ||
132 | static void acpi_rs_dump_byte_list(u32 length, u8 * data) | 372 | static void |
373 | acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | ||
133 | { | 374 | { |
134 | u32 i; | 375 | void *target = NULL; |
376 | void *previous_target; | ||
377 | char *name; | ||
378 | u8 count; | ||
379 | |||
380 | /* First table entry must contain the table length (# of table entries) */ | ||
381 | |||
382 | count = table->offset; | ||
383 | |||
384 | while (count) { | ||
385 | previous_target = target; | ||
386 | target = ((u8 *) resource) + table->offset; | ||
387 | name = table->name; | ||
388 | |||
389 | switch (table->opcode) { | ||
390 | case ACPI_RSD_TITLE: | ||
391 | /* | ||
392 | * Optional resource title | ||
393 | */ | ||
394 | if (table->name) { | ||
395 | acpi_os_printf("%s Resource\n", name); | ||
396 | } | ||
397 | break; | ||
135 | 398 | ||
136 | for (i = 0; i < length; i++) { | 399 | /* Strings */ |
137 | acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); | ||
138 | } | ||
139 | } | ||
140 | 400 | ||
141 | static void acpi_rs_dump_dword_list(u32 length, u32 * data) | 401 | case ACPI_RSD_LITERAL: |
142 | { | 402 | acpi_rs_out_string(name, (char *)table->pointer); |
143 | u32 i; | 403 | break; |
144 | 404 | ||
145 | for (i = 0; i < length; i++) { | 405 | case ACPI_RSD_STRING: |
146 | acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]); | 406 | acpi_rs_out_string(name, (char *)target); |
147 | } | 407 | break; |
148 | } | ||
149 | 408 | ||
150 | static void acpi_rs_dump_short_byte_list(u32 length, u32 * data) | 409 | /* Data items, 8/16/32/64 bit */ |
151 | { | ||
152 | u32 i; | ||
153 | 410 | ||
154 | for (i = 0; i < length; i++) { | 411 | case ACPI_RSD_UINT8: |
155 | acpi_os_printf("%X ", data[i]); | 412 | acpi_rs_out_integer8(name, *(u8 *) target); |
156 | } | 413 | break; |
157 | acpi_os_printf("\n"); | ||
158 | } | ||
159 | 414 | ||
160 | static void acpi_rs_dump_memory_attribute(u32 read_write_attribute) | 415 | case ACPI_RSD_UINT16: |
161 | { | 416 | acpi_rs_out_integer16(name, *(u16 *) target); |
417 | break; | ||
418 | |||
419 | case ACPI_RSD_UINT32: | ||
420 | acpi_rs_out_integer32(name, *(u32 *) target); | ||
421 | break; | ||
162 | 422 | ||
163 | acpi_rs_out_string("Read/Write Attribute", | 423 | case ACPI_RSD_UINT64: |
164 | ACPI_READ_WRITE_MEMORY == read_write_attribute ? | 424 | acpi_rs_out_integer64(name, *(u64 *) target); |
165 | "Read/Write" : "Read-Only"); | 425 | break; |
426 | |||
427 | /* Flags: 1-bit and 2-bit flags supported */ | ||
428 | |||
429 | case ACPI_RSD_1BITFLAG: | ||
430 | acpi_rs_out_string(name, (char *) | ||
431 | ((const char **)table-> | ||
432 | pointer)[(*(u8 *) target) & 0x01]); | ||
433 | break; | ||
434 | |||
435 | case ACPI_RSD_2BITFLAG: | ||
436 | acpi_rs_out_string(name, (char *) | ||
437 | ((const char **)table-> | ||
438 | pointer)[(*(u8 *) target) & 0x03]); | ||
439 | break; | ||
440 | |||
441 | case ACPI_RSD_SHORTLIST: | ||
442 | /* | ||
443 | * Short byte list (single line output) for DMA and IRQ resources | ||
444 | * Note: The list length is obtained from the previous table entry | ||
445 | */ | ||
446 | if (previous_target) { | ||
447 | acpi_rs_out_title(name); | ||
448 | acpi_rs_dump_short_byte_list(* | ||
449 | ((u8 *) | ||
450 | previous_target), | ||
451 | (u8 *) target); | ||
452 | } | ||
453 | break; | ||
454 | |||
455 | case ACPI_RSD_LONGLIST: | ||
456 | /* | ||
457 | * Long byte list for Vendor resource data | ||
458 | * Note: The list length is obtained from the previous table entry | ||
459 | */ | ||
460 | if (previous_target) { | ||
461 | acpi_rs_dump_byte_list(* | ||
462 | ((u16 *) | ||
463 | previous_target), | ||
464 | (u8 *) target); | ||
465 | } | ||
466 | break; | ||
467 | |||
468 | case ACPI_RSD_DWORDLIST: | ||
469 | /* | ||
470 | * Dword list for Extended Interrupt resources | ||
471 | * Note: The list length is obtained from the previous table entry | ||
472 | */ | ||
473 | if (previous_target) { | ||
474 | acpi_rs_dump_dword_list(* | ||
475 | ((u8 *) | ||
476 | previous_target), | ||
477 | (u32 *) target); | ||
478 | } | ||
479 | break; | ||
480 | |||
481 | case ACPI_RSD_ADDRESS: | ||
482 | /* | ||
483 | * Common flags for all Address resources | ||
484 | */ | ||
485 | acpi_rs_dump_address_common((union acpi_resource_data *) | ||
486 | target); | ||
487 | break; | ||
488 | |||
489 | case ACPI_RSD_SOURCE: | ||
490 | /* | ||
491 | * Optional resource_source for Address resources | ||
492 | */ | ||
493 | acpi_rs_dump_resource_source((struct | ||
494 | acpi_resource_source *) | ||
495 | target); | ||
496 | break; | ||
497 | |||
498 | default: | ||
499 | acpi_os_printf("**** Invalid table opcode [%X] ****\n", | ||
500 | table->opcode); | ||
501 | return; | ||
502 | } | ||
503 | |||
504 | table++; | ||
505 | count--; | ||
506 | } | ||
166 | } | 507 | } |
167 | 508 | ||
168 | /******************************************************************************* | 509 | /******************************************************************************* |
@@ -187,8 +528,7 @@ acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source) | |||
187 | return; | 528 | return; |
188 | } | 529 | } |
189 | 530 | ||
190 | acpi_rs_out_integer8("Resource Source Index", | 531 | acpi_rs_out_integer8("Resource Source Index", resource_source->index); |
191 | (u8) resource_source->index); | ||
192 | 532 | ||
193 | acpi_rs_out_string("Resource Source", | 533 | acpi_rs_out_string("Resource Source", |
194 | resource_source->string_ptr ? | 534 | resource_source->string_ptr ? |
@@ -217,65 +557,12 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource) | |||
217 | switch (resource->address.resource_type) { | 557 | switch (resource->address.resource_type) { |
218 | case ACPI_MEMORY_RANGE: | 558 | case ACPI_MEMORY_RANGE: |
219 | 559 | ||
220 | acpi_rs_out_string("Resource Type", "Memory Range"); | 560 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags); |
221 | |||
222 | acpi_rs_out_title("Type-Specific Flags"); | ||
223 | |||
224 | switch (resource->address.attribute.memory.cache_attribute) { | ||
225 | case ACPI_NON_CACHEABLE_MEMORY: | ||
226 | acpi_os_printf("Noncacheable memory\n"); | ||
227 | break; | ||
228 | |||
229 | case ACPI_CACHABLE_MEMORY: | ||
230 | acpi_os_printf("Cacheable memory\n"); | ||
231 | break; | ||
232 | |||
233 | case ACPI_WRITE_COMBINING_MEMORY: | ||
234 | acpi_os_printf("Write-combining memory\n"); | ||
235 | break; | ||
236 | |||
237 | case ACPI_PREFETCHABLE_MEMORY: | ||
238 | acpi_os_printf("Prefetchable memory\n"); | ||
239 | break; | ||
240 | |||
241 | default: | ||
242 | acpi_os_printf("Invalid cache attribute\n"); | ||
243 | break; | ||
244 | } | ||
245 | |||
246 | acpi_rs_dump_memory_attribute(resource->address.attribute. | ||
247 | memory.read_write_attribute); | ||
248 | break; | 561 | break; |
249 | 562 | ||
250 | case ACPI_IO_RANGE: | 563 | case ACPI_IO_RANGE: |
251 | 564 | ||
252 | acpi_rs_out_string("Resource Type", "I/O Range"); | 565 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags); |
253 | |||
254 | acpi_rs_out_title("Type-Specific Flags"); | ||
255 | |||
256 | switch (resource->address.attribute.io.range_attribute) { | ||
257 | case ACPI_NON_ISA_ONLY_RANGES: | ||
258 | acpi_os_printf("Non-ISA I/O Addresses\n"); | ||
259 | break; | ||
260 | |||
261 | case ACPI_ISA_ONLY_RANGES: | ||
262 | acpi_os_printf("ISA I/O Addresses\n"); | ||
263 | break; | ||
264 | |||
265 | case ACPI_ENTIRE_RANGE: | ||
266 | acpi_os_printf("ISA and non-ISA I/O Addresses\n"); | ||
267 | break; | ||
268 | |||
269 | default: | ||
270 | acpi_os_printf("Invalid range attribute\n"); | ||
271 | break; | ||
272 | } | ||
273 | |||
274 | acpi_rs_out_string("Translation Attribute", | ||
275 | ACPI_SPARSE_TRANSLATION == | ||
276 | resource->address.attribute.io. | ||
277 | translation_attribute ? "Sparse Translation" | ||
278 | : "Dense Translation"); | ||
279 | break; | 566 | break; |
280 | 567 | ||
281 | case ACPI_BUS_NUMBER_RANGE: | 568 | case ACPI_BUS_NUMBER_RANGE: |
@@ -292,24 +579,7 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource) | |||
292 | 579 | ||
293 | /* Decode the general flags */ | 580 | /* Decode the general flags */ |
294 | 581 | ||
295 | acpi_rs_out_string("Resource", | 582 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags); |
296 | ACPI_CONSUMER == | ||
297 | resource->address. | ||
298 | producer_consumer ? "Consumer" : "Producer"); | ||
299 | |||
300 | acpi_rs_out_string("Decode", | ||
301 | ACPI_SUB_DECODE == resource->address.decode ? | ||
302 | "Subtractive" : "Positive"); | ||
303 | |||
304 | acpi_rs_out_string("Min Address", | ||
305 | ACPI_ADDRESS_FIXED == | ||
306 | resource->address. | ||
307 | min_address_fixed ? "Fixed" : "Not Fixed"); | ||
308 | |||
309 | acpi_rs_out_string("Max Address", | ||
310 | ACPI_ADDRESS_FIXED == | ||
311 | resource->address. | ||
312 | max_address_fixed ? "Fixed" : "Not Fixed"); | ||
313 | } | 583 | } |
314 | 584 | ||
315 | /******************************************************************************* | 585 | /******************************************************************************* |
@@ -327,6 +597,7 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource) | |||
327 | void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) | 597 | void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) |
328 | { | 598 | { |
329 | u32 count = 0; | 599 | u32 count = 0; |
600 | u32 type; | ||
330 | 601 | ||
331 | ACPI_FUNCTION_ENTRY(); | 602 | ACPI_FUNCTION_ENTRY(); |
332 | 603 | ||
@@ -335,14 +606,16 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) | |||
335 | return; | 606 | return; |
336 | } | 607 | } |
337 | 608 | ||
338 | /* Dump all resource descriptors in the list */ | 609 | /* Walk list and dump all resource descriptors (END_TAG terminates) */ |
339 | 610 | ||
340 | while (resource_list) { | 611 | do { |
341 | acpi_os_printf("\n[%02X] ", count); | 612 | acpi_os_printf("\n[%02X] ", count); |
613 | count++; | ||
342 | 614 | ||
343 | /* Validate Type before dispatch */ | 615 | /* Validate Type before dispatch */ |
344 | 616 | ||
345 | if (resource_list->type > ACPI_RESOURCE_TYPE_MAX) { | 617 | type = resource_list->type; |
618 | if (type > ACPI_RESOURCE_TYPE_MAX) { | ||
346 | acpi_os_printf | 619 | acpi_os_printf |
347 | ("Invalid descriptor type (%X) in resource list\n", | 620 | ("Invalid descriptor type (%X) in resource list\n", |
348 | resource_list->type); | 621 | resource_list->type); |
@@ -351,665 +624,141 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) | |||
351 | 624 | ||
352 | /* Dump the resource descriptor */ | 625 | /* Dump the resource descriptor */ |
353 | 626 | ||
354 | acpi_gbl_dump_resource_dispatch[resource_list-> | 627 | acpi_rs_dump_descriptor(&resource_list->data, |
355 | type] (&resource_list->data); | 628 | acpi_gbl_dump_resource_dispatch[type]); |
356 | |||
357 | /* Exit on end tag */ | ||
358 | |||
359 | if (resource_list->type == ACPI_RESOURCE_TYPE_END_TAG) { | ||
360 | return; | ||
361 | } | ||
362 | 629 | ||
363 | /* Get the next resource structure */ | 630 | /* Point to the next resource structure */ |
364 | 631 | ||
365 | resource_list = | 632 | resource_list = |
366 | ACPI_PTR_ADD(struct acpi_resource, resource_list, | 633 | ACPI_PTR_ADD(struct acpi_resource, resource_list, |
367 | resource_list->length); | 634 | resource_list->length); |
368 | count++; | ||
369 | } | ||
370 | } | ||
371 | 635 | ||
372 | /******************************************************************************* | 636 | /* Exit when END_TAG descriptor is reached */ |
373 | * | ||
374 | * FUNCTION: acpi_rs_dump_irq | ||
375 | * | ||
376 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
377 | * | ||
378 | * RETURN: None | ||
379 | * | ||
380 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
381 | * | ||
382 | ******************************************************************************/ | ||
383 | 637 | ||
384 | void acpi_rs_dump_irq(union acpi_resource_data *resource) | 638 | } while (type != ACPI_RESOURCE_TYPE_END_TAG); |
385 | { | ||
386 | ACPI_FUNCTION_ENTRY(); | ||
387 | |||
388 | acpi_os_printf("IRQ Resource\n"); | ||
389 | |||
390 | acpi_rs_out_string("Triggering", | ||
391 | ACPI_LEVEL_SENSITIVE == | ||
392 | resource->irq.triggering ? "Level" : "Edge"); | ||
393 | |||
394 | acpi_rs_out_string("Active", | ||
395 | ACPI_ACTIVE_LOW == | ||
396 | resource->irq.polarity ? "Low" : "High"); | ||
397 | |||
398 | acpi_rs_out_string("Sharing", | ||
399 | ACPI_SHARED == | ||
400 | resource->irq.sharable ? "Shared" : "Exclusive"); | ||
401 | |||
402 | acpi_rs_out_integer8("Interrupt Count", | ||
403 | (u8) resource->irq.interrupt_count); | ||
404 | |||
405 | acpi_rs_out_title("Interrupt List"); | ||
406 | acpi_rs_dump_short_byte_list(resource->irq.interrupt_count, | ||
407 | resource->irq.interrupts); | ||
408 | } | 639 | } |
409 | 640 | ||
410 | /******************************************************************************* | 641 | /******************************************************************************* |
411 | * | 642 | * |
412 | * FUNCTION: acpi_rs_dump_dma | 643 | * FUNCTION: acpi_rs_dump_irq_list |
413 | * | 644 | * |
414 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | 645 | * PARAMETERS: route_table - Pointer to the routing table to dump. |
415 | * | 646 | * |
416 | * RETURN: None | 647 | * RETURN: None |
417 | * | 648 | * |
418 | * DESCRIPTION: Dump the field names and values of the resource descriptor | 649 | * DESCRIPTION: Print IRQ routing table |
419 | * | 650 | * |
420 | ******************************************************************************/ | 651 | ******************************************************************************/ |
421 | 652 | ||
422 | void acpi_rs_dump_dma(union acpi_resource_data *resource) | 653 | void acpi_rs_dump_irq_list(u8 * route_table) |
423 | { | 654 | { |
424 | ACPI_FUNCTION_ENTRY(); | 655 | struct acpi_pci_routing_table *prt_element; |
425 | 656 | u8 count; | |
426 | acpi_os_printf("DMA Resource\n"); | ||
427 | |||
428 | acpi_rs_out_title("DMA Type"); | ||
429 | switch (resource->dma.type) { | ||
430 | case ACPI_COMPATIBILITY: | ||
431 | acpi_os_printf("Compatibility mode\n"); | ||
432 | break; | ||
433 | |||
434 | case ACPI_TYPE_A: | ||
435 | acpi_os_printf("Type A\n"); | ||
436 | break; | ||
437 | |||
438 | case ACPI_TYPE_B: | ||
439 | acpi_os_printf("Type B\n"); | ||
440 | break; | ||
441 | |||
442 | case ACPI_TYPE_F: | ||
443 | acpi_os_printf("Type F\n"); | ||
444 | break; | ||
445 | |||
446 | default: | ||
447 | acpi_os_printf("**** Invalid DMA type\n"); | ||
448 | break; | ||
449 | } | ||
450 | |||
451 | acpi_rs_out_string("Bus Master", | ||
452 | ACPI_BUS_MASTER == | ||
453 | resource->dma.bus_master ? "Yes" : "No"); | ||
454 | |||
455 | acpi_rs_out_title("Transfer Type"); | ||
456 | switch (resource->dma.transfer) { | ||
457 | case ACPI_TRANSFER_8: | ||
458 | acpi_os_printf("8-bit transfers only\n"); | ||
459 | break; | ||
460 | |||
461 | case ACPI_TRANSFER_8_16: | ||
462 | acpi_os_printf("8-bit and 16-bit transfers\n"); | ||
463 | break; | ||
464 | |||
465 | case ACPI_TRANSFER_16: | ||
466 | acpi_os_printf("16-bit transfers only\n"); | ||
467 | break; | ||
468 | |||
469 | default: | ||
470 | acpi_os_printf("**** Invalid transfer preference\n"); | ||
471 | break; | ||
472 | } | ||
473 | |||
474 | acpi_rs_out_integer8("DMA Channel Count", | ||
475 | (u8) resource->dma.channel_count); | ||
476 | |||
477 | acpi_rs_out_title("Channel List"); | ||
478 | acpi_rs_dump_short_byte_list(resource->dma.channel_count, | ||
479 | resource->dma.channels); | ||
480 | } | ||
481 | |||
482 | /******************************************************************************* | ||
483 | * | ||
484 | * FUNCTION: acpi_rs_dump_start_dpf | ||
485 | * | ||
486 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
487 | * | ||
488 | * RETURN: None | ||
489 | * | ||
490 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
491 | * | ||
492 | ******************************************************************************/ | ||
493 | 657 | ||
494 | void acpi_rs_dump_start_dpf(union acpi_resource_data *resource) | ||
495 | { | ||
496 | ACPI_FUNCTION_ENTRY(); | 658 | ACPI_FUNCTION_ENTRY(); |
497 | 659 | ||
498 | acpi_os_printf("Start Dependent Functions Resource\n"); | 660 | if (!(acpi_dbg_level & ACPI_LV_RESOURCES) |
499 | 661 | || !(_COMPONENT & acpi_dbg_layer)) { | |
500 | acpi_rs_out_title("Compatibility Priority"); | 662 | return; |
501 | switch (resource->start_dpf.compatibility_priority) { | ||
502 | case ACPI_GOOD_CONFIGURATION: | ||
503 | acpi_os_printf("Good configuration\n"); | ||
504 | break; | ||
505 | |||
506 | case ACPI_ACCEPTABLE_CONFIGURATION: | ||
507 | acpi_os_printf("Acceptable configuration\n"); | ||
508 | break; | ||
509 | |||
510 | case ACPI_SUB_OPTIMAL_CONFIGURATION: | ||
511 | acpi_os_printf("Sub-optimal configuration\n"); | ||
512 | break; | ||
513 | |||
514 | default: | ||
515 | acpi_os_printf("**** Invalid compatibility priority\n"); | ||
516 | break; | ||
517 | } | 663 | } |
518 | 664 | ||
519 | acpi_rs_out_title("Performance/Robustness"); | 665 | prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table); |
520 | switch (resource->start_dpf.performance_robustness) { | ||
521 | case ACPI_GOOD_CONFIGURATION: | ||
522 | acpi_os_printf("Good configuration\n"); | ||
523 | break; | ||
524 | 666 | ||
525 | case ACPI_ACCEPTABLE_CONFIGURATION: | 667 | /* Dump all table elements, Exit on zero length element */ |
526 | acpi_os_printf("Acceptable configuration\n"); | ||
527 | break; | ||
528 | 668 | ||
529 | case ACPI_SUB_OPTIMAL_CONFIGURATION: | 669 | for (count = 0; prt_element->length; count++) { |
530 | acpi_os_printf("Sub-optimal configuration\n"); | 670 | acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", |
531 | break; | 671 | count); |
672 | acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt); | ||
532 | 673 | ||
533 | default: | 674 | prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, |
534 | acpi_os_printf | 675 | ((u8 *) prt_element) + |
535 | ("**** Invalid performance robustness preference\n"); | 676 | prt_element->length); |
536 | break; | ||
537 | } | 677 | } |
538 | } | 678 | } |
539 | 679 | ||
540 | /******************************************************************************* | 680 | /******************************************************************************* |
541 | * | 681 | * |
542 | * FUNCTION: acpi_rs_dump_io | 682 | * FUNCTION: acpi_rs_out* |
543 | * | ||
544 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
545 | * | ||
546 | * RETURN: None | ||
547 | * | ||
548 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
549 | * | ||
550 | ******************************************************************************/ | ||
551 | |||
552 | void acpi_rs_dump_io(union acpi_resource_data *resource) | ||
553 | { | ||
554 | ACPI_FUNCTION_ENTRY(); | ||
555 | |||
556 | acpi_os_printf("I/O Resource\n"); | ||
557 | |||
558 | acpi_rs_out_string("Decode", | ||
559 | ACPI_DECODE_16 == | ||
560 | resource->io.io_decode ? "16-bit" : "10-bit"); | ||
561 | |||
562 | acpi_rs_out_integer32("Address Minimum", resource->io.minimum); | ||
563 | |||
564 | acpi_rs_out_integer32("Address Maximum", resource->io.maximum); | ||
565 | |||
566 | acpi_rs_out_integer32("Alignment", resource->io.alignment); | ||
567 | |||
568 | acpi_rs_out_integer32("Address Length", resource->io.address_length); | ||
569 | } | ||
570 | |||
571 | /******************************************************************************* | ||
572 | * | ||
573 | * FUNCTION: acpi_rs_dump_fixed_io | ||
574 | * | ||
575 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
576 | * | ||
577 | * RETURN: None | ||
578 | * | ||
579 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
580 | * | ||
581 | ******************************************************************************/ | ||
582 | |||
583 | void acpi_rs_dump_fixed_io(union acpi_resource_data *resource) | ||
584 | { | ||
585 | ACPI_FUNCTION_ENTRY(); | ||
586 | |||
587 | acpi_os_printf("Fixed I/O Resource\n"); | ||
588 | |||
589 | acpi_rs_out_integer32("Address", resource->fixed_io.address); | ||
590 | |||
591 | acpi_rs_out_integer32("Address Length", | ||
592 | resource->fixed_io.address_length); | ||
593 | } | ||
594 | |||
595 | /******************************************************************************* | ||
596 | * | ||
597 | * FUNCTION: acpi_rs_dump_vendor | ||
598 | * | ||
599 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
600 | * | ||
601 | * RETURN: None | ||
602 | * | ||
603 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
604 | * | ||
605 | ******************************************************************************/ | ||
606 | |||
607 | void acpi_rs_dump_vendor(union acpi_resource_data *resource) | ||
608 | { | ||
609 | ACPI_FUNCTION_ENTRY(); | ||
610 | |||
611 | acpi_os_printf("Vendor Specific Resource\n"); | ||
612 | |||
613 | acpi_rs_out_integer16("Length", (u16) resource->vendor.byte_length); | ||
614 | |||
615 | acpi_rs_dump_byte_list(resource->vendor.byte_length, | ||
616 | resource->vendor.byte_data); | ||
617 | } | ||
618 | |||
619 | /******************************************************************************* | ||
620 | * | ||
621 | * FUNCTION: acpi_rs_dump_memory24 | ||
622 | * | ||
623 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
624 | * | ||
625 | * RETURN: None | ||
626 | * | ||
627 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
628 | * | ||
629 | ******************************************************************************/ | ||
630 | |||
631 | void acpi_rs_dump_memory24(union acpi_resource_data *resource) | ||
632 | { | ||
633 | ACPI_FUNCTION_ENTRY(); | ||
634 | |||
635 | acpi_os_printf("24-Bit Memory Range Resource\n"); | ||
636 | |||
637 | acpi_rs_dump_memory_attribute(resource->memory24.read_write_attribute); | ||
638 | |||
639 | acpi_rs_out_integer16("Address Minimum", | ||
640 | (u16) resource->memory24.minimum); | ||
641 | |||
642 | acpi_rs_out_integer16("Address Maximum", | ||
643 | (u16) resource->memory24.maximum); | ||
644 | |||
645 | acpi_rs_out_integer16("Alignment", (u16) resource->memory24.alignment); | ||
646 | |||
647 | acpi_rs_out_integer16("Address Length", | ||
648 | (u16) resource->memory24.address_length); | ||
649 | } | ||
650 | |||
651 | /******************************************************************************* | ||
652 | * | ||
653 | * FUNCTION: acpi_rs_dump_memory32 | ||
654 | * | ||
655 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
656 | * | ||
657 | * RETURN: None | ||
658 | * | ||
659 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
660 | * | ||
661 | ******************************************************************************/ | ||
662 | |||
663 | void acpi_rs_dump_memory32(union acpi_resource_data *resource) | ||
664 | { | ||
665 | ACPI_FUNCTION_ENTRY(); | ||
666 | |||
667 | acpi_os_printf("32-Bit Memory Range Resource\n"); | ||
668 | |||
669 | acpi_rs_dump_memory_attribute(resource->memory32.read_write_attribute); | ||
670 | |||
671 | acpi_rs_out_integer32("Address Minimum", resource->memory32.minimum); | ||
672 | |||
673 | acpi_rs_out_integer32("Address Maximum", resource->memory32.maximum); | ||
674 | |||
675 | acpi_rs_out_integer32("Alignment", resource->memory32.alignment); | ||
676 | |||
677 | acpi_rs_out_integer32("Address Length", | ||
678 | resource->memory32.address_length); | ||
679 | } | ||
680 | |||
681 | /******************************************************************************* | ||
682 | * | ||
683 | * FUNCTION: acpi_rs_dump_fixed_memory32 | ||
684 | * | ||
685 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
686 | * | ||
687 | * RETURN: | ||
688 | * | ||
689 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
690 | * | ||
691 | ******************************************************************************/ | ||
692 | |||
693 | void acpi_rs_dump_fixed_memory32(union acpi_resource_data *resource) | ||
694 | { | ||
695 | ACPI_FUNCTION_ENTRY(); | ||
696 | |||
697 | acpi_os_printf("32-Bit Fixed Location Memory Range Resource\n"); | ||
698 | |||
699 | acpi_rs_dump_memory_attribute(resource->fixed_memory32. | ||
700 | read_write_attribute); | ||
701 | |||
702 | acpi_rs_out_integer32("Address", resource->fixed_memory32.address); | ||
703 | |||
704 | acpi_rs_out_integer32("Address Length", | ||
705 | resource->fixed_memory32.address_length); | ||
706 | } | ||
707 | |||
708 | /******************************************************************************* | ||
709 | * | ||
710 | * FUNCTION: acpi_rs_dump_address16 | ||
711 | * | 683 | * |
712 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | 684 | * PARAMETERS: Title - Name of the resource field |
685 | * Value - Value of the resource field | ||
713 | * | 686 | * |
714 | * RETURN: None | 687 | * RETURN: None |
715 | * | 688 | * |
716 | * DESCRIPTION: Dump the field names and values of the resource descriptor | 689 | * DESCRIPTION: Miscellaneous helper functions to consistently format the |
690 | * output of the resource dump routines | ||
717 | * | 691 | * |
718 | ******************************************************************************/ | 692 | ******************************************************************************/ |
719 | 693 | ||
720 | void acpi_rs_dump_address16(union acpi_resource_data *resource) | 694 | static void acpi_rs_out_string(char *title, char *value) |
721 | { | 695 | { |
722 | ACPI_FUNCTION_ENTRY(); | 696 | acpi_os_printf("%27s : %s\n", title, value); |
723 | |||
724 | acpi_os_printf("16-Bit WORD Address Space Resource\n"); | ||
725 | |||
726 | acpi_rs_dump_address_common(resource); | ||
727 | |||
728 | acpi_rs_out_integer16("Granularity", | ||
729 | (u16) resource->address16.granularity); | ||
730 | |||
731 | acpi_rs_out_integer16("Address Minimum", | ||
732 | (u16) resource->address16.minimum); | ||
733 | |||
734 | acpi_rs_out_integer16("Address Maximum", | ||
735 | (u16) resource->address16.maximum); | ||
736 | |||
737 | acpi_rs_out_integer16("Translation Offset", | ||
738 | (u16) resource->address16.translation_offset); | ||
739 | |||
740 | acpi_rs_out_integer16("Address Length", | ||
741 | (u16) resource->address16.address_length); | ||
742 | |||
743 | acpi_rs_dump_resource_source(&resource->address16.resource_source); | ||
744 | } | 697 | } |
745 | 698 | ||
746 | /******************************************************************************* | 699 | static void acpi_rs_out_integer8(char *title, u8 value) |
747 | * | ||
748 | * FUNCTION: acpi_rs_dump_address32 | ||
749 | * | ||
750 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
751 | * | ||
752 | * RETURN: None | ||
753 | * | ||
754 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
755 | * | ||
756 | ******************************************************************************/ | ||
757 | |||
758 | void acpi_rs_dump_address32(union acpi_resource_data *resource) | ||
759 | { | 700 | { |
760 | ACPI_FUNCTION_ENTRY(); | 701 | acpi_os_printf("%27s : %2.2X\n", title, value); |
761 | |||
762 | acpi_os_printf("32-Bit DWORD Address Space Resource\n"); | ||
763 | |||
764 | acpi_rs_dump_address_common(resource); | ||
765 | |||
766 | acpi_rs_out_integer32("Granularity", resource->address32.granularity); | ||
767 | |||
768 | acpi_rs_out_integer32("Address Minimum", resource->address32.minimum); | ||
769 | |||
770 | acpi_rs_out_integer32("Address Maximum", resource->address32.maximum); | ||
771 | |||
772 | acpi_rs_out_integer32("Translation Offset", | ||
773 | resource->address32.translation_offset); | ||
774 | |||
775 | acpi_rs_out_integer32("Address Length", | ||
776 | resource->address32.address_length); | ||
777 | |||
778 | acpi_rs_dump_resource_source(&resource->address32.resource_source); | ||
779 | } | 702 | } |
780 | 703 | ||
781 | /******************************************************************************* | 704 | static void acpi_rs_out_integer16(char *title, u16 value) |
782 | * | ||
783 | * FUNCTION: acpi_rs_dump_address64 | ||
784 | * | ||
785 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
786 | * | ||
787 | * RETURN: None | ||
788 | * | ||
789 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
790 | * | ||
791 | ******************************************************************************/ | ||
792 | |||
793 | void acpi_rs_dump_address64(union acpi_resource_data *resource) | ||
794 | { | 705 | { |
795 | ACPI_FUNCTION_ENTRY(); | 706 | acpi_os_printf("%27s : %4.4X\n", title, value); |
796 | |||
797 | acpi_os_printf("64-Bit QWORD Address Space Resource\n"); | ||
798 | |||
799 | acpi_rs_dump_address_common(resource); | ||
800 | |||
801 | acpi_rs_out_integer64("Granularity", resource->address64.granularity); | ||
802 | |||
803 | acpi_rs_out_integer64("Address Minimum", resource->address64.minimum); | ||
804 | |||
805 | acpi_rs_out_integer64("Address Maximum", resource->address64.maximum); | ||
806 | |||
807 | acpi_rs_out_integer64("Translation Offset", | ||
808 | resource->address64.translation_offset); | ||
809 | |||
810 | acpi_rs_out_integer64("Address Length", | ||
811 | resource->address64.address_length); | ||
812 | |||
813 | acpi_rs_dump_resource_source(&resource->address64.resource_source); | ||
814 | } | 707 | } |
815 | 708 | ||
816 | /******************************************************************************* | 709 | static void acpi_rs_out_integer32(char *title, u32 value) |
817 | * | ||
818 | * FUNCTION: acpi_rs_dump_ext_address64 | ||
819 | * | ||
820 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
821 | * | ||
822 | * RETURN: None | ||
823 | * | ||
824 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
825 | * | ||
826 | ******************************************************************************/ | ||
827 | |||
828 | void acpi_rs_dump_ext_address64(union acpi_resource_data *resource) | ||
829 | { | 710 | { |
830 | ACPI_FUNCTION_ENTRY(); | 711 | acpi_os_printf("%27s : %8.8X\n", title, value); |
831 | |||
832 | acpi_os_printf("64-Bit Extended Address Space Resource\n"); | ||
833 | |||
834 | acpi_rs_dump_address_common(resource); | ||
835 | |||
836 | acpi_rs_out_integer64("Granularity", | ||
837 | resource->ext_address64.granularity); | ||
838 | |||
839 | acpi_rs_out_integer64("Address Minimum", | ||
840 | resource->ext_address64.minimum); | ||
841 | |||
842 | acpi_rs_out_integer64("Address Maximum", | ||
843 | resource->ext_address64.maximum); | ||
844 | |||
845 | acpi_rs_out_integer64("Translation Offset", | ||
846 | resource->ext_address64.translation_offset); | ||
847 | |||
848 | acpi_rs_out_integer64("Address Length", | ||
849 | resource->ext_address64.address_length); | ||
850 | |||
851 | acpi_rs_out_integer64("Type-Specific Attribute", | ||
852 | resource->ext_address64.type_specific_attributes); | ||
853 | } | 712 | } |
854 | 713 | ||
855 | /******************************************************************************* | 714 | static void acpi_rs_out_integer64(char *title, u64 value) |
856 | * | ||
857 | * FUNCTION: acpi_rs_dump_ext_irq | ||
858 | * | ||
859 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
860 | * | ||
861 | * RETURN: None | ||
862 | * | ||
863 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
864 | * | ||
865 | ******************************************************************************/ | ||
866 | |||
867 | void acpi_rs_dump_ext_irq(union acpi_resource_data *resource) | ||
868 | { | 715 | { |
869 | ACPI_FUNCTION_ENTRY(); | 716 | acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); |
870 | |||
871 | acpi_os_printf("Extended IRQ Resource\n"); | ||
872 | |||
873 | acpi_rs_out_string("Resource", | ||
874 | ACPI_CONSUMER == | ||
875 | resource->extended_irq. | ||
876 | producer_consumer ? "Consumer" : "Producer"); | ||
877 | |||
878 | acpi_rs_out_string("Triggering", | ||
879 | ACPI_LEVEL_SENSITIVE == | ||
880 | resource->extended_irq. | ||
881 | triggering ? "Level" : "Edge"); | ||
882 | |||
883 | acpi_rs_out_string("Active", | ||
884 | ACPI_ACTIVE_LOW == resource->extended_irq.polarity ? | ||
885 | "Low" : "High"); | ||
886 | |||
887 | acpi_rs_out_string("Sharing", | ||
888 | ACPI_SHARED == resource->extended_irq.sharable ? | ||
889 | "Shared" : "Exclusive"); | ||
890 | |||
891 | acpi_rs_dump_resource_source(&resource->extended_irq.resource_source); | ||
892 | |||
893 | acpi_rs_out_integer8("Interrupts", | ||
894 | (u8) resource->extended_irq.interrupt_count); | ||
895 | |||
896 | acpi_rs_dump_dword_list(resource->extended_irq.interrupt_count, | ||
897 | resource->extended_irq.interrupts); | ||
898 | } | 717 | } |
899 | 718 | ||
900 | /******************************************************************************* | 719 | static void acpi_rs_out_title(char *title) |
901 | * | ||
902 | * FUNCTION: acpi_rs_dump_generic_reg | ||
903 | * | ||
904 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
905 | * | ||
906 | * RETURN: None | ||
907 | * | ||
908 | * DESCRIPTION: Dump the field names and values of the resource descriptor | ||
909 | * | ||
910 | ******************************************************************************/ | ||
911 | |||
912 | void acpi_rs_dump_generic_reg(union acpi_resource_data *resource) | ||
913 | { | 720 | { |
914 | ACPI_FUNCTION_ENTRY(); | 721 | acpi_os_printf("%27s : ", title); |
915 | |||
916 | acpi_os_printf("Generic Register Resource\n"); | ||
917 | |||
918 | acpi_rs_out_integer8("Space ID", (u8) resource->generic_reg.space_id); | ||
919 | |||
920 | acpi_rs_out_integer8("Bit Width", (u8) resource->generic_reg.bit_width); | ||
921 | |||
922 | acpi_rs_out_integer8("Bit Offset", | ||
923 | (u8) resource->generic_reg.bit_offset); | ||
924 | |||
925 | acpi_rs_out_integer8("Access Size", | ||
926 | (u8) resource->generic_reg.access_size); | ||
927 | |||
928 | acpi_rs_out_integer64("Address", resource->generic_reg.address); | ||
929 | } | 722 | } |
930 | 723 | ||
931 | /******************************************************************************* | 724 | /******************************************************************************* |
932 | * | 725 | * |
933 | * FUNCTION: acpi_rs_dump_end_dpf | 726 | * FUNCTION: acpi_rs_dump*List |
934 | * | 727 | * |
935 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | 728 | * PARAMETERS: Length - Number of elements in the list |
729 | * Data - Start of the list | ||
936 | * | 730 | * |
937 | * RETURN: None | 731 | * RETURN: None |
938 | * | 732 | * |
939 | * DESCRIPTION: Print type, no data. | 733 | * DESCRIPTION: Miscellaneous functions to dump lists of raw data |
940 | * | 734 | * |
941 | ******************************************************************************/ | 735 | ******************************************************************************/ |
942 | 736 | ||
943 | void acpi_rs_dump_end_dpf(union acpi_resource_data *resource) | 737 | static void acpi_rs_dump_byte_list(u16 length, u8 * data) |
944 | { | 738 | { |
945 | ACPI_FUNCTION_ENTRY(); | 739 | u8 i; |
946 | 740 | ||
947 | acpi_os_printf("end_dependent_functions Resource\n"); | 741 | for (i = 0; i < length; i++) { |
742 | acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); | ||
743 | } | ||
948 | } | 744 | } |
949 | 745 | ||
950 | /******************************************************************************* | 746 | static void acpi_rs_dump_short_byte_list(u8 length, u8 * data) |
951 | * | ||
952 | * FUNCTION: acpi_rs_dump_end_tag | ||
953 | * | ||
954 | * PARAMETERS: Resource - Pointer to an internal resource descriptor | ||
955 | * | ||
956 | * RETURN: None | ||
957 | * | ||
958 | * DESCRIPTION: Print type, no data. | ||
959 | * | ||
960 | ******************************************************************************/ | ||
961 | |||
962 | void acpi_rs_dump_end_tag(union acpi_resource_data *resource) | ||
963 | { | 747 | { |
964 | ACPI_FUNCTION_ENTRY(); | 748 | u8 i; |
965 | 749 | ||
966 | acpi_os_printf("end_tag Resource\n"); | 750 | for (i = 0; i < length; i++) { |
751 | acpi_os_printf("%X ", data[i]); | ||
752 | } | ||
753 | acpi_os_printf("\n"); | ||
967 | } | 754 | } |
968 | 755 | ||
969 | /******************************************************************************* | 756 | static void acpi_rs_dump_dword_list(u8 length, u32 * data) |
970 | * | ||
971 | * FUNCTION: acpi_rs_dump_irq_list | ||
972 | * | ||
973 | * PARAMETERS: route_table - Pointer to the routing table to dump. | ||
974 | * | ||
975 | * RETURN: None | ||
976 | * | ||
977 | * DESCRIPTION: Print IRQ routing table | ||
978 | * | ||
979 | ******************************************************************************/ | ||
980 | |||
981 | void acpi_rs_dump_irq_list(u8 * route_table) | ||
982 | { | 757 | { |
983 | u8 *buffer = route_table; | 758 | u8 i; |
984 | u8 count = 0; | ||
985 | struct acpi_pci_routing_table *prt_element; | ||
986 | |||
987 | ACPI_FUNCTION_ENTRY(); | ||
988 | 759 | ||
989 | if (!(acpi_dbg_level & ACPI_LV_RESOURCES) | 760 | for (i = 0; i < length; i++) { |
990 | || !(_COMPONENT & acpi_dbg_layer)) { | 761 | acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]); |
991 | return; | ||
992 | } | ||
993 | |||
994 | prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); | ||
995 | |||
996 | /* Dump all table elements, Exit on null length element */ | ||
997 | |||
998 | while (prt_element->length) { | ||
999 | acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", | ||
1000 | count); | ||
1001 | |||
1002 | acpi_rs_out_integer64("Address", prt_element->address); | ||
1003 | |||
1004 | acpi_rs_out_integer32("Pin", prt_element->pin); | ||
1005 | acpi_rs_out_string("Source", prt_element->source); | ||
1006 | acpi_rs_out_integer32("Source Index", | ||
1007 | prt_element->source_index); | ||
1008 | |||
1009 | buffer += prt_element->length; | ||
1010 | prt_element = | ||
1011 | ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); | ||
1012 | count++; | ||
1013 | } | 762 | } |
1014 | } | 763 | } |
1015 | 764 | ||
diff --git a/drivers/acpi/resources/rsinfo.c b/drivers/acpi/resources/rsinfo.c index b31cb33ec565..973fc2834cbb 100644 --- a/drivers/acpi/resources/rsinfo.c +++ b/drivers/acpi/resources/rsinfo.c | |||
@@ -58,60 +58,60 @@ ACPI_MODULE_NAME("rsinfo") | |||
58 | * descriptors are indexed by the acpi_resource_type field. | 58 | * descriptors are indexed by the acpi_resource_type field. |
59 | */ | 59 | */ |
60 | /* Dispatch table for resource-to-AML (Set Resource) conversion functions */ | 60 | /* Dispatch table for resource-to-AML (Set Resource) conversion functions */ |
61 | ACPI_SET_RESOURCE_HANDLER acpi_gbl_set_resource_dispatch[] = { | 61 | struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = { |
62 | acpi_rs_set_irq, /* 0x00, ACPI_RESOURCE_TYPE_IRQ */ | 62 | acpi_rs_set_irq, /* 0x00, ACPI_RESOURCE_TYPE_IRQ */ |
63 | acpi_rs_set_dma, /* 0x01, ACPI_RESOURCE_TYPE_DMA */ | 63 | acpi_rs_convert_dma, /* 0x01, ACPI_RESOURCE_TYPE_DMA */ |
64 | acpi_rs_set_start_dpf, /* 0x02, ACPI_RESOURCE_TYPE_START_DEPENDENT */ | 64 | acpi_rs_set_start_dpf, /* 0x02, ACPI_RESOURCE_TYPE_START_DEPENDENT */ |
65 | acpi_rs_set_end_dpf, /* 0x03, ACPI_RESOURCE_TYPE_END_DEPENDENT */ | 65 | acpi_rs_convert_end_dpf, /* 0x03, ACPI_RESOURCE_TYPE_END_DEPENDENT */ |
66 | acpi_rs_set_io, /* 0x04, ACPI_RESOURCE_TYPE_IO */ | 66 | acpi_rs_convert_io, /* 0x04, ACPI_RESOURCE_TYPE_IO */ |
67 | acpi_rs_set_fixed_io, /* 0x05, ACPI_RESOURCE_TYPE_FIXED_IO */ | 67 | acpi_rs_convert_fixed_io, /* 0x05, ACPI_RESOURCE_TYPE_FIXED_IO */ |
68 | acpi_rs_set_vendor, /* 0x06, ACPI_RESOURCE_TYPE_VENDOR */ | 68 | acpi_rs_set_vendor, /* 0x06, ACPI_RESOURCE_TYPE_VENDOR */ |
69 | acpi_rs_set_end_tag, /* 0x07, ACPI_RESOURCE_TYPE_END_TAG */ | 69 | acpi_rs_convert_end_tag, /* 0x07, ACPI_RESOURCE_TYPE_END_TAG */ |
70 | acpi_rs_set_memory24, /* 0x08, ACPI_RESOURCE_TYPE_MEMORY24 */ | 70 | acpi_rs_convert_memory24, /* 0x08, ACPI_RESOURCE_TYPE_MEMORY24 */ |
71 | acpi_rs_set_memory32, /* 0x09, ACPI_RESOURCE_TYPE_MEMORY32 */ | 71 | acpi_rs_convert_memory32, /* 0x09, ACPI_RESOURCE_TYPE_MEMORY32 */ |
72 | acpi_rs_set_fixed_memory32, /* 0x0A, ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */ | 72 | acpi_rs_convert_fixed_memory32, /* 0x0A, ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */ |
73 | acpi_rs_set_address16, /* 0x0B, ACPI_RESOURCE_TYPE_ADDRESS16 */ | 73 | acpi_rs_convert_address16, /* 0x0B, ACPI_RESOURCE_TYPE_ADDRESS16 */ |
74 | acpi_rs_set_address32, /* 0x0C, ACPI_RESOURCE_TYPE_ADDRESS32 */ | 74 | acpi_rs_convert_address32, /* 0x0C, ACPI_RESOURCE_TYPE_ADDRESS32 */ |
75 | acpi_rs_set_address64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */ | 75 | acpi_rs_convert_address64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */ |
76 | acpi_rs_set_ext_address64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ | 76 | acpi_rs_convert_ext_address64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ |
77 | acpi_rs_set_ext_irq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ | 77 | acpi_rs_convert_ext_irq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ |
78 | acpi_rs_set_generic_reg /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ | 78 | acpi_rs_convert_generic_reg /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ |
79 | }; | 79 | }; |
80 | 80 | ||
81 | /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */ | 81 | /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */ |
82 | 82 | ||
83 | ACPI_GET_RESOURCE_HANDLER acpi_gbl_sm_get_resource_dispatch[] = { | 83 | struct acpi_rsconvert_info *acpi_gbl_sm_get_resource_dispatch[] = { |
84 | NULL, /* 0x00, Reserved */ | 84 | NULL, /* 0x00, Reserved */ |
85 | NULL, /* 0x01, Reserved */ | 85 | NULL, /* 0x01, Reserved */ |
86 | NULL, /* 0x02, Reserved */ | 86 | NULL, /* 0x02, Reserved */ |
87 | NULL, /* 0x03, Reserved */ | 87 | NULL, /* 0x03, Reserved */ |
88 | acpi_rs_get_irq, /* 0x04, ACPI_RESOURCE_NAME_IRQ */ | 88 | acpi_rs_get_irq, /* 0x04, ACPI_RESOURCE_NAME_IRQ */ |
89 | acpi_rs_get_dma, /* 0x05, ACPI_RESOURCE_NAME_DMA */ | 89 | acpi_rs_convert_dma, /* 0x05, ACPI_RESOURCE_NAME_DMA */ |
90 | acpi_rs_get_start_dpf, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ | 90 | acpi_rs_get_start_dpf, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ |
91 | acpi_rs_get_end_dpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ | 91 | acpi_rs_convert_end_dpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ |
92 | acpi_rs_get_io, /* 0x08, ACPI_RESOURCE_NAME_IO */ | 92 | acpi_rs_convert_io, /* 0x08, ACPI_RESOURCE_NAME_IO */ |
93 | acpi_rs_get_fixed_io, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */ | 93 | acpi_rs_convert_fixed_io, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */ |
94 | NULL, /* 0x0A, Reserved */ | 94 | NULL, /* 0x0A, Reserved */ |
95 | NULL, /* 0x0B, Reserved */ | 95 | NULL, /* 0x0B, Reserved */ |
96 | NULL, /* 0x0C, Reserved */ | 96 | NULL, /* 0x0C, Reserved */ |
97 | NULL, /* 0x0D, Reserved */ | 97 | NULL, /* 0x0D, Reserved */ |
98 | acpi_rs_get_vendor, /* 0x0E, ACPI_RESOURCE_NAME_VENDOR_SMALL */ | 98 | acpi_rs_get_vendor_small, /* 0x0E, ACPI_RESOURCE_NAME_VENDOR_SMALL */ |
99 | acpi_rs_get_end_tag /* 0x0F, ACPI_RESOURCE_NAME_END_TAG */ | 99 | acpi_rs_convert_end_tag /* 0x0F, ACPI_RESOURCE_NAME_END_TAG */ |
100 | }; | 100 | }; |
101 | 101 | ||
102 | ACPI_GET_RESOURCE_HANDLER acpi_gbl_lg_get_resource_dispatch[] = { | 102 | struct acpi_rsconvert_info *acpi_gbl_lg_get_resource_dispatch[] = { |
103 | NULL, /* 0x00, Reserved */ | 103 | NULL, /* 0x00, Reserved */ |
104 | acpi_rs_get_memory24, /* 0x01, ACPI_RESOURCE_NAME_MEMORY24 */ | 104 | acpi_rs_convert_memory24, /* 0x01, ACPI_RESOURCE_NAME_MEMORY24 */ |
105 | acpi_rs_get_generic_reg, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ | 105 | acpi_rs_convert_generic_reg, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ |
106 | NULL, /* 0x03, Reserved */ | 106 | NULL, /* 0x03, Reserved */ |
107 | acpi_rs_get_vendor, /* 0x04, ACPI_RESOURCE_NAME_VENDOR_LARGE */ | 107 | acpi_rs_get_vendor_large, /* 0x04, ACPI_RESOURCE_NAME_VENDOR_LARGE */ |
108 | acpi_rs_get_memory32, /* 0x05, ACPI_RESOURCE_NAME_MEMORY32 */ | 108 | acpi_rs_convert_memory32, /* 0x05, ACPI_RESOURCE_NAME_MEMORY32 */ |
109 | acpi_rs_get_fixed_memory32, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY32 */ | 109 | acpi_rs_convert_fixed_memory32, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY32 */ |
110 | acpi_rs_get_address32, /* 0x07, ACPI_RESOURCE_NAME_ADDRESS32 */ | 110 | acpi_rs_convert_address32, /* 0x07, ACPI_RESOURCE_NAME_ADDRESS32 */ |
111 | acpi_rs_get_address16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */ | 111 | acpi_rs_convert_address16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */ |
112 | acpi_rs_get_ext_irq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */ | 112 | acpi_rs_convert_ext_irq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */ |
113 | acpi_rs_get_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */ | 113 | acpi_rs_convert_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */ |
114 | acpi_rs_get_ext_address64 /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */ | 114 | acpi_rs_convert_ext_address64 /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */ |
115 | }; | 115 | }; |
116 | 116 | ||
117 | #ifdef ACPI_FUTURE_USAGE | 117 | #ifdef ACPI_FUTURE_USAGE |
@@ -119,7 +119,7 @@ ACPI_GET_RESOURCE_HANDLER acpi_gbl_lg_get_resource_dispatch[] = { | |||
119 | 119 | ||
120 | /* Dispatch table for resource dump functions */ | 120 | /* Dispatch table for resource dump functions */ |
121 | 121 | ||
122 | ACPI_DUMP_RESOURCE_HANDLER acpi_gbl_dump_resource_dispatch[] = { | 122 | struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = { |
123 | acpi_rs_dump_irq, /* ACPI_RESOURCE_TYPE_IRQ */ | 123 | acpi_rs_dump_irq, /* ACPI_RESOURCE_TYPE_IRQ */ |
124 | acpi_rs_dump_dma, /* ACPI_RESOURCE_TYPE_DMA */ | 124 | acpi_rs_dump_dma, /* ACPI_RESOURCE_TYPE_DMA */ |
125 | acpi_rs_dump_start_dpf, /* ACPI_RESOURCE_TYPE_START_DEPENDENT */ | 125 | acpi_rs_dump_start_dpf, /* ACPI_RESOURCE_TYPE_START_DEPENDENT */ |
@@ -136,17 +136,17 @@ ACPI_DUMP_RESOURCE_HANDLER acpi_gbl_dump_resource_dispatch[] = { | |||
136 | acpi_rs_dump_address64, /* ACPI_RESOURCE_TYPE_ADDRESS64 */ | 136 | acpi_rs_dump_address64, /* ACPI_RESOURCE_TYPE_ADDRESS64 */ |
137 | acpi_rs_dump_ext_address64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ | 137 | acpi_rs_dump_ext_address64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */ |
138 | acpi_rs_dump_ext_irq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ | 138 | acpi_rs_dump_ext_irq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */ |
139 | acpi_rs_dump_generic_reg /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ | 139 | acpi_rs_dump_generic_reg, /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */ |
140 | }; | 140 | }; |
141 | |||
141 | #endif | 142 | #endif |
142 | #endif /* ACPI_FUTURE_USAGE */ | 143 | #endif /* ACPI_FUTURE_USAGE */ |
143 | |||
144 | /* | 144 | /* |
145 | * Base sizes for external AML resource descriptors, indexed by internal type. | 145 | * Base sizes for external AML resource descriptors, indexed by internal type. |
146 | * Includes size of the descriptor header (1 byte for small descriptors, | 146 | * Includes size of the descriptor header (1 byte for small descriptors, |
147 | * 3 bytes for large descriptors) | 147 | * 3 bytes for large descriptors) |
148 | */ | 148 | */ |
149 | u8 acpi_gbl_aml_resource_sizes[] = { | 149 | const u8 acpi_gbl_aml_resource_sizes[] = { |
150 | sizeof(struct aml_resource_irq), /* ACPI_RESOURCE_TYPE_IRQ (optional Byte 3 always created) */ | 150 | sizeof(struct aml_resource_irq), /* ACPI_RESOURCE_TYPE_IRQ (optional Byte 3 always created) */ |
151 | sizeof(struct aml_resource_dma), /* ACPI_RESOURCE_TYPE_DMA */ | 151 | sizeof(struct aml_resource_dma), /* ACPI_RESOURCE_TYPE_DMA */ |
152 | sizeof(struct aml_resource_start_dependent), /* ACPI_RESOURCE_TYPE_START_DEPENDENT (optional Byte 1 always created) */ | 152 | sizeof(struct aml_resource_start_dependent), /* ACPI_RESOURCE_TYPE_START_DEPENDENT (optional Byte 1 always created) */ |
@@ -168,8 +168,8 @@ u8 acpi_gbl_aml_resource_sizes[] = { | |||
168 | 168 | ||
169 | /* Macros used in the tables below */ | 169 | /* Macros used in the tables below */ |
170 | 170 | ||
171 | #define ACPI_RLARGE(r) sizeof (r) - sizeof (struct aml_resource_large_header) | 171 | #define ACPI_RLARGE(r) (sizeof (r) - sizeof (struct aml_resource_large_header)) |
172 | #define ACPI_RSMALL(r) sizeof (r) - sizeof (struct aml_resource_small_header) | 172 | #define ACPI_RSMALL(r) (sizeof (r) - sizeof (struct aml_resource_small_header)) |
173 | 173 | ||
174 | /* | 174 | /* |
175 | * Base sizes of resource descriptors, both the AML stream resource length | 175 | * Base sizes of resource descriptors, both the AML stream resource length |
@@ -182,47 +182,46 @@ struct acpi_resource_info acpi_gbl_sm_resource_info[] = { | |||
182 | {0, 0, 0}, | 182 | {0, 0, 0}, |
183 | {0, 0, 0}, | 183 | {0, 0, 0}, |
184 | {2, ACPI_RSMALL(struct aml_resource_irq), | 184 | {2, ACPI_RSMALL(struct aml_resource_irq), |
185 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_irq)}, | 185 | ACPI_RS_SIZE(struct acpi_resource_irq)}, |
186 | {0, ACPI_RSMALL(struct aml_resource_dma), | 186 | {0, ACPI_RSMALL(struct aml_resource_dma), |
187 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma)}, | 187 | ACPI_RS_SIZE(struct acpi_resource_dma)}, |
188 | {2, ACPI_RSMALL(struct aml_resource_start_dependent), | 188 | {2, ACPI_RSMALL(struct aml_resource_start_dependent), |
189 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_start_dependent)}, | 189 | ACPI_RS_SIZE(struct acpi_resource_start_dependent)}, |
190 | {0, ACPI_RSMALL(struct aml_resource_end_dependent), | 190 | {0, ACPI_RSMALL(struct aml_resource_end_dependent), ACPI_RS_SIZE_MIN}, |
191 | ACPI_RESOURCE_LENGTH}, | ||
192 | {0, ACPI_RSMALL(struct aml_resource_io), | 191 | {0, ACPI_RSMALL(struct aml_resource_io), |
193 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_io)}, | 192 | ACPI_RS_SIZE(struct acpi_resource_io)}, |
194 | {0, ACPI_RSMALL(struct aml_resource_fixed_io), | 193 | {0, ACPI_RSMALL(struct aml_resource_fixed_io), |
195 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io)}, | 194 | ACPI_RS_SIZE(struct acpi_resource_fixed_io)}, |
196 | {0, 0, 0}, | 195 | {0, 0, 0}, |
197 | {0, 0, 0}, | 196 | {0, 0, 0}, |
198 | {0, 0, 0}, | 197 | {0, 0, 0}, |
199 | {0, 0, 0}, | 198 | {0, 0, 0}, |
200 | {1, ACPI_RSMALL(struct aml_resource_vendor_small), | 199 | {1, ACPI_RSMALL(struct aml_resource_vendor_small), |
201 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor)}, | 200 | ACPI_RS_SIZE(struct acpi_resource_vendor)}, |
202 | {0, ACPI_RSMALL(struct aml_resource_end_tag), ACPI_RESOURCE_LENGTH} | 201 | {0, ACPI_RSMALL(struct aml_resource_end_tag), ACPI_RS_SIZE_MIN} |
203 | }; | 202 | }; |
204 | 203 | ||
205 | struct acpi_resource_info acpi_gbl_lg_resource_info[] = { | 204 | struct acpi_resource_info acpi_gbl_lg_resource_info[] = { |
206 | {0, 0, 0}, | 205 | {0, 0, 0}, |
207 | {0, ACPI_RLARGE(struct aml_resource_memory24), | 206 | {0, ACPI_RLARGE(struct aml_resource_memory24), |
208 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_memory24)}, | 207 | ACPI_RS_SIZE(struct acpi_resource_memory24)}, |
209 | {0, ACPI_RLARGE(struct aml_resource_generic_register), | 208 | {0, ACPI_RLARGE(struct aml_resource_generic_register), |
210 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_generic_register)}, | 209 | ACPI_RS_SIZE(struct acpi_resource_generic_register)}, |
211 | {0, 0, 0}, | 210 | {0, 0, 0}, |
212 | {1, ACPI_RLARGE(struct aml_resource_vendor_large), | 211 | {1, ACPI_RLARGE(struct aml_resource_vendor_large), |
213 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor)}, | 212 | ACPI_RS_SIZE(struct acpi_resource_vendor)}, |
214 | {0, ACPI_RLARGE(struct aml_resource_memory32), | 213 | {0, ACPI_RLARGE(struct aml_resource_memory32), |
215 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_memory32)}, | 214 | ACPI_RS_SIZE(struct acpi_resource_memory32)}, |
216 | {0, ACPI_RLARGE(struct aml_resource_fixed_memory32), | 215 | {0, ACPI_RLARGE(struct aml_resource_fixed_memory32), |
217 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_memory32)}, | 216 | ACPI_RS_SIZE(struct acpi_resource_fixed_memory32)}, |
218 | {1, ACPI_RLARGE(struct aml_resource_address32), | 217 | {1, ACPI_RLARGE(struct aml_resource_address32), |
219 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32)}, | 218 | ACPI_RS_SIZE(struct acpi_resource_address32)}, |
220 | {1, ACPI_RLARGE(struct aml_resource_address16), | 219 | {1, ACPI_RLARGE(struct aml_resource_address16), |
221 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16)}, | 220 | ACPI_RS_SIZE(struct acpi_resource_address16)}, |
222 | {1, ACPI_RLARGE(struct aml_resource_extended_irq), | 221 | {1, ACPI_RLARGE(struct aml_resource_extended_irq), |
223 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_irq)}, | 222 | ACPI_RS_SIZE(struct acpi_resource_extended_irq)}, |
224 | {1, ACPI_RLARGE(struct aml_resource_address64), | 223 | {1, ACPI_RLARGE(struct aml_resource_address64), |
225 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64)}, | 224 | ACPI_RS_SIZE(struct acpi_resource_address64)}, |
226 | {0, ACPI_RLARGE(struct aml_resource_extended_address64), | 225 | {0, ACPI_RLARGE(struct aml_resource_extended_address64), |
227 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_address64)} | 226 | ACPI_RS_SIZE(struct acpi_resource_extended_address64)} |
228 | }; | 227 | }; |
diff --git a/drivers/acpi/resources/rsio.c b/drivers/acpi/resources/rsio.c index 0dab8cdfa800..ef24ba110c6e 100644 --- a/drivers/acpi/resources/rsio.c +++ b/drivers/acpi/resources/rsio.c | |||
@@ -49,269 +49,206 @@ ACPI_MODULE_NAME("rsio") | |||
49 | 49 | ||
50 | /******************************************************************************* | 50 | /******************************************************************************* |
51 | * | 51 | * |
52 | * FUNCTION: acpi_rs_get_io | 52 | * acpi_rs_convert_io |
53 | * | ||
54 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
55 | * aml_resource_length - Length of the resource from the AML header | ||
56 | * Resource - Where the internal resource is returned | ||
57 | * | ||
58 | * RETURN: Status | ||
59 | * | ||
60 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
61 | * internal resource descriptor, simplifying bitflags and handling | ||
62 | * alignment and endian issues if necessary. | ||
63 | * | 53 | * |
64 | ******************************************************************************/ | 54 | ******************************************************************************/ |
65 | acpi_status | 55 | struct acpi_rsconvert_info acpi_rs_convert_io[5] = { |
66 | acpi_rs_get_io(union aml_resource *aml, | 56 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO, |
67 | u16 aml_resource_length, struct acpi_resource *resource) | 57 | ACPI_RS_SIZE(struct acpi_resource_io), |
68 | { | 58 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)}, |
69 | ACPI_FUNCTION_TRACE("rs_get_io"); | ||
70 | 59 | ||
71 | /* Get the Decode flag */ | 60 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO, |
61 | sizeof(struct aml_resource_io), | ||
62 | 0}, | ||
72 | 63 | ||
73 | resource->data.io.io_decode = aml->io.information & 0x01; | 64 | /* Decode flag */ |
74 | 65 | ||
66 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode), | ||
67 | AML_OFFSET(io.flags), | ||
68 | 0}, | ||
75 | /* | 69 | /* |
76 | * Get the following contiguous fields from the AML descriptor: | 70 | * These fields are contiguous in both the source and destination: |
77 | * Minimum Base Address | ||
78 | * Maximum Base Address | ||
79 | * Address Alignment | 71 | * Address Alignment |
80 | * Length | 72 | * Length |
73 | * Minimum Base Address | ||
74 | * Maximum Base Address | ||
81 | */ | 75 | */ |
82 | ACPI_MOVE_16_TO_32(&resource->data.io.minimum, &aml->io.minimum); | 76 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment), |
83 | ACPI_MOVE_16_TO_32(&resource->data.io.maximum, &aml->io.maximum); | 77 | AML_OFFSET(io.alignment), |
84 | resource->data.io.alignment = aml->io.alignment; | 78 | 2}, |
85 | resource->data.io.address_length = aml->io.address_length; | ||
86 | |||
87 | /* Complete the resource header */ | ||
88 | 79 | ||
89 | resource->type = ACPI_RESOURCE_TYPE_IO; | 80 | {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum), |
90 | resource->length = ACPI_SIZEOF_RESOURCE(struct acpi_resource_io); | 81 | AML_OFFSET(io.minimum), |
91 | return_ACPI_STATUS(AE_OK); | 82 | 2} |
92 | } | 83 | }; |
93 | 84 | ||
94 | /******************************************************************************* | 85 | /******************************************************************************* |
95 | * | 86 | * |
96 | * FUNCTION: acpi_rs_set_io | 87 | * acpi_rs_convert_fixed_io |
97 | * | ||
98 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
99 | * Aml - Where the AML descriptor is returned | ||
100 | * | ||
101 | * RETURN: Status | ||
102 | * | ||
103 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
104 | * external AML resource descriptor. | ||
105 | * | 88 | * |
106 | ******************************************************************************/ | 89 | ******************************************************************************/ |
107 | 90 | ||
108 | acpi_status | 91 | struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = { |
109 | acpi_rs_set_io(struct acpi_resource *resource, union aml_resource *aml) | 92 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO, |
110 | { | 93 | ACPI_RS_SIZE(struct acpi_resource_fixed_io), |
111 | ACPI_FUNCTION_TRACE("rs_set_io"); | 94 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)}, |
112 | |||
113 | /* I/O Information Byte */ | ||
114 | |||
115 | aml->io.information = (u8) (resource->data.io.io_decode & 0x01); | ||
116 | 95 | ||
96 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO, | ||
97 | sizeof(struct aml_resource_fixed_io), | ||
98 | 0}, | ||
117 | /* | 99 | /* |
118 | * Set the following contiguous fields in the AML descriptor: | 100 | * These fields are contiguous in both the source and destination: |
119 | * Minimum Base Address | 101 | * Base Address |
120 | * Maximum Base Address | ||
121 | * Address Alignment | ||
122 | * Length | 102 | * Length |
123 | */ | 103 | */ |
124 | ACPI_MOVE_32_TO_16(&aml->io.minimum, &resource->data.io.minimum); | 104 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length), |
125 | ACPI_MOVE_32_TO_16(&aml->io.maximum, &resource->data.io.maximum); | 105 | AML_OFFSET(fixed_io.address_length), |
126 | aml->io.alignment = (u8) resource->data.io.alignment; | 106 | 1}, |
127 | aml->io.address_length = (u8) resource->data.io.address_length; | ||
128 | |||
129 | /* Complete the AML descriptor header */ | ||
130 | 107 | ||
131 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_IO, | 108 | {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address), |
132 | sizeof(struct aml_resource_io), aml); | 109 | AML_OFFSET(fixed_io.address), |
133 | return_ACPI_STATUS(AE_OK); | 110 | 1} |
134 | } | 111 | }; |
135 | 112 | ||
136 | /******************************************************************************* | 113 | /******************************************************************************* |
137 | * | 114 | * |
138 | * FUNCTION: acpi_rs_get_fixed_io | 115 | * acpi_rs_convert_generic_reg |
139 | * | ||
140 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
141 | * aml_resource_length - Length of the resource from the AML header | ||
142 | * Resource - Where the internal resource is returned | ||
143 | * | ||
144 | * RETURN: Status | ||
145 | * | ||
146 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
147 | * internal resource descriptor, simplifying bitflags and handling | ||
148 | * alignment and endian issues if necessary. | ||
149 | * | 116 | * |
150 | ******************************************************************************/ | 117 | ******************************************************************************/ |
151 | 118 | ||
152 | acpi_status | 119 | struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = { |
153 | acpi_rs_get_fixed_io(union aml_resource *aml, | 120 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER, |
154 | u16 aml_resource_length, struct acpi_resource *resource) | 121 | ACPI_RS_SIZE(struct acpi_resource_generic_register), |
155 | { | 122 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)}, |
156 | ACPI_FUNCTION_TRACE("rs_get_fixed_io"); | ||
157 | 123 | ||
124 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER, | ||
125 | sizeof(struct aml_resource_generic_register), | ||
126 | 0}, | ||
158 | /* | 127 | /* |
159 | * Get the following contiguous fields from the AML descriptor: | 128 | * These fields are contiguous in both the source and destination: |
160 | * Base Address | 129 | * Address Space ID |
161 | * Length | 130 | * Register Bit Width |
131 | * Register Bit Offset | ||
132 | * Access Size | ||
162 | */ | 133 | */ |
163 | ACPI_MOVE_16_TO_32(&resource->data.fixed_io.address, | 134 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id), |
164 | &aml->fixed_io.address); | 135 | AML_OFFSET(generic_reg.address_space_id), |
165 | resource->data.fixed_io.address_length = aml->fixed_io.address_length; | 136 | 4}, |
166 | 137 | ||
167 | /* Complete the resource header */ | 138 | /* Get the Register Address */ |
168 | 139 | ||
169 | resource->type = ACPI_RESOURCE_TYPE_FIXED_IO; | 140 | {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address), |
170 | resource->length = ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io); | 141 | AML_OFFSET(generic_reg.address), |
171 | return_ACPI_STATUS(AE_OK); | 142 | 1} |
172 | } | 143 | }; |
173 | 144 | ||
174 | /******************************************************************************* | 145 | /******************************************************************************* |
175 | * | 146 | * |
176 | * FUNCTION: acpi_rs_set_fixed_io | 147 | * acpi_rs_convert_end_dpf |
177 | * | ||
178 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
179 | * Aml - Where the AML descriptor is returned | ||
180 | * | 148 | * |
181 | * RETURN: Status | 149 | ******************************************************************************/ |
150 | |||
151 | struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = { | ||
152 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT, | ||
153 | ACPI_RS_SIZE_MIN, | ||
154 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)}, | ||
155 | |||
156 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT, | ||
157 | sizeof(struct aml_resource_end_dependent), | ||
158 | 0} | ||
159 | }; | ||
160 | |||
161 | /******************************************************************************* | ||
182 | * | 162 | * |
183 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | 163 | * acpi_rs_convert_end_tag |
184 | * external AML resource descriptor. | ||
185 | * | 164 | * |
186 | ******************************************************************************/ | 165 | ******************************************************************************/ |
187 | 166 | ||
188 | acpi_status | 167 | struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = { |
189 | acpi_rs_set_fixed_io(struct acpi_resource *resource, union aml_resource *aml) | 168 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG, |
190 | { | 169 | ACPI_RS_SIZE_MIN, |
191 | ACPI_FUNCTION_TRACE("rs_set_fixed_io"); | 170 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)}, |
192 | 171 | ||
193 | /* | 172 | /* |
194 | * Set the following contiguous fields in the AML descriptor: | 173 | * Note: The checksum field is set to zero, meaning that the resource |
195 | * Base Address | 174 | * data is treated as if the checksum operation succeeded. |
196 | * Length | 175 | * (ACPI Spec 1.0b Section 6.4.2.8) |
197 | */ | 176 | */ |
198 | ACPI_MOVE_32_TO_16(&aml->fixed_io.address, | 177 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG, |
199 | &resource->data.fixed_io.address); | 178 | sizeof(struct aml_resource_end_tag), |
200 | aml->fixed_io.address_length = | 179 | 0} |
201 | (u8) resource->data.fixed_io.address_length; | 180 | }; |
202 | |||
203 | /* Complete the AML descriptor header */ | ||
204 | |||
205 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_FIXED_IO, | ||
206 | sizeof(struct aml_resource_fixed_io), aml); | ||
207 | return_ACPI_STATUS(AE_OK); | ||
208 | } | ||
209 | 181 | ||
210 | /******************************************************************************* | 182 | /******************************************************************************* |
211 | * | 183 | * |
212 | * FUNCTION: acpi_rs_get_dma | 184 | * acpi_rs_get_start_dpf |
213 | * | ||
214 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
215 | * aml_resource_length - Length of the resource from the AML header | ||
216 | * Resource - Where the internal resource is returned | ||
217 | * | ||
218 | * RETURN: Status | ||
219 | * | ||
220 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
221 | * internal resource descriptor, simplifying bitflags and handling | ||
222 | * alignment and endian issues if necessary. | ||
223 | * | 185 | * |
224 | ******************************************************************************/ | 186 | ******************************************************************************/ |
225 | 187 | ||
226 | acpi_status | 188 | struct acpi_rsconvert_info acpi_rs_get_start_dpf[5] = { |
227 | acpi_rs_get_dma(union aml_resource *aml, | 189 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT, |
228 | u16 aml_resource_length, struct acpi_resource *resource) | 190 | ACPI_RS_SIZE(struct acpi_resource_start_dependent), |
229 | { | 191 | ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)}, |
230 | u32 channel_count = 0; | ||
231 | u32 i; | ||
232 | u8 temp8; | ||
233 | 192 | ||
234 | ACPI_FUNCTION_TRACE("rs_get_dma"); | 193 | /* Defaults for Compatibility and Performance priorities */ |
235 | 194 | ||
236 | /* Decode the DMA channel bits */ | 195 | {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), |
196 | ACPI_ACCEPTABLE_CONFIGURATION, | ||
197 | 2}, | ||
237 | 198 | ||
238 | for (i = 0; i < 8; i++) { | 199 | /* All done if there is no flag byte present in the descriptor */ |
239 | if ((aml->dma.dma_channel_mask >> i) & 0x01) { | ||
240 | resource->data.dma.channels[channel_count] = i; | ||
241 | channel_count++; | ||
242 | } | ||
243 | } | ||
244 | 200 | ||
245 | resource->length = 0; | 201 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1}, |
246 | resource->data.dma.channel_count = channel_count; | ||
247 | 202 | ||
248 | /* | 203 | /* Flag byte is present, get the flags */ |
249 | * Calculate the structure size based upon the number of channels | ||
250 | * Note: Zero DMA channels is valid | ||
251 | */ | ||
252 | if (channel_count > 0) { | ||
253 | resource->length = (u32) (channel_count - 1) * 4; | ||
254 | } | ||
255 | |||
256 | /* Get the flags: transfer preference, bus mastering, channel speed */ | ||
257 | 204 | ||
258 | temp8 = aml->dma.flags; | 205 | {ACPI_RSC_2BITFLAG, |
259 | resource->data.dma.transfer = temp8 & 0x03; | 206 | ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), |
260 | resource->data.dma.bus_master = (temp8 >> 2) & 0x01; | 207 | AML_OFFSET(start_dpf.flags), |
261 | resource->data.dma.type = (temp8 >> 5) & 0x03; | 208 | 0}, |
262 | 209 | ||
263 | if (resource->data.dma.transfer == 0x03) { | 210 | {ACPI_RSC_2BITFLAG, |
264 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 211 | ACPI_RS_OFFSET(data.start_dpf.performance_robustness), |
265 | "Invalid DMA.Transfer preference (3)\n")); | 212 | AML_OFFSET(start_dpf.flags), |
266 | return_ACPI_STATUS(AE_BAD_DATA); | 213 | 2} |
267 | } | 214 | }; |
268 | |||
269 | /* Complete the resource header */ | ||
270 | |||
271 | resource->type = ACPI_RESOURCE_TYPE_DMA; | ||
272 | resource->length += ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma); | ||
273 | return_ACPI_STATUS(AE_OK); | ||
274 | } | ||
275 | 215 | ||
276 | /******************************************************************************* | 216 | /******************************************************************************* |
277 | * | 217 | * |
278 | * FUNCTION: acpi_rs_set_dma | 218 | * acpi_rs_set_start_dpf |
279 | * | ||
280 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
281 | * Aml - Where the AML descriptor is returned | ||
282 | * | ||
283 | * RETURN: Status | ||
284 | * | ||
285 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
286 | * external AML resource descriptor. | ||
287 | * | 219 | * |
288 | ******************************************************************************/ | 220 | ******************************************************************************/ |
289 | 221 | ||
290 | acpi_status | 222 | struct acpi_rsconvert_info acpi_rs_set_start_dpf[6] = { |
291 | acpi_rs_set_dma(struct acpi_resource *resource, union aml_resource *aml) | 223 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT, |
292 | { | 224 | sizeof(struct aml_resource_start_dependent), |
293 | u8 i; | 225 | ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)}, |
294 | |||
295 | ACPI_FUNCTION_TRACE("rs_set_dma"); | ||
296 | 226 | ||
297 | /* Convert channel list to 8-bit DMA channel bitmask */ | 227 | /* Set the default flag values */ |
298 | 228 | ||
299 | aml->dma.dma_channel_mask = 0; | 229 | {ACPI_RSC_2BITFLAG, |
300 | for (i = 0; i < resource->data.dma.channel_count; i++) { | 230 | ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), |
301 | aml->dma.dma_channel_mask |= | 231 | AML_OFFSET(start_dpf.flags), |
302 | (1 << resource->data.dma.channels[i]); | 232 | 0}, |
303 | } | ||
304 | 233 | ||
305 | /* Set the DMA Flag bits */ | 234 | {ACPI_RSC_2BITFLAG, |
235 | ACPI_RS_OFFSET(data.start_dpf.performance_robustness), | ||
236 | AML_OFFSET(start_dpf.flags), | ||
237 | 2}, | ||
238 | /* | ||
239 | * All done if flags byte is necessary -- if either priority value | ||
240 | * is not ACPI_ACCEPTABLE_CONFIGURATION | ||
241 | */ | ||
242 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, | ||
243 | ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), | ||
244 | ACPI_ACCEPTABLE_CONFIGURATION}, | ||
306 | 245 | ||
307 | aml->dma.flags = (u8) | 246 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, |
308 | (((resource->data.dma.type & 0x03) << 5) | | 247 | ACPI_RS_OFFSET(data.start_dpf.performance_robustness), |
309 | ((resource->data.dma.bus_master & 0x01) << 2) | | 248 | ACPI_ACCEPTABLE_CONFIGURATION}, |
310 | (resource->data.dma.transfer & 0x03)); | ||
311 | 249 | ||
312 | /* Complete the AML descriptor header */ | 250 | /* Flag byte is not necessary */ |
313 | 251 | ||
314 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_DMA, | 252 | {ACPI_RSC_LENGTH, 0, 0, |
315 | sizeof(struct aml_resource_dma), aml); | 253 | sizeof(struct aml_resource_start_dependent_noprio)} |
316 | return_ACPI_STATUS(AE_OK); | 254 | }; |
317 | } | ||
diff --git a/drivers/acpi/resources/rsirq.c b/drivers/acpi/resources/rsirq.c index 4e854ba70811..79e71257b69a 100644 --- a/drivers/acpi/resources/rsirq.c +++ b/drivers/acpi/resources/rsirq.c | |||
@@ -49,325 +49,182 @@ ACPI_MODULE_NAME("rsirq") | |||
49 | 49 | ||
50 | /******************************************************************************* | 50 | /******************************************************************************* |
51 | * | 51 | * |
52 | * FUNCTION: acpi_rs_get_irq | 52 | * acpi_rs_get_irq |
53 | * | ||
54 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
55 | * aml_resource_length - Length of the resource from the AML header | ||
56 | * Resource - Where the internal resource is returned | ||
57 | * | ||
58 | * RETURN: Status | ||
59 | * | ||
60 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
61 | * internal resource descriptor, simplifying bitflags and handling | ||
62 | * alignment and endian issues if necessary. | ||
63 | * | 53 | * |
64 | ******************************************************************************/ | 54 | ******************************************************************************/ |
65 | acpi_status | 55 | struct acpi_rsconvert_info acpi_rs_get_irq[7] = { |
66 | acpi_rs_get_irq(union aml_resource *aml, | 56 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ, |
67 | u16 aml_resource_length, struct acpi_resource *resource) | 57 | ACPI_RS_SIZE(struct acpi_resource_irq), |
68 | { | 58 | ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)}, |
69 | u16 temp16 = 0; | ||
70 | u32 interrupt_count = 0; | ||
71 | u32 i; | ||
72 | u32 resource_length; | ||
73 | |||
74 | ACPI_FUNCTION_TRACE("rs_get_irq"); | ||
75 | 59 | ||
76 | /* Get the IRQ mask (bytes 1:2) */ | 60 | /* Get the IRQ mask (bytes 1:2) */ |
77 | 61 | ||
78 | ACPI_MOVE_16_TO_16(&temp16, &aml->irq.irq_mask); | 62 | {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]), |
79 | 63 | AML_OFFSET(irq.irq_mask), | |
80 | /* Decode the IRQ bits (up to 16 possible) */ | 64 | ACPI_RS_OFFSET(data.irq.interrupt_count)}, |
81 | 65 | ||
82 | for (i = 0; i < 16; i++) { | 66 | /* Set default flags (others are zero) */ |
83 | if ((temp16 >> i) & 0x01) { | 67 | |
84 | resource->data.irq.interrupts[interrupt_count] = i; | 68 | {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.irq.triggering), |
85 | interrupt_count++; | 69 | ACPI_EDGE_SENSITIVE, |
86 | } | 70 | 1}, |
87 | } | 71 | |
88 | 72 | /* All done if no flag byte present in descriptor */ | |
89 | /* Zero interrupts is valid */ | 73 | |
90 | 74 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3}, | |
91 | resource_length = 0; | 75 | |
92 | resource->data.irq.interrupt_count = interrupt_count; | 76 | /* Get flags: Triggering[0], Polarity[3], Sharing[4] */ |
93 | if (interrupt_count > 0) { | 77 | |
94 | /* Calculate the structure size based upon the number of interrupts */ | 78 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering), |
95 | 79 | AML_OFFSET(irq.flags), | |
96 | resource_length = (u32) (interrupt_count - 1) * 4; | 80 | 0}, |
97 | } | 81 | |
98 | 82 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity), | |
99 | /* Get Flags (Byte 3) if it is used */ | 83 | AML_OFFSET(irq.flags), |
100 | 84 | 3}, | |
101 | if (aml_resource_length == 3) { | 85 | |
102 | /* Check for HE, LL interrupts */ | 86 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable), |
103 | 87 | AML_OFFSET(irq.flags), | |
104 | switch (aml->irq.flags & 0x09) { | 88 | 4} |
105 | case 0x01: /* HE */ | 89 | }; |
106 | resource->data.irq.triggering = ACPI_EDGE_SENSITIVE; | ||
107 | resource->data.irq.polarity = ACPI_ACTIVE_HIGH; | ||
108 | break; | ||
109 | |||
110 | case 0x08: /* LL */ | ||
111 | resource->data.irq.triggering = ACPI_LEVEL_SENSITIVE; | ||
112 | resource->data.irq.polarity = ACPI_ACTIVE_LOW; | ||
113 | break; | ||
114 | |||
115 | default: | ||
116 | /* | ||
117 | * Only _LL and _HE polarity/trigger interrupts | ||
118 | * are allowed (ACPI spec, section "IRQ Format") | ||
119 | * so 0x00 and 0x09 are illegal. | ||
120 | */ | ||
121 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
122 | "Invalid interrupt polarity/trigger in resource list, %X\n", | ||
123 | aml->irq.flags)); | ||
124 | return_ACPI_STATUS(AE_BAD_DATA); | ||
125 | } | ||
126 | |||
127 | /* Get Sharing flag */ | ||
128 | |||
129 | resource->data.irq.sharable = (aml->irq.flags >> 3) & 0x01; | ||
130 | } else { | ||
131 | /* | ||
132 | * Default configuration: assume Edge Sensitive, Active High, | ||
133 | * Non-Sharable as per the ACPI Specification | ||
134 | */ | ||
135 | resource->data.irq.triggering = ACPI_EDGE_SENSITIVE; | ||
136 | resource->data.irq.polarity = ACPI_ACTIVE_HIGH; | ||
137 | resource->data.irq.sharable = ACPI_EXCLUSIVE; | ||
138 | } | ||
139 | |||
140 | /* Complete the resource header */ | ||
141 | |||
142 | resource->type = ACPI_RESOURCE_TYPE_IRQ; | ||
143 | resource->length = | ||
144 | resource_length + ACPI_SIZEOF_RESOURCE(struct acpi_resource_irq); | ||
145 | return_ACPI_STATUS(AE_OK); | ||
146 | } | ||
147 | 90 | ||
148 | /******************************************************************************* | 91 | /******************************************************************************* |
149 | * | 92 | * |
150 | * FUNCTION: acpi_rs_set_irq | 93 | * acpi_rs_set_irq |
151 | * | ||
152 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
153 | * Aml - Where the AML descriptor is returned | ||
154 | * | ||
155 | * RETURN: Status | ||
156 | * | ||
157 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
158 | * external AML resource descriptor. | ||
159 | * | 94 | * |
160 | ******************************************************************************/ | 95 | ******************************************************************************/ |
161 | 96 | ||
162 | acpi_status | 97 | struct acpi_rsconvert_info acpi_rs_set_irq[9] = { |
163 | acpi_rs_set_irq(struct acpi_resource *resource, union aml_resource *aml) | 98 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ, |
164 | { | 99 | sizeof(struct aml_resource_irq), |
165 | acpi_size descriptor_length; | 100 | ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)}, |
166 | u16 irq_mask; | ||
167 | u8 i; | ||
168 | |||
169 | ACPI_FUNCTION_TRACE("rs_set_irq"); | ||
170 | 101 | ||
171 | /* Convert interrupt list to 16-bit IRQ bitmask */ | 102 | /* Convert interrupt list to 16-bit IRQ bitmask */ |
172 | 103 | ||
173 | irq_mask = 0; | 104 | {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]), |
174 | for (i = 0; i < resource->data.irq.interrupt_count; i++) { | 105 | AML_OFFSET(irq.irq_mask), |
175 | irq_mask |= (1 << resource->data.irq.interrupts[i]); | 106 | ACPI_RS_OFFSET(data.irq.interrupt_count)}, |
176 | } | 107 | |
108 | /* Set the flags byte by default */ | ||
177 | 109 | ||
178 | /* Set the interrupt mask */ | 110 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering), |
111 | AML_OFFSET(irq.flags), | ||
112 | 0}, | ||
179 | 113 | ||
180 | ACPI_MOVE_16_TO_16(&aml->irq.irq_mask, &irq_mask); | 114 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity), |
115 | AML_OFFSET(irq.flags), | ||
116 | 3}, | ||
181 | 117 | ||
118 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable), | ||
119 | AML_OFFSET(irq.flags), | ||
120 | 4}, | ||
182 | /* | 121 | /* |
183 | * The descriptor field is set based upon whether a third byte is | 122 | * Check if the flags byte is necessary. Not needed if the flags are: |
184 | * needed to contain the IRQ Information. | 123 | * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE |
185 | */ | 124 | */ |
186 | if ((resource->data.irq.triggering == ACPI_EDGE_SENSITIVE) && | 125 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, |
187 | (resource->data.irq.polarity == ACPI_ACTIVE_HIGH) && | 126 | ACPI_RS_OFFSET(data.irq.triggering), |
188 | (resource->data.irq.sharable == ACPI_EXCLUSIVE)) { | 127 | ACPI_EDGE_SENSITIVE}, |
189 | /* irq_no_flags() descriptor can be used */ | ||
190 | |||
191 | descriptor_length = sizeof(struct aml_resource_irq_noflags); | ||
192 | } else { | ||
193 | /* Irq() descriptor must be used */ | ||
194 | |||
195 | descriptor_length = sizeof(struct aml_resource_irq); | ||
196 | |||
197 | /* Set the IRQ Info byte */ | ||
198 | 128 | ||
199 | aml->irq.flags = (u8) | 129 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, |
200 | ((resource->data.irq.sharable & 0x01) << 4); | 130 | ACPI_RS_OFFSET(data.irq.polarity), |
131 | ACPI_ACTIVE_HIGH}, | ||
201 | 132 | ||
202 | if (ACPI_LEVEL_SENSITIVE == resource->data.irq.triggering && | 133 | {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, |
203 | ACPI_ACTIVE_LOW == resource->data.irq.polarity) { | 134 | ACPI_RS_OFFSET(data.irq.sharable), |
204 | aml->irq.flags |= 0x08; | 135 | ACPI_EXCLUSIVE}, |
205 | } else { | ||
206 | aml->irq.flags |= 0x01; | ||
207 | } | ||
208 | } | ||
209 | 136 | ||
210 | /* Complete the AML descriptor header */ | 137 | /* irq_no_flags() descriptor can be used */ |
211 | 138 | ||
212 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_IRQ, descriptor_length, | 139 | {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)} |
213 | aml); | 140 | }; |
214 | return_ACPI_STATUS(AE_OK); | ||
215 | } | ||
216 | 141 | ||
217 | /******************************************************************************* | 142 | /******************************************************************************* |
218 | * | 143 | * |
219 | * FUNCTION: acpi_rs_get_ext_irq | 144 | * acpi_rs_convert_ext_irq |
220 | * | ||
221 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
222 | * aml_resource_length - Length of the resource from the AML header | ||
223 | * Resource - Where the internal resource is returned | ||
224 | * | ||
225 | * RETURN: Status | ||
226 | * | ||
227 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
228 | * internal resource descriptor, simplifying bitflags and handling | ||
229 | * alignment and endian issues if necessary. | ||
230 | * | 145 | * |
231 | ******************************************************************************/ | 146 | ******************************************************************************/ |
232 | 147 | ||
233 | acpi_status | 148 | struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = { |
234 | acpi_rs_get_ext_irq(union aml_resource *aml, | 149 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ, |
235 | u16 aml_resource_length, struct acpi_resource *resource) | 150 | ACPI_RS_SIZE(struct acpi_resource_extended_irq), |
236 | { | 151 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)}, |
237 | char *out_resource_string; | ||
238 | u8 temp8; | ||
239 | |||
240 | ACPI_FUNCTION_TRACE("rs_get_ext_irq"); | ||
241 | |||
242 | /* Get the flag bits */ | ||
243 | 152 | ||
244 | temp8 = aml->extended_irq.flags; | 153 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ, |
245 | resource->data.extended_irq.producer_consumer = temp8 & 0x01; | 154 | sizeof(struct aml_resource_extended_irq), |
246 | resource->data.extended_irq.polarity = (temp8 >> 2) & 0x01; | 155 | 0}, |
247 | resource->data.extended_irq.sharable = (temp8 >> 3) & 0x01; | ||
248 | 156 | ||
249 | /* | 157 | /* Flag bits */ |
250 | * Check for Interrupt Mode | ||
251 | * | ||
252 | * The definition of an Extended IRQ changed between ACPI spec v1.0b | ||
253 | * and ACPI spec 2.0 (section 6.4.3.6 in both). | ||
254 | * | ||
255 | * - Edge/Level are defined opposite in the table vs the headers | ||
256 | */ | ||
257 | resource->data.extended_irq.triggering = | ||
258 | (temp8 & 0x2) ? ACPI_EDGE_SENSITIVE : ACPI_LEVEL_SENSITIVE; | ||
259 | 158 | ||
260 | /* Get the IRQ Table length (Byte4) */ | 159 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer), |
160 | AML_OFFSET(extended_irq.flags), | ||
161 | 0}, | ||
261 | 162 | ||
262 | temp8 = aml->extended_irq.table_length; | 163 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.triggering), |
263 | resource->data.extended_irq.interrupt_count = temp8; | 164 | AML_OFFSET(extended_irq.flags), |
264 | if (temp8 < 1) { | 165 | 1}, |
265 | /* Must have at least one IRQ */ | ||
266 | 166 | ||
267 | return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); | 167 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.polarity), |
268 | } | 168 | AML_OFFSET(extended_irq.flags), |
169 | 2}, | ||
269 | 170 | ||
270 | /* | 171 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.sharable), |
271 | * Add any additional structure size to properly calculate | 172 | AML_OFFSET(extended_irq.flags), |
272 | * the next pointer at the end of this function | 173 | 3}, |
273 | */ | ||
274 | resource->length = (temp8 - 1) * 4; | ||
275 | out_resource_string = ACPI_CAST_PTR(char, | ||
276 | (&resource->data.extended_irq. | ||
277 | interrupts[0] + temp8)); | ||
278 | 174 | ||
279 | /* Get every IRQ in the table, each is 32 bits */ | 175 | /* IRQ Table length (Byte4) */ |
280 | 176 | ||
281 | acpi_rs_move_data(resource->data.extended_irq.interrupts, | 177 | {ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count), |
282 | aml->extended_irq.interrupt_number, | 178 | AML_OFFSET(extended_irq.interrupt_count), |
283 | (u16) temp8, ACPI_MOVE_TYPE_32_TO_32); | 179 | sizeof(u32)} |
180 | , | ||
284 | 181 | ||
285 | /* Get the optional resource_source (index and string) */ | 182 | /* Copy every IRQ in the table, each is 32 bits */ |
286 | 183 | ||
287 | resource->length += | 184 | {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]), |
288 | acpi_rs_get_resource_source(aml_resource_length, | 185 | AML_OFFSET(extended_irq.interrupts[0]), |
289 | (acpi_size) resource->length + | 186 | 0} |
290 | sizeof(struct | 187 | , |
291 | aml_resource_extended_irq), | ||
292 | &resource->data.extended_irq. | ||
293 | resource_source, aml, | ||
294 | out_resource_string); | ||
295 | 188 | ||
296 | /* Complete the resource header */ | 189 | /* Optional resource_source (Index and String) */ |
297 | 190 | ||
298 | resource->type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ; | 191 | {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET(data.extended_irq.resource_source), |
299 | resource->length += | 192 | ACPI_RS_OFFSET(data.extended_irq.interrupts[0]), |
300 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_irq); | 193 | sizeof(struct aml_resource_extended_irq)} |
301 | return_ACPI_STATUS(AE_OK); | 194 | }; |
302 | } | ||
303 | 195 | ||
304 | /******************************************************************************* | 196 | /******************************************************************************* |
305 | * | 197 | * |
306 | * FUNCTION: acpi_rs_set_ext_irq | 198 | * acpi_rs_convert_dma |
307 | * | ||
308 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
309 | * Aml - Where the AML descriptor is returned | ||
310 | * | ||
311 | * RETURN: Status | ||
312 | * | ||
313 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
314 | * external AML resource descriptor. | ||
315 | * | 199 | * |
316 | ******************************************************************************/ | 200 | ******************************************************************************/ |
317 | 201 | ||
318 | acpi_status | 202 | struct acpi_rsconvert_info acpi_rs_convert_dma[6] = { |
319 | acpi_rs_set_ext_irq(struct acpi_resource *resource, union aml_resource *aml) | 203 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA, |
320 | { | 204 | ACPI_RS_SIZE(struct acpi_resource_dma), |
321 | acpi_size descriptor_length; | 205 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_dma)}, |
322 | |||
323 | ACPI_FUNCTION_TRACE("rs_set_ext_irq"); | ||
324 | |||
325 | /* Set the Interrupt vector flags */ | ||
326 | |||
327 | aml->extended_irq.flags = (u8) | ||
328 | ((resource->data.extended_irq.producer_consumer & 0x01) | | ||
329 | ((resource->data.extended_irq.sharable & 0x01) << 3) | | ||
330 | ((resource->data.extended_irq.polarity & 0x1) << 2)); | ||
331 | |||
332 | /* | ||
333 | * Set the Interrupt Mode | ||
334 | * | ||
335 | * The definition of an Extended IRQ changed between ACPI spec v1.0b | ||
336 | * and ACPI spec 2.0 (section 6.4.3.6 in both). This code does not | ||
337 | * implement the more restrictive definition of 1.0b | ||
338 | * | ||
339 | * - Edge/Level are defined opposite in the table vs the headers | ||
340 | */ | ||
341 | if (resource->data.extended_irq.triggering == ACPI_EDGE_SENSITIVE) { | ||
342 | aml->extended_irq.flags |= 0x02; | ||
343 | } | ||
344 | |||
345 | /* Set the Interrupt table length */ | ||
346 | |||
347 | aml->extended_irq.table_length = (u8) | ||
348 | resource->data.extended_irq.interrupt_count; | ||
349 | 206 | ||
350 | descriptor_length = (sizeof(struct aml_resource_extended_irq) - 4) + | 207 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA, |
351 | ((acpi_size) resource->data.extended_irq.interrupt_count * | 208 | sizeof(struct aml_resource_dma), |
352 | sizeof(u32)); | 209 | 0}, |
353 | 210 | ||
354 | /* Set each interrupt value */ | 211 | /* Flags: transfer preference, bus mastering, channel speed */ |
355 | 212 | ||
356 | acpi_rs_move_data(aml->extended_irq.interrupt_number, | 213 | {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.transfer), |
357 | resource->data.extended_irq.interrupts, | 214 | AML_OFFSET(dma.flags), |
358 | (u16) resource->data.extended_irq.interrupt_count, | 215 | 0}, |
359 | ACPI_MOVE_TYPE_32_TO_32); | ||
360 | 216 | ||
361 | /* Resource Source Index and Resource Source are optional */ | 217 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.dma.bus_master), |
218 | AML_OFFSET(dma.flags), | ||
219 | 2}, | ||
362 | 220 | ||
363 | descriptor_length = acpi_rs_set_resource_source(aml, descriptor_length, | 221 | {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.type), |
364 | &resource->data. | 222 | AML_OFFSET(dma.flags), |
365 | extended_irq. | 223 | 5}, |
366 | resource_source); | ||
367 | 224 | ||
368 | /* Complete the AML descriptor header */ | 225 | /* DMA channel mask bits */ |
369 | 226 | ||
370 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_EXTENDED_IRQ, | 227 | {ACPI_RSC_BITMASK, ACPI_RS_OFFSET(data.dma.channels[0]), |
371 | descriptor_length, aml); | 228 | AML_OFFSET(dma.dma_channel_mask), |
372 | return_ACPI_STATUS(AE_OK); | 229 | ACPI_RS_OFFSET(data.dma.channel_count)} |
373 | } | 230 | }; |
diff --git a/drivers/acpi/resources/rslist.c b/drivers/acpi/resources/rslist.c index f72d42e0927b..ee17ef3315f8 100644 --- a/drivers/acpi/resources/rslist.c +++ b/drivers/acpi/resources/rslist.c | |||
@@ -48,7 +48,8 @@ | |||
48 | ACPI_MODULE_NAME("rslist") | 48 | ACPI_MODULE_NAME("rslist") |
49 | 49 | ||
50 | /* Local prototypes */ | 50 | /* Local prototypes */ |
51 | static ACPI_GET_RESOURCE_HANDLER acpi_rs_get_resource_handler(u8 resource_type); | 51 | static struct acpi_rsconvert_info *acpi_rs_get_conversion_info(u8 |
52 | resource_type); | ||
52 | 53 | ||
53 | static acpi_status acpi_rs_validate_resource_length(union aml_resource *aml); | 54 | static acpi_status acpi_rs_validate_resource_length(union aml_resource *aml); |
54 | 55 | ||
@@ -83,7 +84,7 @@ static acpi_status acpi_rs_validate_resource_length(union aml_resource *aml) | |||
83 | return (AE_AML_INVALID_RESOURCE_TYPE); | 84 | return (AE_AML_INVALID_RESOURCE_TYPE); |
84 | } | 85 | } |
85 | 86 | ||
86 | resource_length = acpi_rs_get_resource_length(aml); | 87 | resource_length = acpi_ut_get_resource_length(aml); |
87 | minimum_aml_resource_length = | 88 | minimum_aml_resource_length = |
88 | resource_info->minimum_aml_resource_length; | 89 | resource_info->minimum_aml_resource_length; |
89 | 90 | ||
@@ -115,18 +116,17 @@ static acpi_status acpi_rs_validate_resource_length(union aml_resource *aml) | |||
115 | 116 | ||
116 | /******************************************************************************* | 117 | /******************************************************************************* |
117 | * | 118 | * |
118 | * FUNCTION: acpi_rs_get_resource_handler | 119 | * FUNCTION: acpi_rs_get_conversion_info |
119 | * | 120 | * |
120 | * PARAMETERS: resource_type - Byte 0 of a resource descriptor | 121 | * PARAMETERS: resource_type - Byte 0 of a resource descriptor |
121 | * | 122 | * |
122 | * RETURN: Pointer to the resource conversion handler | 123 | * RETURN: Pointer to the resource conversion info table |
123 | * | 124 | * |
124 | * DESCRIPTION: Extract the Resource Type/Name from the first byte of | 125 | * DESCRIPTION: Get the conversion table associated with this resource type |
125 | * a resource descriptor. | ||
126 | * | 126 | * |
127 | ******************************************************************************/ | 127 | ******************************************************************************/ |
128 | 128 | ||
129 | static ACPI_GET_RESOURCE_HANDLER acpi_rs_get_resource_handler(u8 resource_type) | 129 | static struct acpi_rsconvert_info *acpi_rs_get_conversion_info(u8 resource_type) |
130 | { | 130 | { |
131 | ACPI_FUNCTION_ENTRY(); | 131 | ACPI_FUNCTION_ENTRY(); |
132 | 132 | ||
@@ -174,33 +174,24 @@ acpi_rs_convert_aml_to_resources(u8 * aml_buffer, | |||
174 | acpi_status status; | 174 | acpi_status status; |
175 | acpi_size bytes_parsed = 0; | 175 | acpi_size bytes_parsed = 0; |
176 | struct acpi_resource *resource; | 176 | struct acpi_resource *resource; |
177 | u16 resource_length; | 177 | acpi_rsdesc_size descriptor_length; |
178 | u32 descriptor_length; | 178 | struct acpi_rsconvert_info *info; |
179 | ACPI_GET_RESOURCE_HANDLER handler; | ||
180 | 179 | ||
181 | ACPI_FUNCTION_TRACE("rs_convert_aml_to_resources"); | 180 | ACPI_FUNCTION_TRACE("rs_convert_aml_to_resources"); |
182 | 181 | ||
183 | /* Loop until end-of-buffer or an end_tag is found */ | 182 | /* Loop until end-of-buffer or an end_tag is found */ |
184 | 183 | ||
185 | while (bytes_parsed < aml_buffer_length) { | 184 | while (bytes_parsed < aml_buffer_length) { |
186 | /* Get the handler associated with this Descriptor Type */ | 185 | /* Get the conversion table associated with this Descriptor Type */ |
187 | 186 | ||
188 | handler = acpi_rs_get_resource_handler(*aml_buffer); | 187 | info = acpi_rs_get_conversion_info(*aml_buffer); |
189 | if (!handler) { | 188 | if (!info) { |
190 | /* No handler indicates invalid resource type */ | 189 | /* No table indicates an invalid resource type */ |
191 | 190 | ||
192 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); | 191 | return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); |
193 | } | 192 | } |
194 | 193 | ||
195 | resource_length = | 194 | descriptor_length = acpi_ut_get_descriptor_length(aml_buffer); |
196 | acpi_rs_get_resource_length(ACPI_CAST_PTR | ||
197 | (union aml_resource, | ||
198 | aml_buffer)); | ||
199 | |||
200 | descriptor_length = | ||
201 | acpi_rs_get_descriptor_length(ACPI_CAST_PTR | ||
202 | (union aml_resource, | ||
203 | aml_buffer)); | ||
204 | 195 | ||
205 | /* | 196 | /* |
206 | * Perform limited validation of the resource length, based upon | 197 | * Perform limited validation of the resource length, based upon |
@@ -214,11 +205,16 @@ acpi_rs_convert_aml_to_resources(u8 * aml_buffer, | |||
214 | return_ACPI_STATUS(status); | 205 | return_ACPI_STATUS(status); |
215 | } | 206 | } |
216 | 207 | ||
217 | /* Convert a byte stream resource to local resource struct */ | 208 | /* Convert the AML byte stream resource to a local resource struct */ |
218 | 209 | ||
219 | status = handler(ACPI_CAST_PTR(union aml_resource, aml_buffer), | 210 | status = |
220 | resource_length, | 211 | acpi_rs_convert_aml_to_resource(ACPI_CAST_PTR |
221 | ACPI_CAST_PTR(struct acpi_resource, buffer)); | 212 | (struct acpi_resource, |
213 | buffer), | ||
214 | ACPI_CAST_PTR(union | ||
215 | aml_resource, | ||
216 | aml_buffer), | ||
217 | info); | ||
222 | if (ACPI_FAILURE(status)) { | 218 | if (ACPI_FAILURE(status)) { |
223 | ACPI_REPORT_ERROR(("Could not convert AML resource (type %X) to resource, %s\n", *aml_buffer, acpi_format_exception(status))); | 219 | ACPI_REPORT_ERROR(("Could not convert AML resource (type %X) to resource, %s\n", *aml_buffer, acpi_format_exception(status))); |
224 | return_ACPI_STATUS(status); | 220 | return_ACPI_STATUS(status); |
@@ -232,7 +228,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml_buffer, | |||
232 | 228 | ||
233 | /* Normal exit on completion of an end_tag resource descriptor */ | 229 | /* Normal exit on completion of an end_tag resource descriptor */ |
234 | 230 | ||
235 | if (acpi_rs_get_resource_type(*aml_buffer) == | 231 | if (acpi_ut_get_resource_type(aml_buffer) == |
236 | ACPI_RESOURCE_NAME_END_TAG) { | 232 | ACPI_RESOURCE_NAME_END_TAG) { |
237 | return_ACPI_STATUS(AE_OK); | 233 | return_ACPI_STATUS(AE_OK); |
238 | } | 234 | } |
@@ -276,14 +272,15 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
276 | acpi_size aml_size_needed, u8 * output_buffer) | 272 | acpi_size aml_size_needed, u8 * output_buffer) |
277 | { | 273 | { |
278 | u8 *aml_buffer = output_buffer; | 274 | u8 *aml_buffer = output_buffer; |
275 | u8 *end_aml_buffer = output_buffer + aml_size_needed; | ||
279 | acpi_status status; | 276 | acpi_status status; |
280 | 277 | ||
281 | ACPI_FUNCTION_TRACE("rs_convert_resources_to_aml"); | 278 | ACPI_FUNCTION_TRACE("rs_convert_resources_to_aml"); |
282 | 279 | ||
283 | /* Convert each resource descriptor in the list */ | 280 | /* Walk the resource descriptor list, convert each descriptor */ |
284 | 281 | ||
285 | while (1) { | 282 | while (aml_buffer < end_aml_buffer) { |
286 | /* Validate Resource Descriptor Type before dispatch */ | 283 | /* Validate the Resource Type */ |
287 | 284 | ||
288 | if (resource->type > ACPI_RESOURCE_TYPE_MAX) { | 285 | if (resource->type > ACPI_RESOURCE_TYPE_MAX) { |
289 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 286 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
@@ -292,14 +289,14 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
292 | return_ACPI_STATUS(AE_BAD_DATA); | 289 | return_ACPI_STATUS(AE_BAD_DATA); |
293 | } | 290 | } |
294 | 291 | ||
295 | /* Perform the conversion per resource type */ | 292 | /* Perform the conversion */ |
296 | 293 | ||
297 | status = | 294 | status = acpi_rs_convert_resource_to_aml(resource, |
298 | acpi_gbl_set_resource_dispatch[resource->type] (resource, | 295 | ACPI_CAST_PTR(union |
299 | ACPI_CAST_PTR | 296 | aml_resource, |
300 | (union | 297 | aml_buffer), |
301 | aml_resource, | 298 | acpi_gbl_set_resource_dispatch |
302 | aml_buffer)); | 299 | [resource->type]); |
303 | if (ACPI_FAILURE(status)) { | 300 | if (ACPI_FAILURE(status)) { |
304 | ACPI_REPORT_ERROR(("Could not convert resource (type %X) to AML, %s\n", resource->type, acpi_format_exception(status))); | 301 | ACPI_REPORT_ERROR(("Could not convert resource (type %X) to AML, %s\n", resource->type, acpi_format_exception(status))); |
305 | return_ACPI_STATUS(status); | 302 | return_ACPI_STATUS(status); |
@@ -323,18 +320,23 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
323 | return_ACPI_STATUS(AE_OK); | 320 | return_ACPI_STATUS(AE_OK); |
324 | } | 321 | } |
325 | 322 | ||
326 | /* Extract the total length of the new descriptor */ | 323 | /* |
327 | /* Set the aml_buffer to point to the next (output) resource descriptor */ | 324 | * Extract the total length of the new descriptor and set the |
328 | 325 | * aml_buffer to point to the next (output) resource descriptor | |
329 | aml_buffer += | 326 | */ |
330 | acpi_rs_get_descriptor_length(ACPI_CAST_PTR | 327 | aml_buffer += acpi_ut_get_descriptor_length(aml_buffer); |
331 | (union aml_resource, | ||
332 | aml_buffer)); | ||
333 | 328 | ||
334 | /* Point to the next input resource descriptor */ | 329 | /* Point to the next input resource descriptor */ |
335 | 330 | ||
336 | resource = | 331 | resource = |
337 | ACPI_PTR_ADD(struct acpi_resource, resource, | 332 | ACPI_PTR_ADD(struct acpi_resource, resource, |
338 | resource->length); | 333 | resource->length); |
334 | |||
335 | /* Check for end-of-list, normal exit */ | ||
336 | |||
339 | } | 337 | } |
338 | |||
339 | /* Completed buffer, but did not find an end_tag resource descriptor */ | ||
340 | |||
341 | return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); | ||
340 | } | 342 | } |
diff --git a/drivers/acpi/resources/rsmemory.c b/drivers/acpi/resources/rsmemory.c index 47e979e7ba35..418a3fb64077 100644 --- a/drivers/acpi/resources/rsmemory.c +++ b/drivers/acpi/resources/rsmemory.c | |||
@@ -49,260 +49,187 @@ ACPI_MODULE_NAME("rsmemory") | |||
49 | 49 | ||
50 | /******************************************************************************* | 50 | /******************************************************************************* |
51 | * | 51 | * |
52 | * FUNCTION: acpi_rs_get_memory24 | 52 | * acpi_rs_convert_memory24 |
53 | * | ||
54 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
55 | * aml_resource_length - Length of the resource from the AML header | ||
56 | * Resource - Where the internal resource is returned | ||
57 | * | ||
58 | * RETURN: Status | ||
59 | * | ||
60 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
61 | * internal resource descriptor, simplifying bitflags and handling | ||
62 | * alignment and endian issues if necessary. | ||
63 | * | 53 | * |
64 | ******************************************************************************/ | 54 | ******************************************************************************/ |
65 | acpi_status | 55 | struct acpi_rsconvert_info acpi_rs_convert_memory24[4] = { |
66 | acpi_rs_get_memory24(union aml_resource * aml, | 56 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24, |
67 | u16 aml_resource_length, struct acpi_resource * resource) | 57 | ACPI_RS_SIZE(struct acpi_resource_memory24), |
68 | { | 58 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory24)}, |
69 | ACPI_FUNCTION_TRACE("rs_get_memory24"); | ||
70 | 59 | ||
71 | /* Get the Read/Write bit */ | 60 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24, |
61 | sizeof(struct aml_resource_memory24), | ||
62 | 0}, | ||
72 | 63 | ||
73 | resource->data.memory24.read_write_attribute = | 64 | /* Read/Write bit */ |
74 | (aml->memory24.information & 0x01); | ||
75 | 65 | ||
66 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory24.write_protect), | ||
67 | AML_OFFSET(memory24.flags), | ||
68 | 0}, | ||
76 | /* | 69 | /* |
77 | * Get the following contiguous fields from the AML descriptor: | 70 | * These fields are contiguous in both the source and destination: |
78 | * Minimum Base Address | 71 | * Minimum Base Address |
79 | * Maximum Base Address | 72 | * Maximum Base Address |
80 | * Address Base Alignment | 73 | * Address Base Alignment |
81 | * Range Length | 74 | * Range Length |
82 | */ | 75 | */ |
83 | acpi_rs_move_data(&resource->data.memory24.minimum, | 76 | {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.memory24.minimum), |
84 | &aml->memory24.minimum, 4, ACPI_MOVE_TYPE_16_TO_32); | 77 | AML_OFFSET(memory24.minimum), |
85 | 78 | 4} | |
86 | /* Complete the resource header */ | 79 | }; |
87 | |||
88 | resource->type = ACPI_RESOURCE_TYPE_MEMORY24; | ||
89 | resource->length = ACPI_SIZEOF_RESOURCE(struct acpi_resource_memory24); | ||
90 | return_ACPI_STATUS(AE_OK); | ||
91 | } | ||
92 | 80 | ||
93 | /******************************************************************************* | 81 | /******************************************************************************* |
94 | * | 82 | * |
95 | * FUNCTION: acpi_rs_set_memory24 | 83 | * acpi_rs_convert_memory32 |
96 | * | ||
97 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
98 | * Aml - Where the AML descriptor is returned | ||
99 | * | ||
100 | * RETURN: Status | ||
101 | * | ||
102 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
103 | * external AML resource descriptor. | ||
104 | * | 84 | * |
105 | ******************************************************************************/ | 85 | ******************************************************************************/ |
106 | 86 | ||
107 | acpi_status | 87 | struct acpi_rsconvert_info acpi_rs_convert_memory32[4] = { |
108 | acpi_rs_set_memory24(struct acpi_resource *resource, union aml_resource *aml) | 88 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32, |
109 | { | 89 | ACPI_RS_SIZE(struct acpi_resource_memory32), |
110 | ACPI_FUNCTION_TRACE("rs_set_memory24"); | 90 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory32)}, |
111 | 91 | ||
112 | /* Set the Information Byte */ | 92 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32, |
93 | sizeof(struct aml_resource_memory32), | ||
94 | 0}, | ||
113 | 95 | ||
114 | aml->memory24.information = (u8) | 96 | /* Read/Write bit */ |
115 | (resource->data.memory24.read_write_attribute & 0x01); | ||
116 | 97 | ||
98 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory32.write_protect), | ||
99 | AML_OFFSET(memory32.flags), | ||
100 | 0}, | ||
117 | /* | 101 | /* |
118 | * Set the following contiguous fields in the AML descriptor: | 102 | * These fields are contiguous in both the source and destination: |
119 | * Minimum Base Address | 103 | * Minimum Base Address |
120 | * Maximum Base Address | 104 | * Maximum Base Address |
121 | * Address Base Alignment | 105 | * Address Base Alignment |
122 | * Range Length | 106 | * Range Length |
123 | */ | 107 | */ |
124 | acpi_rs_move_data(&aml->memory24.minimum, | 108 | {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.memory32.minimum), |
125 | &resource->data.memory24.minimum, 4, | 109 | AML_OFFSET(memory32.minimum), |
126 | ACPI_MOVE_TYPE_32_TO_16); | 110 | 4} |
127 | 111 | }; | |
128 | /* Complete the AML descriptor header */ | ||
129 | |||
130 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_MEMORY24, | ||
131 | sizeof(struct aml_resource_memory24), aml); | ||
132 | return_ACPI_STATUS(AE_OK); | ||
133 | } | ||
134 | 112 | ||
135 | /******************************************************************************* | 113 | /******************************************************************************* |
136 | * | 114 | * |
137 | * FUNCTION: acpi_rs_get_memory32 | 115 | * acpi_rs_convert_fixed_memory32 |
138 | * | ||
139 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
140 | * aml_resource_length - Length of the resource from the AML header | ||
141 | * Resource - Where the internal resource is returned | ||
142 | * | ||
143 | * RETURN: Status | ||
144 | * | ||
145 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
146 | * internal resource descriptor, simplifying bitflags and handling | ||
147 | * alignment and endian issues if necessary. | ||
148 | * | 116 | * |
149 | ******************************************************************************/ | 117 | ******************************************************************************/ |
150 | 118 | ||
151 | acpi_status | 119 | struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[4] = { |
152 | acpi_rs_get_memory32(union aml_resource *aml, | 120 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32, |
153 | u16 aml_resource_length, struct acpi_resource *resource) | 121 | ACPI_RS_SIZE(struct acpi_resource_fixed_memory32), |
154 | { | 122 | ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_memory32)}, |
155 | ACPI_FUNCTION_TRACE("rs_get_memory32"); | ||
156 | 123 | ||
157 | /* Get the Read/Write bit */ | 124 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32, |
125 | sizeof(struct aml_resource_fixed_memory32), | ||
126 | 0}, | ||
158 | 127 | ||
159 | resource->data.memory32.read_write_attribute = | 128 | /* Read/Write bit */ |
160 | (aml->memory32.information & 0x01); | ||
161 | 129 | ||
130 | {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.fixed_memory32.write_protect), | ||
131 | AML_OFFSET(fixed_memory32.flags), | ||
132 | 0}, | ||
162 | /* | 133 | /* |
163 | * Get the following contiguous fields from the AML descriptor: | 134 | * These fields are contiguous in both the source and destination: |
164 | * Minimum Base Address | 135 | * Base Address |
165 | * Maximum Base Address | ||
166 | * Address Base Alignment | ||
167 | * Range Length | 136 | * Range Length |
168 | */ | 137 | */ |
169 | acpi_rs_move_data(&resource->data.memory32.minimum, | 138 | {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.fixed_memory32.address), |
170 | &aml->memory32.minimum, 4, ACPI_MOVE_TYPE_32_TO_32); | 139 | AML_OFFSET(fixed_memory32.address), |
171 | 140 | 2} | |
172 | /* Complete the resource header */ | 141 | }; |
173 | |||
174 | resource->type = ACPI_RESOURCE_TYPE_MEMORY32; | ||
175 | resource->length = ACPI_SIZEOF_RESOURCE(struct acpi_resource_memory32); | ||
176 | return_ACPI_STATUS(AE_OK); | ||
177 | } | ||
178 | 142 | ||
179 | /******************************************************************************* | 143 | /******************************************************************************* |
180 | * | 144 | * |
181 | * FUNCTION: acpi_rs_set_memory32 | 145 | * acpi_rs_get_vendor_small |
182 | * | ||
183 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
184 | * Aml - Where the AML descriptor is returned | ||
185 | * | ||
186 | * RETURN: Status | ||
187 | * | ||
188 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
189 | * external AML resource descriptor. | ||
190 | * | 146 | * |
191 | ******************************************************************************/ | 147 | ******************************************************************************/ |
192 | 148 | ||
193 | acpi_status | 149 | struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = { |
194 | acpi_rs_set_memory32(struct acpi_resource *resource, union aml_resource *aml) | 150 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR, |
195 | { | 151 | ACPI_RS_SIZE(struct acpi_resource_vendor), |
196 | ACPI_FUNCTION_TRACE("rs_set_memory32"); | 152 | ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_small)}, |
197 | |||
198 | /* Set the Information Byte */ | ||
199 | 153 | ||
200 | aml->memory32.information = (u8) | 154 | /* Length of the vendor data (byte count) */ |
201 | (resource->data.memory32.read_write_attribute & 0x01); | ||
202 | 155 | ||
203 | /* | 156 | {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length), |
204 | * Set the following contiguous fields in the AML descriptor: | 157 | 0, |
205 | * Minimum Base Address | 158 | sizeof(u8)} |
206 | * Maximum Base Address | 159 | , |
207 | * Address Base Alignment | ||
208 | * Range Length | ||
209 | */ | ||
210 | acpi_rs_move_data(&aml->memory32.minimum, | ||
211 | &resource->data.memory32.minimum, 4, | ||
212 | ACPI_MOVE_TYPE_32_TO_32); | ||
213 | 160 | ||
214 | /* Complete the AML descriptor header */ | 161 | /* Vendor data */ |
215 | 162 | ||
216 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_MEMORY32, | 163 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]), |
217 | sizeof(struct aml_resource_memory32), aml); | 164 | sizeof(struct aml_resource_small_header), |
218 | return_ACPI_STATUS(AE_OK); | 165 | 0} |
219 | } | 166 | }; |
220 | 167 | ||
221 | /******************************************************************************* | 168 | /******************************************************************************* |
222 | * | 169 | * |
223 | * FUNCTION: acpi_rs_get_fixed_memory32 | 170 | * acpi_rs_get_vendor_large |
224 | * | ||
225 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
226 | * aml_resource_length - Length of the resource from the AML header | ||
227 | * Resource - Where the internal resource is returned | ||
228 | * | ||
229 | * RETURN: Status | ||
230 | * | ||
231 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
232 | * internal resource descriptor, simplifying bitflags and handling | ||
233 | * alignment and endian issues if necessary. | ||
234 | * | 171 | * |
235 | ******************************************************************************/ | 172 | ******************************************************************************/ |
236 | 173 | ||
237 | acpi_status | 174 | struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = { |
238 | acpi_rs_get_fixed_memory32(union aml_resource *aml, | 175 | {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR, |
239 | u16 aml_resource_length, | 176 | ACPI_RS_SIZE(struct acpi_resource_vendor), |
240 | struct acpi_resource *resource) | 177 | ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_large)}, |
241 | { | ||
242 | ACPI_FUNCTION_TRACE("rs_get_fixed_memory32"); | ||
243 | |||
244 | /* Get the Read/Write bit */ | ||
245 | 178 | ||
246 | resource->data.fixed_memory32.read_write_attribute = | 179 | /* Length of the vendor data (byte count) */ |
247 | (aml->fixed_memory32.information & 0x01); | ||
248 | 180 | ||
249 | /* | 181 | {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length), |
250 | * Get the following contiguous fields from the AML descriptor: | 182 | 0, |
251 | * Base Address | 183 | sizeof(u8)} |
252 | * Range Length | 184 | , |
253 | */ | ||
254 | ACPI_MOVE_32_TO_32(&resource->data.fixed_memory32.address, | ||
255 | &aml->fixed_memory32.address); | ||
256 | ACPI_MOVE_32_TO_32(&resource->data.fixed_memory32.address_length, | ||
257 | &aml->fixed_memory32.address_length); | ||
258 | 185 | ||
259 | /* Complete the resource header */ | 186 | /* Vendor data */ |
260 | 187 | ||
261 | resource->type = ACPI_RESOURCE_TYPE_FIXED_MEMORY32; | 188 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]), |
262 | resource->length = | 189 | sizeof(struct aml_resource_large_header), |
263 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_memory32); | 190 | 0} |
264 | return_ACPI_STATUS(AE_OK); | 191 | }; |
265 | } | ||
266 | 192 | ||
267 | /******************************************************************************* | 193 | /******************************************************************************* |
268 | * | 194 | * |
269 | * FUNCTION: acpi_rs_set_fixed_memory32 | 195 | * acpi_rs_set_vendor |
270 | * | ||
271 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
272 | * Aml - Where the AML descriptor is returned | ||
273 | * | ||
274 | * RETURN: Status | ||
275 | * | ||
276 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
277 | * external AML resource descriptor. | ||
278 | * | 196 | * |
279 | ******************************************************************************/ | 197 | ******************************************************************************/ |
280 | 198 | ||
281 | acpi_status | 199 | struct acpi_rsconvert_info acpi_rs_set_vendor[7] = { |
282 | acpi_rs_set_fixed_memory32(struct acpi_resource *resource, | 200 | /* Default is a small vendor descriptor */ |
283 | union aml_resource *aml) | 201 | |
284 | { | 202 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL, |
285 | ACPI_FUNCTION_TRACE("rs_set_fixed_memory32"); | 203 | sizeof(struct aml_resource_small_header), |
204 | ACPI_RSC_TABLE_SIZE(acpi_rs_set_vendor)}, | ||
205 | |||
206 | /* Get the length and copy the data */ | ||
286 | 207 | ||
287 | /* Set the Information Byte */ | 208 | {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length), |
209 | 0, | ||
210 | 0}, | ||
288 | 211 | ||
289 | aml->fixed_memory32.information = (u8) | 212 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]), |
290 | (resource->data.fixed_memory32.read_write_attribute & 0x01); | 213 | sizeof(struct aml_resource_small_header), |
214 | 0}, | ||
291 | 215 | ||
292 | /* | 216 | /* |
293 | * Set the following contiguous fields in the AML descriptor: | 217 | * All done if the Vendor byte length is 7 or less, meaning that it will |
294 | * Base Address | 218 | * fit within a small descriptor |
295 | * Range Length | ||
296 | */ | 219 | */ |
297 | ACPI_MOVE_32_TO_32(&aml->fixed_memory32.address, | 220 | {ACPI_RSC_EXIT_LE, 0, 0, 7}, |
298 | &resource->data.fixed_memory32.address); | 221 | |
299 | ACPI_MOVE_32_TO_32(&aml->fixed_memory32.address_length, | 222 | /* Must create a large vendor descriptor */ |
300 | &resource->data.fixed_memory32.address_length); | 223 | |
301 | 224 | {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE, | |
302 | /* Complete the AML descriptor header */ | 225 | sizeof(struct aml_resource_large_header), |
303 | 226 | 0}, | |
304 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_FIXED_MEMORY32, | 227 | |
305 | sizeof(struct aml_resource_fixed_memory32), | 228 | {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length), |
306 | aml); | 229 | 0, |
307 | return_ACPI_STATUS(AE_OK); | 230 | 0}, |
308 | } | 231 | |
232 | {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]), | ||
233 | sizeof(struct aml_resource_large_header), | ||
234 | 0} | ||
235 | }; | ||
diff --git a/drivers/acpi/resources/rsmisc.c b/drivers/acpi/resources/rsmisc.c index 337a0f01cb23..16ad3bfbee2a 100644 --- a/drivers/acpi/resources/rsmisc.c +++ b/drivers/acpi/resources/rsmisc.c | |||
@@ -47,156 +47,267 @@ | |||
47 | #define _COMPONENT ACPI_RESOURCES | 47 | #define _COMPONENT ACPI_RESOURCES |
48 | ACPI_MODULE_NAME("rsmisc") | 48 | ACPI_MODULE_NAME("rsmisc") |
49 | 49 | ||
50 | #define INIT_RESOURCE_TYPE(i) i->resource_offset | ||
51 | #define INIT_RESOURCE_LENGTH(i) i->aml_offset | ||
52 | #define INIT_TABLE_LENGTH(i) i->value | ||
53 | #define COMPARE_OPCODE(i) i->resource_offset | ||
54 | #define COMPARE_TARGET(i) i->aml_offset | ||
55 | #define COMPARE_VALUE(i) i->value | ||
50 | /******************************************************************************* | 56 | /******************************************************************************* |
51 | * | 57 | * |
52 | * FUNCTION: acpi_rs_get_generic_reg | 58 | * FUNCTION: acpi_rs_convert_aml_to_resource |
53 | * | ||
54 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
55 | * aml_resource_length - Length of the resource from the AML header | ||
56 | * Resource - Where the internal resource is returned | ||
57 | * | ||
58 | * RETURN: Status | ||
59 | * | ||
60 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
61 | * internal resource descriptor, simplifying bitflags and handling | ||
62 | * alignment and endian issues if necessary. | ||
63 | * | ||
64 | ******************************************************************************/ | ||
65 | acpi_status | ||
66 | acpi_rs_get_generic_reg(union aml_resource *aml, | ||
67 | u16 aml_resource_length, struct acpi_resource *resource) | ||
68 | { | ||
69 | ACPI_FUNCTION_TRACE("rs_get_generic_reg"); | ||
70 | |||
71 | /* | ||
72 | * Get the following fields from the AML descriptor: | ||
73 | * Address Space ID | ||
74 | * Register Bit Width | ||
75 | * Register Bit Offset | ||
76 | * Access Size | ||
77 | * Register Address | ||
78 | */ | ||
79 | resource->data.generic_reg.space_id = aml->generic_reg.address_space_id; | ||
80 | resource->data.generic_reg.bit_width = aml->generic_reg.bit_width; | ||
81 | resource->data.generic_reg.bit_offset = aml->generic_reg.bit_offset; | ||
82 | resource->data.generic_reg.access_size = aml->generic_reg.access_size; | ||
83 | ACPI_MOVE_64_TO_64(&resource->data.generic_reg.address, | ||
84 | &aml->generic_reg.address); | ||
85 | |||
86 | /* Complete the resource header */ | ||
87 | |||
88 | resource->type = ACPI_RESOURCE_TYPE_GENERIC_REGISTER; | ||
89 | resource->length = | ||
90 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_generic_register); | ||
91 | return_ACPI_STATUS(AE_OK); | ||
92 | } | ||
93 | |||
94 | /******************************************************************************* | ||
95 | * | ||
96 | * FUNCTION: acpi_rs_set_generic_reg | ||
97 | * | 59 | * |
98 | * PARAMETERS: Resource - Pointer to the resource descriptor | 60 | * PARAMETERS: Resource - Pointer to the resource descriptor |
99 | * Aml - Where the AML descriptor is returned | 61 | * Aml - Where the AML descriptor is returned |
62 | * Info - Pointer to appropriate conversion table | ||
100 | * | 63 | * |
101 | * RETURN: Status | 64 | * RETURN: Status |
102 | * | 65 | * |
103 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | 66 | * DESCRIPTION: Convert an external AML resource descriptor to the corresponding |
104 | * external AML resource descriptor. | 67 | * internal resource descriptor |
105 | * | ||
106 | ******************************************************************************/ | ||
107 | |||
108 | acpi_status | ||
109 | acpi_rs_set_generic_reg(struct acpi_resource *resource, union aml_resource *aml) | ||
110 | { | ||
111 | ACPI_FUNCTION_TRACE("rs_set_generic_reg"); | ||
112 | |||
113 | /* | ||
114 | * Set the following fields in the AML descriptor: | ||
115 | * Address Space ID | ||
116 | * Register Bit Width | ||
117 | * Register Bit Offset | ||
118 | * Access Size | ||
119 | * Register Address | ||
120 | */ | ||
121 | aml->generic_reg.address_space_id = | ||
122 | (u8) resource->data.generic_reg.space_id; | ||
123 | aml->generic_reg.bit_width = (u8) resource->data.generic_reg.bit_width; | ||
124 | aml->generic_reg.bit_offset = | ||
125 | (u8) resource->data.generic_reg.bit_offset; | ||
126 | aml->generic_reg.access_size = | ||
127 | (u8) resource->data.generic_reg.access_size; | ||
128 | ACPI_MOVE_64_TO_64(&aml->generic_reg.address, | ||
129 | &resource->data.generic_reg.address); | ||
130 | |||
131 | /* Complete the AML descriptor header */ | ||
132 | |||
133 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_GENERIC_REGISTER, | ||
134 | sizeof(struct | ||
135 | aml_resource_generic_register), aml); | ||
136 | return_ACPI_STATUS(AE_OK); | ||
137 | } | ||
138 | |||
139 | /******************************************************************************* | ||
140 | * | ||
141 | * FUNCTION: acpi_rs_get_vendor | ||
142 | * | ||
143 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
144 | * aml_resource_length - Length of the resource from the AML header | ||
145 | * Resource - Where the internal resource is returned | ||
146 | * | ||
147 | * RETURN: Status | ||
148 | * | ||
149 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
150 | * internal resource descriptor, simplifying bitflags and handling | ||
151 | * alignment and endian issues if necessary. | ||
152 | * | 68 | * |
153 | ******************************************************************************/ | 69 | ******************************************************************************/ |
154 | |||
155 | acpi_status | 70 | acpi_status |
156 | acpi_rs_get_vendor(union aml_resource *aml, | 71 | acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, |
157 | u16 aml_resource_length, struct acpi_resource *resource) | 72 | union aml_resource *aml, |
73 | struct acpi_rsconvert_info *info) | ||
158 | { | 74 | { |
159 | u8 *aml_byte_data; | 75 | acpi_rs_length aml_resource_length; |
160 | 76 | void *source; | |
161 | ACPI_FUNCTION_TRACE("rs_get_vendor"); | 77 | void *destination; |
78 | char *target; | ||
79 | u8 count; | ||
80 | u8 flags_mode = FALSE; | ||
81 | u16 item_count = 0; | ||
82 | u16 temp16 = 0; | ||
83 | |||
84 | ACPI_FUNCTION_TRACE("rs_get_resource"); | ||
85 | |||
86 | if (((acpi_native_uint) resource) & 0x3) { | ||
87 | acpi_os_printf | ||
88 | ("**** GET: Misaligned resource pointer: %p Type %2.2X Len %X\n", | ||
89 | resource, resource->type, resource->length); | ||
90 | } | ||
162 | 91 | ||
163 | /* Determine if this is a large or small vendor specific item */ | 92 | /* Extract the resource Length field (does not include header length) */ |
164 | 93 | ||
165 | if (aml->large_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { | 94 | aml_resource_length = acpi_ut_get_resource_length(aml); |
166 | /* Large item, Point to the first vendor byte */ | ||
167 | 95 | ||
168 | aml_byte_data = | 96 | /* |
169 | ((u8 *) aml) + sizeof(struct aml_resource_large_header); | 97 | * First table entry must be ACPI_RSC_INITxxx and must contain the |
170 | } else { | 98 | * table length (# of table entries) |
171 | /* Small item, Point to the first vendor byte */ | 99 | */ |
100 | count = INIT_TABLE_LENGTH(info); | ||
101 | |||
102 | while (count) { | ||
103 | /* | ||
104 | * Source is the external AML byte stream buffer, | ||
105 | * destination is the internal resource descriptor | ||
106 | */ | ||
107 | source = ((u8 *) aml) + info->aml_offset; | ||
108 | destination = ((u8 *) resource) + info->resource_offset; | ||
109 | |||
110 | switch (info->opcode) { | ||
111 | case ACPI_RSC_INITGET: | ||
112 | /* | ||
113 | * Get the resource type and the initial (minimum) length | ||
114 | */ | ||
115 | ACPI_MEMSET(resource, 0, INIT_RESOURCE_LENGTH(info)); | ||
116 | resource->type = INIT_RESOURCE_TYPE(info); | ||
117 | resource->length = INIT_RESOURCE_LENGTH(info); | ||
118 | break; | ||
119 | |||
120 | case ACPI_RSC_INITSET: | ||
121 | break; | ||
122 | |||
123 | case ACPI_RSC_FLAGINIT: | ||
124 | |||
125 | flags_mode = TRUE; | ||
126 | break; | ||
127 | |||
128 | case ACPI_RSC_1BITFLAG: | ||
129 | /* | ||
130 | * Mask and shift the flag bit | ||
131 | */ | ||
132 | *((u8 *) destination) = (u8) | ||
133 | ((*((u8 *) source) >> info->value) & 0x01); | ||
134 | break; | ||
135 | |||
136 | case ACPI_RSC_2BITFLAG: | ||
137 | /* | ||
138 | * Mask and shift the flag bits | ||
139 | */ | ||
140 | *((u8 *) destination) = (u8) | ||
141 | ((*((u8 *) source) >> info->value) & 0x03); | ||
142 | break; | ||
143 | |||
144 | case ACPI_RSC_COUNT: | ||
145 | |||
146 | item_count = *((u8 *) source); | ||
147 | *((u8 *) destination) = (u8) item_count; | ||
148 | |||
149 | resource->length = resource->length + | ||
150 | (info->value * (item_count - 1)); | ||
151 | break; | ||
152 | |||
153 | case ACPI_RSC_COUNT16: | ||
154 | |||
155 | item_count = aml_resource_length; | ||
156 | *((u16 *) destination) = item_count; | ||
157 | |||
158 | resource->length = resource->length + | ||
159 | (info->value * (item_count - 1)); | ||
160 | break; | ||
161 | |||
162 | case ACPI_RSC_LENGTH: | ||
163 | |||
164 | resource->length = resource->length + info->value; | ||
165 | break; | ||
166 | |||
167 | case ACPI_RSC_MOVE8: | ||
168 | case ACPI_RSC_MOVE16: | ||
169 | case ACPI_RSC_MOVE32: | ||
170 | case ACPI_RSC_MOVE64: | ||
171 | /* | ||
172 | * Raw data move. Use the Info value field unless item_count has | ||
173 | * been previously initialized via a COUNT opcode | ||
174 | */ | ||
175 | if (info->value) { | ||
176 | item_count = info->value; | ||
177 | } | ||
178 | acpi_rs_move_data(destination, source, item_count, | ||
179 | info->opcode); | ||
180 | break; | ||
181 | |||
182 | case ACPI_RSC_SET8: | ||
183 | |||
184 | ACPI_MEMSET(destination, info->aml_offset, info->value); | ||
185 | break; | ||
186 | |||
187 | case ACPI_RSC_DATA8: | ||
188 | |||
189 | target = ((char *)resource) + info->value; | ||
190 | ACPI_MEMCPY(destination, source, | ||
191 | *(ACPI_CAST_PTR(u16, target))); | ||
192 | break; | ||
193 | |||
194 | case ACPI_RSC_ADDRESS: | ||
195 | /* | ||
196 | * Common handler for address descriptor flags | ||
197 | */ | ||
198 | if (!acpi_rs_get_address_common(resource, aml)) { | ||
199 | return_ACPI_STATUS | ||
200 | (AE_AML_INVALID_RESOURCE_TYPE); | ||
201 | } | ||
202 | break; | ||
203 | |||
204 | case ACPI_RSC_SOURCE: | ||
205 | /* | ||
206 | * Optional resource_source (Index and String) | ||
207 | */ | ||
208 | resource->length += | ||
209 | acpi_rs_get_resource_source(aml_resource_length, | ||
210 | info->value, | ||
211 | destination, aml, NULL); | ||
212 | break; | ||
213 | |||
214 | case ACPI_RSC_SOURCEX: | ||
215 | /* | ||
216 | * Optional resource_source (Index and String). This is the more | ||
217 | * complicated case used by the Interrupt() macro | ||
218 | */ | ||
219 | target = | ||
220 | ((char *)resource) + info->aml_offset + | ||
221 | (item_count * 4); | ||
222 | |||
223 | resource->length += | ||
224 | acpi_rs_get_resource_source(aml_resource_length, | ||
225 | (acpi_rs_length) (((item_count - 1) * sizeof(u32)) + info->value), destination, aml, target); | ||
226 | break; | ||
227 | |||
228 | case ACPI_RSC_BITMASK: | ||
229 | /* | ||
230 | * 8-bit encoded bitmask (DMA macro) | ||
231 | */ | ||
232 | item_count = | ||
233 | acpi_rs_decode_bitmask(*((u8 *) source), | ||
234 | destination); | ||
235 | if (item_count) { | ||
236 | resource->length += | ||
237 | resource->length + (item_count - 1); | ||
238 | } | ||
239 | |||
240 | target = ((char *)resource) + info->value; | ||
241 | *((u8 *) target) = (u8) item_count; | ||
242 | break; | ||
243 | |||
244 | case ACPI_RSC_BITMASK16: | ||
245 | /* | ||
246 | * 16-bit encoded bitmask (IRQ macro) | ||
247 | */ | ||
248 | ACPI_MOVE_16_TO_16(&temp16, source); | ||
249 | |||
250 | item_count = | ||
251 | acpi_rs_decode_bitmask(temp16, destination); | ||
252 | if (item_count) { | ||
253 | resource->length = | ||
254 | resource->length + (item_count - 1); | ||
255 | } | ||
256 | |||
257 | target = ((char *)resource) + info->value; | ||
258 | *((u8 *) target) = (u8) item_count; | ||
259 | break; | ||
260 | |||
261 | case ACPI_RSC_EXIT_NE: | ||
262 | /* | ||
263 | * Control - Exit conversion if not equal | ||
264 | */ | ||
265 | switch (info->resource_offset) { | ||
266 | case ACPI_RSC_COMPARE_AML_LENGTH: | ||
267 | if (aml_resource_length != info->value) { | ||
268 | goto exit; | ||
269 | } | ||
270 | break; | ||
271 | |||
272 | case ACPI_RSC_COMPARE_VALUE: | ||
273 | if (*((u8 *) source) != info->value) { | ||
274 | goto exit; | ||
275 | } | ||
276 | break; | ||
277 | |||
278 | default: | ||
279 | acpi_os_printf | ||
280 | ("*** Invalid conversion sub-opcode\n"); | ||
281 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
282 | } | ||
283 | break; | ||
284 | |||
285 | default: | ||
286 | |||
287 | acpi_os_printf("*** Invalid conversion opcode\n"); | ||
288 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
289 | } | ||
172 | 290 | ||
173 | aml_byte_data = | 291 | count--; |
174 | ((u8 *) aml) + sizeof(struct aml_resource_small_header); | 292 | info++; |
175 | } | 293 | } |
176 | 294 | ||
177 | /* Copy the vendor-specific bytes */ | 295 | exit: |
178 | 296 | if (!flags_mode) { | |
179 | ACPI_MEMCPY(resource->data.vendor.byte_data, | 297 | /* Round the resource struct length up to the next 32-bit boundary */ |
180 | aml_byte_data, aml_resource_length); | ||
181 | resource->data.vendor.byte_length = aml_resource_length; | ||
182 | 298 | ||
183 | /* | 299 | resource->length = ACPI_ROUND_UP_to_32_bITS(resource->length); |
184 | * In order for the struct_size to fall on a 32-bit boundary, | 300 | } |
185 | * calculate the length of the vendor string and expand the | ||
186 | * struct_size to the next 32-bit boundary. | ||
187 | */ | ||
188 | resource->type = ACPI_RESOURCE_TYPE_VENDOR; | ||
189 | resource->length = ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) + | ||
190 | ACPI_ROUND_UP_to_32_bITS(aml_resource_length); | ||
191 | return_ACPI_STATUS(AE_OK); | 301 | return_ACPI_STATUS(AE_OK); |
192 | } | 302 | } |
193 | 303 | ||
194 | /******************************************************************************* | 304 | /******************************************************************************* |
195 | * | 305 | * |
196 | * FUNCTION: acpi_rs_set_vendor | 306 | * FUNCTION: acpi_rs_convert_resource_to_aml |
197 | * | 307 | * |
198 | * PARAMETERS: Resource - Pointer to the resource descriptor | 308 | * PARAMETERS: Resource - Pointer to the resource descriptor |
199 | * Aml - Where the AML descriptor is returned | 309 | * Aml - Where the AML descriptor is returned |
310 | * Info - Pointer to appropriate conversion table | ||
200 | * | 311 | * |
201 | * RETURN: Status | 312 | * RETURN: Status |
202 | * | 313 | * |
@@ -206,275 +317,236 @@ acpi_rs_get_vendor(union aml_resource *aml, | |||
206 | ******************************************************************************/ | 317 | ******************************************************************************/ |
207 | 318 | ||
208 | acpi_status | 319 | acpi_status |
209 | acpi_rs_set_vendor(struct acpi_resource *resource, union aml_resource *aml) | 320 | acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, |
321 | union aml_resource *aml, | ||
322 | struct acpi_rsconvert_info *info) | ||
210 | { | 323 | { |
211 | u32 resource_length; | 324 | void *source = NULL; |
212 | u8 *source; | 325 | void *destination; |
213 | u8 *destination; | 326 | acpi_rsdesc_size aml_length = 0; |
214 | 327 | u8 count; | |
215 | ACPI_FUNCTION_TRACE("rs_set_vendor"); | 328 | u16 temp16 = 0; |
216 | 329 | u16 item_count = 0; | |
217 | resource_length = resource->data.vendor.byte_length; | ||
218 | source = ACPI_CAST_PTR(u8, resource->data.vendor.byte_data); | ||
219 | |||
220 | /* Length determines if this is a large or small resource */ | ||
221 | 330 | ||
222 | if (resource_length > 7) { | 331 | ACPI_FUNCTION_TRACE("rs_convert_resource_to_aml"); |
223 | /* Large item, get pointer to the data part of the descriptor */ | ||
224 | 332 | ||
225 | destination = | 333 | /* Validate the Resource pointer, must be 32-bit aligned */ |
226 | ((u8 *) aml) + sizeof(struct aml_resource_large_header); | ||
227 | 334 | ||
228 | /* Complete the AML descriptor header */ | 335 | if (((acpi_native_uint) resource) & 0x3) { |
229 | 336 | acpi_os_printf | |
230 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_VENDOR_LARGE, | 337 | ("**** SET: Misaligned resource pointer: %p Type %2.2X Len %X\n", |
231 | (u32) (resource_length + | 338 | resource, resource->type, resource->length); |
232 | sizeof(struct | ||
233 | aml_resource_large_header)), | ||
234 | aml); | ||
235 | } else { | ||
236 | /* Small item, get pointer to the data part of the descriptor */ | ||
237 | |||
238 | destination = | ||
239 | ((u8 *) aml) + sizeof(struct aml_resource_small_header); | ||
240 | |||
241 | /* Complete the AML descriptor header */ | ||
242 | |||
243 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_VENDOR_SMALL, | ||
244 | (u32) (resource_length + | ||
245 | sizeof(struct | ||
246 | aml_resource_small_header)), | ||
247 | aml); | ||
248 | } | 339 | } |
249 | 340 | ||
250 | /* Copy the vendor-specific bytes */ | 341 | /* |
251 | 342 | * First table entry must be ACPI_RSC_INITxxx and must contain the | |
252 | ACPI_MEMCPY(destination, source, resource_length); | 343 | * table length (# of table entries) |
253 | return_ACPI_STATUS(AE_OK); | 344 | */ |
254 | } | 345 | count = INIT_TABLE_LENGTH(info); |
255 | 346 | ||
256 | /******************************************************************************* | 347 | while (count) { |
257 | * | 348 | /* |
258 | * FUNCTION: acpi_rs_get_start_dpf | 349 | * Source is the internal resource descriptor, |
259 | * | 350 | * destination is the external AML byte stream buffer |
260 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | 351 | */ |
261 | * aml_resource_length - Length of the resource from the AML header | 352 | source = ((u8 *) resource) + info->resource_offset; |
262 | * Resource - Where the internal resource is returned | 353 | destination = ((u8 *) aml) + info->aml_offset; |
263 | * | 354 | |
264 | * RETURN: Status | 355 | switch (info->opcode) { |
265 | * | 356 | case ACPI_RSC_INITSET: |
266 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | 357 | |
267 | * internal resource descriptor, simplifying bitflags and handling | 358 | ACPI_MEMSET(aml, 0, INIT_RESOURCE_LENGTH(info)); |
268 | * alignment and endian issues if necessary. | 359 | aml_length = INIT_RESOURCE_LENGTH(info); |
269 | * | 360 | acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info), |
270 | ******************************************************************************/ | 361 | aml_length, aml); |
271 | 362 | break; | |
272 | acpi_status | 363 | |
273 | acpi_rs_get_start_dpf(union aml_resource *aml, | 364 | case ACPI_RSC_INITGET: |
274 | u16 aml_resource_length, struct acpi_resource *resource) | 365 | break; |
275 | { | 366 | |
276 | ACPI_FUNCTION_TRACE("rs_get_start_dpf"); | 367 | case ACPI_RSC_FLAGINIT: |
277 | 368 | /* | |
278 | /* Get the flags byte if present */ | 369 | * Clear the flag byte |
279 | 370 | */ | |
280 | if (aml_resource_length == 1) { | 371 | *((u8 *) destination) = 0; |
281 | /* Get the Compatibility priority */ | 372 | break; |
282 | 373 | ||
283 | resource->data.start_dpf.compatibility_priority = | 374 | case ACPI_RSC_1BITFLAG: |
284 | (aml->start_dpf.flags & 0x03); | 375 | /* |
285 | 376 | * Mask and shift the flag bit | |
286 | if (resource->data.start_dpf.compatibility_priority >= 3) { | 377 | */ |
287 | return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE); | 378 | *((u8 *) destination) |= (u8) |
288 | } | 379 | ((*((u8 *) source) & 0x01) << info->value); |
289 | 380 | break; | |
290 | /* Get the Performance/Robustness preference */ | 381 | |
291 | 382 | case ACPI_RSC_2BITFLAG: | |
292 | resource->data.start_dpf.performance_robustness = | 383 | /* |
293 | ((aml->start_dpf.flags >> 2) & 0x03); | 384 | * Mask and shift the flag bits |
294 | 385 | */ | |
295 | if (resource->data.start_dpf.performance_robustness >= 3) { | 386 | *((u8 *) destination) |= (u8) |
296 | return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE); | 387 | ((*((u8 *) source) & 0x03) << info->value); |
388 | break; | ||
389 | |||
390 | case ACPI_RSC_COUNT: | ||
391 | |||
392 | item_count = *((u8 *) source); | ||
393 | *((u8 *) destination) = (u8) item_count; | ||
394 | |||
395 | aml_length = (u16) (aml_length + | ||
396 | (info->value * (item_count - 1))); | ||
397 | break; | ||
398 | |||
399 | case ACPI_RSC_COUNT16: | ||
400 | |||
401 | item_count = *((u16 *) source); | ||
402 | aml_length = (u16) (aml_length + item_count); | ||
403 | acpi_rs_set_resource_length(aml_length, aml); | ||
404 | break; | ||
405 | |||
406 | case ACPI_RSC_LENGTH: | ||
407 | |||
408 | acpi_rs_set_resource_length(info->value, aml); | ||
409 | break; | ||
410 | |||
411 | case ACPI_RSC_MOVE8: | ||
412 | case ACPI_RSC_MOVE16: | ||
413 | case ACPI_RSC_MOVE32: | ||
414 | case ACPI_RSC_MOVE64: | ||
415 | |||
416 | if (info->value) { | ||
417 | item_count = info->value; | ||
418 | } | ||
419 | acpi_rs_move_data(destination, source, item_count, | ||
420 | info->opcode); | ||
421 | break; | ||
422 | |||
423 | case ACPI_RSC_ADDRESS: | ||
424 | |||
425 | /* Set the Resource Type, General Flags, and Type-Specific Flags */ | ||
426 | |||
427 | acpi_rs_set_address_common(aml, resource); | ||
428 | break; | ||
429 | |||
430 | case ACPI_RSC_SOURCEX: | ||
431 | /* | ||
432 | * Optional resource_source (Index and String) | ||
433 | */ | ||
434 | aml_length = | ||
435 | acpi_rs_set_resource_source(aml, | ||
436 | (acpi_rs_length) | ||
437 | aml_length, source); | ||
438 | acpi_rs_set_resource_length(aml_length, aml); | ||
439 | break; | ||
440 | |||
441 | case ACPI_RSC_SOURCE: | ||
442 | /* | ||
443 | * Optional resource_source (Index and String). This is the more | ||
444 | * complicated case used by the Interrupt() macro | ||
445 | */ | ||
446 | aml_length = | ||
447 | acpi_rs_set_resource_source(aml, info->value, | ||
448 | source); | ||
449 | acpi_rs_set_resource_length(aml_length, aml); | ||
450 | break; | ||
451 | |||
452 | case ACPI_RSC_BITMASK: | ||
453 | /* | ||
454 | * 8-bit encoded bitmask (DMA macro) | ||
455 | */ | ||
456 | *((u8 *) destination) = (u8) | ||
457 | acpi_rs_encode_bitmask(source, | ||
458 | *(((u8 *) resource) + | ||
459 | info->value)); | ||
460 | break; | ||
461 | |||
462 | case ACPI_RSC_BITMASK16: | ||
463 | /* | ||
464 | * 16-bit encoded bitmask (IRQ macro) | ||
465 | */ | ||
466 | temp16 = | ||
467 | acpi_rs_encode_bitmask(source, | ||
468 | *(((u8 *) resource) + | ||
469 | info->value)); | ||
470 | ACPI_MOVE_16_TO_16(destination, &temp16); | ||
471 | break; | ||
472 | |||
473 | case ACPI_RSC_EXIT_LE: | ||
474 | /* | ||
475 | * Control - Exit conversion if less than or equal | ||
476 | */ | ||
477 | if (item_count <= info->value) { | ||
478 | goto exit; | ||
479 | } | ||
480 | break; | ||
481 | |||
482 | case ACPI_RSC_EXIT_NE: | ||
483 | /* | ||
484 | * Control - Exit conversion if not equal | ||
485 | */ | ||
486 | switch (COMPARE_OPCODE(info)) { | ||
487 | case ACPI_RSC_COMPARE_VALUE: | ||
488 | if (* | ||
489 | ((u8 *) (((u8 *) resource) + | ||
490 | COMPARE_TARGET(info))) != | ||
491 | COMPARE_VALUE(info)) { | ||
492 | goto exit; | ||
493 | } | ||
494 | break; | ||
495 | |||
496 | default: | ||
497 | acpi_os_printf | ||
498 | ("*** Invalid conversion sub-opcode\n"); | ||
499 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
500 | } | ||
501 | break; | ||
502 | |||
503 | default: | ||
504 | |||
505 | acpi_os_printf("*** Invalid conversion opcode\n"); | ||
506 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
297 | } | 507 | } |
298 | } else { | ||
299 | /* start_dependent_no_pri(), no flags byte, set defaults */ | ||
300 | |||
301 | resource->data.start_dpf.compatibility_priority = | ||
302 | ACPI_ACCEPTABLE_CONFIGURATION; | ||
303 | 508 | ||
304 | resource->data.start_dpf.performance_robustness = | 509 | count--; |
305 | ACPI_ACCEPTABLE_CONFIGURATION; | 510 | info++; |
306 | } | 511 | } |
307 | 512 | ||
308 | /* Complete the resource header */ | 513 | exit: |
309 | |||
310 | resource->type = ACPI_RESOURCE_TYPE_START_DEPENDENT; | ||
311 | resource->length = | ||
312 | ACPI_SIZEOF_RESOURCE(struct acpi_resource_start_dependent); | ||
313 | return_ACPI_STATUS(AE_OK); | 514 | return_ACPI_STATUS(AE_OK); |
314 | } | 515 | } |
315 | 516 | ||
316 | /******************************************************************************* | 517 | #if 0 |
317 | * | 518 | /* Previous resource validations */ |
318 | * FUNCTION: acpi_rs_set_start_dpf | ||
319 | * | ||
320 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
321 | * Aml - Where the AML descriptor is returned | ||
322 | * | ||
323 | * RETURN: Status | ||
324 | * | ||
325 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
326 | * external AML resource descriptor. | ||
327 | * | ||
328 | ******************************************************************************/ | ||
329 | |||
330 | acpi_status | ||
331 | acpi_rs_set_start_dpf(struct acpi_resource *resource, union aml_resource *aml) | ||
332 | { | ||
333 | ACPI_FUNCTION_TRACE("rs_set_start_dpf"); | ||
334 | 519 | ||
335 | /* | 520 | if (aml->ext_address64.revision_iD != AML_RESOURCE_EXTENDED_ADDRESS_REVISION) { |
336 | * The descriptor type field is set based upon whether a byte is needed | 521 | return_ACPI_STATUS(AE_SUPPORT); |
337 | * to contain Priority data. | ||
338 | */ | ||
339 | if (ACPI_ACCEPTABLE_CONFIGURATION == | ||
340 | resource->data.start_dpf.compatibility_priority && | ||
341 | ACPI_ACCEPTABLE_CONFIGURATION == | ||
342 | resource->data.start_dpf.performance_robustness) { | ||
343 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_START_DEPENDENT, | ||
344 | sizeof(struct | ||
345 | aml_resource_start_dependent_noprio), | ||
346 | aml); | ||
347 | } else { | ||
348 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_START_DEPENDENT, | ||
349 | sizeof(struct | ||
350 | aml_resource_start_dependent), | ||
351 | aml); | ||
352 | |||
353 | /* Set the Flags byte */ | ||
354 | |||
355 | aml->start_dpf.flags = (u8) | ||
356 | (((resource->data.start_dpf. | ||
357 | performance_robustness & 0x03) << 2) | (resource->data. | ||
358 | start_dpf. | ||
359 | compatibility_priority | ||
360 | & 0x03)); | ||
361 | } | ||
362 | return_ACPI_STATUS(AE_OK); | ||
363 | } | 522 | } |
364 | 523 | ||
365 | /******************************************************************************* | 524 | if (resource->data.start_dpf.performance_robustness >= 3) { |
366 | * | 525 | return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE); |
367 | * FUNCTION: acpi_rs_get_end_dpf | ||
368 | * | ||
369 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
370 | * aml_resource_length - Length of the resource from the AML header | ||
371 | * Resource - Where the internal resource is returned | ||
372 | * | ||
373 | * RETURN: Status | ||
374 | * | ||
375 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
376 | * internal resource descriptor, simplifying bitflags and handling | ||
377 | * alignment and endian issues if necessary. | ||
378 | * | ||
379 | ******************************************************************************/ | ||
380 | |||
381 | acpi_status | ||
382 | acpi_rs_get_end_dpf(union aml_resource *aml, | ||
383 | u16 aml_resource_length, struct acpi_resource *resource) | ||
384 | { | ||
385 | ACPI_FUNCTION_TRACE("rs_get_end_dpf"); | ||
386 | |||
387 | /* Complete the resource header */ | ||
388 | |||
389 | resource->type = ACPI_RESOURCE_TYPE_END_DEPENDENT; | ||
390 | resource->length = (u32) ACPI_RESOURCE_LENGTH; | ||
391 | return_ACPI_STATUS(AE_OK); | ||
392 | } | 526 | } |
393 | 527 | ||
394 | /******************************************************************************* | 528 | if (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) { |
395 | * | 529 | /* |
396 | * FUNCTION: acpi_rs_set_end_dpf | 530 | * Only [active_high, edge_sensitive] or [active_low, level_sensitive] |
397 | * | 531 | * polarity/trigger interrupts are allowed (ACPI spec, section |
398 | * PARAMETERS: Resource - Pointer to the resource descriptor | 532 | * "IRQ Format"), so 0x00 and 0x09 are illegal. |
399 | * Aml - Where the AML descriptor is returned | 533 | */ |
400 | * | 534 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
401 | * RETURN: Status | 535 | "Invalid interrupt polarity/trigger in resource list, %X\n", |
402 | * | 536 | aml->irq.flags)); |
403 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | 537 | return_ACPI_STATUS(AE_BAD_DATA); |
404 | * external AML resource descriptor. | ||
405 | * | ||
406 | ******************************************************************************/ | ||
407 | |||
408 | acpi_status | ||
409 | acpi_rs_set_end_dpf(struct acpi_resource *resource, union aml_resource *aml) | ||
410 | { | ||
411 | ACPI_FUNCTION_TRACE("rs_set_end_dpf"); | ||
412 | |||
413 | /* Complete the AML descriptor header */ | ||
414 | |||
415 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_END_DEPENDENT, | ||
416 | sizeof(struct aml_resource_end_dependent), | ||
417 | aml); | ||
418 | return_ACPI_STATUS(AE_OK); | ||
419 | } | 538 | } |
420 | 539 | ||
421 | /******************************************************************************* | 540 | resource->data.extended_irq.interrupt_count = temp8; |
422 | * | 541 | if (temp8 < 1) { |
423 | * FUNCTION: acpi_rs_get_end_tag | 542 | /* Must have at least one IRQ */ |
424 | * | ||
425 | * PARAMETERS: Aml - Pointer to the AML resource descriptor | ||
426 | * aml_resource_length - Length of the resource from the AML header | ||
427 | * Resource - Where the internal resource is returned | ||
428 | * | ||
429 | * RETURN: Status | ||
430 | * | ||
431 | * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding | ||
432 | * internal resource descriptor, simplifying bitflags and handling | ||
433 | * alignment and endian issues if necessary. | ||
434 | * | ||
435 | ******************************************************************************/ | ||
436 | |||
437 | acpi_status | ||
438 | acpi_rs_get_end_tag(union aml_resource *aml, | ||
439 | u16 aml_resource_length, struct acpi_resource *resource) | ||
440 | { | ||
441 | ACPI_FUNCTION_TRACE("rs_get_end_tag"); | ||
442 | |||
443 | /* Complete the resource header */ | ||
444 | 543 | ||
445 | resource->type = ACPI_RESOURCE_TYPE_END_TAG; | 544 | return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); |
446 | resource->length = ACPI_RESOURCE_LENGTH; | ||
447 | return_ACPI_STATUS(AE_OK); | ||
448 | } | 545 | } |
449 | 546 | ||
450 | /******************************************************************************* | 547 | if (resource->data.dma.transfer == 0x03) { |
451 | * | 548 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
452 | * FUNCTION: acpi_rs_set_end_tag | 549 | "Invalid DMA.Transfer preference (3)\n")); |
453 | * | 550 | return_ACPI_STATUS(AE_BAD_DATA); |
454 | * PARAMETERS: Resource - Pointer to the resource descriptor | ||
455 | * Aml - Where the AML descriptor is returned | ||
456 | * | ||
457 | * RETURN: Status | ||
458 | * | ||
459 | * DESCRIPTION: Convert an internal resource descriptor to the corresponding | ||
460 | * external AML resource descriptor. | ||
461 | * | ||
462 | ******************************************************************************/ | ||
463 | |||
464 | acpi_status | ||
465 | acpi_rs_set_end_tag(struct acpi_resource *resource, union aml_resource *aml) | ||
466 | { | ||
467 | ACPI_FUNCTION_TRACE("rs_set_end_tag"); | ||
468 | |||
469 | /* | ||
470 | * Set the Checksum - zero means that the resource data is treated as if | ||
471 | * the checksum operation succeeded (ACPI Spec 1.0b Section 6.4.2.8) | ||
472 | */ | ||
473 | aml->end_tag.checksum = 0; | ||
474 | |||
475 | /* Complete the AML descriptor header */ | ||
476 | |||
477 | acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_END_TAG, | ||
478 | sizeof(struct aml_resource_end_tag), aml); | ||
479 | return_ACPI_STATUS(AE_OK); | ||
480 | } | 551 | } |
552 | #endif | ||
diff --git a/drivers/acpi/resources/rsutils.c b/drivers/acpi/resources/rsutils.c index 9d503de1a349..7613033f5dcf 100644 --- a/drivers/acpi/resources/rsutils.c +++ b/drivers/acpi/resources/rsutils.c | |||
@@ -50,6 +50,64 @@ ACPI_MODULE_NAME("rsutils") | |||
50 | 50 | ||
51 | /******************************************************************************* | 51 | /******************************************************************************* |
52 | * | 52 | * |
53 | * FUNCTION: acpi_rs_decode_bitmask | ||
54 | * | ||
55 | * PARAMETERS: Mask - Bitmask to decode | ||
56 | * List - Where the converted list is returned | ||
57 | * | ||
58 | * RETURN: Count of bits set (length of list) | ||
59 | * | ||
60 | * DESCRIPTION: Convert a bit mask into a list of values | ||
61 | * | ||
62 | ******************************************************************************/ | ||
63 | u8 acpi_rs_decode_bitmask(u16 mask, u8 * list) | ||
64 | { | ||
65 | acpi_native_uint i; | ||
66 | u8 bit_count; | ||
67 | |||
68 | /* Decode the mask bits */ | ||
69 | |||
70 | for (i = 0, bit_count = 0; mask; i++) { | ||
71 | if (mask & 0x0001) { | ||
72 | list[bit_count] = (u8) i; | ||
73 | bit_count++; | ||
74 | } | ||
75 | |||
76 | mask >>= 1; | ||
77 | } | ||
78 | |||
79 | return (bit_count); | ||
80 | } | ||
81 | |||
82 | /******************************************************************************* | ||
83 | * | ||
84 | * FUNCTION: acpi_rs_encode_bitmask | ||
85 | * | ||
86 | * PARAMETERS: List - List of values to encode | ||
87 | * Count - Length of list | ||
88 | * | ||
89 | * RETURN: Encoded bitmask | ||
90 | * | ||
91 | * DESCRIPTION: Convert a list of values to an encoded bitmask | ||
92 | * | ||
93 | ******************************************************************************/ | ||
94 | |||
95 | u16 acpi_rs_encode_bitmask(u8 * list, u8 count) | ||
96 | { | ||
97 | acpi_native_uint i; | ||
98 | u16 mask; | ||
99 | |||
100 | /* Encode the list into a single bitmask */ | ||
101 | |||
102 | for (i = 0, mask = 0; i < count; i++) { | ||
103 | mask |= (0x0001 << list[i]); | ||
104 | } | ||
105 | |||
106 | return (mask); | ||
107 | } | ||
108 | |||
109 | /******************************************************************************* | ||
110 | * | ||
53 | * FUNCTION: acpi_rs_move_data | 111 | * FUNCTION: acpi_rs_move_data |
54 | * | 112 | * |
55 | * PARAMETERS: Destination - Pointer to the destination descriptor | 113 | * PARAMETERS: Destination - Pointer to the destination descriptor |
@@ -64,6 +122,7 @@ ACPI_MODULE_NAME("rsutils") | |||
64 | * via the ACPI_MOVE_* macros. (This is why a memcpy is not used) | 122 | * via the ACPI_MOVE_* macros. (This is why a memcpy is not used) |
65 | * | 123 | * |
66 | ******************************************************************************/ | 124 | ******************************************************************************/ |
125 | |||
67 | void | 126 | void |
68 | acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) | 127 | acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) |
69 | { | 128 | { |
@@ -73,22 +132,30 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) | |||
73 | 132 | ||
74 | for (i = 0; i < item_count; i++) { | 133 | for (i = 0; i < item_count; i++) { |
75 | switch (move_type) { | 134 | switch (move_type) { |
76 | case ACPI_MOVE_TYPE_16_TO_32: | 135 | /* |
77 | ACPI_MOVE_16_TO_32(&((u32 *) destination)[i], | 136 | * For the 8-bit case, we can perform the move all at once |
78 | &((u16 *) source)[i]); | 137 | * since there are no alignment or endian issues |
79 | break; | 138 | */ |
139 | case ACPI_RSC_MOVE8: | ||
140 | ACPI_MEMCPY(destination, source, item_count); | ||
141 | return; | ||
80 | 142 | ||
81 | case ACPI_MOVE_TYPE_32_TO_16: | 143 | /* |
82 | ACPI_MOVE_32_TO_16(&((u16 *) destination)[i], | 144 | * 16-, 32-, and 64-bit cases must use the move macros that perform |
83 | &((u32 *) source)[i]); | 145 | * endian conversion and/or accomodate hardware that cannot perform |
146 | * misaligned memory transfers | ||
147 | */ | ||
148 | case ACPI_RSC_MOVE16: | ||
149 | ACPI_MOVE_16_TO_16(&((u16 *) destination)[i], | ||
150 | &((u16 *) source)[i]); | ||
84 | break; | 151 | break; |
85 | 152 | ||
86 | case ACPI_MOVE_TYPE_32_TO_32: | 153 | case ACPI_RSC_MOVE32: |
87 | ACPI_MOVE_32_TO_32(&((u32 *) destination)[i], | 154 | ACPI_MOVE_32_TO_32(&((u32 *) destination)[i], |
88 | &((u32 *) source)[i]); | 155 | &((u32 *) source)[i]); |
89 | break; | 156 | break; |
90 | 157 | ||
91 | case ACPI_MOVE_TYPE_64_TO_64: | 158 | case ACPI_RSC_MOVE64: |
92 | ACPI_MOVE_64_TO_64(&((u64 *) destination)[i], | 159 | ACPI_MOVE_64_TO_64(&((u64 *) destination)[i], |
93 | &((u64 *) source)[i]); | 160 | &((u64 *) source)[i]); |
94 | break; | 161 | break; |
@@ -148,80 +215,57 @@ struct acpi_resource_info *acpi_rs_get_resource_info(u8 resource_type) | |||
148 | 215 | ||
149 | /******************************************************************************* | 216 | /******************************************************************************* |
150 | * | 217 | * |
151 | * FUNCTION: acpi_rs_get_resource_length | 218 | * FUNCTION: acpi_rs_set_resource_length |
152 | * | 219 | * |
153 | * PARAMETERS: Aml - Pointer to the raw AML resource descriptor | 220 | * PARAMETERS: total_length - Length of the AML descriptor, including |
221 | * the header and length fields. | ||
222 | * Aml - Pointer to the raw AML descriptor | ||
154 | * | 223 | * |
155 | * RETURN: Byte Length | 224 | * RETURN: None |
156 | * | 225 | * |
157 | * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By | 226 | * DESCRIPTION: Set the resource_length field of an AML |
158 | * definition, this does not include the size of the descriptor | 227 | * resource descriptor, both Large and Small descriptors are |
159 | * header or the length field itself. | 228 | * supported automatically. Note: Descriptor Type field must |
229 | * be valid. | ||
160 | * | 230 | * |
161 | ******************************************************************************/ | 231 | ******************************************************************************/ |
162 | 232 | ||
163 | u16 acpi_rs_get_resource_length(union aml_resource * aml) | 233 | void |
234 | acpi_rs_set_resource_length(acpi_rsdesc_size total_length, | ||
235 | union aml_resource *aml) | ||
164 | { | 236 | { |
165 | u16 resource_length; | 237 | acpi_rs_length resource_length; |
166 | 238 | ||
167 | ACPI_FUNCTION_ENTRY(); | 239 | ACPI_FUNCTION_ENTRY(); |
168 | 240 | ||
169 | /* Determine if this is a small or large resource */ | 241 | /* Determine if this is a small or large resource */ |
170 | 242 | ||
171 | if (aml->large_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { | 243 | if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { |
172 | /* Large Resource type -- bytes 1-2 contain the 16-bit length */ | 244 | /* Large Resource type -- bytes 1-2 contain the 16-bit length */ |
173 | 245 | ||
174 | ACPI_MOVE_16_TO_16(&resource_length, | 246 | resource_length = (acpi_rs_length) |
175 | &aml->large_header.resource_length); | 247 | (total_length - sizeof(struct aml_resource_large_header)); |
248 | |||
249 | /* Insert length into the Large descriptor length field */ | ||
176 | 250 | ||
251 | ACPI_MOVE_16_TO_16(&aml->large_header.resource_length, | ||
252 | &resource_length); | ||
177 | } else { | 253 | } else { |
178 | /* Small Resource type -- bits 2:0 of byte 0 contain the length */ | 254 | /* Small Resource type -- bits 2:0 of byte 0 contain the length */ |
179 | 255 | ||
180 | resource_length = (u16) (aml->small_header.descriptor_type & | 256 | resource_length = (acpi_rs_length) |
181 | ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK); | 257 | (total_length - sizeof(struct aml_resource_small_header)); |
182 | } | ||
183 | |||
184 | return (resource_length); | ||
185 | } | ||
186 | 258 | ||
187 | /******************************************************************************* | 259 | /* Insert length into the descriptor type byte */ |
188 | * | ||
189 | * FUNCTION: acpi_rs_get_descriptor_length | ||
190 | * | ||
191 | * PARAMETERS: Aml - Pointer to the raw AML resource descriptor | ||
192 | * | ||
193 | * RETURN: Byte length | ||
194 | * | ||
195 | * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the | ||
196 | * length of the descriptor header and the length field itself. | ||
197 | * Used to walk descriptor lists. | ||
198 | * | ||
199 | ******************************************************************************/ | ||
200 | |||
201 | u32 acpi_rs_get_descriptor_length(union aml_resource * aml) | ||
202 | { | ||
203 | u32 descriptor_length; | ||
204 | |||
205 | ACPI_FUNCTION_ENTRY(); | ||
206 | |||
207 | /* Determine if this is a small or large resource */ | ||
208 | |||
209 | if (aml->large_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { | ||
210 | /* Large Resource type -- bytes 1-2 contain the 16-bit length */ | ||
211 | 260 | ||
212 | ACPI_MOVE_16_TO_32(&descriptor_length, | 261 | aml->small_header.descriptor_type = (u8) |
213 | &aml->large_header.resource_length); | ||
214 | descriptor_length += sizeof(struct aml_resource_large_header); | ||
215 | 262 | ||
216 | } else { | 263 | /* Clear any existing length, preserving descriptor type bits */ |
217 | /* Small Resource type -- bits 2:0 of byte 0 contain the length */ | 264 | ((aml->small_header. |
265 | descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK) | ||
218 | 266 | ||
219 | descriptor_length = (u32) (aml->small_header.descriptor_type & | 267 | | resource_length); |
220 | ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK); | ||
221 | descriptor_length += sizeof(struct aml_resource_small_header); | ||
222 | } | 268 | } |
223 | |||
224 | return (descriptor_length); | ||
225 | } | 269 | } |
226 | 270 | ||
227 | /******************************************************************************* | 271 | /******************************************************************************* |
@@ -243,71 +287,18 @@ u32 acpi_rs_get_descriptor_length(union aml_resource * aml) | |||
243 | 287 | ||
244 | void | 288 | void |
245 | acpi_rs_set_resource_header(u8 descriptor_type, | 289 | acpi_rs_set_resource_header(u8 descriptor_type, |
246 | acpi_size total_length, union aml_resource *aml) | 290 | acpi_rsdesc_size total_length, |
291 | union aml_resource *aml) | ||
247 | { | 292 | { |
248 | u16 resource_length; | ||
249 | |||
250 | ACPI_FUNCTION_ENTRY(); | 293 | ACPI_FUNCTION_ENTRY(); |
251 | 294 | ||
252 | /* Set the descriptor type */ | 295 | /* Set the Descriptor Type */ |
253 | 296 | ||
254 | aml->small_header.descriptor_type = descriptor_type; | 297 | aml->small_header.descriptor_type = descriptor_type; |
255 | 298 | ||
256 | /* Determine if this is a small or large resource */ | 299 | /* Set the Resource Length */ |
257 | |||
258 | if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) { | ||
259 | /* Large Resource type -- bytes 1-2 contain the 16-bit length */ | ||
260 | |||
261 | resource_length = | ||
262 | (u16) (total_length - | ||
263 | sizeof(struct aml_resource_large_header)); | ||
264 | |||
265 | /* Insert length into the Large descriptor length field */ | ||
266 | |||
267 | ACPI_MOVE_16_TO_16(&aml->large_header.resource_length, | ||
268 | &resource_length); | ||
269 | } else { | ||
270 | /* Small Resource type -- bits 2:0 of byte 0 contain the length */ | ||
271 | |||
272 | resource_length = | ||
273 | (u16) (total_length - | ||
274 | sizeof(struct aml_resource_small_header)); | ||
275 | |||
276 | /* Insert length into the descriptor type byte */ | ||
277 | |||
278 | aml->small_header.descriptor_type |= (u8) resource_length; | ||
279 | } | ||
280 | } | ||
281 | |||
282 | /******************************************************************************* | ||
283 | * | ||
284 | * FUNCTION: acpi_rs_get_resource_type | ||
285 | * | ||
286 | * PARAMETERS: resource_type - Byte 0 of a resource descriptor | ||
287 | * | ||
288 | * RETURN: The Resource Type with no extraneous bits (except the | ||
289 | * Large/Small descriptor bit -- this is left alone) | ||
290 | * | ||
291 | * DESCRIPTION: Extract the Resource Type/Name from the first byte of | ||
292 | * a resource descriptor. | ||
293 | * | ||
294 | ******************************************************************************/ | ||
295 | |||
296 | u8 acpi_rs_get_resource_type(u8 resource_type) | ||
297 | { | ||
298 | ACPI_FUNCTION_ENTRY(); | ||
299 | 300 | ||
300 | /* Determine if this is a small or large resource */ | 301 | acpi_rs_set_resource_length(total_length, aml); |
301 | |||
302 | if (resource_type & ACPI_RESOURCE_NAME_LARGE) { | ||
303 | /* Large Resource Type -- bits 6:0 contain the name */ | ||
304 | |||
305 | return (resource_type); | ||
306 | } else { | ||
307 | /* Small Resource Type -- bits 6:3 contain the name */ | ||
308 | |||
309 | return ((u8) (resource_type & ACPI_RESOURCE_NAME_SMALL_MASK)); | ||
310 | } | ||
311 | } | 302 | } |
312 | 303 | ||
313 | /******************************************************************************* | 304 | /******************************************************************************* |
@@ -360,13 +351,13 @@ static u16 acpi_rs_strcpy(char *destination, char *source) | |||
360 | * | 351 | * |
361 | ******************************************************************************/ | 352 | ******************************************************************************/ |
362 | 353 | ||
363 | u16 | 354 | acpi_rs_length |
364 | acpi_rs_get_resource_source(u16 resource_length, | 355 | acpi_rs_get_resource_source(acpi_rs_length resource_length, |
365 | acpi_size minimum_length, | 356 | acpi_rs_length minimum_length, |
366 | struct acpi_resource_source * resource_source, | 357 | struct acpi_resource_source * resource_source, |
367 | union aml_resource * aml, char *string_ptr) | 358 | union aml_resource * aml, char *string_ptr) |
368 | { | 359 | { |
369 | acpi_size total_length; | 360 | acpi_rsdesc_size total_length; |
370 | u8 *aml_resource_source; | 361 | u8 *aml_resource_source; |
371 | 362 | ||
372 | ACPI_FUNCTION_ENTRY(); | 363 | ACPI_FUNCTION_ENTRY(); |
@@ -382,7 +373,7 @@ acpi_rs_get_resource_source(u16 resource_length, | |||
382 | * Note: Some resource descriptors will have an additional null, so | 373 | * Note: Some resource descriptors will have an additional null, so |
383 | * we add 1 to the minimum length. | 374 | * we add 1 to the minimum length. |
384 | */ | 375 | */ |
385 | if (total_length > (minimum_length + 1)) { | 376 | if (total_length > (acpi_rsdesc_size) (minimum_length + 1)) { |
386 | /* Get the resource_source_index */ | 377 | /* Get the resource_source_index */ |
387 | 378 | ||
388 | resource_source->index = aml_resource_source[0]; | 379 | resource_source->index = aml_resource_source[0]; |
@@ -398,20 +389,26 @@ acpi_rs_get_resource_source(u16 resource_length, | |||
398 | sizeof(struct acpi_resource_source); | 389 | sizeof(struct acpi_resource_source); |
399 | } | 390 | } |
400 | 391 | ||
392 | /* | ||
393 | * In order for the struct_size to fall on a 32-bit boundary, calculate | ||
394 | * the length of the string (+1 for the NULL terminator) and expand the | ||
395 | * struct_size to the next 32-bit boundary. | ||
396 | * | ||
397 | * Zero the entire area of the buffer. | ||
398 | */ | ||
399 | total_length = | ||
400 | ACPI_ROUND_UP_to_32_bITS(ACPI_STRLEN | ||
401 | ((char *)&aml_resource_source[1]) + | ||
402 | 1); | ||
403 | ACPI_MEMSET(resource_source->string_ptr, 0, total_length); | ||
404 | |||
401 | /* Copy the resource_source string to the destination */ | 405 | /* Copy the resource_source string to the destination */ |
402 | 406 | ||
403 | resource_source->string_length = | 407 | resource_source->string_length = |
404 | acpi_rs_strcpy(resource_source->string_ptr, | 408 | acpi_rs_strcpy(resource_source->string_ptr, |
405 | (char *)&aml_resource_source[1]); | 409 | (char *)&aml_resource_source[1]); |
406 | 410 | ||
407 | /* | 411 | return ((acpi_rs_length) total_length); |
408 | * In order for the struct_size to fall on a 32-bit boundary, | ||
409 | * calculate the length of the string and expand the | ||
410 | * struct_size to the next 32-bit boundary. | ||
411 | */ | ||
412 | return ((u16) | ||
413 | ACPI_ROUND_UP_to_32_bITS(resource_source-> | ||
414 | string_length)); | ||
415 | } else { | 412 | } else { |
416 | /* resource_source is not present */ | 413 | /* resource_source is not present */ |
417 | 414 | ||
@@ -434,18 +431,18 @@ acpi_rs_get_resource_source(u16 resource_length, | |||
434 | * | 431 | * |
435 | * RETURN: Total length of the AML descriptor | 432 | * RETURN: Total length of the AML descriptor |
436 | * | 433 | * |
437 | * DESCRIPTION: Convert an optoinal resource_source from internal format to a | 434 | * DESCRIPTION: Convert an optional resource_source from internal format to a |
438 | * raw AML resource descriptor | 435 | * raw AML resource descriptor |
439 | * | 436 | * |
440 | ******************************************************************************/ | 437 | ******************************************************************************/ |
441 | 438 | ||
442 | acpi_size | 439 | acpi_rsdesc_size |
443 | acpi_rs_set_resource_source(union aml_resource * aml, | 440 | acpi_rs_set_resource_source(union aml_resource * aml, |
444 | acpi_size minimum_length, | 441 | acpi_rs_length minimum_length, |
445 | struct acpi_resource_source * resource_source) | 442 | struct acpi_resource_source * resource_source) |
446 | { | 443 | { |
447 | u8 *aml_resource_source; | 444 | u8 *aml_resource_source; |
448 | acpi_size descriptor_length; | 445 | acpi_rsdesc_size descriptor_length; |
449 | 446 | ||
450 | ACPI_FUNCTION_ENTRY(); | 447 | ACPI_FUNCTION_ENTRY(); |
451 | 448 | ||
@@ -472,7 +469,7 @@ acpi_rs_set_resource_source(union aml_resource * aml, | |||
472 | * final descriptor length | 469 | * final descriptor length |
473 | */ | 470 | */ |
474 | descriptor_length += | 471 | descriptor_length += |
475 | ((acpi_size) resource_source->string_length + 1); | 472 | ((acpi_rsdesc_size) resource_source->string_length + 1); |
476 | } | 473 | } |
477 | 474 | ||
478 | /* Return the new total length of the AML descriptor */ | 475 | /* Return the new total length of the AML descriptor */ |
diff --git a/drivers/acpi/resources/rsxface.c b/drivers/acpi/resources/rsxface.c index 9d179beb17ae..09d250ab9872 100644 --- a/drivers/acpi/resources/rsxface.c +++ b/drivers/acpi/resources/rsxface.c | |||
@@ -57,7 +57,7 @@ ACPI_MODULE_NAME("rsxface") | |||
57 | ACPI_COPY_FIELD(out, in, decode); \ | 57 | ACPI_COPY_FIELD(out, in, decode); \ |
58 | ACPI_COPY_FIELD(out, in, min_address_fixed); \ | 58 | ACPI_COPY_FIELD(out, in, min_address_fixed); \ |
59 | ACPI_COPY_FIELD(out, in, max_address_fixed); \ | 59 | ACPI_COPY_FIELD(out, in, max_address_fixed); \ |
60 | ACPI_COPY_FIELD(out, in, attribute); \ | 60 | ACPI_COPY_FIELD(out, in, info); \ |
61 | ACPI_COPY_FIELD(out, in, granularity); \ | 61 | ACPI_COPY_FIELD(out, in, granularity); \ |
62 | ACPI_COPY_FIELD(out, in, minimum); \ | 62 | ACPI_COPY_FIELD(out, in, minimum); \ |
63 | ACPI_COPY_FIELD(out, in, maximum); \ | 63 | ACPI_COPY_FIELD(out, in, maximum); \ |