[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