<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">2025年1月9日 00:33,Mario Limonciello <<a href="mailto:mario.limonciello@amd.com" class="">mario.limonciello@amd.com</a>> 写道:</div><br class="Apple-interchange-newline"><div class=""><meta charset="UTF-8" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">On 1/8/2025 07:59, Jiang Liu wrote:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Subject: [RFC PATCH 00/13] Enhance device state machine to better support suspend/resume<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">I'm not sure how this happened, but your subject didn't end up in the subject of the thread on patch 0 so the thread just looks like an unsubjected thread.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""></div></blockquote><div>Maybe it’s caused by one extra blank line at the header.</div><br class=""><blockquote type="cite" class=""><div class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Recently we were testing suspend/resume functionality with AMD GPUs,<br class="">we have encountered several resource tracking related bugs, such as<br class="">double buffer free, use after free and unbalanced irq reference count.<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Can you share more aobut how you were hitting these issues?  Are they specific to S3 or to s2idle flows?  dGPU or APU?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Are they only with SRIOV?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Is there anything to do with the host influencing the failures to happen, or are you contriving the failures to find the bugs?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">I know we've had some reports about resource tracking warnings on the reset flows, but I haven't heard much about suspend/resume.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""></div></blockquote><div>We are investigating to develop some advanced product features based on amdgpu suspend/resume.</div><div>So we started by tested the suspend/resume functionality of AMD 308x GPUs with the following simple script:</div><div>```</div><div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">echo</span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class=""> platform </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">></span><span style="font-variant-ligatures: no-common-ligatures" class=""> /sys/power/pm_test</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #2eaebb" class="">i</span><span style="font-variant-ligatures: no-common-ligatures" class="">=</span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class="">0</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo; color: rgb(193, 101, 28);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">while true; do</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">echo</span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class=""> mem </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">></span><span style="font-variant-ligatures: no-common-ligatures" class=""> /sys/power/state</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #2eaebb" class="">i</span><span style="font-variant-ligatures: no-common-ligatures" class="">=i+</span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class="">1</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">echo</span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #c814c9" class="">$i</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #c1651c" class="">sleep</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #b42419" class="">1</span></div><div style="margin: 0px; font-stretch: normal; font-size: 24px; line-height: normal; font-family: Menlo; color: rgb(193, 101, 28);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">done</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class="">```</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class="">It succeeds with the first and second iteration but always fails on following iterations on a bare metal servers with eight MI308X GPUs.</div><div class="">With some investigation we found that the gpu asic should be reset during the test, so we submitted a patch to fix the failure (<a href="https://github.com/ROCm/ROCK-Kernel-Driver/pull/181" class="">https://github.com/ROCm/ROCK-Kernel-Driver/pull/181</a>)</div><div class=""><br class=""></div><div class="">During analyze and root-cause the failure, we have encountered several crashes, resource leakages and false alarms.</div><div class="">So I have worked out patch sets to solve issues we encountered. The other patch set is <a href="https://lists.freedesktop.org/archives/amd-gfx/2025-January/118484.html" class="">https://lists.freedesktop.org/archives/amd-gfx/2025-January/118484.html</a></div><div class=""><br class=""></div><div class="">With sriov in single VF mode, resume always fails. Seems some contexts/vram buffers get lost during suspend and haven’t be restored on resume, so cause failure.</div><div class="">We haven’t tested sriov in multiple VFs mode yet. We need more help from AMD side to make SR work for SRIOV:)  </div></div><br class=""><blockquote type="cite" class=""><div class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">We have tried to solve these issues case by case, but found that may<br class="">not be the right way. Especially about the unbalanced irq reference<br class="">count, there will be new issues appear once we fixed the current known<br class="">issues. After analyzing related source code, we found that there may be<br class="">some fundamental implementaion flaws behind these resource tracking<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">implementation</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">issues.<br class="">The amdgpu driver has two major state machines to driver the device<br class="">management flow, one is for ip blocks, the other is for ras blocks.<br class="">The hook points defined in struct amd_ip_funcs for device setup/teardown<br class="">are symmetric, but the implementation is asymmetric, sometime even<br class="">ambiguous. The most obvious two issues we noticed are:<br class="">1) amdgpu_irq_get() are called from .late_init() but amdgpu_irq_put()<br class="">   are called from .hw_fini() instead of .early_fini().<br class="">2) the way to reset ip_bloc.status.valid/sw/hw/late_initialized doesn't<br class="">   match the way to set those flags.<br class="">When taking device suspend/resume into account, in addition to device<br class="">probe/remove, things get much more complex. Some issues arise because<br class="">many suspend/resume implementations directly reuse .hw_init/.hw_fini/<br class="">.late_init hook points.<br class=""><br class="">So we try to fix those issues by two enhancements/refinements to current<br class="">device management state machines.<br class="">The first change is to make the ip block state machine and associated<br class="">status flags work in stack-like way as below:<br class="">Callback        Status Flags<br class="">early_init:     valid = true<br class="">sw_init:        sw = true<br class="">hw_init:        hw = true<br class="">late_init:      late_initialized = true<br class="">early_fini:     late_initialized = false<br class="">hw_fini:        hw = false<br class="">sw_fini:        sw = false<br class="">late_fini:      valid = false<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">At a high level this makes sense to me, but I'd just call 'late' or 'late_init'.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Another idea if you make it stack like is to do it as a true enum for the state machine and store it all in one variable.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""></div></blockquote><div>I will add a patch to convert those bool flags into an enum.</div><div>Thanks,</div><div>Gerry</div><br class=""><blockquote type="cite" class=""><div class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 18px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Also do the same thing for ras block state machine, though it's much<br class="">more simpler.<br class="">The second change is fine tune the overall device management work<br class="">flow as below:<br class="">1. amdgpu_driver_load_kms()<br class=""><span class="Apple-tab-span" style="white-space: pre;">   </span>amdgpu_device_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_early_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].early_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.valid = true<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].sw_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.sw = true<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].hw_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.hw = true<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.late_initialized = true<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ras_blocks[i].ras_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_feature_enable_on_boot()<br class="">2. amdgpu_pmops_suspend()/amdgpu_pmops_freeze()/amdgpu_pmops_poweroff()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>amdgpu_device_suspend()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_early_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ras_blocks[i].ras_early_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_feature_disable()<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_suspend()<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_disable_all_features()<br class="">+++<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].early_fini()<br class="">+++<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.late_initialized = false<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].suspend()<br class="">3. amdgpu_pmops_resume()/amdgpu_pmops_thaw()/amdgpu_pmops_restore()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>amdgpu_device_resume()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_resume()<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].resume()<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.late_initialized = true<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ras_blocks[i].ras_late_init()<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_feature_enable_on_boot()<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_resume()<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_enable_all_features()<br class="">4. amdgpu_driver_unload_kms()<br class=""><span class="Apple-tab-span" style="white-space: pre;">   </span>amdgpu_device_fini_hw()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_early_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ras_blocks[i].ras_early_fini()<br class="">+++<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].early_fini()<br class="">+++<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.late_initialized = false<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].hw_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.hw = false<br class="">5. amdgpu_driver_release_kms()<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span>amdgpu_device_fini_sw()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_device_ip_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].sw_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.sw = false<br class="">---<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.valid = false<br class="">+++<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_fini()<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].late_fini()<br class="">+++<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.valid = false<br class="">---<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ip_blocks[i].status.late_initialized = false<br class="">---<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>amdgpu_ras_fini()<br class="">The main changes include:<br class="">1) invoke ip_blocks[i].early_fini in amdgpu_pmops_suspend().<br class="">   Currently there's only one ip block which provides `early_fini`<br class="">   callback. We have add a check of `in_s3` to keep current behavior in<br class="">   function amdgpu_dm_early_fini(). So there should be no functional<br class="">   changes.<br class="">2) set ip_blocks[i].status.late_initialized to false after calling<br class="">   callback `early_fini`. We have auditted all usages of the<br class="">   late_initialized flag and no functional changes found.<br class="">3) only set ip_blocks[i].status.valid = false after calling the<br class="">   `late_fini` callback.<br class="">4) call amdgpu_ras_fini() before invoking ip_blocks[i].late_fini.<br class="">Then we try to refine each subsystem, such as nbio, asic, gfx, gmc,<br class="">ras etc, to follow the new design. Currently we have only taken the<br class="">nbio and asic as examples to show the proposed changes. Once we have<br class="">confirmed that's the right way to go, we will handle the lefting<br class="">subsystems.<br class="">This is in early stage and requesting for comments, any comments and<br class="">suggestions are welcomed!<br class="">Jiang Liu (13):<br class="">  amdgpu: wrong array index to get ip block for PSP<br class="">  drm/admgpu: add helper functions to track status for ras manager<br class="">  drm/amdgpu: add a flag to track ras debugfs creation status<br class="">  drm/amdgpu: free all resources on error recovery path of<br class="">    amdgpu_ras_init()<br class="">  drm/amdgpu: introduce a flag to track refcount held for features<br class="">  drm/amdgpu: enhance amdgpu_ras_block_late_fini()<br class="">  drm/amdgpu: enhance amdgpu_ras_pre_fini() to better support SR<br class="">  drm/admgpu: rename amdgpu_ras_pre_fini() to amdgpu_ras_early_fini()<br class="">  drm/amdgpu: make IP block state machine works in stack like way<br class="">  drm/admgpu: make device state machine work in stack like way<br class="">  drm/amdgpu/sdma: improve the way to manage irq reference count<br class="">  drm/amdgpu/nbio: improve the way to manage irq reference count<br class="">  drm/amdgpu/asic: make ip block operations symmetric by .early_fini()<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu.h           |  40 +++++<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |  37 ++++-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c       |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c      |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.c      |  16 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h      |   1 +<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |   8 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c       | 144 +++++++++++++-----<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h       |  16 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c      |  26 +++-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      |   2 +<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c       |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c       |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c      |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c       |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c       |   2 +-<br class=""> drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c        |   1 +<br class=""> drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c        |   1 +<br class=""> drivers/gpu/drm/amd/amdgpu/nv.c               |  14 +-<br class=""> drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c        |   8 -<br class=""> drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |  23 +--<br class=""> drivers/gpu/drm/amd/amdgpu/soc15.c            |  38 ++---<br class=""> drivers/gpu/drm/amd/amdgpu/soc21.c            |  35 +++--<br class=""> drivers/gpu/drm/amd/amdgpu/soc24.c            |  17 ++-<br class=""> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |   3 +<br class=""> 25 files changed, 326 insertions(+), 118 deletions(-)</blockquote></div></blockquote></div><br class=""></body></html>