[PATCH] drm/amdgpu: Check vcn sram load return value
Liu, Leo
Leo.Liu at amd.com
Fri Jul 18 13:45:23 UTC 2025
[AMD Official Use Only - AMD Internal Distribution Only]
Reviewed-by: Leo Liu <leo.liu at amd.com>
> -----Original Message-----
> From: Sundararaju, Sathishkumar <Sathishkumar.Sundararaju at amd.com>
> Sent: July 14, 2025 2:01 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Liu, Leo <Leo.Liu at amd.com>; Sundararaju, Sathishkumar
> <Sathishkumar.Sundararaju at amd.com>
> Subject: [PATCH] drm/amdgpu: Check vcn sram load return value
>
> Log an error when vcn sram load fails in indirect mode and return the same
> error value.
>
> Signed-off-by: Sathishkumar S <sathishkumar.sundararaju at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 11 ++++++++---
> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 10 ++++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 9 +++++++--
> drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 11 ++++++++---
> 8 files changed, 63 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
> index 148b651be7ca..a17629b7f4e1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
> @@ -851,6 +851,7 @@ static int vcn_v2_0_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst, bool indirect)
> volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst-
> >fw_shared.cpu_addr;
> struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
> uint32_t rb_bufsz, tmp;
> + int ret;
>
> vcn_v2_0_enable_static_power_gating(vinst);
>
> @@ -934,8 +935,13 @@ static int vcn_v2_0_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst, bool indirect)
> UVD, 0, mmUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, 0, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, 0, 0);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> /* force RBC into idle state */
> rb_bufsz = order_base_2(ring->ring_size); diff --git
> a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> index 58b527a6b795..cbdc3c451bdb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
> @@ -1022,6 +1022,7 @@ static int vcn_v2_5_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst, bool indirect)
> volatile struct amdgpu_fw_shared *fw_shared = adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> uint32_t rb_bufsz, tmp;
> + int ret;
>
> /* disable register anti-hang mechanism */
> WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx,
> mmUVD_POWER_STATUS), 1, @@ -1112,8 +1113,13 @@ static int
> vcn_v2_5_start_dpg_mode(struct amdgpu_vcn_inst *vinst, bool indirect)
> VCN, 0, mmUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_dec;
> /* force RBC into idle state */
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> index 9fb0d5380589..021fef318ab9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> @@ -1029,6 +1029,7 @@ static int vcn_v3_0_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst, bool indirect)
> volatile struct amdgpu_fw_shared *fw_shared = adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> uint32_t rb_bufsz, tmp;
> + int ret;
>
> /* disable register anti-hang mechanism */
> WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx,
> mmUVD_POWER_STATUS), 1, @@ -1121,8 +1122,13 @@ static int
> vcn_v3_0_start_dpg_mode(struct amdgpu_vcn_inst *vinst, bool indirect)
> WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET(
> VCN, inst_idx, mmUVD_VCPU_CNTL), tmp, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_dec;
> /* force RBC into idle state */
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index eec9133e1b2c..e8a2cb1a0c1b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1011,6 +1011,7 @@ static int vcn_v4_0_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst, bool indirect)
> volatile struct amdgpu_vcn4_fw_shared *fw_shared = adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> uint32_t tmp;
> + int ret;
>
> /* disable register anti-hang mechanism */
> WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx,
> regUVD_POWER_STATUS), 1, @@ -1093,8 +1094,13 @@ static int
> vcn_v4_0_start_dpg_mode(struct amdgpu_vcn_inst *vinst, bool indirect)
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_enc[0];
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> index d8fd32c1e38e..056d9f3aa2a1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
> @@ -851,7 +851,7 @@ static int vcn_v4_0_3_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> volatile struct amdgpu_vcn4_fw_shared *fw_shared =
> adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> - int vcn_inst;
> + int vcn_inst, ret;
> uint32_t tmp;
>
> vcn_inst = GET_INST(VCN, inst_idx);
> @@ -944,8 +944,13 @@ static int vcn_v4_0_3_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> VCN, 0, regUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx,
> AMDGPU_UCODE_ID_VCN0_RAM);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx,
> AMDGPU_UCODE_ID_VCN0_RAM);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_enc[0];
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> index 7e37ddea6355..beade6f5be64 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
> @@ -925,6 +925,7 @@ static int vcn_v4_0_5_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> volatile struct amdgpu_vcn4_fw_shared *fw_shared = adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> uint32_t tmp;
> + int ret;
>
> /* disable register anti-hang mechanism */
> WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx,
> regUVD_POWER_STATUS), 1, @@ -1005,8 +1006,13 @@ static int
> vcn_v4_0_5_start_dpg_mode(struct amdgpu_vcn_inst *vinst,
> VCN, inst_idx, regUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_enc[0];
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> index 47c0bcc9e7d8..af74da292a15 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
> @@ -712,6 +712,7 @@ static int vcn_v5_0_0_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> volatile struct amdgpu_vcn5_fw_shared *fw_shared = adev-
> >vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> uint32_t tmp;
> + int ret;
>
> /* disable register anti-hang mechanism */
> WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx,
> regUVD_POWER_STATUS), 1, @@ -765,8 +766,12 @@ static int
> vcn_v5_0_0_start_dpg_mode(struct amdgpu_vcn_inst *vinst,
> VCN, inst_idx, regUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx, 0);
> + dev_err(adev->dev, "%s: vcn sram load failed %d\n",
> __func__, ret);
> + if (ret)
> + return ret;
> + }
>
> ring = &adev->vcn.inst[inst_idx].ring_enc[0];
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> index cdefd7fcb0da..d8bbb9376731 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
> @@ -605,7 +605,7 @@ static int vcn_v5_0_1_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> adev->vcn.inst[inst_idx].fw_shared.cpu_addr;
> struct amdgpu_ring *ring;
> struct dpg_pause_state state = {.fw_based =
> VCN_DPG_STATE__PAUSE};
> - int vcn_inst;
> + int vcn_inst, ret;
> uint32_t tmp;
>
> vcn_inst = GET_INST(VCN, inst_idx);
> @@ -666,8 +666,13 @@ static int vcn_v5_0_1_start_dpg_mode(struct
> amdgpu_vcn_inst *vinst,
> VCN, 0, regUVD_MASTINT_EN),
> UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
>
> - if (indirect)
> - amdgpu_vcn_psp_update_sram(adev, inst_idx,
> AMDGPU_UCODE_ID_VCN0_RAM);
> + if (indirect) {
> + ret = amdgpu_vcn_psp_update_sram(adev, inst_idx,
> AMDGPU_UCODE_ID_VCN0_RAM);
> + if (ret) {
> + dev_err(adev->dev, "vcn sram load failed %d\n", ret);
> + return ret;
> + }
> + }
>
> /* resetting ring, fw should not check RB ring */
> fw_shared->sq.queue_mode |= FW_QUEUE_RING_RESET;
> --
> 2.48.1
More information about the amd-gfx
mailing list