summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-12-27 15:32:09 +0100
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-12-27 15:32:09 +0100
commit975136d6e5adc6b6a03719499cf39fbd3f67dc90 (patch)
tree86767019ee5da639391837d2a570e9a5e4fa3c41
parentc38ede06670b47620bbce33c5a4affd063769475 (diff)
Proper allocation of AGP pages for ttms.
-rw-r--r--linux-core/drm_compat.c5
-rw-r--r--linux-core/drm_compat.h13
-rw-r--r--linux-core/drm_ttm.c6
-rw-r--r--linux-core/drm_vm.c5
4 files changed, 9 insertions, 20 deletions
diff --git a/linux-core/drm_compat.c b/linux-core/drm_compat.c
index cde77ea7..6bb58424 100644
--- a/linux-core/drm_compat.c
+++ b/linux-core/drm_compat.c
@@ -251,7 +251,8 @@ struct page *drm_vm_ttm_nopage(struct vm_area_struct *vma,
page = NOPAGE_OOM;
goto out;
}
- page = ttm->pages[page_offset] = drm_alloc_gatt_pages(0);
+ page = ttm->pages[page_offset] =
+ alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32);
if (!page) {
drm_free_memctl(PAGE_SIZE);
page = NOPAGE_OOM;
@@ -259,8 +260,6 @@ struct page *drm_vm_ttm_nopage(struct vm_area_struct *vma,
}
++bm->cur_pages;
SetPageLocked(page);
- clear_page(kmap(page));
- kunmap(page);
}
get_page(page);
diff --git a/linux-core/drm_compat.h b/linux-core/drm_compat.h
index dcda1936..ddc255d3 100644
--- a/linux-core/drm_compat.h
+++ b/linux-core/drm_compat.h
@@ -180,16 +180,9 @@ extern void drm_clear_vma(struct vm_area_struct *vma,
extern pgprot_t vm_get_page_prot(unsigned long vm_flags);
-/*
- * These are similar to the current kernel gatt pages allocator, only that we
- * want a struct page pointer instead of a virtual address. This allows for pages
- * that are not in the kernel linear map.
- */
-
-#define drm_alloc_gatt_pages(order) ({ \
- void *_virt = alloc_gatt_pages(order); \
- ((_virt) ? virt_to_page(_virt) : NULL);})
-#define drm_free_gatt_pages(pages, order) free_gatt_pages(page_address(pages), order)
+#ifndef GFP_DMA32
+#define GFP_DMA32 0
+#endif
#if defined(CONFIG_X86) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15))
diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c
index c32dfcf9..1c9b1cf7 100644
--- a/linux-core/drm_ttm.c
+++ b/linux-core/drm_ttm.c
@@ -193,7 +193,7 @@ int drm_destroy_ttm(drm_ttm_t * ttm)
* End debugging.
*/
- drm_free_gatt_pages(*cur_page, 0);
+ __free_page(*cur_page);
drm_free_memctl(PAGE_SIZE);
--bm->cur_pages;
}
@@ -225,7 +225,7 @@ static int drm_ttm_populate(drm_ttm_t * ttm)
if (drm_alloc_memctl(PAGE_SIZE)) {
return -ENOMEM;
}
- page = drm_alloc_gatt_pages(0);
+ page = alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32);
if (!page) {
drm_free_memctl(PAGE_SIZE);
return -ENOMEM;
@@ -235,8 +235,6 @@ static int drm_ttm_populate(drm_ttm_t * ttm)
#else
SetPageReserved(page);
#endif
- clear_page(kmap(page));
- kunmap(page);
ttm->pages[i] = page;
++bm->cur_pages;
}
diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c
index f36218e9..7ac7f3c0 100644
--- a/linux-core/drm_vm.c
+++ b/linux-core/drm_vm.c
@@ -208,7 +208,8 @@ struct page *drm_vm_ttm_fault(struct vm_area_struct *vma,
data->type = VM_FAULT_OOM;
goto out;
}
- page = ttm->pages[page_offset] = drm_alloc_gatt_pages(0);
+ page = ttm->pages[page_offset] =
+ alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32);
if (!page) {
drm_free_memctl(PAGE_SIZE);
data->type = VM_FAULT_OOM;
@@ -220,8 +221,6 @@ struct page *drm_vm_ttm_fault(struct vm_area_struct *vma,
#else
SetPageReserved(page);
#endif
- clear_page(kmap(page));
- kunmap(page);
}
if (ttm->page_flags & DRM_TTM_PAGE_UNCACHED) {