WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 2/9] ttm: Introduce ttm_page_alloc_func structure.

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


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel