Message ID | 20170818140727.8342-1-tom.stdenis@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@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) >
Reviewed-by: Christian König <christian.koenig@amd.com> for this one as well as the two patches for radeon and amdgpu. Feel free to also add my Acked-by to the nouveau patch. Regards, Christian. Am 22.08.2017 um 13:13 schrieb Tom St Denis: > 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@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) >> > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
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)
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@amd.com> --- drivers/gpu/drm/ttm/ttm_page_alloc.c | 41 ++++++++++++++++++++++++++++++++++++ include/drm/ttm/ttm_page_alloc.h | 11 ++++++++++ 2 files changed, 52 insertions(+)