|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  | .. include:: <isonum.txt> | 
|  |  | 
|  | ===================== | 
|  | ACPICA Trace Facility | 
|  | ===================== | 
|  |  | 
|  | :Copyright: |copy| 2015, Intel Corporation | 
|  | :Author: Lv Zheng <lv.zheng@intel.com> | 
|  |  | 
|  |  | 
|  | Abstract | 
|  | ======== | 
|  | This document describes the functions and the interfaces of the | 
|  | method tracing facility. | 
|  |  | 
|  | Functionalities and usage examples | 
|  | ================================== | 
|  |  | 
|  | ACPICA provides method tracing capability. And two functions are | 
|  | currently implemented using this capability. | 
|  |  | 
|  | Log reducer | 
|  | ----------- | 
|  |  | 
|  | ACPICA subsystem provides debugging outputs when CONFIG_ACPI_DEBUG is | 
|  | enabled. The debugging messages which are deployed via | 
|  | ACPI_DEBUG_PRINT() macro can be reduced at 2 levels - per-component | 
|  | level (known as debug layer, configured via | 
|  | /sys/module/acpi/parameters/debug_layer) and per-type level (known as | 
|  | debug level, configured via /sys/module/acpi/parameters/debug_level). | 
|  |  | 
|  | But when the particular layer/level is applied to the control method | 
|  | evaluations, the quantity of the debugging outputs may still be too | 
|  | large to be put into the kernel log buffer. The idea thus is worked out | 
|  | to only enable the particular debug layer/level (normally more detailed) | 
|  | logs when the control method evaluation is started, and disable the | 
|  | detailed logging when the control method evaluation is stopped. | 
|  |  | 
|  | The following command examples illustrate the usage of the "log reducer" | 
|  | functionality: | 
|  |  | 
|  | a. Filter out the debug layer/level matched logs when control methods | 
|  | are being evaluated:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0xXXXXXXXX" > trace_debug_layer | 
|  | # echo "0xYYYYYYYY" > trace_debug_level | 
|  | # echo "enable" > trace_state | 
|  |  | 
|  | b. Filter out the debug layer/level matched logs when the specified | 
|  | control method is being evaluated:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0xXXXXXXXX" > trace_debug_layer | 
|  | # echo "0xYYYYYYYY" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "method" > /sys/module/acpi/parameters/trace_state | 
|  |  | 
|  | c. Filter out the debug layer/level matched logs when the specified | 
|  | control method is being evaluated for the first time:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0xXXXXXXXX" > trace_debug_layer | 
|  | # echo "0xYYYYYYYY" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "method-once" > /sys/module/acpi/parameters/trace_state | 
|  |  | 
|  | Where: | 
|  | 0xXXXXXXXX/0xYYYYYYYY | 
|  | Refer to Documentation/firmware-guide/acpi/debug.rst for possible debug layer/level | 
|  | masking values. | 
|  | \PPPP.AAAA.TTTT.HHHH | 
|  | Full path of a control method that can be found in the ACPI namespace. | 
|  | It needn't be an entry of a control method evaluation. | 
|  |  | 
|  | AML tracer | 
|  | ---------- | 
|  |  | 
|  | There are special log entries added by the method tracing facility at | 
|  | the "trace points" the AML interpreter starts/stops to execute a control | 
|  | method, or an AML opcode. Note that the format of the log entries are | 
|  | subject to change:: | 
|  |  | 
|  | [    0.186427]   exdebug-0398 ex_trace_point        : Method Begin [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution. | 
|  | [    0.186630]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905c88:If] execution. | 
|  | [    0.186820]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905cc0:LEqual] execution. | 
|  | [    0.187010]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905a20:-NamePath-] execution. | 
|  | [    0.187214]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905a20:-NamePath-] execution. | 
|  | [    0.187407]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905f60:One] execution. | 
|  | [    0.187594]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905f60:One] execution. | 
|  | [    0.187789]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905cc0:LEqual] execution. | 
|  | [    0.187980]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905cc0:Return] execution. | 
|  | [    0.188146]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905f60:One] execution. | 
|  | [    0.188334]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905f60:One] execution. | 
|  | [    0.188524]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905cc0:Return] execution. | 
|  | [    0.188712]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905c88:If] execution. | 
|  | [    0.188903]   exdebug-0398 ex_trace_point        : Method End [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution. | 
|  |  | 
|  | Developers can utilize these special log entries to track the AML | 
|  | interpretation, thus can aid issue debugging and performance tuning. Note | 
|  | that, as the "AML tracer" logs are implemented via ACPI_DEBUG_PRINT() | 
|  | macro, CONFIG_ACPI_DEBUG is also required to be enabled for enabling | 
|  | "AML tracer" logs. | 
|  |  | 
|  | The following command examples illustrate the usage of the "AML tracer" | 
|  | functionality: | 
|  |  | 
|  | a. Filter out the method start/stop "AML tracer" logs when control | 
|  | methods are being evaluated:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0x80" > trace_debug_layer | 
|  | # echo "0x10" > trace_debug_level | 
|  | # echo "enable" > trace_state | 
|  |  | 
|  | b. Filter out the method start/stop "AML tracer" when the specified | 
|  | control method is being evaluated:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0x80" > trace_debug_layer | 
|  | # echo "0x10" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "method" > trace_state | 
|  |  | 
|  | c. Filter out the method start/stop "AML tracer" logs when the specified | 
|  | control method is being evaluated for the first time:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0x80" > trace_debug_layer | 
|  | # echo "0x10" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "method-once" > trace_state | 
|  |  | 
|  | d. Filter out the method/opcode start/stop "AML tracer" when the | 
|  | specified control method is being evaluated:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0x80" > trace_debug_layer | 
|  | # echo "0x10" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "opcode" > trace_state | 
|  |  | 
|  | e. Filter out the method/opcode start/stop "AML tracer" when the | 
|  | specified control method is being evaluated for the first time:: | 
|  |  | 
|  | # cd /sys/module/acpi/parameters | 
|  | # echo "0x80" > trace_debug_layer | 
|  | # echo "0x10" > trace_debug_level | 
|  | # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name | 
|  | # echo "opcode-opcode" > trace_state | 
|  |  | 
|  | Note that all above method tracing facility related module parameters can | 
|  | be used as the boot parameters, for example:: | 
|  |  | 
|  | acpi.trace_debug_layer=0x80 acpi.trace_debug_level=0x10 \ | 
|  | acpi.trace_method_name=\_SB.LID0._LID acpi.trace_state=opcode-once | 
|  |  | 
|  |  | 
|  | Interface descriptions | 
|  | ====================== | 
|  |  | 
|  | All method tracing functions can be configured via ACPI module | 
|  | parameters that are accessible at /sys/module/acpi/parameters/: | 
|  |  | 
|  | trace_method_name | 
|  | The full path of the AML method that the user wants to trace. | 
|  |  | 
|  | Note that the full path shouldn't contain the trailing "_"s in its | 
|  | name segments but may contain "\" to form an absolute path. | 
|  |  | 
|  | trace_debug_layer | 
|  | The temporary debug_layer used when the tracing feature is enabled. | 
|  |  | 
|  | Using ACPI_EXECUTER (0x80) by default, which is the debug_layer | 
|  | used to match all "AML tracer" logs. | 
|  |  | 
|  | trace_debug_level | 
|  | The temporary debug_level used when the tracing feature is enabled. | 
|  |  | 
|  | Using ACPI_LV_TRACE_POINT (0x10) by default, which is the | 
|  | debug_level used to match all "AML tracer" logs. | 
|  |  | 
|  | trace_state | 
|  | The status of the tracing feature. | 
|  |  | 
|  | Users can enable/disable this debug tracing feature by executing | 
|  | the following command:: | 
|  |  | 
|  | # echo string > /sys/module/acpi/parameters/trace_state | 
|  |  | 
|  | Where "string" should be one of the following: | 
|  |  | 
|  | "disable" | 
|  | Disable the method tracing feature. | 
|  |  | 
|  | "enable" | 
|  | Enable the method tracing feature. | 
|  |  | 
|  | ACPICA debugging messages matching "trace_debug_layer/trace_debug_level" | 
|  | during any method execution will be logged. | 
|  |  | 
|  | "method" | 
|  | Enable the method tracing feature. | 
|  |  | 
|  | ACPICA debugging messages matching "trace_debug_layer/trace_debug_level" | 
|  | during method execution of "trace_method_name" will be logged. | 
|  |  | 
|  | "method-once" | 
|  | Enable the method tracing feature. | 
|  |  | 
|  | ACPICA debugging messages matching "trace_debug_layer/trace_debug_level" | 
|  | during method execution of "trace_method_name" will be logged only once. | 
|  |  | 
|  | "opcode" | 
|  | Enable the method tracing feature. | 
|  |  | 
|  | ACPICA debugging messages matching "trace_debug_layer/trace_debug_level" | 
|  | during method/opcode execution of "trace_method_name" will be logged. | 
|  |  | 
|  | "opcode-once" | 
|  | Enable the method tracing feature. | 
|  |  | 
|  | ACPICA debugging messages matching "trace_debug_layer/trace_debug_level" | 
|  | during method/opcode execution of "trace_method_name" will be logged only | 
|  | once. | 
|  |  | 
|  | Note that, the difference between the "enable" and other feature | 
|  | enabling options are: | 
|  |  | 
|  | 1. When "enable" is specified, since | 
|  | "trace_debug_layer/trace_debug_level" shall apply to all control | 
|  | method evaluations, after configuring "trace_state" to "enable", | 
|  | "trace_method_name" will be reset to NULL. | 
|  | 2. When "method/opcode" is specified, if | 
|  | "trace_method_name" is NULL when "trace_state" is configured to | 
|  | these options, the "trace_debug_layer/trace_debug_level" will | 
|  | apply to all control method evaluations. |