Re: [PATCH 3/3] drm/amdgpu: add the BO-va mapping offset when kmapping an IB
Christian König <[email protected]> Thu, 6 Aug 2026 14:05:15 +0200
| Newsgroups | org.freedesktop.lists.amd-gfx,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 8/6/26 06:45, Junrui Luo via B4 Relay wrote: > [Some people who received this message don't often get email from [email protected]. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] > > From: Junrui Luo <[email protected]> > > amdgpu_cs_patch_ibs() derives the CPU-side view of a UVD/VCE/VCN > indirect buffer from the BO returned by amdgpu_cs_find_mapping(): > > r = amdgpu_bo_kmap(aobj, (void **)&kptr); > kptr += va_start - (m->start * AMDGPU_GPU_PAGE_SIZE); > > amdgpu_bo_kmap() returns the start of the BO, so only the displacement > of va_start inside the mapping is added. The page tables, however, are > programmed from mapping->offset (see amdgpu_vm_bo_update()), which > records the offset_in_bo the client passed to AMDGPU_GEM_VA. The GPU > therefore resolves va_start to BO byte > > m->offset + (va_start - m->start * AMDGPU_GPU_PAGE_SIZE) > > while the kernel inspects the byte m->offset lower. Whenever an IB is > submitted through a mapping created with a non-zero offset_in_bo, the > two views disagree. > > Add the missing term so the kmapped pointer describes the same bytes the > page tables do. > > Every other CPU-side consumer of amdgpu_cs_find_mapping() omits > mapping->offset in the same way. > > Fixes: 4802ce117786 ("drm/amdgpu: fix UVD/VCE VM emulation") Good catch, but completely irrelevant in practice, so just drop that here. > Reported-by: Yuhao Jiang <[email protected]> > Assisted-by: Claude:claude-opus-5 > Signed-off-by: Junrui Luo <[email protected]> With that done Reviewed-by: Christian König <[email protected]> Regards, Christian. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > index 9c514cb01096..a72cee871af3 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -1047,7 +1047,7 @@ static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p, > if (r) > return r; > > - kptr += va_start - (m->start * AMDGPU_GPU_PAGE_SIZE); > + kptr += m->offset + va_start - (m->start * AMDGPU_GPU_PAGE_SIZE); > > if (ring->funcs->parse_cs) { > memcpy(ib->ptr, kptr, ib->length_dw * 4); > > -- > 2.51.2 > >