1 /* _NVRM_COPYRIGHT_BEGIN_
3 * Copyright 2001-2002 by NVIDIA Corporation. All rights reserved. All
4 * information contained herein is proprietary and confidential to NVIDIA
5 * Corporation. Any use, reproduction, or disclosure without the written
6 * permission of NVIDIA Corporation is prohibited.
12 #include "os-interface.h"
14 #include "nv-freebsd.h"
16 static d_open_t nvidia_dev_open;
17 static d_close_t nvidia_dev_close;
18 static d_ioctl_t nvidia_dev_ioctl;
19 static d_poll_t nvidia_dev_poll;
20 static d_mmap_t nvidia_dev_mmap;
22 static struct cdevsw nvidia_dev_cdevsw = {
23 .d_open = nvidia_dev_open,
24 .d_close = nvidia_dev_close,
25 .d_ioctl = nvidia_dev_ioctl,
26 .d_poll = nvidia_dev_poll,
27 .d_mmap = nvidia_dev_mmap,
29 .d_version = D_VERSION,
30 .d_flags = D_MEM|D_TRACKCLOSE|D_NEEDGIANT
41 struct nvidia_softc *sc;
43 int unit = minor(dev);
45 sc = devclass_get_softc(nvidia_devclass, unit);
52 status = nvidia_open_dev(sc, dev, td);
66 struct nvidia_softc *sc;
68 int unit = minor(dev);
70 sc = devclass_get_softc(nvidia_devclass, unit);
74 status = nvidia_close_dev(sc, dev, td);
89 struct nvidia_softc *sc;
91 int unit = minor(dev);
93 if (__NV_IOC_TYPE(cmd) != NV_IOCTL_MAGIC)
96 sc = devclass_get_softc(nvidia_devclass, unit);
100 status = nvidia_handle_ioctl(dev, cmd, data, fflag, td);
112 struct nvidia_softc *sc;
114 struct nvidia_event *et;
115 int unit = minor(dev);
117 sc = devclass_get_softc(nvidia_devclass, unit);
122 STAILQ_FOREACH(et, &sc->event_queue, queue) {
123 if (et->event.file == __TD_FDT(td))
129 selrecord(td, &sc->rsel);
132 return (events & (POLLIN | POLLPRI | POLLRDNORM));
141 vm_offset_t *address,
146 struct nvidia_softc *sc;
147 vm_offset_t physical;
149 int unit = minor(dev);
151 sc = devclass_get_softc(nvidia_devclass, unit);
155 status = nvidia_mmap_dev(sc, offset, &physical);
164 int nvidia_dev_attach(struct nvidia_softc *sc)
166 sc->cdev = make_dev(&nvidia_dev_cdevsw,
167 device_get_unit(sc->dev),
168 UID_ROOT, GID_WHEEL, 0666,
169 "%s%d", nvidia_dev_cdevsw.d_name,
170 device_get_unit(sc->dev));
175 int nvidia_dev_detach(struct nvidia_softc *sc)
177 destroy_dev(sc->cdev);