[PATCH 1/3] drm/amdgpu: add reset register dump function for gfx_v10_0

Alex Deucher alexdeucher at gmail.com
Tue Jan 11 14:26:09 UTC 2022


On Tue, Jan 11, 2022 at 2:11 AM Somalapuram Amaranath
<Amaranath.Somalapuram at amd.com> wrote:
>
> Implementation of register dump function when the AMD GPU resets
>
> Signed-off-by: Somalapuram Amaranath <Amaranath.Somalapuram at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c   | 55 +++++++++++++++++++++++-
>  drivers/gpu/drm/amd/include/amd_shared.h |  2 +
>  2 files changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> index dbe7442fb25c..dbd74204f06d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> @@ -7466,7 +7466,6 @@ static int gfx_v10_0_hw_init(void *handle)
>  {
>         int r;
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> -
>         if (!amdgpu_emu_mode)
>                 gfx_v10_0_init_golden_registers(adev);
>
> @@ -7580,6 +7579,59 @@ static int gfx_v10_0_hw_fini(void *handle)
>         return 0;
>  }
>
> +static int gfx_v10_0_reset_reg_dumps(void *handle,
> +               uint32_t (**dump)[2], uint32_t *n_regs, char ***r_names)
> +{
> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> +       uint32_t i = 0;
> +
> +#define N_REGS (17)
> +#define DUMP_REG(addr) do {                            \
> +               (*dump)[i][0] = (addr);                 \
> +               (*dump)[i++][1] = RREG32(addr);         \

For soc15 and newer asics (e.g., vega and newer), we need to use the
RREG_SOC15 macros rather than the regular RREG macros.

Alex


> +       } while (0)
> +
> +       char *reg_names[N_REGS] = {
> +               "mmGRBM_STATUS2", "mmGRBM_STATUS_SE0", "mmGRBM_STATUS_SE1",
> +               "mmGRBM_STATUS_SE2", "mmGRBM_STATUS_SE3", "mmSDMA0_STATUS_REG",
> +               "mmSDMA1_STATUS_REG", "mmCP_STAT", "mmCP_STALLED_STAT1",
> +               "mmCP_STALLED_STAT1", "mmCP_STALLED_STAT3", "mmCP_CPC_STATUS",
> +               "mmCP_CPC_BUSY_STAT", "mmCP_CPC_STALLED_STAT1", "mmCP_CPF_STATUS",
> +               "mmCP_CPF_BUSY_STAT", "mmCP_CPF_STALLED_STAT1"
> +       };
> +
> +       *dump = kmalloc(N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
> +       if (*dump == NULL)
> +               return -ENOMEM;
> +       DUMP_REG(mmGRBM_STATUS2);
> +       DUMP_REG(mmGRBM_STATUS_SE0);
> +       DUMP_REG(mmGRBM_STATUS_SE1);
> +       DUMP_REG(mmGRBM_STATUS_SE2);
> +       DUMP_REG(mmGRBM_STATUS_SE3);
> +       DUMP_REG(mmSDMA0_STATUS_REG);
> +       DUMP_REG(mmSDMA1_STATUS_REG);
> +       DUMP_REG(mmCP_STAT);
> +       DUMP_REG(mmCP_STALLED_STAT1);
> +       DUMP_REG(mmCP_STALLED_STAT1);
> +       DUMP_REG(mmCP_STALLED_STAT3);
> +       DUMP_REG(mmCP_CPC_STATUS);
> +       DUMP_REG(mmCP_CPC_BUSY_STAT);
> +       DUMP_REG(mmCP_CPC_STALLED_STAT1);
> +       DUMP_REG(mmCP_CPF_STATUS);
> +       DUMP_REG(mmCP_CPF_BUSY_STAT);
> +       DUMP_REG(mmCP_CPF_STALLED_STAT1);
> +
> +       *n_regs = i;
> +
> +       (*r_names) = kcalloc(N_REGS, sizeof(char *), GFP_KERNEL);
> +       for (i = 0; i < N_REGS; i++) {
> +               (*r_names)[i] = kcalloc(30, sizeof(char), GFP_KERNEL);
> +               strcpy((*r_names)[i], reg_names[i]);
> +       }
> +
> +       return 0;
> +}
> +
>  static int gfx_v10_0_suspend(void *handle)
>  {
>         return gfx_v10_0_hw_fini(handle);
> @@ -9359,6 +9411,7 @@ static const struct amd_ip_funcs gfx_v10_0_ip_funcs = {
>         .set_clockgating_state = gfx_v10_0_set_clockgating_state,
>         .set_powergating_state = gfx_v10_0_set_powergating_state,
>         .get_clockgating_state = gfx_v10_0_get_clockgating_state,
> +       .reset_reg_dumps = gfx_v10_0_reset_reg_dumps,
>  };
>
>  static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {
> diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
> index 4b9e68a79f06..98291a8f57dd 100644
> --- a/drivers/gpu/drm/amd/include/amd_shared.h
> +++ b/drivers/gpu/drm/amd/include/amd_shared.h
> @@ -298,6 +298,8 @@ struct amd_ip_funcs {
>                                      enum amd_powergating_state state);
>         void (*get_clockgating_state)(void *handle, u32 *flags);
>         int (*enable_umd_pstate)(void *handle, enum amd_dpm_forced_level *level);
> +       int (*reset_reg_dumps)(void *handle,
> +                       uint32_t (**dump)[2], uint32_t *n_regs, char ***r_names);
>  };
>
>
> --
> 2.25.1
>


More information about the amd-gfx mailing list