On 29.08.25 15:55, Srinivasan Shanmugam wrote:
> Implement TTM-level behavior for AMDGPU_PL_MMIO_REMAP so it behaves as a
> CPU-visible IO page:
> 
> * amdgpu_evict_flags(): mark as unmovable
> * amdgpu_res_cpu_visible(): consider CPU-visible
> * amdgpu_bo_move(): use null move when src/dst is MMIO_REMAP
> * amdgpu_ttm_io_mem_reserve(): program base/is_iomem/caching using
>   the device's mmio_remap_* metadata
> * amdgpu_ttm_io_mem_pfn(): return PFN for the remapped HDP page
> * amdgpu_ttm_tt_pde_flags(): set AMDGPU_PTE_SYSTEM for this mem type
> 
> v2:
> - Drop HDP-specific comment; keep generic remap (Alex).
> 
> v3:
> - Fix indentation in amdgpu_res_cpu_visible (Christian).
> - Use adev->rmmio_remap.bus_addr for MMIO_REMAP bus/PFN calculations
>   (Alex).
> 
> v4:
> - Drop unnecessary (resource_size_t) casts in MMIO_REMAP io-mem paths
>   (Alex)
> 
> Cc: Christian König <[email protected]>
> Suggested-by: Alex Deucher <[email protected]>
> Signed-off-by: Srinivasan Shanmugam <[email protected]>
> Reviewed-by: Alex Deucher <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 27ab4e754b2a..5f378f5c9350 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -123,6 +123,7 @@ static void amdgpu_evict_flags(struct ttm_buffer_object 
> *bo,
>       case AMDGPU_PL_GWS:
>       case AMDGPU_PL_OA:
>       case AMDGPU_PL_DOORBELL:
> +     case AMDGPU_PL_MMIO_REMAP:
>               placement->num_placement = 0;
>               return;
>  
> @@ -447,7 +448,8 @@ bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
>               return false;
>  
>       if (res->mem_type == TTM_PL_SYSTEM || res->mem_type == TTM_PL_TT ||
> -         res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == 
> AMDGPU_PL_DOORBELL)
> +         res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == 
> AMDGPU_PL_DOORBELL ||
> +         res->mem_type == AMDGPU_PL_MMIO_REMAP)
>               return true;
>  
>       if (res->mem_type != TTM_PL_VRAM)
> @@ -538,10 +540,12 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, 
> bool evict,
>           old_mem->mem_type == AMDGPU_PL_GWS ||
>           old_mem->mem_type == AMDGPU_PL_OA ||
>           old_mem->mem_type == AMDGPU_PL_DOORBELL ||
> +         old_mem->mem_type == AMDGPU_PL_MMIO_REMAP ||
>           new_mem->mem_type == AMDGPU_PL_GDS ||
>           new_mem->mem_type == AMDGPU_PL_GWS ||
>           new_mem->mem_type == AMDGPU_PL_OA ||
> -         new_mem->mem_type == AMDGPU_PL_DOORBELL) {
> +         new_mem->mem_type == AMDGPU_PL_DOORBELL ||
> +         new_mem->mem_type == AMDGPU_PL_MMIO_REMAP) {
>               /* Nothing to save here */
>               amdgpu_bo_move_notify(bo, evict, new_mem);
>               ttm_bo_move_null(bo, new_mem);
> @@ -629,6 +633,12 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_device 
> *bdev,
>               mem->bus.is_iomem = true;
>               mem->bus.caching = ttm_uncached;
>               break;
> +     case AMDGPU_PL_MMIO_REMAP:
> +             mem->bus.offset = mem->start << PAGE_SHIFT;
> +             mem->bus.offset += adev->rmmio_remap.bus_addr;
> +             mem->bus.is_iomem = true;
> +             mem->bus.caching = ttm_uncached;
> +             break;
>       default:
>               return -EINVAL;
>       }
> @@ -646,6 +656,8 @@ static unsigned long amdgpu_ttm_io_mem_pfn(struct 
> ttm_buffer_object *bo,
>  
>       if (bo->resource->mem_type == AMDGPU_PL_DOORBELL)
>               return ((uint64_t)(adev->doorbell.base + cursor.start)) >> 
> PAGE_SHIFT;
> +     else if (bo->resource->mem_type == AMDGPU_PL_MMIO_REMAP)
> +             return ((uint64_t)(adev->rmmio_remap.bus_addr + cursor.start)) 
> >> PAGE_SHIFT;
>  
>       return (adev->gmc.aper_base + cursor.start) >> PAGE_SHIFT;
>  }
> @@ -1355,7 +1367,7 @@ uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, 
> struct ttm_resource *mem)
>  
>       if (mem && (mem->mem_type == TTM_PL_TT ||
>                   mem->mem_type == AMDGPU_PL_DOORBELL ||
> -                 mem->mem_type == AMDGPU_PL_PREEMPT)) {
> +                 mem->mem_type == AMDGPU_PL_PREEMPT || mem->mem_type == 
> AMDGPU_PL_MMIO_REMAP)) {

Maybe put the new check for AMDGPU_PL_MMIO_REMAP on a new line, apart from that 
looks good to me.

Feel free to add Reviewed-by: Christian König <[email protected]>.

Regards,
Christian.

>               flags |= AMDGPU_PTE_SYSTEM;
>  
>               if (ttm->caching == ttm_cached)

Reply via email to