[PATCH] drm/amdgpu: Restore partition mode after reset

Alex Deucher alexdeucher at gmail.com
Fri Sep 8 13:15:09 UTC 2023


On Fri, Sep 8, 2023 at 7:05 AM Lijo Lazar <lijo.lazar at amd.com> wrote:
>
> On a full device reset, PSP FW gets unloaded. Hence restore the
> partition mode by placing a new request.
>
> Signed-off-by: Lijo Lazar <lijo.lazar at amd.com>

Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  5 ++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c    | 28 ++++++++++++++++------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h    |  1 +
>  drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c |  2 +-
>  4 files changed, 28 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 5f32e8d4f3d3..5d2b6a7c5f6e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -5115,6 +5115,11 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,
>                                 if (r)
>                                         return r;
>
> +                               r = amdgpu_xcp_restore_partition_mode(
> +                                       tmp_adev->xcp_mgr);
> +                               if (r)
> +                                       goto out;
> +
>                                 r = amdgpu_device_ip_resume_phase2(tmp_adev);
>                                 if (r)
>                                         goto out;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
> index 565a1fa436d4..2b99eed5ba19 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
> @@ -163,16 +163,11 @@ int amdgpu_xcp_init(struct amdgpu_xcp_mgr *xcp_mgr, int num_xcps, int mode)
>         return 0;
>  }
>
> -int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode)
> +static int __amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr,
> +                                             int mode)
>  {
>         int ret, curr_mode, num_xcps = 0;
>
> -       if (!xcp_mgr || mode == AMDGPU_XCP_MODE_NONE)
> -               return -EINVAL;
> -
> -       if (xcp_mgr->mode == mode)
> -               return 0;
> -
>         if (!xcp_mgr->funcs || !xcp_mgr->funcs->switch_partition_mode)
>                 return 0;
>
> @@ -201,6 +196,25 @@ int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode)
>         return ret;
>  }
>
> +int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode)
> +{
> +       if (!xcp_mgr || mode == AMDGPU_XCP_MODE_NONE)
> +               return -EINVAL;
> +
> +       if (xcp_mgr->mode == mode)
> +               return 0;
> +
> +       return __amdgpu_xcp_switch_partition_mode(xcp_mgr, mode);
> +}
> +
> +int amdgpu_xcp_restore_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr)
> +{
> +       if (!xcp_mgr || xcp_mgr->mode == AMDGPU_XCP_MODE_NONE)
> +               return 0;
> +
> +       return __amdgpu_xcp_switch_partition_mode(xcp_mgr, xcp_mgr->mode);
> +}
> +
>  int amdgpu_xcp_query_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags)
>  {
>         int mode;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h
> index 9a1036aeec2a..90138bc5f03d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h
> @@ -129,6 +129,7 @@ int amdgpu_xcp_mgr_init(struct amdgpu_device *adev, int init_mode,
>  int amdgpu_xcp_init(struct amdgpu_xcp_mgr *xcp_mgr, int num_xcps, int mode);
>  int amdgpu_xcp_query_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags);
>  int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode);
> +int amdgpu_xcp_restore_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr);
>  int amdgpu_xcp_get_partition(struct amdgpu_xcp_mgr *xcp_mgr,
>                              enum AMDGPU_XCP_IP_BLOCK ip, int instance);
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> index d0fc62784e82..3f715e7fe1a9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> +++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> @@ -500,7 +500,7 @@ static int aqua_vanjaram_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr,
>                 return -EINVAL;
>         }
>
> -       if (adev->kfd.init_complete)
> +       if (adev->kfd.init_complete && !amdgpu_in_reset(adev))
>                 flags |= AMDGPU_XCP_OPS_KFD;
>
>         if (flags & AMDGPU_XCP_OPS_KFD) {
> --
> 2.25.1
>


More information about the amd-gfx mailing list