sphinx.addnodesdocument)}( rawsource children](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 classnameNrefexplicitutagnamehhhubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/zh_TW/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/it_IT/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ja_JP/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ko_KR/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/pt_BR/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/sp_SP/arch/x86/amd-debuggingmodnameN classnameNrefexplicituh1hhhubeh}(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)}(hIntroductionh]hIntroduction}(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)}(hS3 vs s2idleh]hS3 vs s2idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(hX4 On 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 }(hj hhhNhNubhliteral)}(h``cat /sys/power/mem_sleep``h]hcat /sys/power/mem_sleep}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh. If it shows }(hj hhhNhNubj )}(h``s2idle [deep]``h]h
s2idle [deep]}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh then
}(hj hhhNhNubhemphasis)}(h*S3*h]hS3}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1jE hj ubh is supported. If it shows }(hj hhhNhNubj )}(h``[s2idle]``h]h[s2idle]}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh then }(hj hhhNhNubjF )}(h*s2idle*h]hs2idle}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1jE hj ubh is
supported.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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 }(hj hhhNhNubjF )}(h*S3*h]hS3}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jE hj ubhY, the firmware will be utilized to put all hardware into
the appropriate low power state.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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 }(hj hhhNhNubjF )}(h*s2idle*h]hs2idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jE hj ubh, 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.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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 }(hj hhhNhNubj )}(h.``cat /sys/power/suspend_stats/last_hw_sleep``h]h*cat /sys/power/suspend_stats/last_hw_sleep}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h>This flowchart explains how the AMD s2idle suspend flow works.h]h>This flowchart explains how the AMD s2idle suspend flow works.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj hhubkfigure
kernel_figure)}(hhh]hfigure)}(hhh]himage)}(h.. kernel-figure:: suspend.svg
h]h}(h]h ]h"]h$]h&]uriarch/x86/suspend.svg
candidates}*j suh1j hj hhhK ubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hj hhhhhK#ubh)}(h=This flowchart explains how the amd s2idle resume flow works.h]h=This flowchart explains how the amd s2idle resume flow works.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hj hhubj )}(hhh]j )}(hhh]j )}(h.. kernel-figure:: resume.svg
h]h}(h]h ]h"]h$]h&]uriarch/x86/resume.svgj
}j j8 suh1j hj* hhhK ubah}(h]h ]h"]h$]h&]uh1j hj' ubah}(h]h ]h"]h$]h&]uh1j hj hhhhhK'ubeh}(h]s3-vs-s2idleah ]h"]s3 vs s2idleah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hs2idle debugging toolh]hs2idle debugging tool}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN hhhhhK)ubh)}(hX As 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
}(hj_ hhhNhNubh reference)}(hg`amd-debug-tools `_h]hamd-debug-tools}(hji hhhNhNubah}(h]h ]h"]h$]h&]nameamd-debug-toolsrefuriRhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jg hj_ ubhtarget)}(hU h]h}(h]amd-debug-toolsah ]h"]amd-debug-toolsah$]h&]refurijz uh1j{
referencedKhj_ ubh>
that can help test for common problems and offer suggestions.}(hj_ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hjN hhubh)}(hX0 If 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
}(hj hhhNhNubjh )}(hm`drm/amd gitlab `_h]hdrm/amd gitlab}(hj hhhNhNubah}(h]h ]h"]h$]h&]namedrm/amd gitlabjy Yhttps://gitlab.freedesktop.org/drm/amd/-/issues/new?issuable_template=s2idle_BUG_TEMPLATEuh1jg hj ubj| )}(h\ h]h}(h]drm-amd-gitlabah ]h"]drm/amd gitlabah$]h&]refurij uh1j{ j Khj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK0hjN 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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhK6ubh)}(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 }(hj hhhNhNubj )}(h``/sys/power/pm_wakeup_irq``h]h/sys/power/pm_wakeup_irq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.
This can be matched to }(hj hhhNhNubj )}(h``/proc/interrupts``h]h/proc/interrupts}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh* to determine what device woke the system.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK8hj hhubh)}(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:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hj hhubh
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>hj hhubh)}(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.}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhj hhubh)}(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&]uh1hhhhKEhj hhubj )}(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}hjJ sbah}(h]h ]h"]h$]h&]hhuh1j hhhKHhj hhubeh}(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}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj` hhhhhKNubh)}(hX If 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]hX If 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.}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhj` hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhj` hhubh)}(h*First convert the GPIO number into hex. ::h]h'First convert the GPIO number into hex.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhj` hhubj )}(h"$ python3 -c "print(hex(59))"
0x3bh]h"$ python3 -c "print(hex(59))"
0x3b}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhKZhj` hhubh)}(hGNext determine which ACPI table has the ``_EVT`` entry. For example: ::h](h(Next determine which ACPI table has the }(hj hhhNhNubj )}(h``_EVT``h]h_EVT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh entry. For example:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hj` hhubj )}(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}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhK_hj` hhubh)}(hDecode this table::h]hDecode this table:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj` hhubj )}(hB$ sudo cp /sys/firmware/acpi/tables/SSDT27 .
$ sudo iasl -d SSDT27h]hB$ sudo cp /sys/firmware/acpi/tables/SSDT27 .
$ sudo iasl -d SSDT27}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhKdhj` hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghj` hhubj )}(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
}}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhKihj` hhubh)}(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 }(hj hhhNhNubj )}(h``\_SB.PCI0.GP17.XHC1``h]h\_SB.PCI0.GP17.XHC1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh 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.:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKphj` hhubj )}(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}hj/ sbah}(h]h ]h"]h$]h&]hhuh1j hhhKuhj` hhubh)}(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}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj= ubh. Look at the }(hj= hhhNhNubj )}(h``physical_node``h]h
physical_node}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj= ubh/
to determine what PCI device that actually is.}(hj= hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK~hj` hhubj )}(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}hjo sbah}(h]h ]h"]h$]h&]hhuh1j hhhKhj` hhubh)}(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 }(hj} hhhNhNubj )}(h``0000:c2:00.4``h]h0000:c2:00.4}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj} ubh.}(hj} hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj` hhubh)}(hJThe ``amd_s2idle.py`` script will capture most of these artifacts for you.h](hThe }(hj hhhNhNubj )}(h``amd_s2idle.py``h]h
amd_s2idle.py}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh5 script will capture most of these artifacts for you.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj` hhubeh}(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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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 }(hj hhhNhNubj )}(h``pm_debug_messagess``h]hpm_debug_messagess}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh0 kernel
command-line option at boot or write to }(hj hhhNhNubj )}(h ``/sys/power/pm_debug_messages``h]h/sys/power/pm_debug_messages}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.
Unmet constraints will be displayed in the kernel log and can be
viewed by logging tools that process kernel ring buffer like }(hj hhhNhNubj )}(h ``dmesg``h]hdmesg}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh or
}(hj hhhNhNubj )}(h``journalctl``h]h
journalctl}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.”}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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}(hjB 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&]uh1hhhhKhj hhubj )}(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}hjZ sbah}(h]h ]h"]h$]h&]hhuh1j hhhKhj hhubh)}(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:}(hjh hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj )}(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}hjv sbah}(h]h ]h"]h$]h&]hhuh1j hhhKhj hhubeh}(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&]uh1hhj hhhhhKubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hhh](h)}(hCore offliningh]hCore offlining}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(hX An 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]hX An 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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit d6b88ce2eb9d2 ("ACPI: processor idle: Allow playing dead in C3 state") `_h](jh )}(hj h]hQcommit d6b88ce2eb9d2 (“ACPI: processor idle: Allow playing dead in C3 state”)}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameMcommit d6b88ce2eb9d2 ("ACPI: processor idle: Allow playing dead in C3 state")jy /https://git.kernel.org/torvalds/c/d6b88ce2eb9d2uh1jg hj ubj| )}(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&]refurij uh1j{ j Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]core-offliningah ]h"]core offliningah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(hCorruption after resumeh]hCorruption after resume}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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.}(hj
hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit 79d6b9351f086 ("drm/amd/display: Don't reinitialize DMCUB on s0ix resume") `_h](jh )}(hj h]hWcommit 79d6b9351f086 (“drm/amd/display: Don’t reinitialize DMCUB on s0ix resume”)}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameQcommit 79d6b9351f086 ("drm/amd/display: Don't reinitialize DMCUB on s0ix resume")jy /https://git.kernel.org/torvalds/c/79d6b9351f086uh1jg hj ubj| )}(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&]refurij+ uh1j{ j Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]corruption-after-resumeah ]h"]corruption after resumeah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(hBack to Back suspends failh]hBack to Back suspends fail}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG hhhhhKubh)}(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.}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjG hhubh)}(h`commit b8c824a869f22 ("pinctrl: amd: Don't save/restore interrupt status and wake status bits") `_h](jh )}(hjh h]hecommit b8c824a869f22 (“pinctrl: amd: Don’t save/restore interrupt status and wake status bits”)}(hjj hhhNhNubah}(h]h ]h"]h$]h&]name_commit b8c824a869f22 ("pinctrl: amd: Don't save/restore interrupt status and wake status bits")jy /https://git.kernel.org/torvalds/c/b8c824a869f22uh1jg hjf ubj| )}(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&]refurijy uh1j{ j Khjf ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjG hhubeh}(h]back-to-back-suspends-failah ]h"]back to back suspends failah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(h+Spurious timer based wakeup after 5 minutesh]h+Spurious timer based wakeup after 5 minutes}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit 3d762e21d5637 ("rtc: cmos: Use ACPI alarm for non-Intel x86 systems too") `_h](jh )}(hj h]hTcommit 3d762e21d5637 (“rtc: cmos: Use ACPI alarm for non-Intel x86 systems too”)}(hj hhhNhNubah}(h]h ]h"]h$]h&]namePcommit 3d762e21d5637 ("rtc: cmos: Use ACPI alarm for non-Intel x86 systems too")jy /https://git.kernel.org/torvalds/c/3d762e21d5637uh1jg hj ubj| )}(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&]refurij uh1j{ j Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]+spurious-timer-based-wakeup-after-5-minutesah ]h"]+spurious timer based wakeup after 5 minutesah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(hDisk disappears after resumeh]hDisk disappears after resume}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit e79a10652bbd3 ("ACPI: x86: Force StorageD3Enable on more products") `_h](jh )}(hj h]hNcommit e79a10652bbd3 (“ACPI: x86: Force StorageD3Enable on more products”)}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameJcommit e79a10652bbd3 ("ACPI: x86: Force StorageD3Enable on more products")jy /https://git.kernel.org/torvalds/c/e79a10652bbd3uh1jg hj ubj| )}(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&]refurij uh1j{ j Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]disk-disappears-after-resumeah ]h"]disk disappears after resumeah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(h
Spurious IRQ1h]h
Spurious IRQ1}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1 hhhhhKubh)}(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.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj1 hhubh)}(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.}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj1 hhubh)}(h`commit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN") `_h](jh )}(hj` h]hRcommit 8e60615e89321 (“platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN”)}(hjb hhhNhNubah}(h]h ]h"]h$]h&]nameNcommit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN")jy /https://git.kernel.org/torvalds/c/8e60615e89321uh1jg hj^ ubj| )}(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&]refurijq uh1j{ j Khj^ ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj1 hhubeh}(h]
spurious-irq1ah ]h"]
spurious irq1ah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(hHardware timeouth]hHardware timeout}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj )}(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}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhKhj hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit 3c3c8e88c8712 ("platform/x86: amd-pmc: Increase the response register timeout") `_h](jh )}(hj h]hZcommit 3c3c8e88c8712 (“platform/x86: amd-pmc: Increase the response register timeout”)}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameVcommit 3c3c8e88c8712 ("platform/x86: amd-pmc: Increase the response register timeout")jy /https://git.kernel.org/torvalds/c/3c3c8e88c8712uh1jg hj ubj| )}(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&]refurij uh1j{ j Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]hardware-timeoutah ]h"]hardware timeoutah$]h&]uh1hhj hhhhhKubh)}(hhh](h)}(h2Failed to reach hardware sleep state with panel onh]h2Failed to reach hardware sleep state with panel on}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit 40b8c14936bd2 ("drm/amd/display: Disable unneeded hpd interrupts during dm_init") `_h](jh )}(hj& h]h\commit 40b8c14936bd2 (“drm/amd/display: Disable unneeded hpd interrupts during dm_init”)}(hj( hhhNhNubah}(h]h ]h"]h$]h&]nameXcommit 40b8c14936bd2 ("drm/amd/display: Disable unneeded hpd interrupts during dm_init")jy /https://git.kernel.org/torvalds/c/40b8c14936bd2uh1jg hj$ ubj| )}(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&]refurij7 uh1j{ j Khj$ ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]2failed-to-reach-hardware-sleep-state-with-panel-onah ]h"]2failed to reach hardware sleep state with panel onah$]h&]uh1hhj hhhhhKubeh}(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}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[ hhhhhKubh)}(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.}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ hhubh)}(hhh](h)}(hASPMh]hASPM}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjz hhhhhMubh)}(hX0 For 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 }(hj hhhNhNubj )}(h``CONFIG_PCIEASPM_DEFAULT``h]hCONFIG_PCIEASPM_DEFAULT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh set to }(hj hhhNhNubj )}(h``y``h]hy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh and the
sysfs file }(hj hhhNhNubj )}(h+``/sys/module/pcie_aspm/parameters/policy``h]h'/sys/module/pcie_aspm/parameters/policy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh should not be modified.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjz hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjz hhubeh}(h]aspmah ]h"]aspmah$]h&]uh1hhj[ hhhhhMubh)}(hhh](h)}(h
EPP Policyh]h
EPP Policy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(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 }(hj hhhNhNubj )}(h!``energy_performance_preference``h]henergy_performance_preference}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh 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.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]
epp-policyah ]h"]
epp policyah$]h&]uh1hhj[ hhhhhMubeh}(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.}(hj7 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.}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj& hhubh)}(hhh](h)}(hManually Parsingh]hManually Parsing}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS 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 }(hjd hhhNhNubj )}(h ``\M460``h]h\M460}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjd 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:}(hjd hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM"hjS hhubj )}(hMethod (M460, 7, Serialized)h]hMethod (M460, 7, Serialized)}hj sbah}(h]h ]h"]h$]h&]hhuh1j hhhM'hjS 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)hjS 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+hjS hhubh)}(hXg Normally 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 hhhNhNubjF )}(h*arguments*h]h arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jE hj 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-hjS 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 hhhM3hjS 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&]uh1hhhhM5hjS hhubhbullet_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&]uh1hhhhM9hj9
ubah}(h]h ]h"]h$]h&]uh1j7
hj4
hhhhhNubj8
)}(h``acpi.trace_state=method``
h]h)}(h``acpi.trace_state=method``h]j )}(hj`
h]hacpi.trace_state=method}(hjb
hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^
ubah}(h]h ]h"]h$]h&]uh1hhhhM:hjZ
ubah}(h]h ]h"]h$]h&]uh1j7
hj4
hhhhhNubeh}(h]h ]h"]h$]h&]bulletj uh1j2
hhhM9hjS 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 }(hj
hhhNhNubj )}(h``CONFIG_LOG_BUF_SHIFT``h]hCONFIG_LOG_BUF_SHIFT}(hj
hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj
ubhA
to a larger size such as 17 to avoid losing early boot messages.}(hj
hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM<hjS 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
hhhNhNubjh )}(hg`amd-debug-tools `_h]hamd-debug-tools}(hj
hhhNhNubah}(h]h ]h"]h$]h&]nameamd-debug-toolsjy Rhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jg hj
ubj| )}(hU h]h}(h]id1ah ]h"]h$]amd-debug-toolsah&]refurij
uh1j{ j Khj
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]j3
)}(hhh](j8
)}(hSoftware inducedh]h)}(hj? h]hSoftware induced}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMNhj= ubah}(h]h ]h"]h$]h&]uh1j7
hj: ubj8
)}(hPower state transitionh]h)}(hjV h]hPower state transition}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhjT ubah}(h]h ]h"]h$]h&]uh1j7
hj: ubj8
)}(hPin inducedh]h)}(hjm h]hPin induced}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhjk ubah}(h]h ]h"]h$]h&]uh1j7
hj: ubj8
)}(hHardware inducedh]h)}(hj h]hHardware induced}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMQhj ubah}(h]h ]h"]h$]h&]uh1j7
hj: ubj8
)}(hRemote reseth]h)}(hj h]hRemote reset}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhj ubah}(h]h ]h"]h$]h&]uh1j7
hj: ubj8
)}(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&]uh1j7
hj: ubeh}(h]h ]h"]h$]h&]j
j uh1j2
hhhMNhj7 ubah}(h]h ]h"]h$]h&]uh1j5 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}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hReasonh]hReason}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjD 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}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjo ubah}(h]h ]h"]h$]h&]uh1j hjl ubj )}(hhh]h)}(hPinh]hPin}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjl 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 hjl ubeh}(h]h ]h"]h$]h&]uh1j hji 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 hji 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&]uh1hhhhKhj9
ubah}(h]h ]h"]h$]h&]uh1j hj
ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h4h]h4}(hj\
hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjY
ubah}(h]h ]h"]h$]h&]uh1j hjV
ubj )}(hhh]h)}(hRemoteh]hRemote}(hjs
hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjp
ubah}(h]h ]h"]h$]h&]uh1j hjV
ubj )}(hhh]h)}(h)remote ASF power off command was receivedh]h)remote ASF power off command was received}(hj
hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj
ubah}(h]h ]h"]h$]h&]uh1j hjV
ubeh}(h]h ]h"]h$]h&]uh1j hji 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 hji 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}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj# ubah}(h]h ]h"]h$]h&]uh1j hj
ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h17h]h17}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjC ubah}(h]h ]h"]h$]h&]uh1j hj@ ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZ ubah}(h]h ]h"]h$]h&]uh1j hj@ ubj )}(hhh]h)}(hsoftware issued PCI reseth]hsoftware issued PCI reset}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjq ubah}(h]h ]h"]h$]h&]uh1j hj@ ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h18h]h18}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h2software wrote 0x4 to reset control register 0xCF9h]h2software wrote 0x4 to reset control register 0xCF9}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h19h]h19}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h2software wrote 0x6 to reset control register 0xCF9h]h2software wrote 0x6 to reset control register 0xCF9}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj
ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h20h]h20}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubah}(h]h ]h"]h$]h&]uh1j hj* ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjD ubah}(h]h ]h"]h$]h&]uh1j hj* ubj )}(hhh]h)}(h2software wrote 0xE to reset control register 0xCF9h]h2software wrote 0xE to reset control register 0xCF9}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ ubah}(h]h ]h"]h$]h&]uh1j hj* ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h21h]h21}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj{ ubah}(h]h ]h"]h$]h&]uh1j hjx ubj )}(hhh]h)}(h
ACPI-stateh]h
ACPI-state}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjx ubj )}(hhh]h)}(h$ACPI power state transition occurredh]h$ACPI power state transition occurred}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjx ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h22h]h22}(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'keyboard reset pin KB_RST_L was trippedh]h'keyboard reset pin KB_RST_L 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 hji ubj )}(hhh](j )}(hhh]h)}(h23h]h23}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hInternalh]hInternal}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj. ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h$internal CPU shutdown event occurredh]h$internal CPU shutdown event occurred}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h24h]h24}(hjh hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhje ubah}(h]h ]h"]h$]h&]uh1j hjb ubj )}(hhh]h)}(hHardwareh]hHardware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj| ubah}(h]h ]h"]h$]h&]uh1j hjb ubj )}(hhh]h)}(h6system failed to boot before failed boot timer expiredh]h6system failed to boot before failed boot timer expired}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjb ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h25h]h25}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hHardwareh]hHardware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hhardware watchdog timer expiredh]hhardware watchdog timer expired}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h26h]h26}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hRemoteh]hRemote}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h%remote ASF reset command was receivedh]h%remote ASF reset command was received}(hj2 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h27h]h27}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjO ubah}(h]h ]h"]h$]h&]uh1j hjL ubj )}(hhh]h)}(hInternalh]hInternal}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjf ubah}(h]h ]h"]h$]h&]uh1j hjL ubj )}(hhh]h)}(h:an uncorrected error caused a data fabric sync flood eventh]h:an uncorrected error caused a data fabric sync flood event}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj} ubah}(h]h ]h"]h$]h&]uh1j hjL ubeh}(h]h ]h"]h$]h&]uh1j hji ub j )}(hhh](j )}(hhh]h)}(h29h]h29}(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'FCH and MP1 failed warm reset handshakeh]h'FCH and MP1 failed warm reset handshake}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h30h]h30}(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)}(ha parity error occurredh]ha parity error occurred}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hji ubj )}(hhh](j )}(hhh]h)}(h31h]h31}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj9 ubah}(h]h ]h"]h$]h&]uh1j hj6 ubj )}(hhh]h)}(hInternalh]hInternal}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjP ubah}(h]h ]h"]h$]h&]uh1j hj6 ubj )}(hhh]h)}(h$a software sync flood event occurredh]h$a software sync flood event occurred}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjg ubah}(h]h ]h"]h$]h&]uh1j hj6 ubeh}(h]h ]h"]h$]h&]uh1j hji ubeh}(h]h ]h"]h$]h&]uh1jg 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.}(hj hhhNhNubah}(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_sourceNcurrent_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampNsource_linkN
source_urlN
toc_backlinksj footnote_backlinksK
sectnum_xformKstrip_commentsNstrip_elements_with_classesN
strip_classesNreport_levelK
halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace
language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid
dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj_destinationN
_config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabledraw_enabledKline_length_limitM'pep_referencesNpep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesNrfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlongsmart_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}(j j j j jK jH j j j j j j j] jZ j j j j jX jU j j j j jD jA j5 j2 j j j j j j j j j. j+ j j j j j{ jx j j j j jP jM jA j> j# j j j j j j
j
j
j
j
j
j j u nametypes}(j j jK j j j j] j j jX j j jD j5 j j j j j. j j j{ j j jP jA j# j j j
j
j
j uh}(j hj hjH j j jN j j} j j jZ j j j` j j jU j j j j j jA j j2 j, j jG j jz j j j j j+ j j j j j1 jx jr j j j j jM j j> j8 j j[ j jz j j j
j& j
jS j
j
j
j
j j
u
footnote_refs}
citation_refs}
autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK
id_countercollectionsCounter}j KsRparse_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
alevelKtypeINFOsourcehnjlineKuh1j; hj
hhhhhMEubatransform_messages]transformerNinclude_log]
decorationNhhub.