[PATCH 1/7] drm/amdgpu/gmc9: don't touch gfxhub registers during S0ix
Alex Deucher
alexdeucher at gmail.com
Thu Dec 15 22:08:14 UTC 2022
On Thu, Dec 15, 2022 at 2:45 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Am 14.12.22 um 23:16 schrieb Alex Deucher:
> > gfxhub registers are part of gfx IP and should not need to be
> > changed. Doing so without disabling gfxoff can hang the gfx IP.
> >
> > Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> > ---
> > drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 26 ++++++++++++++++++++------
> > 1 file changed, 20 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> > index 08d6cf79fb15..5f07c85bf729 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> > @@ -484,6 +484,9 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
> > for (i = 0; i < 16; i++) {
> > reg = hub->vm_context0_cntl + i;
> >
> > + if (adev->in_s0ix && (j == AMDGPU_GFXHUB_0))
> > + continue;
> > +
>
> I'm not sure we can do this because the higher layer will then have an
> incorrect impression of the interrupt state here.
In this particular case it works because we only touch this interrupt
on init/resume and fini/suspend. So over the course of a s0i3 cycle
the state would end up being the same, we just don't touch the
registers.
Alex
>
> Christian.
>
> > if (j == AMDGPU_GFXHUB_0)
> > tmp = RREG32_SOC15_IP(GC, reg);
> > else
> > @@ -504,6 +507,9 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
> > for (i = 0; i < 16; i++) {
> > reg = hub->vm_context0_cntl + i;
> >
> > + if (adev->in_s0ix && (j == AMDGPU_GFXHUB_0))
> > + continue;
> > +
> > if (j == AMDGPU_GFXHUB_0)
> > tmp = RREG32_SOC15_IP(GC, reg);
> > else
> > @@ -1862,9 +1868,12 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
> > }
> >
> > amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
> > - r = adev->gfxhub.funcs->gart_enable(adev);
> > - if (r)
> > - return r;
> > +
> > + if (!adev->in_s0ix) {
> > + r = adev->gfxhub.funcs->gart_enable(adev);
> > + if (r)
> > + return r;
> > + }
> >
> > r = adev->mmhub.funcs->gart_enable(adev);
> > if (r)
> > @@ -1911,11 +1920,15 @@ static int gmc_v9_0_hw_init(void *handle)
> > value = true;
> >
> > if (!amdgpu_sriov_vf(adev)) {
> > - adev->gfxhub.funcs->set_fault_enable_default(adev, value);
> > + if (!adev->in_s0ix)
> > + adev->gfxhub.funcs->set_fault_enable_default(adev, value);
> > adev->mmhub.funcs->set_fault_enable_default(adev, value);
> > }
> > - for (i = 0; i < adev->num_vmhubs; ++i)
> > + for (i = 0; i < adev->num_vmhubs; ++i) {
> > + if (adev->in_s0ix && (i == AMDGPU_GFXHUB_0))
> > + continue;
> > gmc_v9_0_flush_gpu_tlb(adev, 0, i, 0);
> > + }
> >
> > if (adev->umc.funcs && adev->umc.funcs->init_registers)
> > adev->umc.funcs->init_registers(adev);
> > @@ -1939,7 +1952,8 @@ static int gmc_v9_0_hw_init(void *handle)
> > */
> > static void gmc_v9_0_gart_disable(struct amdgpu_device *adev)
> > {
> > - adev->gfxhub.funcs->gart_disable(adev);
> > + if (!adev->in_s0ix)
> > + adev->gfxhub.funcs->gart_disable(adev);
> > adev->mmhub.funcs->gart_disable(adev);
> > }
> >
>
More information about the amd-gfx
mailing list