final part of XFree86 4.2.99.2 merge
parent
ff4baa69da
commit
b3a20ce219
|
@ -1,5 +1,4 @@
|
||||||
|
XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.9 2002/02/27 22:18:10 tsi Exp $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.8 2001/12/13 00:24:45 alanh Exp $
|
|
||||||
|
|
||||||
XCOMM This is a kludge until we determine how best to build the
|
XCOMM This is a kludge until we determine how best to build the
|
||||||
XCOMM kernel-specific device driver. This allows us to continue
|
XCOMM kernel-specific device driver. This allows us to continue
|
||||||
|
|
|
@ -27,13 +27,14 @@
|
||||||
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
|
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
* Kevin E. Martin <martin@valinux.com>
|
* Kevin E. Martin <martin@valinux.com>
|
||||||
*
|
*
|
||||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.25 2001/08/27 17:40:59 dawes Exp $
|
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.28 2002/10/16 01:26:49 dawes Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef XFree86Server
|
#ifdef XFree86Server
|
||||||
# include "xf86.h"
|
# include "xf86.h"
|
||||||
# include "xf86_OSproc.h"
|
# include "xf86_OSproc.h"
|
||||||
|
# include "drm.h"
|
||||||
# include "xf86_ansic.h"
|
# include "xf86_ansic.h"
|
||||||
# define _DRM_MALLOC xalloc
|
# define _DRM_MALLOC xalloc
|
||||||
# define _DRM_FREE xfree
|
# define _DRM_FREE xfree
|
||||||
|
@ -66,6 +67,7 @@ extern int xf86RemoveSIGIOHandler(int fd);
|
||||||
# define _DRM_MALLOC Xmalloc
|
# define _DRM_MALLOC Xmalloc
|
||||||
# define _DRM_FREE Xfree
|
# define _DRM_FREE Xfree
|
||||||
# endif
|
# endif
|
||||||
|
# include "drm.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* No longer needed with CVS kernel modules on alpha
|
/* No longer needed with CVS kernel modules on alpha
|
||||||
|
@ -81,7 +83,6 @@ extern unsigned long _bus_base(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "xf86drm.h"
|
#include "xf86drm.h"
|
||||||
#include "drm.h"
|
|
||||||
|
|
||||||
#ifndef DRM_MAJOR
|
#ifndef DRM_MAJOR
|
||||||
#define DRM_MAJOR 226 /* Linux */
|
#define DRM_MAJOR 226 /* Linux */
|
||||||
|
@ -197,7 +198,6 @@ static int drmOpenDevice(long dev, int minor)
|
||||||
stat_t st;
|
stat_t st;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
int fd;
|
int fd;
|
||||||
mode_t dirmode = DRM_DEV_DIRMODE;
|
|
||||||
mode_t devmode = DRM_DEV_MODE;
|
mode_t devmode = DRM_DEV_MODE;
|
||||||
int isroot = !geteuid();
|
int isroot = !geteuid();
|
||||||
#if defined(XFree86Server)
|
#if defined(XFree86Server)
|
||||||
|
@ -209,23 +209,16 @@ static int drmOpenDevice(long dev, int minor)
|
||||||
|
|
||||||
#if defined(XFree86Server)
|
#if defined(XFree86Server)
|
||||||
devmode = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
|
devmode = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
|
||||||
dirmode = (devmode & S_IRUSR) ? S_IXUSR : 0;
|
|
||||||
dirmode |= (devmode & S_IRGRP) ? S_IXGRP : 0;
|
|
||||||
dirmode |= (devmode & S_IROTH) ? S_IXOTH : 0;
|
|
||||||
dirmode |= devmode;
|
|
||||||
devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
|
devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||||
group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
|
group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (stat(DRM_DIR_NAME, &st)) {
|
if (stat(DRM_DIR_NAME, &st)) {
|
||||||
if (!isroot) return DRM_ERR_NOT_ROOT;
|
if (!isroot) return DRM_ERR_NOT_ROOT;
|
||||||
remove(DRM_DIR_NAME);
|
mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
|
||||||
mkdir(DRM_DIR_NAME, dirmode);
|
chown(DRM_DIR_NAME, 0, 0); /* root:root */
|
||||||
|
chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
|
||||||
}
|
}
|
||||||
#if defined(XFree86Server)
|
|
||||||
chown(DRM_DIR_NAME, user, group);
|
|
||||||
chmod(DRM_DIR_NAME, dirmode);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
|
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
|
||||||
drmMsg("drmOpenDevice: node name is %s\n", buf);
|
drmMsg("drmOpenDevice: node name is %s\n", buf);
|
||||||
|
|
|
@ -71,7 +71,7 @@ struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
|
||||||
* Find the right map
|
* Find the right map
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(!dev->agp->cant_use_aperture) goto vm_nopage_error;
|
if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error;
|
||||||
|
|
||||||
list_for_each(list, &dev->maplist->head) {
|
list_for_each(list, &dev->maplist->head) {
|
||||||
r_list = (drm_map_list_t *)list;
|
r_list = (drm_map_list_t *)list;
|
||||||
|
@ -408,7 +408,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
||||||
|
|
||||||
if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
|
if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
|
||||||
vma->vm_flags &= VM_MAYWRITE;
|
vma->vm_flags &= VM_MAYWRITE;
|
||||||
#if defined(__i386__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
|
pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
|
||||||
#else
|
#else
|
||||||
/* Ye gads this is ugly. With more thought
|
/* Ye gads this is ugly. With more thought
|
||||||
|
@ -435,7 +435,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
||||||
case _DRM_FRAME_BUFFER:
|
case _DRM_FRAME_BUFFER:
|
||||||
case _DRM_REGISTERS:
|
case _DRM_REGISTERS:
|
||||||
if (VM_OFFSET(vma) >= __pa(high_memory)) {
|
if (VM_OFFSET(vma) >= __pa(high_memory)) {
|
||||||
#if defined(__i386__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
|
if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
|
||||||
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
|
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
|
||||||
pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
|
pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
|
||||||
|
|
|
@ -39,6 +39,12 @@
|
||||||
#include <linux/interrupt.h> /* For task queue support */
|
#include <linux/interrupt.h> /* For task queue support */
|
||||||
#include <linux/delay.h>
|
#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_FREE 2
|
||||||
#define I810_BUF_CLIENT 1
|
#define I810_BUF_CLIENT 1
|
||||||
#define I810_BUF_HARDWARE 0
|
#define I810_BUF_HARDWARE 0
|
||||||
|
@ -218,7 +224,7 @@ static int i810_unmap_buffer(drm_buf_t *buf)
|
||||||
#else
|
#else
|
||||||
down_write( ¤t->mm->mmap_sem );
|
down_write( ¤t->mm->mmap_sem );
|
||||||
#endif
|
#endif
|
||||||
retcode = do_munmap(current->mm,
|
retcode = DO_MUNMAP(current->mm,
|
||||||
(unsigned long)buf_priv->virtual,
|
(unsigned long)buf_priv->virtual,
|
||||||
(size_t) buf->total);
|
(size_t) buf->total);
|
||||||
#if LINUX_VERSION_CODE <= 0x020402
|
#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;
|
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)
|
static int i810_dma_cleanup(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
drm_device_dma_t *dma = dev->dma;
|
drm_device_dma_t *dma = dev->dma;
|
||||||
|
@ -315,7 +283,9 @@ static int i810_dma_cleanup(drm_device_t *dev)
|
||||||
dev_priv->ring.Size);
|
dev_priv->ring.Size);
|
||||||
}
|
}
|
||||||
if(dev_priv->hw_status_page != 0UL) {
|
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 */
|
/* Need to rewrite hardware status page */
|
||||||
I810_WRITE(0x02080, 0x1ffff000);
|
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;
|
dev_priv->zi1 = init->depth_offset | init->pitch_bits;
|
||||||
|
|
||||||
/* Program Hardware Status Page */
|
/* 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) {
|
if(dev_priv->hw_status_page == 0UL) {
|
||||||
dev->dev_private = (void *)dev_priv;
|
dev->dev_private = (void *)dev_priv;
|
||||||
i810_dma_cleanup(dev);
|
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);
|
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
||||||
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
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");
|
DRM_DEBUG("Enabled hardware status page\n");
|
||||||
|
|
||||||
/* Now we need to init our freelist */
|
/* Now we need to init our freelist */
|
||||||
|
|
|
@ -64,6 +64,8 @@ typedef struct drm_i810_private {
|
||||||
unsigned long hw_status_page;
|
unsigned long hw_status_page;
|
||||||
unsigned long counter;
|
unsigned long counter;
|
||||||
|
|
||||||
|
dma_addr_t dma_status_page;
|
||||||
|
|
||||||
drm_buf_t *mmap_buffer;
|
drm_buf_t *mmap_buffer;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -272,29 +272,6 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long i830_alloc_page(drm_device_t *dev)
|
|
||||||
{
|
|
||||||
unsigned long address;
|
|
||||||
|
|
||||||
address = __get_free_page(GFP_KERNEL);
|
|
||||||
if(address == 0UL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
get_page(virt_to_page(address));
|
|
||||||
LockPage(virt_to_page(address));
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i830_free_page(drm_device_t *dev, unsigned long page)
|
|
||||||
{
|
|
||||||
if (page) {
|
|
||||||
struct page *p = virt_to_page(page);
|
|
||||||
put_page(p);
|
|
||||||
UnlockPage(p);
|
|
||||||
free_page(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int i830_dma_cleanup(drm_device_t *dev)
|
static int i830_dma_cleanup(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
drm_device_dma_t *dma = dev->dma;
|
drm_device_dma_t *dma = dev->dma;
|
||||||
|
@ -309,7 +286,9 @@ static int i830_dma_cleanup(drm_device_t *dev)
|
||||||
dev_priv->ring.Size);
|
dev_priv->ring.Size);
|
||||||
}
|
}
|
||||||
if(dev_priv->hw_status_page != 0UL) {
|
if(dev_priv->hw_status_page != 0UL) {
|
||||||
i830_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 */
|
/* Need to rewrite hardware status page */
|
||||||
I830_WRITE(0x02080, 0x1ffff000);
|
I830_WRITE(0x02080, 0x1ffff000);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +462,9 @@ static int i830_dma_initialize(drm_device_t *dev,
|
||||||
dev_priv->depth_pitch = init->depth_pitch;
|
dev_priv->depth_pitch = init->depth_pitch;
|
||||||
|
|
||||||
/* Program Hardware Status Page */
|
/* Program Hardware Status Page */
|
||||||
dev_priv->hw_status_page = i830_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) {
|
if(dev_priv->hw_status_page == 0UL) {
|
||||||
dev->dev_private = (void *)dev_priv;
|
dev->dev_private = (void *)dev_priv;
|
||||||
i830_dma_cleanup(dev);
|
i830_dma_cleanup(dev);
|
||||||
|
@ -493,7 +474,7 @@ static int i830_dma_initialize(drm_device_t *dev,
|
||||||
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
||||||
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
||||||
|
|
||||||
I830_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
|
I830_WRITE(0x02080, dev_priv->dma_status_page);
|
||||||
DRM_DEBUG("Enabled hardware status page\n");
|
DRM_DEBUG("Enabled hardware status page\n");
|
||||||
|
|
||||||
/* Now we need to init our freelist */
|
/* Now we need to init our freelist */
|
||||||
|
|
|
@ -64,6 +64,8 @@ typedef struct drm_i830_private {
|
||||||
unsigned long hw_status_page;
|
unsigned long hw_status_page;
|
||||||
unsigned long counter;
|
unsigned long counter;
|
||||||
|
|
||||||
|
dma_addr_t dma_status_page;
|
||||||
|
|
||||||
drm_buf_t *mmap_buffer;
|
drm_buf_t *mmap_buffer;
|
||||||
|
|
||||||
u32 front_di1, back_di1, zi1;
|
u32 front_di1, back_di1, zi1;
|
||||||
|
|
|
@ -71,7 +71,7 @@ struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
|
||||||
* Find the right map
|
* Find the right map
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(!dev->agp->cant_use_aperture) goto vm_nopage_error;
|
if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error;
|
||||||
|
|
||||||
list_for_each(list, &dev->maplist->head) {
|
list_for_each(list, &dev->maplist->head) {
|
||||||
r_list = (drm_map_list_t *)list;
|
r_list = (drm_map_list_t *)list;
|
||||||
|
@ -408,7 +408,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
||||||
|
|
||||||
if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
|
if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
|
||||||
vma->vm_flags &= VM_MAYWRITE;
|
vma->vm_flags &= VM_MAYWRITE;
|
||||||
#if defined(__i386__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
|
pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
|
||||||
#else
|
#else
|
||||||
/* Ye gads this is ugly. With more thought
|
/* Ye gads this is ugly. With more thought
|
||||||
|
@ -435,7 +435,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
||||||
case _DRM_FRAME_BUFFER:
|
case _DRM_FRAME_BUFFER:
|
||||||
case _DRM_REGISTERS:
|
case _DRM_REGISTERS:
|
||||||
if (VM_OFFSET(vma) >= __pa(high_memory)) {
|
if (VM_OFFSET(vma) >= __pa(high_memory)) {
|
||||||
#if defined(__i386__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
|
if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
|
||||||
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
|
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
|
||||||
pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
|
pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
|
||||||
|
|
|
@ -39,6 +39,12 @@
|
||||||
#include <linux/interrupt.h> /* For task queue support */
|
#include <linux/interrupt.h> /* For task queue support */
|
||||||
#include <linux/delay.h>
|
#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_FREE 2
|
||||||
#define I810_BUF_CLIENT 1
|
#define I810_BUF_CLIENT 1
|
||||||
#define I810_BUF_HARDWARE 0
|
#define I810_BUF_HARDWARE 0
|
||||||
|
@ -218,7 +224,7 @@ static int i810_unmap_buffer(drm_buf_t *buf)
|
||||||
#else
|
#else
|
||||||
down_write( ¤t->mm->mmap_sem );
|
down_write( ¤t->mm->mmap_sem );
|
||||||
#endif
|
#endif
|
||||||
retcode = do_munmap(current->mm,
|
retcode = DO_MUNMAP(current->mm,
|
||||||
(unsigned long)buf_priv->virtual,
|
(unsigned long)buf_priv->virtual,
|
||||||
(size_t) buf->total);
|
(size_t) buf->total);
|
||||||
#if LINUX_VERSION_CODE <= 0x020402
|
#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;
|
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)
|
static int i810_dma_cleanup(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
drm_device_dma_t *dma = dev->dma;
|
drm_device_dma_t *dma = dev->dma;
|
||||||
|
@ -315,7 +283,9 @@ static int i810_dma_cleanup(drm_device_t *dev)
|
||||||
dev_priv->ring.Size);
|
dev_priv->ring.Size);
|
||||||
}
|
}
|
||||||
if(dev_priv->hw_status_page != 0UL) {
|
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 */
|
/* Need to rewrite hardware status page */
|
||||||
I810_WRITE(0x02080, 0x1ffff000);
|
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;
|
dev_priv->zi1 = init->depth_offset | init->pitch_bits;
|
||||||
|
|
||||||
/* Program Hardware Status Page */
|
/* 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) {
|
if(dev_priv->hw_status_page == 0UL) {
|
||||||
dev->dev_private = (void *)dev_priv;
|
dev->dev_private = (void *)dev_priv;
|
||||||
i810_dma_cleanup(dev);
|
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);
|
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
||||||
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
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");
|
DRM_DEBUG("Enabled hardware status page\n");
|
||||||
|
|
||||||
/* Now we need to init our freelist */
|
/* Now we need to init our freelist */
|
||||||
|
|
|
@ -64,6 +64,8 @@ typedef struct drm_i810_private {
|
||||||
unsigned long hw_status_page;
|
unsigned long hw_status_page;
|
||||||
unsigned long counter;
|
unsigned long counter;
|
||||||
|
|
||||||
|
dma_addr_t dma_status_page;
|
||||||
|
|
||||||
drm_buf_t *mmap_buffer;
|
drm_buf_t *mmap_buffer;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -272,29 +272,6 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long i830_alloc_page(drm_device_t *dev)
|
|
||||||
{
|
|
||||||
unsigned long address;
|
|
||||||
|
|
||||||
address = __get_free_page(GFP_KERNEL);
|
|
||||||
if(address == 0UL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
get_page(virt_to_page(address));
|
|
||||||
LockPage(virt_to_page(address));
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void i830_free_page(drm_device_t *dev, unsigned long page)
|
|
||||||
{
|
|
||||||
if (page) {
|
|
||||||
struct page *p = virt_to_page(page);
|
|
||||||
put_page(p);
|
|
||||||
UnlockPage(p);
|
|
||||||
free_page(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int i830_dma_cleanup(drm_device_t *dev)
|
static int i830_dma_cleanup(drm_device_t *dev)
|
||||||
{
|
{
|
||||||
drm_device_dma_t *dma = dev->dma;
|
drm_device_dma_t *dma = dev->dma;
|
||||||
|
@ -309,7 +286,9 @@ static int i830_dma_cleanup(drm_device_t *dev)
|
||||||
dev_priv->ring.Size);
|
dev_priv->ring.Size);
|
||||||
}
|
}
|
||||||
if(dev_priv->hw_status_page != 0UL) {
|
if(dev_priv->hw_status_page != 0UL) {
|
||||||
i830_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 */
|
/* Need to rewrite hardware status page */
|
||||||
I830_WRITE(0x02080, 0x1ffff000);
|
I830_WRITE(0x02080, 0x1ffff000);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +462,9 @@ static int i830_dma_initialize(drm_device_t *dev,
|
||||||
dev_priv->depth_pitch = init->depth_pitch;
|
dev_priv->depth_pitch = init->depth_pitch;
|
||||||
|
|
||||||
/* Program Hardware Status Page */
|
/* Program Hardware Status Page */
|
||||||
dev_priv->hw_status_page = i830_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) {
|
if(dev_priv->hw_status_page == 0UL) {
|
||||||
dev->dev_private = (void *)dev_priv;
|
dev->dev_private = (void *)dev_priv;
|
||||||
i830_dma_cleanup(dev);
|
i830_dma_cleanup(dev);
|
||||||
|
@ -493,7 +474,7 @@ static int i830_dma_initialize(drm_device_t *dev,
|
||||||
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
|
||||||
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
|
||||||
|
|
||||||
I830_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
|
I830_WRITE(0x02080, dev_priv->dma_status_page);
|
||||||
DRM_DEBUG("Enabled hardware status page\n");
|
DRM_DEBUG("Enabled hardware status page\n");
|
||||||
|
|
||||||
/* Now we need to init our freelist */
|
/* Now we need to init our freelist */
|
||||||
|
|
|
@ -64,6 +64,8 @@ typedef struct drm_i830_private {
|
||||||
unsigned long hw_status_page;
|
unsigned long hw_status_page;
|
||||||
unsigned long counter;
|
unsigned long counter;
|
||||||
|
|
||||||
|
dma_addr_t dma_status_page;
|
||||||
|
|
||||||
drm_buf_t *mmap_buffer;
|
drm_buf_t *mmap_buffer;
|
||||||
|
|
||||||
u32 front_di1, back_di1, zi1;
|
u32 front_di1, back_di1, zi1;
|
||||||
|
|
Loading…
Reference in New Issue