diff options
-rw-r--r-- | bsd-core/drmP.h | 1 | ||||
-rw-r--r-- | bsd-core/drm_dma.c | 28 | ||||
-rw-r--r-- | bsd-core/drm_drv.c | 4 | ||||
-rw-r--r-- | bsd-core/drm_os_freebsd.h | 2 | ||||
-rw-r--r-- | bsd-core/mga/Makefile | 2 | ||||
-rw-r--r-- | bsd-core/r128/Makefile | 2 | ||||
-rw-r--r-- | bsd/Imakefile | 6 | ||||
-rw-r--r-- | bsd/drmP.h | 1 | ||||
-rw-r--r-- | bsd/drm_dma.h | 28 | ||||
-rw-r--r-- | bsd/drm_drv.h | 4 | ||||
-rw-r--r-- | bsd/drm_os_freebsd.h | 2 | ||||
-rw-r--r-- | bsd/mga/Makefile | 2 | ||||
-rw-r--r-- | bsd/r128/Makefile | 2 | ||||
-rw-r--r-- | libdrm/xf86drm.c | 19 |
14 files changed, 56 insertions, 47 deletions
diff --git a/bsd-core/drmP.h b/bsd-core/drmP.h index 1adaa0e5..b7b21da4 100644 --- a/bsd-core/drmP.h +++ b/bsd-core/drmP.h @@ -448,6 +448,7 @@ struct drm_device { /* Context support */ #ifdef __FreeBSD__ int irq; /* Interrupt used by board */ + int irqrid; /* Interrupt used by board */ struct resource *irqr; /* Resource for interrupt used by board */ #elif defined(__NetBSD__) struct pci_attach_args pa; diff --git a/bsd-core/drm_dma.c b/bsd-core/drm_dma.c index 4593a712..5632b5a2 100644 --- a/bsd-core/drm_dma.c +++ b/bsd-core/drm_dma.c @@ -41,12 +41,6 @@ #define __HAVE_SHARED_IRQ 0 #endif -#if __HAVE_SHARED_IRQ -#define DRM_IRQ_TYPE SA_SHIRQ -#else -#define DRM_IRQ_TYPE 0 -#endif - #if __HAVE_DMA int DRM(dma_setup)( drm_device_t *dev ) @@ -503,7 +497,6 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma) int DRM(irq_install)( drm_device_t *dev, int irq ) { - int rid; int retcode; if ( !irq ) @@ -535,18 +528,24 @@ int DRM(irq_install)( drm_device_t *dev, int irq ) DRM(driver_irq_preinstall)( dev ); /* Install handler */ - rid = 0; - dev->irqr = bus_alloc_resource(dev->device, SYS_RES_IRQ, &rid, + dev->irqrid = 0; + dev->irqr = bus_alloc_resource(dev->device, SYS_RES_IRQ, &dev->irqrid, 0, ~0, 1, RF_SHAREABLE); - if (!dev->irqr) + if (!dev->irqr) { + DRM_LOCK; + dev->irq = 0; + dev->irqrid = 0; + DRM_UNLOCK; return ENOENT; + } retcode = bus_setup_intr(dev->device, dev->irqr, INTR_TYPE_TTY, DRM(dma_service), dev, &dev->irqh); if ( retcode ) { DRM_LOCK; - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irqr); + bus_release_resource(dev->device, SYS_RES_IRQ, dev->irqrid, dev->irqr); dev->irq = 0; + dev->irqrid = 0; DRM_UNLOCK; return retcode; } @@ -560,10 +559,13 @@ int DRM(irq_install)( drm_device_t *dev, int irq ) int DRM(irq_uninstall)( drm_device_t *dev ) { int irq; - + int irqrid; + DRM_LOCK; irq = dev->irq; + irqrid = dev->irqrid; dev->irq = 0; + dev->irqrid = 0; DRM_UNLOCK; if ( !irq ) @@ -574,7 +576,7 @@ int DRM(irq_uninstall)( drm_device_t *dev ) DRM(driver_irq_uninstall)( dev ); bus_teardown_intr(dev->device, dev->irqr, dev->irqh); - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irqr); + bus_release_resource(dev->device, SYS_RES_IRQ, irqrid, dev->irqr); return 0; } diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c index 872f6bc6..4a6fc15f 100644 --- a/bsd-core/drm_drv.c +++ b/bsd-core/drm_drv.c @@ -1037,7 +1037,11 @@ int DRM(ioctl)( DRM_IOCTL_ARGS ) case FIOGETOWN: atomic_dec(&dev->ioctl_count); +#if (__FreeBSD_version >= 500000) + *(int *) data = fgetown(&dev->buf_sigio); +#else *(int *) data = fgetown(dev->buf_sigio); +#endif return 0; } #endif /* __FreeBSD__ */ diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index 1206b25f..ff2a6460 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -142,7 +142,7 @@ do { \ #define DRM_HZ hz #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -while (condition) { \ +while (!condition) { \ ret = tsleep( &(queue), PZERO | PCATCH, "drmwtq", (timeout) ); \ if ( ret ) \ return ret; \ diff --git a/bsd-core/mga/Makefile b/bsd-core/mga/Makefile index 13e43c46..a280e024 100644 --- a/bsd-core/mga/Makefile +++ b/bsd-core/mga/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/.. KMOD= mga NOMAN= YES -SRCS= mga_drv.c mga_state.c mga_warp.c mga_dma.c +SRCS= mga_drv.c mga_state.c mga_warp.c mga_dma.c mga_irq.c SRCS+= device_if.h bus_if.h pci_if.h opt_drm.h CFLAGS+= ${DEBUG_FLAGS} -I. -I.. diff --git a/bsd-core/r128/Makefile b/bsd-core/r128/Makefile index 83f78482..2d2e7e4f 100644 --- a/bsd-core/r128/Makefile +++ b/bsd-core/r128/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/.. KMOD = r128 NOMAN= YES -SRCS = r128_cce.c r128_drv.c r128_state.c +SRCS = r128_cce.c r128_drv.c r128_state.c r128_irq.c SRCS += device_if.h bus_if.h pci_if.h opt_drm.h CFLAGS += ${DEBUG_FLAGS} -I. -I.. diff --git a/bsd/Imakefile b/bsd/Imakefile index 575e72b4..fddf8f53 100644 --- a/bsd/Imakefile +++ b/bsd/Imakefile @@ -1,5 +1,4 @@ - -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 $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.9 2002/02/27 22:18:10 tsi Exp $ XCOMM This is a kludge until we determine how best to build the XCOMM kernel-specific device driver. This allows us to continue @@ -20,10 +19,12 @@ all:: clean:: $(MAKE) -f Makefile.bsd clean +LinkSourceFile(drm_sarea.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_dma.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_drm.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_drv.h,$(XF86OSSRC)/shared/drm/kernel) +LinkSourceFile(mga_irq.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_state.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_ucode.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(mga_warp.c,$(XF86OSSRC)/shared/drm/kernel) @@ -31,6 +32,7 @@ LinkSourceFile(r128.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(r128_cce.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(r128_drm.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(r128_drv.h,$(XF86OSSRC)/shared/drm/kernel) +LinkSourceFile(r128_irq.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(r128_state.c,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(radeon.h,$(XF86OSSRC)/shared/drm/kernel) LinkSourceFile(radeon_cp.c,$(XF86OSSRC)/shared/drm/kernel) @@ -448,6 +448,7 @@ struct drm_device { /* Context support */ #ifdef __FreeBSD__ int irq; /* Interrupt used by board */ + int irqrid; /* Interrupt used by board */ struct resource *irqr; /* Resource for interrupt used by board */ #elif defined(__NetBSD__) struct pci_attach_args pa; diff --git a/bsd/drm_dma.h b/bsd/drm_dma.h index 4593a712..5632b5a2 100644 --- a/bsd/drm_dma.h +++ b/bsd/drm_dma.h @@ -41,12 +41,6 @@ #define __HAVE_SHARED_IRQ 0 #endif -#if __HAVE_SHARED_IRQ -#define DRM_IRQ_TYPE SA_SHIRQ -#else -#define DRM_IRQ_TYPE 0 -#endif - #if __HAVE_DMA int DRM(dma_setup)( drm_device_t *dev ) @@ -503,7 +497,6 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma) int DRM(irq_install)( drm_device_t *dev, int irq ) { - int rid; int retcode; if ( !irq ) @@ -535,18 +528,24 @@ int DRM(irq_install)( drm_device_t *dev, int irq ) DRM(driver_irq_preinstall)( dev ); /* Install handler */ - rid = 0; - dev->irqr = bus_alloc_resource(dev->device, SYS_RES_IRQ, &rid, + dev->irqrid = 0; + dev->irqr = bus_alloc_resource(dev->device, SYS_RES_IRQ, &dev->irqrid, 0, ~0, 1, RF_SHAREABLE); - if (!dev->irqr) + if (!dev->irqr) { + DRM_LOCK; + dev->irq = 0; + dev->irqrid = 0; + DRM_UNLOCK; return ENOENT; + } retcode = bus_setup_intr(dev->device, dev->irqr, INTR_TYPE_TTY, DRM(dma_service), dev, &dev->irqh); if ( retcode ) { DRM_LOCK; - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irqr); + bus_release_resource(dev->device, SYS_RES_IRQ, dev->irqrid, dev->irqr); dev->irq = 0; + dev->irqrid = 0; DRM_UNLOCK; return retcode; } @@ -560,10 +559,13 @@ int DRM(irq_install)( drm_device_t *dev, int irq ) int DRM(irq_uninstall)( drm_device_t *dev ) { int irq; - + int irqrid; + DRM_LOCK; irq = dev->irq; + irqrid = dev->irqrid; dev->irq = 0; + dev->irqrid = 0; DRM_UNLOCK; if ( !irq ) @@ -574,7 +576,7 @@ int DRM(irq_uninstall)( drm_device_t *dev ) DRM(driver_irq_uninstall)( dev ); bus_teardown_intr(dev->device, dev->irqr, dev->irqh); - bus_release_resource(dev->device, SYS_RES_IRQ, 0, dev->irqr); + bus_release_resource(dev->device, SYS_RES_IRQ, irqrid, dev->irqr); return 0; } diff --git a/bsd/drm_drv.h b/bsd/drm_drv.h index 872f6bc6..4a6fc15f 100644 --- a/bsd/drm_drv.h +++ b/bsd/drm_drv.h @@ -1037,7 +1037,11 @@ int DRM(ioctl)( DRM_IOCTL_ARGS ) case FIOGETOWN: atomic_dec(&dev->ioctl_count); +#if (__FreeBSD_version >= 500000) + *(int *) data = fgetown(&dev->buf_sigio); +#else *(int *) data = fgetown(dev->buf_sigio); +#endif return 0; } #endif /* __FreeBSD__ */ diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index 1206b25f..ff2a6460 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -142,7 +142,7 @@ do { \ #define DRM_HZ hz #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -while (condition) { \ +while (!condition) { \ ret = tsleep( &(queue), PZERO | PCATCH, "drmwtq", (timeout) ); \ if ( ret ) \ return ret; \ diff --git a/bsd/mga/Makefile b/bsd/mga/Makefile index 13e43c46..a280e024 100644 --- a/bsd/mga/Makefile +++ b/bsd/mga/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/.. KMOD= mga NOMAN= YES -SRCS= mga_drv.c mga_state.c mga_warp.c mga_dma.c +SRCS= mga_drv.c mga_state.c mga_warp.c mga_dma.c mga_irq.c SRCS+= device_if.h bus_if.h pci_if.h opt_drm.h CFLAGS+= ${DEBUG_FLAGS} -I. -I.. diff --git a/bsd/r128/Makefile b/bsd/r128/Makefile index 83f78482..2d2e7e4f 100644 --- a/bsd/r128/Makefile +++ b/bsd/r128/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/.. KMOD = r128 NOMAN= YES -SRCS = r128_cce.c r128_drv.c r128_state.c +SRCS = r128_cce.c r128_drv.c r128_state.c r128_irq.c SRCS += device_if.h bus_if.h pci_if.h opt_drm.h CFLAGS += ${DEBUG_FLAGS} -I. -I.. diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 8d3a20d1..0532a1ec 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -27,13 +27,14 @@ * Authors: Rickard E. (Rik) Faith <faith@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 # include "xf86.h" # include "xf86_OSproc.h" +# include "drm.h" # include "xf86_ansic.h" # define _DRM_MALLOC xalloc # define _DRM_FREE xfree @@ -66,6 +67,7 @@ extern int xf86RemoveSIGIOHandler(int fd); # define _DRM_MALLOC Xmalloc # define _DRM_FREE Xfree # endif +# include "drm.h" #endif /* No longer needed with CVS kernel modules on alpha @@ -81,7 +83,6 @@ extern unsigned long _bus_base(void); #endif #include "xf86drm.h" -#include "drm.h" #ifndef DRM_MAJOR #define DRM_MAJOR 226 /* Linux */ @@ -197,7 +198,6 @@ static int drmOpenDevice(long dev, int minor) stat_t st; char buf[64]; int fd; - mode_t dirmode = DRM_DEV_DIRMODE; mode_t devmode = DRM_DEV_MODE; int isroot = !geteuid(); #if defined(XFree86Server) @@ -209,23 +209,16 @@ static int drmOpenDevice(long dev, int minor) #if defined(XFree86Server) 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); group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID; #endif if (stat(DRM_DIR_NAME, &st)) { if (!isroot) return DRM_ERR_NOT_ROOT; - remove(DRM_DIR_NAME); - mkdir(DRM_DIR_NAME, dirmode); + mkdir(DRM_DIR_NAME, DRM_DEV_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); drmMsg("drmOpenDevice: node name is %s\n", buf); |