<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>