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