summaryrefslogtreecommitdiff
path: root/bsd-core/drm_fops.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsd-core/drm_fops.c')
-rw-r--r--bsd-core/drm_fops.c137
1 files changed, 2 insertions, 135 deletions
diff --git a/bsd-core/drm_fops.c b/bsd-core/drm_fops.c
index 75baa5f2..b0c18fa3 100644
--- a/bsd-core/drm_fops.c
+++ b/bsd-core/drm_fops.c
@@ -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;
}