1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46#include "acresrc.h"
47
48#define _COMPONENT ACPI_RESOURCES
49ACPI_MODULE_NAME("rsdump")
50
51
52
53
54
55static void acpi_rs_out_string(const char *title, const char *value);
56
57static void acpi_rs_out_integer8(const char *title, u8 value);
58
59static void acpi_rs_out_integer16(const char *title, u16 value);
60
61static void acpi_rs_out_integer32(const char *title, u32 value);
62
63static void acpi_rs_out_integer64(const char *title, u64 value);
64
65static void acpi_rs_out_title(const char *title);
66
67static void acpi_rs_dump_byte_list(u16 length, u8 *data);
68
69static void acpi_rs_dump_word_list(u16 length, u16 *data);
70
71static void acpi_rs_dump_dword_list(u8 length, u32 *data);
72
73static void acpi_rs_dump_short_byte_list(u8 length, u8 *data);
74
75static void
76acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
77
78static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
79
80static void
81acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table);
82
83
84
85
86
87
88
89
90
91
92
93
94
95void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
96{
97 u32 count = 0;
98 u32 type;
99
100 ACPI_FUNCTION_ENTRY();
101
102
103
104 if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) {
105 return;
106 }
107
108
109
110 do {
111 acpi_os_printf("\n[%02X] ", count);
112 count++;
113
114
115
116 type = resource_list->type;
117 if (type > ACPI_RESOURCE_TYPE_MAX) {
118 acpi_os_printf
119 ("Invalid descriptor type (%X) in resource list\n",
120 resource_list->type);
121 return;
122 }
123
124
125
126 if (!resource_list->length) {
127 acpi_os_printf
128 ("Invalid zero length descriptor in resource list\n");
129 return;
130 }
131
132
133
134 if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
135 acpi_rs_dump_descriptor(&resource_list->data,
136 acpi_gbl_dump_serial_bus_dispatch
137 [resource_list->data.
138 common_serial_bus.type]);
139 } else {
140 acpi_rs_dump_descriptor(&resource_list->data,
141 acpi_gbl_dump_resource_dispatch
142 [type]);
143 }
144
145
146
147 resource_list = ACPI_NEXT_RESOURCE(resource_list);
148
149
150
151 } while (type != ACPI_RESOURCE_TYPE_END_TAG);
152}
153
154
155
156
157
158
159
160
161
162
163
164
165
166void acpi_rs_dump_irq_list(u8 *route_table)
167{
168 struct acpi_pci_routing_table *prt_element;
169 u8 count;
170
171 ACPI_FUNCTION_ENTRY();
172
173
174
175 if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) {
176 return;
177 }
178
179 prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table);
180
181
182
183 for (count = 0; prt_element->length; count++) {
184 acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n",
185 count);
186 acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt);
187
188 prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table,
189 prt_element, prt_element->length);
190 }
191}
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206static void
207acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
208{
209 u8 *target = NULL;
210 u8 *previous_target;
211 const char *name;
212 u8 count;
213
214
215
216 count = table->offset;
217
218 while (count) {
219 previous_target = target;
220 target = ACPI_ADD_PTR(u8, resource, table->offset);
221 name = table->name;
222
223 switch (table->opcode) {
224 case ACPI_RSD_TITLE:
225
226
227
228 if (table->name) {
229 acpi_os_printf("%s Resource\n", name);
230 }
231 break;
232
233
234
235 case ACPI_RSD_LITERAL:
236
237 acpi_rs_out_string(name,
238 ACPI_CAST_PTR(char, table->pointer));
239 break;
240
241 case ACPI_RSD_STRING:
242
243 acpi_rs_out_string(name, ACPI_CAST_PTR(char, target));
244 break;
245
246
247
248 case ACPI_RSD_UINT8:
249
250 if (table->pointer) {
251 acpi_rs_out_string(name,
252 table->pointer[*target]);
253 } else {
254 acpi_rs_out_integer8(name, ACPI_GET8(target));
255 }
256 break;
257
258 case ACPI_RSD_UINT16:
259
260 acpi_rs_out_integer16(name, ACPI_GET16(target));
261 break;
262
263 case ACPI_RSD_UINT32:
264
265 acpi_rs_out_integer32(name, ACPI_GET32(target));
266 break;
267
268 case ACPI_RSD_UINT64:
269
270 acpi_rs_out_integer64(name, ACPI_GET64(target));
271 break;
272
273
274
275 case ACPI_RSD_1BITFLAG:
276
277 acpi_rs_out_string(name,
278 table->pointer[*target & 0x01]);
279 break;
280
281 case ACPI_RSD_2BITFLAG:
282
283 acpi_rs_out_string(name,
284 table->pointer[*target & 0x03]);
285 break;
286
287 case ACPI_RSD_3BITFLAG:
288
289 acpi_rs_out_string(name,
290 table->pointer[*target & 0x07]);
291 break;
292
293 case ACPI_RSD_SHORTLIST:
294
295
296
297
298 if (previous_target) {
299 acpi_rs_out_title(name);
300 acpi_rs_dump_short_byte_list(*previous_target,
301 target);
302 }
303 break;
304
305 case ACPI_RSD_SHORTLISTX:
306
307
308
309
310 if (previous_target) {
311 acpi_rs_out_title(name);
312 acpi_rs_dump_short_byte_list(*previous_target,
313 *
314 (ACPI_CAST_INDIRECT_PTR
315 (u8, target)));
316 }
317 break;
318
319 case ACPI_RSD_LONGLIST:
320
321
322
323
324 if (previous_target) {
325 acpi_rs_dump_byte_list(ACPI_GET16
326 (previous_target),
327 target);
328 }
329 break;
330
331 case ACPI_RSD_DWORDLIST:
332
333
334
335
336 if (previous_target) {
337 acpi_rs_dump_dword_list(*previous_target,
338 ACPI_CAST_PTR(u32,
339 target));
340 }
341 break;
342
343 case ACPI_RSD_WORDLIST:
344
345
346
347
348 if (previous_target) {
349 acpi_rs_dump_word_list(*previous_target,
350 *(ACPI_CAST_INDIRECT_PTR
351 (u16, target)));
352 }
353 break;
354
355 case ACPI_RSD_ADDRESS:
356
357
358
359 acpi_rs_dump_address_common(ACPI_CAST_PTR
360 (union acpi_resource_data,
361 target));
362 break;
363
364 case ACPI_RSD_SOURCE:
365
366
367
368 acpi_rs_dump_resource_source(ACPI_CAST_PTR
369 (struct
370 acpi_resource_source,
371 target));
372 break;
373
374 default:
375
376 acpi_os_printf("**** Invalid table opcode [%X] ****\n",
377 table->opcode);
378 return;
379 }
380
381 table++;
382 count--;
383 }
384}
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399static void
400acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
401{
402 ACPI_FUNCTION_ENTRY();
403
404 if (resource_source->index == 0xFF) {
405 return;
406 }
407
408 acpi_rs_out_integer8("Resource Source Index", resource_source->index);
409
410 acpi_rs_out_string("Resource Source",
411 resource_source->string_ptr ?
412 resource_source->string_ptr : "[Not Specified]");
413}
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
429{
430 ACPI_FUNCTION_ENTRY();
431
432
433
434 switch (resource->address.resource_type) {
435 case ACPI_MEMORY_RANGE:
436
437 acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags);
438 break;
439
440 case ACPI_IO_RANGE:
441
442 acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags);
443 break;
444
445 case ACPI_BUS_NUMBER_RANGE:
446
447 acpi_rs_out_string("Resource Type", "Bus Number Range");
448 break;
449
450 default:
451
452 acpi_rs_out_integer8("Resource Type",
453 (u8) resource->address.resource_type);
454 break;
455 }
456
457
458
459 acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags);
460}
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476static void acpi_rs_out_string(const char *title, const char *value)
477{
478
479 acpi_os_printf("%27s : %s", title, value);
480 if (!*value) {
481 acpi_os_printf("[NULL NAMESTRING]");
482 }
483 acpi_os_printf("\n");
484}
485
486static void acpi_rs_out_integer8(const char *title, u8 value)
487{
488 acpi_os_printf("%27s : %2.2X\n", title, value);
489}
490
491static void acpi_rs_out_integer16(const char *title, u16 value)
492{
493
494 acpi_os_printf("%27s : %4.4X\n", title, value);
495}
496
497static void acpi_rs_out_integer32(const char *title, u32 value)
498{
499
500 acpi_os_printf("%27s : %8.8X\n", title, value);
501}
502
503static void acpi_rs_out_integer64(const char *title, u64 value)
504{
505
506 acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
507}
508
509static void acpi_rs_out_title(const char *title)
510{
511
512 acpi_os_printf("%27s : ", title);
513}
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528static void acpi_rs_dump_byte_list(u16 length, u8 * data)
529{
530 u8 i;
531
532 for (i = 0; i < length; i++) {
533 acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]);
534 }
535}
536
537static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
538{
539 u8 i;
540
541 for (i = 0; i < length; i++) {
542 acpi_os_printf("%X ", data[i]);
543 }
544
545 acpi_os_printf("\n");
546}
547
548static void acpi_rs_dump_dword_list(u8 length, u32 * data)
549{
550 u8 i;
551
552 for (i = 0; i < length; i++) {
553 acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]);
554 }
555}
556
557static void acpi_rs_dump_word_list(u16 length, u16 *data)
558{
559 u16 i;
560
561 for (i = 0; i < length; i++) {
562 acpi_os_printf("%25s%2.2X : %4.4X\n", "Word", i, data[i]);
563 }
564}
565