xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/dbcmds.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: dbcmds - Miscellaneous debug commands and output routines
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  ******************************************************************************/
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun #include "acevents.h"
11*4882a593Smuzhiyun #include "acdebug.h"
12*4882a593Smuzhiyun #include "acnamesp.h"
13*4882a593Smuzhiyun #include "acresrc.h"
14*4882a593Smuzhiyun #include "actables.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define _COMPONENT          ACPI_CA_DEBUGGER
17*4882a593Smuzhiyun ACPI_MODULE_NAME("dbcmds")
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* Local prototypes */
20*4882a593Smuzhiyun static void
21*4882a593Smuzhiyun acpi_dm_compare_aml_resources(u8 *aml1_buffer,
22*4882a593Smuzhiyun 			      acpi_rsdesc_size aml1_buffer_length,
23*4882a593Smuzhiyun 			      u8 *aml2_buffer,
24*4882a593Smuzhiyun 			      acpi_rsdesc_size aml2_buffer_length);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static acpi_status
27*4882a593Smuzhiyun acpi_dm_test_resource_conversion(struct acpi_namespace_node *node, char *name);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun static acpi_status
30*4882a593Smuzhiyun acpi_db_resource_callback(struct acpi_resource *resource, void *context);
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun static acpi_status
33*4882a593Smuzhiyun acpi_db_device_resources(acpi_handle obj_handle,
34*4882a593Smuzhiyun 			 u32 nesting_level, void *context, void **return_value);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun static void acpi_db_do_one_sleep_state(u8 sleep_state);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun static char *acpi_db_trace_method_name = NULL;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*******************************************************************************
41*4882a593Smuzhiyun  *
42*4882a593Smuzhiyun  * FUNCTION:    acpi_db_convert_to_node
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  * PARAMETERS:  in_string           - String to convert
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  * RETURN:      Pointer to a NS node
47*4882a593Smuzhiyun  *
48*4882a593Smuzhiyun  * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
49*4882a593Smuzhiyun  *              alphanumeric strings.
50*4882a593Smuzhiyun  *
51*4882a593Smuzhiyun  ******************************************************************************/
52*4882a593Smuzhiyun 
acpi_db_convert_to_node(char * in_string)53*4882a593Smuzhiyun struct acpi_namespace_node *acpi_db_convert_to_node(char *in_string)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
56*4882a593Smuzhiyun 	acpi_size address;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	if ((*in_string >= 0x30) && (*in_string <= 0x39)) {
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 		/* Numeric argument, convert */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 		address = strtoul(in_string, NULL, 16);
63*4882a593Smuzhiyun 		node = ACPI_TO_POINTER(address);
64*4882a593Smuzhiyun 		if (!acpi_os_readable(node, sizeof(struct acpi_namespace_node))) {
65*4882a593Smuzhiyun 			acpi_os_printf("Address %p is invalid", node);
66*4882a593Smuzhiyun 			return (NULL);
67*4882a593Smuzhiyun 		}
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 		/* Make sure pointer is valid NS node */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
72*4882a593Smuzhiyun 			acpi_os_printf
73*4882a593Smuzhiyun 			    ("Address %p is not a valid namespace node [%s]\n",
74*4882a593Smuzhiyun 			     node, acpi_ut_get_descriptor_name(node));
75*4882a593Smuzhiyun 			return (NULL);
76*4882a593Smuzhiyun 		}
77*4882a593Smuzhiyun 	} else {
78*4882a593Smuzhiyun 		/*
79*4882a593Smuzhiyun 		 * Alpha argument: The parameter is a name string that must be
80*4882a593Smuzhiyun 		 * resolved to a Namespace object.
81*4882a593Smuzhiyun 		 */
82*4882a593Smuzhiyun 		node = acpi_db_local_ns_lookup(in_string);
83*4882a593Smuzhiyun 		if (!node) {
84*4882a593Smuzhiyun 			acpi_os_printf
85*4882a593Smuzhiyun 			    ("Could not find [%s] in namespace, defaulting to root node\n",
86*4882a593Smuzhiyun 			     in_string);
87*4882a593Smuzhiyun 			node = acpi_gbl_root_node;
88*4882a593Smuzhiyun 		}
89*4882a593Smuzhiyun 	}
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	return (node);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun /*******************************************************************************
95*4882a593Smuzhiyun  *
96*4882a593Smuzhiyun  * FUNCTION:    acpi_db_sleep
97*4882a593Smuzhiyun  *
98*4882a593Smuzhiyun  * PARAMETERS:  object_arg          - Desired sleep state (0-5). NULL means
99*4882a593Smuzhiyun  *                                    invoke all possible sleep states.
100*4882a593Smuzhiyun  *
101*4882a593Smuzhiyun  * RETURN:      Status
102*4882a593Smuzhiyun  *
103*4882a593Smuzhiyun  * DESCRIPTION: Simulate sleep/wake sequences
104*4882a593Smuzhiyun  *
105*4882a593Smuzhiyun  ******************************************************************************/
106*4882a593Smuzhiyun 
acpi_db_sleep(char * object_arg)107*4882a593Smuzhiyun acpi_status acpi_db_sleep(char *object_arg)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	u8 sleep_state;
110*4882a593Smuzhiyun 	u32 i;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	ACPI_FUNCTION_TRACE(acpi_db_sleep);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	/* Null input (no arguments) means to invoke all sleep states */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	if (!object_arg) {
117*4882a593Smuzhiyun 		acpi_os_printf("Invoking all possible sleep states, 0-%d\n",
118*4882a593Smuzhiyun 			       ACPI_S_STATES_MAX);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 		for (i = 0; i <= ACPI_S_STATES_MAX; i++) {
121*4882a593Smuzhiyun 			acpi_db_do_one_sleep_state((u8)i);
122*4882a593Smuzhiyun 		}
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 		return_ACPI_STATUS(AE_OK);
125*4882a593Smuzhiyun 	}
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	/* Convert argument to binary and invoke the sleep state */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	sleep_state = (u8)strtoul(object_arg, NULL, 0);
130*4882a593Smuzhiyun 	acpi_db_do_one_sleep_state(sleep_state);
131*4882a593Smuzhiyun 	return_ACPI_STATUS(AE_OK);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /*******************************************************************************
135*4882a593Smuzhiyun  *
136*4882a593Smuzhiyun  * FUNCTION:    acpi_db_do_one_sleep_state
137*4882a593Smuzhiyun  *
138*4882a593Smuzhiyun  * PARAMETERS:  sleep_state         - Desired sleep state (0-5)
139*4882a593Smuzhiyun  *
140*4882a593Smuzhiyun  * RETURN:      None
141*4882a593Smuzhiyun  *
142*4882a593Smuzhiyun  * DESCRIPTION: Simulate a sleep/wake sequence
143*4882a593Smuzhiyun  *
144*4882a593Smuzhiyun  ******************************************************************************/
145*4882a593Smuzhiyun 
acpi_db_do_one_sleep_state(u8 sleep_state)146*4882a593Smuzhiyun static void acpi_db_do_one_sleep_state(u8 sleep_state)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	acpi_status status;
149*4882a593Smuzhiyun 	u8 sleep_type_a;
150*4882a593Smuzhiyun 	u8 sleep_type_b;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* Validate parameter */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	if (sleep_state > ACPI_S_STATES_MAX) {
155*4882a593Smuzhiyun 		acpi_os_printf("Sleep state %d out of range (%d max)\n",
156*4882a593Smuzhiyun 			       sleep_state, ACPI_S_STATES_MAX);
157*4882a593Smuzhiyun 		return;
158*4882a593Smuzhiyun 	}
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	acpi_os_printf("\n---- Invoking sleep state S%d (%s):\n",
161*4882a593Smuzhiyun 		       sleep_state, acpi_gbl_sleep_state_names[sleep_state]);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* Get the values for the sleep type registers (for display only) */
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	status =
166*4882a593Smuzhiyun 	    acpi_get_sleep_type_data(sleep_state, &sleep_type_a, &sleep_type_b);
167*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
168*4882a593Smuzhiyun 		acpi_os_printf("Could not evaluate [%s] method, %s\n",
169*4882a593Smuzhiyun 			       acpi_gbl_sleep_state_names[sleep_state],
170*4882a593Smuzhiyun 			       acpi_format_exception(status));
171*4882a593Smuzhiyun 		return;
172*4882a593Smuzhiyun 	}
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	acpi_os_printf
175*4882a593Smuzhiyun 	    ("Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
176*4882a593Smuzhiyun 	     sleep_state, sleep_type_a, sleep_type_b);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	/* Invoke the various sleep/wake interfaces */
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	acpi_os_printf("**** Sleep: Prepare to sleep (S%d) ****\n",
181*4882a593Smuzhiyun 		       sleep_state);
182*4882a593Smuzhiyun 	status = acpi_enter_sleep_state_prep(sleep_state);
183*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
184*4882a593Smuzhiyun 		goto error_exit;
185*4882a593Smuzhiyun 	}
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	acpi_os_printf("**** Sleep: Going to sleep (S%d) ****\n", sleep_state);
188*4882a593Smuzhiyun 	status = acpi_enter_sleep_state(sleep_state);
189*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
190*4882a593Smuzhiyun 		goto error_exit;
191*4882a593Smuzhiyun 	}
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	acpi_os_printf("**** Wake: Prepare to return from sleep (S%d) ****\n",
194*4882a593Smuzhiyun 		       sleep_state);
195*4882a593Smuzhiyun 	status = acpi_leave_sleep_state_prep(sleep_state);
196*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
197*4882a593Smuzhiyun 		goto error_exit;
198*4882a593Smuzhiyun 	}
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	acpi_os_printf("**** Wake: Return from sleep (S%d) ****\n",
201*4882a593Smuzhiyun 		       sleep_state);
202*4882a593Smuzhiyun 	status = acpi_leave_sleep_state(sleep_state);
203*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
204*4882a593Smuzhiyun 		goto error_exit;
205*4882a593Smuzhiyun 	}
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	return;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun error_exit:
210*4882a593Smuzhiyun 	ACPI_EXCEPTION((AE_INFO, status, "During invocation of sleep state S%d",
211*4882a593Smuzhiyun 			sleep_state));
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /*******************************************************************************
215*4882a593Smuzhiyun  *
216*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_locks
217*4882a593Smuzhiyun  *
218*4882a593Smuzhiyun  * PARAMETERS:  None
219*4882a593Smuzhiyun  *
220*4882a593Smuzhiyun  * RETURN:      None
221*4882a593Smuzhiyun  *
222*4882a593Smuzhiyun  * DESCRIPTION: Display information about internal mutexes.
223*4882a593Smuzhiyun  *
224*4882a593Smuzhiyun  ******************************************************************************/
225*4882a593Smuzhiyun 
acpi_db_display_locks(void)226*4882a593Smuzhiyun void acpi_db_display_locks(void)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun 	u32 i;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	for (i = 0; i < ACPI_MAX_MUTEX; i++) {
231*4882a593Smuzhiyun 		acpi_os_printf("%26s : %s\n", acpi_ut_get_mutex_name(i),
232*4882a593Smuzhiyun 			       acpi_gbl_mutex_info[i].thread_id ==
233*4882a593Smuzhiyun 			       ACPI_MUTEX_NOT_ACQUIRED ? "Locked" : "Unlocked");
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /*******************************************************************************
238*4882a593Smuzhiyun  *
239*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_table_info
240*4882a593Smuzhiyun  *
241*4882a593Smuzhiyun  * PARAMETERS:  table_arg           - Name of table to be displayed
242*4882a593Smuzhiyun  *
243*4882a593Smuzhiyun  * RETURN:      None
244*4882a593Smuzhiyun  *
245*4882a593Smuzhiyun  * DESCRIPTION: Display information about loaded tables. Current
246*4882a593Smuzhiyun  *              implementation displays all loaded tables.
247*4882a593Smuzhiyun  *
248*4882a593Smuzhiyun  ******************************************************************************/
249*4882a593Smuzhiyun 
acpi_db_display_table_info(char * table_arg)250*4882a593Smuzhiyun void acpi_db_display_table_info(char *table_arg)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	u32 i;
253*4882a593Smuzhiyun 	struct acpi_table_desc *table_desc;
254*4882a593Smuzhiyun 	acpi_status status;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* Header */
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	acpi_os_printf("Idx ID  Status Type                    "
259*4882a593Smuzhiyun 		       "TableHeader (Sig, Address, Length, Misc)\n");
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	/* Walk the entire root table list */
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
264*4882a593Smuzhiyun 		table_desc = &acpi_gbl_root_table_list.tables[i];
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 		/* Index and Table ID */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 		acpi_os_printf("%3u %.2u ", i, table_desc->owner_id);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 		/* Decode the table flags */
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 		if (!(table_desc->flags & ACPI_TABLE_IS_LOADED)) {
273*4882a593Smuzhiyun 			acpi_os_printf("NotLoaded ");
274*4882a593Smuzhiyun 		} else {
275*4882a593Smuzhiyun 			acpi_os_printf(" Loaded ");
276*4882a593Smuzhiyun 		}
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 		switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
279*4882a593Smuzhiyun 		case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 			acpi_os_printf("External/virtual ");
282*4882a593Smuzhiyun 			break;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 		case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 			acpi_os_printf("Internal/physical ");
287*4882a593Smuzhiyun 			break;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 		case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 			acpi_os_printf("Internal/virtual ");
292*4882a593Smuzhiyun 			break;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 		default:
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 			acpi_os_printf("INVALID TYPE    ");
297*4882a593Smuzhiyun 			break;
298*4882a593Smuzhiyun 		}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 		/* Make sure that the table is mapped */
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 		status = acpi_tb_validate_table(table_desc);
303*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
304*4882a593Smuzhiyun 			return;
305*4882a593Smuzhiyun 		}
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 		/* Dump the table header */
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 		if (table_desc->pointer) {
310*4882a593Smuzhiyun 			acpi_tb_print_table_header(table_desc->address,
311*4882a593Smuzhiyun 						   table_desc->pointer);
312*4882a593Smuzhiyun 		} else {
313*4882a593Smuzhiyun 			/* If the pointer is null, the table has been unloaded */
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 			ACPI_INFO(("%4.4s - Table has been unloaded",
316*4882a593Smuzhiyun 				   table_desc->signature.ascii));
317*4882a593Smuzhiyun 		}
318*4882a593Smuzhiyun 	}
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun /*******************************************************************************
322*4882a593Smuzhiyun  *
323*4882a593Smuzhiyun  * FUNCTION:    acpi_db_unload_acpi_table
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  * PARAMETERS:  object_name         - Namespace pathname for an object that
326*4882a593Smuzhiyun  *                                    is owned by the table to be unloaded
327*4882a593Smuzhiyun  *
328*4882a593Smuzhiyun  * RETURN:      None
329*4882a593Smuzhiyun  *
330*4882a593Smuzhiyun  * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
331*4882a593Smuzhiyun  *              by the table.
332*4882a593Smuzhiyun  *
333*4882a593Smuzhiyun  ******************************************************************************/
334*4882a593Smuzhiyun 
acpi_db_unload_acpi_table(char * object_name)335*4882a593Smuzhiyun void acpi_db_unload_acpi_table(char *object_name)
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
338*4882a593Smuzhiyun 	acpi_status status;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	/* Translate name to an Named object */
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	node = acpi_db_convert_to_node(object_name);
343*4882a593Smuzhiyun 	if (!node) {
344*4882a593Smuzhiyun 		return;
345*4882a593Smuzhiyun 	}
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	status = acpi_unload_parent_table(ACPI_CAST_PTR(acpi_handle, node));
348*4882a593Smuzhiyun 	if (ACPI_SUCCESS(status)) {
349*4882a593Smuzhiyun 		acpi_os_printf("Parent of [%s] (%p) unloaded and uninstalled\n",
350*4882a593Smuzhiyun 			       object_name, node);
351*4882a593Smuzhiyun 	} else {
352*4882a593Smuzhiyun 		acpi_os_printf("%s, while unloading parent table of [%s]\n",
353*4882a593Smuzhiyun 			       acpi_format_exception(status), object_name);
354*4882a593Smuzhiyun 	}
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /*******************************************************************************
358*4882a593Smuzhiyun  *
359*4882a593Smuzhiyun  * FUNCTION:    acpi_db_send_notify
360*4882a593Smuzhiyun  *
361*4882a593Smuzhiyun  * PARAMETERS:  name                - Name of ACPI object where to send notify
362*4882a593Smuzhiyun  *              value               - Value of the notify to send.
363*4882a593Smuzhiyun  *
364*4882a593Smuzhiyun  * RETURN:      None
365*4882a593Smuzhiyun  *
366*4882a593Smuzhiyun  * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
367*4882a593Smuzhiyun  *              named object as an ACPI notify.
368*4882a593Smuzhiyun  *
369*4882a593Smuzhiyun  ******************************************************************************/
370*4882a593Smuzhiyun 
acpi_db_send_notify(char * name,u32 value)371*4882a593Smuzhiyun void acpi_db_send_notify(char *name, u32 value)
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
374*4882a593Smuzhiyun 	acpi_status status;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	/* Translate name to an Named object */
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	node = acpi_db_convert_to_node(name);
379*4882a593Smuzhiyun 	if (!node) {
380*4882a593Smuzhiyun 		return;
381*4882a593Smuzhiyun 	}
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	/* Dispatch the notify if legal */
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	if (acpi_ev_is_notify_object(node)) {
386*4882a593Smuzhiyun 		status = acpi_ev_queue_notify_request(node, value);
387*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
388*4882a593Smuzhiyun 			acpi_os_printf("Could not queue notify\n");
389*4882a593Smuzhiyun 		}
390*4882a593Smuzhiyun 	} else {
391*4882a593Smuzhiyun 		acpi_os_printf("Named object [%4.4s] Type %s, "
392*4882a593Smuzhiyun 			       "must be Device/Thermal/Processor type\n",
393*4882a593Smuzhiyun 			       acpi_ut_get_node_name(node),
394*4882a593Smuzhiyun 			       acpi_ut_get_type_name(node->type));
395*4882a593Smuzhiyun 	}
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun /*******************************************************************************
399*4882a593Smuzhiyun  *
400*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_interfaces
401*4882a593Smuzhiyun  *
402*4882a593Smuzhiyun  * PARAMETERS:  action_arg          - Null, "install", or "remove"
403*4882a593Smuzhiyun  *              interface_name_arg  - Name for install/remove options
404*4882a593Smuzhiyun  *
405*4882a593Smuzhiyun  * RETURN:      None
406*4882a593Smuzhiyun  *
407*4882a593Smuzhiyun  * DESCRIPTION: Display or modify the global _OSI interface list
408*4882a593Smuzhiyun  *
409*4882a593Smuzhiyun  ******************************************************************************/
410*4882a593Smuzhiyun 
acpi_db_display_interfaces(char * action_arg,char * interface_name_arg)411*4882a593Smuzhiyun void acpi_db_display_interfaces(char *action_arg, char *interface_name_arg)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun 	struct acpi_interface_info *next_interface;
414*4882a593Smuzhiyun 	char *sub_string;
415*4882a593Smuzhiyun 	acpi_status status;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	/* If no arguments, just display current interface list */
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	if (!action_arg) {
420*4882a593Smuzhiyun 		(void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex,
421*4882a593Smuzhiyun 					    ACPI_WAIT_FOREVER);
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 		next_interface = acpi_gbl_supported_interfaces;
424*4882a593Smuzhiyun 		while (next_interface) {
425*4882a593Smuzhiyun 			if (!(next_interface->flags & ACPI_OSI_INVALID)) {
426*4882a593Smuzhiyun 				acpi_os_printf("%s\n", next_interface->name);
427*4882a593Smuzhiyun 			}
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 			next_interface = next_interface->next;
430*4882a593Smuzhiyun 		}
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 		acpi_os_release_mutex(acpi_gbl_osi_mutex);
433*4882a593Smuzhiyun 		return;
434*4882a593Smuzhiyun 	}
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	/* If action_arg exists, so must interface_name_arg */
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	if (!interface_name_arg) {
439*4882a593Smuzhiyun 		acpi_os_printf("Missing Interface Name argument\n");
440*4882a593Smuzhiyun 		return;
441*4882a593Smuzhiyun 	}
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	/* Uppercase the action for match below */
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	acpi_ut_strupr(action_arg);
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	/* install - install an interface */
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun 	sub_string = strstr("INSTALL", action_arg);
450*4882a593Smuzhiyun 	if (sub_string) {
451*4882a593Smuzhiyun 		status = acpi_install_interface(interface_name_arg);
452*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
453*4882a593Smuzhiyun 			acpi_os_printf("%s, while installing \"%s\"\n",
454*4882a593Smuzhiyun 				       acpi_format_exception(status),
455*4882a593Smuzhiyun 				       interface_name_arg);
456*4882a593Smuzhiyun 		}
457*4882a593Smuzhiyun 		return;
458*4882a593Smuzhiyun 	}
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	/* remove - remove an interface */
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	sub_string = strstr("REMOVE", action_arg);
463*4882a593Smuzhiyun 	if (sub_string) {
464*4882a593Smuzhiyun 		status = acpi_remove_interface(interface_name_arg);
465*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
466*4882a593Smuzhiyun 			acpi_os_printf("%s, while removing \"%s\"\n",
467*4882a593Smuzhiyun 				       acpi_format_exception(status),
468*4882a593Smuzhiyun 				       interface_name_arg);
469*4882a593Smuzhiyun 		}
470*4882a593Smuzhiyun 		return;
471*4882a593Smuzhiyun 	}
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 	/* Invalid action_arg */
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 	acpi_os_printf("Invalid action argument: %s\n", action_arg);
476*4882a593Smuzhiyun 	return;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun /*******************************************************************************
480*4882a593Smuzhiyun  *
481*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_template
482*4882a593Smuzhiyun  *
483*4882a593Smuzhiyun  * PARAMETERS:  buffer_arg          - Buffer name or address
484*4882a593Smuzhiyun  *
485*4882a593Smuzhiyun  * RETURN:      None
486*4882a593Smuzhiyun  *
487*4882a593Smuzhiyun  * DESCRIPTION: Dump a buffer that contains a resource template
488*4882a593Smuzhiyun  *
489*4882a593Smuzhiyun  ******************************************************************************/
490*4882a593Smuzhiyun 
acpi_db_display_template(char * buffer_arg)491*4882a593Smuzhiyun void acpi_db_display_template(char *buffer_arg)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
494*4882a593Smuzhiyun 	acpi_status status;
495*4882a593Smuzhiyun 	struct acpi_buffer return_buffer;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	/* Translate buffer_arg to an Named object */
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	node = acpi_db_convert_to_node(buffer_arg);
500*4882a593Smuzhiyun 	if (!node || (node == acpi_gbl_root_node)) {
501*4882a593Smuzhiyun 		acpi_os_printf("Invalid argument: %s\n", buffer_arg);
502*4882a593Smuzhiyun 		return;
503*4882a593Smuzhiyun 	}
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	/* We must have a buffer object */
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	if (node->type != ACPI_TYPE_BUFFER) {
508*4882a593Smuzhiyun 		acpi_os_printf
509*4882a593Smuzhiyun 		    ("Not a Buffer object, cannot be a template: %s\n",
510*4882a593Smuzhiyun 		     buffer_arg);
511*4882a593Smuzhiyun 		return;
512*4882a593Smuzhiyun 	}
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
515*4882a593Smuzhiyun 	return_buffer.pointer = acpi_gbl_db_buffer;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	/* Attempt to convert the raw buffer to a resource list */
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	status = acpi_rs_create_resource_list(node->object, &return_buffer);
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
522*4882a593Smuzhiyun 	acpi_dbg_level |= ACPI_LV_RESOURCES;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
525*4882a593Smuzhiyun 		acpi_os_printf
526*4882a593Smuzhiyun 		    ("Could not convert Buffer to a resource list: %s, %s\n",
527*4882a593Smuzhiyun 		     buffer_arg, acpi_format_exception(status));
528*4882a593Smuzhiyun 		goto dump_buffer;
529*4882a593Smuzhiyun 	}
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	/* Now we can dump the resource list */
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	acpi_rs_dump_resource_list(ACPI_CAST_PTR(struct acpi_resource,
534*4882a593Smuzhiyun 						 return_buffer.pointer));
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun dump_buffer:
537*4882a593Smuzhiyun 	acpi_os_printf("\nRaw data buffer:\n");
538*4882a593Smuzhiyun 	acpi_ut_debug_dump_buffer((u8 *)node->object->buffer.pointer,
539*4882a593Smuzhiyun 				  node->object->buffer.length,
540*4882a593Smuzhiyun 				  DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
543*4882a593Smuzhiyun 	return;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun /*******************************************************************************
547*4882a593Smuzhiyun  *
548*4882a593Smuzhiyun  * FUNCTION:    acpi_dm_compare_aml_resources
549*4882a593Smuzhiyun  *
550*4882a593Smuzhiyun  * PARAMETERS:  aml1_buffer         - Contains first resource list
551*4882a593Smuzhiyun  *              aml1_buffer_length  - Length of first resource list
552*4882a593Smuzhiyun  *              aml2_buffer         - Contains second resource list
553*4882a593Smuzhiyun  *              aml2_buffer_length  - Length of second resource list
554*4882a593Smuzhiyun  *
555*4882a593Smuzhiyun  * RETURN:      None
556*4882a593Smuzhiyun  *
557*4882a593Smuzhiyun  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
558*4882a593Smuzhiyun  *              order to isolate a miscompare to an individual resource)
559*4882a593Smuzhiyun  *
560*4882a593Smuzhiyun  ******************************************************************************/
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun static void
acpi_dm_compare_aml_resources(u8 * aml1_buffer,acpi_rsdesc_size aml1_buffer_length,u8 * aml2_buffer,acpi_rsdesc_size aml2_buffer_length)563*4882a593Smuzhiyun acpi_dm_compare_aml_resources(u8 *aml1_buffer,
564*4882a593Smuzhiyun 			      acpi_rsdesc_size aml1_buffer_length,
565*4882a593Smuzhiyun 			      u8 *aml2_buffer,
566*4882a593Smuzhiyun 			      acpi_rsdesc_size aml2_buffer_length)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun 	u8 *aml1;
569*4882a593Smuzhiyun 	u8 *aml2;
570*4882a593Smuzhiyun 	u8 *aml1_end;
571*4882a593Smuzhiyun 	u8 *aml2_end;
572*4882a593Smuzhiyun 	acpi_rsdesc_size aml1_length;
573*4882a593Smuzhiyun 	acpi_rsdesc_size aml2_length;
574*4882a593Smuzhiyun 	acpi_rsdesc_size offset = 0;
575*4882a593Smuzhiyun 	u8 resource_type;
576*4882a593Smuzhiyun 	u32 count = 0;
577*4882a593Smuzhiyun 	u32 i;
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	/* Compare overall buffer sizes (may be different due to size rounding) */
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	if (aml1_buffer_length != aml2_buffer_length) {
582*4882a593Smuzhiyun 		acpi_os_printf("**** Buffer length mismatch in converted "
583*4882a593Smuzhiyun 			       "AML: Original %X, New %X ****\n",
584*4882a593Smuzhiyun 			       aml1_buffer_length, aml2_buffer_length);
585*4882a593Smuzhiyun 	}
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	aml1 = aml1_buffer;
588*4882a593Smuzhiyun 	aml2 = aml2_buffer;
589*4882a593Smuzhiyun 	aml1_end = aml1_buffer + aml1_buffer_length;
590*4882a593Smuzhiyun 	aml2_end = aml2_buffer + aml2_buffer_length;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	/* Walk the descriptor lists, comparing each descriptor */
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	while ((aml1 < aml1_end) && (aml2 < aml2_end)) {
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 		/* Get the lengths of each descriptor */
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 		aml1_length = acpi_ut_get_descriptor_length(aml1);
599*4882a593Smuzhiyun 		aml2_length = acpi_ut_get_descriptor_length(aml2);
600*4882a593Smuzhiyun 		resource_type = acpi_ut_get_resource_type(aml1);
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 		/* Check for descriptor length match */
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun 		if (aml1_length != aml2_length) {
605*4882a593Smuzhiyun 			acpi_os_printf
606*4882a593Smuzhiyun 			    ("**** Length mismatch in descriptor [%.2X] type %2.2X, "
607*4882a593Smuzhiyun 			     "Offset %8.8X Len1 %X, Len2 %X ****\n", count,
608*4882a593Smuzhiyun 			     resource_type, offset, aml1_length, aml2_length);
609*4882a593Smuzhiyun 		}
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 		/* Check for descriptor byte match */
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 		else if (memcmp(aml1, aml2, aml1_length)) {
614*4882a593Smuzhiyun 			acpi_os_printf
615*4882a593Smuzhiyun 			    ("**** Data mismatch in descriptor [%.2X] type %2.2X, "
616*4882a593Smuzhiyun 			     "Offset %8.8X ****\n", count, resource_type,
617*4882a593Smuzhiyun 			     offset);
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 			for (i = 0; i < aml1_length; i++) {
620*4882a593Smuzhiyun 				if (aml1[i] != aml2[i]) {
621*4882a593Smuzhiyun 					acpi_os_printf
622*4882a593Smuzhiyun 					    ("Mismatch at byte offset %.2X: is %2.2X, "
623*4882a593Smuzhiyun 					     "should be %2.2X\n", i, aml2[i],
624*4882a593Smuzhiyun 					     aml1[i]);
625*4882a593Smuzhiyun 				}
626*4882a593Smuzhiyun 			}
627*4882a593Smuzhiyun 		}
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 		/* Exit on end_tag descriptor */
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 		if (resource_type == ACPI_RESOURCE_NAME_END_TAG) {
632*4882a593Smuzhiyun 			return;
633*4882a593Smuzhiyun 		}
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun 		/* Point to next descriptor in each buffer */
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 		count++;
638*4882a593Smuzhiyun 		offset += aml1_length;
639*4882a593Smuzhiyun 		aml1 += aml1_length;
640*4882a593Smuzhiyun 		aml2 += aml2_length;
641*4882a593Smuzhiyun 	}
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun /*******************************************************************************
645*4882a593Smuzhiyun  *
646*4882a593Smuzhiyun  * FUNCTION:    acpi_dm_test_resource_conversion
647*4882a593Smuzhiyun  *
648*4882a593Smuzhiyun  * PARAMETERS:  node                - Parent device node
649*4882a593Smuzhiyun  *              name                - resource method name (_CRS)
650*4882a593Smuzhiyun  *
651*4882a593Smuzhiyun  * RETURN:      Status
652*4882a593Smuzhiyun  *
653*4882a593Smuzhiyun  * DESCRIPTION: Compare the original AML with a conversion of the AML to
654*4882a593Smuzhiyun  *              internal resource list, then back to AML.
655*4882a593Smuzhiyun  *
656*4882a593Smuzhiyun  ******************************************************************************/
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun static acpi_status
acpi_dm_test_resource_conversion(struct acpi_namespace_node * node,char * name)659*4882a593Smuzhiyun acpi_dm_test_resource_conversion(struct acpi_namespace_node *node, char *name)
660*4882a593Smuzhiyun {
661*4882a593Smuzhiyun 	acpi_status status;
662*4882a593Smuzhiyun 	struct acpi_buffer return_buffer;
663*4882a593Smuzhiyun 	struct acpi_buffer resource_buffer;
664*4882a593Smuzhiyun 	struct acpi_buffer new_aml;
665*4882a593Smuzhiyun 	union acpi_object *original_aml;
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	acpi_os_printf("Resource Conversion Comparison:\n");
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	new_aml.length = ACPI_ALLOCATE_LOCAL_BUFFER;
670*4882a593Smuzhiyun 	return_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
671*4882a593Smuzhiyun 	resource_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	/* Get the original _CRS AML resource template */
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun 	status = acpi_evaluate_object(node, name, NULL, &return_buffer);
676*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
677*4882a593Smuzhiyun 		acpi_os_printf("Could not obtain %s: %s\n",
678*4882a593Smuzhiyun 			       name, acpi_format_exception(status));
679*4882a593Smuzhiyun 		return (status);
680*4882a593Smuzhiyun 	}
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	/* Get the AML resource template, converted to internal resource structs */
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	status = acpi_get_current_resources(node, &resource_buffer);
685*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
686*4882a593Smuzhiyun 		acpi_os_printf("AcpiGetCurrentResources failed: %s\n",
687*4882a593Smuzhiyun 			       acpi_format_exception(status));
688*4882a593Smuzhiyun 		goto exit1;
689*4882a593Smuzhiyun 	}
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	/* Convert internal resource list to external AML resource template */
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	status = acpi_rs_create_aml_resources(&resource_buffer, &new_aml);
694*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
695*4882a593Smuzhiyun 		acpi_os_printf("AcpiRsCreateAmlResources failed: %s\n",
696*4882a593Smuzhiyun 			       acpi_format_exception(status));
697*4882a593Smuzhiyun 		goto exit2;
698*4882a593Smuzhiyun 	}
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	/* Compare original AML to the newly created AML resource list */
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	original_aml = return_buffer.pointer;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	acpi_dm_compare_aml_resources(original_aml->buffer.pointer,
705*4882a593Smuzhiyun 				      (acpi_rsdesc_size)original_aml->buffer.
706*4882a593Smuzhiyun 				      length, new_aml.pointer,
707*4882a593Smuzhiyun 				      (acpi_rsdesc_size)new_aml.length);
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	/* Cleanup and exit */
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	ACPI_FREE(new_aml.pointer);
712*4882a593Smuzhiyun exit2:
713*4882a593Smuzhiyun 	ACPI_FREE(resource_buffer.pointer);
714*4882a593Smuzhiyun exit1:
715*4882a593Smuzhiyun 	ACPI_FREE(return_buffer.pointer);
716*4882a593Smuzhiyun 	return (status);
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun /*******************************************************************************
720*4882a593Smuzhiyun  *
721*4882a593Smuzhiyun  * FUNCTION:    acpi_db_resource_callback
722*4882a593Smuzhiyun  *
723*4882a593Smuzhiyun  * PARAMETERS:  acpi_walk_resource_callback
724*4882a593Smuzhiyun  *
725*4882a593Smuzhiyun  * RETURN:      Status
726*4882a593Smuzhiyun  *
727*4882a593Smuzhiyun  * DESCRIPTION: Simple callback to exercise acpi_walk_resources and
728*4882a593Smuzhiyun  *              acpi_walk_resource_buffer.
729*4882a593Smuzhiyun  *
730*4882a593Smuzhiyun  ******************************************************************************/
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun static acpi_status
acpi_db_resource_callback(struct acpi_resource * resource,void * context)733*4882a593Smuzhiyun acpi_db_resource_callback(struct acpi_resource *resource, void *context)
734*4882a593Smuzhiyun {
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	return (AE_OK);
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun /*******************************************************************************
740*4882a593Smuzhiyun  *
741*4882a593Smuzhiyun  * FUNCTION:    acpi_db_device_resources
742*4882a593Smuzhiyun  *
743*4882a593Smuzhiyun  * PARAMETERS:  acpi_walk_callback
744*4882a593Smuzhiyun  *
745*4882a593Smuzhiyun  * RETURN:      Status
746*4882a593Smuzhiyun  *
747*4882a593Smuzhiyun  * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
748*4882a593Smuzhiyun  *
749*4882a593Smuzhiyun  ******************************************************************************/
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun static acpi_status
acpi_db_device_resources(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)752*4882a593Smuzhiyun acpi_db_device_resources(acpi_handle obj_handle,
753*4882a593Smuzhiyun 			 u32 nesting_level, void *context, void **return_value)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
756*4882a593Smuzhiyun 	struct acpi_namespace_node *prt_node = NULL;
757*4882a593Smuzhiyun 	struct acpi_namespace_node *crs_node = NULL;
758*4882a593Smuzhiyun 	struct acpi_namespace_node *prs_node = NULL;
759*4882a593Smuzhiyun 	struct acpi_namespace_node *aei_node = NULL;
760*4882a593Smuzhiyun 	char *parent_path;
761*4882a593Smuzhiyun 	struct acpi_buffer return_buffer;
762*4882a593Smuzhiyun 	acpi_status status;
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);
765*4882a593Smuzhiyun 	parent_path = acpi_ns_get_normalized_pathname(node, TRUE);
766*4882a593Smuzhiyun 	if (!parent_path) {
767*4882a593Smuzhiyun 		return (AE_NO_MEMORY);
768*4882a593Smuzhiyun 	}
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	/* Get handles to the resource methods for this device */
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	(void)acpi_get_handle(node, METHOD_NAME__PRT,
773*4882a593Smuzhiyun 			      ACPI_CAST_PTR(acpi_handle, &prt_node));
774*4882a593Smuzhiyun 	(void)acpi_get_handle(node, METHOD_NAME__CRS,
775*4882a593Smuzhiyun 			      ACPI_CAST_PTR(acpi_handle, &crs_node));
776*4882a593Smuzhiyun 	(void)acpi_get_handle(node, METHOD_NAME__PRS,
777*4882a593Smuzhiyun 			      ACPI_CAST_PTR(acpi_handle, &prs_node));
778*4882a593Smuzhiyun 	(void)acpi_get_handle(node, METHOD_NAME__AEI,
779*4882a593Smuzhiyun 			      ACPI_CAST_PTR(acpi_handle, &aei_node));
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 	if (!prt_node && !crs_node && !prs_node && !aei_node) {
782*4882a593Smuzhiyun 		goto cleanup;	/* Nothing to do */
783*4882a593Smuzhiyun 	}
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	acpi_os_printf("\nDevice: %s\n", parent_path);
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	/* Prepare for a return object of arbitrary size */
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	return_buffer.pointer = acpi_gbl_db_buffer;
790*4882a593Smuzhiyun 	return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	/* _PRT */
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	if (prt_node) {
795*4882a593Smuzhiyun 		acpi_os_printf("Evaluating _PRT\n");
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 		status =
798*4882a593Smuzhiyun 		    acpi_evaluate_object(prt_node, NULL, NULL, &return_buffer);
799*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
800*4882a593Smuzhiyun 			acpi_os_printf("Could not evaluate _PRT: %s\n",
801*4882a593Smuzhiyun 				       acpi_format_exception(status));
802*4882a593Smuzhiyun 			goto get_crs;
803*4882a593Smuzhiyun 		}
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
806*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 		status = acpi_get_irq_routing_table(node, &return_buffer);
809*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
810*4882a593Smuzhiyun 			acpi_os_printf("GetIrqRoutingTable failed: %s\n",
811*4882a593Smuzhiyun 				       acpi_format_exception(status));
812*4882a593Smuzhiyun 			goto get_crs;
813*4882a593Smuzhiyun 		}
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 		acpi_rs_dump_irq_list(ACPI_CAST_PTR(u8, acpi_gbl_db_buffer));
816*4882a593Smuzhiyun 	}
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	/* _CRS */
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun get_crs:
821*4882a593Smuzhiyun 	if (crs_node) {
822*4882a593Smuzhiyun 		acpi_os_printf("Evaluating _CRS\n");
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
825*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun 		status =
828*4882a593Smuzhiyun 		    acpi_evaluate_object(crs_node, NULL, NULL, &return_buffer);
829*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
830*4882a593Smuzhiyun 			acpi_os_printf("Could not evaluate _CRS: %s\n",
831*4882a593Smuzhiyun 				       acpi_format_exception(status));
832*4882a593Smuzhiyun 			goto get_prs;
833*4882a593Smuzhiyun 		}
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 		/* This code exercises the acpi_walk_resources interface */
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 		status = acpi_walk_resources(node, METHOD_NAME__CRS,
838*4882a593Smuzhiyun 					     acpi_db_resource_callback, NULL);
839*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
840*4882a593Smuzhiyun 			acpi_os_printf("AcpiWalkResources failed: %s\n",
841*4882a593Smuzhiyun 				       acpi_format_exception(status));
842*4882a593Smuzhiyun 			goto get_prs;
843*4882a593Smuzhiyun 		}
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun 		/* Get the _CRS resource list (test ALLOCATE buffer) */
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 		return_buffer.pointer = NULL;
848*4882a593Smuzhiyun 		return_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 		status = acpi_get_current_resources(node, &return_buffer);
851*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
852*4882a593Smuzhiyun 			acpi_os_printf("AcpiGetCurrentResources failed: %s\n",
853*4882a593Smuzhiyun 				       acpi_format_exception(status));
854*4882a593Smuzhiyun 			goto get_prs;
855*4882a593Smuzhiyun 		}
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun 		/* This code exercises the acpi_walk_resource_buffer interface */
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 		status = acpi_walk_resource_buffer(&return_buffer,
860*4882a593Smuzhiyun 						   acpi_db_resource_callback,
861*4882a593Smuzhiyun 						   NULL);
862*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
863*4882a593Smuzhiyun 			acpi_os_printf("AcpiWalkResourceBuffer failed: %s\n",
864*4882a593Smuzhiyun 				       acpi_format_exception(status));
865*4882a593Smuzhiyun 			goto end_crs;
866*4882a593Smuzhiyun 		}
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun 		/* Dump the _CRS resource list */
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 		acpi_rs_dump_resource_list(ACPI_CAST_PTR(struct acpi_resource,
871*4882a593Smuzhiyun 							 return_buffer.
872*4882a593Smuzhiyun 							 pointer));
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 		/*
875*4882a593Smuzhiyun 		 * Perform comparison of original AML to newly created AML. This
876*4882a593Smuzhiyun 		 * tests both the AML->Resource conversion and the Resource->AML
877*4882a593Smuzhiyun 		 * conversion.
878*4882a593Smuzhiyun 		 */
879*4882a593Smuzhiyun 		(void)acpi_dm_test_resource_conversion(node, METHOD_NAME__CRS);
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 		/* Execute _SRS with the resource list */
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 		acpi_os_printf("Evaluating _SRS\n");
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 		status = acpi_set_current_resources(node, &return_buffer);
886*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
887*4882a593Smuzhiyun 			acpi_os_printf("AcpiSetCurrentResources failed: %s\n",
888*4882a593Smuzhiyun 				       acpi_format_exception(status));
889*4882a593Smuzhiyun 			goto end_crs;
890*4882a593Smuzhiyun 		}
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun end_crs:
893*4882a593Smuzhiyun 		ACPI_FREE(return_buffer.pointer);
894*4882a593Smuzhiyun 	}
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun 	/* _PRS */
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun get_prs:
899*4882a593Smuzhiyun 	if (prs_node) {
900*4882a593Smuzhiyun 		acpi_os_printf("Evaluating _PRS\n");
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
903*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 		status =
906*4882a593Smuzhiyun 		    acpi_evaluate_object(prs_node, NULL, NULL, &return_buffer);
907*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
908*4882a593Smuzhiyun 			acpi_os_printf("Could not evaluate _PRS: %s\n",
909*4882a593Smuzhiyun 				       acpi_format_exception(status));
910*4882a593Smuzhiyun 			goto get_aei;
911*4882a593Smuzhiyun 		}
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
914*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 		status = acpi_get_possible_resources(node, &return_buffer);
917*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
918*4882a593Smuzhiyun 			acpi_os_printf("AcpiGetPossibleResources failed: %s\n",
919*4882a593Smuzhiyun 				       acpi_format_exception(status));
920*4882a593Smuzhiyun 			goto get_aei;
921*4882a593Smuzhiyun 		}
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 		acpi_rs_dump_resource_list(ACPI_CAST_PTR
924*4882a593Smuzhiyun 					   (struct acpi_resource,
925*4882a593Smuzhiyun 					    acpi_gbl_db_buffer));
926*4882a593Smuzhiyun 	}
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun 	/* _AEI */
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun get_aei:
931*4882a593Smuzhiyun 	if (aei_node) {
932*4882a593Smuzhiyun 		acpi_os_printf("Evaluating _AEI\n");
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
935*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 		status =
938*4882a593Smuzhiyun 		    acpi_evaluate_object(aei_node, NULL, NULL, &return_buffer);
939*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
940*4882a593Smuzhiyun 			acpi_os_printf("Could not evaluate _AEI: %s\n",
941*4882a593Smuzhiyun 				       acpi_format_exception(status));
942*4882a593Smuzhiyun 			goto cleanup;
943*4882a593Smuzhiyun 		}
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun 		return_buffer.pointer = acpi_gbl_db_buffer;
946*4882a593Smuzhiyun 		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 		status = acpi_get_event_resources(node, &return_buffer);
949*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
950*4882a593Smuzhiyun 			acpi_os_printf("AcpiGetEventResources failed: %s\n",
951*4882a593Smuzhiyun 				       acpi_format_exception(status));
952*4882a593Smuzhiyun 			goto cleanup;
953*4882a593Smuzhiyun 		}
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 		acpi_rs_dump_resource_list(ACPI_CAST_PTR
956*4882a593Smuzhiyun 					   (struct acpi_resource,
957*4882a593Smuzhiyun 					    acpi_gbl_db_buffer));
958*4882a593Smuzhiyun 	}
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun cleanup:
961*4882a593Smuzhiyun 	ACPI_FREE(parent_path);
962*4882a593Smuzhiyun 	return (AE_OK);
963*4882a593Smuzhiyun }
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun /*******************************************************************************
966*4882a593Smuzhiyun  *
967*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_resources
968*4882a593Smuzhiyun  *
969*4882a593Smuzhiyun  * PARAMETERS:  object_arg          - String object name or object pointer.
970*4882a593Smuzhiyun  *                                    NULL or "*" means "display resources for
971*4882a593Smuzhiyun  *                                    all devices"
972*4882a593Smuzhiyun  *
973*4882a593Smuzhiyun  * RETURN:      None
974*4882a593Smuzhiyun  *
975*4882a593Smuzhiyun  * DESCRIPTION: Display the resource objects associated with a device.
976*4882a593Smuzhiyun  *
977*4882a593Smuzhiyun  ******************************************************************************/
978*4882a593Smuzhiyun 
acpi_db_display_resources(char * object_arg)979*4882a593Smuzhiyun void acpi_db_display_resources(char *object_arg)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
984*4882a593Smuzhiyun 	acpi_dbg_level |= ACPI_LV_RESOURCES;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	/* Asterisk means "display resources for all devices" */
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	if (!object_arg || (!strcmp(object_arg, "*"))) {
989*4882a593Smuzhiyun 		(void)acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
990*4882a593Smuzhiyun 					  ACPI_UINT32_MAX,
991*4882a593Smuzhiyun 					  acpi_db_device_resources, NULL, NULL,
992*4882a593Smuzhiyun 					  NULL);
993*4882a593Smuzhiyun 	} else {
994*4882a593Smuzhiyun 		/* Convert string to object pointer */
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 		node = acpi_db_convert_to_node(object_arg);
997*4882a593Smuzhiyun 		if (node) {
998*4882a593Smuzhiyun 			if (node->type != ACPI_TYPE_DEVICE) {
999*4882a593Smuzhiyun 				acpi_os_printf
1000*4882a593Smuzhiyun 				    ("%4.4s: Name is not a device object (%s)\n",
1001*4882a593Smuzhiyun 				     node->name.ascii,
1002*4882a593Smuzhiyun 				     acpi_ut_get_type_name(node->type));
1003*4882a593Smuzhiyun 			} else {
1004*4882a593Smuzhiyun 				(void)acpi_db_device_resources(node, 0, NULL,
1005*4882a593Smuzhiyun 							       NULL);
1006*4882a593Smuzhiyun 			}
1007*4882a593Smuzhiyun 		}
1008*4882a593Smuzhiyun 	}
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
1011*4882a593Smuzhiyun }
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE)
1014*4882a593Smuzhiyun /*******************************************************************************
1015*4882a593Smuzhiyun  *
1016*4882a593Smuzhiyun  * FUNCTION:    acpi_db_generate_gpe
1017*4882a593Smuzhiyun  *
1018*4882a593Smuzhiyun  * PARAMETERS:  gpe_arg             - Raw GPE number, ascii string
1019*4882a593Smuzhiyun  *              block_arg           - GPE block number, ascii string
1020*4882a593Smuzhiyun  *                                    0 or 1 for FADT GPE blocks
1021*4882a593Smuzhiyun  *
1022*4882a593Smuzhiyun  * RETURN:      None
1023*4882a593Smuzhiyun  *
1024*4882a593Smuzhiyun  * DESCRIPTION: Simulate firing of a GPE
1025*4882a593Smuzhiyun  *
1026*4882a593Smuzhiyun  ******************************************************************************/
1027*4882a593Smuzhiyun 
acpi_db_generate_gpe(char * gpe_arg,char * block_arg)1028*4882a593Smuzhiyun void acpi_db_generate_gpe(char *gpe_arg, char *block_arg)
1029*4882a593Smuzhiyun {
1030*4882a593Smuzhiyun 	u32 block_number = 0;
1031*4882a593Smuzhiyun 	u32 gpe_number;
1032*4882a593Smuzhiyun 	struct acpi_gpe_event_info *gpe_event_info;
1033*4882a593Smuzhiyun 
1034*4882a593Smuzhiyun 	gpe_number = strtoul(gpe_arg, NULL, 0);
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun 	/*
1037*4882a593Smuzhiyun 	 * If no block arg, or block arg == 0 or 1, use the FADT-defined
1038*4882a593Smuzhiyun 	 * GPE blocks.
1039*4882a593Smuzhiyun 	 */
1040*4882a593Smuzhiyun 	if (block_arg) {
1041*4882a593Smuzhiyun 		block_number = strtoul(block_arg, NULL, 0);
1042*4882a593Smuzhiyun 		if (block_number == 1) {
1043*4882a593Smuzhiyun 			block_number = 0;
1044*4882a593Smuzhiyun 		}
1045*4882a593Smuzhiyun 	}
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun 	gpe_event_info =
1048*4882a593Smuzhiyun 	    acpi_ev_get_gpe_event_info(ACPI_TO_POINTER(block_number),
1049*4882a593Smuzhiyun 				       gpe_number);
1050*4882a593Smuzhiyun 	if (!gpe_event_info) {
1051*4882a593Smuzhiyun 		acpi_os_printf("Invalid GPE\n");
1052*4882a593Smuzhiyun 		return;
1053*4882a593Smuzhiyun 	}
1054*4882a593Smuzhiyun 
1055*4882a593Smuzhiyun 	(void)acpi_ev_gpe_dispatch(NULL, gpe_event_info, gpe_number);
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun /*******************************************************************************
1059*4882a593Smuzhiyun  *
1060*4882a593Smuzhiyun  * FUNCTION:    acpi_db_generate_sci
1061*4882a593Smuzhiyun  *
1062*4882a593Smuzhiyun  * PARAMETERS:  None
1063*4882a593Smuzhiyun  *
1064*4882a593Smuzhiyun  * RETURN:      None
1065*4882a593Smuzhiyun  *
1066*4882a593Smuzhiyun  * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch.
1067*4882a593Smuzhiyun  *
1068*4882a593Smuzhiyun  ******************************************************************************/
1069*4882a593Smuzhiyun 
acpi_db_generate_sci(void)1070*4882a593Smuzhiyun void acpi_db_generate_sci(void)
1071*4882a593Smuzhiyun {
1072*4882a593Smuzhiyun 	acpi_ev_sci_dispatch();
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun #endif				/* !ACPI_REDUCED_HARDWARE */
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun /*******************************************************************************
1078*4882a593Smuzhiyun  *
1079*4882a593Smuzhiyun  * FUNCTION:    acpi_db_trace
1080*4882a593Smuzhiyun  *
1081*4882a593Smuzhiyun  * PARAMETERS:  enable_arg          - ENABLE/AML to enable tracer
1082*4882a593Smuzhiyun  *                                    DISABLE to disable tracer
1083*4882a593Smuzhiyun  *              method_arg          - Method to trace
1084*4882a593Smuzhiyun  *              once_arg            - Whether trace once
1085*4882a593Smuzhiyun  *
1086*4882a593Smuzhiyun  * RETURN:      None
1087*4882a593Smuzhiyun  *
1088*4882a593Smuzhiyun  * DESCRIPTION: Control method tracing facility
1089*4882a593Smuzhiyun  *
1090*4882a593Smuzhiyun  ******************************************************************************/
1091*4882a593Smuzhiyun 
acpi_db_trace(char * enable_arg,char * method_arg,char * once_arg)1092*4882a593Smuzhiyun void acpi_db_trace(char *enable_arg, char *method_arg, char *once_arg)
1093*4882a593Smuzhiyun {
1094*4882a593Smuzhiyun 	u32 debug_level = 0;
1095*4882a593Smuzhiyun 	u32 debug_layer = 0;
1096*4882a593Smuzhiyun 	u32 flags = 0;
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun 	acpi_ut_strupr(enable_arg);
1099*4882a593Smuzhiyun 	acpi_ut_strupr(once_arg);
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun 	if (method_arg) {
1102*4882a593Smuzhiyun 		if (acpi_db_trace_method_name) {
1103*4882a593Smuzhiyun 			ACPI_FREE(acpi_db_trace_method_name);
1104*4882a593Smuzhiyun 			acpi_db_trace_method_name = NULL;
1105*4882a593Smuzhiyun 		}
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun 		acpi_db_trace_method_name =
1108*4882a593Smuzhiyun 		    ACPI_ALLOCATE(strlen(method_arg) + 1);
1109*4882a593Smuzhiyun 		if (!acpi_db_trace_method_name) {
1110*4882a593Smuzhiyun 			acpi_os_printf("Failed to allocate method name (%s)\n",
1111*4882a593Smuzhiyun 				       method_arg);
1112*4882a593Smuzhiyun 			return;
1113*4882a593Smuzhiyun 		}
1114*4882a593Smuzhiyun 
1115*4882a593Smuzhiyun 		strcpy(acpi_db_trace_method_name, method_arg);
1116*4882a593Smuzhiyun 	}
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 	if (!strcmp(enable_arg, "ENABLE") ||
1119*4882a593Smuzhiyun 	    !strcmp(enable_arg, "METHOD") || !strcmp(enable_arg, "OPCODE")) {
1120*4882a593Smuzhiyun 		if (!strcmp(enable_arg, "ENABLE")) {
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 			/* Inherit current console settings */
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 			debug_level = acpi_gbl_db_console_debug_level;
1125*4882a593Smuzhiyun 			debug_layer = acpi_dbg_layer;
1126*4882a593Smuzhiyun 		} else {
1127*4882a593Smuzhiyun 			/* Restrict console output to trace points only */
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 			debug_level = ACPI_LV_TRACE_POINT;
1130*4882a593Smuzhiyun 			debug_layer = ACPI_EXECUTER;
1131*4882a593Smuzhiyun 		}
1132*4882a593Smuzhiyun 
1133*4882a593Smuzhiyun 		flags = ACPI_TRACE_ENABLED;
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun 		if (!strcmp(enable_arg, "OPCODE")) {
1136*4882a593Smuzhiyun 			flags |= ACPI_TRACE_OPCODE;
1137*4882a593Smuzhiyun 		}
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun 		if (once_arg && !strcmp(once_arg, "ONCE")) {
1140*4882a593Smuzhiyun 			flags |= ACPI_TRACE_ONESHOT;
1141*4882a593Smuzhiyun 		}
1142*4882a593Smuzhiyun 	}
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun 	(void)acpi_debug_trace(acpi_db_trace_method_name,
1145*4882a593Smuzhiyun 			       debug_level, debug_layer, flags);
1146*4882a593Smuzhiyun }
1147