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 dev_ops nvidia_dev_ops = {
23 { "nvidia", CDEV_MAJOR, D_MEM|D_TRACKCLOSE },
24 .d_open = nvidia_dev_open,
25 .d_close = nvidia_dev_close,
26 .d_ioctl = nvidia_dev_ioctl,
27 .d_poll = nvidia_dev_poll,
28 .d_mmap = nvidia_dev_mmap,
32 struct dev_open_args *ap
35 struct cdev *dev = ap->a_head.a_dev;
36 d_thread_t *td = curthread;
38 struct nvidia_softc *sc;
40 int unit = minor(dev);
42 sc = devclass_get_softc(nvidia_devclass, unit);
49 status = nvidia_open_dev(sc, dev, td);
56 struct dev_close_args *ap
59 struct cdev *dev = ap->a_head.a_dev;
60 d_thread_t *td = curthread;
62 struct nvidia_softc *sc;
64 int unit = minor(dev);
66 sc = devclass_get_softc(nvidia_devclass, unit);
70 status = nvidia_close_dev(sc, dev, td);
77 struct dev_ioctl_args *ap
80 struct cdev *dev = ap->a_head.a_dev;
81 u_long cmd = ap->a_cmd;
82 caddr_t data = ap->a_data;
83 int fflag = ap->a_fflag;
84 d_thread_t *td = curthread;
86 struct nvidia_softc *sc;
88 int unit = minor(dev);
90 if (__NV_IOC_TYPE(cmd) != NV_IOCTL_MAGIC)
93 sc = devclass_get_softc(nvidia_devclass, unit);
97 status = nvidia_handle_ioctl(dev, cmd, data, fflag, td);
104 struct dev_poll_args *ap
107 struct cdev *dev = ap->a_head.a_dev;
108 int events = ap->a_events;
109 d_thread_t *td = curthread;
110 struct nvidia_softc *sc;
112 struct nvidia_event *et;
113 int unit = minor(dev);
115 sc = devclass_get_softc(nvidia_devclass, unit);
120 STAILQ_FOREACH(et, &sc->event_queue, queue) {
121 if (et->event.file == __TD_FDT(td))
127 selrecord(td, &sc->rsel);
131 ap->a_events = (events & (POLLIN | POLLPRI | POLLRDNORM));
138 struct dev_mmap_args *ap
141 struct cdev *dev = ap->a_head.a_dev;
142 vm_offset_t offset = ap->a_offset;
144 struct nvidia_softc *sc;
145 vm_offset_t physical;
147 int unit = minor(dev);
149 sc = devclass_get_softc(nvidia_devclass, unit);
153 status = nvidia_mmap_dev(sc, offset, &physical);
157 ap->a_result = atop(physical);
162 int nvidia_dev_attach(struct nvidia_softc *sc)
164 dev_ops_add(&nvidia_dev_ops, -1, device_get_unit(sc->dev));
165 sc->cdev = make_dev(&nvidia_dev_ops,
166 device_get_unit(sc->dev),
167 UID_ROOT, GID_WHEEL, 0666,
168 "%s%d", nvidia_dev_ops.head.name,
169 device_get_unit(sc->dev));
170 reference_dev(sc->cdev);
175 int nvidia_dev_detach(struct nvidia_softc *sc)
177 dev_ops_remove(&nvidia_dev_ops, -1, device_get_unit(sc->dev));
178 destroy_dev(sc->cdev);