xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/dbdisply.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: dbdisply - debug display commands
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  ******************************************************************************/
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun #include "amlcode.h"
11*4882a593Smuzhiyun #include "acdispat.h"
12*4882a593Smuzhiyun #include "acnamesp.h"
13*4882a593Smuzhiyun #include "acparser.h"
14*4882a593Smuzhiyun #include "acinterp.h"
15*4882a593Smuzhiyun #include "acevents.h"
16*4882a593Smuzhiyun #include "acdebug.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define _COMPONENT          ACPI_CA_DEBUGGER
19*4882a593Smuzhiyun ACPI_MODULE_NAME("dbdisply")
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* Local prototypes */
22*4882a593Smuzhiyun static void acpi_db_dump_parser_descriptor(union acpi_parse_object *op);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun static void *acpi_db_get_pointer(void *target);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static acpi_status
27*4882a593Smuzhiyun acpi_db_display_non_root_handlers(acpi_handle obj_handle,
28*4882a593Smuzhiyun 				  u32 nesting_level,
29*4882a593Smuzhiyun 				  void *context, void **return_value);
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /*
32*4882a593Smuzhiyun  * System handler information.
33*4882a593Smuzhiyun  * Used for Handlers command, in acpi_db_display_handlers.
34*4882a593Smuzhiyun  */
35*4882a593Smuzhiyun #define ACPI_PREDEFINED_PREFIX          "%25s (%.2X) : "
36*4882a593Smuzhiyun #define ACPI_HANDLER_NAME_STRING               "%30s : "
37*4882a593Smuzhiyun #define ACPI_HANDLER_PRESENT_STRING                    "%-9s (%p)\n"
38*4882a593Smuzhiyun #define ACPI_HANDLER_PRESENT_STRING2                   "%-9s (%p)"
39*4882a593Smuzhiyun #define ACPI_HANDLER_NOT_PRESENT_STRING                "%-9s\n"
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* All predefined Address Space IDs */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static acpi_adr_space_type acpi_gbl_space_id_list[] = {
44*4882a593Smuzhiyun 	ACPI_ADR_SPACE_SYSTEM_MEMORY,
45*4882a593Smuzhiyun 	ACPI_ADR_SPACE_SYSTEM_IO,
46*4882a593Smuzhiyun 	ACPI_ADR_SPACE_PCI_CONFIG,
47*4882a593Smuzhiyun 	ACPI_ADR_SPACE_EC,
48*4882a593Smuzhiyun 	ACPI_ADR_SPACE_SMBUS,
49*4882a593Smuzhiyun 	ACPI_ADR_SPACE_CMOS,
50*4882a593Smuzhiyun 	ACPI_ADR_SPACE_PCI_BAR_TARGET,
51*4882a593Smuzhiyun 	ACPI_ADR_SPACE_IPMI,
52*4882a593Smuzhiyun 	ACPI_ADR_SPACE_GPIO,
53*4882a593Smuzhiyun 	ACPI_ADR_SPACE_GSBUS,
54*4882a593Smuzhiyun 	ACPI_ADR_SPACE_PLATFORM_COMM,
55*4882a593Smuzhiyun 	ACPI_ADR_SPACE_PLATFORM_RT,
56*4882a593Smuzhiyun 	ACPI_ADR_SPACE_DATA_TABLE,
57*4882a593Smuzhiyun 	ACPI_ADR_SPACE_FIXED_HARDWARE
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* Global handler information */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun typedef struct acpi_handler_info {
63*4882a593Smuzhiyun 	void *handler;
64*4882a593Smuzhiyun 	char *name;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun } acpi_handler_info;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static struct acpi_handler_info acpi_gbl_handler_list[] = {
69*4882a593Smuzhiyun 	{&acpi_gbl_global_notify[0].handler, "System Notifications"},
70*4882a593Smuzhiyun 	{&acpi_gbl_global_notify[1].handler, "Device Notifications"},
71*4882a593Smuzhiyun 	{&acpi_gbl_table_handler, "ACPI Table Events"},
72*4882a593Smuzhiyun 	{&acpi_gbl_exception_handler, "Control Method Exceptions"},
73*4882a593Smuzhiyun 	{&acpi_gbl_interface_handler, "OSI Invocations"}
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /*******************************************************************************
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  * FUNCTION:    acpi_db_get_pointer
79*4882a593Smuzhiyun  *
80*4882a593Smuzhiyun  * PARAMETERS:  target          - Pointer to string to be converted
81*4882a593Smuzhiyun  *
82*4882a593Smuzhiyun  * RETURN:      Converted pointer
83*4882a593Smuzhiyun  *
84*4882a593Smuzhiyun  * DESCRIPTION: Convert an ascii pointer value to a real value
85*4882a593Smuzhiyun  *
86*4882a593Smuzhiyun  ******************************************************************************/
87*4882a593Smuzhiyun 
acpi_db_get_pointer(void * target)88*4882a593Smuzhiyun static void *acpi_db_get_pointer(void *target)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	void *obj_ptr;
91*4882a593Smuzhiyun 	acpi_size address;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	address = strtoul(target, NULL, 16);
94*4882a593Smuzhiyun 	obj_ptr = ACPI_TO_POINTER(address);
95*4882a593Smuzhiyun 	return (obj_ptr);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /*******************************************************************************
99*4882a593Smuzhiyun  *
100*4882a593Smuzhiyun  * FUNCTION:    acpi_db_dump_parser_descriptor
101*4882a593Smuzhiyun  *
102*4882a593Smuzhiyun  * PARAMETERS:  op              - A parser Op descriptor
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * RETURN:      None
105*4882a593Smuzhiyun  *
106*4882a593Smuzhiyun  * DESCRIPTION: Display a formatted parser object
107*4882a593Smuzhiyun  *
108*4882a593Smuzhiyun  ******************************************************************************/
109*4882a593Smuzhiyun 
acpi_db_dump_parser_descriptor(union acpi_parse_object * op)110*4882a593Smuzhiyun static void acpi_db_dump_parser_descriptor(union acpi_parse_object *op)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun 	const struct acpi_opcode_info *info;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	info = acpi_ps_get_opcode_info(op->common.aml_opcode);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	acpi_os_printf("Parser Op Descriptor:\n");
117*4882a593Smuzhiyun 	acpi_os_printf("%20.20s : %4.4X\n", "Opcode", op->common.aml_opcode);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	ACPI_DEBUG_ONLY_MEMBERS(acpi_os_printf("%20.20s : %s\n", "Opcode Name",
120*4882a593Smuzhiyun 					       info->name));
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	acpi_os_printf("%20.20s : %p\n", "Value/ArgList", op->common.value.arg);
123*4882a593Smuzhiyun 	acpi_os_printf("%20.20s : %p\n", "Parent", op->common.parent);
124*4882a593Smuzhiyun 	acpi_os_printf("%20.20s : %p\n", "NextOp", op->common.next);
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /*******************************************************************************
128*4882a593Smuzhiyun  *
129*4882a593Smuzhiyun  * FUNCTION:    acpi_db_decode_and_display_object
130*4882a593Smuzhiyun  *
131*4882a593Smuzhiyun  * PARAMETERS:  target          - String with object to be displayed. Names
132*4882a593Smuzhiyun  *                                and hex pointers are supported.
133*4882a593Smuzhiyun  *              output_type     - Byte, Word, Dword, or Qword (B|W|D|Q)
134*4882a593Smuzhiyun  *
135*4882a593Smuzhiyun  * RETURN:      None
136*4882a593Smuzhiyun  *
137*4882a593Smuzhiyun  * DESCRIPTION: Display a formatted ACPI object
138*4882a593Smuzhiyun  *
139*4882a593Smuzhiyun  ******************************************************************************/
140*4882a593Smuzhiyun 
acpi_db_decode_and_display_object(char * target,char * output_type)141*4882a593Smuzhiyun void acpi_db_decode_and_display_object(char *target, char *output_type)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	void *obj_ptr;
144*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
145*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
146*4882a593Smuzhiyun 	u32 display = DB_BYTE_DISPLAY;
147*4882a593Smuzhiyun 	char buffer[80];
148*4882a593Smuzhiyun 	struct acpi_buffer ret_buf;
149*4882a593Smuzhiyun 	acpi_status status;
150*4882a593Smuzhiyun 	u32 size;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	if (!target) {
153*4882a593Smuzhiyun 		return;
154*4882a593Smuzhiyun 	}
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	/* Decode the output type */
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	if (output_type) {
159*4882a593Smuzhiyun 		acpi_ut_strupr(output_type);
160*4882a593Smuzhiyun 		if (output_type[0] == 'W') {
161*4882a593Smuzhiyun 			display = DB_WORD_DISPLAY;
162*4882a593Smuzhiyun 		} else if (output_type[0] == 'D') {
163*4882a593Smuzhiyun 			display = DB_DWORD_DISPLAY;
164*4882a593Smuzhiyun 		} else if (output_type[0] == 'Q') {
165*4882a593Smuzhiyun 			display = DB_QWORD_DISPLAY;
166*4882a593Smuzhiyun 		}
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	ret_buf.length = sizeof(buffer);
170*4882a593Smuzhiyun 	ret_buf.pointer = buffer;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	/* Differentiate between a number and a name */
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	if ((target[0] >= 0x30) && (target[0] <= 0x39)) {
175*4882a593Smuzhiyun 		obj_ptr = acpi_db_get_pointer(target);
176*4882a593Smuzhiyun 		if (!acpi_os_readable(obj_ptr, 16)) {
177*4882a593Smuzhiyun 			acpi_os_printf
178*4882a593Smuzhiyun 			    ("Address %p is invalid in this address space\n",
179*4882a593Smuzhiyun 			     obj_ptr);
180*4882a593Smuzhiyun 			return;
181*4882a593Smuzhiyun 		}
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 		/* Decode the object type */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		switch (ACPI_GET_DESCRIPTOR_TYPE(obj_ptr)) {
186*4882a593Smuzhiyun 		case ACPI_DESC_TYPE_NAMED:
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 			/* This is a namespace Node */
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 			if (!acpi_os_readable
191*4882a593Smuzhiyun 			    (obj_ptr, sizeof(struct acpi_namespace_node))) {
192*4882a593Smuzhiyun 				acpi_os_printf
193*4882a593Smuzhiyun 				    ("Cannot read entire Named object at address %p\n",
194*4882a593Smuzhiyun 				     obj_ptr);
195*4882a593Smuzhiyun 				return;
196*4882a593Smuzhiyun 			}
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 			node = obj_ptr;
199*4882a593Smuzhiyun 			goto dump_node;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 		case ACPI_DESC_TYPE_OPERAND:
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 			/* This is a ACPI OPERAND OBJECT */
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 			if (!acpi_os_readable
206*4882a593Smuzhiyun 			    (obj_ptr, sizeof(union acpi_operand_object))) {
207*4882a593Smuzhiyun 				acpi_os_printf
208*4882a593Smuzhiyun 				    ("Cannot read entire ACPI object at address %p\n",
209*4882a593Smuzhiyun 				     obj_ptr);
210*4882a593Smuzhiyun 				return;
211*4882a593Smuzhiyun 			}
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer(obj_ptr,
214*4882a593Smuzhiyun 						  sizeof(union
215*4882a593Smuzhiyun 							 acpi_operand_object),
216*4882a593Smuzhiyun 						  display, ACPI_UINT32_MAX);
217*4882a593Smuzhiyun 			acpi_ex_dump_object_descriptor(obj_ptr, 1);
218*4882a593Smuzhiyun 			break;
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 		case ACPI_DESC_TYPE_PARSER:
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 			/* This is a Parser Op object */
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 			if (!acpi_os_readable
225*4882a593Smuzhiyun 			    (obj_ptr, sizeof(union acpi_parse_object))) {
226*4882a593Smuzhiyun 				acpi_os_printf
227*4882a593Smuzhiyun 				    ("Cannot read entire Parser object at address %p\n",
228*4882a593Smuzhiyun 				     obj_ptr);
229*4882a593Smuzhiyun 				return;
230*4882a593Smuzhiyun 			}
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer(obj_ptr,
233*4882a593Smuzhiyun 						  sizeof(union
234*4882a593Smuzhiyun 							 acpi_parse_object),
235*4882a593Smuzhiyun 						  display, ACPI_UINT32_MAX);
236*4882a593Smuzhiyun 			acpi_db_dump_parser_descriptor((union acpi_parse_object
237*4882a593Smuzhiyun 							*)obj_ptr);
238*4882a593Smuzhiyun 			break;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 		default:
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 			/* Is not a recognizable object */
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 			acpi_os_printf
245*4882a593Smuzhiyun 			    ("Not a known ACPI internal object, descriptor type %2.2X\n",
246*4882a593Smuzhiyun 			     ACPI_GET_DESCRIPTOR_TYPE(obj_ptr));
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 			size = 16;
249*4882a593Smuzhiyun 			if (acpi_os_readable(obj_ptr, 64)) {
250*4882a593Smuzhiyun 				size = 64;
251*4882a593Smuzhiyun 			}
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 			/* Just dump some memory */
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer(obj_ptr, size, display,
256*4882a593Smuzhiyun 						  ACPI_UINT32_MAX);
257*4882a593Smuzhiyun 			break;
258*4882a593Smuzhiyun 		}
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 		return;
261*4882a593Smuzhiyun 	}
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	/* The parameter is a name string that must be resolved to a Named obj */
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	node = acpi_db_local_ns_lookup(target);
266*4882a593Smuzhiyun 	if (!node) {
267*4882a593Smuzhiyun 		return;
268*4882a593Smuzhiyun 	}
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun dump_node:
271*4882a593Smuzhiyun 	/* Now dump the NS node */
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	status = acpi_get_name(node, ACPI_FULL_PATHNAME_NO_TRAILING, &ret_buf);
274*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
275*4882a593Smuzhiyun 		acpi_os_printf("Could not convert name to pathname\n");
276*4882a593Smuzhiyun 	}
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	else {
279*4882a593Smuzhiyun 		acpi_os_printf("Object %p: Namespace Node - Pathname: %s\n",
280*4882a593Smuzhiyun 			       node, (char *)ret_buf.pointer);
281*4882a593Smuzhiyun 	}
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	if (!acpi_os_readable(node, sizeof(struct acpi_namespace_node))) {
284*4882a593Smuzhiyun 		acpi_os_printf("Invalid Named object at address %p\n", node);
285*4882a593Smuzhiyun 		return;
286*4882a593Smuzhiyun 	}
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	acpi_ut_debug_dump_buffer((void *)node,
289*4882a593Smuzhiyun 				  sizeof(struct acpi_namespace_node), display,
290*4882a593Smuzhiyun 				  ACPI_UINT32_MAX);
291*4882a593Smuzhiyun 	acpi_ex_dump_namespace_node(node, 1);
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	obj_desc = acpi_ns_get_attached_object(node);
294*4882a593Smuzhiyun 	if (obj_desc) {
295*4882a593Smuzhiyun 		acpi_os_printf("\nAttached Object %p:", obj_desc);
296*4882a593Smuzhiyun 		if (!acpi_os_readable
297*4882a593Smuzhiyun 		    (obj_desc, sizeof(union acpi_operand_object))) {
298*4882a593Smuzhiyun 			acpi_os_printf
299*4882a593Smuzhiyun 			    ("Invalid internal ACPI Object at address %p\n",
300*4882a593Smuzhiyun 			     obj_desc);
301*4882a593Smuzhiyun 			return;
302*4882a593Smuzhiyun 		}
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(((struct acpi_namespace_node *)
305*4882a593Smuzhiyun 					      obj_desc)) ==
306*4882a593Smuzhiyun 		    ACPI_DESC_TYPE_NAMED) {
307*4882a593Smuzhiyun 			acpi_os_printf(" Namespace Node - ");
308*4882a593Smuzhiyun 			status =
309*4882a593Smuzhiyun 			    acpi_get_name((struct acpi_namespace_node *)
310*4882a593Smuzhiyun 					  obj_desc,
311*4882a593Smuzhiyun 					  ACPI_FULL_PATHNAME_NO_TRAILING,
312*4882a593Smuzhiyun 					  &ret_buf);
313*4882a593Smuzhiyun 			if (ACPI_FAILURE(status)) {
314*4882a593Smuzhiyun 				acpi_os_printf
315*4882a593Smuzhiyun 				    ("Could not convert name to pathname\n");
316*4882a593Smuzhiyun 			} else {
317*4882a593Smuzhiyun 				acpi_os_printf("Pathname: %s",
318*4882a593Smuzhiyun 					       (char *)ret_buf.pointer);
319*4882a593Smuzhiyun 			}
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 			acpi_os_printf("\n");
322*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer((void *)obj_desc,
323*4882a593Smuzhiyun 						  sizeof(struct
324*4882a593Smuzhiyun 							 acpi_namespace_node),
325*4882a593Smuzhiyun 						  display, ACPI_UINT32_MAX);
326*4882a593Smuzhiyun 		} else {
327*4882a593Smuzhiyun 			acpi_os_printf("\n");
328*4882a593Smuzhiyun 			acpi_ut_debug_dump_buffer((void *)obj_desc,
329*4882a593Smuzhiyun 						  sizeof(union
330*4882a593Smuzhiyun 							 acpi_operand_object),
331*4882a593Smuzhiyun 						  display, ACPI_UINT32_MAX);
332*4882a593Smuzhiyun 		}
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 		acpi_ex_dump_object_descriptor(obj_desc, 1);
335*4882a593Smuzhiyun 	}
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun /*******************************************************************************
339*4882a593Smuzhiyun  *
340*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_method_info
341*4882a593Smuzhiyun  *
342*4882a593Smuzhiyun  * PARAMETERS:  start_op        - Root of the control method parse tree
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * RETURN:      None
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  * DESCRIPTION: Display information about the current method
347*4882a593Smuzhiyun  *
348*4882a593Smuzhiyun  ******************************************************************************/
349*4882a593Smuzhiyun 
acpi_db_display_method_info(union acpi_parse_object * start_op)350*4882a593Smuzhiyun void acpi_db_display_method_info(union acpi_parse_object *start_op)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	struct acpi_walk_state *walk_state;
353*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
354*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
355*4882a593Smuzhiyun 	union acpi_parse_object *root_op;
356*4882a593Smuzhiyun 	union acpi_parse_object *op;
357*4882a593Smuzhiyun 	const struct acpi_opcode_info *op_info;
358*4882a593Smuzhiyun 	u32 num_ops = 0;
359*4882a593Smuzhiyun 	u32 num_operands = 0;
360*4882a593Smuzhiyun 	u32 num_operators = 0;
361*4882a593Smuzhiyun 	u32 num_remaining_ops = 0;
362*4882a593Smuzhiyun 	u32 num_remaining_operands = 0;
363*4882a593Smuzhiyun 	u32 num_remaining_operators = 0;
364*4882a593Smuzhiyun 	u8 count_remaining = FALSE;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);
367*4882a593Smuzhiyun 	if (!walk_state) {
368*4882a593Smuzhiyun 		acpi_os_printf("There is no method currently executing\n");
369*4882a593Smuzhiyun 		return;
370*4882a593Smuzhiyun 	}
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	obj_desc = walk_state->method_desc;
373*4882a593Smuzhiyun 	node = walk_state->method_node;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	acpi_os_printf("Currently executing control method is [%4.4s]\n",
376*4882a593Smuzhiyun 		       acpi_ut_get_node_name(node));
377*4882a593Smuzhiyun 	acpi_os_printf("%X Arguments, SyncLevel = %X\n",
378*4882a593Smuzhiyun 		       (u32)obj_desc->method.param_count,
379*4882a593Smuzhiyun 		       (u32)obj_desc->method.sync_level);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	root_op = start_op;
382*4882a593Smuzhiyun 	while (root_op->common.parent) {
383*4882a593Smuzhiyun 		root_op = root_op->common.parent;
384*4882a593Smuzhiyun 	}
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	op = root_op;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	while (op) {
389*4882a593Smuzhiyun 		if (op == start_op) {
390*4882a593Smuzhiyun 			count_remaining = TRUE;
391*4882a593Smuzhiyun 		}
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 		num_ops++;
394*4882a593Smuzhiyun 		if (count_remaining) {
395*4882a593Smuzhiyun 			num_remaining_ops++;
396*4882a593Smuzhiyun 		}
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 		/* Decode the opcode */
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 		op_info = acpi_ps_get_opcode_info(op->common.aml_opcode);
401*4882a593Smuzhiyun 		switch (op_info->class) {
402*4882a593Smuzhiyun 		case AML_CLASS_ARGUMENT:
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 			if (count_remaining) {
405*4882a593Smuzhiyun 				num_remaining_operands++;
406*4882a593Smuzhiyun 			}
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 			num_operands++;
409*4882a593Smuzhiyun 			break;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 		case AML_CLASS_UNKNOWN:
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 			/* Bad opcode or ASCII character */
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 			continue;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 		default:
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 			if (count_remaining) {
420*4882a593Smuzhiyun 				num_remaining_operators++;
421*4882a593Smuzhiyun 			}
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 			num_operators++;
424*4882a593Smuzhiyun 			break;
425*4882a593Smuzhiyun 		}
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 		op = acpi_ps_get_depth_next(start_op, op);
428*4882a593Smuzhiyun 	}
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	acpi_os_printf
431*4882a593Smuzhiyun 	    ("Method contains:       %X AML Opcodes - %X Operators, %X Operands\n",
432*4882a593Smuzhiyun 	     num_ops, num_operators, num_operands);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	acpi_os_printf
435*4882a593Smuzhiyun 	    ("Remaining to execute:  %X AML Opcodes - %X Operators, %X Operands\n",
436*4882a593Smuzhiyun 	     num_remaining_ops, num_remaining_operators,
437*4882a593Smuzhiyun 	     num_remaining_operands);
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun /*******************************************************************************
441*4882a593Smuzhiyun  *
442*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_locals
443*4882a593Smuzhiyun  *
444*4882a593Smuzhiyun  * PARAMETERS:  None
445*4882a593Smuzhiyun  *
446*4882a593Smuzhiyun  * RETURN:      None
447*4882a593Smuzhiyun  *
448*4882a593Smuzhiyun  * DESCRIPTION: Display all locals for the currently running control method
449*4882a593Smuzhiyun  *
450*4882a593Smuzhiyun  ******************************************************************************/
451*4882a593Smuzhiyun 
acpi_db_display_locals(void)452*4882a593Smuzhiyun void acpi_db_display_locals(void)
453*4882a593Smuzhiyun {
454*4882a593Smuzhiyun 	struct acpi_walk_state *walk_state;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);
457*4882a593Smuzhiyun 	if (!walk_state) {
458*4882a593Smuzhiyun 		acpi_os_printf("There is no method currently executing\n");
459*4882a593Smuzhiyun 		return;
460*4882a593Smuzhiyun 	}
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	acpi_db_decode_locals(walk_state);
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun /*******************************************************************************
466*4882a593Smuzhiyun  *
467*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_arguments
468*4882a593Smuzhiyun  *
469*4882a593Smuzhiyun  * PARAMETERS:  None
470*4882a593Smuzhiyun  *
471*4882a593Smuzhiyun  * RETURN:      None
472*4882a593Smuzhiyun  *
473*4882a593Smuzhiyun  * DESCRIPTION: Display all arguments for the currently running control method
474*4882a593Smuzhiyun  *
475*4882a593Smuzhiyun  ******************************************************************************/
476*4882a593Smuzhiyun 
acpi_db_display_arguments(void)477*4882a593Smuzhiyun void acpi_db_display_arguments(void)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun 	struct acpi_walk_state *walk_state;
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);
482*4882a593Smuzhiyun 	if (!walk_state) {
483*4882a593Smuzhiyun 		acpi_os_printf("There is no method currently executing\n");
484*4882a593Smuzhiyun 		return;
485*4882a593Smuzhiyun 	}
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	acpi_db_decode_arguments(walk_state);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun /*******************************************************************************
491*4882a593Smuzhiyun  *
492*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_results
493*4882a593Smuzhiyun  *
494*4882a593Smuzhiyun  * PARAMETERS:  None
495*4882a593Smuzhiyun  *
496*4882a593Smuzhiyun  * RETURN:      None
497*4882a593Smuzhiyun  *
498*4882a593Smuzhiyun  * DESCRIPTION: Display current contents of a method result stack
499*4882a593Smuzhiyun  *
500*4882a593Smuzhiyun  ******************************************************************************/
501*4882a593Smuzhiyun 
acpi_db_display_results(void)502*4882a593Smuzhiyun void acpi_db_display_results(void)
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun 	u32 i;
505*4882a593Smuzhiyun 	struct acpi_walk_state *walk_state;
506*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
507*4882a593Smuzhiyun 	u32 result_count = 0;
508*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
509*4882a593Smuzhiyun 	union acpi_generic_state *frame;
510*4882a593Smuzhiyun 	u32 index;		/* Index onto current frame */
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);
513*4882a593Smuzhiyun 	if (!walk_state) {
514*4882a593Smuzhiyun 		acpi_os_printf("There is no method currently executing\n");
515*4882a593Smuzhiyun 		return;
516*4882a593Smuzhiyun 	}
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	node = walk_state->method_node;
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	if (walk_state->results) {
521*4882a593Smuzhiyun 		result_count = walk_state->result_count;
522*4882a593Smuzhiyun 	}
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	acpi_os_printf("Method [%4.4s] has %X stacked result objects\n",
525*4882a593Smuzhiyun 		       acpi_ut_get_node_name(node), result_count);
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	/* From the top element of result stack */
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	frame = walk_state->results;
530*4882a593Smuzhiyun 	index = (result_count - 1) % ACPI_RESULTS_FRAME_OBJ_NUM;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 	for (i = 0; i < result_count; i++) {
533*4882a593Smuzhiyun 		obj_desc = frame->results.obj_desc[index];
534*4882a593Smuzhiyun 		acpi_os_printf("Result%u: ", i);
535*4882a593Smuzhiyun 		acpi_db_display_internal_object(obj_desc, walk_state);
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 		if (index == 0) {
538*4882a593Smuzhiyun 			frame = frame->results.next;
539*4882a593Smuzhiyun 			index = ACPI_RESULTS_FRAME_OBJ_NUM;
540*4882a593Smuzhiyun 		}
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 		index--;
543*4882a593Smuzhiyun 	}
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun /*******************************************************************************
547*4882a593Smuzhiyun  *
548*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_calling_tree
549*4882a593Smuzhiyun  *
550*4882a593Smuzhiyun  * PARAMETERS:  None
551*4882a593Smuzhiyun  *
552*4882a593Smuzhiyun  * RETURN:      None
553*4882a593Smuzhiyun  *
554*4882a593Smuzhiyun  * DESCRIPTION: Display current calling tree of nested control methods
555*4882a593Smuzhiyun  *
556*4882a593Smuzhiyun  ******************************************************************************/
557*4882a593Smuzhiyun 
acpi_db_display_calling_tree(void)558*4882a593Smuzhiyun void acpi_db_display_calling_tree(void)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun 	struct acpi_walk_state *walk_state;
561*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 	walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);
564*4882a593Smuzhiyun 	if (!walk_state) {
565*4882a593Smuzhiyun 		acpi_os_printf("There is no method currently executing\n");
566*4882a593Smuzhiyun 		return;
567*4882a593Smuzhiyun 	}
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	acpi_os_printf("Current Control Method Call Tree\n");
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 	while (walk_state) {
572*4882a593Smuzhiyun 		node = walk_state->method_node;
573*4882a593Smuzhiyun 		acpi_os_printf("  [%4.4s]\n", acpi_ut_get_node_name(node));
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 		walk_state = walk_state->next;
576*4882a593Smuzhiyun 	}
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun /*******************************************************************************
580*4882a593Smuzhiyun  *
581*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_object_type
582*4882a593Smuzhiyun  *
583*4882a593Smuzhiyun  * PARAMETERS:  object_arg      - User entered NS node handle
584*4882a593Smuzhiyun  *
585*4882a593Smuzhiyun  * RETURN:      None
586*4882a593Smuzhiyun  *
587*4882a593Smuzhiyun  * DESCRIPTION: Display type of an arbitrary NS node
588*4882a593Smuzhiyun  *
589*4882a593Smuzhiyun  ******************************************************************************/
590*4882a593Smuzhiyun 
acpi_db_display_object_type(char * object_arg)591*4882a593Smuzhiyun void acpi_db_display_object_type(char *object_arg)
592*4882a593Smuzhiyun {
593*4882a593Smuzhiyun 	acpi_size arg;
594*4882a593Smuzhiyun 	acpi_handle handle;
595*4882a593Smuzhiyun 	struct acpi_device_info *info;
596*4882a593Smuzhiyun 	acpi_status status;
597*4882a593Smuzhiyun 	u32 i;
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun 	arg = strtoul(object_arg, NULL, 16);
600*4882a593Smuzhiyun 	handle = ACPI_TO_POINTER(arg);
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	status = acpi_get_object_info(handle, &info);
603*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
604*4882a593Smuzhiyun 		acpi_os_printf("Could not get object info, %s\n",
605*4882a593Smuzhiyun 			       acpi_format_exception(status));
606*4882a593Smuzhiyun 		return;
607*4882a593Smuzhiyun 	}
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",
610*4882a593Smuzhiyun 		       ACPI_FORMAT_UINT64(info->address), info->flags);
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun 	acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
613*4882a593Smuzhiyun 		       info->highest_dstates[0], info->highest_dstates[1],
614*4882a593Smuzhiyun 		       info->highest_dstates[2], info->highest_dstates[3]);
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	acpi_os_printf("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
617*4882a593Smuzhiyun 		       info->lowest_dstates[0], info->lowest_dstates[1],
618*4882a593Smuzhiyun 		       info->lowest_dstates[2], info->lowest_dstates[3],
619*4882a593Smuzhiyun 		       info->lowest_dstates[4]);
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_HID) {
622*4882a593Smuzhiyun 		acpi_os_printf("HID: %s\n", info->hardware_id.string);
623*4882a593Smuzhiyun 	}
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_UID) {
626*4882a593Smuzhiyun 		acpi_os_printf("UID: %s\n", info->unique_id.string);
627*4882a593Smuzhiyun 	}
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_CID) {
630*4882a593Smuzhiyun 		for (i = 0; i < info->compatible_id_list.count; i++) {
631*4882a593Smuzhiyun 			acpi_os_printf("CID %u: %s\n", i,
632*4882a593Smuzhiyun 				       info->compatible_id_list.ids[i].string);
633*4882a593Smuzhiyun 		}
634*4882a593Smuzhiyun 	}
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 	ACPI_FREE(info);
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun /*******************************************************************************
640*4882a593Smuzhiyun  *
641*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_result_object
642*4882a593Smuzhiyun  *
643*4882a593Smuzhiyun  * PARAMETERS:  obj_desc        - Object to be displayed
644*4882a593Smuzhiyun  *              walk_state      - Current walk state
645*4882a593Smuzhiyun  *
646*4882a593Smuzhiyun  * RETURN:      None
647*4882a593Smuzhiyun  *
648*4882a593Smuzhiyun  * DESCRIPTION: Display the result of an AML opcode
649*4882a593Smuzhiyun  *
650*4882a593Smuzhiyun  * Note: Currently only displays the result object if we are single stepping.
651*4882a593Smuzhiyun  * However, this output may be useful in other contexts and could be enabled
652*4882a593Smuzhiyun  * to do so if needed.
653*4882a593Smuzhiyun  *
654*4882a593Smuzhiyun  ******************************************************************************/
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun void
acpi_db_display_result_object(union acpi_operand_object * obj_desc,struct acpi_walk_state * walk_state)657*4882a593Smuzhiyun acpi_db_display_result_object(union acpi_operand_object *obj_desc,
658*4882a593Smuzhiyun 			      struct acpi_walk_state *walk_state)
659*4882a593Smuzhiyun {
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun #ifndef ACPI_APPLICATION
662*4882a593Smuzhiyun 	if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
663*4882a593Smuzhiyun 		return;
664*4882a593Smuzhiyun 	}
665*4882a593Smuzhiyun #endif
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	/* Only display if single stepping */
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	if (!acpi_gbl_cm_single_step) {
670*4882a593Smuzhiyun 		return;
671*4882a593Smuzhiyun 	}
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	acpi_os_printf("ResultObj: ");
674*4882a593Smuzhiyun 	acpi_db_display_internal_object(obj_desc, walk_state);
675*4882a593Smuzhiyun 	acpi_os_printf("\n");
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun /*******************************************************************************
679*4882a593Smuzhiyun  *
680*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_argument_object
681*4882a593Smuzhiyun  *
682*4882a593Smuzhiyun  * PARAMETERS:  obj_desc        - Object to be displayed
683*4882a593Smuzhiyun  *              walk_state      - Current walk state
684*4882a593Smuzhiyun  *
685*4882a593Smuzhiyun  * RETURN:      None
686*4882a593Smuzhiyun  *
687*4882a593Smuzhiyun  * DESCRIPTION: Display the result of an AML opcode
688*4882a593Smuzhiyun  *
689*4882a593Smuzhiyun  ******************************************************************************/
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun void
acpi_db_display_argument_object(union acpi_operand_object * obj_desc,struct acpi_walk_state * walk_state)692*4882a593Smuzhiyun acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
693*4882a593Smuzhiyun 				struct acpi_walk_state *walk_state)
694*4882a593Smuzhiyun {
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun #ifndef ACPI_APPLICATION
697*4882a593Smuzhiyun 	if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
698*4882a593Smuzhiyun 		return;
699*4882a593Smuzhiyun 	}
700*4882a593Smuzhiyun #endif
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	if (!acpi_gbl_cm_single_step) {
703*4882a593Smuzhiyun 		return;
704*4882a593Smuzhiyun 	}
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	acpi_os_printf("ArgObj:  ");
707*4882a593Smuzhiyun 	acpi_db_display_internal_object(obj_desc, walk_state);
708*4882a593Smuzhiyun }
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE)
711*4882a593Smuzhiyun /*******************************************************************************
712*4882a593Smuzhiyun  *
713*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_gpes
714*4882a593Smuzhiyun  *
715*4882a593Smuzhiyun  * PARAMETERS:  None
716*4882a593Smuzhiyun  *
717*4882a593Smuzhiyun  * RETURN:      None
718*4882a593Smuzhiyun  *
719*4882a593Smuzhiyun  * DESCRIPTION: Display the current GPE structures
720*4882a593Smuzhiyun  *
721*4882a593Smuzhiyun  ******************************************************************************/
722*4882a593Smuzhiyun 
acpi_db_display_gpes(void)723*4882a593Smuzhiyun void acpi_db_display_gpes(void)
724*4882a593Smuzhiyun {
725*4882a593Smuzhiyun 	struct acpi_gpe_block_info *gpe_block;
726*4882a593Smuzhiyun 	struct acpi_gpe_xrupt_info *gpe_xrupt_info;
727*4882a593Smuzhiyun 	struct acpi_gpe_event_info *gpe_event_info;
728*4882a593Smuzhiyun 	struct acpi_gpe_register_info *gpe_register_info;
729*4882a593Smuzhiyun 	char *gpe_type;
730*4882a593Smuzhiyun 	struct acpi_gpe_notify_info *notify;
731*4882a593Smuzhiyun 	u32 gpe_index;
732*4882a593Smuzhiyun 	u32 block = 0;
733*4882a593Smuzhiyun 	u32 i;
734*4882a593Smuzhiyun 	u32 j;
735*4882a593Smuzhiyun 	u32 count;
736*4882a593Smuzhiyun 	char buffer[80];
737*4882a593Smuzhiyun 	struct acpi_buffer ret_buf;
738*4882a593Smuzhiyun 	acpi_status status;
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	ret_buf.length = sizeof(buffer);
741*4882a593Smuzhiyun 	ret_buf.pointer = buffer;
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	block = 0;
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	/* Walk the GPE lists */
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
748*4882a593Smuzhiyun 	while (gpe_xrupt_info) {
749*4882a593Smuzhiyun 		gpe_block = gpe_xrupt_info->gpe_block_list_head;
750*4882a593Smuzhiyun 		while (gpe_block) {
751*4882a593Smuzhiyun 			status = acpi_get_name(gpe_block->node,
752*4882a593Smuzhiyun 					       ACPI_FULL_PATHNAME_NO_TRAILING,
753*4882a593Smuzhiyun 					       &ret_buf);
754*4882a593Smuzhiyun 			if (ACPI_FAILURE(status)) {
755*4882a593Smuzhiyun 				acpi_os_printf
756*4882a593Smuzhiyun 				    ("Could not convert name to pathname\n");
757*4882a593Smuzhiyun 			}
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 			if (gpe_block->node == acpi_gbl_fadt_gpe_device) {
760*4882a593Smuzhiyun 				gpe_type = "FADT-defined GPE block";
761*4882a593Smuzhiyun 			} else {
762*4882a593Smuzhiyun 				gpe_type = "GPE Block Device";
763*4882a593Smuzhiyun 			}
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun 			acpi_os_printf
766*4882a593Smuzhiyun 			    ("\nBlock %u - Info %p  DeviceNode %p [%s] - %s\n",
767*4882a593Smuzhiyun 			     block, gpe_block, gpe_block->node, buffer,
768*4882a593Smuzhiyun 			     gpe_type);
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 			acpi_os_printf("    Registers:    %u (%u GPEs)\n",
771*4882a593Smuzhiyun 				       gpe_block->register_count,
772*4882a593Smuzhiyun 				       gpe_block->gpe_count);
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 			acpi_os_printf
775*4882a593Smuzhiyun 			    ("    GPE range:    0x%X to 0x%X on interrupt %u\n",
776*4882a593Smuzhiyun 			     gpe_block->block_base_number,
777*4882a593Smuzhiyun 			     gpe_block->block_base_number +
778*4882a593Smuzhiyun 			     (gpe_block->gpe_count - 1),
779*4882a593Smuzhiyun 			     gpe_xrupt_info->interrupt_number);
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 			acpi_os_printf
782*4882a593Smuzhiyun 			    ("    RegisterInfo: %p  Status %8.8X%8.8X Enable %8.8X%8.8X\n",
783*4882a593Smuzhiyun 			     gpe_block->register_info,
784*4882a593Smuzhiyun 			     ACPI_FORMAT_UINT64(gpe_block->register_info->
785*4882a593Smuzhiyun 						status_address.address),
786*4882a593Smuzhiyun 			     ACPI_FORMAT_UINT64(gpe_block->register_info->
787*4882a593Smuzhiyun 						enable_address.address));
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 			acpi_os_printf("  EventInfo:    %p\n",
790*4882a593Smuzhiyun 				       gpe_block->event_info);
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 			/* Examine each GPE Register within the block */
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 			for (i = 0; i < gpe_block->register_count; i++) {
795*4882a593Smuzhiyun 				gpe_register_info =
796*4882a593Smuzhiyun 				    &gpe_block->register_info[i];
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 				acpi_os_printf("    Reg %u: (GPE %.2X-%.2X)  "
799*4882a593Smuzhiyun 					       "RunEnable %2.2X WakeEnable %2.2X"
800*4882a593Smuzhiyun 					       " Status %8.8X%8.8X Enable %8.8X%8.8X\n",
801*4882a593Smuzhiyun 					       i,
802*4882a593Smuzhiyun 					       gpe_register_info->
803*4882a593Smuzhiyun 					       base_gpe_number,
804*4882a593Smuzhiyun 					       gpe_register_info->
805*4882a593Smuzhiyun 					       base_gpe_number +
806*4882a593Smuzhiyun 					       (ACPI_GPE_REGISTER_WIDTH - 1),
807*4882a593Smuzhiyun 					       gpe_register_info->
808*4882a593Smuzhiyun 					       enable_for_run,
809*4882a593Smuzhiyun 					       gpe_register_info->
810*4882a593Smuzhiyun 					       enable_for_wake,
811*4882a593Smuzhiyun 					       ACPI_FORMAT_UINT64
812*4882a593Smuzhiyun 					       (gpe_register_info->
813*4882a593Smuzhiyun 						status_address.address),
814*4882a593Smuzhiyun 					       ACPI_FORMAT_UINT64
815*4882a593Smuzhiyun 					       (gpe_register_info->
816*4882a593Smuzhiyun 						enable_address.address));
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 				/* Now look at the individual GPEs in this byte register */
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 				for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
821*4882a593Smuzhiyun 					gpe_index =
822*4882a593Smuzhiyun 					    (i * ACPI_GPE_REGISTER_WIDTH) + j;
823*4882a593Smuzhiyun 					gpe_event_info =
824*4882a593Smuzhiyun 					    &gpe_block->event_info[gpe_index];
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 					if (ACPI_GPE_DISPATCH_TYPE
827*4882a593Smuzhiyun 					    (gpe_event_info->flags) ==
828*4882a593Smuzhiyun 					    ACPI_GPE_DISPATCH_NONE) {
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun 						/* This GPE is not used (no method or handler), ignore it */
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 						continue;
833*4882a593Smuzhiyun 					}
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 					acpi_os_printf
836*4882a593Smuzhiyun 					    ("        GPE %.2X: %p  RunRefs %2.2X Flags %2.2X (",
837*4882a593Smuzhiyun 					     gpe_block->block_base_number +
838*4882a593Smuzhiyun 					     gpe_index, gpe_event_info,
839*4882a593Smuzhiyun 					     gpe_event_info->runtime_count,
840*4882a593Smuzhiyun 					     gpe_event_info->flags);
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 					/* Decode the flags byte */
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 					if (gpe_event_info->
845*4882a593Smuzhiyun 					    flags & ACPI_GPE_LEVEL_TRIGGERED) {
846*4882a593Smuzhiyun 						acpi_os_printf("Level, ");
847*4882a593Smuzhiyun 					} else {
848*4882a593Smuzhiyun 						acpi_os_printf("Edge, ");
849*4882a593Smuzhiyun 					}
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 					if (gpe_event_info->
852*4882a593Smuzhiyun 					    flags & ACPI_GPE_CAN_WAKE) {
853*4882a593Smuzhiyun 						acpi_os_printf("CanWake, ");
854*4882a593Smuzhiyun 					} else {
855*4882a593Smuzhiyun 						acpi_os_printf("RunOnly, ");
856*4882a593Smuzhiyun 					}
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun 					switch (ACPI_GPE_DISPATCH_TYPE
859*4882a593Smuzhiyun 						(gpe_event_info->flags)) {
860*4882a593Smuzhiyun 					case ACPI_GPE_DISPATCH_NONE:
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun 						acpi_os_printf("NotUsed");
863*4882a593Smuzhiyun 						break;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 					case ACPI_GPE_DISPATCH_METHOD:
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 						acpi_os_printf("Method");
868*4882a593Smuzhiyun 						break;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 					case ACPI_GPE_DISPATCH_HANDLER:
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun 						acpi_os_printf("Handler");
873*4882a593Smuzhiyun 						break;
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun 					case ACPI_GPE_DISPATCH_NOTIFY:
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 						count = 0;
878*4882a593Smuzhiyun 						notify =
879*4882a593Smuzhiyun 						    gpe_event_info->dispatch.
880*4882a593Smuzhiyun 						    notify_list;
881*4882a593Smuzhiyun 						while (notify) {
882*4882a593Smuzhiyun 							count++;
883*4882a593Smuzhiyun 							notify = notify->next;
884*4882a593Smuzhiyun 						}
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun 						acpi_os_printf
887*4882a593Smuzhiyun 						    ("Implicit Notify on %u devices",
888*4882a593Smuzhiyun 						     count);
889*4882a593Smuzhiyun 						break;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 					case ACPI_GPE_DISPATCH_RAW_HANDLER:
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun 						acpi_os_printf("RawHandler");
894*4882a593Smuzhiyun 						break;
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 					default:
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 						acpi_os_printf("UNKNOWN: %X",
899*4882a593Smuzhiyun 							       ACPI_GPE_DISPATCH_TYPE
900*4882a593Smuzhiyun 							       (gpe_event_info->
901*4882a593Smuzhiyun 								flags));
902*4882a593Smuzhiyun 						break;
903*4882a593Smuzhiyun 					}
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 					acpi_os_printf(")\n");
906*4882a593Smuzhiyun 				}
907*4882a593Smuzhiyun 			}
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun 			block++;
910*4882a593Smuzhiyun 			gpe_block = gpe_block->next;
911*4882a593Smuzhiyun 		}
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 		gpe_xrupt_info = gpe_xrupt_info->next;
914*4882a593Smuzhiyun 	}
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun #endif				/* !ACPI_REDUCED_HARDWARE */
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun /*******************************************************************************
919*4882a593Smuzhiyun  *
920*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_handlers
921*4882a593Smuzhiyun  *
922*4882a593Smuzhiyun  * PARAMETERS:  None
923*4882a593Smuzhiyun  *
924*4882a593Smuzhiyun  * RETURN:      None
925*4882a593Smuzhiyun  *
926*4882a593Smuzhiyun  * DESCRIPTION: Display the currently installed global handlers
927*4882a593Smuzhiyun  *
928*4882a593Smuzhiyun  ******************************************************************************/
929*4882a593Smuzhiyun 
acpi_db_display_handlers(void)930*4882a593Smuzhiyun void acpi_db_display_handlers(void)
931*4882a593Smuzhiyun {
932*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
933*4882a593Smuzhiyun 	union acpi_operand_object *handler_obj;
934*4882a593Smuzhiyun 	acpi_adr_space_type space_id;
935*4882a593Smuzhiyun 	u32 i;
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 	/* Operation region handlers */
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun 	acpi_os_printf("\nOperation Region Handlers at the namespace root:\n");
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun 	obj_desc = acpi_ns_get_attached_object(acpi_gbl_root_node);
942*4882a593Smuzhiyun 	if (obj_desc) {
943*4882a593Smuzhiyun 		for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_space_id_list); i++) {
944*4882a593Smuzhiyun 			space_id = acpi_gbl_space_id_list[i];
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 			acpi_os_printf(ACPI_PREDEFINED_PREFIX,
947*4882a593Smuzhiyun 				       acpi_ut_get_region_name((u8)space_id),
948*4882a593Smuzhiyun 				       space_id);
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 			handler_obj =
951*4882a593Smuzhiyun 			    acpi_ev_find_region_handler(space_id,
952*4882a593Smuzhiyun 							obj_desc->common_notify.
953*4882a593Smuzhiyun 							handler);
954*4882a593Smuzhiyun 			if (handler_obj) {
955*4882a593Smuzhiyun 				acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,
956*4882a593Smuzhiyun 					       (handler_obj->address_space.
957*4882a593Smuzhiyun 						handler_flags &
958*4882a593Smuzhiyun 						ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
959*4882a593Smuzhiyun 					       ? "Default" : "User",
960*4882a593Smuzhiyun 					       handler_obj->address_space.
961*4882a593Smuzhiyun 					       handler);
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 				goto found_handler;
964*4882a593Smuzhiyun 			}
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 			/* There is no handler for this space_id */
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 			acpi_os_printf("None\n");
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun found_handler:		;
971*4882a593Smuzhiyun 		}
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun 		/* Find all handlers for user-defined space_IDs */
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun 		handler_obj = obj_desc->common_notify.handler;
976*4882a593Smuzhiyun 		while (handler_obj) {
977*4882a593Smuzhiyun 			if (handler_obj->address_space.space_id >=
978*4882a593Smuzhiyun 			    ACPI_USER_REGION_BEGIN) {
979*4882a593Smuzhiyun 				acpi_os_printf(ACPI_PREDEFINED_PREFIX,
980*4882a593Smuzhiyun 					       "User-defined ID",
981*4882a593Smuzhiyun 					       handler_obj->address_space.
982*4882a593Smuzhiyun 					       space_id);
983*4882a593Smuzhiyun 				acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,
984*4882a593Smuzhiyun 					       (handler_obj->address_space.
985*4882a593Smuzhiyun 						handler_flags &
986*4882a593Smuzhiyun 						ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
987*4882a593Smuzhiyun 					       ? "Default" : "User",
988*4882a593Smuzhiyun 					       handler_obj->address_space.
989*4882a593Smuzhiyun 					       handler);
990*4882a593Smuzhiyun 			}
991*4882a593Smuzhiyun 
992*4882a593Smuzhiyun 			handler_obj = handler_obj->address_space.next;
993*4882a593Smuzhiyun 		}
994*4882a593Smuzhiyun 	}
995*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE)
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun 	/* Fixed event handlers */
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 	acpi_os_printf("\nFixed Event Handlers:\n");
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun 	for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
1002*4882a593Smuzhiyun 		acpi_os_printf(ACPI_PREDEFINED_PREFIX,
1003*4882a593Smuzhiyun 			       acpi_ut_get_event_name(i), i);
1004*4882a593Smuzhiyun 		if (acpi_gbl_fixed_event_handlers[i].handler) {
1005*4882a593Smuzhiyun 			acpi_os_printf(ACPI_HANDLER_PRESENT_STRING, "User",
1006*4882a593Smuzhiyun 				       acpi_gbl_fixed_event_handlers[i].
1007*4882a593Smuzhiyun 				       handler);
1008*4882a593Smuzhiyun 		} else {
1009*4882a593Smuzhiyun 			acpi_os_printf(ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1010*4882a593Smuzhiyun 		}
1011*4882a593Smuzhiyun 	}
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun #endif				/* !ACPI_REDUCED_HARDWARE */
1014*4882a593Smuzhiyun 
1015*4882a593Smuzhiyun 	/* Miscellaneous global handlers */
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun 	acpi_os_printf("\nMiscellaneous Global Handlers:\n");
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_handler_list); i++) {
1020*4882a593Smuzhiyun 		acpi_os_printf(ACPI_HANDLER_NAME_STRING,
1021*4882a593Smuzhiyun 			       acpi_gbl_handler_list[i].name);
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun 		if (acpi_gbl_handler_list[i].handler) {
1024*4882a593Smuzhiyun 			acpi_os_printf(ACPI_HANDLER_PRESENT_STRING, "User",
1025*4882a593Smuzhiyun 				       acpi_gbl_handler_list[i].handler);
1026*4882a593Smuzhiyun 		} else {
1027*4882a593Smuzhiyun 			acpi_os_printf(ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1028*4882a593Smuzhiyun 		}
1029*4882a593Smuzhiyun 	}
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun 	/* Other handlers that are installed throughout the namespace */
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun 	acpi_os_printf("\nOperation Region Handlers for specific devices:\n");
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1036*4882a593Smuzhiyun 				  ACPI_UINT32_MAX,
1037*4882a593Smuzhiyun 				  acpi_db_display_non_root_handlers, NULL, NULL,
1038*4882a593Smuzhiyun 				  NULL);
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun /*******************************************************************************
1042*4882a593Smuzhiyun  *
1043*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_non_root_handlers
1044*4882a593Smuzhiyun  *
1045*4882a593Smuzhiyun  * PARAMETERS:  acpi_walk_callback
1046*4882a593Smuzhiyun  *
1047*4882a593Smuzhiyun  * RETURN:      Status
1048*4882a593Smuzhiyun  *
1049*4882a593Smuzhiyun  * DESCRIPTION: Display information about all handlers installed for a
1050*4882a593Smuzhiyun  *              device object.
1051*4882a593Smuzhiyun  *
1052*4882a593Smuzhiyun  ******************************************************************************/
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun static acpi_status
acpi_db_display_non_root_handlers(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)1055*4882a593Smuzhiyun acpi_db_display_non_root_handlers(acpi_handle obj_handle,
1056*4882a593Smuzhiyun 				  u32 nesting_level,
1057*4882a593Smuzhiyun 				  void *context, void **return_value)
1058*4882a593Smuzhiyun {
1059*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
1060*4882a593Smuzhiyun 	    ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);
1061*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
1062*4882a593Smuzhiyun 	union acpi_operand_object *handler_obj;
1063*4882a593Smuzhiyun 	char *pathname;
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun 	obj_desc = acpi_ns_get_attached_object(node);
1066*4882a593Smuzhiyun 	if (!obj_desc) {
1067*4882a593Smuzhiyun 		return (AE_OK);
1068*4882a593Smuzhiyun 	}
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun 	pathname = acpi_ns_get_normalized_pathname(node, TRUE);
1071*4882a593Smuzhiyun 	if (!pathname) {
1072*4882a593Smuzhiyun 		return (AE_OK);
1073*4882a593Smuzhiyun 	}
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun 	/* Display all handlers associated with this device */
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	handler_obj = obj_desc->common_notify.handler;
1078*4882a593Smuzhiyun 	while (handler_obj) {
1079*4882a593Smuzhiyun 		acpi_os_printf(ACPI_PREDEFINED_PREFIX,
1080*4882a593Smuzhiyun 			       acpi_ut_get_region_name((u8)handler_obj->
1081*4882a593Smuzhiyun 						       address_space.space_id),
1082*4882a593Smuzhiyun 			       handler_obj->address_space.space_id);
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun 		acpi_os_printf(ACPI_HANDLER_PRESENT_STRING2,
1085*4882a593Smuzhiyun 			       (handler_obj->address_space.handler_flags &
1086*4882a593Smuzhiyun 				ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default"
1087*4882a593Smuzhiyun 			       : "User", handler_obj->address_space.handler);
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 		acpi_os_printf(" Device Name: %s (%p)\n", pathname, node);
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 		handler_obj = handler_obj->address_space.next;
1092*4882a593Smuzhiyun 	}
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun 	ACPI_FREE(pathname);
1095*4882a593Smuzhiyun 	return (AE_OK);
1096*4882a593Smuzhiyun }
1097