[PATCH v2 17/29] drm/xe: Add SVM device memory mirroring

Matthew Brost matthew.brost at intel.com
Wed Dec 11 19:44:56 UTC 2024


On Wed, Nov 20, 2024 at 05:05:32AM +0200, Gwan-gyeong Mun wrote:
> 
> 
> On 10/16/24 6:25 AM, Matthew Brost wrote:
> > +/**
> > + * xe_devm_add: Remap and provide memmap backing for device memory
> > + * @tile: tile that the memory region belongs to
> > + * @mr: memory region to remap
> > + *
> > + * This remap device memory to host physical address space and create
> > + * struct page to back device memory
> > + *
> > + * Return: 0 on success standard error code otherwise
> > + */
> > +int xe_devm_add(struct xe_tile *tile, struct xe_mem_region *mr)
> > +{
> > +	struct xe_device *xe = tile_to_xe(tile);
> > +	struct device *dev = &to_pci_dev(xe->drm.dev)->dev;
> > +	struct resource *res;
> > +	void *addr;
> > +	int ret;
> > +
> > +	res = devm_request_free_mem_region(dev, &iomem_resource,
> > +					   mr->usable_size);
> To use the devm_request_free_mem_region() function, CONFIG_GET_FREE_REGION=y
> in config.
> xe's kconfig need to have CONFIG_GET_FREE_REGION dependency.

Will add CONFIG_GET_FREE_REGION dependency or perhaps even
CONFIG_XE_DEVMEM_MIRROR Kconfig which enables this code.

Matt

> > +	if (IS_ERR(res)) {
> > +		ret = PTR_ERR(res);
> > +		return ret;
> > +	}
> > +
> > +	mr->pagemap.type = MEMORY_DEVICE_PRIVATE;
> > +	mr->pagemap.range.start = res->start;
> > +	mr->pagemap.range.end = res->end;
> > +	mr->pagemap.nr_range = 1;
> > +	mr->pagemap.ops = drm_gpusvm_pagemap_ops_get();
> > +	mr->pagemap.owner = xe_svm_devm_owner(xe);
> > +	addr = devm_memremap_pages(dev, &mr->pagemap);
> > +	if (IS_ERR(addr)) {
> > +		devm_release_mem_region(dev, res->start, resource_size(res));
> > +		ret = PTR_ERR(addr);
> > +		drm_err(&xe->drm, "Failed to remap tile %d memory, errno %d\n",
> > +				tile->id, ret);
> > +		return ret;
> > +	}
> > +	mr->hpa_base = res->start;
> > +
> > +	drm_info(&xe->drm, "Added tile %d memory [%llx-%llx] to devm, remapped to %pr\n",
> > +		 tile->id, mr->io_start, mr->io_start + mr->usable_size, res);
> > +	return 0;
> > +}


More information about the Intel-xe mailing list