<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<p class="msipheader251902e5" align="Left" style="margin:0"><span style="font-size:10.0pt;font-family:Arial;color:#317100">[AMD Public Use]</span></p>
<br>
<div class="WordSection1">
<p class="MsoNormal">This prefers reset control based handling if it's implemented<o:p></o:p></p>
<p class="MsoNormal">for a particular ASIC. If not, it takes the legacy path. It uses<o:p></o:p></p>
<p class="MsoNormal">the legacy method of preparing environment (job, scheduler tasks)<o:p></o:p></p>
<p class="MsoNormal">and restoring environment.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Signed-off-by: Lijo Lazar <a href="mailto:lijo.lazar@amd.com">
lijo.lazar@amd.com</a><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  11 +--<o:p></o:p></p>
<p class="MsoNormal">drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 106 +++++++++++++++------<o:p></o:p></p>
<p class="MsoNormal">drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    |  17 +++-<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 97 insertions(+), 37 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoNormal">index 1fba89cced91..af8680727800 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></p>
<p class="MsoNormal">@@ -271,6 +271,7 @@ struct amdgpu_bo_va_mapping;<o:p></o:p></p>
<p class="MsoNormal">struct amdgpu_atif;<o:p></o:p></p>
<p class="MsoNormal">struct kfd_vm_fault_info;<o:p></o:p></p>
<p class="MsoNormal">struct amdgpu_hive_info;<o:p></o:p></p>
<p class="MsoNormal">+struct amdgpu_reset_context;<o:p></o:p></p>
<p class="MsoNormal">struct amdgpu_reset_control;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> enum amdgpu_cp_irq {<o:p></o:p></p>
<p class="MsoNormal">@@ -1079,6 +1080,7 @@ struct amdgpu_device {<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                bool                            in_pci_err_recovery;<o:p></o:p></p>
<p class="MsoNormal">               struct pci_saved_state          *pci_state;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               struct amdgpu_reset_control     *reset_cntl;<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -1131,13 +1133,10 @@ bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type);<o:p></o:p></p>
<p class="MsoNormal">bool amdgpu_device_has_dc_support(struct amdgpu_device *adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">-                                                                struct amdgpu_job *job,<o:p></o:p></p>
<p class="MsoNormal">-                                                                bool *need_full_reset_arg);<o:p></o:p></p>
<p class="MsoNormal">+                                                             struct amdgpu_reset_context *reset_context);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">-                                                struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">-                                                bool *need_full_reset_arg,<o:p></o:p></p>
<p class="MsoNormal">-                                                bool skip_hw_reset);<o:p></o:p></p>
<p class="MsoNormal">+int amdgpu_do_asic_reset(struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">+                                             struct amdgpu_reset_context *reset_context);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> int emu_soc_asic_init(struct amdgpu_device *adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoNormal">index bcb2c66437a2..6d6da1b504aa 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoNormal">@@ -65,6 +65,7 @@<o:p></o:p></p>
<p class="MsoNormal">#include "amdgpu_ras.h"<o:p></o:p></p>
<p class="MsoNormal">#include "amdgpu_pmu.h"<o:p></o:p></p>
<p class="MsoNormal">#include "amdgpu_fru_eeprom.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "amdgpu_reset.h"<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #include <linux/suspend.h><o:p></o:p></p>
<p class="MsoNormal">#include <drm/task_barrier.h><o:p></o:p></p>
<p class="MsoNormal">@@ -3421,6 +3422,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">                               goto fence_driver_init;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             amdgpu_reset_init(adev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               /* detect if we are with an SRIOV vbios */<o:p></o:p></p>
<p class="MsoNormal">               amdgpu_device_detect_sriov_bios(adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -3671,6 +3674,9 @@ void amdgpu_device_fini(struct amdgpu_device *adev)<o:p></o:p></p>
<p class="MsoNormal">               release_firmware(adev->firmware.gpu_info_fw);<o:p></o:p></p>
<p class="MsoNormal">               adev->firmware.gpu_info_fw = NULL;<o:p></o:p></p>
<p class="MsoNormal">               adev->accel_working = false;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             amdgpu_reset_fini(adev);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               /* free i2c buses */<o:p></o:p></p>
<p class="MsoNormal">               if (!amdgpu_device_has_dc_support(adev))<o:p></o:p></p>
<p class="MsoNormal">                               amdgpu_i2c_fini(adev);<o:p></o:p></p>
<p class="MsoNormal">@@ -4239,11 +4245,15 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">-                                                                struct amdgpu_job *job,<o:p></o:p></p>
<p class="MsoNormal">-                                                                bool *need_full_reset_arg)<o:p></o:p></p>
<p class="MsoNormal">+                                                             struct amdgpu_reset_context *reset_context)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               int i, r = 0;<o:p></o:p></p>
<p class="MsoNormal">-              bool need_full_reset  = *need_full_reset_arg;<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_job *job = NULL;<o:p></o:p></p>
<p class="MsoNormal">+             bool need_full_reset =<o:p></o:p></p>
<p class="MsoNormal">+                             test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (reset_context->reset_req_dev == adev)<o:p></o:p></p>
<p class="MsoNormal">+                             job = reset_context->job;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                /* no need to dump if device is not in good state during probe period */<o:p></o:p></p>
<p class="MsoNormal">               if (!adev->gmc.xgmi.pending_reset)<o:p></o:p></p>
<p class="MsoNormal">@@ -4268,6 +4278,10 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">               if(job)<o:p></o:p></p>
<p class="MsoNormal">                               drm_sched_increase_karma(&job->base);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             r = amdgpu_reset_prepare_hwcontext(adev, reset_context);<o:p></o:p></p>
<p class="MsoNormal">+             if (r != -ENOSYS)<o:p></o:p></p>
<p class="MsoNormal">+                             return r;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               /* Don't suspend on bare metal if we are not going to HW reset the ASIC */<o:p></o:p></p>
<p class="MsoNormal">               if (!amdgpu_sriov_vf(adev)) {<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -4286,22 +4300,36 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                                if (need_full_reset)<o:p></o:p></p>
<p class="MsoNormal">                                               r = amdgpu_device_ip_suspend(adev);<o:p></o:p></p>
<p class="MsoNormal">-<o:p></o:p></p>
<p class="MsoNormal">-                              *need_full_reset_arg = need_full_reset;<o:p></o:p></p>
<p class="MsoNormal">+                             if (need_full_reset)<o:p></o:p></p>
<p class="MsoNormal">+                                             set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+                             else<o:p></o:p></p>
<p class="MsoNormal">+                                             clear_bit(AMDGPU_NEED_FULL_RESET,<o:p></o:p></p>
<p class="MsoNormal">+                                                               &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                return r;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">-                                                struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">-                                                bool *need_full_reset_arg,<o:p></o:p></p>
<p class="MsoNormal">-                                                bool skip_hw_reset)<o:p></o:p></p>
<p class="MsoNormal">+int amdgpu_do_asic_reset(struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">+                                             struct amdgpu_reset_context *reset_context)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               struct amdgpu_device *tmp_adev = NULL;<o:p></o:p></p>
<p class="MsoNormal">-              bool need_full_reset = *need_full_reset_arg, vram_lost = false;<o:p></o:p></p>
<p class="MsoNormal">+             bool need_full_reset, skip_hw_reset, vram_lost = false;<o:p></o:p></p>
<p class="MsoNormal">               int r = 0;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             /* Try reset handler method first */<o:p></o:p></p>
<p class="MsoNormal">+             tmp_adev = list_first_entry(device_list_handle, struct amdgpu_device,<o:p></o:p></p>
<p class="MsoNormal">+                                                                 reset_list);<o:p></o:p></p>
<p class="MsoNormal">+             r = amdgpu_reset_perform_reset(tmp_adev, reset_context);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             if (r != -ENOSYS)<o:p></o:p></p>
<p class="MsoNormal">+                             return r;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             /* Reset handler not implemented, use the default method */<o:p></o:p></p>
<p class="MsoNormal">+             need_full_reset =<o:p></o:p></p>
<p class="MsoNormal">+                             test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+             skip_hw_reset = test_bit(AMDGPU_SKIP_HW_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               /*<o:p></o:p></p>
<p class="MsoNormal">                * ASIC reset has to be done on all XGMI hive nodes ASAP<o:p></o:p></p>
<p class="MsoNormal">                * to allow proper links negotiation in FW (within 1 sec)<o:p></o:p></p>
<p class="MsoNormal">@@ -4385,7 +4413,8 @@ int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">                                                                */<o:p></o:p></p>
<p class="MsoNormal">                                                               amdgpu_register_gpu_instance(tmp_adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-                                                              if (!hive && tmp_adev->gmc.xgmi.num_physical_nodes > 1)<o:p></o:p></p>
<p class="MsoNormal">+                                                             if (!reset_context->hive &&<o:p></o:p></p>
<p class="MsoNormal">+                                                                 tmp_adev->gmc.xgmi.num_physical_nodes > 1)<o:p></o:p></p>
<p class="MsoNormal">                                                                               amdgpu_xgmi_add_device(tmp_adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                                                                r = amdgpu_device_ip_late_init(tmp_adev);<o:p></o:p></p>
<p class="MsoNormal">@@ -4413,8 +4442,10 @@ int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">                                                               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                                                                /* Update PSP FW topology after reset */<o:p></o:p></p>
<p class="MsoNormal">-                                                              if (hive && tmp_adev->gmc.xgmi.num_physical_nodes > 1)<o:p></o:p></p>
<p class="MsoNormal">-                                                                              r = amdgpu_xgmi_update_topology(hive, tmp_adev);<o:p></o:p></p>
<p class="MsoNormal">+                                                             if (reset_context->hive &&<o:p></o:p></p>
<p class="MsoNormal">+                                                                 tmp_adev->gmc.xgmi.num_physical_nodes > 1)<o:p></o:p></p>
<p class="MsoNormal">+                                                                             r = amdgpu_xgmi_update_topology(<o:p></o:p></p>
<p class="MsoNormal">+                                                                                             reset_context->hive, tmp_adev);<o:p></o:p></p>
<p class="MsoNormal">                                               }<o:p></o:p></p>
<p class="MsoNormal">                               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -4438,7 +4469,10 @@ int amdgpu_do_asic_reset(struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> end:<o:p></o:p></p>
<p class="MsoNormal">-              *need_full_reset_arg = need_full_reset;<o:p></o:p></p>
<p class="MsoNormal">+             if (need_full_reset)<o:p></o:p></p>
<p class="MsoNormal">+                             set_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+             else<o:p></o:p></p>
<p class="MsoNormal">+                             clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">               return r;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -4575,10 +4609,9 @@ static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev)<o:p></o:p></p>
<p class="MsoNormal">               return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-void amdgpu_device_recheck_guilty_jobs(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">-                                                     struct amdgpu_hive_info *hive,<o:p></o:p></p>
<p class="MsoNormal">-                                                     struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">-                                                     bool *need_full_reset)<o:p></o:p></p>
<p class="MsoNormal">+void amdgpu_device_recheck_guilty_jobs(<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_device *adev, struct list_head *device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_reset_context *reset_context)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">               int i, r = 0;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -4614,8 +4647,10 @@ void amdgpu_device_recheck_guilty_jobs(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">                                                               if (r)<o:p></o:p></p>
<p class="MsoNormal">                                                                               adev->asic_reset_res = r;<o:p></o:p></p>
<p class="MsoNormal">                                               } else {<o:p></o:p></p>
<p class="MsoNormal">-                                                              r  = amdgpu_do_asic_reset(hive, device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              need_full_reset, false);<o:p></o:p></p>
<p class="MsoNormal">+                                                             clear_bit(AMDGPU_SKIP_HW_RESET,<o:p></o:p></p>
<p class="MsoNormal">+                                                                               &reset_context->flags);<o:p></o:p></p>
<p class="MsoNormal">+                                                             r = amdgpu_do_asic_reset(device_list_handle,<o:p></o:p></p>
<p class="MsoNormal">+                                                                                                             reset_context);<o:p></o:p></p>
<p class="MsoNormal">                                                               if (r && r == -EAGAIN)<o:p></o:p></p>
<p class="MsoNormal">                                                                               goto retry;<o:p></o:p></p>
<p class="MsoNormal">                                               }<o:p></o:p></p>
<p class="MsoNormal">@@ -4665,6 +4700,9 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">               bool need_emergency_restart = false;<o:p></o:p></p>
<p class="MsoNormal">               bool audio_suspended = false;<o:p></o:p></p>
<p class="MsoNormal">               int tmp_vram_lost_counter;<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_reset_context reset_context;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             memset(&reset_context, 0, sizeof(reset_context));<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                /*<o:p></o:p></p>
<p class="MsoNormal">                * Special case: RAS triggered and full reset isn't supported<o:p></o:p></p>
<p class="MsoNormal">@@ -4705,6 +4743,12 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">                               mutex_lock(&hive->hive_lock);<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             reset_context.method = AMD_RESET_METHOD_NONE;<o:p></o:p></p>
<p class="MsoNormal">+             reset_context.reset_req_dev = adev;<o:p></o:p></p>
<p class="MsoNormal">+             reset_context.job = job;<o:p></o:p></p>
<p class="MsoNormal">+             reset_context.hive = hive;<o:p></o:p></p>
<p class="MsoNormal">+             clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               /*<o:p></o:p></p>
<p class="MsoNormal">                * lock the device before we try to operate the linked list<o:p></o:p></p>
<p class="MsoNormal">                * if didn't get the device lock, don't touch the linked list since<o:p></o:p></p>
<p class="MsoNormal">@@ -4805,9 +4849,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> retry:    /* Rest of adevs pre asic reset from XGMI hive. */<o:p></o:p></p>
<p class="MsoNormal">               list_for_each_entry(tmp_adev, device_list_handle, reset_list) {<o:p></o:p></p>
<p class="MsoNormal">-                              r = amdgpu_device_pre_asic_reset(tmp_adev,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              (tmp_adev == adev) ? job : NULL,<o:p></o:p></p>
<p class="MsoNormal">-                                                                                              &need_full_reset);<o:p></o:p></p>
<p class="MsoNormal">+                             r = amdgpu_device_pre_asic_reset(tmp_adev, &reset_context);<o:p></o:p></p>
<p class="MsoNormal">                               /*TODO Should we stop ?*/<o:p></o:p></p>
<p class="MsoNormal">                               if (r) {<o:p></o:p></p>
<p class="MsoNormal">                                               dev_err(tmp_adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",<o:p></o:p></p>
<p class="MsoNormal">@@ -4824,7 +4866,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">                               if (r)<o:p></o:p></p>
<p class="MsoNormal">                                               adev->asic_reset_res = r;<o:p></o:p></p>
<p class="MsoNormal">               } else {<o:p></o:p></p>
<p class="MsoNormal">-                              r  = amdgpu_do_asic_reset(hive, device_list_handle, &need_full_reset, false);<o:p></o:p></p>
<p class="MsoNormal">+                             r = amdgpu_do_asic_reset(device_list_handle, &reset_context);<o:p></o:p></p>
<p class="MsoNormal">                               if (r && r == -EAGAIN)<o:p></o:p></p>
<p class="MsoNormal">                                               goto retry;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal">@@ -4843,8 +4885,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoNormal">                                */<o:p></o:p></p>
<p class="MsoNormal">                               if (amdgpu_gpu_recovery == 2 &&<o:p></o:p></p>
<p class="MsoNormal">                                               !(tmp_vram_lost_counter < atomic_read(&adev->vram_lost_counter)))<o:p></o:p></p>
<p class="MsoNormal">-                                              amdgpu_device_recheck_guilty_jobs(tmp_adev, hive,<o:p></o:p></p>
<p class="MsoNormal">-                                                                              device_list_handle, &need_full_reset);<o:p></o:p></p>
<p class="MsoNormal">+                                             amdgpu_device_recheck_guilty_jobs(<o:p></o:p></p>
<p class="MsoNormal">+                                                             tmp_adev, device_list_handle, &reset_context);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {<o:p></o:p></p>
<p class="MsoNormal">                                               struct amdgpu_ring *ring = tmp_adev->rings[i];<o:p></o:p></p>
<p class="MsoNormal">@@ -5189,12 +5231,15 @@ pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev)<o:p></o:p></p>
<p class="MsoNormal">               struct drm_device *dev = pci_get_drvdata(pdev);<o:p></o:p></p>
<p class="MsoNormal">               struct amdgpu_device *adev = drm_to_adev(dev);<o:p></o:p></p>
<p class="MsoNormal">               int r, i;<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_reset_context reset_context;<o:p></o:p></p>
<p class="MsoNormal">               bool need_full_reset = true;<o:p></o:p></p>
<p class="MsoNormal">               u32 memsize;<o:p></o:p></p>
<p class="MsoNormal">               struct list_head device_list;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                DRM_INFO("PCI error: slot reset callback!!\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             memset(&reset_context, 0, sizeof(reset_context));<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               INIT_LIST_HEAD(&device_list);<o:p></o:p></p>
<p class="MsoNormal">               list_add_tail(&adev->reset_list, &device_list);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -5217,13 +5262,18 @@ pci_ers_result_t amdgpu_pci_slot_reset(struct pci_dev *pdev)<o:p></o:p></p>
<p class="MsoNormal">                               goto out;<o:p></o:p></p>
<p class="MsoNormal">               }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             reset_context.method = AMD_RESET_METHOD_NONE;<o:p></o:p></p>
<p class="MsoNormal">+             reset_context.reset_req_dev = adev;<o:p></o:p></p>
<p class="MsoNormal">+             set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<o:p></o:p></p>
<p class="MsoNormal">+             set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               adev->in_pci_err_recovery = true;<o:p></o:p></p>
<p class="MsoNormal">-              r = amdgpu_device_pre_asic_reset(adev, NULL, &need_full_reset);<o:p></o:p></p>
<p class="MsoNormal">+             r = amdgpu_device_pre_asic_reset(adev, &reset_context);<o:p></o:p></p>
<p class="MsoNormal">               adev->in_pci_err_recovery = false;<o:p></o:p></p>
<p class="MsoNormal">               if (r)<o:p></o:p></p>
<p class="MsoNormal">                               goto out;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-              r = amdgpu_do_asic_reset(NULL, &device_list, &need_full_reset, true);<o:p></o:p></p>
<p class="MsoNormal">+             r = amdgpu_do_asic_reset(&device_list, &reset_context);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> out:<o:p></o:p></p>
<p class="MsoNormal">               if (!r) {<o:p></o:p></p>
<p class="MsoNormal">diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></p>
<p class="MsoNormal">index 6a06234dbcad..4bcc03c4c6c5 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></p>
<p class="MsoNormal">@@ -47,6 +47,7 @@<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #include "amdgpu_ras.h"<o:p></o:p></p>
<p class="MsoNormal">#include "amdgpu_xgmi.h"<o:p></o:p></p>
<p class="MsoNormal">+#include "amdgpu_reset.h"<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> /*<o:p></o:p></p>
<p class="MsoNormal">  * KMS wrapper.<o:p></o:p></p>
<p class="MsoNormal">@@ -1349,7 +1350,9 @@ static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work)<o:p></o:p></p>
<p class="MsoNormal">               struct list_head device_list;<o:p></o:p></p>
<p class="MsoNormal">               struct amdgpu_device *adev;<o:p></o:p></p>
<p class="MsoNormal">               int i, r;<o:p></o:p></p>
<p class="MsoNormal">-              bool need_full_reset = true;<o:p></o:p></p>
<p class="MsoNormal">+             struct amdgpu_reset_context reset_context;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+             memset(&reset_context, 0, sizeof(reset_context));<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">                mutex_lock(&mgpu_info.mutex);<o:p></o:p></p>
<p class="MsoNormal">               if (mgpu_info.pending_reset == true) {<o:p></o:p></p>
<p class="MsoNormal">@@ -1359,9 +1362,14 @@ static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work)<o:p></o:p></p>
<p class="MsoNormal">               mgpu_info.pending_reset = true;<o:p></o:p></p>
<p class="MsoNormal">               mutex_unlock(&mgpu_info.mutex);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+             /* Use a common context, just need to make sure full reset is done */<o:p></o:p></p>
<p class="MsoNormal">+             reset_context.method = AMD_RESET_METHOD_NONE;<o:p></o:p></p>
<p class="MsoNormal">+             set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               for (i = 0; i < mgpu_info.num_dgpu; i++) {<o:p></o:p></p>
<p class="MsoNormal">                               adev = mgpu_info.gpu_ins[i].adev;<o:p></o:p></p>
<p class="MsoNormal">-                              r = amdgpu_device_pre_asic_reset(adev, NULL, &need_full_reset);<o:p></o:p></p>
<p class="MsoNormal">+                             reset_context.reset_req_dev = adev;<o:p></o:p></p>
<p class="MsoNormal">+                             r = amdgpu_device_pre_asic_reset(adev, &reset_context);<o:p></o:p></p>
<p class="MsoNormal">                               if (r) {<o:p></o:p></p>
<p class="MsoNormal">                                               dev_err(adev->dev, "GPU pre asic reset failed with err, %d for drm dev, %s ",<o:p></o:p></p>
<p class="MsoNormal">                                                               r, adev_to_drm(adev)->unique);<o:p></o:p></p>
<p class="MsoNormal">@@ -1388,7 +1396,10 @@ static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work)<o:p></o:p></p>
<p class="MsoNormal">               list_for_each_entry(adev, &device_list, reset_list)<o:p></o:p></p>
<p class="MsoNormal">                               amdgpu_unregister_gpu_instance(adev);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-              r = amdgpu_do_asic_reset(NULL, &device_list, &need_full_reset, true);<o:p></o:p></p>
<p class="MsoNormal">+             /* Use a common context, just need to make sure full reset is done */<o:p></o:p></p>
<p class="MsoNormal">+             set_bit(AMDGPU_SKIP_HW_RESET, &reset_context.flags);<o:p></o:p></p>
<p class="MsoNormal">+             r = amdgpu_do_asic_reset(&device_list, &reset_context);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">               if (r) {<o:p></o:p></p>
<p class="MsoNormal">                               DRM_ERROR("reinit gpus failure");<o:p></o:p></p>
<p class="MsoNormal">                               return;<o:p></o:p></p>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal">2.17.1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>