On 24-Jul-26 10:13 AM, Ce Sun wrote:
Add device lost status check in PSP fence wait loop to exit
polling early when GPU device lost
You may add a bit more context like -
'During some error injection scenarios through ras ta, device could be
lost from bus due to DPC. Add device lost status check in PSP fence wait
loop to exit polling early.'
Signed-off-by: Ce Sun <[email protected]>
Reviewed-by: Lijo Lazar <[email protected]>
Thanks,
Lijo
---
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