On 9/17/26 11:05, Srinivasan Shanmugam wrote:
> Replace amdgpu_bo_kmap()/amdgpu_bo_kunmap() in the trap handler code
> with ttm_bo_vmap()/ttm_bo_vunmap().
> 
> Store the mapping as struct iosys_map and use iosys_map helpers for
> memory access. This aligns the trap code with the modern DRM/TTM mapping
> interfaces.
> 
> Using iosys_map allows the code to use common DRM mapping helpers
> instead of directly accessing memory through raw CPU pointers.

I'm really wondering if we shouldn't rework amdgpu_bo_kmap() into 
amdgpu_bo_vmap() and use that everywhere?

We can of course start with backward compatible return the kernel poiunter and 
then switch other users of amdgpu_bo_kmap() over to iosys_map one by one.

Regards,
Christian.

> 
> Suggested-by: Christian König <[email protected]>
> Signed-off-by: Srinivasan Shanmugam <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c | 31 +++++++++++-------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h |  2 +-
>  2 files changed, 15 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c
> index 29eba2968350..eb842fe8aed1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.c
> @@ -427,29 +427,29 @@ int amdgpu_trap_alloc(struct amdgpu_device *adev, 
> struct amdgpu_vm *vm,
>       if (r)
>               goto err_exec;
>  
> -     /* VM resv already held — kmap directly, no separate reserve needed */
> -     r = amdgpu_bo_kmap(cwsr->tma_bo, &cwsr->tma_cpu_addr);
> +     /* VM resv already held, vmap directly without a separate reserve */
> +     r = ttm_bo_vmap(&cwsr->tma_bo->tbo, &cwsr->tma_map);
>       if (r)
>               goto err_tma;
>  
> -     memset(cwsr->tma_cpu_addr, 0, AMDGPU_TRAP_TMA_MAX_SIZE);
> +     iosys_map_memset(&cwsr->tma_map, 0, 0, AMDGPU_TRAP_TMA_MAX_SIZE);
>  
>       r = amdgpu_trap_map_region(adev, vm, cwsr, AMDGPU_TRAP_TMA);
>       if (r)
> -             goto err_kmap;
> +             goto err_vmap;
>  
>       r = amdgpu_trap_map_region(adev, vm, cwsr, AMDGPU_TRAP_TBA);
>       if (r) {
>               amdgpu_trap_unmap_region(adev, cwsr, AMDGPU_TRAP_TMA);
> -             goto err_kmap;
> +             goto err_vmap;
>       }
>  
>       drm_exec_fini(&exec);
>       *trap_obj = cwsr;
>       return 0;
>  
> -err_kmap:
> -     amdgpu_bo_kunmap(cwsr->tma_bo);
> +err_vmap:
> +     ttm_bo_vunmap(&cwsr->tma_bo->tbo, &cwsr->tma_map);
>  err_tma:
>       amdgpu_bo_unref(&cwsr->tma_bo);
>  err_exec:
> @@ -524,7 +524,7 @@ void amdgpu_trap_free(struct amdgpu_device *adev, struct 
> amdgpu_vm *vm,
>  err:
>       drm_exec_fini(&exec);
>       /* TMA BO not pinned — release CPU mapping and free */
> -     amdgpu_bo_kunmap((*trap_obj)->tma_bo);
> +     ttm_bo_vunmap(&(*trap_obj)->tma_bo->tbo, &(*trap_obj)->tma_map);
>       amdgpu_bo_unref(&(*trap_obj)->tma_bo);
>       kfree(*trap_obj);
>       *trap_obj = NULL;
> @@ -569,24 +569,24 @@ static int amdgpu_trap_set_l2_trap_handler(struct 
> amdgpu_device *adev, struct am
>                                          struct amdgpu_trap_usr_addr *tma,
>                                          struct amdgpu_trap_usr_addr *tba)
>  {
> -     uint64_t *l1tma;
>       int r;
>  
>       if (!amdgpu_trap_is_enabled(adev))
>               return -EOPNOTSUPP;
>  
> -     if (!cwsr_obj || !cwsr_obj->tma_cpu_addr || !tma || !tba)
> +     if (!cwsr_obj || iosys_map_is_null(&cwsr_obj->tma_map) || !tma || !tba)
>               return -EINVAL;
> +
>       r = amdgpu_trap_validate_user_addr(adev, vm, tma);
>       if (r)
>               return r;
> +
>       r = amdgpu_trap_validate_user_addr(adev, vm, tba);
>       if (r)
>               return r;
>  
> -     l1tma = (uint64_t *)(cwsr_obj->tma_cpu_addr);
> -     l1tma[0] = tma->addr;
> -     l1tma[1] = tba->addr;
> +     iosys_map_wr(&cwsr_obj->tma_map, 0, u64, tma->addr);
> +     iosys_map_wr(&cwsr_obj->tma_map, sizeof(u64), u64, tba->addr);
>  
>       return 0;
>  }
> @@ -638,16 +638,13 @@ int amdgpu_trap_set_trap_debug_flag(struct 
> amdgpu_device *adev,
>                                   struct amdgpu_trap_obj *cwsr_obj,
>                                   bool enabled)
>  {
> -     uint64_t *l1tma;
> -
>       if (!amdgpu_trap_is_enabled(adev))
>               return -EOPNOTSUPP;
>  
>       if (!cwsr_obj)
>               return -EINVAL;
>  
> -     l1tma = (uint64_t *)(cwsr_obj->tma_cpu_addr);
> -     l1tma[2] = enabled;
> +     iosys_map_wr(&cwsr_obj->tma_map, 2 * sizeof(u64), u64, enabled);
>  
>       return 0;
>  }
> \ No newline at end of file
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h
> index 6d4664469bad..57e338c91f0a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trap.h
> @@ -42,7 +42,7 @@ struct amdgpu_trap_obj {
>       struct amdgpu_bo *tma_bo;
>       struct amdgpu_bo_va *tba_va;
>       struct amdgpu_bo_va *tma_va;
> -     void *tma_cpu_addr;
> +     struct iosys_map tma_map;
>  };
>  
>  struct amdgpu_trap_info {

Reply via email to