diff options
author | Len Brown <len.brown@intel.com> | 2009-01-09 00:13:17 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-01-09 03:30:47 -0500 |
commit | 95b482a8d31116f3f5c2a5089569393234d06385 (patch) | |
tree | f32aec8673a285a9d188948be97af3034ee06e93 /drivers/acpi/acpica/nsdump.c | |
parent | 6620e0c49f577454b772fb381543d60ae53eb885 (diff) |
ACPICA: create acpica/ directory
also, delete sleep/ and delete ACPI_CFLAGS from Makefile
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/nsdump.c')
-rw-r--r-- | drivers/acpi/acpica/nsdump.c | 709 |
1 files changed, 709 insertions, 0 deletions
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c new file mode 100644 index 000000000000..48f02e659f24 --- /dev/null +++ b/drivers/acpi/acpica/nsdump.c | |||
@@ -0,0 +1,709 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: nsdump - table dumping routines for debug | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #include <acpi/acpi.h> | ||
45 | #include <acpi/accommon.h> | ||
46 | #include <acpi/acnamesp.h> | ||
47 | |||
48 | #define _COMPONENT ACPI_NAMESPACE | ||
49 | ACPI_MODULE_NAME("nsdump") | ||
50 | |||
51 | /* Local prototypes */ | ||
52 | #ifdef ACPI_OBSOLETE_FUNCTIONS | ||
53 | void acpi_ns_dump_root_devices(void); | ||
54 | |||
55 | static acpi_status | ||
56 | acpi_ns_dump_one_device(acpi_handle obj_handle, | ||
57 | u32 level, void *context, void **return_value); | ||
58 | #endif | ||
59 | |||
60 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) | ||
61 | /******************************************************************************* | ||
62 | * | ||
63 | * FUNCTION: acpi_ns_print_pathname | ||
64 | * | ||
65 | * PARAMETERS: num_segments - Number of ACPI name segments | ||
66 | * Pathname - The compressed (internal) path | ||
67 | * | ||
68 | * RETURN: None | ||
69 | * | ||
70 | * DESCRIPTION: Print an object's full namespace pathname | ||
71 | * | ||
72 | ******************************************************************************/ | ||
73 | |||
74 | void acpi_ns_print_pathname(u32 num_segments, char *pathname) | ||
75 | { | ||
76 | u32 i; | ||
77 | |||
78 | ACPI_FUNCTION_NAME(ns_print_pathname); | ||
79 | |||
80 | if (!(acpi_dbg_level & ACPI_LV_NAMES) | ||
81 | || !(acpi_dbg_layer & ACPI_NAMESPACE)) { | ||
82 | return; | ||
83 | } | ||
84 | |||
85 | /* Print the entire name */ | ||
86 | |||
87 | ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[")); | ||
88 | |||
89 | while (num_segments) { | ||
90 | for (i = 0; i < 4; i++) { | ||
91 | ACPI_IS_PRINT(pathname[i]) ? | ||
92 | acpi_os_printf("%c", pathname[i]) : | ||
93 | acpi_os_printf("?"); | ||
94 | } | ||
95 | |||
96 | pathname += ACPI_NAME_SIZE; | ||
97 | num_segments--; | ||
98 | if (num_segments) { | ||
99 | acpi_os_printf("."); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | acpi_os_printf("]\n"); | ||
104 | } | ||
105 | |||
106 | /******************************************************************************* | ||
107 | * | ||
108 | * FUNCTION: acpi_ns_dump_pathname | ||
109 | * | ||
110 | * PARAMETERS: Handle - Object | ||
111 | * Msg - Prefix message | ||
112 | * Level - Desired debug level | ||
113 | * Component - Caller's component ID | ||
114 | * | ||
115 | * RETURN: None | ||
116 | * | ||
117 | * DESCRIPTION: Print an object's full namespace pathname | ||
118 | * Manages allocation/freeing of a pathname buffer | ||
119 | * | ||
120 | ******************************************************************************/ | ||
121 | |||
122 | void | ||
123 | acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component) | ||
124 | { | ||
125 | |||
126 | ACPI_FUNCTION_TRACE(ns_dump_pathname); | ||
127 | |||
128 | /* Do this only if the requested debug level and component are enabled */ | ||
129 | |||
130 | if (!(acpi_dbg_level & level) || !(acpi_dbg_layer & component)) { | ||
131 | return_VOID; | ||
132 | } | ||
133 | |||
134 | /* Convert handle to a full pathname and print it (with supplied message) */ | ||
135 | |||
136 | acpi_ns_print_node_pathname(handle, msg); | ||
137 | acpi_os_printf("\n"); | ||
138 | return_VOID; | ||
139 | } | ||
140 | |||
141 | /******************************************************************************* | ||
142 | * | ||
143 | * FUNCTION: acpi_ns_dump_one_object | ||
144 | * | ||
145 | * PARAMETERS: obj_handle - Node to be dumped | ||
146 | * Level - Nesting level of the handle | ||
147 | * Context - Passed into walk_namespace | ||
148 | * return_value - Not used | ||
149 | * | ||
150 | * RETURN: Status | ||
151 | * | ||
152 | * DESCRIPTION: Dump a single Node | ||
153 | * This procedure is a user_function called by acpi_ns_walk_namespace. | ||
154 | * | ||
155 | ******************************************************************************/ | ||
156 | |||
157 | acpi_status | ||
158 | acpi_ns_dump_one_object(acpi_handle obj_handle, | ||
159 | u32 level, void *context, void **return_value) | ||
160 | { | ||
161 | struct acpi_walk_info *info = (struct acpi_walk_info *)context; | ||
162 | struct acpi_namespace_node *this_node; | ||
163 | union acpi_operand_object *obj_desc = NULL; | ||
164 | acpi_object_type obj_type; | ||
165 | acpi_object_type type; | ||
166 | u32 bytes_to_dump; | ||
167 | u32 dbg_level; | ||
168 | u32 i; | ||
169 | |||
170 | ACPI_FUNCTION_NAME(ns_dump_one_object); | ||
171 | |||
172 | /* Is output enabled? */ | ||
173 | |||
174 | if (!(acpi_dbg_level & info->debug_level)) { | ||
175 | return (AE_OK); | ||
176 | } | ||
177 | |||
178 | if (!obj_handle) { | ||
179 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Null object handle\n")); | ||
180 | return (AE_OK); | ||
181 | } | ||
182 | |||
183 | this_node = acpi_ns_map_handle_to_node(obj_handle); | ||
184 | type = this_node->type; | ||
185 | |||
186 | /* Check if the owner matches */ | ||
187 | |||
188 | if ((info->owner_id != ACPI_OWNER_ID_MAX) && | ||
189 | (info->owner_id != this_node->owner_id)) { | ||
190 | return (AE_OK); | ||
191 | } | ||
192 | |||
193 | if (!(info->display_type & ACPI_DISPLAY_SHORT)) { | ||
194 | |||
195 | /* Indent the object according to the level */ | ||
196 | |||
197 | acpi_os_printf("%2d%*s", (u32) level - 1, (int)level * 2, " "); | ||
198 | |||
199 | /* Check the node type and name */ | ||
200 | |||
201 | if (type > ACPI_TYPE_LOCAL_MAX) { | ||
202 | ACPI_WARNING((AE_INFO, "Invalid ACPI Object Type %08X", | ||
203 | type)); | ||
204 | } | ||
205 | |||
206 | if (!acpi_ut_valid_acpi_name(this_node->name.integer)) { | ||
207 | this_node->name.integer = | ||
208 | acpi_ut_repair_name(this_node->name.ascii); | ||
209 | |||
210 | ACPI_WARNING((AE_INFO, "Invalid ACPI Name %08X", | ||
211 | this_node->name.integer)); | ||
212 | } | ||
213 | |||
214 | acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node)); | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * Now we can print out the pertinent information | ||
219 | */ | ||
220 | acpi_os_printf(" %-12s %p %2.2X ", | ||
221 | acpi_ut_get_type_name(type), this_node, | ||
222 | this_node->owner_id); | ||
223 | |||
224 | dbg_level = acpi_dbg_level; | ||
225 | acpi_dbg_level = 0; | ||
226 | obj_desc = acpi_ns_get_attached_object(this_node); | ||
227 | acpi_dbg_level = dbg_level; | ||
228 | |||
229 | /* Temp nodes are those nodes created by a control method */ | ||
230 | |||
231 | if (this_node->flags & ANOBJ_TEMPORARY) { | ||
232 | acpi_os_printf("(T) "); | ||
233 | } | ||
234 | |||
235 | switch (info->display_type & ACPI_DISPLAY_MASK) { | ||
236 | case ACPI_DISPLAY_SUMMARY: | ||
237 | |||
238 | if (!obj_desc) { | ||
239 | |||
240 | /* No attached object, we are done */ | ||
241 | |||
242 | acpi_os_printf("\n"); | ||
243 | return (AE_OK); | ||
244 | } | ||
245 | |||
246 | switch (type) { | ||
247 | case ACPI_TYPE_PROCESSOR: | ||
248 | |||
249 | acpi_os_printf("ID %X Len %.4X Addr %p\n", | ||
250 | obj_desc->processor.proc_id, | ||
251 | obj_desc->processor.length, | ||
252 | ACPI_CAST_PTR(void, | ||
253 | obj_desc->processor. | ||
254 | address)); | ||
255 | break; | ||
256 | |||
257 | case ACPI_TYPE_DEVICE: | ||
258 | |||
259 | acpi_os_printf("Notify Object: %p\n", obj_desc); | ||
260 | break; | ||
261 | |||
262 | case ACPI_TYPE_METHOD: | ||
263 | |||
264 | acpi_os_printf("Args %X Len %.4X Aml %p\n", | ||
265 | (u32) obj_desc->method.param_count, | ||
266 | obj_desc->method.aml_length, | ||
267 | obj_desc->method.aml_start); | ||
268 | break; | ||
269 | |||
270 | case ACPI_TYPE_INTEGER: | ||
271 | |||
272 | acpi_os_printf("= %8.8X%8.8X\n", | ||
273 | ACPI_FORMAT_UINT64(obj_desc->integer. | ||
274 | value)); | ||
275 | break; | ||
276 | |||
277 | case ACPI_TYPE_PACKAGE: | ||
278 | |||
279 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { | ||
280 | acpi_os_printf("Elements %.2X\n", | ||
281 | obj_desc->package.count); | ||
282 | } else { | ||
283 | acpi_os_printf("[Length not yet evaluated]\n"); | ||
284 | } | ||
285 | break; | ||
286 | |||
287 | case ACPI_TYPE_BUFFER: | ||
288 | |||
289 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { | ||
290 | acpi_os_printf("Len %.2X", | ||
291 | obj_desc->buffer.length); | ||
292 | |||
293 | /* Dump some of the buffer */ | ||
294 | |||
295 | if (obj_desc->buffer.length > 0) { | ||
296 | acpi_os_printf(" ="); | ||
297 | for (i = 0; | ||
298 | (i < obj_desc->buffer.length | ||
299 | && i < 12); i++) { | ||
300 | acpi_os_printf(" %.2hX", | ||
301 | obj_desc->buffer. | ||
302 | pointer[i]); | ||
303 | } | ||
304 | } | ||
305 | acpi_os_printf("\n"); | ||
306 | } else { | ||
307 | acpi_os_printf("[Length not yet evaluated]\n"); | ||
308 | } | ||
309 | break; | ||
310 | |||
311 | case ACPI_TYPE_STRING: | ||
312 | |||
313 | acpi_os_printf("Len %.2X ", obj_desc->string.length); | ||
314 | acpi_ut_print_string(obj_desc->string.pointer, 32); | ||
315 | acpi_os_printf("\n"); | ||
316 | break; | ||
317 | |||
318 | case ACPI_TYPE_REGION: | ||
319 | |||
320 | acpi_os_printf("[%s]", | ||
321 | acpi_ut_get_region_name(obj_desc->region. | ||
322 | space_id)); | ||
323 | if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { | ||
324 | acpi_os_printf(" Addr %8.8X%8.8X Len %.4X\n", | ||
325 | ACPI_FORMAT_NATIVE_UINT | ||
326 | (obj_desc->region.address), | ||
327 | obj_desc->region.length); | ||
328 | } else { | ||
329 | acpi_os_printf | ||
330 | (" [Address/Length not yet evaluated]\n"); | ||
331 | } | ||
332 | break; | ||
333 | |||
334 | case ACPI_TYPE_LOCAL_REFERENCE: | ||
335 | |||
336 | acpi_os_printf("[%s]\n", | ||
337 | acpi_ut_get_reference_name(obj_desc)); | ||
338 | break; | ||
339 | |||
340 | case ACPI_TYPE_BUFFER_FIELD: | ||
341 | |||
342 | if (obj_desc->buffer_field.buffer_obj && | ||
343 | obj_desc->buffer_field.buffer_obj->buffer.node) { | ||
344 | acpi_os_printf("Buf [%4.4s]", | ||
345 | acpi_ut_get_node_name(obj_desc-> | ||
346 | buffer_field. | ||
347 | buffer_obj-> | ||
348 | buffer. | ||
349 | node)); | ||
350 | } | ||
351 | break; | ||
352 | |||
353 | case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
354 | |||
355 | acpi_os_printf("Rgn [%4.4s]", | ||
356 | acpi_ut_get_node_name(obj_desc-> | ||
357 | common_field. | ||
358 | region_obj->region. | ||
359 | node)); | ||
360 | break; | ||
361 | |||
362 | case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
363 | |||
364 | acpi_os_printf("Rgn [%4.4s] Bnk [%4.4s]", | ||
365 | acpi_ut_get_node_name(obj_desc-> | ||
366 | common_field. | ||
367 | region_obj->region. | ||
368 | node), | ||
369 | acpi_ut_get_node_name(obj_desc-> | ||
370 | bank_field. | ||
371 | bank_obj-> | ||
372 | common_field. | ||
373 | node)); | ||
374 | break; | ||
375 | |||
376 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
377 | |||
378 | acpi_os_printf("Idx [%4.4s] Dat [%4.4s]", | ||
379 | acpi_ut_get_node_name(obj_desc-> | ||
380 | index_field. | ||
381 | index_obj-> | ||
382 | common_field.node), | ||
383 | acpi_ut_get_node_name(obj_desc-> | ||
384 | index_field. | ||
385 | data_obj-> | ||
386 | common_field. | ||
387 | node)); | ||
388 | break; | ||
389 | |||
390 | case ACPI_TYPE_LOCAL_ALIAS: | ||
391 | case ACPI_TYPE_LOCAL_METHOD_ALIAS: | ||
392 | |||
393 | acpi_os_printf("Target %4.4s (%p)\n", | ||
394 | acpi_ut_get_node_name(obj_desc), | ||
395 | obj_desc); | ||
396 | break; | ||
397 | |||
398 | default: | ||
399 | |||
400 | acpi_os_printf("Object %p\n", obj_desc); | ||
401 | break; | ||
402 | } | ||
403 | |||
404 | /* Common field handling */ | ||
405 | |||
406 | switch (type) { | ||
407 | case ACPI_TYPE_BUFFER_FIELD: | ||
408 | case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
409 | case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
410 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
411 | |||
412 | acpi_os_printf(" Off %.3X Len %.2X Acc %.2hd\n", | ||
413 | (obj_desc->common_field. | ||
414 | base_byte_offset * 8) | ||
415 | + | ||
416 | obj_desc->common_field. | ||
417 | start_field_bit_offset, | ||
418 | obj_desc->common_field.bit_length, | ||
419 | obj_desc->common_field. | ||
420 | access_byte_width); | ||
421 | break; | ||
422 | |||
423 | default: | ||
424 | break; | ||
425 | } | ||
426 | break; | ||
427 | |||
428 | case ACPI_DISPLAY_OBJECTS: | ||
429 | |||
430 | acpi_os_printf("O:%p", obj_desc); | ||
431 | if (!obj_desc) { | ||
432 | |||
433 | /* No attached object, we are done */ | ||
434 | |||
435 | acpi_os_printf("\n"); | ||
436 | return (AE_OK); | ||
437 | } | ||
438 | |||
439 | acpi_os_printf("(R%d)", obj_desc->common.reference_count); | ||
440 | |||
441 | switch (type) { | ||
442 | case ACPI_TYPE_METHOD: | ||
443 | |||
444 | /* Name is a Method and its AML offset/length are set */ | ||
445 | |||
446 | acpi_os_printf(" M:%p-%X\n", obj_desc->method.aml_start, | ||
447 | obj_desc->method.aml_length); | ||
448 | break; | ||
449 | |||
450 | case ACPI_TYPE_INTEGER: | ||
451 | |||
452 | acpi_os_printf(" I:%8.8X8.8%X\n", | ||
453 | ACPI_FORMAT_UINT64(obj_desc->integer. | ||
454 | value)); | ||
455 | break; | ||
456 | |||
457 | case ACPI_TYPE_STRING: | ||
458 | |||
459 | acpi_os_printf(" S:%p-%X\n", obj_desc->string.pointer, | ||
460 | obj_desc->string.length); | ||
461 | break; | ||
462 | |||
463 | case ACPI_TYPE_BUFFER: | ||
464 | |||
465 | acpi_os_printf(" B:%p-%X\n", obj_desc->buffer.pointer, | ||
466 | obj_desc->buffer.length); | ||
467 | break; | ||
468 | |||
469 | default: | ||
470 | |||
471 | acpi_os_printf("\n"); | ||
472 | break; | ||
473 | } | ||
474 | break; | ||
475 | |||
476 | default: | ||
477 | acpi_os_printf("\n"); | ||
478 | break; | ||
479 | } | ||
480 | |||
481 | /* If debug turned off, done */ | ||
482 | |||
483 | if (!(acpi_dbg_level & ACPI_LV_VALUES)) { | ||
484 | return (AE_OK); | ||
485 | } | ||
486 | |||
487 | /* If there is an attached object, display it */ | ||
488 | |||
489 | dbg_level = acpi_dbg_level; | ||
490 | acpi_dbg_level = 0; | ||
491 | obj_desc = acpi_ns_get_attached_object(this_node); | ||
492 | acpi_dbg_level = dbg_level; | ||
493 | |||
494 | /* Dump attached objects */ | ||
495 | |||
496 | while (obj_desc) { | ||
497 | obj_type = ACPI_TYPE_INVALID; | ||
498 | acpi_os_printf("Attached Object %p: ", obj_desc); | ||
499 | |||
500 | /* Decode the type of attached object and dump the contents */ | ||
501 | |||
502 | switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { | ||
503 | case ACPI_DESC_TYPE_NAMED: | ||
504 | |||
505 | acpi_os_printf("(Ptr to Node)\n"); | ||
506 | bytes_to_dump = sizeof(struct acpi_namespace_node); | ||
507 | ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); | ||
508 | break; | ||
509 | |||
510 | case ACPI_DESC_TYPE_OPERAND: | ||
511 | |||
512 | obj_type = ACPI_GET_OBJECT_TYPE(obj_desc); | ||
513 | |||
514 | if (obj_type > ACPI_TYPE_LOCAL_MAX) { | ||
515 | acpi_os_printf | ||
516 | ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", | ||
517 | obj_type); | ||
518 | bytes_to_dump = 32; | ||
519 | } else { | ||
520 | acpi_os_printf | ||
521 | ("(Pointer to ACPI Object type %.2X [%s])\n", | ||
522 | obj_type, acpi_ut_get_type_name(obj_type)); | ||
523 | bytes_to_dump = | ||
524 | sizeof(union acpi_operand_object); | ||
525 | } | ||
526 | |||
527 | ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); | ||
528 | break; | ||
529 | |||
530 | default: | ||
531 | |||
532 | break; | ||
533 | } | ||
534 | |||
535 | /* If value is NOT an internal object, we are done */ | ||
536 | |||
537 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != | ||
538 | ACPI_DESC_TYPE_OPERAND) { | ||
539 | goto cleanup; | ||
540 | } | ||
541 | |||
542 | /* | ||
543 | * Valid object, get the pointer to next level, if any | ||
544 | */ | ||
545 | switch (obj_type) { | ||
546 | case ACPI_TYPE_BUFFER: | ||
547 | case ACPI_TYPE_STRING: | ||
548 | /* | ||
549 | * NOTE: takes advantage of common fields between string/buffer | ||
550 | */ | ||
551 | bytes_to_dump = obj_desc->string.length; | ||
552 | obj_desc = (void *)obj_desc->string.pointer; | ||
553 | acpi_os_printf("(Buffer/String pointer %p length %X)\n", | ||
554 | obj_desc, bytes_to_dump); | ||
555 | ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); | ||
556 | goto cleanup; | ||
557 | |||
558 | case ACPI_TYPE_BUFFER_FIELD: | ||
559 | obj_desc = | ||
560 | (union acpi_operand_object *)obj_desc->buffer_field. | ||
561 | buffer_obj; | ||
562 | break; | ||
563 | |||
564 | case ACPI_TYPE_PACKAGE: | ||
565 | obj_desc = (void *)obj_desc->package.elements; | ||
566 | break; | ||
567 | |||
568 | case ACPI_TYPE_METHOD: | ||
569 | obj_desc = (void *)obj_desc->method.aml_start; | ||
570 | break; | ||
571 | |||
572 | case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
573 | obj_desc = (void *)obj_desc->field.region_obj; | ||
574 | break; | ||
575 | |||
576 | case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
577 | obj_desc = (void *)obj_desc->bank_field.region_obj; | ||
578 | break; | ||
579 | |||
580 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
581 | obj_desc = (void *)obj_desc->index_field.index_obj; | ||
582 | break; | ||
583 | |||
584 | default: | ||
585 | goto cleanup; | ||
586 | } | ||
587 | |||
588 | obj_type = ACPI_TYPE_INVALID; /* Terminate loop after next pass */ | ||
589 | } | ||
590 | |||
591 | cleanup: | ||
592 | acpi_os_printf("\n"); | ||
593 | return (AE_OK); | ||
594 | } | ||
595 | |||
596 | #ifdef ACPI_FUTURE_USAGE | ||
597 | /******************************************************************************* | ||
598 | * | ||
599 | * FUNCTION: acpi_ns_dump_objects | ||
600 | * | ||
601 | * PARAMETERS: Type - Object type to be dumped | ||
602 | * display_type - 0 or ACPI_DISPLAY_SUMMARY | ||
603 | * max_depth - Maximum depth of dump. Use ACPI_UINT32_MAX | ||
604 | * for an effectively unlimited depth. | ||
605 | * owner_id - Dump only objects owned by this ID. Use | ||
606 | * ACPI_UINT32_MAX to match all owners. | ||
607 | * start_handle - Where in namespace to start/end search | ||
608 | * | ||
609 | * RETURN: None | ||
610 | * | ||
611 | * DESCRIPTION: Dump typed objects within the loaded namespace. | ||
612 | * Uses acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object. | ||
613 | * | ||
614 | ******************************************************************************/ | ||
615 | |||
616 | void | ||
617 | acpi_ns_dump_objects(acpi_object_type type, | ||
618 | u8 display_type, | ||
619 | u32 max_depth, | ||
620 | acpi_owner_id owner_id, acpi_handle start_handle) | ||
621 | { | ||
622 | struct acpi_walk_info info; | ||
623 | |||
624 | ACPI_FUNCTION_ENTRY(); | ||
625 | |||
626 | info.debug_level = ACPI_LV_TABLES; | ||
627 | info.owner_id = owner_id; | ||
628 | info.display_type = display_type; | ||
629 | |||
630 | (void)acpi_ns_walk_namespace(type, start_handle, max_depth, | ||
631 | ACPI_NS_WALK_NO_UNLOCK | | ||
632 | ACPI_NS_WALK_TEMP_NODES, | ||
633 | acpi_ns_dump_one_object, (void *)&info, | ||
634 | NULL); | ||
635 | } | ||
636 | #endif /* ACPI_FUTURE_USAGE */ | ||
637 | |||
638 | /******************************************************************************* | ||
639 | * | ||
640 | * FUNCTION: acpi_ns_dump_entry | ||
641 | * | ||
642 | * PARAMETERS: Handle - Node to be dumped | ||
643 | * debug_level - Output level | ||
644 | * | ||
645 | * RETURN: None | ||
646 | * | ||
647 | * DESCRIPTION: Dump a single Node | ||
648 | * | ||
649 | ******************************************************************************/ | ||
650 | |||
651 | void acpi_ns_dump_entry(acpi_handle handle, u32 debug_level) | ||
652 | { | ||
653 | struct acpi_walk_info info; | ||
654 | |||
655 | ACPI_FUNCTION_ENTRY(); | ||
656 | |||
657 | info.debug_level = debug_level; | ||
658 | info.owner_id = ACPI_OWNER_ID_MAX; | ||
659 | info.display_type = ACPI_DISPLAY_SUMMARY; | ||
660 | |||
661 | (void)acpi_ns_dump_one_object(handle, 1, &info, NULL); | ||
662 | } | ||
663 | |||
664 | #ifdef ACPI_ASL_COMPILER | ||
665 | /******************************************************************************* | ||
666 | * | ||
667 | * FUNCTION: acpi_ns_dump_tables | ||
668 | * | ||
669 | * PARAMETERS: search_base - Root of subtree to be dumped, or | ||
670 | * NS_ALL to dump the entire namespace | ||
671 | * max_depth - Maximum depth of dump. Use INT_MAX | ||
672 | * for an effectively unlimited depth. | ||
673 | * | ||
674 | * RETURN: None | ||
675 | * | ||
676 | * DESCRIPTION: Dump the name space, or a portion of it. | ||
677 | * | ||
678 | ******************************************************************************/ | ||
679 | |||
680 | void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth) | ||
681 | { | ||
682 | acpi_handle search_handle = search_base; | ||
683 | |||
684 | ACPI_FUNCTION_TRACE(ns_dump_tables); | ||
685 | |||
686 | if (!acpi_gbl_root_node) { | ||
687 | /* | ||
688 | * If the name space has not been initialized, | ||
689 | * there is nothing to dump. | ||
690 | */ | ||
691 | ACPI_DEBUG_PRINT((ACPI_DB_TABLES, | ||
692 | "namespace not initialized!\n")); | ||
693 | return_VOID; | ||
694 | } | ||
695 | |||
696 | if (ACPI_NS_ALL == search_base) { | ||
697 | |||
698 | /* Entire namespace */ | ||
699 | |||
700 | search_handle = acpi_gbl_root_node; | ||
701 | ACPI_DEBUG_PRINT((ACPI_DB_TABLES, "\\\n")); | ||
702 | } | ||
703 | |||
704 | acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth, | ||
705 | ACPI_OWNER_ID_MAX, search_handle); | ||
706 | return_VOID; | ||
707 | } | ||
708 | #endif /* _ACPI_ASL_COMPILER */ | ||
709 | #endif /* defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) */ | ||