From 4dae483f947ef26b4b8a98633827bafa628f6d58 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 18 Jun 2002 07:25:29 +0000 Subject: [PATCH] More NetBSD changes Obtained from: Erik Reid --- bsd-core/drmP.h | 2 ++ bsd-core/drm_agpsupport.c | 16 ++++----- bsd-core/drm_bufs.c | 72 ++++++++++++++++++++++++++++++++++++--- bsd-core/drm_drv.c | 29 ++++++++++++---- bsd-core/drm_fops.c | 12 ++----- bsd-core/drm_os_freebsd.h | 2 +- bsd-core/drm_os_netbsd.h | 7 ++++ bsd-core/drm_vm.c | 14 ++------ bsd/drmP.h | 2 ++ bsd/drm_agpsupport.h | 16 ++++----- bsd/drm_bufs.h | 72 ++++++++++++++++++++++++++++++++++++--- bsd/drm_drv.h | 29 ++++++++++++---- bsd/drm_fops.h | 12 ++----- bsd/drm_os_freebsd.h | 2 +- bsd/drm_os_netbsd.h | 7 ++++ bsd/drm_vm.h | 14 ++------ 16 files changed, 224 insertions(+), 84 deletions(-) diff --git a/bsd-core/drmP.h b/bsd-core/drmP.h index 15201e79..9a698362 100644 --- a/bsd-core/drmP.h +++ b/bsd-core/drmP.h @@ -447,8 +447,10 @@ struct drm_device { drm_device_dma_t *dma; /* Optional pointer for DMA support */ /* Context support */ +#ifdef __FreeBSD__ int irq; /* Interrupt used by board */ struct resource *irqr; /* Resource for interrupt used by board */ +#endif /* __FreeBSD__ */ void *irqh; /* Handle from bus_setup_intr */ atomic_t context_flag; /* Context swapping flag */ atomic_t interrupt_flag; /* Interruption handler flag */ diff --git a/bsd-core/drm_agpsupport.c b/bsd-core/drm_agpsupport.c index fe30702c..338644da 100644 --- a/bsd-core/drm_agpsupport.c +++ b/bsd-core/drm_agpsupport.c @@ -33,7 +33,7 @@ int DRM(agp_info)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; struct agp_info *kern; drm_agp_info_t info; @@ -57,7 +57,7 @@ int DRM(agp_info)(DRM_OS_IOCTL) int DRM(agp_acquire)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; int retcode; if (!dev->agp || dev->agp->acquired) return EINVAL; @@ -69,7 +69,7 @@ int DRM(agp_acquire)(DRM_OS_IOCTL) int DRM(agp_release)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; if (!dev->agp || !dev->agp->acquired) return EINVAL; @@ -90,7 +90,7 @@ void DRM(agp_do_release)(void) int DRM(agp_enable)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_mode_t mode; if (!dev->agp || !dev->agp->acquired) return EINVAL; @@ -106,7 +106,7 @@ int DRM(agp_enable)(DRM_OS_IOCTL) int DRM(agp_alloc)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_buffer_t request; drm_agp_mem_t *entry; void *handle; @@ -161,7 +161,7 @@ static drm_agp_mem_t * DRM(agp_lookup_entry)(drm_device_t *dev, void *handle) int DRM(agp_unbind)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_binding_t request; drm_agp_mem_t *entry; int retcode; @@ -183,7 +183,7 @@ int DRM(agp_unbind)(DRM_OS_IOCTL) int DRM(agp_bind)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_binding_t request; drm_agp_mem_t *entry; int retcode; @@ -205,7 +205,7 @@ int DRM(agp_bind)(DRM_OS_IOCTL) int DRM(agp_free)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_buffer_t request; drm_agp_mem_t *entry; diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index 4964bef6..e2b732a3 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -71,6 +71,12 @@ int DRM(addmap)( DRM_OS_IOCTL ) DRM_OS_DEVICE; drm_map_t *map; drm_map_list_entry_t *list; +#if __REALLY_HAVE_MTRR +#ifdef __NetBSD__ + struct mtrr mtrrmap; + int one = 1; +#endif +#endif if (!(dev->flags & (FREAD|FWRITE))) DRM_OS_RETURN(EACCES); /* Require read/write */ @@ -127,8 +133,15 @@ int DRM(addmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if ( map->type == _DRM_FRAME_BUFFER || (map->flags & _DRM_WRITE_COMBINING) ) { - map->mtrr = mtrr_add( map->offset, map->size, - MTRR_TYPE_WRCOMB, 1 ); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = MTRR_PRIVATE | MTRR_FIXED | MTRR_VALID; + mtrrmap.owner = p->p_pid; + /* USER? KERNEL? XXX */ + map->mtrr = mtrr_get( &mtrrmap, &one, p, MTRR_GETSET_USER); +#endif } #endif map->handle = DRM(ioremap)( map->offset, map->size ); @@ -203,6 +216,12 @@ int DRM(rmmap)( DRM_OS_IOCTL ) drm_map_t *map; drm_map_t request; int found_maps = 0; +#if __REALLY_HAVE_MTRR +#ifdef __NetBSD__ + struct mtrr mtrrmap; + int one = 1; +#endif +#endif DRM_OS_KRNFROMUSR( request, (drm_map_t *)data, sizeof(request) ); @@ -231,10 +250,15 @@ int DRM(rmmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if (map->mtrr >= 0) { int retcode; - retcode = mtrr_del(map->mtrr, - map->offset, - map->size); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = 0; + mtrrmap.flags = 0; + mtrrmap.owner = p->p_pid; + /* USER? KERNEL? XXX */ DRM_DEBUG("mtrr_del = %d\n", retcode); +#endif } #endif DRM(ioremapfree)(map->handle, map->size); @@ -989,11 +1013,20 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) int retcode = 0; const int zero = 0; vm_offset_t virtual, address; +#ifdef __FreeBSD__ #if __FreeBSD_version >= 500000 struct vmspace *vms = p->td_proc->p_vmspace; #else struct vmspace *vms = p->p_vmspace; #endif +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + vaddr_t virtual, address; + struct vmspace *vms = p->p_vmspace; + struct vnode vn; + struct specinfo si; +#endif + drm_buf_map_t request; int i; @@ -1019,6 +1052,7 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) goto done; } +#ifdef __FreeBSD__ virtual = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); retcode = vm_mmap(&vms->vm_map, &virtual, @@ -1027,7 +1061,24 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) MAP_SHARED, SLIST_FIRST(&kdev->si_hlist), (unsigned long)map->offset ); +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + vn.v_type = VCHR; /* XXX Taken from x68k/dev/grf.c. No idea if it's correct. */ + vn.v_specinfo = &si; /* XXX */ + vn.v_rdev = kdev; /* XXX */ + /* XXX Lame. */ + virtual = round_page((vaddr_t)vms->vm_daddr + MAXDSIZ); + retcode = uvm_mmap(&vms->vm_map, + &virtual, + round_page(map->size), + VM_PROT_READ|VM_PROT_WRITE, VM_PROT_ALL, + AMAP_SHARED, + (caddr_t)&vn, + (unsigned long)map->offset, + p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); +#endif /* __NetBSD__ */ } else { +#ifdef __FreeBSD__ virtual = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); retcode = vm_mmap(&vms->vm_map, &virtual, @@ -1036,6 +1087,17 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) MAP_SHARED, SLIST_FIRST(&kdev->si_hlist), 0); +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + virtual = round_page((vaddr_t)vms->vm_daddr + MAXDSIZ); + retcode = uvm_mmap(&vms->vm_map, + &virtual, + round_page(dma->byte_count), + VM_PROT_READ|VM_PROT_WRITE, VM_PROT_ALL, + AMAP_SHARED, + (caddr_t)&vn, 0, + p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); +#endif /* __NetBSD__ */ } if (retcode) goto done; diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c index c9e14a35..aa7932c9 100644 --- a/bsd-core/drm_drv.c +++ b/bsd-core/drm_drv.c @@ -553,9 +553,15 @@ static int DRM(takedown)( drm_device_t *dev ) #if __REALLY_HAVE_MTRR if ( map->mtrr >= 0 ) { int retcode; - retcode = mtrr_del( map->mtrr, - map->offset, - map->size ); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = 0; + /*mtrrmap.owner = p->p_pid;*/ + /* XXX */ + retcode = mtrr_get( &mtrrmap, &one, NULL, MTRR_GETSET_USER); +#endif DRM_DEBUG( "mtrr_del=%d\n", retcode ); } #endif @@ -638,6 +644,9 @@ static int DRM(init)( drm_device_t *dev ) #ifdef __FreeBSD__ drm_device_t *dev; #endif +#ifdef __NetBSD__ + struct mtrr mtrrmap; +#endif #if __HAVE_CTX_BITMAP int retcode; #endif @@ -680,10 +689,16 @@ static int DRM(init)( drm_device_t *dev ) #endif #if __REALLY_HAVE_MTRR if (dev->agp) - dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size*1024*1024, - MTRR_TYPE_WRCOMB, - 1 ); +#ifdef __NetBSD__ + mtrrmap.base = dev->agp->info.ai_aperture_base; + /* Might need a multiplier here XXX */ + mtrrmap.len = dev->agp->info.ai_aperture_size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = MTRR_PRIVATE | MTRR_FIXED | MTRR_VALID; + /* XXX mtrrmap.owner? even proper at all? */ + dev->agp->agp_mtrr = mtrr_get( &mtrrmap, &one, NULL, + MTRR_GETSET_USER ); +#endif /* __NetBSD__ */ #endif #endif diff --git a/bsd-core/drm_fops.c b/bsd-core/drm_fops.c index e4589a3a..cad68248 100644 --- a/bsd-core/drm_fops.c +++ b/bsd-core/drm_fops.c @@ -196,11 +196,7 @@ int DRM(write_string)(drm_device_t *dev, const char *s) int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; int s; int revents = 0; @@ -220,11 +216,7 @@ int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) int DRM(write)(dev_t kdev, struct uio *uio, int ioflag) { #if DRM_DEBUG_CODE -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; #endif DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", curproc->p_pid, dev->device, dev->open_count); diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index d06bb354..d48a9a96 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -70,7 +70,7 @@ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) #define DRM_DEV_UID 0 #define DRM_DEV_GID 0 - +#define CDEV_MAJOR 145 #if __FreeBSD_version >= 500000 #define DRM_OS_SPINTYPE struct mtx diff --git a/bsd-core/drm_os_netbsd.h b/bsd-core/drm_os_netbsd.h index fcc92b60..2013c3cb 100644 --- a/bsd-core/drm_os_netbsd.h +++ b/bsd-core/drm_os_netbsd.h @@ -17,6 +17,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #define __REALLY_HAVE_AGP __HAVE_AGP @@ -38,6 +44,7 @@ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) #define DRM_DEV_UID 0 #define DRM_DEV_GID 0 +#define CDEV_MAJOR 90 #define DRM_OS_CURPROC curproc #define DRM_OS_STRUCTPROC struct proc diff --git a/bsd-core/drm_vm.c b/bsd-core/drm_vm.c index 4c62f85a..7e38a04e 100644 --- a/bsd-core/drm_vm.c +++ b/bsd-core/drm_vm.c @@ -5,11 +5,7 @@ static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) #endif { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; drm_device_dma_t *dma = dev->dma; unsigned long physical; unsigned long page; @@ -20,7 +16,7 @@ static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) page = offset >> PAGE_SHIFT; physical = dma->pagelist[page]; - DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + DRM_DEBUG("0x%08lx (page %lu) => 0x%08lx\n", (long)offset, page, physical); return atop(physical); } @@ -30,11 +26,7 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) paddr_t DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) #endif { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; drm_map_t *map = NULL; drm_map_list_entry_t *listentry=NULL; drm_file_t *priv; diff --git a/bsd/drmP.h b/bsd/drmP.h index 15201e79..9a698362 100644 --- a/bsd/drmP.h +++ b/bsd/drmP.h @@ -447,8 +447,10 @@ struct drm_device { drm_device_dma_t *dma; /* Optional pointer for DMA support */ /* Context support */ +#ifdef __FreeBSD__ int irq; /* Interrupt used by board */ struct resource *irqr; /* Resource for interrupt used by board */ +#endif /* __FreeBSD__ */ void *irqh; /* Handle from bus_setup_intr */ atomic_t context_flag; /* Context swapping flag */ atomic_t interrupt_flag; /* Interruption handler flag */ diff --git a/bsd/drm_agpsupport.h b/bsd/drm_agpsupport.h index fe30702c..338644da 100644 --- a/bsd/drm_agpsupport.h +++ b/bsd/drm_agpsupport.h @@ -33,7 +33,7 @@ int DRM(agp_info)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; struct agp_info *kern; drm_agp_info_t info; @@ -57,7 +57,7 @@ int DRM(agp_info)(DRM_OS_IOCTL) int DRM(agp_acquire)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; int retcode; if (!dev->agp || dev->agp->acquired) return EINVAL; @@ -69,7 +69,7 @@ int DRM(agp_acquire)(DRM_OS_IOCTL) int DRM(agp_release)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; if (!dev->agp || !dev->agp->acquired) return EINVAL; @@ -90,7 +90,7 @@ void DRM(agp_do_release)(void) int DRM(agp_enable)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_mode_t mode; if (!dev->agp || !dev->agp->acquired) return EINVAL; @@ -106,7 +106,7 @@ int DRM(agp_enable)(DRM_OS_IOCTL) int DRM(agp_alloc)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_buffer_t request; drm_agp_mem_t *entry; void *handle; @@ -161,7 +161,7 @@ static drm_agp_mem_t * DRM(agp_lookup_entry)(drm_device_t *dev, void *handle) int DRM(agp_unbind)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_binding_t request; drm_agp_mem_t *entry; int retcode; @@ -183,7 +183,7 @@ int DRM(agp_unbind)(DRM_OS_IOCTL) int DRM(agp_bind)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_binding_t request; drm_agp_mem_t *entry; int retcode; @@ -205,7 +205,7 @@ int DRM(agp_bind)(DRM_OS_IOCTL) int DRM(agp_free)(DRM_OS_IOCTL) { - drm_device_t *dev = kdev->si_drv1; + DRM_OS_DEVICE; drm_agp_buffer_t request; drm_agp_mem_t *entry; diff --git a/bsd/drm_bufs.h b/bsd/drm_bufs.h index 4964bef6..e2b732a3 100644 --- a/bsd/drm_bufs.h +++ b/bsd/drm_bufs.h @@ -71,6 +71,12 @@ int DRM(addmap)( DRM_OS_IOCTL ) DRM_OS_DEVICE; drm_map_t *map; drm_map_list_entry_t *list; +#if __REALLY_HAVE_MTRR +#ifdef __NetBSD__ + struct mtrr mtrrmap; + int one = 1; +#endif +#endif if (!(dev->flags & (FREAD|FWRITE))) DRM_OS_RETURN(EACCES); /* Require read/write */ @@ -127,8 +133,15 @@ int DRM(addmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if ( map->type == _DRM_FRAME_BUFFER || (map->flags & _DRM_WRITE_COMBINING) ) { - map->mtrr = mtrr_add( map->offset, map->size, - MTRR_TYPE_WRCOMB, 1 ); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = MTRR_PRIVATE | MTRR_FIXED | MTRR_VALID; + mtrrmap.owner = p->p_pid; + /* USER? KERNEL? XXX */ + map->mtrr = mtrr_get( &mtrrmap, &one, p, MTRR_GETSET_USER); +#endif } #endif map->handle = DRM(ioremap)( map->offset, map->size ); @@ -203,6 +216,12 @@ int DRM(rmmap)( DRM_OS_IOCTL ) drm_map_t *map; drm_map_t request; int found_maps = 0; +#if __REALLY_HAVE_MTRR +#ifdef __NetBSD__ + struct mtrr mtrrmap; + int one = 1; +#endif +#endif DRM_OS_KRNFROMUSR( request, (drm_map_t *)data, sizeof(request) ); @@ -231,10 +250,15 @@ int DRM(rmmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if (map->mtrr >= 0) { int retcode; - retcode = mtrr_del(map->mtrr, - map->offset, - map->size); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = 0; + mtrrmap.flags = 0; + mtrrmap.owner = p->p_pid; + /* USER? KERNEL? XXX */ DRM_DEBUG("mtrr_del = %d\n", retcode); +#endif } #endif DRM(ioremapfree)(map->handle, map->size); @@ -989,11 +1013,20 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) int retcode = 0; const int zero = 0; vm_offset_t virtual, address; +#ifdef __FreeBSD__ #if __FreeBSD_version >= 500000 struct vmspace *vms = p->td_proc->p_vmspace; #else struct vmspace *vms = p->p_vmspace; #endif +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + vaddr_t virtual, address; + struct vmspace *vms = p->p_vmspace; + struct vnode vn; + struct specinfo si; +#endif + drm_buf_map_t request; int i; @@ -1019,6 +1052,7 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) goto done; } +#ifdef __FreeBSD__ virtual = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); retcode = vm_mmap(&vms->vm_map, &virtual, @@ -1027,7 +1061,24 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) MAP_SHARED, SLIST_FIRST(&kdev->si_hlist), (unsigned long)map->offset ); +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + vn.v_type = VCHR; /* XXX Taken from x68k/dev/grf.c. No idea if it's correct. */ + vn.v_specinfo = &si; /* XXX */ + vn.v_rdev = kdev; /* XXX */ + /* XXX Lame. */ + virtual = round_page((vaddr_t)vms->vm_daddr + MAXDSIZ); + retcode = uvm_mmap(&vms->vm_map, + &virtual, + round_page(map->size), + VM_PROT_READ|VM_PROT_WRITE, VM_PROT_ALL, + AMAP_SHARED, + (caddr_t)&vn, + (unsigned long)map->offset, + p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); +#endif /* __NetBSD__ */ } else { +#ifdef __FreeBSD__ virtual = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); retcode = vm_mmap(&vms->vm_map, &virtual, @@ -1036,6 +1087,17 @@ int DRM(mapbufs)( DRM_OS_IOCTL ) MAP_SHARED, SLIST_FIRST(&kdev->si_hlist), 0); +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + virtual = round_page((vaddr_t)vms->vm_daddr + MAXDSIZ); + retcode = uvm_mmap(&vms->vm_map, + &virtual, + round_page(dma->byte_count), + VM_PROT_READ|VM_PROT_WRITE, VM_PROT_ALL, + AMAP_SHARED, + (caddr_t)&vn, 0, + p->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); +#endif /* __NetBSD__ */ } if (retcode) goto done; diff --git a/bsd/drm_drv.h b/bsd/drm_drv.h index c9e14a35..aa7932c9 100644 --- a/bsd/drm_drv.h +++ b/bsd/drm_drv.h @@ -553,9 +553,15 @@ static int DRM(takedown)( drm_device_t *dev ) #if __REALLY_HAVE_MTRR if ( map->mtrr >= 0 ) { int retcode; - retcode = mtrr_del( map->mtrr, - map->offset, - map->size ); +#ifdef __NetBSD__ + mtrrmap.base = map->offset; + mtrrmap.len = map->size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = 0; + /*mtrrmap.owner = p->p_pid;*/ + /* XXX */ + retcode = mtrr_get( &mtrrmap, &one, NULL, MTRR_GETSET_USER); +#endif DRM_DEBUG( "mtrr_del=%d\n", retcode ); } #endif @@ -638,6 +644,9 @@ static int DRM(init)( drm_device_t *dev ) #ifdef __FreeBSD__ drm_device_t *dev; #endif +#ifdef __NetBSD__ + struct mtrr mtrrmap; +#endif #if __HAVE_CTX_BITMAP int retcode; #endif @@ -680,10 +689,16 @@ static int DRM(init)( drm_device_t *dev ) #endif #if __REALLY_HAVE_MTRR if (dev->agp) - dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, - dev->agp->agp_info.aper_size*1024*1024, - MTRR_TYPE_WRCOMB, - 1 ); +#ifdef __NetBSD__ + mtrrmap.base = dev->agp->info.ai_aperture_base; + /* Might need a multiplier here XXX */ + mtrrmap.len = dev->agp->info.ai_aperture_size; + mtrrmap.type = MTRR_TYPE_WC; + mtrrmap.flags = MTRR_PRIVATE | MTRR_FIXED | MTRR_VALID; + /* XXX mtrrmap.owner? even proper at all? */ + dev->agp->agp_mtrr = mtrr_get( &mtrrmap, &one, NULL, + MTRR_GETSET_USER ); +#endif /* __NetBSD__ */ #endif #endif diff --git a/bsd/drm_fops.h b/bsd/drm_fops.h index e4589a3a..cad68248 100644 --- a/bsd/drm_fops.h +++ b/bsd/drm_fops.h @@ -196,11 +196,7 @@ int DRM(write_string)(drm_device_t *dev, const char *s) int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; int s; int revents = 0; @@ -220,11 +216,7 @@ int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) int DRM(write)(dev_t kdev, struct uio *uio, int ioflag) { #if DRM_DEBUG_CODE -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; #endif DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", curproc->p_pid, dev->device, dev->open_count); diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index d06bb354..d48a9a96 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -70,7 +70,7 @@ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) #define DRM_DEV_UID 0 #define DRM_DEV_GID 0 - +#define CDEV_MAJOR 145 #if __FreeBSD_version >= 500000 #define DRM_OS_SPINTYPE struct mtx diff --git a/bsd/drm_os_netbsd.h b/bsd/drm_os_netbsd.h index fcc92b60..2013c3cb 100644 --- a/bsd/drm_os_netbsd.h +++ b/bsd/drm_os_netbsd.h @@ -17,6 +17,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #define __REALLY_HAVE_AGP __HAVE_AGP @@ -38,6 +44,7 @@ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) #define DRM_DEV_UID 0 #define DRM_DEV_GID 0 +#define CDEV_MAJOR 90 #define DRM_OS_CURPROC curproc #define DRM_OS_STRUCTPROC struct proc diff --git a/bsd/drm_vm.h b/bsd/drm_vm.h index 4c62f85a..7e38a04e 100644 --- a/bsd/drm_vm.h +++ b/bsd/drm_vm.h @@ -5,11 +5,7 @@ static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) #endif { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; drm_device_dma_t *dma = dev->dma; unsigned long physical; unsigned long page; @@ -20,7 +16,7 @@ static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) page = offset >> PAGE_SHIFT; physical = dma->pagelist[page]; - DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + DRM_DEBUG("0x%08lx (page %lu) => 0x%08lx\n", (long)offset, page, physical); return atop(physical); } @@ -30,11 +26,7 @@ int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) paddr_t DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) #endif { -#ifdef __FreeBSD__ - drm_device_t *dev = kdev->si_drv1; -#elif defined(__NetBSD__) - drm_device_t *dev = &DRM(softcs)[0]; /* FIXME: multiple instances */ -#endif + DRM_OS_DEVICE; drm_map_t *map = NULL; drm_map_list_entry_t *listentry=NULL; drm_file_t *priv;