sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget*/translations/zh_CN/arch/x86/amd-debuggingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/zh_TW/arch/x86/amd-debuggingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/it_IT/arch/x86/amd-debuggingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ja_JP/arch/x86/amd-debuggingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ko_KR/arch/x86/amd-debuggingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/sp_SP/arch/x86/amd-debuggingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhD/var/lib/git/docbuild/linux/Documentation/arch/x86/amd-debugging.rsthKubhsection)}(hhh](htitle)}(hDebugging AMD Zen systemsh]hDebugging AMD Zen systems}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThis document describes techniques that are useful for debugging issues with AMD Zen systems. It is intended for use by developers and technical users to help identify and resolve issues.h]hThis document describes techniques that are useful for debugging issues with AMD Zen systems. It is intended for use by developers and technical users to help identify and resolve issues.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h S3 vs s2idleh]h S3 vs s2idle}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hX4On AMD systems, it's not possible to simultaneously support suspend-to-RAM (S3) and suspend-to-idle (s2idle). To confirm which mode your system supports you can look at ``cat /sys/power/mem_sleep``. If it shows ``s2idle [deep]`` then *S3* is supported. If it shows ``[s2idle]`` then *s2idle* is supported.h](hOn AMD systems, it’s not possible to simultaneously support suspend-to-RAM (S3) and suspend-to-idle (s2idle). To confirm which mode your system supports you can look at }(hjhhhNhNubhliteral)}(h``cat /sys/power/mem_sleep``h]hcat /sys/power/mem_sleep}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh. If it shows }(hjhhhNhNubj )}(h``s2idle [deep]``h]h s2idle [deep]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh then }(hjhhhNhNubhemphasis)}(h*S3*h]hS3}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjubh is supported. If it shows }(hjhhhNhNubj )}(h ``[s2idle]``h]h[s2idle]}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh then }(hjhhhNhNubj2)}(h*s2idle*h]hs2idle}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjubh is supported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(huOn systems that support *S3*, the firmware will be utilized to put all hardware into the appropriate low power state.h](hOn systems that support }(hjohhhNhNubj2)}(h*S3*h]hS3}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjoubhY, the firmware will be utilized to put all hardware into the appropriate low power state.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hOn systems that support *s2idle*, the kernel will be responsible for transitioning devices into the appropriate low power state. When all devices are in the appropriate low power state, the hardware will transition into a hardware sleep state.h](hOn systems that support }(hjhhhNhNubj2)}(h*s2idle*h]hs2idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjubh, the kernel will be responsible for transitioning devices into the appropriate low power state. When all devices are in the appropriate low power state, the hardware will transition into a hardware sleep state.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hAfter a suspend cycle you can tell how much time was spent in a hardware sleep state by looking at ``cat /sys/power/suspend_stats/last_hw_sleep``.h](hcAfter a suspend cycle you can tell how much time was spent in a hardware sleep state by looking at }(hjhhhNhNubj )}(h.``cat /sys/power/suspend_stats/last_hw_sleep``h]h*cat /sys/power/suspend_stats/last_hw_sleep}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h>This flowchart explains how the AMD s2idle suspend flow works.h]h>This flowchart explains how the AMD s2idle suspend flow works.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubkfigure kernel_figure)}(hhh]hfigure)}(hhh]himage)}(h.. kernel-figure:: suspend.svg h]h}(h]h ]h"]h$]h&]uriarch/x86/suspend.svg candidates}*jsuh1jhjhhhKubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhhhhhK#ubh)}(h=This flowchart explains how the amd s2idle resume flow works.h]h=This flowchart explains how the amd s2idle resume flow works.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hhhhubj)}(hhh]j)}(hhh]j)}(h.. kernel-figure:: resume.svg h]h}(h]h ]h"]h$]h&]uriarch/x86/resume.svgj}jj$suh1jhjhhhKubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhhhhhK'ubeh}(h] s3-vs-s2idleah ]h"] s3 vs s2idleah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hs2idle debugging toolh]hs2idle debugging tool}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hhhhhK)ubh)}(hXAs there are a lot of places that problems can occur, a debugging tool has been created at `amd-debug-tools `_ that can help test for common problems and offer suggestions.h](h[As there are a lot of places that problems can occur, a debugging tool has been created at }(hjKhhhNhNubh reference)}(hg`amd-debug-tools `_h]hamd-debug-tools}(hjUhhhNhNubah}(h]h ]h"]h$]h&]nameamd-debug-toolsrefuriRhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jShjKubhtarget)}(hU h]h}(h]amd-debug-toolsah ]h"]amd-debug-toolsah$]h&]refurijfuh1jg referencedKhjKubh> that can help test for common problems and offer suggestions.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hj:hhubh)}(hX0If you have an s2idle issue, it's best to start with this and follow instructions from its findings. If you continue to have an issue, raise a bug with the report generated from this script to `drm/amd gitlab `_.h](hIf you have an s2idle issue, it’s best to start with this and follow instructions from its findings. If you continue to have an issue, raise a bug with the report generated from this script to }(hjhhhNhNubjT)}(hm`drm/amd gitlab `_h]hdrm/amd gitlab}(hjhhhNhNubah}(h]h ]h"]h$]h&]namedrm/amd gitlabjeYhttps://gitlab.freedesktop.org/drm/amd/-/issues/new?issuable_template=s2idle_BUG_TEMPLATEuh1jShjubjh)}(h\ h]h}(h]drm-amd-gitlabah ]h"]drm/amd gitlabah$]h&]refurijuh1jgjvKhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK0hj:hhubeh}(h]s2idle-debugging-toolah ]h"]s2idle debugging toolah$]h&]uh1hhhhhhhhK)ubh)}(hhh](h)}(h#Spurious s2idle wakeups from an IRQh]h#Spurious s2idle wakeups from an IRQ}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK6ubh)}(hSpurious wakeups will generally have an IRQ set to ``/sys/power/pm_wakeup_irq``. This can be matched to ``/proc/interrupts`` to determine what device woke the system.h](h3Spurious wakeups will generally have an IRQ set to }(hjhhhNhNubj )}(h``/sys/power/pm_wakeup_irq``h]h/sys/power/pm_wakeup_irq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh. This can be matched to }(hjhhhNhNubj )}(h``/proc/interrupts``h]h/proc/interrupts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh* to determine what device woke the system.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK8hjhhubh)}(hIf this isn't enough to debug the problem, then the following sysfs files can be set to add more verbosity to the wakeup process: ::h]hIf this isn’t enough to debug the problem, then the following sysfs files can be set to add more verbosity to the wakeup process:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjhhubh literal_block)}(h^# echo 1 | sudo tee /sys/power/pm_debug_messages # echo 1 | sudo tee /sys/power/pm_print_timesh]h^# echo 1 | sudo tee /sys/power/pm_debug_messages # echo 1 | sudo tee /sys/power/pm_print_times}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhK>hjhhubh)}(hAfter making those changes, the kernel will display messages that can be traced back to kernel s2idle loop code as well as display any active GPIO sources while waking up.h]hAfter making those changes, the kernel will display messages that can be traced back to kernel s2idle loop code as well as display any active GPIO sources while waking up.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjhhubh)}(hIf the wakeup is caused by the ACPI SCI, additional ACPI debugging may be needed. These commands can enable additional trace data: ::h]hIf the wakeup is caused by the ACPI SCI, additional ACPI debugging may be needed. These commands can enable additional trace data:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjhhubj )}(hX # echo enable | sudo tee /sys/module/acpi/parameters/trace_state # echo 1 | sudo tee /sys/module/acpi/parameters/aml_debug_output # echo 0x0800000f | sudo tee /sys/module/acpi/parameters/debug_level # echo 0xffff0000 | sudo tee /sys/module/acpi/parameters/debug_layerh]hX # echo enable | sudo tee /sys/module/acpi/parameters/trace_state # echo 1 | sudo tee /sys/module/acpi/parameters/aml_debug_output # echo 0x0800000f | sudo tee /sys/module/acpi/parameters/debug_level # echo 0xffff0000 | sudo tee /sys/module/acpi/parameters/debug_layer}hj6sbah}(h]h ]h"]h$]h&]hhuh1j hhhKHhjhhubeh}(h]#spurious-s2idle-wakeups-from-an-irqah ]h"]#spurious s2idle wakeups from an irqah$]h&]uh1hhhhhhhhK6ubh)}(hhh](h)}(h#Spurious s2idle wakeups from a GPIOh]h#Spurious s2idle wakeups from a GPIO}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhhhhhKNubh)}(hXIf a GPIO is active when waking up the system ideally you would look at the schematic to determine what device it is associated with. If the schematic is not available, another tactic is to look at the ACPI _EVT() entry to determine what device is notified when that GPIO is active.h]hXIf a GPIO is active when waking up the system ideally you would look at the schematic to determine what device it is associated with. If the schematic is not available, another tactic is to look at the ACPI _EVT() entry to determine what device is notified when that GPIO is active.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjLhhubh)}(hFor a hypothetical example, say that GPIO 59 woke up the system. You can look at the SSDT to determine what device is notified when GPIO 59 is active.h]hFor a hypothetical example, say that GPIO 59 woke up the system. You can look at the SSDT to determine what device is notified when GPIO 59 is active.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjLhhubh)}(h*First convert the GPIO number into hex. ::h]h'First convert the GPIO number into hex.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjLhhubj )}(h"$ python3 -c "print(hex(59))" 0x3bh]h"$ python3 -c "print(hex(59))" 0x3b}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhKZhjLhhubh)}(hGNext determine which ACPI table has the ``_EVT`` entry. For example: ::h](h(Next determine which ACPI table has the }(hjhhhNhNubj )}(h``_EVT``h]h_EVT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh entry. For example:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hjLhhubj )}(hk$ sudo grep EVT /sys/firmware/acpi/tables/SSDT* grep: /sys/firmware/acpi/tables/SSDT27: binary file matchesh]hk$ sudo grep EVT /sys/firmware/acpi/tables/SSDT* grep: /sys/firmware/acpi/tables/SSDT27: binary file matches}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhK_hjLhhubh)}(hDecode this table::h]hDecode this table:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjLhhubj )}(hB$ sudo cp /sys/firmware/acpi/tables/SSDT27 . $ sudo iasl -d SSDT27h]hB$ sudo cp /sys/firmware/acpi/tables/SSDT27 . $ sudo iasl -d SSDT27}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhKdhjLhhubh)}(hDThen look at the table and find the matching entry for GPIO 0x3b. ::h]hAThen look at the table and find the matching entry for GPIO 0x3b.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjLhhubj )}(hCase (0x3B) { M000 (0x393B) M460 (" Notify (\\_SB.PCI0.GP17.XHC1, 0x02)\n", Zero, Zero, Zero, Zero, Zero, Zero) Notify (\_SB.PCI0.GP17.XHC1, 0x02) // Device Wake }h]hCase (0x3B) { M000 (0x393B) M460 (" Notify (\\_SB.PCI0.GP17.XHC1, 0x02)\n", Zero, Zero, Zero, Zero, Zero, Zero) Notify (\_SB.PCI0.GP17.XHC1, 0x02) // Device Wake }}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhKihjLhhubh)}(hYou can see in this case that the device ``\_SB.PCI0.GP17.XHC1`` is notified when GPIO 59 is active. It's obvious this is an XHCI controller, but to go a step further you can figure out which XHCI controller it is by matching it to ACPI.::h](h)You can see in this case that the device }(hjhhhNhNubj )}(h``\_SB.PCI0.GP17.XHC1``h]h\_SB.PCI0.GP17.XHC1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh is notified when GPIO 59 is active. It’s obvious this is an XHCI controller, but to go a step further you can figure out which XHCI controller it is by matching it to ACPI.:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKphjLhhubj )}(hX$ grep "PCI0.GP17.XHC1" /sys/bus/acpi/devices/*/path /sys/bus/acpi/devices/device:2d/path:\_SB_.PCI0.GP17.XHC1 /sys/bus/acpi/devices/device:2e/path:\_SB_.PCI0.GP17.XHC1.RHUB /sys/bus/acpi/devices/device:2f/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1 /sys/bus/acpi/devices/device:30/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM0 /sys/bus/acpi/devices/device:31/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM1 /sys/bus/acpi/devices/device:32/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT2 /sys/bus/acpi/devices/LNXPOWER:0d/path:\_SB_.PCI0.GP17.XHC1.PWRSh]hX$ grep "PCI0.GP17.XHC1" /sys/bus/acpi/devices/*/path /sys/bus/acpi/devices/device:2d/path:\_SB_.PCI0.GP17.XHC1 /sys/bus/acpi/devices/device:2e/path:\_SB_.PCI0.GP17.XHC1.RHUB /sys/bus/acpi/devices/device:2f/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1 /sys/bus/acpi/devices/device:30/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM0 /sys/bus/acpi/devices/device:31/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM1 /sys/bus/acpi/devices/device:32/path:\_SB_.PCI0.GP17.XHC1.RHUB.PRT2 /sys/bus/acpi/devices/LNXPOWER:0d/path:\_SB_.PCI0.GP17.XHC1.PWRS}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhKuhjLhhubh)}(h}Here you can see it matches to ``device:2d``. Look at the ``physical_node`` to determine what PCI device that actually is. ::h](hHere you can see it matches to }(hj)hhhNhNubj )}(h ``device:2d``h]h device:2d}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubh. Look at the }(hj)hhhNhNubj )}(h``physical_node``h]h physical_node}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubh/ to determine what PCI device that actually is.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK~hjLhhubj )}(h$ ls -l /sys/bus/acpi/devices/device:2d/physical_node lrwxrwxrwx 1 root root 0 Feb 12 13:22 /sys/bus/acpi/devices/device:2d/physical_node -> ../../../../../pci0000:00/0000:00:08.1/0000:c2:00.4h]h$ ls -l /sys/bus/acpi/devices/device:2d/physical_node lrwxrwxrwx 1 root root 0 Feb 12 13:22 /sys/bus/acpi/devices/device:2d/physical_node -> ../../../../../pci0000:00/0000:00:08.1/0000:c2:00.4}hj[sbah}(h]h ]h"]h$]h&]hhuh1j hhhKhjLhhubh)}(h[So there you have it: the PCI device associated with this GPIO wakeup was ``0000:c2:00.4``.h](hJSo there you have it: the PCI device associated with this GPIO wakeup was }(hjihhhNhNubj )}(h``0000:c2:00.4``h]h 0000:c2:00.4}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjiubh.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjLhhubh)}(hJThe ``amd_s2idle.py`` script will capture most of these artifacts for you.h](hThe }(hjhhhNhNubj )}(h``amd_s2idle.py``h]h amd_s2idle.py}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh5 script will capture most of these artifacts for you.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjLhhubeh}(h]#spurious-s2idle-wakeups-from-a-gpioah ]h"]#spurious s2idle wakeups from a gpioah$]h&]uh1hhhhhhhhKNubh)}(hhh](h)}(hs2idle PM debug messagesh]hs2idle PM debug messages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX-During the s2idle flow on AMD systems, the ACPI LPS0 driver is responsible to check all uPEP constraints. Failing uPEP constraints does not prevent s0i3 entry. This means that if some constraints are not met, it is possible the kernel may attempt to enter s2idle even if there are some known issues.h]hX-During the s2idle flow on AMD systems, the ACPI LPS0 driver is responsible to check all uPEP constraints. Failing uPEP constraints does not prevent s0i3 entry. This means that if some constraints are not met, it is possible the kernel may attempt to enter s2idle even if there are some known issues.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX,To activate PM debugging, either specify ``pm_debug_messagess`` kernel command-line option at boot or write to ``/sys/power/pm_debug_messages``. Unmet constraints will be displayed in the kernel log and can be viewed by logging tools that process kernel ring buffer like ``dmesg`` or ``journalctl``."h](h)To activate PM debugging, either specify }(hjhhhNhNubj )}(h``pm_debug_messagess``h]hpm_debug_messagess}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh0 kernel command-line option at boot or write to }(hjhhhNhNubj )}(h ``/sys/power/pm_debug_messages``h]h/sys/power/pm_debug_messages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh. Unmet constraints will be displayed in the kernel log and can be viewed by logging tools that process kernel ring buffer like }(hjhhhNhNubj )}(h ``dmesg``h]hdmesg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh or }(hjhhhNhNubj )}(h``journalctl``h]h journalctl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.”}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX+If the system freezes on entry/exit before these messages are flushed, a useful debugging tactic is to unbind the ``amd_pmc`` driver to prevent notification to the platform to start s0i3 entry. This will stop the system from freezing on entry or exit and let you view all the failed constraints. ::h](hrIf the system freezes on entry/exit before these messages are flushed, a useful debugging tactic is to unbind the }(hj&hhhNhNubj )}(h ``amd_pmc``h]hamd_pmc}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&ubh driver to prevent notification to the platform to start s0i3 entry. This will stop the system from freezing on entry or exit and let you view all the failed constraints.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj )}(hDcd /sys/bus/platform/drivers/amd_pmc ls | grep AMD | sudo tee unbindh]hDcd /sys/bus/platform/drivers/amd_pmc ls | grep AMD | sudo tee unbind}hjFsbah}(h]h ]h"]h$]h&]hhuh1j hhhKhjhhubh)}(hSAfter doing this, run the suspend cycle and look specifically for errors around: ::h]hPAfter doing this, run the suspend cycle and look specifically for errors around:}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj )}(hHACPI: LPI: Constraint not met; min power state:%s current power state:%sh]hHACPI: LPI: Constraint not met; min power state:%s current power state:%s}hjbsbah}(h]h ]h"]h$]h&]hhuh1j hhhKhjhhubeh}(h]s2idle-pm-debug-messagesah ]h"]s2idle pm debug messagesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h$Historical examples of s2idle issuesh]h$Historical examples of s2idle issues}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhhhhhKubh)}(hTo help understand the types of issues that can occur and how to debug them, here are some historical examples of s2idle issues that have been resolved.h]hTo help understand the types of issues that can occur and how to debug them, here are some historical examples of s2idle issues that have been resolved.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubh)}(hhh](h)}(hCore offliningh]hCore offlining}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXAn end user had reported that taking a core offline would prevent the system from properly entering s0i3. This was debugged using internal AMD tools to capture and display a stream of metrics from the hardware showing what changed when a core was offlined. It was determined that the hardware didn't get notification the offline cores were in the deepest state, and so it prevented CPU from going into the deepest state. The issue was debugged to a missing command to put cores into C3 upon offline.h]hXAn end user had reported that taking a core offline would prevent the system from properly entering s0i3. This was debugged using internal AMD tools to capture and display a stream of metrics from the hardware showing what changed when a core was offlined. It was determined that the hardware didn’t get notification the offline cores were in the deepest state, and so it prevented CPU from going into the deepest state. The issue was debugged to a missing command to put cores into C3 upon offline.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit d6b88ce2eb9d2 ("ACPI: processor idle: Allow playing dead in C3 state") `_h](jT)}(hjh]hQcommit d6b88ce2eb9d2 (“ACPI: processor idle: Allow playing dead in C3 state”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameMcommit d6b88ce2eb9d2 ("ACPI: processor idle: Allow playing dead in C3 state")je/https://git.kernel.org/torvalds/c/d6b88ce2eb9d2uh1jShjubjh)}(h2 h]h}(h]Gcommit-d6b88ce2eb9d2-acpi-processor-idle-allow-playing-dead-in-c3-stateah ]h"]Mcommit d6b88ce2eb9d2 ("acpi: processor idle: allow playing dead in c3 state")ah$]h&]refurijuh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]core-offliningah ]h"]core offliningah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(hCorruption after resumeh]hCorruption after resume}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX`A big problem that occurred with Rembrandt was that there was graphical corruption after resume. This happened because of a misalignment of PSP and driver responsibility. The PSP will save and restore DMCUB, but the driver assumed it needed to reset DMCUB on resume. This actually was a misalignment for earlier silicon as well, but was not observed.h]hX`A big problem that occurred with Rembrandt was that there was graphical corruption after resume. This happened because of a misalignment of PSP and driver responsibility. The PSP will save and restore DMCUB, but the driver assumed it needed to reset DMCUB on resume. This actually was a misalignment for earlier silicon as well, but was not observed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit 79d6b9351f086 ("drm/amd/display: Don't reinitialize DMCUB on s0ix resume") `_h](jT)}(hjh]hWcommit 79d6b9351f086 (“drm/amd/display: Don’t reinitialize DMCUB on s0ix resume”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameQcommit 79d6b9351f086 ("drm/amd/display: Don't reinitialize DMCUB on s0ix resume")je/https://git.kernel.org/torvalds/c/79d6b9351f086uh1jShjubjh)}(h2 h]h}(h]Lcommit-79d6b9351f086-drm-amd-display-don-t-reinitialize-dmcub-on-s0ix-resumeah ]h"]Qcommit 79d6b9351f086 ("drm/amd/display: don't reinitialize dmcub on s0ix resume")ah$]h&]refurijuh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]corruption-after-resumeah ]h"]corruption after resumeah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(hBack to Back suspends failh]hBack to Back suspends fail}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hhhhhKubh)}(hWhen using a wakeup source that triggers the IRQ to wakeup, a bug in the pinctrl-amd driver may capture the wrong state of the IRQ and prevent the system going back to sleep properly.h]hWhen using a wakeup source that triggers the IRQ to wakeup, a bug in the pinctrl-amd driver may capture the wrong state of the IRQ and prevent the system going back to sleep properly.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj3hhubh)}(h`commit b8c824a869f22 ("pinctrl: amd: Don't save/restore interrupt status and wake status bits") `_h](jT)}(hjTh]hecommit b8c824a869f22 (“pinctrl: amd: Don’t save/restore interrupt status and wake status bits”)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]name_commit b8c824a869f22 ("pinctrl: amd: Don't save/restore interrupt status and wake status bits")je/https://git.kernel.org/torvalds/c/b8c824a869f22uh1jShjRubjh)}(h2 h]h}(h]Ycommit-b8c824a869f22-pinctrl-amd-don-t-save-restore-interrupt-status-and-wake-status-bitsah ]h"]_commit b8c824a869f22 ("pinctrl: amd: don't save/restore interrupt status and wake status bits")ah$]h&]refurijeuh1jgjvKhjRubeh}(h]h ]h"]h$]h&]uh1hhhhKhj3hhubeh}(h]back-to-back-suspends-failah ]h"]back to back suspends failah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(h+Spurious timer based wakeup after 5 minutesh]h+Spurious timer based wakeup after 5 minutes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe HPET was being used to program the wakeup source for the system, however this was causing a spurious wakeup after 5 minutes. The correct alarm to use was the ACPI alarm.h]hThe HPET was being used to program the wakeup source for the system, however this was causing a spurious wakeup after 5 minutes. The correct alarm to use was the ACPI alarm.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit 3d762e21d5637 ("rtc: cmos: Use ACPI alarm for non-Intel x86 systems too") `_h](jT)}(hjh]hTcommit 3d762e21d5637 (“rtc: cmos: Use ACPI alarm for non-Intel x86 systems too”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]namePcommit 3d762e21d5637 ("rtc: cmos: Use ACPI alarm for non-Intel x86 systems too")je/https://git.kernel.org/torvalds/c/3d762e21d5637uh1jShjubjh)}(h2 h]h}(h]Jcommit-3d762e21d5637-rtc-cmos-use-acpi-alarm-for-non-intel-x86-systems-tooah ]h"]Pcommit 3d762e21d5637 ("rtc: cmos: use acpi alarm for non-intel x86 systems too")ah$]h&]refurijuh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]+spurious-timer-based-wakeup-after-5-minutesah ]h"]+spurious timer based wakeup after 5 minutesah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(hDisk disappears after resumeh]hDisk disappears after resume}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hAfter resuming from s2idle, the NVME disk would disappear. This was due to the BIOS not specifying the _DSD StorageD3Enable property. This caused the NVME driver not to put the disk into the expected state at suspend and to fail on resume.h]hAfter resuming from s2idle, the NVME disk would disappear. This was due to the BIOS not specifying the _DSD StorageD3Enable property. This caused the NVME driver not to put the disk into the expected state at suspend and to fail on resume.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit e79a10652bbd3 ("ACPI: x86: Force StorageD3Enable on more products") `_h](jT)}(hjh]hNcommit e79a10652bbd3 (“ACPI: x86: Force StorageD3Enable on more products”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameJcommit e79a10652bbd3 ("ACPI: x86: Force StorageD3Enable on more products")je/https://git.kernel.org/torvalds/c/e79a10652bbd3uh1jShjubjh)}(h2 h]h}(h]Dcommit-e79a10652bbd3-acpi-x86-force-storaged3enable-on-more-productsah ]h"]Jcommit e79a10652bbd3 ("acpi: x86: force storaged3enable on more products")ah$]h&]refurijuh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]disk-disappears-after-resumeah ]h"]disk disappears after resumeah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(h Spurious IRQ1h]h Spurious IRQ1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hA number of Renoir, Lucienne, Cezanne, & Barcelo platforms have a platform firmware bug where IRQ1 is triggered during s0i3 resume.h]hA number of Renoir, Lucienne, Cezanne, & Barcelo platforms have a platform firmware bug where IRQ1 is triggered during s0i3 resume.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hsThis was fixed in the platform firmware, but a number of systems didn't receive any more platform firmware updates.h]huThis was fixed in the platform firmware, but a number of systems didn’t receive any more platform firmware updates.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN") `_h](jT)}(hjLh]hRcommit 8e60615e89321 (“platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN”)}(hjNhhhNhNubah}(h]h ]h"]h$]h&]nameNcommit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN")je/https://git.kernel.org/torvalds/c/8e60615e89321uh1jShjJubjh)}(h2 h]h}(h]Hcommit-8e60615e89321-platform-x86-amd-pmc-disable-irq1-wakeup-for-rn-cznah ]h"]Ncommit 8e60615e89321 ("platform/x86/amd: pmc: disable irq1 wakeup for rn/czn")ah$]h&]refurij]uh1jgjvKhjJubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] spurious-irq1ah ]h"] spurious irq1ah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(hHardware timeouth]hHardware timeout}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhhhhhKubh)}(hThe hardware performs many actions besides accepting the values from amd-pmc driver. As the communication path with the hardware is a mailbox, it's possible that it might not respond quickly enough. This issue manifested as a failure to suspend: ::h]hThe hardware performs many actions besides accepting the values from amd-pmc driver. As the communication path with the hardware is a mailbox, it’s possible that it might not respond quickly enough. This issue manifested as a failure to suspend:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyhhubj )}(hPM: dpm_run_callback(): acpi_subsys_suspend_noirq+0x0/0x50 returns -110 amd_pmc AMDI0005:00: PM: failed to suspend noirq: error -110h]hPM: dpm_run_callback(): acpi_subsys_suspend_noirq+0x0/0x50 returns -110 amd_pmc AMDI0005:00: PM: failed to suspend noirq: error -110}hjsbah}(h]h ]h"]h$]h&]hhuh1j hhhKhjyhhubh)}(hKThe timing problem was identified by comparing the values of the idle mask.h]hKThe timing problem was identified by comparing the values of the idle mask.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjyhhubh)}(h`commit 3c3c8e88c8712 ("platform/x86: amd-pmc: Increase the response register timeout") `_h](jT)}(hjh]hZcommit 3c3c8e88c8712 (“platform/x86: amd-pmc: Increase the response register timeout”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameVcommit 3c3c8e88c8712 ("platform/x86: amd-pmc: Increase the response register timeout")je/https://git.kernel.org/torvalds/c/3c3c8e88c8712uh1jShjubjh)}(h2 h]h}(h]Pcommit-3c3c8e88c8712-platform-x86-amd-pmc-increase-the-response-register-timeoutah ]h"]Vcommit 3c3c8e88c8712 ("platform/x86: amd-pmc: increase the response register timeout")ah$]h&]refurijuh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjyhhubeh}(h]hardware-timeoutah ]h"]hardware timeoutah$]h&]uh1hhjxhhhhhKubh)}(hhh](h)}(h2Failed to reach hardware sleep state with panel onh]h2Failed to reach hardware sleep state with panel on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hOn some Strix systems certain panels were observed to block the system from entering a hardware sleep state if the internal panel was on during the sequence.h]hOn some Strix systems certain panels were observed to block the system from entering a hardware sleep state if the internal panel was on during the sequence.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hEven though the panel got turned off during suspend it exposed a timing problem where an interrupt caused the display hardware to wake up and block low power state entry.h]hEven though the panel got turned off during suspend it exposed a timing problem where an interrupt caused the display hardware to wake up and block low power state entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`commit 40b8c14936bd2 ("drm/amd/display: Disable unneeded hpd interrupts during dm_init") `_h](jT)}(hjh]h\commit 40b8c14936bd2 (“drm/amd/display: Disable unneeded hpd interrupts during dm_init”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameXcommit 40b8c14936bd2 ("drm/amd/display: Disable unneeded hpd interrupts during dm_init")je/https://git.kernel.org/torvalds/c/40b8c14936bd2uh1jShjubjh)}(h2 h]h}(h]Scommit-40b8c14936bd2-drm-amd-display-disable-unneeded-hpd-interrupts-during-dm-initah ]h"]Xcommit 40b8c14936bd2 ("drm/amd/display: disable unneeded hpd interrupts during dm_init")ah$]h&]refurij#uh1jgjvKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]2failed-to-reach-hardware-sleep-state-with-panel-onah ]h"]2failed to reach hardware sleep state with panel onah$]h&]uh1hhjxhhhhhKubeh}(h]$historical-examples-of-s2idle-issuesah ]h"]$historical examples of s2idle issuesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Runtime power consumption issuesh]h Runtime power consumption issues}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhhhhhKubh)}(hRuntime power consumption is influenced by many factors, including but not limited to the configuration of the PCIe Active State Power Management (ASPM), the display brightness, the EPP policy of the CPU, and the power management of the devices.h]hRuntime power consumption is influenced by many factors, including but not limited to the configuration of the PCIe Active State Power Management (ASPM), the display brightness, the EPP policy of the CPU, and the power management of the devices.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjGhhubh)}(hhh](h)}(hASPMh]hASPM}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhhhhhMubh)}(hX0For the best runtime power consumption, ASPM should be programmed as intended by the BIOS from the hardware vendor. To accomplish this the Linux kernel should be compiled with ``CONFIG_PCIEASPM_DEFAULT`` set to ``y`` and the sysfs file ``/sys/module/pcie_aspm/parameters/policy`` should not be modified.h](hFor the best runtime power consumption, ASPM should be programmed as intended by the BIOS from the hardware vendor. To accomplish this the Linux kernel should be compiled with }(hjwhhhNhNubj )}(h``CONFIG_PCIEASPM_DEFAULT``h]hCONFIG_PCIEASPM_DEFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjwubh set to }(hjwhhhNhNubj )}(h``y``h]hy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjwubh and the sysfs file }(hjwhhhNhNubj )}(h+``/sys/module/pcie_aspm/parameters/policy``h]h'/sys/module/pcie_aspm/parameters/policy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjwubh should not be modified.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjfhhubh)}(h{Most notably, if L1.2 is not configured properly for any devices, the SoC will not be able to enter the deepest idle state.h]h{Most notably, if L1.2 is not configured properly for any devices, the SoC will not be able to enter the deepest idle state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjfhhubeh}(h]aspmah ]h"]aspmah$]h&]uh1hhjGhhhhhMubh)}(hhh](h)}(h EPP Policyh]h EPP Policy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hThe ``energy_performance_preference`` sysfs file can be used to set a bias of efficiency or performance for a CPU. This has a direct relationship on the battery life when more heavily biased towards performance.h](hThe }(hjhhhNhNubj )}(h!``energy_performance_preference``h]henergy_performance_preference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh sysfs file can be used to set a bias of efficiency or performance for a CPU. This has a direct relationship on the battery life when more heavily biased towards performance.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h] epp-policyah ]h"] epp policyah$]h&]uh1hhjGhhhhhMubeh}(h] runtime-power-consumption-issuesah ]h"] runtime power consumption issuesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hBIOS debug messagesh]hBIOS debug messages}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hMost OEM machines don't have a serial UART for outputting kernel or BIOS debug messages. However BIOS debug messages are useful for understanding both BIOS bugs and bugs with the Linux kernel drivers that call BIOS AML.h]hMost OEM machines don’t have a serial UART for outputting kernel or BIOS debug messages. However BIOS debug messages are useful for understanding both BIOS bugs and bugs with the Linux kernel drivers that call BIOS AML.}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hAs the BIOS on most OEM AMD systems are based off an AMD reference BIOS, the infrastructure used for exporting debugging messages is often the same as AMD reference BIOS.h]hAs the BIOS on most OEM AMD systems are based off an AMD reference BIOS, the infrastructure used for exporting debugging messages is often the same as AMD reference BIOS.}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hhh](h)}(hManually Parsingh]hManually Parsing}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj? hhhhhM!ubh)}(hThere is generally an ACPI method ``\M460`` that different paths of the AML will call to emit a message to the BIOS serial log. This method takes 7 arguments, with the first being a string and the rest being optional integers::h](h"There is generally an ACPI method }(hjP hhhNhNubj )}(h ``\M460``h]h\M460}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjP ubh that different paths of the AML will call to emit a message to the BIOS serial log. This method takes 7 arguments, with the first being a string and the rest being optional integers:}(hjP hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM"hj? hhubj )}(hMethod (M460, 7, Serialized)h]hMethod (M460, 7, Serialized)}hjp sbah}(h]h ]h"]h$]h&]hhuh1j hhhM'hj? hhubh)}(hKHere is an example of a string that BIOS AML may call out using ``\M460``::h](h@Here is an example of a string that BIOS AML may call out using }(hj~ hhhNhNubj )}(h ``\M460``h]h\M460}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj~ ubh:}(hj~ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM)hj? hhubj )}(hdM460 (" OEM-ASL-PCIe Address (0x%X)._REG (%d %d) PCSA = %d\n", DADR, Arg0, Arg1, PCSA, Zero, Zero)h]hdM460 (" OEM-ASL-PCIe Address (0x%X)._REG (%d %d) PCSA = %d\n", DADR, Arg0, Arg1, PCSA, Zero, Zero)}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhM+hj? hhubh)}(hXgNormally when executed, the ``\M460`` method would populate the additional arguments into the string. In order to get these messages from the Linux kernel a hook has been added into ACPICA that can capture the *arguments* sent to ``\M460`` and print them to the kernel ring buffer. For example the following message could be emitted into kernel ring buffer::h](hNormally when executed, the }(hj hhhNhNubj )}(h ``\M460``h]h\M460}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh method would populate the additional arguments into the string. In order to get these messages from the Linux kernel a hook has been added into ACPICA that can capture the }(hj hhhNhNubj2)}(h *arguments*h]h arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj ubh sent to }(hj hhhNhNubj )}(h ``\M460``h]h\M460}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhv and print them to the kernel ring buffer. For example the following message could be emitted into kernel ring buffer:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM-hj? hhubj )}(hxextrace-0174 ex_trace_args : " OEM-ASL-PCIe Address (0x%X)._REG (%d %d) PCSA = %d\n", ec106000, 2, 1, 1, 0, 0h]hxextrace-0174 ex_trace_args : " OEM-ASL-PCIe Address (0x%X)._REG (%d %d) PCSA = %d\n", ec106000, 2, 1, 1, 0, 0}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhM3hj? hhubh)}(hIn order to get these messages, you need to compile with ``CONFIG_ACPI_DEBUG`` and then turn on the following ACPICA tracing parameters. This can be done either on the kernel command line or at runtime:h](h9In order to get these messages, you need to compile with }(hj hhhNhNubj )}(h``CONFIG_ACPI_DEBUG``h]hCONFIG_ACPI_DEBUG}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh| and then turn on the following ACPICA tracing parameters. This can be done either on the kernel command line or at runtime:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM5hj? hhubh bullet_list)}(hhh](h list_item)}(h ``acpi.trace_method_name=\M460``h]h)}(hj' h]j )}(h ``acpi.trace_method_name=\M460``h]hacpi.trace_method_name=\M460}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj) ubah}(h]h ]h"]h$]h&]uh1hhhhM9hj% ubah}(h]h ]h"]h$]h&]uh1j# hj hhhhhNubj$ )}(h``acpi.trace_state=method`` h]h)}(h``acpi.trace_state=method``h]j )}(hjL h]hacpi.trace_state=method}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJ ubah}(h]h ]h"]h$]h&]uh1hhhhM:hjF ubah}(h]h ]h"]h$]h&]uh1j# hj hhhhhNubeh}(h]h ]h"]h$]h&]bulletjuh1j hhhM9hj? hhubh)}(hNOTE: These can be very noisy at bootup. If you turn these parameters on the kernel command, please also consider turning up ``CONFIG_LOG_BUF_SHIFT`` to a larger size such as 17 to avoid losing early boot messages.h](h}NOTE: These can be very noisy at bootup. If you turn these parameters on the kernel command, please also consider turning up }(hjn hhhNhNubj )}(h``CONFIG_LOG_BUF_SHIFT``h]hCONFIG_LOG_BUF_SHIFT}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjn ubhA to a larger size such as 17 to avoid losing early boot messages.}(hjn hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM<hj? hhubeh}(h]manually-parsingah ]h"]manually parsingah$]h&]uh1hhj hhhhhM!ubh)}(hhh](h)}(hTool assisted Parsingh]hTool assisted Parsing}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMAubh)}(hX As mentioned above, parsing by hand can be tedious, especially with a lot of messages. To help with this, a tool has been created at `amd-debug-tools `_ to help parse the messages.h](hAs mentioned above, parsing by hand can be tedious, especially with a lot of messages. To help with this, a tool has been created at }(hj hhhNhNubjT)}(hg`amd-debug-tools `_h]hamd-debug-tools}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameamd-debug-toolsjeRhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jShj ubjh)}(hU h]h}(h]id1ah ]h"]h$]amd-debug-toolsah&]refurij uh1jgjvKhj ubh to help parse the messages.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMBhj hhubeh}(h]tool-assisted-parsingah ]h"]tool assisted parsingah$]h&]uh1hhj hhhhhMAubeh}(h]bios-debug-messagesah ]h"]bios debug messagesah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hRandom reboot issuesh]hRandom reboot issues}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMHubh)}(hWhen a random reboot occurs, the high-level reason for the reboot is stored in a register that will persist onto the next boot.h]hWhen a random reboot occurs, the high-level reason for the reboot is stored in a register that will persist onto the next boot.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhj hhubhdefinition_list)}(hhh]hdefinition_list_item)}(hThere are 6 classes of reasons for the reboot: * Software induced * Power state transition * Pin induced * Hardware induced * Remote reset * Internal CPU event h](hterm)}(h.There are 6 classes of reasons for the reboot:h]h.There are 6 classes of reasons for the reboot:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMShj ubh definition)}(hhh]j )}(hhh](j$ )}(hSoftware inducedh]h)}(hj+ h]hSoftware induced}(hj- hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMNhj) ubah}(h]h ]h"]h$]h&]uh1j# hj& ubj$ )}(hPower state transitionh]h)}(hjB h]hPower state transition}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhj@ ubah}(h]h ]h"]h$]h&]uh1j# hj& ubj$ )}(h Pin inducedh]h)}(hjY h]h Pin induced}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhjW ubah}(h]h ]h"]h$]h&]uh1j# hj& ubj$ )}(hHardware inducedh]h)}(hjp h]hHardware induced}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMQhjn ubah}(h]h ]h"]h$]h&]uh1j# hj& ubj$ )}(h Remote reseth]h)}(hj h]h Remote reset}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhj ubah}(h]h ]h"]h$]h&]uh1j# hj& ubj$ )}(hInternal CPU event h]h)}(hInternal CPU eventh]hInternal CPU event}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShj ubah}(h]h ]h"]h$]h&]uh1j# hj& ubeh}(h]h ]h"]h$]h&]jm juh1j hhhMNhj# ubah}(h]h ]h"]h$]h&]uh1j! hj ubeh}(h]h ]h"]h$]h&]uh1j hhhMShj ubah}(h]h ]h"]h$]h&]uh1j hj hhhNhNubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthK!uh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthK!uh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthK!uh1j hj ubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hBith]hBit}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hTypeh]hType}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hReasonh]hReason}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0 ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hj ubhtbody)}(hhh](j )}(hhh](j )}(hhh]h)}(h0h]h0}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ ubah}(h]h ]h"]h$]h&]uh1j hjX ubj )}(hhh]h)}(hPinh]hPin}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjr ubah}(h]h ]h"]h$]h&]uh1j hjX ubj )}(hhh]h)}(h&thermal pin BP_THERMTRIP_L was trippedh]h&thermal pin BP_THERMTRIP_L was tripped}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjX ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h1h]h1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hPinh]hPin}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h&power button was pressed for 4 secondsh]h&power button was pressed for 4 seconds}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h2h]h2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hPinh]hPin}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hshutdown pin was trippedh]hshutdown pin was tripped}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj% ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h4h]h4}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1j hjB ubj )}(hhh]h)}(hRemoteh]hRemote}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj\ ubah}(h]h ]h"]h$]h&]uh1j hjB ubj )}(hhh]h)}(h)remote ASF power off command was receivedh]h)remote ASF power off command was received}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjs ubah}(h]h ]h"]h$]h&]uh1j hjB ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h9h]h9}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hInternalh]hInternal}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h&internal CPU thermal limit was trippedh]h&internal CPU thermal limit was tripped}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h16h]h16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hPinh]hPin}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h)system reset pin BP_SYS_RST_L was trippedh]h)system reset pin BP_SYS_RST_L was tripped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h17h]h17}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ubah}(h]h ]h"]h$]h&]uh1j hj,ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFubah}(h]h ]h"]h$]h&]uh1j hj,ubj )}(hhh]h)}(hsoftware issued PCI reseth]hsoftware issued PCI reset}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj]ubah}(h]h ]h"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h18h]h18}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubah}(h]h ]h"]h$]h&]uh1j hjzubj )}(hhh]h)}(hSoftwareh]hSoftware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjzubj )}(hhh]h)}(h2software wrote 0x4 to reset control register 0xCF9h]h2software wrote 0x4 to reset control register 0xCF9}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjzubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h19h]h19}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hSoftwareh]hSoftware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h2software wrote 0x6 to reset control register 0xCF9h]h2software wrote 0x6 to reset control register 0xCF9}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h20h]h20}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h2software wrote 0xE to reset control register 0xCF9h]h2software wrote 0xE to reset control register 0xCF9}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjGubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h21h]h21}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjgubah}(h]h ]h"]h$]h&]uh1j hjdubj )}(hhh]h)}(h ACPI-stateh]h ACPI-state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj~ubah}(h]h ]h"]h$]h&]uh1j hjdubj )}(hhh]h)}(h$ACPI power state transition occurredh]h$ACPI power state transition occurred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjdubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h22h]h22}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hPinh]hPin}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h'keyboard reset pin KB_RST_L was trippedh]h'keyboard reset pin KB_RST_L was tripped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h23h]h23}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hInternalh]hInternal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h$internal CPU shutdown event occurredh]h$internal CPU shutdown event occurred}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj1ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h24h]h24}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjQubah}(h]h ]h"]h$]h&]uh1j hjNubj )}(hhh]h)}(hHardwareh]hHardware}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhubah}(h]h ]h"]h$]h&]uh1j hjNubj )}(hhh]h)}(h6system failed to boot before failed boot timer expiredh]h6system failed to boot before failed boot timer expired}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjNubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h25h]h25}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hHardwareh]hHardware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hhardware watchdog timer expiredh]hhardware watchdog timer expired}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h26h]h26}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hRemoteh]hRemote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h%remote ASF reset command was receivedh]h%remote ASF reset command was received}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h27h]h27}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;ubah}(h]h ]h"]h$]h&]uh1j hj8ubj )}(hhh]h)}(hInternalh]hInternal}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjRubah}(h]h ]h"]h$]h&]uh1j hj8ubj )}(hhh]h)}(h:an uncorrected error caused a data fabric sync flood eventh]h:an uncorrected error caused a data fabric sync flood event}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjiubah}(h]h ]h"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h29h]h29}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hInternalh]hInternal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(h'FCH and MP1 failed warm reset handshakeh]h'FCH and MP1 failed warm reset handshake}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h30h]h30}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(hInternalh]hInternal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hhh]h)}(ha parity error occurredh]ha parity error occurred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h31h]h31}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj%ubah}(h]h ]h"]h$]h&]uh1j hj"ubj )}(hhh]h)}(hInternalh]hInternal}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj<ubah}(h]h ]h"]h$]h&]uh1j hj"ubj )}(hhh]h)}(h$a software sync flood event occurredh]h$a software sync flood event occurred}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjSubah}(h]h ]h"]h$]h&]uh1j hj"ubeh}(h]h ]h"]h$]h&]uh1j hjU ubeh}(h]h ]h"]h$]h&]uh1jS hj ubeh}(h]h ]h"]h$]h&]colsKuh1j hj ubah}(h]h ]h"]h$]h&]alignleftuh1j hj hhhhhNubh)}(hThis information is read by the kernel at bootup and printed into the syslog. When a random reboot occurs this message can be helpful to determine the next component to debug.h]hThis information is read by the kernel at bootup and printed into the syslog. When a random reboot occurs this message can be helpful to determine the next component to debug.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMnhj hhubeh}(h]random-reboot-issuesah ]h"]random reboot issuesah$]h&]uh1hhhhhhhhMHubeh}(h]debugging-amd-zen-systemsah ]h"]debugging amd zen systemsah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj footnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjhhj7j4jjjrjojjjIjFjjjujrjDjAjjjjj0j-j!jj~j{jojljjjjjjj jjvjsjgjdjjjjj<j9j-j*j j jjj j j j j j j j jju nametypes}(jhj7jjrjjIjjujDjjj0j!j~jojjjj jvjgjjj<j-j jj j j j juh}(jhhhj4hjj:jojijjjFjjjLjrjjAjxjjjjj-jjjj{j3jljfjjjjjjjjjsjjdj^jjyjjj9jj*j$j jGjjfj jj j j j? j j j j jj u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]hsystem_message)}(hhh]h)}(h2Duplicate explicit target name: "amd-debug-tools".h]h6Duplicate explicit target name: “amd-debug-tools”.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)ubah}(h]h ]h"]h$]h&]j alevelKtypeINFOsourcehlineKuh1j'hj hhhhhMEubatransform_messages] transformerN include_log] decorationNhhub.