On Fri, Sep 8, 2023 at 7:05 AM Lijo Lazar <lijo.lazar@xxxxxxx> 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@xxxxxxx> Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > 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 >