Which has the function members for all of the current page pool operations defined. The old calls (ttm_put_pages, ttm_get_pages, etc) are plumbed through little functions which lookup in the ttm_page_alloc_func the appropiate implementation and call it. There is currently only one page pool code so the default registration goes to 'ttm_page_alloc_default'. The subsequent patch "ttm: Provide a DMA aware TTM page pool code." introduces the one to be used when the SWIOTLB code is turned on (that implementation is a union of the default TTM pool code with the DMA pool code). Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- drivers/gpu/drm/ttm/ttm_memory.c | 3 ++ drivers/gpu/drm/ttm/ttm_page_alloc.c | 58 ++++++++++++++++++++++++++++---- include/drm/ttm/ttm_page_alloc.h | 60 ++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c index e70ddd8..c7d97a5 100644 --- a/drivers/gpu/drm/ttm/ttm_memory.c +++ b/drivers/gpu/drm/ttm/ttm_memory.c @@ -356,6 +356,8 @@ static int ttm_mem_init_dma32_zone(struct ttm_mem_global *glob, } #endif +struct ttm_page_alloc_func *ttm_page_alloc; + int ttm_mem_global_init(struct ttm_mem_global *glob) { struct sysinfo si; @@ -394,6 +396,7 @@ int ttm_mem_global_init(struct ttm_mem_global *glob) "Zone %7s: Available graphics memory: %llu kiB.\n", zone->name, (unsigned long long) zone->max_mem >> 10); } + ttm_page_alloc = &ttm_page_alloc_default; ttm_page_alloc_init(glob, glob->zone_kernel->max_mem/(2*PAGE_SIZE)); return 0; out_no_zone: diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index d948575..6a888f8 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -664,9 +664,9 @@ out: * On success pages list will hold count number of correctly * cached pages. */ -int ttm_get_pages(struct list_head *pages, int flags, - enum ttm_caching_state cstate, unsigned count, - dma_addr_t *dma_address) +int __ttm_get_pages(struct list_head *pages, int flags, + enum ttm_caching_state cstate, unsigned count, + dma_addr_t *dma_address) { struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); struct page *p = NULL; @@ -734,8 +734,8 @@ int ttm_get_pages(struct list_head *pages, int flags, } /* Put all pages in pages list to correct pool to wait for reuse */ -void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, - enum ttm_caching_state cstate, dma_addr_t *dma_address) +void __ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, + enum ttm_caching_state cstate, dma_addr_t *dma_address) { unsigned long irq_flags; struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); @@ -785,7 +785,7 @@ static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags, pool->name = name; } -int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) +int __ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) { int ret; @@ -822,7 +822,7 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) return 0; } -void ttm_page_alloc_fini(void) +void __ttm_page_alloc_fini(void) { int i; @@ -836,7 +836,7 @@ void ttm_page_alloc_fini(void) _manager = NULL; } -int ttm_page_alloc_debugfs(struct seq_file *m, void *data) +int __ttm_page_alloc_debugfs(struct seq_file *m, void *data) { struct ttm_page_pool *p; unsigned i; @@ -856,4 +856,46 @@ int ttm_page_alloc_debugfs(struct seq_file *m, void *data) } return 0; } + +struct ttm_page_alloc_func ttm_page_alloc_default = { + .get_pages = __ttm_get_pages, + .put_pages = __ttm_put_pages, + .alloc_init = __ttm_page_alloc_init, + .alloc_fini = __ttm_page_alloc_fini, + .debugfs = __ttm_page_alloc_debugfs, +}; + +int ttm_get_pages(struct list_head *pages, int flags, + enum ttm_caching_state cstate, unsigned count, + dma_addr_t *dma_address) +{ + if (ttm_page_alloc && ttm_page_alloc->get_pages) + return ttm_page_alloc->get_pages(pages, flags, cstate, count, + dma_address); + return -1; +} +void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, + enum ttm_caching_state cstate, dma_addr_t *dma_address) +{ + if (ttm_page_alloc && ttm_page_alloc->put_pages) + ttm_page_alloc->put_pages(pages, page_count, flags, cstate, + dma_address); +} +int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) +{ + if (ttm_page_alloc && ttm_page_alloc->alloc_init) + return ttm_page_alloc->alloc_init(glob, max_pages); + return -1; +} +void ttm_page_alloc_fini(void) +{ + if (ttm_page_alloc && ttm_page_alloc->alloc_fini) + ttm_page_alloc->alloc_fini(); +} +int ttm_page_alloc_debugfs(struct seq_file *m, void *data) +{ + if (ttm_page_alloc && ttm_page_alloc->debugfs) + return ttm_page_alloc->debugfs(m, data); + return -1; +} EXPORT_SYMBOL(ttm_page_alloc_debugfs); diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h index 0017b17..6e8d73a 100644 --- a/include/drm/ttm/ttm_page_alloc.h +++ b/include/drm/ttm/ttm_page_alloc.h @@ -29,6 +29,66 @@ #include "ttm_bo_driver.h" #include "ttm_memory.h" +struct ttm_page_alloc_func { + /** + * struct ttm_page_alloc_func member get_pages + * Get count number of pages from pool to pages list. + * + * @pages: head of empty linked list where pages are filled. + * @flags: ttm flags for page allocation. + * @cstate: ttm caching state for the page. + * @count: number of pages to allocate. + * @dma_address: The DMA (bus) address of pages (by default zero). + */ + int (*get_pages) (struct list_head *pages, + int flags, + enum ttm_caching_state cstate, + unsigned count, + dma_addr_t *dma_address); + /** + * struct ttm_page_alloc_func member put_pages. + * + * Put linked list of pages to pool. + * + * @pages: list of pages to free. + * @page_count: number of pages in the list. Zero can be passed for + * unknown count. + * @flags: ttm flags for page allocation. + * @cstate: ttm caching state. + * @dma_address: The DMA (bus) address of pages (by default zero). + */ + void (*put_pages)(struct list_head *pages, + unsigned page_count, + int flags, + enum ttm_caching_state cstate, + dma_addr_t *dma_address); + /** + * struct ttm_page_alloc_func member alloc_init. + * + * Initialize pool allocator. + */ + int (*alloc_init)(struct ttm_mem_global *glob, unsigned max_pages); + + /** + * struct ttm_page_alloc_func member alloc_fini. + * + * Free pool allocator. + */ + void (*alloc_fini)(void); + + /** + * struct ttm_page_alloc_func member debugfs. + * + * Output the state of pools to debugfs file + */ + int (*debugfs)(struct seq_file *m, void *data); +}; + +extern struct ttm_page_alloc_func *ttm_page_alloc; + +/* Defined in ttm_page_alloc.c */ +extern struct ttm_page_alloc_func ttm_page_alloc_default; + /** * Get count number of pages from pool to pages list. * -- 1.7.4.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel