summaryrefslogtreecommitdiff
path: root/linux/i810_dma.c
diff options
context:
space:
mode:
authorAlan Hourihane <alanh@fairlite.demon.co.uk>2002-10-22 23:38:53 +0000
committerAlan Hourihane <alanh@fairlite.demon.co.uk>2002-10-22 23:38:53 +0000
commitb3a20ce219b353aa3e2b7f3b47ffd28b279557c7 (patch)
tree711b5b132bafc64ecb8fad9c1ff7e461781e869e /linux/i810_dma.c
parentff4baa69da278b7f616063f37fbd27febf3eb211 (diff)
final part of XFree86 4.2.99.2 mergeX_4_2_99_2-20021023-merge
Diffstat (limited to 'linux/i810_dma.c')
-rw-r--r--linux/i810_dma.c56
1 files changed, 14 insertions, 42 deletions
diff --git a/linux/i810_dma.c b/linux/i810_dma.c
index f4eef3a3..e95554a6 100644
--- a/linux/i810_dma.c
+++ b/linux/i810_dma.c
@@ -39,6 +39,12 @@
#include <linux/interrupt.h> /* For task queue support */
#include <linux/delay.h>
+#ifdef DO_MUNMAP_4_ARGS
+#define DO_MUNMAP(m, a, l) do_munmap(m, a, l, 1)
+#else
+#define DO_MUNMAP(m, a, l) do_munmap(m, a, l)
+#endif
+
#define I810_BUF_FREE 2
#define I810_BUF_CLIENT 1
#define I810_BUF_HARDWARE 0
@@ -218,7 +224,7 @@ static int i810_unmap_buffer(drm_buf_t *buf)
#else
down_write( &current->mm->mmap_sem );
#endif
- retcode = do_munmap(current->mm,
+ retcode = DO_MUNMAP(current->mm,
(unsigned long)buf_priv->virtual,
(size_t) buf->total);
#if LINUX_VERSION_CODE <= 0x020402
@@ -263,44 +269,6 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
return retcode;
}
-static unsigned long i810_alloc_page(drm_device_t *dev)
-{
- unsigned long address;
-
- address = __get_free_page(GFP_KERNEL);
- if(address == 0UL)
- return 0;
-
-#if LINUX_VERSION_CODE < 0x020409
- atomic_inc(&virt_to_page(address)->count);
- set_bit(PG_locked, &virt_to_page(address)->flags);
-#else
- get_page(virt_to_page(address));
-#if LINUX_VERSION_CODE < 0x020500
- LockPage(virt_to_page(address));
-#else
- SetPageLocked(virt_to_page(address));
-#endif
-#endif
- return address;
-}
-
-static void i810_free_page(drm_device_t *dev, unsigned long page)
-{
- if (page) {
-#if LINUX_VERSION_CODE < 0x020409
- atomic_dec(&virt_to_page(page)->count);
- clear_bit(PG_locked, &virt_to_page(page)->flags);
- wake_up(&virt_to_page(page)->wait);
-#else
- struct page *p = virt_to_page(page);
- put_page(p);
- unlock_page(p);
-#endif
- free_page(page);
- }
-}
-
static int i810_dma_cleanup(drm_device_t *dev)
{
drm_device_dma_t *dma = dev->dma;
@@ -315,7 +283,9 @@ static int i810_dma_cleanup(drm_device_t *dev)
dev_priv->ring.Size);
}
if(dev_priv->hw_status_page != 0UL) {
- i810_free_page(dev, dev_priv->hw_status_page);
+ pci_free_consistent(dev->pdev, PAGE_SIZE,
+ (void *)dev_priv->hw_status_page,
+ dev_priv->dma_status_page);
/* Need to rewrite hardware status page */
I810_WRITE(0x02080, 0x1ffff000);
}
@@ -475,7 +445,9 @@ static int i810_dma_initialize(drm_device_t *dev,
dev_priv->zi1 = init->depth_offset | init->pitch_bits;
/* Program Hardware Status Page */
- dev_priv->hw_status_page = i810_alloc_page(dev);
+ dev_priv->hw_status_page =
+ (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE,
+ &dev_priv->dma_status_page);
if(dev_priv->hw_status_page == 0UL) {
dev->dev_private = (void *)dev_priv;
i810_dma_cleanup(dev);
@@ -485,7 +457,7 @@ static int i810_dma_initialize(drm_device_t *dev,
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
- I810_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+ I810_WRITE(0x02080, dev_priv->dma_status_page);
DRM_DEBUG("Enabled hardware status page\n");
/* Now we need to init our freelist */