diff options
Diffstat (limited to 'bsd/drm_fops.h')
-rw-r--r-- | bsd/drm_fops.h | 137 |
1 files changed, 2 insertions, 135 deletions
diff --git a/bsd/drm_fops.h b/bsd/drm_fops.h index 75baa5f2..b0c18fa3 100644 --- a/bsd/drm_fops.h +++ b/bsd/drm_fops.h @@ -98,148 +98,15 @@ int DRM(open_helper)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p, } -/* The drm_read and drm_write_string code (especially that which manages - the circular buffer), is based on Alessandro Rubini's LINUX DEVICE - DRIVERS (Cambridge: O'Reilly, 1998), pages 111-113. */ +/* The DRM(read) and DRM(poll) are stubs to prevent spurious errors + * on older X Servers (4.3.0 and earlier) */ int DRM(read)(dev_t kdev, struct uio *uio, int ioflag) { - DRM_DEVICE; - int left; - int avail; - int send; - int cur; - int error = 0; - - DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp); - - while (dev->buf_rp == dev->buf_wp) { - DRM_DEBUG(" sleeping\n"); - if (dev->flags & FASYNC) - return EWOULDBLOCK; - error = tsleep(&dev->buf_rp, PZERO|PCATCH, "drmrd", 0); - if (error) { - DRM_DEBUG(" interrupted\n"); - return error; - } - DRM_DEBUG(" awake\n"); - } - - left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - avail = DRM_BSZ - left; - send = DRM_MIN(avail, uio->uio_resid); - - while (send) { - if (dev->buf_wp > dev->buf_rp) { - cur = DRM_MIN(send, dev->buf_wp - dev->buf_rp); - } else { - cur = DRM_MIN(send, dev->buf_end - dev->buf_rp); - } - error = uiomove(dev->buf_rp, cur, uio); - if (error) - break; - dev->buf_rp += cur; - if (dev->buf_rp == dev->buf_end) dev->buf_rp = dev->buf; - send -= cur; - } - - wakeup(&dev->buf_wp); - return error; -} - -int DRM(write_string)(drm_device_t *dev, const char *s) -{ - int left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - int send = strlen(s); - int count; -#ifdef __NetBSD__ - struct proc *p; -#endif /* __NetBSD__ */ - - DRM_DEBUG("%d left, %d to send (%p, %p)\n", - left, send, dev->buf_rp, dev->buf_wp); - - if (left == 1 || dev->buf_wp != dev->buf_rp) { - DRM_ERROR("Buffer not empty (%d left, wp = %p, rp = %p)\n", - left, - dev->buf_wp, - dev->buf_rp); - } - - while (send) { - if (dev->buf_wp >= dev->buf_rp) { - count = DRM_MIN(send, dev->buf_end - dev->buf_wp); - if (count == left) --count; /* Leave a hole */ - } else { - count = DRM_MIN(send, dev->buf_rp - dev->buf_wp - 1); - } - strncpy(dev->buf_wp, s, count); - dev->buf_wp += count; - if (dev->buf_wp == dev->buf_end) dev->buf_wp = dev->buf; - send -= count; - } - - if (dev->buf_selecting) { - dev->buf_selecting = 0; - selwakeup(&dev->buf_sel); - } - -#ifdef __FreeBSD__ - DRM_DEBUG("dev->buf_sigio=%p\n", dev->buf_sigio); - if (dev->buf_sigio) { - DRM_DEBUG("dev->buf_sigio->sio_pgid=%d\n", dev->buf_sigio->sio_pgid); -#if __FreeBSD_version >= 500000 - pgsigio(&dev->buf_sigio, SIGIO, 0); -#else - pgsigio(dev->buf_sigio, SIGIO, 0); -#endif /* __FreeBSD_version */ - } -#endif /* __FreeBSD__ */ -#ifdef __NetBSD__ - if (dev->buf_pgid) { - DRM_DEBUG("dev->buf_pgid=%d\n", dev->buf_pgid); - if(dev->buf_pgid > 0) - gsignal(dev->buf_pgid, SIGIO); - else if(dev->buf_pgid && (p = pfind(-dev->buf_pgid)) != NULL) - psignal(p, SIGIO); - } -#endif /* __NetBSD__ */ - DRM_DEBUG("waking\n"); - wakeup(&dev->buf_rp); - return 0; } int DRM(poll)(dev_t kdev, int events, DRM_STRUCTPROC *p) { - DRM_DEVICE; - int s; - int revents = 0; - - s = spldrm(); - if (events & (POLLIN | POLLRDNORM)) { - int left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; - if (left > 0) - revents |= events & (POLLIN | POLLRDNORM); - else - selrecord(p, &dev->buf_sel); - } - splx(s); - - return revents; -} - -int DRM(write)(dev_t kdev, struct uio *uio, int ioflag) -{ -#if DRM_DEBUG_CODE - DRM_DEVICE; -#endif -#ifdef __FreeBSD__ - DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", - curproc->p_pid, dev->device, dev->open_count); -#elif defined(__NetBSD__) - DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", - curproc->p_pid, &dev->device, dev->open_count); -#endif return 0; } |