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]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}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(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]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh then
}(hj hhhNhNubhemphasis)}(h*S3*h]hS3}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1j1 hj ubh is supported. If it shows }(hj hhhNhNubj )}(h``[s2idle]``h]h[s2idle]}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh then }(hj hhhNhNubj2 )}(h*s2idle*h]hs2idle}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1j1 hj ubh is
supported.}(hj hhhNhNubeh}(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 }(hjo hhhNhNubj2 )}(h*S3*h]hS3}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1j1 hjo ubhY, the firmware will be utilized to put all hardware into
the appropriate low power state.}(hjo hhhNhNubeh}(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 }(hj hhhNhNubj2 )}(h*s2idle*h]hs2idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1 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&]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 }(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&]uh1hhhhKhhhhubh)}(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 hhhhubkfigure
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 hhhhhhhK#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$hhhhubj )}(hhh]j )}(hhh]j )}(h.. kernel-figure:: resume.svg
h]h}(h]h ]h"]h$]h&]uriarch/x86/resume.svgj }j j$ suh1j hj hhhK ubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hhhhhhhK'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)}(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
}(hjK hhhNhNubh reference)}(hg`amd-debug-tools `_h]hamd-debug-tools}(hjU hhhNhNubah}(h]h ]h"]h$]h&]nameamd-debug-toolsrefuriRhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jS hjK ubhtarget)}(hU h]h}(h]amd-debug-toolsah ]h"]amd-debug-toolsah$]h&]refurijf uh1jg
referencedKhjK ubh>
that can help test for common problems and offer suggestions.}(hjK hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hj: 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 hhhNhNubjT )}(hm`drm/amd gitlab `_h]hdrm/amd gitlab}(hj hhhNhNubah}(h]h ]h"]h$]h&]namedrm/amd gitlabje Yhttps://gitlab.freedesktop.org/drm/amd/-/issues/new?issuable_template=s2idle_BUG_TEMPLATEuh1jS hj ubjh )}(h\ h]h}(h]drm-amd-gitlabah ]h"]drm/amd gitlabah$]h&]refurij uh1jg jv Khj ubh.}(hj hhhNhNubeh}(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}(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}hj6 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}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL 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.}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjL 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.}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjL hhubh)}(h*First convert the GPIO number into hex. ::h]h'First convert the GPIO number into hex.}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjL hhubj )}(h"$ python3 -c "print(hex(59))"
0x3bh]h"$ python3 -c "print(hex(59))"
0x3b}hj sbah}(h]h ]h"]h$]h&]hhuh1j
hhhKZhjL 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]hjL 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_hjL hhubh)}(hDecode this table::h]hDecode this table:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjL 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
hhhKdhjL 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&]uh1hhhhKghjL 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
hhhKihjL 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&]uh1hhhhKphjL 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
hhhKuhjL 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}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj) ubh. Look at the }(hj) hhhNhNubj )}(h``physical_node``h]h
physical_node}(hjC 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~hjL 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}hj[ sbah}(h]h ]h"]h$]h&]hhuh1j
hhhKhjL 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 }(hji hhhNhNubj )}(h``0000:c2:00.4``h]h0000:c2:00.4}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1j hji ubh.}(hji hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjL 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&]uh1hhhhKhjL 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}(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&]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}hjF 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:}(hjT 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}hjb 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&]uh1hhjx 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&]uh1hhhhKhjx 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](jT )}(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")je /https://git.kernel.org/torvalds/c/d6b88ce2eb9d2uh1jS hj ubjh )}(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 uh1jg jv Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]core-offliningah ]h"]core offliningah$]h&]uh1hhjx 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](jT )}(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")je /https://git.kernel.org/torvalds/c/79d6b9351f086uh1jS hj ubjh )}(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 uh1jg jv Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]corruption-after-resumeah ]h"]corruption after resumeah$]h&]uh1hhjx hhhhhKubh)}(hhh](h)}(hBack to Back suspends failh]hBack to Back suspends fail}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3 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.}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj3 hhubh)}(h`commit b8c824a869f22 ("pinctrl: amd: Don't save/restore interrupt status and wake status bits") `_h](jT )}(hjT h]hecommit b8c824a869f22 (“pinctrl: amd: Don’t save/restore interrupt status and wake status bits”)}(hjV hhhNhNubah}(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/b8c824a869f22uh1jS hjR ubjh )}(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&]refurije uh1jg jv KhjR ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj3 hhubeh}(h]back-to-back-suspends-failah ]h"]back to back suspends failah$]h&]uh1hhjx 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](jT )}(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")je /https://git.kernel.org/torvalds/c/3d762e21d5637uh1jS hj ubjh )}(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 uh1jg jv 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&]uh1hhjx 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](jT )}(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")je /https://git.kernel.org/torvalds/c/e79a10652bbd3uh1jS hj ubjh )}(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 uh1jg jv Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]disk-disappears-after-resumeah ]h"]disk disappears after resumeah$]h&]uh1hhjx hhhhhKubh)}(hhh](h)}(h
Spurious IRQ1h]h
Spurious IRQ1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 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.}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj 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.}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h`commit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN") `_h](jT )}(hjL h]hRcommit 8e60615e89321 (“platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN”)}(hjN hhhNhNubah}(h]h ]h"]h$]h&]nameNcommit 8e60615e89321 ("platform/x86/amd: pmc: Disable IRQ1 wakeup for RN/CZN")je /https://git.kernel.org/torvalds/c/8e60615e89321uh1jS hjJ ubjh )}(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] uh1jg jv KhjJ ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]
spurious-irq1ah ]h"]
spurious irq1ah$]h&]uh1hhjx hhhhhKubh)}(hhh](h)}(hHardware timeouth]hHardware timeout}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy 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&]uh1hhhhKhjy 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
hhhKhjy 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&]uh1hhhhKhjy hhubh)}(h`commit 3c3c8e88c8712 ("platform/x86: amd-pmc: Increase the response register timeout") `_h](jT )}(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")je /https://git.kernel.org/torvalds/c/3c3c8e88c8712uh1jS hj ubjh )}(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 uh1jg jv Khj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjy hhubeh}(h]hardware-timeoutah ]h"]hardware timeoutah$]h&]uh1hhjx 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](jT )}(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")je /https://git.kernel.org/torvalds/c/40b8c14936bd2uh1jS hj ubjh )}(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# uh1jg jv 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&]uh1hhjx 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}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG 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.}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjG hhubh)}(hhh](h)}(hASPMh]hASPM}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjf 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 }(hjw hhhNhNubj )}(h``CONFIG_PCIEASPM_DEFAULT``h]hCONFIG_PCIEASPM_DEFAULT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjw ubh set to }(hjw hhhNhNubj )}(h``y``h]hy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjw ubh and the
sysfs file }(hjw hhhNhNubj )}(h+``/sys/module/pcie_aspm/parameters/policy``h]h'/sys/module/pcie_aspm/parameters/policy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjw ubh should not be modified.}(hjw hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjf 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&]uh1hhhhMhjf hhubeh}(h]aspmah ]h"]aspmah$]h&]uh1hhjG 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&]uh1hhjG 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.}(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)}(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 hhhNhNubj2 )}(h*arguments*h]h arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1 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-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? 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&]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&]bulletj uh1j
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-toolsje Rhttps://git.kernel.org/pub/scm/linux/kernel/git/superm1/amd-debug-tools.git/about/uh1jS hj
ubjh )}(hU h]h}(h]id1ah ]h"]h$]amd-debug-toolsah&]refurij
uh1jg jv 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]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$
)}(hPin inducedh]h)}(hjY h]hPin 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$
)}(hRemote reseth]h)}(hj h]hRemote 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
j uh1j
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}(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)}(h17h]h17}(hj2 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ ubah}(h]h ]h"]h$]h&]uh1j hj, ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjF ubah}(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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj} ubah}(h]h ]h"]h$]h&]uh1j hjz ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjz 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 hjz ubeh}(h]h ]h"]h$]h&]uh1j hjU 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 hjU ubj )}(hhh](j )}(hhh]h)}(h20h]h20}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hSoftwareh]hSoftware}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0 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}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjG ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h21h]h21}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjg ubah}(h]h ]h"]h$]h&]uh1j hjd ubj )}(hhh]h)}(h
ACPI-stateh]h
ACPI-state}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj~ ubah}(h]h ]h"]h$]h&]uh1j hjd 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 hjd ubeh}(h]h ]h"]h$]h&]uh1j hjU 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 hjU 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}(hj 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}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj1 ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(hhh](j )}(hhh]h)}(h24h]h24}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjQ ubah}(h]h ]h"]h$]h&]uh1j hjN ubj )}(hhh]h)}(hHardwareh]hHardware}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjh ubah}(h]h ]h"]h$]h&]uh1j hjN 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 hjN ubeh}(h]h ]h"]h$]h&]uh1j hjU 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 hjU 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}(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)}(h27h]h27}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj; ubah}(h]h ]h"]h$]h&]uh1j hj8 ubj )}(hhh]h)}(hInternalh]hInternal}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjR ubah}(h]h ]h"]h$]h&]uh1j hj8 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}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhji ubah}(h]h ]h"]h$]h&]uh1j hj8 ubeh}(h]h ]h"]h$]h&]uh1j hjU ubj )}(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 hjU 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 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}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjS ubah}(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.}(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_sourceh_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 hhj7 j4 j j jr jo j j jI jF j j ju jr jD jA j j j j j0 j- j! j j~ j{ jo jl j j j j j j j j jv js jg jd j j j j j< j9 j- j* j j j j j j j
j
j
j
j
j
j j u nametypes}(j hj7 j jr j jI j ju jD j j j0 j! j~ jo j j j j jv jg j j j< j- j j j j
j
j
j uh}(j hhhj4 hj j: jo ji j j jF j j jL jr j jA jx j j j j j- j j j j{ j3 jl jf j j j j j j j j js j jd j^ j jy j j j9 j j* j$ j jG j jf j j j
j j
j? 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
alevelKtypeINFOsourcehlineKuh1j' hj
hhhhhMEubatransform_messages]transformerNinclude_log]
decorationNhhub.