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

Reply via email to