[PATCH 3/3] drm/amdgpu: add the BO-va mapping offset when kmapping an IB
Junrui Luo via B4 Relay <[email protected]> Thu, 06 Aug 2026 12:45:26 +0800
| Newsgroups | org.freedesktop.lists.amd-gfx,org.freedesktop.lists.dri-devel,org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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") Reported-by: Yuhao Jiang <[email protected]> Assisted-by: Claude:claude-opus-5 Signed-off-by: Junrui Luo <[email protected]> --- 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