xref: /openbmc/linux/drivers/acpi/acpica/exdebug.c (revision 612c2932)
195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
24cdf1a56SLin Ming /******************************************************************************
34cdf1a56SLin Ming  *
44cdf1a56SLin Ming  * Module Name: exdebug - Support for stores to the AML Debug Object
54cdf1a56SLin Ming  *
6*612c2932SBob Moore  * Copyright (C) 2000 - 2023, Intel Corp.
74cdf1a56SLin Ming  *
895857638SErik Schmauss  *****************************************************************************/
94cdf1a56SLin Ming 
104cdf1a56SLin Ming #include <acpi/acpi.h>
114cdf1a56SLin Ming #include "accommon.h"
124cdf1a56SLin Ming #include "acinterp.h"
134cdf1a56SLin Ming 
144cdf1a56SLin Ming #define _COMPONENT          ACPI_EXECUTER
154cdf1a56SLin Ming ACPI_MODULE_NAME("exdebug")
164cdf1a56SLin Ming 
174cdf1a56SLin Ming #ifndef ACPI_NO_ERROR_MESSAGES
184cdf1a56SLin Ming /*******************************************************************************
194cdf1a56SLin Ming  *
204cdf1a56SLin Ming  * FUNCTION:    acpi_ex_do_debug_object
214cdf1a56SLin Ming  *
224cdf1a56SLin Ming  * PARAMETERS:  source_desc         - Object to be output to "Debug Object"
23ba494beeSBob Moore  *              level               - Indentation level (used for packages)
24ba494beeSBob Moore  *              index               - Current package element, zero if not pkg
254cdf1a56SLin Ming  *
264cdf1a56SLin Ming  * RETURN:      None
274cdf1a56SLin Ming  *
284cdf1a56SLin Ming  * DESCRIPTION: Handles stores to the AML Debug Object. For example:
294cdf1a56SLin Ming  *              Store(INT1, Debug)
304cdf1a56SLin Ming  *
314cdf1a56SLin Ming  * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.
324cdf1a56SLin Ming  *
334cdf1a56SLin Ming  * This function is only enabled if acpi_gbl_enable_aml_debug_object is set, or
344cdf1a56SLin Ming  * if ACPI_LV_DEBUG_OBJECT is set in the acpi_dbg_level. Thus, in the normal
354cdf1a56SLin Ming  * operational case, stores to the debug object are ignored but can be easily
364cdf1a56SLin Ming  * enabled if necessary.
374cdf1a56SLin Ming  *
384cdf1a56SLin Ming  ******************************************************************************/
394cdf1a56SLin Ming void
acpi_ex_do_debug_object(union acpi_operand_object * source_desc,u32 level,u32 index)404cdf1a56SLin Ming acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
414cdf1a56SLin Ming 			u32 level, u32 index)
424cdf1a56SLin Ming {
434cdf1a56SLin Ming 	u32 i;
441aae3b97SBob Moore 	u32 timer;
45fde175e3SBob Moore 	union acpi_operand_object *object_desc;
46fde175e3SBob Moore 	u32 value;
474cdf1a56SLin Ming 
484cdf1a56SLin Ming 	ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc);
494cdf1a56SLin Ming 
504cdf1a56SLin Ming 	/* Output must be enabled via the debug_object global or the dbg_level */
514cdf1a56SLin Ming 
524cdf1a56SLin Ming 	if (!acpi_gbl_enable_aml_debug_object &&
534cdf1a56SLin Ming 	    !(acpi_dbg_level & ACPI_LV_DEBUG_OBJECT)) {
544cdf1a56SLin Ming 		return_VOID;
554cdf1a56SLin Ming 	}
564cdf1a56SLin Ming 
5781677241SBob Moore 	/* Newline -- don't emit the line header */
585e568304SBob Moore 
59973da572SBob Moore 	if (source_desc &&
60973da572SBob Moore 	    (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
615e568304SBob Moore 	    (source_desc->common.type == ACPI_TYPE_STRING)) {
6281677241SBob Moore 		if ((source_desc->string.length == 1) &&
6381677241SBob Moore 		    (*source_desc->string.pointer == '\n')) {
645e568304SBob Moore 			acpi_os_printf("\n");
655e568304SBob Moore 			return_VOID;
665e568304SBob Moore 		}
675e568304SBob Moore 	}
681aae3b97SBob Moore 
691aae3b97SBob Moore 	/*
704cdf1a56SLin Ming 	 * Print line header as long as we are not in the middle of an
714cdf1a56SLin Ming 	 * object display
724cdf1a56SLin Ming 	 */
734cdf1a56SLin Ming 	if (!((level > 0) && index == 0)) {
745e568304SBob Moore 		if (acpi_gbl_display_debug_timer) {
755e568304SBob Moore 			/*
765e568304SBob Moore 			 * We will emit the current timer value (in microseconds) with each
775e568304SBob Moore 			 * debug output. Only need the lower 26 bits. This allows for 67
785e568304SBob Moore 			 * million microseconds or 67 seconds before rollover.
795e568304SBob Moore 			 *
805e568304SBob Moore 			 * Convert 100 nanosecond units to microseconds
815e568304SBob Moore 			 */
825e568304SBob Moore 			timer = ((u32)acpi_os_get_timer() / 10);
835e568304SBob Moore 			timer &= 0x03FFFFFF;
845e568304SBob Moore 
859c0b6c49SBob Moore 			acpi_os_printf("ACPI Debug: T=0x%8.8X %*s", timer,
865e568304SBob Moore 				       level, " ");
875e568304SBob Moore 		} else {
889c0b6c49SBob Moore 			acpi_os_printf("ACPI Debug: %*s", level, " ");
895e568304SBob Moore 		}
904cdf1a56SLin Ming 	}
914cdf1a56SLin Ming 
924cdf1a56SLin Ming 	/* Display the index for package output only */
934cdf1a56SLin Ming 
944cdf1a56SLin Ming 	if (index > 0) {
954cdf1a56SLin Ming 		acpi_os_printf("(%.2u) ", index - 1);
964cdf1a56SLin Ming 	}
974cdf1a56SLin Ming 
984cdf1a56SLin Ming 	if (!source_desc) {
994cdf1a56SLin Ming 		acpi_os_printf("[Null Object]\n");
1004cdf1a56SLin Ming 		return_VOID;
1014cdf1a56SLin Ming 	}
1024cdf1a56SLin Ming 
1034cdf1a56SLin Ming 	if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) {
1045e568304SBob Moore 
1055e568304SBob Moore 		/* No object type prefix needed for integers and strings */
1065e568304SBob Moore 
1075e568304SBob Moore 		if ((source_desc->common.type != ACPI_TYPE_INTEGER) &&
1085e568304SBob Moore 		    (source_desc->common.type != ACPI_TYPE_STRING)) {
1094cdf1a56SLin Ming 			acpi_os_printf("%s ",
1105e568304SBob Moore 				       acpi_ut_get_object_type_name
1115e568304SBob Moore 				       (source_desc));
1125e568304SBob Moore 		}
1134cdf1a56SLin Ming 
1144cdf1a56SLin Ming 		if (!acpi_ut_valid_internal_object(source_desc)) {
1154cdf1a56SLin Ming 			acpi_os_printf("%p, Invalid Internal Object!\n",
1164cdf1a56SLin Ming 				       source_desc);
1174cdf1a56SLin Ming 			return_VOID;
1184cdf1a56SLin Ming 		}
1194cdf1a56SLin Ming 	} else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) ==
1204cdf1a56SLin Ming 		   ACPI_DESC_TYPE_NAMED) {
1215e568304SBob Moore 		acpi_os_printf("%s (Node %p)\n",
1224cdf1a56SLin Ming 			       acpi_ut_get_type_name(((struct
1234cdf1a56SLin Ming 						       acpi_namespace_node *)
1244cdf1a56SLin Ming 						      source_desc)->type),
1254cdf1a56SLin Ming 			       source_desc);
1264cdf1a56SLin Ming 		return_VOID;
1274cdf1a56SLin Ming 	} else {
1284cdf1a56SLin Ming 		return_VOID;
1294cdf1a56SLin Ming 	}
1304cdf1a56SLin Ming 
1314cdf1a56SLin Ming 	/* source_desc is of type ACPI_DESC_TYPE_OPERAND */
1324cdf1a56SLin Ming 
1334cdf1a56SLin Ming 	switch (source_desc->common.type) {
1344cdf1a56SLin Ming 	case ACPI_TYPE_INTEGER:
1354cdf1a56SLin Ming 
1364cdf1a56SLin Ming 		/* Output correct integer width */
1374cdf1a56SLin Ming 
1384cdf1a56SLin Ming 		if (acpi_gbl_integer_byte_width == 4) {
1394cdf1a56SLin Ming 			acpi_os_printf("0x%8.8X\n",
1404cdf1a56SLin Ming 				       (u32)source_desc->integer.value);
1414cdf1a56SLin Ming 		} else {
1424cdf1a56SLin Ming 			acpi_os_printf("0x%8.8X%8.8X\n",
1434cdf1a56SLin Ming 				       ACPI_FORMAT_UINT64(source_desc->integer.
1444cdf1a56SLin Ming 							  value));
1454cdf1a56SLin Ming 		}
1464cdf1a56SLin Ming 		break;
1474cdf1a56SLin Ming 
1484cdf1a56SLin Ming 	case ACPI_TYPE_BUFFER:
1494cdf1a56SLin Ming 
1504cdf1a56SLin Ming 		acpi_os_printf("[0x%.2X]\n", (u32)source_desc->buffer.length);
15197171c6bSBob Moore 		acpi_ut_dump_buffer(source_desc->buffer.pointer,
1524cdf1a56SLin Ming 				    (source_desc->buffer.length < 256) ?
1534cdf1a56SLin Ming 				    source_desc->buffer.length : 256,
15497171c6bSBob Moore 				    DB_BYTE_DISPLAY, 0);
1554cdf1a56SLin Ming 		break;
1564cdf1a56SLin Ming 
1574cdf1a56SLin Ming 	case ACPI_TYPE_STRING:
1584cdf1a56SLin Ming 
1595e568304SBob Moore 		acpi_os_printf("\"%s\"\n", source_desc->string.pointer);
1604cdf1a56SLin Ming 		break;
1614cdf1a56SLin Ming 
1624cdf1a56SLin Ming 	case ACPI_TYPE_PACKAGE:
1634cdf1a56SLin Ming 
1645e568304SBob Moore 		acpi_os_printf("(Contains 0x%.2X Elements):\n",
1654cdf1a56SLin Ming 			       source_desc->package.count);
1664cdf1a56SLin Ming 
1674cdf1a56SLin Ming 		/* Output the entire contents of the package */
1684cdf1a56SLin Ming 
1694cdf1a56SLin Ming 		for (i = 0; i < source_desc->package.count; i++) {
1704cdf1a56SLin Ming 			acpi_ex_do_debug_object(source_desc->package.
1714cdf1a56SLin Ming 						elements[i], level + 4, i + 1);
1724cdf1a56SLin Ming 		}
1734cdf1a56SLin Ming 		break;
1744cdf1a56SLin Ming 
1754cdf1a56SLin Ming 	case ACPI_TYPE_LOCAL_REFERENCE:
1764cdf1a56SLin Ming 
1774cdf1a56SLin Ming 		acpi_os_printf("[%s] ",
1784cdf1a56SLin Ming 			       acpi_ut_get_reference_name(source_desc));
1794cdf1a56SLin Ming 
1804cdf1a56SLin Ming 		/* Decode the reference */
1814cdf1a56SLin Ming 
1824cdf1a56SLin Ming 		switch (source_desc->reference.class) {
1834cdf1a56SLin Ming 		case ACPI_REFCLASS_INDEX:
1844cdf1a56SLin Ming 
1854cdf1a56SLin Ming 			acpi_os_printf("0x%X\n", source_desc->reference.value);
1864cdf1a56SLin Ming 			break;
1874cdf1a56SLin Ming 
1884cdf1a56SLin Ming 		case ACPI_REFCLASS_TABLE:
1894cdf1a56SLin Ming 
1904cdf1a56SLin Ming 			/* Case for ddb_handle */
1914cdf1a56SLin Ming 
1924cdf1a56SLin Ming 			acpi_os_printf("Table Index 0x%X\n",
1934cdf1a56SLin Ming 				       source_desc->reference.value);
19468aafc35SBob Moore 			return_VOID;
1954cdf1a56SLin Ming 
1964cdf1a56SLin Ming 		default:
1971d1ea1b7SChao Guan 
1984cdf1a56SLin Ming 			break;
1994cdf1a56SLin Ming 		}
2004cdf1a56SLin Ming 
2014cdf1a56SLin Ming 		acpi_os_printf(" ");
2024cdf1a56SLin Ming 
2034cdf1a56SLin Ming 		/* Check for valid node first, then valid object */
2044cdf1a56SLin Ming 
2054cdf1a56SLin Ming 		if (source_desc->reference.node) {
2064cdf1a56SLin Ming 			if (ACPI_GET_DESCRIPTOR_TYPE
2074cdf1a56SLin Ming 			    (source_desc->reference.node) !=
2084cdf1a56SLin Ming 			    ACPI_DESC_TYPE_NAMED) {
2094cdf1a56SLin Ming 				acpi_os_printf
2104cdf1a56SLin Ming 				    (" %p - Not a valid namespace node\n",
2114cdf1a56SLin Ming 				     source_desc->reference.node);
2124cdf1a56SLin Ming 			} else {
2134cdf1a56SLin Ming 				acpi_os_printf("Node %p [%4.4s] ",
2144cdf1a56SLin Ming 					       source_desc->reference.node,
2154cdf1a56SLin Ming 					       (source_desc->reference.node)->
2164cdf1a56SLin Ming 					       name.ascii);
2174cdf1a56SLin Ming 
2184cdf1a56SLin Ming 				switch ((source_desc->reference.node)->type) {
2194cdf1a56SLin Ming 
2204cdf1a56SLin Ming 					/* These types have no attached object */
2214cdf1a56SLin Ming 
2224cdf1a56SLin Ming 				case ACPI_TYPE_DEVICE:
2234cdf1a56SLin Ming 					acpi_os_printf("Device\n");
2244cdf1a56SLin Ming 					break;
2254cdf1a56SLin Ming 
2264cdf1a56SLin Ming 				case ACPI_TYPE_THERMAL:
2274cdf1a56SLin Ming 					acpi_os_printf("Thermal Zone\n");
2284cdf1a56SLin Ming 					break;
2294cdf1a56SLin Ming 
2304cdf1a56SLin Ming 				default:
2311d1ea1b7SChao Guan 
2324cdf1a56SLin Ming 					acpi_ex_do_debug_object((source_desc->
2334cdf1a56SLin Ming 								 reference.
2344cdf1a56SLin Ming 								 node)->object,
2354cdf1a56SLin Ming 								level + 4, 0);
2364cdf1a56SLin Ming 					break;
2374cdf1a56SLin Ming 				}
2384cdf1a56SLin Ming 			}
2394cdf1a56SLin Ming 		} else if (source_desc->reference.object) {
2404cdf1a56SLin Ming 			if (ACPI_GET_DESCRIPTOR_TYPE
2414cdf1a56SLin Ming 			    (source_desc->reference.object) ==
2424cdf1a56SLin Ming 			    ACPI_DESC_TYPE_NAMED) {
2435e568304SBob Moore 
2445e568304SBob Moore 				/* Reference object is a namespace node */
2455e568304SBob Moore 
2465e568304SBob Moore 				acpi_ex_do_debug_object(ACPI_CAST_PTR
2475e568304SBob Moore 							(union
2485e568304SBob Moore 							 acpi_operand_object,
2494cdf1a56SLin Ming 							 source_desc->reference.
2505e568304SBob Moore 							 object), level + 4, 0);
2514cdf1a56SLin Ming 			} else {
252fde175e3SBob Moore 				object_desc = source_desc->reference.object;
253fde175e3SBob Moore 				value = source_desc->reference.value;
254fde175e3SBob Moore 
255fde175e3SBob Moore 				switch (object_desc->common.type) {
256fde175e3SBob Moore 				case ACPI_TYPE_BUFFER:
257fde175e3SBob Moore 
258fde175e3SBob Moore 					acpi_os_printf("Buffer[%u] = 0x%2.2X\n",
259fde175e3SBob Moore 						       value,
260fde175e3SBob Moore 						       *source_desc->reference.
261fde175e3SBob Moore 						       index_pointer);
262fde175e3SBob Moore 					break;
263fde175e3SBob Moore 
264fde175e3SBob Moore 				case ACPI_TYPE_STRING:
265fde175e3SBob Moore 
266fde175e3SBob Moore 					acpi_os_printf
267fde175e3SBob Moore 					    ("String[%u] = \"%c\" (0x%2.2X)\n",
268fde175e3SBob Moore 					     value,
269fde175e3SBob Moore 					     *source_desc->reference.
270fde175e3SBob Moore 					     index_pointer,
271fde175e3SBob Moore 					     *source_desc->reference.
272fde175e3SBob Moore 					     index_pointer);
273fde175e3SBob Moore 					break;
274fde175e3SBob Moore 
275fde175e3SBob Moore 				case ACPI_TYPE_PACKAGE:
276fde175e3SBob Moore 
277fde175e3SBob Moore 					acpi_os_printf("Package[%u] = ", value);
27850da9851SBob Moore 					if (!(*source_desc->reference.where)) {
27950da9851SBob Moore 						acpi_os_printf
28050da9851SBob Moore 						    ("[Uninitialized Package Element]\n");
28150da9851SBob Moore 					} else {
28250da9851SBob Moore 						acpi_ex_do_debug_object
28350da9851SBob Moore 						    (*source_desc->reference.
28450da9851SBob Moore 						     where, level + 4, 0);
28550da9851SBob Moore 					}
286fde175e3SBob Moore 					break;
287fde175e3SBob Moore 
288fde175e3SBob Moore 				default:
289fde175e3SBob Moore 
290fde175e3SBob Moore 					acpi_os_printf
291fde175e3SBob Moore 					    ("Unknown Reference object type %X\n",
292fde175e3SBob Moore 					     object_desc->common.type);
293fde175e3SBob Moore 					break;
294fde175e3SBob Moore 				}
2954cdf1a56SLin Ming 			}
2964cdf1a56SLin Ming 		}
2974cdf1a56SLin Ming 		break;
2984cdf1a56SLin Ming 
2994cdf1a56SLin Ming 	default:
3004cdf1a56SLin Ming 
3015e568304SBob Moore 		acpi_os_printf("(Descriptor %p)\n", source_desc);
3024cdf1a56SLin Ming 		break;
3034cdf1a56SLin Ming 	}
3044cdf1a56SLin Ming 
3054cdf1a56SLin Ming 	ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "\n"));
3064cdf1a56SLin Ming 	return_VOID;
3074cdf1a56SLin Ming }
3084cdf1a56SLin Ming #endif
309