Re: [PATCH 3/3] drm/amdgpu: add the BO-va mapping offset when kmapping an IB
From: Christian König
Date: Thu Aug 06 2026 - 08:08:24 EST
On 8/6/26 06:45, Junrui Luo via B4 Relay wrote:
> [Some people who received this message don't often get email from devnull+moonafterrain.outlook.com@xxxxxxxxxx. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
>
> From: Junrui Luo <moonafterrain@xxxxxxxxxxx>
>
> 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 <danisjiang@xxxxxxxxx>
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Junrui Luo <moonafterrain@xxxxxxxxxxx>
With that done Reviewed-by: Christian König <christian.koenig@xxxxxxx>
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
>
>