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