summaryrefslogtreecommitdiff
path: root/linux-core/drm_ttm.c
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2007-02-08 13:29:08 +0100
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2007-02-08 13:29:08 +0100
commit1257907fa9a24de7aa95485e1b3ab509fdc4d4e6 (patch)
treea73a3d646917f4df5192bfe3bb23805e33d583fd /linux-core/drm_ttm.c
parent09984ad77bdeca0e9d87b1fe2be1489205fda297 (diff)
Simplify external ttm page allocation.
Implement a memcpy fallback for copying between buffers.
Diffstat (limited to 'linux-core/drm_ttm.c')
-rw-r--r--linux-core/drm_ttm.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c
index 34282292..5c270bee 100644
--- a/linux-core/drm_ttm.c
+++ b/linux-core/drm_ttm.c
@@ -80,7 +80,7 @@ static void ttm_free_pages(drm_ttm_t *ttm)
}
-struct page *drm_ttm_alloc_page(void)
+static struct page *drm_ttm_alloc_page(void)
{
struct page *page;
@@ -192,27 +192,37 @@ int drm_destroy_ttm(drm_ttm_t * ttm)
return 0;
}
+struct page *drm_ttm_get_page(drm_ttm_t *ttm, int index)
+{
+ struct page *p;
+ drm_buffer_manager_t *bm = &ttm->dev->bm;
+
+ p = ttm->pages[index];
+ if (!p) {
+ p = drm_ttm_alloc_page();
+ if (!p)
+ return NULL;
+ ttm->pages[index] = p;
+ ++bm->cur_pages;
+ }
+ return p;
+}
+
+
static int drm_ttm_populate(drm_ttm_t * ttm)
{
struct page *page;
unsigned long i;
- drm_buffer_manager_t *bm;
drm_ttm_backend_t *be;
if (ttm->state != ttm_unpopulated)
return 0;
- bm = &ttm->dev->bm;
be = ttm->be;
for (i = 0; i < ttm->num_pages; ++i) {
- page = ttm->pages[i];
- if (!page) {
- page = drm_ttm_alloc_page();
- if (!page)
- return -ENOMEM;
- ttm->pages[i] = page;
- ++bm->cur_pages;
- }
+ page = drm_ttm_get_page(ttm, i);
+ if (!page)
+ return -ENOMEM;
}
be->populate(be, ttm->num_pages, ttm->pages);
ttm->state = ttm_unbound;