xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/dbnames.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: dbnames - Debugger commands for the acpi namespace
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  ******************************************************************************/
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun #include "acnamesp.h"
11*4882a593Smuzhiyun #include "acdebug.h"
12*4882a593Smuzhiyun #include "acpredef.h"
13*4882a593Smuzhiyun #include "acinterp.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define _COMPONENT          ACPI_CA_DEBUGGER
16*4882a593Smuzhiyun ACPI_MODULE_NAME("dbnames")
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* Local prototypes */
19*4882a593Smuzhiyun static acpi_status
20*4882a593Smuzhiyun acpi_db_walk_and_match_name(acpi_handle obj_handle,
21*4882a593Smuzhiyun 			    u32 nesting_level,
22*4882a593Smuzhiyun 			    void *context, void **return_value);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun static acpi_status
25*4882a593Smuzhiyun acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
26*4882a593Smuzhiyun 				  u32 nesting_level,
27*4882a593Smuzhiyun 				  void *context, void **return_value);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun static acpi_status
30*4882a593Smuzhiyun acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
31*4882a593Smuzhiyun 				  u32 nesting_level,
32*4882a593Smuzhiyun 				  void *context, void **return_value);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun static acpi_status
35*4882a593Smuzhiyun acpi_db_walk_for_object_counts(acpi_handle obj_handle,
36*4882a593Smuzhiyun 			       u32 nesting_level,
37*4882a593Smuzhiyun 			       void *context, void **return_value);
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun static acpi_status
40*4882a593Smuzhiyun acpi_db_integrity_walk(acpi_handle obj_handle,
41*4882a593Smuzhiyun 		       u32 nesting_level, void *context, void **return_value);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static acpi_status
44*4882a593Smuzhiyun acpi_db_walk_for_references(acpi_handle obj_handle,
45*4882a593Smuzhiyun 			    u32 nesting_level,
46*4882a593Smuzhiyun 			    void *context, void **return_value);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun static acpi_status
49*4882a593Smuzhiyun acpi_db_bus_walk(acpi_handle obj_handle,
50*4882a593Smuzhiyun 		 u32 nesting_level, void *context, void **return_value);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * Arguments for the Objects command
54*4882a593Smuzhiyun  * These object types map directly to the ACPI_TYPES
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun static struct acpi_db_argument_info acpi_db_object_types[] = {
57*4882a593Smuzhiyun 	{"ANY"},
58*4882a593Smuzhiyun 	{"INTEGERS"},
59*4882a593Smuzhiyun 	{"STRINGS"},
60*4882a593Smuzhiyun 	{"BUFFERS"},
61*4882a593Smuzhiyun 	{"PACKAGES"},
62*4882a593Smuzhiyun 	{"FIELDS"},
63*4882a593Smuzhiyun 	{"DEVICES"},
64*4882a593Smuzhiyun 	{"EVENTS"},
65*4882a593Smuzhiyun 	{"METHODS"},
66*4882a593Smuzhiyun 	{"MUTEXES"},
67*4882a593Smuzhiyun 	{"REGIONS"},
68*4882a593Smuzhiyun 	{"POWERRESOURCES"},
69*4882a593Smuzhiyun 	{"PROCESSORS"},
70*4882a593Smuzhiyun 	{"THERMALZONES"},
71*4882a593Smuzhiyun 	{"BUFFERFIELDS"},
72*4882a593Smuzhiyun 	{"DDBHANDLES"},
73*4882a593Smuzhiyun 	{"DEBUG"},
74*4882a593Smuzhiyun 	{"REGIONFIELDS"},
75*4882a593Smuzhiyun 	{"BANKFIELDS"},
76*4882a593Smuzhiyun 	{"INDEXFIELDS"},
77*4882a593Smuzhiyun 	{"REFERENCES"},
78*4882a593Smuzhiyun 	{"ALIASES"},
79*4882a593Smuzhiyun 	{"METHODALIASES"},
80*4882a593Smuzhiyun 	{"NOTIFY"},
81*4882a593Smuzhiyun 	{"ADDRESSHANDLER"},
82*4882a593Smuzhiyun 	{"RESOURCE"},
83*4882a593Smuzhiyun 	{"RESOURCEFIELD"},
84*4882a593Smuzhiyun 	{"SCOPES"},
85*4882a593Smuzhiyun 	{NULL}			/* Must be null terminated */
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /*******************************************************************************
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  * FUNCTION:    acpi_db_set_scope
91*4882a593Smuzhiyun  *
92*4882a593Smuzhiyun  * PARAMETERS:  name                - New scope path
93*4882a593Smuzhiyun  *
94*4882a593Smuzhiyun  * RETURN:      Status
95*4882a593Smuzhiyun  *
96*4882a593Smuzhiyun  * DESCRIPTION: Set the "current scope" as maintained by this utility.
97*4882a593Smuzhiyun  *              The scope is used as a prefix to ACPI paths.
98*4882a593Smuzhiyun  *
99*4882a593Smuzhiyun  ******************************************************************************/
100*4882a593Smuzhiyun 
acpi_db_set_scope(char * name)101*4882a593Smuzhiyun void acpi_db_set_scope(char *name)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun 	acpi_status status;
104*4882a593Smuzhiyun 	struct acpi_namespace_node *node;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	if (!name || name[0] == 0) {
107*4882a593Smuzhiyun 		acpi_os_printf("Current scope: %s\n", acpi_gbl_db_scope_buf);
108*4882a593Smuzhiyun 		return;
109*4882a593Smuzhiyun 	}
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	acpi_db_prep_namestring(name);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	if (ACPI_IS_ROOT_PREFIX(name[0])) {
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 		/* Validate new scope from the root */
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 		status = acpi_ns_get_node(acpi_gbl_root_node, name,
118*4882a593Smuzhiyun 					  ACPI_NS_NO_UPSEARCH, &node);
119*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
120*4882a593Smuzhiyun 			goto error_exit;
121*4882a593Smuzhiyun 		}
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 		acpi_gbl_db_scope_buf[0] = 0;
124*4882a593Smuzhiyun 	} else {
125*4882a593Smuzhiyun 		/* Validate new scope relative to old scope */
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 		status = acpi_ns_get_node(acpi_gbl_db_scope_node, name,
128*4882a593Smuzhiyun 					  ACPI_NS_NO_UPSEARCH, &node);
129*4882a593Smuzhiyun 		if (ACPI_FAILURE(status)) {
130*4882a593Smuzhiyun 			goto error_exit;
131*4882a593Smuzhiyun 		}
132*4882a593Smuzhiyun 	}
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* Build the final pathname */
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	if (acpi_ut_safe_strcat
137*4882a593Smuzhiyun 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), name)) {
138*4882a593Smuzhiyun 		status = AE_BUFFER_OVERFLOW;
139*4882a593Smuzhiyun 		goto error_exit;
140*4882a593Smuzhiyun 	}
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	if (acpi_ut_safe_strcat
143*4882a593Smuzhiyun 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), "\\")) {
144*4882a593Smuzhiyun 		status = AE_BUFFER_OVERFLOW;
145*4882a593Smuzhiyun 		goto error_exit;
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	acpi_gbl_db_scope_node = node;
149*4882a593Smuzhiyun 	acpi_os_printf("New scope: %s\n", acpi_gbl_db_scope_buf);
150*4882a593Smuzhiyun 	return;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun error_exit:
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	acpi_os_printf("Could not attach scope: %s, %s\n",
155*4882a593Smuzhiyun 		       name, acpi_format_exception(status));
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /*******************************************************************************
159*4882a593Smuzhiyun  *
160*4882a593Smuzhiyun  * FUNCTION:    acpi_db_dump_namespace
161*4882a593Smuzhiyun  *
162*4882a593Smuzhiyun  * PARAMETERS:  start_arg       - Node to begin namespace dump
163*4882a593Smuzhiyun  *              depth_arg       - Maximum tree depth to be dumped
164*4882a593Smuzhiyun  *
165*4882a593Smuzhiyun  * RETURN:      None
166*4882a593Smuzhiyun  *
167*4882a593Smuzhiyun  * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
168*4882a593Smuzhiyun  *              with type and other information.
169*4882a593Smuzhiyun  *
170*4882a593Smuzhiyun  ******************************************************************************/
171*4882a593Smuzhiyun 
acpi_db_dump_namespace(char * start_arg,char * depth_arg)172*4882a593Smuzhiyun void acpi_db_dump_namespace(char *start_arg, char *depth_arg)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun 	acpi_handle subtree_entry = acpi_gbl_root_node;
175*4882a593Smuzhiyun 	u32 max_depth = ACPI_UINT32_MAX;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	/* No argument given, just start at the root and dump entire namespace */
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	if (start_arg) {
180*4882a593Smuzhiyun 		subtree_entry = acpi_db_convert_to_node(start_arg);
181*4882a593Smuzhiyun 		if (!subtree_entry) {
182*4882a593Smuzhiyun 			return;
183*4882a593Smuzhiyun 		}
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		/* Now we can check for the depth argument */
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 		if (depth_arg) {
188*4882a593Smuzhiyun 			max_depth = strtoul(depth_arg, NULL, 0);
189*4882a593Smuzhiyun 		}
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	if (((struct acpi_namespace_node *)subtree_entry)->parent) {
195*4882a593Smuzhiyun 		acpi_os_printf("ACPI Namespace (from %4.4s (%p) subtree):\n",
196*4882a593Smuzhiyun 			       ((struct acpi_namespace_node *)subtree_entry)->
197*4882a593Smuzhiyun 			       name.ascii, subtree_entry);
198*4882a593Smuzhiyun 	} else {
199*4882a593Smuzhiyun 		acpi_os_printf("ACPI Namespace (from %s):\n",
200*4882a593Smuzhiyun 			       ACPI_NAMESPACE_ROOT);
201*4882a593Smuzhiyun 	}
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	/* Display the subtree */
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
206*4882a593Smuzhiyun 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
207*4882a593Smuzhiyun 			     ACPI_OWNER_ID_MAX, subtree_entry);
208*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /*******************************************************************************
212*4882a593Smuzhiyun  *
213*4882a593Smuzhiyun  * FUNCTION:    acpi_db_dump_namespace_paths
214*4882a593Smuzhiyun  *
215*4882a593Smuzhiyun  * PARAMETERS:  None
216*4882a593Smuzhiyun  *
217*4882a593Smuzhiyun  * RETURN:      None
218*4882a593Smuzhiyun  *
219*4882a593Smuzhiyun  * DESCRIPTION: Dump entire namespace with full object pathnames and object
220*4882a593Smuzhiyun  *              type information. Alternative to "namespace" command.
221*4882a593Smuzhiyun  *
222*4882a593Smuzhiyun  ******************************************************************************/
223*4882a593Smuzhiyun 
acpi_db_dump_namespace_paths(void)224*4882a593Smuzhiyun void acpi_db_dump_namespace_paths(void)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
228*4882a593Smuzhiyun 	acpi_os_printf("ACPI Namespace (from root):\n");
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	/* Display the entire namespace */
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
233*4882a593Smuzhiyun 	acpi_ns_dump_object_paths(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
234*4882a593Smuzhiyun 				  ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX,
235*4882a593Smuzhiyun 				  acpi_gbl_root_node);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*******************************************************************************
241*4882a593Smuzhiyun  *
242*4882a593Smuzhiyun  * FUNCTION:    acpi_db_dump_namespace_by_owner
243*4882a593Smuzhiyun  *
244*4882a593Smuzhiyun  * PARAMETERS:  owner_arg       - Owner ID whose nodes will be displayed
245*4882a593Smuzhiyun  *              depth_arg       - Maximum tree depth to be dumped
246*4882a593Smuzhiyun  *
247*4882a593Smuzhiyun  * RETURN:      None
248*4882a593Smuzhiyun  *
249*4882a593Smuzhiyun  * DESCRIPTION: Dump elements of the namespace that are owned by the owner_id.
250*4882a593Smuzhiyun  *
251*4882a593Smuzhiyun  ******************************************************************************/
252*4882a593Smuzhiyun 
acpi_db_dump_namespace_by_owner(char * owner_arg,char * depth_arg)253*4882a593Smuzhiyun void acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	acpi_handle subtree_entry = acpi_gbl_root_node;
256*4882a593Smuzhiyun 	u32 max_depth = ACPI_UINT32_MAX;
257*4882a593Smuzhiyun 	acpi_owner_id owner_id;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	owner_id = (acpi_owner_id)strtoul(owner_arg, NULL, 0);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	/* Now we can check for the depth argument */
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	if (depth_arg) {
264*4882a593Smuzhiyun 		max_depth = strtoul(depth_arg, NULL, 0);
265*4882a593Smuzhiyun 	}
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
268*4882a593Smuzhiyun 	acpi_os_printf("ACPI Namespace by owner %X:\n", owner_id);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	/* Display the subtree */
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
273*4882a593Smuzhiyun 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
274*4882a593Smuzhiyun 			     owner_id, subtree_entry);
275*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /*******************************************************************************
279*4882a593Smuzhiyun  *
280*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_and_match_name
281*4882a593Smuzhiyun  *
282*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
283*4882a593Smuzhiyun  *
284*4882a593Smuzhiyun  * RETURN:      Status
285*4882a593Smuzhiyun  *
286*4882a593Smuzhiyun  * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
287*4882a593Smuzhiyun  *              are supported -- '?' matches any character.
288*4882a593Smuzhiyun  *
289*4882a593Smuzhiyun  ******************************************************************************/
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun static acpi_status
acpi_db_walk_and_match_name(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)292*4882a593Smuzhiyun acpi_db_walk_and_match_name(acpi_handle obj_handle,
293*4882a593Smuzhiyun 			    u32 nesting_level,
294*4882a593Smuzhiyun 			    void *context, void **return_value)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	acpi_status status;
297*4882a593Smuzhiyun 	char *requested_name = (char *)context;
298*4882a593Smuzhiyun 	u32 i;
299*4882a593Smuzhiyun 	struct acpi_buffer buffer;
300*4882a593Smuzhiyun 	struct acpi_walk_info info;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	/* Check for a name match */
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	for (i = 0; i < 4; i++) {
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 		/* Wildcard support */
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 		if ((requested_name[i] != '?') &&
309*4882a593Smuzhiyun 		    (requested_name[i] != ((struct acpi_namespace_node *)
310*4882a593Smuzhiyun 					   obj_handle)->name.ascii[i])) {
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 			/* No match, just exit */
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 			return (AE_OK);
315*4882a593Smuzhiyun 		}
316*4882a593Smuzhiyun 	}
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	/* Get the full pathname to this object */
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
321*4882a593Smuzhiyun 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
322*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
323*4882a593Smuzhiyun 		acpi_os_printf("Could Not get pathname for object %p\n",
324*4882a593Smuzhiyun 			       obj_handle);
325*4882a593Smuzhiyun 	} else {
326*4882a593Smuzhiyun 		info.count = 0;
327*4882a593Smuzhiyun 		info.owner_id = ACPI_OWNER_ID_MAX;
328*4882a593Smuzhiyun 		info.debug_level = ACPI_UINT32_MAX;
329*4882a593Smuzhiyun 		info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 		acpi_os_printf("%32s", (char *)buffer.pointer);
332*4882a593Smuzhiyun 		(void)acpi_ns_dump_one_object(obj_handle, nesting_level, &info,
333*4882a593Smuzhiyun 					      NULL);
334*4882a593Smuzhiyun 		ACPI_FREE(buffer.pointer);
335*4882a593Smuzhiyun 	}
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	return (AE_OK);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /*******************************************************************************
341*4882a593Smuzhiyun  *
342*4882a593Smuzhiyun  * FUNCTION:    acpi_db_find_name_in_namespace
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * PARAMETERS:  name_arg        - The 4-character ACPI name to find.
345*4882a593Smuzhiyun  *                                wildcards are supported.
346*4882a593Smuzhiyun  *
347*4882a593Smuzhiyun  * RETURN:      None
348*4882a593Smuzhiyun  *
349*4882a593Smuzhiyun  * DESCRIPTION: Search the namespace for a given name (with wildcards)
350*4882a593Smuzhiyun  *
351*4882a593Smuzhiyun  ******************************************************************************/
352*4882a593Smuzhiyun 
acpi_db_find_name_in_namespace(char * name_arg)353*4882a593Smuzhiyun acpi_status acpi_db_find_name_in_namespace(char *name_arg)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	char acpi_name[5] = "____";
356*4882a593Smuzhiyun 	char *acpi_name_ptr = acpi_name;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	if (strlen(name_arg) > ACPI_NAMESEG_SIZE) {
359*4882a593Smuzhiyun 		acpi_os_printf("Name must be no longer than 4 characters\n");
360*4882a593Smuzhiyun 		return (AE_OK);
361*4882a593Smuzhiyun 	}
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	/* Pad out name with underscores as necessary to create a 4-char name */
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	acpi_ut_strupr(name_arg);
366*4882a593Smuzhiyun 	while (*name_arg) {
367*4882a593Smuzhiyun 		*acpi_name_ptr = *name_arg;
368*4882a593Smuzhiyun 		acpi_name_ptr++;
369*4882a593Smuzhiyun 		name_arg++;
370*4882a593Smuzhiyun 	}
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	/* Walk the namespace from the root */
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
375*4882a593Smuzhiyun 				  ACPI_UINT32_MAX, acpi_db_walk_and_match_name,
376*4882a593Smuzhiyun 				  NULL, acpi_name, NULL);
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
379*4882a593Smuzhiyun 	return (AE_OK);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun /*******************************************************************************
383*4882a593Smuzhiyun  *
384*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_for_predefined_names
385*4882a593Smuzhiyun  *
386*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
387*4882a593Smuzhiyun  *
388*4882a593Smuzhiyun  * RETURN:      Status
389*4882a593Smuzhiyun  *
390*4882a593Smuzhiyun  * DESCRIPTION: Detect and display predefined ACPI names (names that start with
391*4882a593Smuzhiyun  *              an underscore)
392*4882a593Smuzhiyun  *
393*4882a593Smuzhiyun  ******************************************************************************/
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun static acpi_status
acpi_db_walk_for_predefined_names(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)396*4882a593Smuzhiyun acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
397*4882a593Smuzhiyun 				  u32 nesting_level,
398*4882a593Smuzhiyun 				  void *context, void **return_value)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
401*4882a593Smuzhiyun 	    (struct acpi_namespace_node *)obj_handle;
402*4882a593Smuzhiyun 	u32 *count = (u32 *)context;
403*4882a593Smuzhiyun 	const union acpi_predefined_info *predefined;
404*4882a593Smuzhiyun 	const union acpi_predefined_info *package = NULL;
405*4882a593Smuzhiyun 	char *pathname;
406*4882a593Smuzhiyun 	char string_buffer[48];
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	predefined = acpi_ut_match_predefined_method(node->name.ascii);
409*4882a593Smuzhiyun 	if (!predefined) {
410*4882a593Smuzhiyun 		return (AE_OK);
411*4882a593Smuzhiyun 	}
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 	pathname = acpi_ns_get_normalized_pathname(node, TRUE);
414*4882a593Smuzhiyun 	if (!pathname) {
415*4882a593Smuzhiyun 		return (AE_OK);
416*4882a593Smuzhiyun 	}
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	/* If method returns a package, the info is in the next table entry */
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	if (predefined->info.expected_btypes & ACPI_RTYPE_PACKAGE) {
421*4882a593Smuzhiyun 		package = predefined + 1;
422*4882a593Smuzhiyun 	}
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	acpi_ut_get_expected_return_types(string_buffer,
425*4882a593Smuzhiyun 					  predefined->info.expected_btypes);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	acpi_os_printf("%-32s Arguments %X, Return Types: %s", pathname,
428*4882a593Smuzhiyun 		       METHOD_GET_ARG_COUNT(predefined->info.argument_list),
429*4882a593Smuzhiyun 		       string_buffer);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	if (package) {
432*4882a593Smuzhiyun 		acpi_os_printf(" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
433*4882a593Smuzhiyun 			       package->ret_info.type,
434*4882a593Smuzhiyun 			       package->ret_info.object_type1,
435*4882a593Smuzhiyun 			       package->ret_info.count1);
436*4882a593Smuzhiyun 	}
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	acpi_os_printf("\n");
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	/* Check that the declared argument count matches the ACPI spec */
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	acpi_ns_check_acpi_compliance(pathname, node, predefined);
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	ACPI_FREE(pathname);
445*4882a593Smuzhiyun 	(*count)++;
446*4882a593Smuzhiyun 	return (AE_OK);
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun /*******************************************************************************
450*4882a593Smuzhiyun  *
451*4882a593Smuzhiyun  * FUNCTION:    acpi_db_check_predefined_names
452*4882a593Smuzhiyun  *
453*4882a593Smuzhiyun  * PARAMETERS:  None
454*4882a593Smuzhiyun  *
455*4882a593Smuzhiyun  * RETURN:      None
456*4882a593Smuzhiyun  *
457*4882a593Smuzhiyun  * DESCRIPTION: Validate all predefined names in the namespace
458*4882a593Smuzhiyun  *
459*4882a593Smuzhiyun  ******************************************************************************/
460*4882a593Smuzhiyun 
acpi_db_check_predefined_names(void)461*4882a593Smuzhiyun void acpi_db_check_predefined_names(void)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun 	u32 count = 0;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	/* Search all nodes in namespace */
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
468*4882a593Smuzhiyun 				  ACPI_UINT32_MAX,
469*4882a593Smuzhiyun 				  acpi_db_walk_for_predefined_names, NULL,
470*4882a593Smuzhiyun 				  (void *)&count, NULL);
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	acpi_os_printf("Found %u predefined names in the namespace\n", count);
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun /*******************************************************************************
476*4882a593Smuzhiyun  *
477*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_for_object_counts
478*4882a593Smuzhiyun  *
479*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
480*4882a593Smuzhiyun  *
481*4882a593Smuzhiyun  * RETURN:      Status
482*4882a593Smuzhiyun  *
483*4882a593Smuzhiyun  * DESCRIPTION: Display short info about objects in the namespace
484*4882a593Smuzhiyun  *
485*4882a593Smuzhiyun  ******************************************************************************/
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun static acpi_status
acpi_db_walk_for_object_counts(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)488*4882a593Smuzhiyun acpi_db_walk_for_object_counts(acpi_handle obj_handle,
489*4882a593Smuzhiyun 			       u32 nesting_level,
490*4882a593Smuzhiyun 			       void *context, void **return_value)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun 	struct acpi_object_info *info = (struct acpi_object_info *)context;
493*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
494*4882a593Smuzhiyun 	    (struct acpi_namespace_node *)obj_handle;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	if (node->type > ACPI_TYPE_NS_NODE_MAX) {
497*4882a593Smuzhiyun 		acpi_os_printf("[%4.4s]: Unknown object type %X\n",
498*4882a593Smuzhiyun 			       node->name.ascii, node->type);
499*4882a593Smuzhiyun 	} else {
500*4882a593Smuzhiyun 		info->types[node->type]++;
501*4882a593Smuzhiyun 	}
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	return (AE_OK);
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun /*******************************************************************************
507*4882a593Smuzhiyun  *
508*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_for_fields
509*4882a593Smuzhiyun  *
510*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
511*4882a593Smuzhiyun  *
512*4882a593Smuzhiyun  * RETURN:      Status
513*4882a593Smuzhiyun  *
514*4882a593Smuzhiyun  * DESCRIPTION: Display short info about objects in the namespace
515*4882a593Smuzhiyun  *
516*4882a593Smuzhiyun  ******************************************************************************/
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun static acpi_status
acpi_db_walk_for_fields(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)519*4882a593Smuzhiyun acpi_db_walk_for_fields(acpi_handle obj_handle,
520*4882a593Smuzhiyun 			u32 nesting_level, void *context, void **return_value)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun 	union acpi_object *ret_value;
523*4882a593Smuzhiyun 	struct acpi_region_walk_info *info =
524*4882a593Smuzhiyun 	    (struct acpi_region_walk_info *)context;
525*4882a593Smuzhiyun 	struct acpi_buffer buffer;
526*4882a593Smuzhiyun 	acpi_status status;
527*4882a593Smuzhiyun 	struct acpi_namespace_node *node = acpi_ns_validate_handle(obj_handle);
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	if (!node) {
530*4882a593Smuzhiyun 		return (AE_OK);
531*4882a593Smuzhiyun 	}
532*4882a593Smuzhiyun 	if (node->object->field.region_obj->region.space_id !=
533*4882a593Smuzhiyun 	    info->address_space_id) {
534*4882a593Smuzhiyun 		return (AE_OK);
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	info->count++;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	/* Get and display the full pathname to this object */
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
542*4882a593Smuzhiyun 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
543*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
544*4882a593Smuzhiyun 		acpi_os_printf("Could Not get pathname for object %p\n",
545*4882a593Smuzhiyun 			       obj_handle);
546*4882a593Smuzhiyun 		return (AE_OK);
547*4882a593Smuzhiyun 	}
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	acpi_os_printf("%s ", (char *)buffer.pointer);
550*4882a593Smuzhiyun 	ACPI_FREE(buffer.pointer);
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
553*4882a593Smuzhiyun 	acpi_evaluate_object(obj_handle, NULL, NULL, &buffer);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun 	/*
556*4882a593Smuzhiyun 	 * Since this is a field unit, surround the output in braces
557*4882a593Smuzhiyun 	 */
558*4882a593Smuzhiyun 	acpi_os_printf("{");
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun 	ret_value = (union acpi_object *)buffer.pointer;
561*4882a593Smuzhiyun 	switch (ret_value->type) {
562*4882a593Smuzhiyun 	case ACPI_TYPE_INTEGER:
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 		acpi_os_printf("%8.8X%8.8X",
565*4882a593Smuzhiyun 			       ACPI_FORMAT_UINT64(ret_value->integer.value));
566*4882a593Smuzhiyun 		break;
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	case ACPI_TYPE_BUFFER:
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 		acpi_ut_dump_buffer(ret_value->buffer.pointer,
571*4882a593Smuzhiyun 				    ret_value->buffer.length,
572*4882a593Smuzhiyun 				    DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0);
573*4882a593Smuzhiyun 		break;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	default:
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 		break;
578*4882a593Smuzhiyun 	}
579*4882a593Smuzhiyun 	acpi_os_printf("}\n");
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	ACPI_FREE(buffer.pointer);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	return (AE_OK);
584*4882a593Smuzhiyun }
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun /*******************************************************************************
587*4882a593Smuzhiyun  *
588*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_for_specific_objects
589*4882a593Smuzhiyun  *
590*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
591*4882a593Smuzhiyun  *
592*4882a593Smuzhiyun  * RETURN:      Status
593*4882a593Smuzhiyun  *
594*4882a593Smuzhiyun  * DESCRIPTION: Display short info about objects in the namespace
595*4882a593Smuzhiyun  *
596*4882a593Smuzhiyun  ******************************************************************************/
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun static acpi_status
acpi_db_walk_for_specific_objects(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)599*4882a593Smuzhiyun acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
600*4882a593Smuzhiyun 				  u32 nesting_level,
601*4882a593Smuzhiyun 				  void *context, void **return_value)
602*4882a593Smuzhiyun {
603*4882a593Smuzhiyun 	struct acpi_walk_info *info = (struct acpi_walk_info *)context;
604*4882a593Smuzhiyun 	struct acpi_buffer buffer;
605*4882a593Smuzhiyun 	acpi_status status;
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	info->count++;
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	/* Get and display the full pathname to this object */
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
612*4882a593Smuzhiyun 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
613*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
614*4882a593Smuzhiyun 		acpi_os_printf("Could Not get pathname for object %p\n",
615*4882a593Smuzhiyun 			       obj_handle);
616*4882a593Smuzhiyun 		return (AE_OK);
617*4882a593Smuzhiyun 	}
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 	acpi_os_printf("%32s", (char *)buffer.pointer);
620*4882a593Smuzhiyun 	ACPI_FREE(buffer.pointer);
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	/* Dump short info about the object */
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun 	(void)acpi_ns_dump_one_object(obj_handle, nesting_level, info, NULL);
625*4882a593Smuzhiyun 	return (AE_OK);
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun /*******************************************************************************
629*4882a593Smuzhiyun  *
630*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_objects
631*4882a593Smuzhiyun  *
632*4882a593Smuzhiyun  * PARAMETERS:  obj_type_arg        - Type of object to display
633*4882a593Smuzhiyun  *              display_count_arg   - Max depth to display
634*4882a593Smuzhiyun  *
635*4882a593Smuzhiyun  * RETURN:      None
636*4882a593Smuzhiyun  *
637*4882a593Smuzhiyun  * DESCRIPTION: Display objects in the namespace of the requested type
638*4882a593Smuzhiyun  *
639*4882a593Smuzhiyun  ******************************************************************************/
640*4882a593Smuzhiyun 
acpi_db_display_objects(char * obj_type_arg,char * display_count_arg)641*4882a593Smuzhiyun acpi_status acpi_db_display_objects(char *obj_type_arg, char *display_count_arg)
642*4882a593Smuzhiyun {
643*4882a593Smuzhiyun 	struct acpi_walk_info info;
644*4882a593Smuzhiyun 	acpi_object_type type;
645*4882a593Smuzhiyun 	struct acpi_object_info *object_info;
646*4882a593Smuzhiyun 	u32 i;
647*4882a593Smuzhiyun 	u32 total_objects = 0;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 	/* No argument means display summary/count of all object types */
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	if (!obj_type_arg) {
652*4882a593Smuzhiyun 		object_info =
653*4882a593Smuzhiyun 		    ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_object_info));
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 		/* Walk the namespace from the root */
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun 		(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
658*4882a593Smuzhiyun 					  ACPI_UINT32_MAX,
659*4882a593Smuzhiyun 					  acpi_db_walk_for_object_counts, NULL,
660*4882a593Smuzhiyun 					  (void *)object_info, NULL);
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 		acpi_os_printf("\nSummary of namespace objects:\n\n");
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 		for (i = 0; i < ACPI_TOTAL_TYPES; i++) {
665*4882a593Smuzhiyun 			acpi_os_printf("%8u %s\n", object_info->types[i],
666*4882a593Smuzhiyun 				       acpi_ut_get_type_name(i));
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 			total_objects += object_info->types[i];
669*4882a593Smuzhiyun 		}
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun 		acpi_os_printf("\n%8u Total namespace objects\n\n",
672*4882a593Smuzhiyun 			       total_objects);
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 		ACPI_FREE(object_info);
675*4882a593Smuzhiyun 		return (AE_OK);
676*4882a593Smuzhiyun 	}
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	/* Get the object type */
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun 	type = acpi_db_match_argument(obj_type_arg, acpi_db_object_types);
681*4882a593Smuzhiyun 	if (type == ACPI_TYPE_NOT_FOUND) {
682*4882a593Smuzhiyun 		acpi_os_printf("Invalid or unsupported argument\n");
683*4882a593Smuzhiyun 		return (AE_OK);
684*4882a593Smuzhiyun 	}
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
687*4882a593Smuzhiyun 	acpi_os_printf
688*4882a593Smuzhiyun 	    ("Objects of type [%s] defined in the current ACPI Namespace:\n",
689*4882a593Smuzhiyun 	     acpi_ut_get_type_name(type));
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	info.count = 0;
694*4882a593Smuzhiyun 	info.owner_id = ACPI_OWNER_ID_MAX;
695*4882a593Smuzhiyun 	info.debug_level = ACPI_UINT32_MAX;
696*4882a593Smuzhiyun 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	/* Walk the namespace from the root */
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	(void)acpi_walk_namespace(type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
701*4882a593Smuzhiyun 				  acpi_db_walk_for_specific_objects, NULL,
702*4882a593Smuzhiyun 				  (void *)&info, NULL);
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	acpi_os_printf
705*4882a593Smuzhiyun 	    ("\nFound %u objects of type [%s] in the current ACPI Namespace\n",
706*4882a593Smuzhiyun 	     info.count, acpi_ut_get_type_name(type));
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
709*4882a593Smuzhiyun 	return (AE_OK);
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun /*******************************************************************************
713*4882a593Smuzhiyun  *
714*4882a593Smuzhiyun  * FUNCTION:    acpi_db_display_fields
715*4882a593Smuzhiyun  *
716*4882a593Smuzhiyun  * PARAMETERS:  obj_type_arg        - Type of object to display
717*4882a593Smuzhiyun  *              display_count_arg   - Max depth to display
718*4882a593Smuzhiyun  *
719*4882a593Smuzhiyun  * RETURN:      None
720*4882a593Smuzhiyun  *
721*4882a593Smuzhiyun  * DESCRIPTION: Display objects in the namespace of the requested type
722*4882a593Smuzhiyun  *
723*4882a593Smuzhiyun  ******************************************************************************/
724*4882a593Smuzhiyun 
acpi_db_display_fields(u32 address_space_id)725*4882a593Smuzhiyun acpi_status acpi_db_display_fields(u32 address_space_id)
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun 	struct acpi_region_walk_info info;
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	info.count = 0;
730*4882a593Smuzhiyun 	info.owner_id = ACPI_OWNER_ID_MAX;
731*4882a593Smuzhiyun 	info.debug_level = ACPI_UINT32_MAX;
732*4882a593Smuzhiyun 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
733*4882a593Smuzhiyun 	info.address_space_id = address_space_id;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	/* Walk the namespace from the root */
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_LOCAL_REGION_FIELD,
738*4882a593Smuzhiyun 				  ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
739*4882a593Smuzhiyun 				  acpi_db_walk_for_fields, NULL, (void *)&info,
740*4882a593Smuzhiyun 				  NULL);
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 	return (AE_OK);
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun /*******************************************************************************
746*4882a593Smuzhiyun  *
747*4882a593Smuzhiyun  * FUNCTION:    acpi_db_integrity_walk
748*4882a593Smuzhiyun  *
749*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
750*4882a593Smuzhiyun  *
751*4882a593Smuzhiyun  * RETURN:      Status
752*4882a593Smuzhiyun  *
753*4882a593Smuzhiyun  * DESCRIPTION: Examine one NS node for valid values.
754*4882a593Smuzhiyun  *
755*4882a593Smuzhiyun  ******************************************************************************/
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun static acpi_status
acpi_db_integrity_walk(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)758*4882a593Smuzhiyun acpi_db_integrity_walk(acpi_handle obj_handle,
759*4882a593Smuzhiyun 		       u32 nesting_level, void *context, void **return_value)
760*4882a593Smuzhiyun {
761*4882a593Smuzhiyun 	struct acpi_integrity_info *info =
762*4882a593Smuzhiyun 	    (struct acpi_integrity_info *)context;
763*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
764*4882a593Smuzhiyun 	    (struct acpi_namespace_node *)obj_handle;
765*4882a593Smuzhiyun 	union acpi_operand_object *object;
766*4882a593Smuzhiyun 	u8 alias = TRUE;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	info->nodes++;
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	/* Verify the NS node, and dereference aliases */
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	while (alias) {
773*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
774*4882a593Smuzhiyun 			acpi_os_printf
775*4882a593Smuzhiyun 			    ("Invalid Descriptor Type for Node %p [%s] - "
776*4882a593Smuzhiyun 			     "is %2.2X should be %2.2X\n", node,
777*4882a593Smuzhiyun 			     acpi_ut_get_descriptor_name(node),
778*4882a593Smuzhiyun 			     ACPI_GET_DESCRIPTOR_TYPE(node),
779*4882a593Smuzhiyun 			     ACPI_DESC_TYPE_NAMED);
780*4882a593Smuzhiyun 			return (AE_OK);
781*4882a593Smuzhiyun 		}
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 		if ((node->type == ACPI_TYPE_LOCAL_ALIAS) ||
784*4882a593Smuzhiyun 		    (node->type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) {
785*4882a593Smuzhiyun 			node = (struct acpi_namespace_node *)node->object;
786*4882a593Smuzhiyun 		} else {
787*4882a593Smuzhiyun 			alias = FALSE;
788*4882a593Smuzhiyun 		}
789*4882a593Smuzhiyun 	}
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	if (node->type > ACPI_TYPE_LOCAL_MAX) {
792*4882a593Smuzhiyun 		acpi_os_printf("Invalid Object Type for Node %p, Type = %X\n",
793*4882a593Smuzhiyun 			       node, node->type);
794*4882a593Smuzhiyun 		return (AE_OK);
795*4882a593Smuzhiyun 	}
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 	if (!acpi_ut_valid_nameseg(node->name.ascii)) {
798*4882a593Smuzhiyun 		acpi_os_printf("Invalid AcpiName for Node %p\n", node);
799*4882a593Smuzhiyun 		return (AE_OK);
800*4882a593Smuzhiyun 	}
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	object = acpi_ns_get_attached_object(node);
803*4882a593Smuzhiyun 	if (object) {
804*4882a593Smuzhiyun 		info->objects++;
805*4882a593Smuzhiyun 		if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
806*4882a593Smuzhiyun 			acpi_os_printf
807*4882a593Smuzhiyun 			    ("Invalid Descriptor Type for Object %p [%s]\n",
808*4882a593Smuzhiyun 			     object, acpi_ut_get_descriptor_name(object));
809*4882a593Smuzhiyun 		}
810*4882a593Smuzhiyun 	}
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	return (AE_OK);
813*4882a593Smuzhiyun }
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun /*******************************************************************************
816*4882a593Smuzhiyun  *
817*4882a593Smuzhiyun  * FUNCTION:    acpi_db_check_integrity
818*4882a593Smuzhiyun  *
819*4882a593Smuzhiyun  * PARAMETERS:  None
820*4882a593Smuzhiyun  *
821*4882a593Smuzhiyun  * RETURN:      None
822*4882a593Smuzhiyun  *
823*4882a593Smuzhiyun  * DESCRIPTION: Check entire namespace for data structure integrity
824*4882a593Smuzhiyun  *
825*4882a593Smuzhiyun  ******************************************************************************/
826*4882a593Smuzhiyun 
acpi_db_check_integrity(void)827*4882a593Smuzhiyun void acpi_db_check_integrity(void)
828*4882a593Smuzhiyun {
829*4882a593Smuzhiyun 	struct acpi_integrity_info info = { 0, 0 };
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	/* Search all nodes in namespace */
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
834*4882a593Smuzhiyun 				  ACPI_UINT32_MAX, acpi_db_integrity_walk, NULL,
835*4882a593Smuzhiyun 				  (void *)&info, NULL);
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 	acpi_os_printf("Verified %u namespace nodes with %u Objects\n",
838*4882a593Smuzhiyun 		       info.nodes, info.objects);
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun /*******************************************************************************
842*4882a593Smuzhiyun  *
843*4882a593Smuzhiyun  * FUNCTION:    acpi_db_walk_for_references
844*4882a593Smuzhiyun  *
845*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
846*4882a593Smuzhiyun  *
847*4882a593Smuzhiyun  * RETURN:      Status
848*4882a593Smuzhiyun  *
849*4882a593Smuzhiyun  * DESCRIPTION: Check if this namespace object refers to the target object
850*4882a593Smuzhiyun  *              that is passed in as the context value.
851*4882a593Smuzhiyun  *
852*4882a593Smuzhiyun  * Note: Currently doesn't check subobjects within the Node's object
853*4882a593Smuzhiyun  *
854*4882a593Smuzhiyun  ******************************************************************************/
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun static acpi_status
acpi_db_walk_for_references(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)857*4882a593Smuzhiyun acpi_db_walk_for_references(acpi_handle obj_handle,
858*4882a593Smuzhiyun 			    u32 nesting_level,
859*4882a593Smuzhiyun 			    void *context, void **return_value)
860*4882a593Smuzhiyun {
861*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc =
862*4882a593Smuzhiyun 	    (union acpi_operand_object *)context;
863*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
864*4882a593Smuzhiyun 	    (struct acpi_namespace_node *)obj_handle;
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	/* Check for match against the namespace node itself */
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun 	if (node == (void *)obj_desc) {
869*4882a593Smuzhiyun 		acpi_os_printf("Object is a Node [%4.4s]\n",
870*4882a593Smuzhiyun 			       acpi_ut_get_node_name(node));
871*4882a593Smuzhiyun 	}
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	/* Check for match against the object attached to the node */
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun 	if (acpi_ns_get_attached_object(node) == obj_desc) {
876*4882a593Smuzhiyun 		acpi_os_printf("Reference at Node->Object %p [%4.4s]\n",
877*4882a593Smuzhiyun 			       node, acpi_ut_get_node_name(node));
878*4882a593Smuzhiyun 	}
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 	return (AE_OK);
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun /*******************************************************************************
884*4882a593Smuzhiyun  *
885*4882a593Smuzhiyun  * FUNCTION:    acpi_db_find_references
886*4882a593Smuzhiyun  *
887*4882a593Smuzhiyun  * PARAMETERS:  object_arg      - String with hex value of the object
888*4882a593Smuzhiyun  *
889*4882a593Smuzhiyun  * RETURN:      None
890*4882a593Smuzhiyun  *
891*4882a593Smuzhiyun  * DESCRIPTION: Search namespace for all references to the input object
892*4882a593Smuzhiyun  *
893*4882a593Smuzhiyun  ******************************************************************************/
894*4882a593Smuzhiyun 
acpi_db_find_references(char * object_arg)895*4882a593Smuzhiyun void acpi_db_find_references(char *object_arg)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun 	union acpi_operand_object *obj_desc;
898*4882a593Smuzhiyun 	acpi_size address;
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun 	/* Convert string to object pointer */
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	address = strtoul(object_arg, NULL, 16);
903*4882a593Smuzhiyun 	obj_desc = ACPI_TO_POINTER(address);
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	/* Search all nodes in namespace */
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
908*4882a593Smuzhiyun 				  ACPI_UINT32_MAX, acpi_db_walk_for_references,
909*4882a593Smuzhiyun 				  NULL, (void *)obj_desc, NULL);
910*4882a593Smuzhiyun }
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun /*******************************************************************************
913*4882a593Smuzhiyun  *
914*4882a593Smuzhiyun  * FUNCTION:    acpi_db_bus_walk
915*4882a593Smuzhiyun  *
916*4882a593Smuzhiyun  * PARAMETERS:  Callback from walk_namespace
917*4882a593Smuzhiyun  *
918*4882a593Smuzhiyun  * RETURN:      Status
919*4882a593Smuzhiyun  *
920*4882a593Smuzhiyun  * DESCRIPTION: Display info about device objects that have a corresponding
921*4882a593Smuzhiyun  *              _PRT method.
922*4882a593Smuzhiyun  *
923*4882a593Smuzhiyun  ******************************************************************************/
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun static acpi_status
acpi_db_bus_walk(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)926*4882a593Smuzhiyun acpi_db_bus_walk(acpi_handle obj_handle,
927*4882a593Smuzhiyun 		 u32 nesting_level, void *context, void **return_value)
928*4882a593Smuzhiyun {
929*4882a593Smuzhiyun 	struct acpi_namespace_node *node =
930*4882a593Smuzhiyun 	    (struct acpi_namespace_node *)obj_handle;
931*4882a593Smuzhiyun 	acpi_status status;
932*4882a593Smuzhiyun 	struct acpi_buffer buffer;
933*4882a593Smuzhiyun 	struct acpi_namespace_node *temp_node;
934*4882a593Smuzhiyun 	struct acpi_device_info *info;
935*4882a593Smuzhiyun 	u32 i;
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 	if ((node->type != ACPI_TYPE_DEVICE) &&
938*4882a593Smuzhiyun 	    (node->type != ACPI_TYPE_PROCESSOR)) {
939*4882a593Smuzhiyun 		return (AE_OK);
940*4882a593Smuzhiyun 	}
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	/* Exit if there is no _PRT under this device */
943*4882a593Smuzhiyun 
944*4882a593Smuzhiyun 	status = acpi_get_handle(node, METHOD_NAME__PRT,
945*4882a593Smuzhiyun 				 ACPI_CAST_PTR(acpi_handle, &temp_node));
946*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
947*4882a593Smuzhiyun 		return (AE_OK);
948*4882a593Smuzhiyun 	}
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 	/* Get the full path to this device object */
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
953*4882a593Smuzhiyun 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
954*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
955*4882a593Smuzhiyun 		acpi_os_printf("Could Not get pathname for object %p\n",
956*4882a593Smuzhiyun 			       obj_handle);
957*4882a593Smuzhiyun 		return (AE_OK);
958*4882a593Smuzhiyun 	}
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	status = acpi_get_object_info(obj_handle, &info);
961*4882a593Smuzhiyun 	if (ACPI_FAILURE(status)) {
962*4882a593Smuzhiyun 		return (AE_OK);
963*4882a593Smuzhiyun 	}
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	/* Display the full path */
966*4882a593Smuzhiyun 
967*4882a593Smuzhiyun 	acpi_os_printf("%-32s Type %X", (char *)buffer.pointer, node->type);
968*4882a593Smuzhiyun 	ACPI_FREE(buffer.pointer);
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun 	if (info->flags & ACPI_PCI_ROOT_BRIDGE) {
971*4882a593Smuzhiyun 		acpi_os_printf(" - Is PCI Root Bridge");
972*4882a593Smuzhiyun 	}
973*4882a593Smuzhiyun 	acpi_os_printf("\n");
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun 	/* _PRT info */
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 	acpi_os_printf("_PRT: %p\n", temp_node);
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	/* Dump _ADR, _HID, _UID, _CID */
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_ADR) {
982*4882a593Smuzhiyun 		acpi_os_printf("_ADR: %8.8X%8.8X\n",
983*4882a593Smuzhiyun 			       ACPI_FORMAT_UINT64(info->address));
984*4882a593Smuzhiyun 	} else {
985*4882a593Smuzhiyun 		acpi_os_printf("_ADR: <Not Present>\n");
986*4882a593Smuzhiyun 	}
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_HID) {
989*4882a593Smuzhiyun 		acpi_os_printf("_HID: %s\n", info->hardware_id.string);
990*4882a593Smuzhiyun 	} else {
991*4882a593Smuzhiyun 		acpi_os_printf("_HID: <Not Present>\n");
992*4882a593Smuzhiyun 	}
993*4882a593Smuzhiyun 
994*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_UID) {
995*4882a593Smuzhiyun 		acpi_os_printf("_UID: %s\n", info->unique_id.string);
996*4882a593Smuzhiyun 	} else {
997*4882a593Smuzhiyun 		acpi_os_printf("_UID: <Not Present>\n");
998*4882a593Smuzhiyun 	}
999*4882a593Smuzhiyun 
1000*4882a593Smuzhiyun 	if (info->valid & ACPI_VALID_CID) {
1001*4882a593Smuzhiyun 		for (i = 0; i < info->compatible_id_list.count; i++) {
1002*4882a593Smuzhiyun 			acpi_os_printf("_CID: %s\n",
1003*4882a593Smuzhiyun 				       info->compatible_id_list.ids[i].string);
1004*4882a593Smuzhiyun 		}
1005*4882a593Smuzhiyun 	} else {
1006*4882a593Smuzhiyun 		acpi_os_printf("_CID: <Not Present>\n");
1007*4882a593Smuzhiyun 	}
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	ACPI_FREE(info);
1010*4882a593Smuzhiyun 	return (AE_OK);
1011*4882a593Smuzhiyun }
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun /*******************************************************************************
1014*4882a593Smuzhiyun  *
1015*4882a593Smuzhiyun  * FUNCTION:    acpi_db_get_bus_info
1016*4882a593Smuzhiyun  *
1017*4882a593Smuzhiyun  * PARAMETERS:  None
1018*4882a593Smuzhiyun  *
1019*4882a593Smuzhiyun  * RETURN:      None
1020*4882a593Smuzhiyun  *
1021*4882a593Smuzhiyun  * DESCRIPTION: Display info about system buses.
1022*4882a593Smuzhiyun  *
1023*4882a593Smuzhiyun  ******************************************************************************/
1024*4882a593Smuzhiyun 
acpi_db_get_bus_info(void)1025*4882a593Smuzhiyun void acpi_db_get_bus_info(void)
1026*4882a593Smuzhiyun {
1027*4882a593Smuzhiyun 	/* Search all nodes in namespace */
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
1030*4882a593Smuzhiyun 				  ACPI_UINT32_MAX, acpi_db_bus_walk, NULL, NULL,
1031*4882a593Smuzhiyun 				  NULL);
1032*4882a593Smuzhiyun }
1033