mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-25 21:10:11 +01:00
Bring bsd-3-0-0-branch up-to-date with trunk code.
This commit is contained in:
parent
4b905752d3
commit
271f730bf0
16 changed files with 208 additions and 158 deletions
|
|
@ -144,6 +144,57 @@
|
|||
|
||||
#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
|
||||
|
||||
/* Backward compatibility section */
|
||||
#ifndef minor
|
||||
#define minor(x) MINOR((x))
|
||||
#endif
|
||||
|
||||
#ifndef MODULE_LICENSE
|
||||
#define MODULE_LICENSE(x)
|
||||
#endif
|
||||
|
||||
#ifndef preempt_disable
|
||||
#define preempt_disable()
|
||||
#define preempt_enable()
|
||||
#endif
|
||||
|
||||
#ifndef pte_offset_map
|
||||
#define pte_offset_map pte_offset
|
||||
#define pte_unmap(pte)
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
static inline struct page * vmalloc_to_page(void * vmalloc_addr)
|
||||
{
|
||||
unsigned long addr = (unsigned long) vmalloc_addr;
|
||||
struct page *page = NULL;
|
||||
pgd_t *pgd = pgd_offset_k(addr);
|
||||
pmd_t *pmd;
|
||||
pte_t *ptep, pte;
|
||||
|
||||
if (!pgd_none(*pgd)) {
|
||||
pmd = pmd_offset(pgd, addr);
|
||||
if (!pmd_none(*pmd)) {
|
||||
preempt_disable();
|
||||
ptep = pte_offset_map(pmd, addr);
|
||||
pte = *ptep;
|
||||
if (pte_present(pte))
|
||||
page = pte_page(pte);
|
||||
pte_unmap(ptep);
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
return page;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
#define DRM_RPR_ARG(vma)
|
||||
#else
|
||||
#define DRM_RPR_ARG(vma) vma,
|
||||
#endif
|
||||
|
||||
|
||||
#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT)
|
||||
|
||||
/* Macros to make printk easier */
|
||||
|
|
|
|||
|
|
@ -218,9 +218,7 @@ static char *drm_opts = NULL;
|
|||
MODULE_AUTHOR( DRIVER_AUTHOR );
|
||||
MODULE_DESCRIPTION( DRIVER_DESC );
|
||||
MODULE_PARM( drm_opts, "s" );
|
||||
#ifdef MODULE_LICENSE
|
||||
MODULE_LICENSE("GPL and additional rights");
|
||||
#endif
|
||||
|
||||
static int DRM(setup)( drm_device_t *dev )
|
||||
{
|
||||
|
|
@ -705,7 +703,7 @@ int DRM(open)( struct inode *inode, struct file *filp )
|
|||
int i;
|
||||
|
||||
for (i = 0; i < DRM(numdevs); i++) {
|
||||
if (MINOR(inode->i_rdev) == DRM(minor)[i]) {
|
||||
if (minor(inode->i_rdev) == DRM(minor)[i]) {
|
||||
dev = &(DRM(device)[i]);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
|
||||
{
|
||||
kdev_t minor = MINOR(inode->i_rdev);
|
||||
int minor = minor(inode->i_rdev);
|
||||
drm_file_t *priv;
|
||||
|
||||
if (filp->f_flags & O_EXCL) return -EBUSY; /* No exclusive opens */
|
||||
|
|
@ -125,31 +125,21 @@ ssize_t DRM(read)(struct file *filp, char *buf, size_t count, loff_t *off)
|
|||
int avail;
|
||||
int send;
|
||||
int cur;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
|
||||
DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp);
|
||||
|
||||
add_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
while (dev->buf_rp == dev->buf_wp) {
|
||||
DRM_DEBUG(" sleeping\n");
|
||||
if (filp->f_flags & O_NONBLOCK) {
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
return -EAGAIN;
|
||||
}
|
||||
schedule(); /* wait for dev->buf_readers */
|
||||
interruptible_sleep_on(&dev->buf_readers);
|
||||
if (signal_pending(current)) {
|
||||
DRM_DEBUG(" interrupted\n");
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
DRM_DEBUG(" awake\n");
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
|
||||
left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ;
|
||||
avail = DRM_BSZ - left;
|
||||
|
|
|
|||
|
|
@ -66,9 +66,6 @@ int DRM(sg_alloc)( struct inode *inode, struct file *filp,
|
|||
drm_scatter_gather_t request;
|
||||
drm_sg_mem_t *entry;
|
||||
unsigned long pages, i, j;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
|
|
@ -137,21 +134,10 @@ int DRM(sg_alloc)( struct inode *inode, struct file *filp,
|
|||
DRM_DEBUG( "sg alloc virtual = %p\n", entry->virtual );
|
||||
|
||||
for ( i = entry->handle, j = 0 ; j < pages ; i += PAGE_SIZE, j++ ) {
|
||||
pgd = pgd_offset_k( i );
|
||||
if ( !pgd_present( *pgd ) )
|
||||
entry->pagelist[j] = vmalloc_to_page((void *)i);
|
||||
if (!entry->pagelist[j])
|
||||
goto failed;
|
||||
|
||||
pmd = pmd_offset( pgd, i );
|
||||
if ( !pmd_present( *pmd ) )
|
||||
goto failed;
|
||||
|
||||
pte = pte_offset( pmd, i );
|
||||
if ( !pte_present( *pte ) )
|
||||
goto failed;
|
||||
|
||||
entry->pagelist[j] = pte_page( *pte );
|
||||
|
||||
SetPageReserved( entry->pagelist[j] );
|
||||
SetPageReserved(entry->pagelist[j]);
|
||||
}
|
||||
|
||||
request.handle = entry->handle;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static struct drm_stub_info {
|
|||
|
||||
static int DRM(stub_open)(struct inode *inode, struct file *filp)
|
||||
{
|
||||
int minor = MINOR(inode->i_rdev);
|
||||
int minor = minor(inode->i_rdev);
|
||||
int err = -ENODEV;
|
||||
struct file_operations *old_fops;
|
||||
|
||||
|
|
|
|||
|
|
@ -130,9 +130,6 @@ struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
|
|||
drm_map_t *map = (drm_map_t *)vma->vm_private_data;
|
||||
unsigned long offset;
|
||||
unsigned long i;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
struct page *page;
|
||||
|
||||
if (address > vma->vm_end) return NOPAGE_SIGBUS; /* Disallow mremap */
|
||||
|
|
@ -140,17 +137,9 @@ struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
|
|||
|
||||
offset = address - vma->vm_start;
|
||||
i = (unsigned long)map->handle + offset;
|
||||
/* We have to walk page tables here because we need large SAREA's, and
|
||||
* they need to be virtually contiguous in kernel space.
|
||||
*/
|
||||
pgd = pgd_offset_k( i );
|
||||
if( !pgd_present( *pgd ) ) return NOPAGE_OOM;
|
||||
pmd = pmd_offset( pgd, i );
|
||||
if( !pmd_present( *pmd ) ) return NOPAGE_OOM;
|
||||
pte = pte_offset( pmd, i );
|
||||
if( !pte_present( *pte ) ) return NOPAGE_OOM;
|
||||
|
||||
page = pte_page(*pte);
|
||||
page = vmalloc_to_page((void *)i);
|
||||
if (!page)
|
||||
return NOPAGE_OOM;
|
||||
get_page(page);
|
||||
|
||||
DRM_DEBUG("shm_nopage 0x%lx\n", address);
|
||||
|
|
@ -462,12 +451,12 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
|||
}
|
||||
offset = DRIVER_GET_REG_OFS();
|
||||
#ifdef __sparc__
|
||||
if (io_remap_page_range(vma->vm_start,
|
||||
if (io_remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma) + offset,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot, 0))
|
||||
#else
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma) + offset,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot))
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
|
|||
buf_priv->currently_mapped = I810_BUF_MAPPED;
|
||||
unlock_kernel();
|
||||
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma),
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot)) return -EAGAIN;
|
||||
|
|
@ -270,22 +270,30 @@ static unsigned long i810_alloc_page(drm_device_t *dev)
|
|||
if(address == 0UL)
|
||||
return 0;
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
atomic_inc(&virt_to_page(address)->count);
|
||||
set_bit(PG_locked, &virt_to_page(address)->flags);
|
||||
|
||||
#else
|
||||
get_page(virt_to_page(address));
|
||||
SetPageLocked(virt_to_page(address));
|
||||
#endif
|
||||
return address;
|
||||
}
|
||||
|
||||
static void i810_free_page(drm_device_t *dev, unsigned long page)
|
||||
{
|
||||
if(page == 0UL)
|
||||
return;
|
||||
|
||||
atomic_dec(&virt_to_page(page)->count);
|
||||
clear_bit(PG_locked, &virt_to_page(page)->flags);
|
||||
wake_up(&virt_to_page(page)->wait);
|
||||
free_page(page);
|
||||
return;
|
||||
if (page) {
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
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)
|
||||
|
|
@ -344,8 +352,7 @@ static int i810_wait_ring(drm_device_t *dev, int n)
|
|||
DRM_ERROR("lockup\n");
|
||||
goto out_wait_ring;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 2000 ; i++) ;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
out_wait_ring:
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ do { \
|
|||
do { \
|
||||
_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; \
|
||||
_tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; \
|
||||
for(_i = 0; _i < 65535; _i++); \
|
||||
udelay(10); \
|
||||
} while(_head != _tail); \
|
||||
} while(0)
|
||||
|
||||
|
|
@ -183,7 +183,7 @@ int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
|
|||
buf_priv->currently_mapped = I830_BUF_MAPPED;
|
||||
unlock_kernel();
|
||||
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma),
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot)) return -EAGAIN;
|
||||
|
|
@ -247,14 +247,11 @@ static int i830_unmap_buffer(drm_buf_t *buf)
|
|||
#else
|
||||
down_write( ¤t->mm->mmap_sem );
|
||||
#endif
|
||||
#if LINUX_VERSION_CODE < 0x020399
|
||||
retcode = do_munmap((unsigned long)buf_priv->virtual,
|
||||
(size_t) buf->total);
|
||||
#else
|
||||
|
||||
retcode = do_munmap(current->mm,
|
||||
(unsigned long)buf_priv->virtual,
|
||||
(size_t) buf->total);
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE <= 0x020402
|
||||
up( ¤t->mm->mmap_sem );
|
||||
#else
|
||||
|
|
@ -306,22 +303,30 @@ static unsigned long i830_alloc_page(drm_device_t *dev)
|
|||
if(address == 0UL)
|
||||
return 0;
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
atomic_inc(&virt_to_page(address)->count);
|
||||
set_bit(PG_locked, &virt_to_page(address)->flags);
|
||||
|
||||
#else
|
||||
get_page(virt_to_page(address));
|
||||
SetPageLocked(virt_to_page(address));
|
||||
#endif
|
||||
return address;
|
||||
}
|
||||
|
||||
static void i830_free_page(drm_device_t *dev, unsigned long page)
|
||||
{
|
||||
if(page == 0UL)
|
||||
return;
|
||||
|
||||
atomic_dec(&virt_to_page(page)->count);
|
||||
clear_bit(PG_locked, &virt_to_page(page)->flags);
|
||||
wake_up(&virt_to_page(page)->wait);
|
||||
free_page(page);
|
||||
return;
|
||||
if (page) {
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
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 i830_dma_cleanup(drm_device_t *dev)
|
||||
|
|
@ -382,8 +387,7 @@ static int i830_wait_ring(drm_device_t *dev, int n)
|
|||
DRM_ERROR("lockup\n");
|
||||
goto out_wait_ring;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 2000 ; i++) ;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
out_wait_ring:
|
||||
|
|
|
|||
51
linux/drmP.h
51
linux/drmP.h
|
|
@ -144,6 +144,57 @@
|
|||
|
||||
#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
|
||||
|
||||
/* Backward compatibility section */
|
||||
#ifndef minor
|
||||
#define minor(x) MINOR((x))
|
||||
#endif
|
||||
|
||||
#ifndef MODULE_LICENSE
|
||||
#define MODULE_LICENSE(x)
|
||||
#endif
|
||||
|
||||
#ifndef preempt_disable
|
||||
#define preempt_disable()
|
||||
#define preempt_enable()
|
||||
#endif
|
||||
|
||||
#ifndef pte_offset_map
|
||||
#define pte_offset_map pte_offset
|
||||
#define pte_unmap(pte)
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
static inline struct page * vmalloc_to_page(void * vmalloc_addr)
|
||||
{
|
||||
unsigned long addr = (unsigned long) vmalloc_addr;
|
||||
struct page *page = NULL;
|
||||
pgd_t *pgd = pgd_offset_k(addr);
|
||||
pmd_t *pmd;
|
||||
pte_t *ptep, pte;
|
||||
|
||||
if (!pgd_none(*pgd)) {
|
||||
pmd = pmd_offset(pgd, addr);
|
||||
if (!pmd_none(*pmd)) {
|
||||
preempt_disable();
|
||||
ptep = pte_offset_map(pmd, addr);
|
||||
pte = *ptep;
|
||||
if (pte_present(pte))
|
||||
page = pte_page(pte);
|
||||
pte_unmap(ptep);
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
return page;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
#define DRM_RPR_ARG(vma)
|
||||
#else
|
||||
#define DRM_RPR_ARG(vma) vma,
|
||||
#endif
|
||||
|
||||
|
||||
#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT)
|
||||
|
||||
/* Macros to make printk easier */
|
||||
|
|
|
|||
|
|
@ -218,9 +218,7 @@ static char *drm_opts = NULL;
|
|||
MODULE_AUTHOR( DRIVER_AUTHOR );
|
||||
MODULE_DESCRIPTION( DRIVER_DESC );
|
||||
MODULE_PARM( drm_opts, "s" );
|
||||
#ifdef MODULE_LICENSE
|
||||
MODULE_LICENSE("GPL and additional rights");
|
||||
#endif
|
||||
|
||||
static int DRM(setup)( drm_device_t *dev )
|
||||
{
|
||||
|
|
@ -705,7 +703,7 @@ int DRM(open)( struct inode *inode, struct file *filp )
|
|||
int i;
|
||||
|
||||
for (i = 0; i < DRM(numdevs); i++) {
|
||||
if (MINOR(inode->i_rdev) == DRM(minor)[i]) {
|
||||
if (minor(inode->i_rdev) == DRM(minor)[i]) {
|
||||
dev = &(DRM(device)[i]);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
|
||||
{
|
||||
kdev_t minor = MINOR(inode->i_rdev);
|
||||
int minor = minor(inode->i_rdev);
|
||||
drm_file_t *priv;
|
||||
|
||||
if (filp->f_flags & O_EXCL) return -EBUSY; /* No exclusive opens */
|
||||
|
|
@ -125,31 +125,21 @@ ssize_t DRM(read)(struct file *filp, char *buf, size_t count, loff_t *off)
|
|||
int avail;
|
||||
int send;
|
||||
int cur;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
|
||||
DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp);
|
||||
|
||||
add_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
while (dev->buf_rp == dev->buf_wp) {
|
||||
DRM_DEBUG(" sleeping\n");
|
||||
if (filp->f_flags & O_NONBLOCK) {
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
return -EAGAIN;
|
||||
}
|
||||
schedule(); /* wait for dev->buf_readers */
|
||||
interruptible_sleep_on(&dev->buf_readers);
|
||||
if (signal_pending(current)) {
|
||||
DRM_DEBUG(" interrupted\n");
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
DRM_DEBUG(" awake\n");
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
remove_wait_queue(&dev->buf_readers, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
|
||||
left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ;
|
||||
avail = DRM_BSZ - left;
|
||||
|
|
|
|||
|
|
@ -66,9 +66,6 @@ int DRM(sg_alloc)( struct inode *inode, struct file *filp,
|
|||
drm_scatter_gather_t request;
|
||||
drm_sg_mem_t *entry;
|
||||
unsigned long pages, i, j;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
|
|
@ -137,21 +134,10 @@ int DRM(sg_alloc)( struct inode *inode, struct file *filp,
|
|||
DRM_DEBUG( "sg alloc virtual = %p\n", entry->virtual );
|
||||
|
||||
for ( i = entry->handle, j = 0 ; j < pages ; i += PAGE_SIZE, j++ ) {
|
||||
pgd = pgd_offset_k( i );
|
||||
if ( !pgd_present( *pgd ) )
|
||||
entry->pagelist[j] = vmalloc_to_page((void *)i);
|
||||
if (!entry->pagelist[j])
|
||||
goto failed;
|
||||
|
||||
pmd = pmd_offset( pgd, i );
|
||||
if ( !pmd_present( *pmd ) )
|
||||
goto failed;
|
||||
|
||||
pte = pte_offset( pmd, i );
|
||||
if ( !pte_present( *pte ) )
|
||||
goto failed;
|
||||
|
||||
entry->pagelist[j] = pte_page( *pte );
|
||||
|
||||
SetPageReserved( entry->pagelist[j] );
|
||||
SetPageReserved(entry->pagelist[j]);
|
||||
}
|
||||
|
||||
request.handle = entry->handle;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static struct drm_stub_info {
|
|||
|
||||
static int DRM(stub_open)(struct inode *inode, struct file *filp)
|
||||
{
|
||||
int minor = MINOR(inode->i_rdev);
|
||||
int minor = minor(inode->i_rdev);
|
||||
int err = -ENODEV;
|
||||
struct file_operations *old_fops;
|
||||
|
||||
|
|
|
|||
|
|
@ -130,9 +130,6 @@ struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
|
|||
drm_map_t *map = (drm_map_t *)vma->vm_private_data;
|
||||
unsigned long offset;
|
||||
unsigned long i;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
struct page *page;
|
||||
|
||||
if (address > vma->vm_end) return NOPAGE_SIGBUS; /* Disallow mremap */
|
||||
|
|
@ -140,17 +137,9 @@ struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
|
|||
|
||||
offset = address - vma->vm_start;
|
||||
i = (unsigned long)map->handle + offset;
|
||||
/* We have to walk page tables here because we need large SAREA's, and
|
||||
* they need to be virtually contiguous in kernel space.
|
||||
*/
|
||||
pgd = pgd_offset_k( i );
|
||||
if( !pgd_present( *pgd ) ) return NOPAGE_OOM;
|
||||
pmd = pmd_offset( pgd, i );
|
||||
if( !pmd_present( *pmd ) ) return NOPAGE_OOM;
|
||||
pte = pte_offset( pmd, i );
|
||||
if( !pte_present( *pte ) ) return NOPAGE_OOM;
|
||||
|
||||
page = pte_page(*pte);
|
||||
page = vmalloc_to_page((void *)i);
|
||||
if (!page)
|
||||
return NOPAGE_OOM;
|
||||
get_page(page);
|
||||
|
||||
DRM_DEBUG("shm_nopage 0x%lx\n", address);
|
||||
|
|
@ -462,12 +451,12 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
|
|||
}
|
||||
offset = DRIVER_GET_REG_OFS();
|
||||
#ifdef __sparc__
|
||||
if (io_remap_page_range(vma->vm_start,
|
||||
if (io_remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma) + offset,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot, 0))
|
||||
#else
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma) + offset,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot))
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
|
|||
buf_priv->currently_mapped = I810_BUF_MAPPED;
|
||||
unlock_kernel();
|
||||
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma),
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot)) return -EAGAIN;
|
||||
|
|
@ -270,22 +270,30 @@ static unsigned long i810_alloc_page(drm_device_t *dev)
|
|||
if(address == 0UL)
|
||||
return 0;
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
atomic_inc(&virt_to_page(address)->count);
|
||||
set_bit(PG_locked, &virt_to_page(address)->flags);
|
||||
|
||||
#else
|
||||
get_page(virt_to_page(address));
|
||||
SetPageLocked(virt_to_page(address));
|
||||
#endif
|
||||
return address;
|
||||
}
|
||||
|
||||
static void i810_free_page(drm_device_t *dev, unsigned long page)
|
||||
{
|
||||
if(page == 0UL)
|
||||
return;
|
||||
|
||||
atomic_dec(&virt_to_page(page)->count);
|
||||
clear_bit(PG_locked, &virt_to_page(page)->flags);
|
||||
wake_up(&virt_to_page(page)->wait);
|
||||
free_page(page);
|
||||
return;
|
||||
if (page) {
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
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)
|
||||
|
|
@ -344,8 +352,7 @@ static int i810_wait_ring(drm_device_t *dev, int n)
|
|||
DRM_ERROR("lockup\n");
|
||||
goto out_wait_ring;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 2000 ; i++) ;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
out_wait_ring:
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ do { \
|
|||
do { \
|
||||
_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; \
|
||||
_tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; \
|
||||
for(_i = 0; _i < 65535; _i++); \
|
||||
udelay(10); \
|
||||
} while(_head != _tail); \
|
||||
} while(0)
|
||||
|
||||
|
|
@ -183,7 +183,7 @@ int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
|
|||
buf_priv->currently_mapped = I830_BUF_MAPPED;
|
||||
unlock_kernel();
|
||||
|
||||
if (remap_page_range(vma->vm_start,
|
||||
if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start,
|
||||
VM_OFFSET(vma),
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot)) return -EAGAIN;
|
||||
|
|
@ -247,14 +247,11 @@ static int i830_unmap_buffer(drm_buf_t *buf)
|
|||
#else
|
||||
down_write( ¤t->mm->mmap_sem );
|
||||
#endif
|
||||
#if LINUX_VERSION_CODE < 0x020399
|
||||
retcode = do_munmap((unsigned long)buf_priv->virtual,
|
||||
(size_t) buf->total);
|
||||
#else
|
||||
|
||||
retcode = do_munmap(current->mm,
|
||||
(unsigned long)buf_priv->virtual,
|
||||
(size_t) buf->total);
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE <= 0x020402
|
||||
up( ¤t->mm->mmap_sem );
|
||||
#else
|
||||
|
|
@ -306,22 +303,30 @@ static unsigned long i830_alloc_page(drm_device_t *dev)
|
|||
if(address == 0UL)
|
||||
return 0;
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
atomic_inc(&virt_to_page(address)->count);
|
||||
set_bit(PG_locked, &virt_to_page(address)->flags);
|
||||
|
||||
#else
|
||||
get_page(virt_to_page(address));
|
||||
SetPageLocked(virt_to_page(address));
|
||||
#endif
|
||||
return address;
|
||||
}
|
||||
|
||||
static void i830_free_page(drm_device_t *dev, unsigned long page)
|
||||
{
|
||||
if(page == 0UL)
|
||||
return;
|
||||
|
||||
atomic_dec(&virt_to_page(page)->count);
|
||||
clear_bit(PG_locked, &virt_to_page(page)->flags);
|
||||
wake_up(&virt_to_page(page)->wait);
|
||||
free_page(page);
|
||||
return;
|
||||
if (page) {
|
||||
#if LINUX_VERSION_CODE < 0x020500
|
||||
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 i830_dma_cleanup(drm_device_t *dev)
|
||||
|
|
@ -382,8 +387,7 @@ static int i830_wait_ring(drm_device_t *dev, int n)
|
|||
DRM_ERROR("lockup\n");
|
||||
goto out_wait_ring;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 2000 ; i++) ;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
out_wait_ring:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue