mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-06 03:38:03 +02:00
More NetBSD changes
Obtained from: Erik Reid
This commit is contained in:
parent
cc2cf69210
commit
4dae483f94
16 changed files with 224 additions and 84 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@
|
|||
#include <machine/bus.h>
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <uvm/uvm.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <miscfs/specfs/specdev.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include <machine/mtrr.h>
|
||||
|
||||
#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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@
|
|||
#include <machine/bus.h>
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <uvm/uvm.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <miscfs/specfs/specdev.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <machine/sysarch.h>
|
||||
#include <machine/mtrr.h>
|
||||
|
||||
#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
|
||||
|
|
|
|||
14
bsd/drm_vm.h
14
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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue