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; > > +}