[PATCH v2 21/29] drm/xe: Add Xe SVM populate_devmem_pfn vfunc

Thomas Hellström thomas.hellstrom at linux.intel.com
Mon Dec 2 10:19:52 UTC 2024


On Tue, 2024-10-15 at 20:25 -0700, Matthew Brost wrote:
> Get VRAM pfns from BO's buddy blocks.
> 
> v2:
>  - Use new drm_gpusvm_devmem_ops
> 
> Signed-off-by: Niranjana Vishwanathapura
> <niranjana.vishwanathapura at intel.com>
> Signed-off-by: Oak Zeng <oak.zeng at intel.com>
> Signed-off-by: Matthew Brost <matthew.brost at intel.com>

Reviewed-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>

> ---
>  drivers/gpu/drm/xe/xe_svm.c | 40
> +++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_svm.c
> b/drivers/gpu/drm/xe/xe_svm.c
> index 4f01941b2cc2..19fcb8f71791 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -9,6 +9,7 @@
>  #include "xe_migrate.h"
>  #include "xe_pt.h"
>  #include "xe_svm.h"
> +#include "xe_ttm_vram_mgr.h"
>  #include "xe_vm.h"
>  #include "xe_vm_types.h"
>  
> @@ -413,8 +414,47 @@ static int xe_svm_copy_to_ram(struct page
> **pages, dma_addr_t *dma_addr,
>  	return xe_svm_copy(pages, dma_addr, npages,
> XE_SVM_COPY_TO_SRAM);
>  }
>  
> +static struct xe_bo *to_xe_bo(struct drm_gpusvm_devmem
> *devmem_allocation)
> +{
> +	return container_of(devmem_allocation, struct xe_bo,
> devmem_allocation);
> +}
> +
> +static u64 block_offset_to_pfn(struct xe_mem_region *mr, u64 offset)
> +{
> +	return PHYS_PFN(offset + mr->hpa_base);
> +}
> +
> +static struct drm_buddy *tile_to_buddy(struct xe_tile *tile)
> +{
> +	return &tile->mem.vram_mgr->mm;
> +}
> +
> +static int xe_svm_populate_devmem_pfn(struct drm_gpusvm_devmem
> *devmem_allocation,
> +				      unsigned long npages, unsigned
> long *pfn)
> +{
> +	struct xe_bo *bo = to_xe_bo(devmem_allocation);
> +	struct ttm_resource *res = bo->ttm.resource;
> +	struct list_head *blocks =
> &to_xe_ttm_vram_mgr_resource(res)->blocks;
> +	struct drm_buddy_block *block;
> +	int j =0;
> +
> +	list_for_each_entry(block, blocks, link) {
> +		struct xe_mem_region *mr = block->private;
> +		struct xe_tile *tile = mr_to_tile(mr);
> +		struct drm_buddy *buddy = tile_to_buddy(tile);
> +		u64 block_pfn = block_offset_to_pfn(mr,
> drm_buddy_block_offset(block));
> +		int i;
> +
> +		for(i = 0; i < drm_buddy_block_size(buddy, block) >>
> PAGE_SHIFT; ++i)
> +			pfn[j++] = block_pfn + i;
> +	}
> +
> +	return 0;
> +}
> +
>  __maybe_unused
>  static const struct drm_gpusvm_devmem_ops gpusvm_devmem_ops = {
> +	.populate_devmem_pfn = xe_svm_populate_devmem_pfn,
>  	.copy_to_devmem = xe_svm_copy_to_devmem,
>  	.copy_to_ram = xe_svm_copy_to_ram,
>  };



More information about the dri-devel mailing list