summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Henrion <mux@FreeBSD.org>2003-03-06 01:12:23 +0000
committerMaxime Henrion <mux@FreeBSD.org>2003-03-06 01:12:23 +0000
commitdb303857e8aea518cd9a13dee40d65e2cfbd21b6 (patch)
treed917e936e3fa79eab7b346d74a764bfe630b84bc
parentUpdate to 2.79. (diff)
Add patches so that the nVidia driver works with -CURRENT. Be
aware that nVidia doesn't officially supports -CURRENT though. Older versions of -CURRENT (ie. __FreeBSD_version < 500105) are not supported. 5.0-RELEASE is thus unsupported as well. Requested by: many
Notes
Notes: svn path=/head/; revision=77002
-rw-r--r--x11/nvidia-driver/Makefile4
-rw-r--r--x11/nvidia-driver/files/patch-nv-freebsd.h43
-rw-r--r--x11/nvidia-driver/files/patch-nvidia_ctl.c30
-rw-r--r--x11/nvidia-driver/files/patch-nvidia_dev.c66
-rw-r--r--x11/nvidia-driver/files/patch-nvidia_subr.c124
5 files changed, 265 insertions, 2 deletions
diff --git a/x11/nvidia-driver/Makefile b/x11/nvidia-driver/Makefile
index 1c72acf31679..4723b5e6c3f7 100644
--- a/x11/nvidia-driver/Makefile
+++ b/x11/nvidia-driver/Makefile
@@ -30,8 +30,8 @@ USE_LINUX= yes
.include <bsd.port.pre.mk>
-.if ${OSVERSION} > 500000
-IGNORE= "Drivers are not supported on 5.x"
+.if ${OSVERSION} > 500000 && ${OSVERSION} < 500105
+IGNORE= "You need a more recent version of -CURRENT for this driver"
.endif
.if defined(WITH_FREEBSD_AGP) || defined(FORCE_AGP_RATE)
diff --git a/x11/nvidia-driver/files/patch-nv-freebsd.h b/x11/nvidia-driver/files/patch-nv-freebsd.h
new file mode 100644
index 000000000000..a5690cc5756a
--- /dev/null
+++ b/x11/nvidia-driver/files/patch-nv-freebsd.h
@@ -0,0 +1,43 @@
+--- src/nv-freebsd.h.orig Wed Oct 30 15:30:58 2002
++++ src/nv-freebsd.h Thu Mar 6 01:27:10 2003
+@@ -27,12 +27,6 @@
+ * active development and also unsupported.
+ */
+
+-#if __FreeBSD_version >= 500000
+-#error This driver does not support FreeBSD 5.0/-CURRENT!
+-#elif __FreeBSD_version < 470000
+-#error This driver requires FreeBSD 4.7 or later!
+-#endif
+-
+ #include <sys/systm.h>
+ #include <sys/types.h>
+ #include <sys/queue.h>
+@@ -86,6 +80,7 @@
+
+ #if __FreeBSD_version >= 500000
+ #include <sys/mutex.h>
++#include <sys/filedesc.h>
+ #include <dev/pci/pcireg.h>
+ #include <dev/pci/pcivar.h>
+
+@@ -115,6 +110,9 @@
+ #define __TD_FDT(td) ((td)->p_fd)
+ #define __TD_FDT_CNT(td) ((td)->p_fd->fd_refcnt)
+
++#define vm_page_lock_queues()
++#define vm_page_unlock_queues()
++
+ #endif
+
+ /*
+@@ -306,7 +304,8 @@
+ int nvidia_open_dev (struct nvidia_softc *);
+ int nvidia_close_ctl (dev_t, d_thread_t *);
+ int nvidia_close_dev (struct nvidia_softc *, dev_t, d_thread_t *);
+-int nvidia_mmap_dev (struct nvidia_softc *, vm_offset_t);
++int nvidia_mmap_dev (struct nvidia_softc *, vm_offset_t,
++ vm_offset_t *);
+
+ #endif /* __NV_FREEBSD_H__ */
+
diff --git a/x11/nvidia-driver/files/patch-nvidia_ctl.c b/x11/nvidia-driver/files/patch-nvidia_ctl.c
new file mode 100644
index 000000000000..6514b873d19b
--- /dev/null
+++ b/x11/nvidia-driver/files/patch-nvidia_ctl.c
@@ -0,0 +1,30 @@
+--- src/nvidia_ctl.c.orig Wed Oct 30 15:30:58 2002
++++ src/nvidia_ctl.c Thu Mar 6 01:07:57 2003
+@@ -19,6 +19,7 @@
+ static d_poll_t nvidia_ctl_poll;
+
+ static struct cdevsw nvidia_ctl_cdevsw = {
++#if __FreeBSD_version < 500000
+ /* open */ nvidia_ctl_open,
+ /* close */ nvidia_ctl_close,
+ /* read */ noread,
+@@ -32,10 +33,17 @@
+ /* dump */ nodump,
+ /* psize */ nopsize,
+ /* flags */ D_TRACKCLOSE,
+-#if __FreeBSD_version < 500000
+ /* bmaj */ -1,
+-#endif
+ /* kqfilter */ NULL,
++#else
++ .d_open = nvidia_ctl_open,
++ .d_close = nvidia_ctl_close,
++ .d_ioctl = nvidia_ctl_ioctl,
++ .d_poll = nvidia_ctl_poll,
++ .d_name = "nvidiactl",
++ .d_maj = CDEV_MAJOR,
++ .d_flags = D_TRACKCLOSE
++#endif
+ };
+
+ static dev_t nvidia_ctl_cdev;
diff --git a/x11/nvidia-driver/files/patch-nvidia_dev.c b/x11/nvidia-driver/files/patch-nvidia_dev.c
new file mode 100644
index 000000000000..d53e31741c73
--- /dev/null
+++ b/x11/nvidia-driver/files/patch-nvidia_dev.c
@@ -0,0 +1,66 @@
+--- src/nvidia_dev.c.orig Wed Oct 30 15:30:58 2002
++++ src/nvidia_dev.c Thu Mar 6 01:09:05 2003
+@@ -20,6 +20,7 @@
+ static d_mmap_t nvidia_dev_mmap;
+
+ static struct cdevsw nvidia_dev_cdevsw = {
++#if __FreeBSD_version < 500000
+ /* open */ nvidia_dev_open,
+ /* close */ nvidia_dev_close,
+ /* read */ noread,
+@@ -33,10 +34,18 @@
+ /* dump */ nodump,
+ /* psize */ nopsize,
+ /* flags */ D_MEM|D_TRACKCLOSE,
+-#if __FreeBSD_version < 500000
+ /* bmaj */ -1,
+-#endif
+ /* kqfilter */ NULL,
++#else
++ .d_open = nvidia_dev_open,
++ .d_close = nvidia_dev_close,
++ .d_ioctl = nvidia_dev_ioctl,
++ .d_poll = nvidia_dev_poll,
++ .d_mmap = nvidia_dev_mmap,
++ .d_name = "nvidia",
++ .d_maj = CDEV_MAJOR,
++ .d_flags = D_MEM|D_TRACKCLOSE
++#endif
+ };
+
+ int nvidia_dev_open(
+@@ -135,11 +144,15 @@
+ int nvidia_dev_mmap(
+ dev_t dev,
+ vm_offset_t offset,
++#if __FreeBSD_version >= 500000
++ vm_offset_t *paddr,
++#endif
+ int nprot
+ )
+ {
+ nv_state_t *nv;
+ struct nvidia_softc *sc;
++ vm_offset_t phys;
+
+ int status;
+ int unit = minor(dev);
+@@ -148,10 +161,17 @@
+ nv = sc->nv_state;
+
+ nv_lock_api(nv);
+- status = nvidia_mmap_dev(sc, offset);
++ status = nvidia_mmap_dev(sc, offset, &phys);
+ nv_unlock_api(nv);
+
++#if __FreeBSD_version >= 500000
++ *paddr = phys;
+ return status;
++#else
++ if (status == -1)
++ return -1;
++ return atop(phys);
++#endif
+ }
+
+ int nvidia_dev_attach (struct nvidia_softc *sc)
diff --git a/x11/nvidia-driver/files/patch-nvidia_subr.c b/x11/nvidia-driver/files/patch-nvidia_subr.c
new file mode 100644
index 000000000000..edd6fa4da0e6
--- /dev/null
+++ b/x11/nvidia-driver/files/patch-nvidia_subr.c
@@ -0,0 +1,124 @@
+--- src/nvidia_subr.c.orig Wed Oct 30 15:30:58 2002
++++ src/nvidia_subr.c Thu Mar 6 01:25:20 2003
+@@ -925,7 +925,9 @@
+ * prevent random crashes.
+ */
+ pa = vtophys((vm_offset_t) vm + (i * PAGE_SIZE));
++ vm_page_lock_queues();
+ vm_page_wire(PHYS_TO_VM_PAGE(pa));
++ vm_page_unlock_queues();
+ }
+
+ at->object = 0;
+@@ -963,6 +965,7 @@
+ count = at->size / PAGE_SIZE;
+ SLIST_REMOVE(&sc->alloc_list, at, nv_alloc, list);
+
++ vm_page_lock_queues();
+ for (i = 0; i < count; i++) {
+ /*
+ * Release "one wiring" of this page; this may reenable paging as
+@@ -971,6 +974,7 @@
+ pa = vtophys(at->address + (i * PAGE_SIZE));
+ vm_page_unwire(PHYS_TO_VM_PAGE(pa), 0);
+ }
++ vm_page_unlock_queues();
+
+ free(at, M_NVIDIA);
+ free(address, M_NVIDIA);
+@@ -1007,13 +1011,19 @@
+ * will be allocated.
+ */
+
++#if __FreeBSD_version < 500000
+ m = vm_page_grab(object, i, VM_ALLOC_NORMAL);
++#else
++ m = vm_page_grab(object, i, VM_ALLOC_NORMAL | VM_ALLOC_WIRED);
++#endif
+ if (!m) {
++ vm_page_lock_queues();
+ for (i -= 1; i >= 0; i--) {
+ m = vm_page_lookup(object, i);
+ vm_page_wakeup(m);
+ vm_page_unwire(m, 0);
+ }
++ vm_page_unlock_queues();
+ return -ENOMEM;
+ }
+
+@@ -1022,7 +1032,9 @@
+ * paging it out while we're still using it. This is necessary to
+ * prevent random crashes.
+ */
++#if __FreeBSD_version < 500000
+ vm_page_wire(m);
++#endif
+ vm_page_wakeup(m);
+ }
+
+@@ -1061,6 +1073,7 @@
+ count = at->size / PAGE_SIZE;
+ SLIST_REMOVE(&sc->alloc_list, at, nv_alloc, list);
+
++ vm_page_lock_queues();
+ for (i = 0; i < count; i++) {
+ /*
+ * Release "one wiring" of this page; this may reenable paging as
+@@ -1069,6 +1082,7 @@
+ m = vm_page_lookup(at->object, i);
+ vm_page_unwire(m, 0);
+ }
++ vm_page_unlock_queues();
+
+ free(at, M_NVIDIA);
+ vm_object_deallocate(at->object);
+@@ -1401,7 +1415,8 @@
+
+ int nvidia_mmap_dev(
+ struct nvidia_softc *sc,
+- vm_offset_t offset
++ vm_offset_t offset,
++ vm_offset_t *paddr
+ )
+ {
+ nv_alloc_t *at;
+@@ -1412,14 +1427,20 @@
+ * are physical addresses and mapped into user-space directly. We can
+ * only do some basic sanity checking here.
+ */
+- if (IS_FB_OFFSET(nv, offset, PAGE_SIZE))
+- return atop(offset);
++ if (IS_FB_OFFSET(nv, offset, PAGE_SIZE)) {
++ *paddr = offset;
++ return 0;
++ }
+
+- if (IS_REG_OFFSET(nv, offset, PAGE_SIZE))
+- return atop(offset);
++ if (IS_REG_OFFSET(nv, offset, PAGE_SIZE)) {
++ *paddr = offset;
++ return 0;
++ }
+
+- if (IS_AGP_OFFSET(nv, offset, PAGE_SIZE))
+- return atop(offset);
++ if (IS_AGP_OFFSET(nv, offset, PAGE_SIZE)) {
++ *paddr = offset;
++ return 0;
++ }
+
+ /*
+ * If the offset does not fall into any of the relevant apertures, we
+@@ -1430,8 +1451,10 @@
+ */
+ SLIST_FOREACH(at, &sc->alloc_list, list) {
+ if (offset >= at->address &&
+- offset < at->address + at->size)
+- return atop(vtophys(offset));
++ offset < at->address + at->size) {
++ *paddr = vtophys(offset);
++ return 0;
++ }
+ }
+
+ return -1;