From 2e4e8d8409ab06876f5b0f043fac6ac99512ee57 Mon Sep 17 00:00:00 2001 From: Alan Hourihane Date: Wed, 7 Nov 2001 08:49:40 +0000 Subject: [PATCH] pull in Eric's fixes from drm-kmod 0.9.3 --- bsd-core/drm_os_freebsd.h | 10 +++++++--- bsd/drm_os_freebsd.h | 10 +++++++--- linux-core/drm_drv.c | 3 ++- linux/drm_drv.h | 3 ++- linux/drm_lists.h | 10 +++++----- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index 24b3a3b9..72c5baf6 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -85,10 +85,14 @@ return EINVAL; \ } -#define DRM_OS_DELAY( delay ) \ +#define DRM_OS_DELAY( udelay ) \ do { \ - static int never; \ - tsleep(&never, PZERO|PCATCH, "drmdelay", delay ); \ + struct timeval tv1, tv2; \ + microtime(&tv1); \ + do { \ + microtime(&tv2); \ + } \ + while (((tv2.tv_sec-tv1.tv_sec)*1000000 + tv2.tv_usec - tv1.tv_usec) < udelay ); \ } while (0) #define DRM_OS_RETURN(v) return v; diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index 24b3a3b9..72c5baf6 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -85,10 +85,14 @@ return EINVAL; \ } -#define DRM_OS_DELAY( delay ) \ +#define DRM_OS_DELAY( udelay ) \ do { \ - static int never; \ - tsleep(&never, PZERO|PCATCH, "drmdelay", delay ); \ + struct timeval tv1, tv2; \ + microtime(&tv1); \ + do { \ + microtime(&tv2); \ + } \ + while (((tv2.tv_sec-tv1.tv_sec)*1000000 + tv2.tv_usec - tv1.tv_usec) < udelay ); \ } while (0) #define DRM_OS_RETURN(v) return v; diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 7cfd484a..f8790e8a 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -686,7 +686,7 @@ static int drm_count_cards(void) if(device == 0xffff) device = PCI_ANY_ID; if(vendor == 0xffff) vendor = PCI_ANY_ID; while ((pdev = pci_find_device(vendor, device, pdev))) { - num++; + num++; /* FIXME: What about two cards of the same device id? */ } } #else @@ -758,6 +758,7 @@ static int DRM(init)( device_t nbdev ) dev->name = DRIVER_NAME; #endif /* __linux__ */ #ifdef __FreeBSD__ + DRM(minor)[i]=unit; DRM_OS_SPININIT(dev->count_lock, "drm device"); lockinit(&dev->dev_lock, PZERO, "drmlk", 0, 0); dev->device = nbdev; diff --git a/linux/drm_drv.h b/linux/drm_drv.h index 7cfd484a..f8790e8a 100644 --- a/linux/drm_drv.h +++ b/linux/drm_drv.h @@ -686,7 +686,7 @@ static int drm_count_cards(void) if(device == 0xffff) device = PCI_ANY_ID; if(vendor == 0xffff) vendor = PCI_ANY_ID; while ((pdev = pci_find_device(vendor, device, pdev))) { - num++; + num++; /* FIXME: What about two cards of the same device id? */ } } #else @@ -758,6 +758,7 @@ static int DRM(init)( device_t nbdev ) dev->name = DRIVER_NAME; #endif /* __linux__ */ #ifdef __FreeBSD__ + DRM(minor)[i]=unit; DRM_OS_SPININIT(dev->count_lock, "drm device"); lockinit(&dev->dev_lock, PZERO, "drmlk", 0, 0); dev->device = nbdev; diff --git a/linux/drm_lists.h b/linux/drm_lists.h index 4b175a2b..17cc7d68 100644 --- a/linux/drm_lists.h +++ b/linux/drm_lists.h @@ -97,7 +97,7 @@ int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf) spin_lock_irqsave(&bl->write_lock, flags); #endif /* __linux__ */ #ifdef __FreeBSD__ - simple_lock(&bl->write_lock); + DRM_OS_SPINLOCK(&bl->write_lock); s = spldrm(); #endif /* __FreeBSD__ */ *bl->wp = buf; @@ -107,7 +107,7 @@ int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf) #endif /* __linux__ */ #ifdef __FreeBSD__ splx(s); - simple_unlock(&bl->write_lock); + DRM_OS_SPINUNLOCK(&bl->write_lock); #endif /* __FreeBSD__ */ return 0; @@ -134,17 +134,17 @@ drm_buf_t *DRM(waitlist_get)(drm_waitlist_t *bl) spin_unlock_irqrestore(&bl->read_lock, flags); #endif /* __linux__ */ #ifdef __FreeBSD__ - simple_lock(&bl->read_lock); + DRM_OS_SPINLOCK(&bl->read_lock); s = spldrm(); buf = *bl->rp; if (bl->rp == bl->wp) { splx(s); - simple_unlock(&bl->read_lock); + DRM_OS_SPINUNLOCK(&bl->read_lock); return NULL; } if (++bl->rp >= bl->end) bl->rp = bl->bufs; splx(s); - simple_unlock(&bl->read_lock); + DRM_OS_SPINUNLOCK(&bl->read_lock); #endif /* __FreeBSD__ */ return buf;