ping? Haven't seen any comments on amd-gfx or dri-devel. Cheers, Tom On 18/08/17 10:07 AM, Tom St Denis wrote: > These functions replace a section of common code found > in radeon/amdgpu drivers (and possibly others) as part > of the ttm_tt_*populate() callbacks. > > Signed-off-by: Tom St Denis <tom.stdenis at amd.com> > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 41 ++++++++++++++++++++++++++++++++++++ > include/drm/ttm/ttm_page_alloc.h | 11 ++++++++++ > 2 files changed, 52 insertions(+) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index 871599826773..6a660d196d87 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -920,6 +920,47 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm) > } > EXPORT_SYMBOL(ttm_pool_unpopulate); > > +int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt) > +{ > + unsigned i; > + int r; > + > + r = ttm_pool_populate(&tt->ttm); > + if (r) > + return r; > + > + for (i = 0; i < tt->ttm.num_pages; i++) { > + tt->dma_address[i] = dma_map_page(dev, tt->ttm.pages[i], > + 0, PAGE_SIZE, > + DMA_BIDIRECTIONAL); > + if (dma_mapping_error(dev, tt->dma_address[i])) { > + while (i--) { > + dma_unmap_page(dev, tt->dma_address[i], > + PAGE_SIZE, DMA_BIDIRECTIONAL); > + tt->dma_address[i] = 0; > + } > + ttm_pool_unpopulate(&tt->ttm); > + return -EFAULT; > + } > + } > + return 0; > +} > +EXPORT_SYMBOL(ttm_populate_and_map_pages); > + > +void ttm_unmap_and_unpopulate_pages(struct device *dev, struct ttm_dma_tt *tt) > +{ > + unsigned i; > + > + for (i = 0; i < tt->ttm.num_pages; i++) { > + if (tt->dma_address[i]) { > + dma_unmap_page(dev, tt->dma_address[i], > + PAGE_SIZE, DMA_BIDIRECTIONAL); > + } > + } > + ttm_pool_unpopulate(&tt->ttm); > +} > +EXPORT_SYMBOL(ttm_unmap_and_unpopulate_pages); > + > int ttm_page_alloc_debugfs(struct seq_file *m, void *data) > { > struct ttm_page_pool *p; > diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h > index 49a828425fa2..8695918ea629 100644 > --- a/include/drm/ttm/ttm_page_alloc.h > +++ b/include/drm/ttm/ttm_page_alloc.h > @@ -83,6 +83,17 @@ extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data); > extern int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev); > extern void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev); > > + > +/** > + * Populates and DMA maps pages to fullfil a ttm_dma_populate() request > + */ > +int ttm_populate_and_map_pages(struct device *dev, struct ttm_dma_tt *tt); > + > +/** > + * Unpopulates and DMA unmaps pages as part of a > + * ttm_dma_unpopulate() request */ > +void ttm_unmap_and_unpopulate_pages(struct device *dev, struct ttm_dma_tt *tt); > + > #else > static inline int ttm_dma_page_alloc_init(struct ttm_mem_global *glob, > unsigned max_pages) >