On 2017-04-07 12:11 PM, Christian König wrote: > From: Christian König <christian.koenig at amd.com> > > For Vega10 we have 18 VM invalidation engines for each VMHUB. > > Start to assign them manually to the rings. > > Signed-off-by: Christian König <christian.koenig at amd.com> > Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + > drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 2 +- > drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 12 ++++++++++++ > drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 2 +- > drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 4 ++-- > drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 2 +- > 6 files changed, 18 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > index 45bb87b..5786cc3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > @@ -179,6 +179,7 @@ struct amdgpu_ring { > unsigned cond_exe_offs; > u64 cond_exe_gpu_addr; > volatile u32 *cond_exe_cpu_addr; > + unsigned vm_inv_eng; > #if defined(CONFIG_DEBUG_FS) > struct dentry *ent; > #endif > diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c > index 8b35617..609ea29 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c > @@ -2959,7 +2959,7 @@ static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring, > struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; > int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); > uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); > - unsigned eng = ring->idx; > + unsigned eng = ring->vm_inv_eng; > > pd_addr = pd_addr | 0x1; /* valid bit */ > /* now only use physical base address of PDE and valid */ > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > index 7f5cc75..e3d2cdd 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > @@ -386,6 +386,18 @@ static int gmc_v9_0_early_init(void *handle) > static int gmc_v9_0_late_init(void *handle) > { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > + unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 0 }; > + unsigned i; > + > + for(i = 0; i < adev->num_rings; ++i) { > + struct amdgpu_ring *ring = adev->rings[i]; > + unsigned vmhub = ring->funcs->vmhub; > + > + ring->vm_inv_eng = vm_inv_eng[vmhub]++; Should there be a check here to make sure ring->vm_inv_eng does not exceed 18 (GFX9_INV_ENGINE_NUM or similar)? It holds true that it should never happen for current gfx9 ASICs. But this will be copy pasted into gfxN in the future, and it may not hold true there. Andres > + dev_info(adev->dev, "ring %u uses VM inv eng %u on hub %u\n", > + ring->idx, ring->vm_inv_eng, ring->funcs->vmhub); > + } > + > return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > index add9371..d5065a1 100644 > --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c > @@ -1041,7 +1041,7 @@ static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring, > { > struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; > uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); > - unsigned eng = ring->idx; > + unsigned eng = ring->vm_inv_eng; > > pd_addr = pd_addr | 0x1; /* valid bit */ > /* now only use physical base address of PDE and valid */ > diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c > index 45e86f8..bf35d56 100644 > --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c > @@ -1037,7 +1037,7 @@ static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, > struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; > uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); > uint32_t data0, data1, mask; > - unsigned eng = ring->idx; > + unsigned eng = ring->vm_inv_eng; > > pd_addr = pd_addr | 0x1; /* valid bit */ > /* now only use physical base address of PDE and valid */ > @@ -1078,7 +1078,7 @@ static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, > { > struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; > uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); > - unsigned eng = ring->idx; > + unsigned eng = ring->vm_inv_eng; > > pd_addr = pd_addr | 0x1; /* valid bit */ > /* now only use physical base address of PDE and valid */ > diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c > index c1a1708..5240753 100644 > --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c > @@ -975,7 +975,7 @@ static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, > { > struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; > uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); > - unsigned eng = ring->idx; > + unsigned eng = ring->vm_inv_eng; > > pd_addr = pd_addr | 0x1; /* valid bit */ > /* now only use physical base address of PDE and valid */ >