diff options
Diffstat (limited to 'sys/dev/drm/drm_fops.h')
-rw-r--r-- | sys/dev/drm/drm_fops.h | 202 |
1 files changed, 42 insertions, 160 deletions
diff --git a/sys/dev/drm/drm_fops.h b/sys/dev/drm/drm_fops.h index 081027d..136f4d6 100644 --- a/sys/dev/drm/drm_fops.h +++ b/sys/dev/drm/drm_fops.h @@ -32,18 +32,9 @@ * $FreeBSD$ */ -#define __NO_VERSION__ #include "dev/drm/drmP.h" -#ifdef __linux__ -#include <linux/poll.h> -#endif /* __linux__ */ - -#ifdef __FreeBSD__ -#include <sys/signalvar.h> -#include <sys/poll.h> - -drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, DRM_OS_STRUCTPROC *p) +drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, DRM_STRUCTPROC *p) { #if __FreeBSD_version >= 500021 uid_t uid = p->td_proc->p_ucred->cr_svuid; @@ -59,64 +50,24 @@ drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, DRM_OS_STRUCTPROC *p) return priv; return NULL; } -#endif /* __FreeBSD__ */ /* DRM(open) is called whenever a process opens /dev/drm. */ -#ifdef __linux__ -int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev) -{ - kdev_t m = MINOR(inode->i_rdev); -#endif /* __linux__ */ -#ifdef __FreeBSD__ -int DRM(open_helper)(dev_t kdev, int flags, int fmt, DRM_OS_STRUCTPROC *p, +int DRM(open_helper)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p, drm_device_t *dev) { int m = minor(kdev); -#endif /* __FreeBSD__ */ drm_file_t *priv; -#ifdef __linux__ - if (filp->f_flags & O_EXCL) return -EBUSY; /* No exclusive opens */ -#endif /* __linux__ */ -#ifdef __FreeBSD__ if (flags & O_EXCL) return EBUSY; /* No exclusive opens */ dev->flags = flags; -#endif /* __FreeBSD__ */ if (!DRM(cpu_valid)()) - return DRM_OS_ERR(EINVAL); - - DRM_DEBUG("pid = %d, minor = %d\n", DRM_OS_CURRENTPID, m); + return DRM_ERR(EINVAL); -#ifdef __linux__ - priv = (drm_file_t *) DRM(alloc)(sizeof(*priv), DRM_MEM_FILES); - if(!priv) return DRM_OS_ERR(ENOMEM); + DRM_DEBUG("pid = %d, minor = %d\n", DRM_CURRENTPID, m); - memset(priv, 0, sizeof(*priv)); - filp->private_data = priv; - priv->uid = current->euid; - priv->pid = current->pid; - priv->minor = m; - priv->dev = dev; - priv->ioctl_count = 0; - priv->authenticated = capable(CAP_SYS_ADMIN); - - down(&dev->struct_sem); - if (!dev->file_last) { - priv->next = NULL; - priv->prev = NULL; - dev->file_first = priv; - dev->file_last = priv; - } else { - priv->next = NULL; - priv->prev = dev->file_last; - dev->file_last->next = priv; - dev->file_last = priv; - } - up(&dev->struct_sem); -#endif /* __linux__ */ -#ifdef __FreeBSD__ + /* FIXME: linux mallocs and bzeros here */ priv = (drm_file_t *) DRM(find_file_by_proc)(dev, p); if (priv) { priv->refs++; @@ -135,93 +86,35 @@ int DRM(open_helper)(dev_t kdev, int flags, int fmt, DRM_OS_STRUCTPROC *p, priv->minor = m; priv->devXX = dev; priv->ioctl_count = 0; - priv->authenticated = !DRM_OS_CHECKSUSER; - lockmgr(&dev->dev_lock, LK_EXCLUSIVE, 0, p); + priv->authenticated = !DRM_SUSER(p); + DRM_LOCK; TAILQ_INSERT_TAIL(&dev->files, priv, link); - lockmgr(&dev->dev_lock, LK_RELEASE, 0, p); + DRM_UNLOCK; } - +#ifdef __FreeBSD__ kdev->si_drv1 = dev; -#endif /* __FreeBSD__ */ - -#ifdef __linux__ -#ifdef __alpha__ - /* - * Default the hose - */ - if (!dev->hose) { - struct pci_dev *pci_dev; - pci_dev = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, NULL); - if (pci_dev) dev->hose = pci_dev->sysdata; - if (!dev->hose) { - struct pci_bus *b = pci_bus_b(pci_root_buses.next); - if (b) dev->hose = b->sysdata; - } - } #endif -#endif /* __linux__ */ - return 0; } -#ifdef __linux__ -int DRM(flush)(struct file *filp) -{ - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - - DRM_DEBUG("pid = %d, device = 0x%x, open_count = %d\n", - current->pid, dev->device, dev->open_count); - return 0; -} - -int DRM(fasync)(int fd, struct file *filp, int on) -{ - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - int retcode; - - DRM_DEBUG("fd = %d, device = 0x%x\n", fd, dev->device); - retcode = fasync_helper(fd, filp, on, &dev->buf_async); - if (retcode < 0) return retcode; - return 0; -} -#endif /* __linux__ */ /* 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. */ -#ifdef __linux__ -ssize_t DRM(read)(struct file *filp, char *buf, size_t count, loff_t *off) -#endif /* __linux__ */ -#ifdef __FreeBSD__ -ssize_t DRM(read)(dev_t kdev, struct uio *uio, int ioflag) -#endif /* __FreeBSD__ */ +int DRM(read)(dev_t kdev, struct uio *uio, int ioflag) { - DRM_OS_DEVICE; + DRM_DEVICE; int left; int avail; int send; int cur; -#ifdef __FreeBSD__ int error = 0; -#endif /* __FreeBSD__ */ DRM_DEBUG("%p, %p\n", dev->buf_rp, dev->buf_wp); while (dev->buf_rp == dev->buf_wp) { DRM_DEBUG(" sleeping\n"); -#ifdef __linux__ - if (filp->f_flags & O_NONBLOCK) - return -EAGAIN; - interruptible_sleep_on(&dev->buf_readers); - if (signal_pending(current)) { - DRM_DEBUG(" interrupted\n"); - return -ERESTARTSYS; - } -#endif /* __linux__ */ -#ifdef __FreeBSD__ if (dev->flags & FASYNC) return EWOULDBLOCK; error = tsleep(&dev->buf_rp, PZERO|PCATCH, "drmrd", 0); @@ -229,18 +122,12 @@ ssize_t DRM(read)(dev_t kdev, struct uio *uio, int ioflag) DRM_DEBUG(" interrupted\n"); return error; } -#endif /* __FreeBSD__ */ DRM_DEBUG(" awake\n"); } left = (dev->buf_rp + DRM_BSZ - dev->buf_wp) % DRM_BSZ; avail = DRM_BSZ - left; -#ifdef __linux__ - send = DRM_MIN(avail, count); -#endif /* __linux__ */ -#ifdef __FreeBSD__ send = DRM_MIN(avail, uio->uio_resid); -#endif /* __FreeBSD__ */ while (send) { if (dev->buf_wp > dev->buf_rp) { @@ -248,28 +135,16 @@ ssize_t DRM(read)(dev_t kdev, struct uio *uio, int ioflag) } else { cur = DRM_MIN(send, dev->buf_end - dev->buf_rp); } -#ifdef __linux__ - if (copy_to_user(buf, dev->buf_rp, cur)) - return -EFAULT; -#endif /* __linux__ */ -#ifdef __FreeBSD__ error = uiomove(dev->buf_rp, cur, uio); if (error) break; -#endif /* __FreeBSD__ */ dev->buf_rp += cur; if (dev->buf_rp == dev->buf_end) dev->buf_rp = dev->buf; send -= cur; } -#ifdef __linux__ - wake_up_interruptible(&dev->buf_writers); - return DRM_MIN(avail, count); -#endif /* __linux__ */ -#ifdef __FreeBSD__ wakeup(&dev->buf_wp); return error; -#endif /* __FreeBSD__ */ } int DRM(write_string)(drm_device_t *dev, const char *s) @@ -277,6 +152,9 @@ 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); @@ -301,43 +179,40 @@ int DRM(write_string)(drm_device_t *dev, const char *s) send -= count; } -#ifdef __linux__ - if (dev->buf_async) kill_fasync(&dev->buf_async, SIGIO, POLL_IN); - DRM_DEBUG("waking\n"); - wake_up_interruptible(&dev->buf_readers); -#endif /* __linux__ */ -#ifdef __FreeBSD__ 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); -#endif /* __FreeBSD__ */ return 0; } -#ifdef __linux__ -unsigned int DRM(poll)(struct file *filp, struct poll_table_struct *wait) +int DRM(poll)(dev_t kdev, int events, DRM_STRUCTPROC *p) { - DRM_OS_DEVICE; - - poll_wait(filp, &dev->buf_readers, wait); - if (dev->buf_wp != dev->buf_rp) return POLLIN | POLLRDNORM; - return 0; -} -#endif /* __linux__ */ -#ifdef __FreeBSD__ -int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) -{ - drm_device_t *dev = kdev->si_drv1; + DRM_DEVICE; int s; int revents = 0; @@ -356,8 +231,15 @@ int DRM(poll)(dev_t kdev, int events, DRM_OS_STRUCTPROC *p) int DRM(write)(dev_t kdev, struct uio *uio, int ioflag) { - DRM_DEBUG("pid = %d, device = %p, open_count = %d\n", - curproc->p_pid, ((drm_device_t *)kdev->si_drv1)->device, ((drm_device_t *)kdev->si_drv1)->open_count); - return 0; +#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; } -#endif /* __FreeBSD__ */ |