Add device lost status check in PSP fence wait loop to exit
polling early when GPU device lost

Signed-off-by: Ce Sun <[email protected]>
---
 drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c |  3 +++
 drivers/gpu/drm/amd/ras/rascore/ras.h            |  2 ++
 drivers/gpu/drm/amd/ras/rascore/ras_core.c       | 14 ++++++++++++++
 drivers/gpu/drm/amd/ras/rascore/ras_psp.c        |  3 +++
 4 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c 
b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c
index e4444798bc73..0b36b689fcfc 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_sys.c
@@ -171,6 +171,9 @@ static int amdgpu_ras_sys_check_gpu_status(struct 
ras_core_context *ras_core,
        if (amdgpu_in_reset(adev) || amdgpu_ras_in_recovery(adev))
                gpu_status |= RAS_GPU_STATUS__IN_RESET;
 
+       if (amdgpu_device_bus_status_check(adev))
+               gpu_status |= RAS_GPU_STATUS__DEVICE_LOST;
+
        if (amdgpu_sriov_vf(adev))
                gpu_status |= RAS_GPU_STATUS__IS_VF;
 
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras.h 
b/drivers/gpu/drm/amd/ras/rascore/ras.h
index 5869bad978b0..76a215ed0945 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras.h
+++ b/drivers/gpu/drm/amd/ras/rascore/ras.h
@@ -137,6 +137,7 @@ enum ras_gpu_status {
        RAS_GPU_STATUS__IN_RESET = 0x2,
        RAS_GPU_STATUS__IS_RMA = 0x4,
        RAS_GPU_STATUS__IS_VF = 0x8,
+       RAS_GPU_STATUS__DEVICE_LOST = 0x10,
 };
 
 enum ras_fw_eeprom_cmd {
@@ -371,6 +372,7 @@ int ras_core_query_block_ecc_data(struct ras_core_context 
*ras_core,
 bool ras_core_gpu_in_reset(struct ras_core_context *ras_core);
 bool ras_core_gpu_is_rma(struct ras_core_context *ras_core);
 bool ras_core_gpu_is_vf(struct ras_core_context *ras_core);
+bool ras_core_gpu_device_lost(struct ras_core_context *ras_core);
 bool ras_core_handle_nbio_irq(struct ras_core_context *ras_core, void *data);
 int ras_core_handle_fatal_error(struct ras_core_context *ras_core);
 
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_core.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_core.c
index 61d100b074b9..56539e47d50f 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_core.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_core.c
@@ -143,6 +143,20 @@ bool ras_core_gpu_is_vf(struct ras_core_context *ras_core)
        return (status & RAS_GPU_STATUS__IS_VF) ? true : false;
 }
 
+bool ras_core_gpu_device_lost(struct ras_core_context *ras_core)
+{
+       uint32_t status = 0;
+
+       if (!ras_core)
+               return false;
+
+       if (ras_core->sys_fn &&
+               ras_core->sys_fn->check_gpu_status)
+               ras_core->sys_fn->check_gpu_status(ras_core, &status);
+
+       return (status & RAS_GPU_STATUS__DEVICE_LOST) ? true : false;
+}
+
 bool ras_core_gpu_is_rma(struct ras_core_context *ras_core)
 {
        if (!ras_core)
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_psp.c 
b/drivers/gpu/drm/amd/ras/rascore/ras_psp.c
index 358f602b167d..35264c119bbb 100644
--- a/drivers/gpu/drm/amd/ras/rascore/ras_psp.c
+++ b/drivers/gpu/drm/amd/ras/rascore/ras_psp.c
@@ -294,6 +294,9 @@ static int send_psp_cmd(struct ras_core_context *ras_core,
                   psp_ctx->in_fence_value) {
                if (--timeout == 0)
                        break;
+
+               if (ras_core_gpu_device_lost(ras_core))
+                       break;
                /*
                 * Shouldn't wait for timeout when err_event_athub occurs,
                 * because gpu reset thread triggered and lock resource should
-- 
2.34.1

Reply via email to