xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/exdump.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: exdump - Interpreter debug output routines
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 2000 - 2020, Intel Corp.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *****************************************************************************/
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <acpi/acpi.h>
11*4882a593Smuzhiyun #include "accommon.h"
12*4882a593Smuzhiyun #include "acinterp.h"
13*4882a593Smuzhiyun #include "amlcode.h"
14*4882a593Smuzhiyun #include "acnamesp.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define _COMPONENT          ACPI_EXECUTER
17*4882a593Smuzhiyun ACPI_MODULE_NAME("exdump")
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun  * The following routines are used for debug output only
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
23*4882a593Smuzhiyun /* Local prototypes */
24*4882a593Smuzhiyun static void acpi_ex_out_string(const char *title, const char *value);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static void acpi_ex_out_pointer(const char *title, const void *value);
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun static void
29*4882a593Smuzhiyun acpi_ex_dump_object(union acpi_operand_object *obj_desc,
30*4882a593Smuzhiyun 		    struct acpi_exdump_info *info);
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun static void
35*4882a593Smuzhiyun acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
36*4882a593Smuzhiyun 			 u32 level, u32 index);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /*******************************************************************************
39*4882a593Smuzhiyun  *
40*4882a593Smuzhiyun  * Object Descriptor info tables
41*4882a593Smuzhiyun  *
42*4882a593Smuzhiyun  * Note: The first table entry must be an INIT opcode and must contain
43*4882a593Smuzhiyun  * the table length (number of table entries)
44*4882a593Smuzhiyun  *
45*4882a593Smuzhiyun  ******************************************************************************/
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_integer[2] = {
48*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_integer), NULL},
49*4882a593Smuzhiyun 	{ACPI_EXD_UINT64, ACPI_EXD_OFFSET(integer.value), "Value"}
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_string[4] = {
53*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_string), NULL},
54*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(string.length), "Length"},
55*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(string.pointer), "Pointer"},
56*4882a593Smuzhiyun 	{ACPI_EXD_STRING, 0, NULL}
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_buffer[5] = {
60*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer), NULL},
61*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(buffer.length), "Length"},
62*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer.pointer), "Pointer"},
63*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(buffer.node), "Parent Node"},
64*4882a593Smuzhiyun 	{ACPI_EXD_BUFFER, 0, NULL}
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_package[6] = {
68*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_package), NULL},
69*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(package.node), "Parent Node"},
70*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(package.flags), "Flags"},
71*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(package.count), "Element Count"},
72*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(package.elements), "Element List"},
73*4882a593Smuzhiyun 	{ACPI_EXD_PACKAGE, 0, NULL}
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_device[4] = {
77*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_device), NULL},
78*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[0]),
79*4882a593Smuzhiyun 	 "System Notify"},
80*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[1]),
81*4882a593Smuzhiyun 	 "Device Notify"},
82*4882a593Smuzhiyun 	{ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(device.handler), "Handler"}
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_event[2] = {
86*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_event), NULL},
87*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.os_semaphore), "OsSemaphore"}
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_method[9] = {
91*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL},
92*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.info_flags), "Info Flags"},
93*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count),
94*4882a593Smuzhiyun 	 "Parameter Count"},
95*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.sync_level), "Sync Level"},
96*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.mutex), "Mutex"},
97*4882a593Smuzhiyun 	{ACPI_EXD_UINT16, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"},
98*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count"},
99*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"},
100*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"}
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_mutex[6] = {
104*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL},
105*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"},
106*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.original_sync_level),
107*4882a593Smuzhiyun 	 "Original Sync Level"},
108*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"},
109*4882a593Smuzhiyun 	{ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth),
110*4882a593Smuzhiyun 	 "Acquire Depth"},
111*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex"}
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_region[8] = {
115*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region), NULL},
116*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.space_id), "Space Id"},
117*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.flags), "Flags"},
118*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(region.node), "Parent Node"},
119*4882a593Smuzhiyun 	{ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(region.address), "Address"},
120*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(region.length), "Length"},
121*4882a593Smuzhiyun 	{ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(region.handler), "Handler"},
122*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.next), "Next"}
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_power[6] = {
126*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_power), NULL},
127*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.system_level),
128*4882a593Smuzhiyun 	 "System Level"},
129*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.resource_order),
130*4882a593Smuzhiyun 	 "Resource Order"},
131*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[0]),
132*4882a593Smuzhiyun 	 "System Notify"},
133*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[1]),
134*4882a593Smuzhiyun 	 "Device Notify"},
135*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.handler), "Handler"}
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_processor[7] = {
139*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_processor), NULL},
140*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.proc_id), "Processor ID"},
141*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.length), "Length"},
142*4882a593Smuzhiyun 	{ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(processor.address), "Address"},
143*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[0]),
144*4882a593Smuzhiyun 	 "System Notify"},
145*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[1]),
146*4882a593Smuzhiyun 	 "Device Notify"},
147*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.handler), "Handler"}
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_thermal[4] = {
151*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_thermal), NULL},
152*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[0]),
153*4882a593Smuzhiyun 	 "System Notify"},
154*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[1]),
155*4882a593Smuzhiyun 	 "Device Notify"},
156*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.handler), "Handler"}
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_buffer_field[3] = {
160*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer_field), NULL},
161*4882a593Smuzhiyun 	{ACPI_EXD_FIELD, 0, NULL},
162*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer_field.buffer_obj),
163*4882a593Smuzhiyun 	 "Buffer Object"}
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_region_field[5] = {
167*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL},
168*4882a593Smuzhiyun 	{ACPI_EXD_FIELD, 0, NULL},
169*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(field.access_length), "AccessLength"},
170*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"},
171*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.resource_buffer),
172*4882a593Smuzhiyun 	 "ResourceBuffer"}
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = {
176*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
177*4882a593Smuzhiyun 	{ACPI_EXD_FIELD, 0, NULL},
178*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(bank_field.value), "Value"},
179*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.region_obj),
180*4882a593Smuzhiyun 	 "Region Object"},
181*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.bank_obj), "Bank Object"}
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
185*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
186*4882a593Smuzhiyun 	{ACPI_EXD_FIELD, 0, NULL},
187*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(index_field.value), "Value"},
188*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.index_obj),
189*4882a593Smuzhiyun 	 "Index Object"},
190*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_reference[9] = {
194*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
195*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"},
196*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
197*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.value), "Value"},
198*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
199*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(reference.node), "Node"},
200*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
201*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.index_pointer),
202*4882a593Smuzhiyun 	 "Index Pointer"},
203*4882a593Smuzhiyun 	{ACPI_EXD_REFERENCE, 0, NULL}
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_address_handler[6] = {
207*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_address_handler),
208*4882a593Smuzhiyun 	 NULL},
209*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(address_space.space_id), "Space Id"},
210*4882a593Smuzhiyun 	{ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(address_space.next), "Next"},
211*4882a593Smuzhiyun 	{ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET(address_space.region_list),
212*4882a593Smuzhiyun 	 "Region List"},
213*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(address_space.node), "Node"},
214*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.context), "Context"}
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_notify[7] = {
218*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_notify), NULL},
219*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(notify.node), "Node"},
220*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(notify.handler_type), "Handler Type"},
221*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.handler), "Handler"},
222*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.context), "Context"},
223*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[0]),
224*4882a593Smuzhiyun 	 "Next System Notify"},
225*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[1]), "Next Device Notify"}
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_extra[6] = {
229*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_extra), NULL},
230*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.method_REG), "_REG Method"},
231*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(extra.scope_node), "Scope Node"},
232*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.region_context),
233*4882a593Smuzhiyun 	 "Region Context"},
234*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.aml_start), "Aml Start"},
235*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(extra.aml_length), "Aml Length"}
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_data[3] = {
239*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_data), NULL},
240*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.handler), "Handler"},
241*4882a593Smuzhiyun 	{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.pointer), "Raw Data"}
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun /* Miscellaneous tables */
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_common[5] = {
247*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_common), NULL},
248*4882a593Smuzhiyun 	{ACPI_EXD_TYPE, 0, NULL},
249*4882a593Smuzhiyun 	{ACPI_EXD_UINT16, ACPI_EXD_OFFSET(common.reference_count),
250*4882a593Smuzhiyun 	 "Reference Count"},
251*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common.flags), "Flags"},
252*4882a593Smuzhiyun 	{ACPI_EXD_LIST, ACPI_EXD_OFFSET(common.next_object), "Object List"}
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_field_common[7] = {
256*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_field_common), NULL},
257*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.field_flags),
258*4882a593Smuzhiyun 	 "Field Flags"},
259*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.access_byte_width),
260*4882a593Smuzhiyun 	 "Access Byte Width"},
261*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.bit_length),
262*4882a593Smuzhiyun 	 "Bit Length"},
263*4882a593Smuzhiyun 	{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.start_field_bit_offset),
264*4882a593Smuzhiyun 	 "Field Bit Offset"},
265*4882a593Smuzhiyun 	{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.base_byte_offset),
266*4882a593Smuzhiyun 	 "Base Byte Offset"},
267*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_OFFSET(common_field.node), "Parent Node"}
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun static struct acpi_exdump_info acpi_ex_dump_node[7] = {
271*4882a593Smuzhiyun 	{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_node), NULL},
272*4882a593Smuzhiyun 	{ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(flags), "Flags"},
273*4882a593Smuzhiyun 	{ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(owner_id), "Owner Id"},
274*4882a593Smuzhiyun 	{ACPI_EXD_LIST, ACPI_EXD_NSOFFSET(object), "Object List"},
275*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(parent), "Parent"},
276*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(child), "Child"},
277*4882a593Smuzhiyun 	{ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(peer), "Peer"}
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* Dispatch table, indexed by object type */
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun static struct acpi_exdump_info *acpi_ex_dump_info[] = {
283*4882a593Smuzhiyun 	NULL,
284*4882a593Smuzhiyun 	acpi_ex_dump_integer,
285*4882a593Smuzhiyun 	acpi_ex_dump_string,
286*4882a593Smuzhiyun 	acpi_ex_dump_buffer,
287*4882a593Smuzhiyun 	acpi_ex_dump_package,
288*4882a593Smuzhiyun 	NULL,
289*4882a593Smuzhiyun 	acpi_ex_dump_device,
290*4882a593Smuzhiyun 	acpi_ex_dump_event,
291*4882a593Smuzhiyun 	acpi_ex_dump_method,
292*4882a593Smuzhiyun 	acpi_ex_dump_mutex,
293*4882a593Smuzhiyun 	acpi_ex_dump_region,
294*4882a593Smuzhiyun 	acpi_ex_dump_power,
295*4882a593Smuzhiyun 	acpi_ex_dump_processor,
296*4882a593Smuzhiyun 	acpi_ex_dump_thermal,
297*4882a593Smuzhiyun 	acpi_ex_dump_buffer_field,
298*4882a593Smuzhiyun 	NULL,
299*4882a593Smuzhiyun 	NULL,
300*4882a593Smuzhiyun 	acpi_ex_dump_region_field,
301*4882a593Smuzhiyun 	acpi_ex_dump_bank_field,
302*4882a593Smuzhiyun 	acpi_ex_dump_index_field,
303*4882a593Smuzhiyun 	acpi_ex_dump_reference,
304*4882a593Smuzhiyun 	NULL,
305*4882a593Smuzhiyun 	NULL,
306*4882a593Smuzhiyun 	acpi_ex_dump_notify,
307*4882a593Smuzhiyun 	acpi_ex_dump_address_handler,
308*4882a593Smuzhiyun 	NULL,
309*4882a593Smuzhiyun 	NULL,
310*4882a593Smuzhiyun 	NULL,
311*4882a593Smuzhiyun 	acpi_ex_dump_extra,
312*4882a593Smuzhiyun 	acpi_ex_dump_data
313*4882a593Smuzhiyun };
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /*******************************************************************************
316*4882a593Smuzhiyun  *
317*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_object
318*4882a593Smuzhiyun  *
319*4882a593Smuzhiyun  * PARAMETERS:  obj_desc            - Descriptor to dump
320*4882a593Smuzhiyun  *              info                - Info table corresponding to this object
321*4882a593Smuzhiyun  *                                    type
322*4882a593Smuzhiyun  *
323*4882a593Smuzhiyun  * RETURN:      None
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  * DESCRIPTION: Walk the info table for this object
326*4882a593Smuzhiyun  *
327*4882a593Smuzhiyun  ******************************************************************************/
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun static void
acpi_ex_dump_object(union acpi_operand_object * obj_desc,struct acpi_exdump_info * info)330*4882a593Smuzhiyun acpi_ex_dump_object(union acpi_operand_object *obj_desc,
331*4882a593Smuzhiyun 		    struct acpi_exdump_info *info)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun 	u8 *target;
334*4882a593Smuzhiyun 	const char *name;
335*4882a593Smuzhiyun 	u8 count;
336*4882a593Smuzhiyun 	union acpi_operand_object *start;
337*4882a593Smuzhiyun 	union acpi_operand_object *data = NULL;
338*4882a593Smuzhiyun 	union acpi_operand_object *next;
339*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	if (!info) {
342*4882a593Smuzhiyun 		acpi_os_printf
343*4882a593Smuzhiyun 		    ("ExDumpObject: Display not implemented for object type %s\n",
344*4882a593Smuzhiyun 		     acpi_ut_get_object_type_name(obj_desc));
345*4882a593Smuzhiyun 		return;
346*4882a593Smuzhiyun 	}
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	/* First table entry must contain the table length (# of table entries) */
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	count = info->offset;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	while (count) {
353*4882a593Smuzhiyun 		if (!obj_desc) {
354*4882a593Smuzhiyun 			return;
355*4882a593Smuzhiyun 		}
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 		target = ACPI_ADD_PTR(u8, obj_desc, info->offset);
358*4882a593Smuzhiyun 		name = info->name;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 		switch (info->opcode) {
361*4882a593Smuzhiyun 		case ACPI_EXD_INIT:
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 			break;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 		case ACPI_EXD_TYPE:
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 			acpi_os_printf("%20s : %2.2X [%s]\n", "Type",
368*4882a593Smuzhiyun 				       obj_desc->common.type,
369*4882a593Smuzhiyun 				       acpi_ut_get_object_type_name(obj_desc));
370*4882a593Smuzhiyun 			break;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 		case ACPI_EXD_UINT8:
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 			acpi_os_printf("%20s : %2.2X\n", name, *target);
375*4882a593Smuzhiyun 			break;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 		case ACPI_EXD_UINT16:
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 			acpi_os_printf("%20s : %4.4X\n", name,
380*4882a593Smuzhiyun 				       ACPI_GET16(target));
381*4882a593Smuzhiyun 			break;
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 		case ACPI_EXD_UINT32:
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 			acpi_os_printf("%20s : %8.8X\n", name,
386*4882a593Smuzhiyun 				       ACPI_GET32(target));
387*4882a593Smuzhiyun 			break;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 		case ACPI_EXD_UINT64:
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 			acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
392*4882a593Smuzhiyun 				       ACPI_FORMAT_UINT64(ACPI_GET64(target)));
393*4882a593Smuzhiyun 			break;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 		case ACPI_EXD_POINTER:
396*4882a593Smuzhiyun 		case ACPI_EXD_ADDRESS:
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 			acpi_ex_out_pointer(name,
399*4882a593Smuzhiyun 					    *ACPI_CAST_PTR(void *, target));
400*4882a593Smuzhiyun 			break;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 		case ACPI_EXD_STRING:
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 			acpi_ut_print_string(obj_desc->string.pointer,
405*4882a593Smuzhiyun 					     ACPI_UINT8_MAX);
406*4882a593Smuzhiyun 			acpi_os_printf("\n");
407*4882a593Smuzhiyun 			break;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 		case ACPI_EXD_BUFFER:
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 			ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
412*4882a593Smuzhiyun 					 obj_desc->buffer.length);
413*4882a593Smuzhiyun 			break;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 		case ACPI_EXD_PACKAGE:
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 			/* Dump the package contents */
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 			acpi_os_printf("\nPackage Contents:\n");
420*4882a593Smuzhiyun 			acpi_ex_dump_package_obj(obj_desc, 0, 0);
421*4882a593Smuzhiyun 			break;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 		case ACPI_EXD_FIELD:
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 			acpi_ex_dump_object(obj_desc,
426*4882a593Smuzhiyun 					    acpi_ex_dump_field_common);
427*4882a593Smuzhiyun 			break;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 		case ACPI_EXD_REFERENCE:
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 			acpi_ex_out_string("Class Name",
432*4882a593Smuzhiyun 					   acpi_ut_get_reference_name
433*4882a593Smuzhiyun 					   (obj_desc));
434*4882a593Smuzhiyun 			acpi_ex_dump_reference_obj(obj_desc);
435*4882a593Smuzhiyun 			break;
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 		case ACPI_EXD_LIST:
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 			start = *ACPI_CAST_PTR(void *, target);
440*4882a593Smuzhiyun 			next = start;
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 			acpi_os_printf("%20s : %p ", name, next);
443*4882a593Smuzhiyun 			if (next) {
444*4882a593Smuzhiyun 				acpi_os_printf("%s (Type %2.2X)",
445*4882a593Smuzhiyun 					       acpi_ut_get_object_type_name
446*4882a593Smuzhiyun 					       (next), next->common.type);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 				while (next->common.next_object) {
449*4882a593Smuzhiyun 					if ((next->common.type ==
450*4882a593Smuzhiyun 					     ACPI_TYPE_LOCAL_DATA) && !data) {
451*4882a593Smuzhiyun 						data = next;
452*4882a593Smuzhiyun 					}
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 					next = next->common.next_object;
455*4882a593Smuzhiyun 					acpi_os_printf("->%p(%s %2.2X)", next,
456*4882a593Smuzhiyun 						       acpi_ut_get_object_type_name
457*4882a593Smuzhiyun 						       (next),
458*4882a593Smuzhiyun 						       next->common.type);
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 					if ((next == start) || (next == data)) {
461*4882a593Smuzhiyun 						acpi_os_printf
462*4882a593Smuzhiyun 						    ("\n**** Error: Object list appears to be circular linked");
463*4882a593Smuzhiyun 						break;
464*4882a593Smuzhiyun 					}
465*4882a593Smuzhiyun 				}
466*4882a593Smuzhiyun 			} else {
467*4882a593Smuzhiyun 				acpi_os_printf("- No attached objects");
468*4882a593Smuzhiyun 			}
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 			acpi_os_printf("\n");
471*4882a593Smuzhiyun 			break;
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 		case ACPI_EXD_HDLR_LIST:
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 			start = *ACPI_CAST_PTR(void *, target);
476*4882a593Smuzhiyun 			next = start;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 			acpi_os_printf("%20s : %p", name, next);
479*4882a593Smuzhiyun 			if (next) {
480*4882a593Smuzhiyun 				acpi_os_printf("(%s %2.2X)",
481*4882a593Smuzhiyun 					       acpi_ut_get_object_type_name
482*4882a593Smuzhiyun 					       (next),
483*4882a593Smuzhiyun 					       next->address_space.space_id);
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 				while (next->address_space.next) {
486*4882a593Smuzhiyun 					if ((next->common.type ==
487*4882a593Smuzhiyun 					     ACPI_TYPE_LOCAL_DATA) && !data) {
488*4882a593Smuzhiyun 						data = next;
489*4882a593Smuzhiyun 					}
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 					next = next->address_space.next;
492*4882a593Smuzhiyun 					acpi_os_printf("->%p(%s %2.2X)", next,
493*4882a593Smuzhiyun 						       acpi_ut_get_object_type_name
494*4882a593Smuzhiyun 						       (next),
495*4882a593Smuzhiyun 						       next->address_space.
496*4882a593Smuzhiyun 						       space_id);
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 					if ((next == start) || (next == data)) {
499*4882a593Smuzhiyun 						acpi_os_printf
500*4882a593Smuzhiyun 						    ("\n**** Error: Handler list appears to be circular linked");
501*4882a593Smuzhiyun 						break;
502*4882a593Smuzhiyun 					}
503*4882a593Smuzhiyun 				}
504*4882a593Smuzhiyun 			}
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 			acpi_os_printf("\n");
507*4882a593Smuzhiyun 			break;
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 		case ACPI_EXD_RGN_LIST:
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 			start = *ACPI_CAST_PTR(void *, target);
512*4882a593Smuzhiyun 			next = start;
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 			acpi_os_printf("%20s : %p", name, next);
515*4882a593Smuzhiyun 			if (next) {
516*4882a593Smuzhiyun 				acpi_os_printf("(%s %2.2X)",
517*4882a593Smuzhiyun 					       acpi_ut_get_object_type_name
518*4882a593Smuzhiyun 					       (next), next->common.type);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 				while (next->region.next) {
521*4882a593Smuzhiyun 					if ((next->common.type ==
522*4882a593Smuzhiyun 					     ACPI_TYPE_LOCAL_DATA) && !data) {
523*4882a593Smuzhiyun 						data = next;
524*4882a593Smuzhiyun 					}
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 					next = next->region.next;
527*4882a593Smuzhiyun 					acpi_os_printf("->%p(%s %2.2X)", next,
528*4882a593Smuzhiyun 						       acpi_ut_get_object_type_name
529*4882a593Smuzhiyun 						       (next),
530*4882a593Smuzhiyun 						       next->common.type);
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 					if ((next == start) || (next == data)) {
533*4882a593Smuzhiyun 						acpi_os_printf
534*4882a593Smuzhiyun 						    ("\n**** Error: Region list appears to be circular linked");
535*4882a593Smuzhiyun 						break;
536*4882a593Smuzhiyun 					}
537*4882a593Smuzhiyun 				}
538*4882a593Smuzhiyun 			}
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 			acpi_os_printf("\n");
541*4882a593Smuzhiyun 			break;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 		case ACPI_EXD_NODE:
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 			node =
546*4882a593Smuzhiyun 			    *ACPI_CAST_PTR(struct acpi_namespace_node *,
547*4882a593Smuzhiyun 					   target);
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 			acpi_os_printf("%20s : %p", name, node);
550*4882a593Smuzhiyun 			if (node) {
551*4882a593Smuzhiyun 				acpi_os_printf(" [%4.4s]", node->name.ascii);
552*4882a593Smuzhiyun 			}
553*4882a593Smuzhiyun 			acpi_os_printf("\n");
554*4882a593Smuzhiyun 			break;
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 		default:
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 			acpi_os_printf("**** Invalid table opcode [%X] ****\n",
559*4882a593Smuzhiyun 				       info->opcode);
560*4882a593Smuzhiyun 			return;
561*4882a593Smuzhiyun 		}
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 		info++;
564*4882a593Smuzhiyun 		count--;
565*4882a593Smuzhiyun 	}
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun /*******************************************************************************
569*4882a593Smuzhiyun  *
570*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_operand
571*4882a593Smuzhiyun  *
572*4882a593Smuzhiyun  * PARAMETERS:  *obj_desc       - Pointer to entry to be dumped
573*4882a593Smuzhiyun  *              depth           - Current nesting depth
574*4882a593Smuzhiyun  *
575*4882a593Smuzhiyun  * RETURN:      None
576*4882a593Smuzhiyun  *
577*4882a593Smuzhiyun  * DESCRIPTION: Dump an operand object
578*4882a593Smuzhiyun  *
579*4882a593Smuzhiyun  ******************************************************************************/
580*4882a593Smuzhiyun 
acpi_ex_dump_operand(union acpi_operand_object * obj_desc,u32 depth)581*4882a593Smuzhiyun void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun 	u32 length;
584*4882a593Smuzhiyun 	u32 index;
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 	ACPI_FUNCTION_NAME(ex_dump_operand);
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	/* Check if debug output enabled */
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) {
591*4882a593Smuzhiyun 		return;
592*4882a593Smuzhiyun 	}
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	if (!obj_desc) {
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 		/* This could be a null element of a package */
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n"));
599*4882a593Smuzhiyun 		return;
600*4882a593Smuzhiyun 	}
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
603*4882a593Smuzhiyun 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: ",
604*4882a593Smuzhiyun 				  obj_desc));
605*4882a593Smuzhiyun 		ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC);
606*4882a593Smuzhiyun 		return;
607*4882a593Smuzhiyun 	}
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
610*4882a593Smuzhiyun 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
611*4882a593Smuzhiyun 				  "%p is not a node or operand object: [%s]\n",
612*4882a593Smuzhiyun 				  obj_desc,
613*4882a593Smuzhiyun 				  acpi_ut_get_descriptor_name(obj_desc)));
614*4882a593Smuzhiyun 		ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object));
615*4882a593Smuzhiyun 		return;
616*4882a593Smuzhiyun 	}
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun 	/* obj_desc is a valid object */
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 	if (depth > 0) {
621*4882a593Smuzhiyun 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
622*4882a593Smuzhiyun 				  depth, " ", depth, obj_desc,
623*4882a593Smuzhiyun 				  obj_desc->common.reference_count));
624*4882a593Smuzhiyun 	} else {
625*4882a593Smuzhiyun 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Refs=%u ",
626*4882a593Smuzhiyun 				  obj_desc, obj_desc->common.reference_count));
627*4882a593Smuzhiyun 	}
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	/* Decode object type */
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	switch (obj_desc->common.type) {
632*4882a593Smuzhiyun 	case ACPI_TYPE_LOCAL_REFERENCE:
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 		acpi_os_printf("Reference: [%s] ",
635*4882a593Smuzhiyun 			       acpi_ut_get_reference_name(obj_desc));
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 		switch (obj_desc->reference.class) {
638*4882a593Smuzhiyun 		case ACPI_REFCLASS_DEBUG:
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 			acpi_os_printf("\n");
641*4882a593Smuzhiyun 			break;
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 		case ACPI_REFCLASS_INDEX:
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 			acpi_os_printf("%p\n", obj_desc->reference.object);
646*4882a593Smuzhiyun 			break;
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 		case ACPI_REFCLASS_TABLE:
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 			acpi_os_printf("Table Index %X\n",
651*4882a593Smuzhiyun 				       obj_desc->reference.value);
652*4882a593Smuzhiyun 			break;
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 		case ACPI_REFCLASS_REFOF:
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 			acpi_os_printf("%p [%s]\n", obj_desc->reference.object,
657*4882a593Smuzhiyun 				       acpi_ut_get_type_name(((union
658*4882a593Smuzhiyun 							       acpi_operand_object
659*4882a593Smuzhiyun 							       *)
660*4882a593Smuzhiyun 							      obj_desc->
661*4882a593Smuzhiyun 							      reference.
662*4882a593Smuzhiyun 							      object)->common.
663*4882a593Smuzhiyun 							     type));
664*4882a593Smuzhiyun 			break;
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 		case ACPI_REFCLASS_NAME:
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 			acpi_ut_repair_name(obj_desc->reference.node->name.
669*4882a593Smuzhiyun 					    ascii);
670*4882a593Smuzhiyun 			acpi_os_printf("- [%4.4s] (Node %p)\n",
671*4882a593Smuzhiyun 				       obj_desc->reference.node->name.ascii,
672*4882a593Smuzhiyun 				       obj_desc->reference.node);
673*4882a593Smuzhiyun 			break;
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun 		case ACPI_REFCLASS_ARG:
676*4882a593Smuzhiyun 		case ACPI_REFCLASS_LOCAL:
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 			acpi_os_printf("%X\n", obj_desc->reference.value);
679*4882a593Smuzhiyun 			break;
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 		default:	/* Unknown reference class */
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 			acpi_os_printf("%2.2X\n", obj_desc->reference.class);
684*4882a593Smuzhiyun 			break;
685*4882a593Smuzhiyun 		}
686*4882a593Smuzhiyun 		break;
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 	case ACPI_TYPE_BUFFER:
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 		acpi_os_printf("Buffer length %.2X @ %p\n",
691*4882a593Smuzhiyun 			       obj_desc->buffer.length,
692*4882a593Smuzhiyun 			       obj_desc->buffer.pointer);
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 		/* Debug only -- dump the buffer contents */
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 		if (obj_desc->buffer.pointer) {
697*4882a593Smuzhiyun 			length = obj_desc->buffer.length;
698*4882a593Smuzhiyun 			if (length > 128) {
699*4882a593Smuzhiyun 				length = 128;
700*4882a593Smuzhiyun 			}
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 			acpi_os_printf
703*4882a593Smuzhiyun 			    ("Buffer Contents: (displaying length 0x%.2X)\n",
704*4882a593Smuzhiyun 			     length);
705*4882a593Smuzhiyun 			ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, length);
706*4882a593Smuzhiyun 		}
707*4882a593Smuzhiyun 		break;
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	case ACPI_TYPE_INTEGER:
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 		acpi_os_printf("Integer %8.8X%8.8X\n",
712*4882a593Smuzhiyun 			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
713*4882a593Smuzhiyun 		break;
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun 	case ACPI_TYPE_PACKAGE:
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 		acpi_os_printf("Package [Len %X] ElementArray %p\n",
718*4882a593Smuzhiyun 			       obj_desc->package.count,
719*4882a593Smuzhiyun 			       obj_desc->package.elements);
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 		/*
722*4882a593Smuzhiyun 		 * If elements exist, package element pointer is valid,
723*4882a593Smuzhiyun 		 * and debug_level exceeds 1, dump package's elements.
724*4882a593Smuzhiyun 		 */
725*4882a593Smuzhiyun 		if (obj_desc->package.count &&
726*4882a593Smuzhiyun 		    obj_desc->package.elements && acpi_dbg_level > 1) {
727*4882a593Smuzhiyun 			for (index = 0; index < obj_desc->package.count;
728*4882a593Smuzhiyun 			     index++) {
729*4882a593Smuzhiyun 				acpi_ex_dump_operand(obj_desc->package.
730*4882a593Smuzhiyun 						     elements[index],
731*4882a593Smuzhiyun 						     depth + 1);
732*4882a593Smuzhiyun 			}
733*4882a593Smuzhiyun 		}
734*4882a593Smuzhiyun 		break;
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	case ACPI_TYPE_REGION:
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 		acpi_os_printf("Region %s (%X)",
739*4882a593Smuzhiyun 			       acpi_ut_get_region_name(obj_desc->region.
740*4882a593Smuzhiyun 						       space_id),
741*4882a593Smuzhiyun 			       obj_desc->region.space_id);
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 		/*
744*4882a593Smuzhiyun 		 * If the address and length have not been evaluated,
745*4882a593Smuzhiyun 		 * don't print them.
746*4882a593Smuzhiyun 		 */
747*4882a593Smuzhiyun 		if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) {
748*4882a593Smuzhiyun 			acpi_os_printf("\n");
749*4882a593Smuzhiyun 		} else {
750*4882a593Smuzhiyun 			acpi_os_printf(" base %8.8X%8.8X Length %X\n",
751*4882a593Smuzhiyun 				       ACPI_FORMAT_UINT64(obj_desc->region.
752*4882a593Smuzhiyun 							  address),
753*4882a593Smuzhiyun 				       obj_desc->region.length);
754*4882a593Smuzhiyun 		}
755*4882a593Smuzhiyun 		break;
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun 	case ACPI_TYPE_STRING:
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 		acpi_os_printf("String length %X @ %p ",
760*4882a593Smuzhiyun 			       obj_desc->string.length,
761*4882a593Smuzhiyun 			       obj_desc->string.pointer);
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 		acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
764*4882a593Smuzhiyun 		acpi_os_printf("\n");
765*4882a593Smuzhiyun 		break;
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	case ACPI_TYPE_LOCAL_BANK_FIELD:
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun 		acpi_os_printf("BankField\n");
770*4882a593Smuzhiyun 		break;
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	case ACPI_TYPE_LOCAL_REGION_FIELD:
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 		acpi_os_printf
775*4882a593Smuzhiyun 		    ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at "
776*4882a593Smuzhiyun 		     "byte=%X bit=%X of below:\n", obj_desc->field.bit_length,
777*4882a593Smuzhiyun 		     obj_desc->field.access_byte_width,
778*4882a593Smuzhiyun 		     obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK,
779*4882a593Smuzhiyun 		     obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK,
780*4882a593Smuzhiyun 		     obj_desc->field.base_byte_offset,
781*4882a593Smuzhiyun 		     obj_desc->field.start_field_bit_offset);
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 		acpi_ex_dump_operand(obj_desc->field.region_obj, depth + 1);
784*4882a593Smuzhiyun 		break;
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	case ACPI_TYPE_LOCAL_INDEX_FIELD:
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 		acpi_os_printf("IndexField\n");
789*4882a593Smuzhiyun 		break;
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	case ACPI_TYPE_BUFFER_FIELD:
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 		acpi_os_printf("BufferField: %X bits at byte %X bit %X of\n",
794*4882a593Smuzhiyun 			       obj_desc->buffer_field.bit_length,
795*4882a593Smuzhiyun 			       obj_desc->buffer_field.base_byte_offset,
796*4882a593Smuzhiyun 			       obj_desc->buffer_field.start_field_bit_offset);
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 		if (!obj_desc->buffer_field.buffer_obj) {
799*4882a593Smuzhiyun 			ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n"));
800*4882a593Smuzhiyun 		} else if ((obj_desc->buffer_field.buffer_obj)->common.type !=
801*4882a593Smuzhiyun 			   ACPI_TYPE_BUFFER) {
802*4882a593Smuzhiyun 			acpi_os_printf("*not a Buffer*\n");
803*4882a593Smuzhiyun 		} else {
804*4882a593Smuzhiyun 			acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj,
805*4882a593Smuzhiyun 					     depth + 1);
806*4882a593Smuzhiyun 		}
807*4882a593Smuzhiyun 		break;
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	case ACPI_TYPE_EVENT:
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 		acpi_os_printf("Event\n");
812*4882a593Smuzhiyun 		break;
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun 	case ACPI_TYPE_METHOD:
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 		acpi_os_printf("Method(%X) @ %p:%X\n",
817*4882a593Smuzhiyun 			       obj_desc->method.param_count,
818*4882a593Smuzhiyun 			       obj_desc->method.aml_start,
819*4882a593Smuzhiyun 			       obj_desc->method.aml_length);
820*4882a593Smuzhiyun 		break;
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	case ACPI_TYPE_MUTEX:
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 		acpi_os_printf("Mutex\n");
825*4882a593Smuzhiyun 		break;
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun 	case ACPI_TYPE_DEVICE:
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 		acpi_os_printf("Device\n");
830*4882a593Smuzhiyun 		break;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	case ACPI_TYPE_POWER:
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 		acpi_os_printf("Power\n");
835*4882a593Smuzhiyun 		break;
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 	case ACPI_TYPE_PROCESSOR:
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 		acpi_os_printf("Processor\n");
840*4882a593Smuzhiyun 		break;
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	case ACPI_TYPE_THERMAL:
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 		acpi_os_printf("Thermal\n");
845*4882a593Smuzhiyun 		break;
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	default:
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun 		/* Unknown Type */
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 		acpi_os_printf("Unknown Type %X\n", obj_desc->common.type);
852*4882a593Smuzhiyun 		break;
853*4882a593Smuzhiyun 	}
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun 	return;
856*4882a593Smuzhiyun }
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun /*******************************************************************************
859*4882a593Smuzhiyun  *
860*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_operands
861*4882a593Smuzhiyun  *
862*4882a593Smuzhiyun  * PARAMETERS:  operands            - A list of Operand objects
863*4882a593Smuzhiyun  *		opcode_name	    - AML opcode name
864*4882a593Smuzhiyun  *		num_operands	    - Operand count for this opcode
865*4882a593Smuzhiyun  *
866*4882a593Smuzhiyun  * DESCRIPTION: Dump the operands associated with the opcode
867*4882a593Smuzhiyun  *
868*4882a593Smuzhiyun  ******************************************************************************/
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun void
acpi_ex_dump_operands(union acpi_operand_object ** operands,const char * opcode_name,u32 num_operands)871*4882a593Smuzhiyun acpi_ex_dump_operands(union acpi_operand_object **operands,
872*4882a593Smuzhiyun 		      const char *opcode_name, u32 num_operands)
873*4882a593Smuzhiyun {
874*4882a593Smuzhiyun 	ACPI_FUNCTION_TRACE(ex_dump_operands);
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun 	if (!opcode_name) {
877*4882a593Smuzhiyun 		opcode_name = "UNKNOWN";
878*4882a593Smuzhiyun 	}
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
881*4882a593Smuzhiyun 			  "**** Start operand dump for opcode [%s], %u operands\n",
882*4882a593Smuzhiyun 			  opcode_name, num_operands));
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	if (num_operands == 0) {
885*4882a593Smuzhiyun 		num_operands = 1;
886*4882a593Smuzhiyun 	}
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun 	/* Dump the individual operands */
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	while (num_operands) {
891*4882a593Smuzhiyun 		acpi_ex_dump_operand(*operands, 0);
892*4882a593Smuzhiyun 		operands++;
893*4882a593Smuzhiyun 		num_operands--;
894*4882a593Smuzhiyun 	}
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
897*4882a593Smuzhiyun 			  "**** End operand dump for [%s]\n", opcode_name));
898*4882a593Smuzhiyun 	return_VOID;
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun /*******************************************************************************
902*4882a593Smuzhiyun  *
903*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_out* functions
904*4882a593Smuzhiyun  *
905*4882a593Smuzhiyun  * PARAMETERS:  title               - Descriptive text
906*4882a593Smuzhiyun  *              value               - Value to be displayed
907*4882a593Smuzhiyun  *
908*4882a593Smuzhiyun  * DESCRIPTION: Object dump output formatting functions. These functions
909*4882a593Smuzhiyun  *              reduce the number of format strings required and keeps them
910*4882a593Smuzhiyun  *              all in one place for easy modification.
911*4882a593Smuzhiyun  *
912*4882a593Smuzhiyun  ******************************************************************************/
913*4882a593Smuzhiyun 
acpi_ex_out_string(const char * title,const char * value)914*4882a593Smuzhiyun static void acpi_ex_out_string(const char *title, const char *value)
915*4882a593Smuzhiyun {
916*4882a593Smuzhiyun 	acpi_os_printf("%20s : %s\n", title, value);
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun 
acpi_ex_out_pointer(const char * title,const void * value)919*4882a593Smuzhiyun static void acpi_ex_out_pointer(const char *title, const void *value)
920*4882a593Smuzhiyun {
921*4882a593Smuzhiyun 	acpi_os_printf("%20s : %p\n", title, value);
922*4882a593Smuzhiyun }
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun /*******************************************************************************
925*4882a593Smuzhiyun  *
926*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_namespace_node
927*4882a593Smuzhiyun  *
928*4882a593Smuzhiyun  * PARAMETERS:  node                - Descriptor to dump
929*4882a593Smuzhiyun  *              flags               - Force display if TRUE
930*4882a593Smuzhiyun  *
931*4882a593Smuzhiyun  * DESCRIPTION: Dumps the members of the given.Node
932*4882a593Smuzhiyun  *
933*4882a593Smuzhiyun  ******************************************************************************/
934*4882a593Smuzhiyun 
acpi_ex_dump_namespace_node(struct acpi_namespace_node * node,u32 flags)935*4882a593Smuzhiyun void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags)
936*4882a593Smuzhiyun {
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	ACPI_FUNCTION_ENTRY();
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	if (!flags) {
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 		/* Check if debug output enabled */
943*4882a593Smuzhiyun 
944*4882a593Smuzhiyun 		if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) {
945*4882a593Smuzhiyun 			return;
946*4882a593Smuzhiyun 		}
947*4882a593Smuzhiyun 	}
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun 	acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node));
950*4882a593Smuzhiyun 	acpi_os_printf("%20s : %2.2X [%s]\n", "Type",
951*4882a593Smuzhiyun 		       node->type, acpi_ut_get_type_name(node->type));
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node),
954*4882a593Smuzhiyun 			    acpi_ex_dump_node);
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun /*******************************************************************************
958*4882a593Smuzhiyun  *
959*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_reference_obj
960*4882a593Smuzhiyun  *
961*4882a593Smuzhiyun  * PARAMETERS:  object              - Descriptor to dump
962*4882a593Smuzhiyun  *
963*4882a593Smuzhiyun  * DESCRIPTION: Dumps a reference object
964*4882a593Smuzhiyun  *
965*4882a593Smuzhiyun  ******************************************************************************/
966*4882a593Smuzhiyun 
acpi_ex_dump_reference_obj(union acpi_operand_object * obj_desc)967*4882a593Smuzhiyun static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
968*4882a593Smuzhiyun {
969*4882a593Smuzhiyun 	struct acpi_buffer ret_buf;
970*4882a593Smuzhiyun 	acpi_status status;
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun 	ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	if (obj_desc->reference.class == ACPI_REFCLASS_NAME) {
975*4882a593Smuzhiyun 		acpi_os_printf(" %p ", obj_desc->reference.node);
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 		status = acpi_ns_handle_to_pathname(obj_desc->reference.node,
978*4882a593Smuzhiyun 						    &ret_buf, TRUE);
979*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
980*4882a593Smuzhiyun 			acpi_os_printf
981*4882a593Smuzhiyun 			    (" Could not convert name to pathname: %s\n",
982*4882a593Smuzhiyun 			     acpi_format_exception(status));
983*4882a593Smuzhiyun 		} else {
984*4882a593Smuzhiyun 			acpi_os_printf("%s: %s\n",
985*4882a593Smuzhiyun 				       acpi_ut_get_type_name(obj_desc->
986*4882a593Smuzhiyun 							     reference.node->
987*4882a593Smuzhiyun 							     type),
988*4882a593Smuzhiyun 				       (char *)ret_buf.pointer);
989*4882a593Smuzhiyun 			ACPI_FREE(ret_buf.pointer);
990*4882a593Smuzhiyun 		}
991*4882a593Smuzhiyun 	} else if (obj_desc->reference.object) {
992*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
993*4882a593Smuzhiyun 		    ACPI_DESC_TYPE_OPERAND) {
994*4882a593Smuzhiyun 			acpi_os_printf("%22s %p", "Target :",
995*4882a593Smuzhiyun 				       obj_desc->reference.object);
996*4882a593Smuzhiyun 			if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) {
997*4882a593Smuzhiyun 				acpi_os_printf(" Table Index: %X\n",
998*4882a593Smuzhiyun 					       obj_desc->reference.value);
999*4882a593Smuzhiyun 			} else {
1000*4882a593Smuzhiyun 				acpi_os_printf(" [%s]\n",
1001*4882a593Smuzhiyun 					       acpi_ut_get_type_name(((union
1002*4882a593Smuzhiyun 								       acpi_operand_object
1003*4882a593Smuzhiyun 								       *)
1004*4882a593Smuzhiyun 								      obj_desc->
1005*4882a593Smuzhiyun 								      reference.
1006*4882a593Smuzhiyun 								      object)->
1007*4882a593Smuzhiyun 								     common.
1008*4882a593Smuzhiyun 								     type));
1009*4882a593Smuzhiyun 			}
1010*4882a593Smuzhiyun 		} else {
1011*4882a593Smuzhiyun 			acpi_os_printf(" Target: %p\n",
1012*4882a593Smuzhiyun 				       obj_desc->reference.object);
1013*4882a593Smuzhiyun 		}
1014*4882a593Smuzhiyun 	}
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun /*******************************************************************************
1018*4882a593Smuzhiyun  *
1019*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_package_obj
1020*4882a593Smuzhiyun  *
1021*4882a593Smuzhiyun  * PARAMETERS:  obj_desc            - Descriptor to dump
1022*4882a593Smuzhiyun  *              level               - Indentation Level
1023*4882a593Smuzhiyun  *              index               - Package index for this object
1024*4882a593Smuzhiyun  *
1025*4882a593Smuzhiyun  * DESCRIPTION: Dumps the elements of the package
1026*4882a593Smuzhiyun  *
1027*4882a593Smuzhiyun  ******************************************************************************/
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun static void
acpi_ex_dump_package_obj(union acpi_operand_object * obj_desc,u32 level,u32 index)1030*4882a593Smuzhiyun acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
1031*4882a593Smuzhiyun 			 u32 level, u32 index)
1032*4882a593Smuzhiyun {
1033*4882a593Smuzhiyun 	u32 i;
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	/* Indentation and index output */
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun 	if (level > 0) {
1038*4882a593Smuzhiyun 		for (i = 0; i < level; i++) {
1039*4882a593Smuzhiyun 			acpi_os_printf(" ");
1040*4882a593Smuzhiyun 		}
1041*4882a593Smuzhiyun 
1042*4882a593Smuzhiyun 		acpi_os_printf("[%.2d] ", index);
1043*4882a593Smuzhiyun 	}
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	acpi_os_printf("%p ", obj_desc);
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun 	/* Null package elements are allowed */
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun 	if (!obj_desc) {
1050*4882a593Smuzhiyun 		acpi_os_printf("[Null Object]\n");
1051*4882a593Smuzhiyun 		return;
1052*4882a593Smuzhiyun 	}
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	/* Packages may only contain a few object types */
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 	switch (obj_desc->common.type) {
1057*4882a593Smuzhiyun 	case ACPI_TYPE_INTEGER:
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 		acpi_os_printf("[Integer] = %8.8X%8.8X\n",
1060*4882a593Smuzhiyun 			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
1061*4882a593Smuzhiyun 		break;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun 	case ACPI_TYPE_STRING:
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun 		acpi_os_printf("[String] Value: ");
1066*4882a593Smuzhiyun 		acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
1067*4882a593Smuzhiyun 		acpi_os_printf("\n");
1068*4882a593Smuzhiyun 		break;
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun 	case ACPI_TYPE_BUFFER:
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun 		acpi_os_printf("[Buffer] Length %.2X = ",
1073*4882a593Smuzhiyun 			       obj_desc->buffer.length);
1074*4882a593Smuzhiyun 		if (obj_desc->buffer.length) {
1075*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer(ACPI_CAST_PTR
1076*4882a593Smuzhiyun 						  (u8,
1077*4882a593Smuzhiyun 						   obj_desc->buffer.pointer),
1078*4882a593Smuzhiyun 						  obj_desc->buffer.length,
1079*4882a593Smuzhiyun 						  DB_DWORD_DISPLAY, _COMPONENT);
1080*4882a593Smuzhiyun 		} else {
1081*4882a593Smuzhiyun 			acpi_os_printf("\n");
1082*4882a593Smuzhiyun 		}
1083*4882a593Smuzhiyun 		break;
1084*4882a593Smuzhiyun 
1085*4882a593Smuzhiyun 	case ACPI_TYPE_PACKAGE:
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 		acpi_os_printf("[Package] Contains %u Elements:\n",
1088*4882a593Smuzhiyun 			       obj_desc->package.count);
1089*4882a593Smuzhiyun 
1090*4882a593Smuzhiyun 		for (i = 0; i < obj_desc->package.count; i++) {
1091*4882a593Smuzhiyun 			acpi_ex_dump_package_obj(obj_desc->package.elements[i],
1092*4882a593Smuzhiyun 						 level + 1, i);
1093*4882a593Smuzhiyun 		}
1094*4882a593Smuzhiyun 		break;
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 	case ACPI_TYPE_LOCAL_REFERENCE:
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun 		acpi_os_printf("[Object Reference] Class [%s]",
1099*4882a593Smuzhiyun 			       acpi_ut_get_reference_name(obj_desc));
1100*4882a593Smuzhiyun 		acpi_ex_dump_reference_obj(obj_desc);
1101*4882a593Smuzhiyun 		break;
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun 	default:
1104*4882a593Smuzhiyun 
1105*4882a593Smuzhiyun 		acpi_os_printf("[%s] Type: %2.2X\n",
1106*4882a593Smuzhiyun 			       acpi_ut_get_type_name(obj_desc->common.type),
1107*4882a593Smuzhiyun 			       obj_desc->common.type);
1108*4882a593Smuzhiyun 		break;
1109*4882a593Smuzhiyun 	}
1110*4882a593Smuzhiyun }
1111*4882a593Smuzhiyun 
1112*4882a593Smuzhiyun /*******************************************************************************
1113*4882a593Smuzhiyun  *
1114*4882a593Smuzhiyun  * FUNCTION:    acpi_ex_dump_object_descriptor
1115*4882a593Smuzhiyun  *
1116*4882a593Smuzhiyun  * PARAMETERS:  obj_desc            - Descriptor to dump
1117*4882a593Smuzhiyun  *              flags               - Force display if TRUE
1118*4882a593Smuzhiyun  *
1119*4882a593Smuzhiyun  * DESCRIPTION: Dumps the members of the object descriptor given.
1120*4882a593Smuzhiyun  *
1121*4882a593Smuzhiyun  ******************************************************************************/
1122*4882a593Smuzhiyun 
1123*4882a593Smuzhiyun void
acpi_ex_dump_object_descriptor(union acpi_operand_object * obj_desc,u32 flags)1124*4882a593Smuzhiyun acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
1125*4882a593Smuzhiyun {
1126*4882a593Smuzhiyun 	ACPI_FUNCTION_TRACE(ex_dump_object_descriptor);
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun 	if (!obj_desc) {
1129*4882a593Smuzhiyun 		return_VOID;
1130*4882a593Smuzhiyun 	}
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun 	if (!flags) {
1133*4882a593Smuzhiyun 
1134*4882a593Smuzhiyun 		/* Check if debug output enabled */
1135*4882a593Smuzhiyun 
1136*4882a593Smuzhiyun 		if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) {
1137*4882a593Smuzhiyun 			return_VOID;
1138*4882a593Smuzhiyun 		}
1139*4882a593Smuzhiyun 	}
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
1142*4882a593Smuzhiyun 		acpi_ex_dump_namespace_node((struct acpi_namespace_node *)
1143*4882a593Smuzhiyun 					    obj_desc, flags);
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun 		obj_desc = ((struct acpi_namespace_node *)obj_desc)->object;
1146*4882a593Smuzhiyun 		if (!obj_desc) {
1147*4882a593Smuzhiyun 			return_VOID;
1148*4882a593Smuzhiyun 		}
1149*4882a593Smuzhiyun 
1150*4882a593Smuzhiyun 		acpi_os_printf("\nAttached Object %p", obj_desc);
1151*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
1152*4882a593Smuzhiyun 			acpi_os_printf(" - Namespace Node");
1153*4882a593Smuzhiyun 		}
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 		acpi_os_printf(":\n");
1156*4882a593Smuzhiyun 		goto dump_object;
1157*4882a593Smuzhiyun 	}
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 	if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) {
1160*4882a593Smuzhiyun 		acpi_os_printf("%p is not an ACPI operand object: [%s]\n",
1161*4882a593Smuzhiyun 			       obj_desc, acpi_ut_get_descriptor_name(obj_desc));
1162*4882a593Smuzhiyun 		return_VOID;
1163*4882a593Smuzhiyun 	}
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun 	/* Validate the object type */
1166*4882a593Smuzhiyun 
1167*4882a593Smuzhiyun 	if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) {
1168*4882a593Smuzhiyun 		acpi_os_printf("Not a known object type: %2.2X\n",
1169*4882a593Smuzhiyun 			       obj_desc->common.type);
1170*4882a593Smuzhiyun 		return_VOID;
1171*4882a593Smuzhiyun 	}
1172*4882a593Smuzhiyun 
1173*4882a593Smuzhiyun dump_object:
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun 	if (!obj_desc) {
1176*4882a593Smuzhiyun 		return_VOID;
1177*4882a593Smuzhiyun 	}
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun 	/* Common Fields */
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun 	acpi_ex_dump_object(obj_desc, acpi_ex_dump_common);
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	/* Object-specific fields */
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	acpi_ex_dump_object(obj_desc, acpi_ex_dump_info[obj_desc->common.type]);
1186*4882a593Smuzhiyun 
1187*4882a593Smuzhiyun 	if (obj_desc->common.type == ACPI_TYPE_REGION) {
1188*4882a593Smuzhiyun 		obj_desc = obj_desc->common.next_object;
1189*4882a593Smuzhiyun 		if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) {
1190*4882a593Smuzhiyun 			acpi_os_printf
1191*4882a593Smuzhiyun 			    ("Secondary object is not a known object type: %2.2X\n",
1192*4882a593Smuzhiyun 			     obj_desc->common.type);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun 			return_VOID;
1195*4882a593Smuzhiyun 		}
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun 		acpi_os_printf("\nExtra attached Object (%p):\n", obj_desc);
1198*4882a593Smuzhiyun 		acpi_ex_dump_object(obj_desc,
1199*4882a593Smuzhiyun 				    acpi_ex_dump_info[obj_desc->common.type]);
1200*4882a593Smuzhiyun 	}
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun 	return_VOID;
1203*4882a593Smuzhiyun }
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun #endif
1206