updated patch-dfly for x11/nvidia-driver override port

Emiel Kollof coolvibe at hackerheaven.org
Wed Jul 21 01:43:27 PDT 2004


--Boundary-00=_hxi/AYelIthQPpp
Content-Type: text/plain;
  charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hey people,

Attached is a cleaned up patch for the x11/nvidia-driver override port. It 
brings in some fixes I discussed with Joerg, and it also might fix this 
driver for SMP systems. Please test this patch if you have SMP, or have 
nothing better to do :)

Note: this is NOT related to the prerelease driver I got from NVIDIA.

to test:

Drop patch in /usr/dfports/x11/nvidia-driver/files, overwriting the one that's 
there. make install, be merry.

Cheers,
Emiel
--
If only one could get that wonderful feeling of accomplishment without
having to accomplish anything.

--Boundary-00=_hxi/AYelIthQPpp
Content-Type: text/x-diff;
  charset="us-ascii";
  name="patch-dfly"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="patch-dfly"

diff -urN ./module/Makefile ../../nvidia-patched/module/Makefile
--- ./module/Makefile	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/module/Makefile	2004-07-21 10:14:32.000000000 +0200
@@ -6,7 +6,7 @@
 KMOD=		nvidia
 SRCS=		nvidia_ctl.c nvidia_dev.c nvidia_linux.c nvidia_os.c nvidia_os_pci.c nvidia_os_registry.c nvidia_pci.c nvidia_subr.c nvidia_sysctl.c 
 SRCS+=		device_if.h bus_if.h pci_if.h vnode_if.h
-CFLAGS+=	-I${NVIDIA_ROOT}/src -D__KERNEL__ -DNV_MAJOR_VERSION=1 -DNV_MINOR_VERSION=0 -DNV_PATCHLEVEL=4365  -DNVCPU_X86   -DNV_BSD   -DNV_INT64_OK   -DNV_UNIX     
+CFLAGS+=	-I${NVIDIA_ROOT}/src -D__KERNEL__ -DNV_MAJOR_VERSION=1 -DNV_MINOR_VERSION=0 -DNV_PATCHLEVEL=4365  -DNVCPU_X86   -DNV_BSD   -DNV_INT64_OK   -DNV_UNIX     -Werror
 NVOBJ=		${NVIDIA_ROOT}/obj/nv-kernel.o
 OBJS+=		NVIDIA.o
 NOOBJ=		true
diff -urN ./src/nv-dragonfly.h ../../nvidia-patched/src/nv-dragonfly.h
--- ./src/nv-dragonfly.h	1970-01-01 01:00:00.000000000 +0100
+++ ../../nvidia-patched/src/nv-dragonfly.h	2004-07-21 10:24:22.000000000 +0200
@@ -0,0 +1,297 @@
+/* _NVRM_COPYRIGHT_BEGIN_
+ *
+ * Copyright 2001 by NVIDIA Corporation.  All rights reserved.  All
+ * information contained herein is proprietary and confidential to NVIDIA
+ * Corporation.  Any use, reproduction, or disclosure without the written
+ * permission of NVIDIA Corporation is prohibited.
+ *
+ * _NVRM_COPYRIGHT_END_
+ */
+
+#ifndef __NV_DRAGONFLY_H
+#define __NV_DRAGONFLY_H
+
+#ifdef TRUE
+#undef TRUE
+#endif
+
+#ifdef FALSE
+#undef FALSE
+#endif
+
+#include <sys/param.h>
+#include <stdarg.h>
+
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <sys/pciio.h>
+#include <sys/vnode.h>
+
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/ioccom.h>
+#include <sys/malloc.h>
+#include <sys/socket.h>
+#include <sys/sysent.h>
+#include <sys/sysctl.h>
+
+#include <machine/resource.h>
+#include <machine/clock.h>
+#include <machine/stdarg.h>
+#include <machine/bus.h>
+#include <machine/bus_memio.h>
+#include <machine/vm86.h>
+
+#include <sys/conf.h>
+#include <sys/rman.h>
+#include <sys/proc.h>
+#include <sys/lock.h>
+#include <sys/mman.h>
+#include <sys/file.h>
+#include <sys/poll.h>
+
+#include <sys/syscall.h>
+#include <sys/bus.h>
+#include <sys/memrange.h>
+#include <sys/sysproto.h>
+#include <sys/signalvar.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_page.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_object.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
+
+#include <dev/agp//agpvar.h>
+#include <sys/agpio.h>
+
+#include "net/if.h"
+#include "emulation/linux/i386/linux.h"
+#include "emulation/linux/linux_ioctl.h"
+
+#include <machine/smp.h>
+#include <bus/pci/pcireg.h>
+#include <bus/pci/pcivar.h>
+
+#include <sys/thread2.h>
+
+#define vm_page_lock_queues()
+#define vm_page_unlock_queues()
+
+/*
+ * The resource manager client tracking needs an identifier that uniquely
+ * represents a client connection across threads. It needs to be specific
+ * to the thread that allocated the client. The Linux struct file pointer
+ * is such an identifier. The per-process file descriptor table is enough
+ * on FreeBSD, due to its thread-aware reference counting.
+ */
+
+#define __TD_FDT(td)     ((td)->td_proc->p_fd)
+#define __TD_FDT_CNT(td) ((td)->td_proc->p_fd->fd_refcnt)
+
+
+/*
+ * The NVIDIA kernel module's malloc identifier, needed for both tracking
+ * and actual allocation/freeing purposes - declared here, but defined in
+ * nvidia_os.c.
+ */
+
+MALLOC_DECLARE(M_NVIDIA);
+
+/*
+ * This define controls if the module will be built to support the NVIDIA
+ * AGP GART driver or the FreeBSD AGPGART driver module. If you decide to
+ * use AGPGART, the agp.ko module must be preloaded from loader.conf.
+ */
+
+#undef USE_OS_AGP_GART
+
+/*
+ * This flag determines if system memory for use with the NVIDIA AGP GART
+ * driver is allocated as a contiguous block of kernel virtual memory, or
+ * as a VM object. The latter is better (tm), and thus the default.
+ */
+
+#define NV_AGP_USE_VM_OBJECT 1
+
+/*
+ * This option decides if the driver will be built with support for Linux
+ * compatibility. This makes nvidia.ko dependant on linux.ko; if you have
+ * no need for Linux 3D applications, you can safely unset this flag.
+ */
+
+#define NV_SUPPORT_LINUX_COMPAT 1
+
+/*
+ * The DMA memory allocation tracking structure. DMA memory alloctions on
+ * FreeBSD are tracked with their base address and size. Since PCI memory
+ * is allocated from kernel virtual memory and since AGP allocations have
+ * a contiguous range of addresses in the AGP aperture, base and size are
+ * sufficient to track allocations.
+ */
+
+typedef
+struct nv_alloc {
+    SLIST_ENTRY(nv_alloc) list;
+    u_int32_t size;
+    vm_offset_t address;
+    u_int32_t offset;
+    struct vm_object *object;
+} nv_alloc_t;
+
+typedef
+struct nv_alloc_private {
+    u_int32_t count;
+    u_int32_t alloc_type_contiguous;
+    u_int32_t alloc_type_cached;
+    u_int32_t alloc_type_kernel;
+    u_int32_t class;
+} nv_alloc_private_t;
+
+typedef
+struct nvidia_softc {
+    device_t dev;
+    device_t agp_dev;
+
+    struct resource *reg;
+    int reg_rid;
+    int reg_type;
+
+    struct resource *mem;
+    int mem_rid;
+    int mem_type;
+
+    struct resource *irq;
+    void *irq_ih;
+    int   irq_rid;
+
+    dev_t cdev;
+    nv_state_t *nv_state;
+
+    struct sysctl_ctx_list sysctl_ctx;
+    struct selinfo rsel;
+
+    struct callout timer_ch;
+
+    /* list of allocations */
+    SLIST_HEAD(alloc_list, nv_alloc) alloc_list;
+
+#if __FreeBSD_version >= 500000
+    struct mtx mtx_rm;
+    struct mtx mtx_api;
+#else
+    int spl;
+    struct lock api_lock;
+#endif
+} nvidia_softc_t;
+
+
+#define CDEV_MAJOR      180
+#define CDEV_CTL_MINOR  255
+
+extern devclass_t nvidia_devclass;
+extern nv_state_t nvidia_ctl_state;
+
+extern const char *pNVRM_ID;
+
+#define PCIR_CAP_LIST_ID   0x00
+#define PCIR_CAP_LIST_NEXT 0x01
+#define PCIR_CAP_ID_AGP    0x02
+
+/*
+ * Entries in the NVIDIA glue-layer registry are now described by the new
+ * shared nv_parm_t structure; please review nvidia_os_registry.c in case
+ * you need to make low-level configuration changes. The entries are also
+ * mapped into the SYSCTL hierarchy and thus easily accessible.
+ */
+
+extern nv_parm_t nv_parms[];
+
+
+/* nvidia_dev.c */
+int    nvidia_dev_attach     (struct nvidia_softc *);
+int    nvidia_dev_detach     (struct nvidia_softc *);
+
+/* nvidia_ctl.c */
+int    nvidia_ctl_attach     (void);
+int    nvidia_ctl_detach     (void);
+
+/* nvidia_subr.c */
+int    nvidia_attach         (device_t);
+int    nvidia_detach         (device_t);
+int    nvidia_suspend        (device_t);
+int    nvidia_resume         (device_t);
+int    nvidia_alloc          (device_t);
+int    nvidia_free           (device_t);
+void   nvidia_intr           (void *);
+int    nvidia_modevent       (module_t, int, void *);
+
+void   nvidia_rc_timer       (void *);
+
+void   nv_lock_api           (nv_state_t *);
+void   nv_unlock_api         (nv_state_t *);
+
+S032   nv_alloc_contig_pages (nv_state_t *, VOID **, U032);
+S032   nv_free_contig_pages  (nv_state_t *, VOID *);
+S032   nv_alloc_system_pages (nv_state_t *, VOID **, U032);
+S032   nv_free_system_pages  (nv_state_t *, VOID *);
+
+S032   nv_alloc_vm_object    (nv_state_t *, VOID **, U032);
+S032   nv_free_vm_object     (nv_state_t *, VOID *);
+
+void*  nv_find_alloc         (nv_state_t *, vm_offset_t);
+void*  nv_find_alloc_obj     (nv_state_t *, vm_offset_t);
+
+S032   nv_os_agp_init        (nv_state_t *, VOID **, VOID **, U032 *);
+S032   nv_os_agp_teardown    (nv_state_t *);
+S032   nv_alloc_agp_pages    (nv_state_t *, VOID **, U032, U032, VOID **);
+S032   nv_free_agp_pages     (nv_state_t *, VOID **, U032, VOID *);
+
+/* nvidia_sysctl.c */
+void   nvidia_sysctl_init    (void);
+void   nvidia_sysctl_exit    (void);
+
+U008   nvidia_find_cap       (device_t);
+void*  nvidia_find_bridge    (void);
+
+int    nvidia_sysctl_vbios   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_type    (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_rates   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_fw      (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_sba     (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_regs    (SYSCTL_HANDLER_ARGS);
+
+int    nvidia_sysctl_driver  (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_rate_s  (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_fw_s    (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_sba_s   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_status  (SYSCTL_HANDLER_ARGS);
+
+void   nv_sysctl_init        (nv_state_t *);
+void   nv_sysctl_exit        (nv_state_t *);
+
+/* nvidia_linux.c */
+int    linux_ioctl_nvidia    (d_thread_t *, struct linux_ioctl_args *);
+void   nvidia_linux_init     (void);
+void   nvidia_linux_exit     (void);
+
+/* ioctl helpers */
+int    nvidia_set_primary     (struct nv_ioctl_primary_card *);
+int    nvidia_get_card_info   (struct nv_ioctl_card_info *);
+int    nvidia_get_api_version (struct nv_ioctl_rm_api_version *);
+int    nvidia_handle_ioctl    (dev_t, u_long, caddr_t, int, d_thread_t *);
+
+
+/* device helpers */
+int    nvidia_open_ctl       (void);
+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, vm_offset_t *);
+
+#endif /* __NV_DRAGONFLY_H */
+
diff -urN ./src/nvidia_ctl.c ../../nvidia-patched/src/nvidia_ctl.c
--- ./src/nvidia_ctl.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_ctl.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 static d_open_t  nvidia_ctl_open;
 static d_close_t nvidia_ctl_close;
@@ -19,7 +23,7 @@
 static d_poll_t  nvidia_ctl_poll;
 
 static struct cdevsw nvidia_ctl_cdevsw = {
-#if __FreeBSD_version < 500105
+#if __FreeBSD_version < 500105 && !defined(__DragonFly__)
     /* open    */  nvidia_ctl_open,
     /* close */    nvidia_ctl_close,
     /* read */     noread,
@@ -37,7 +41,7 @@
     /* bmaj */     -1,
 #endif
     /* kqfilter */ NULL,
-#else
+#elif !defined(__DragonFly__)
     .d_open =      nvidia_ctl_open,
     .d_close =     nvidia_ctl_close,
     .d_ioctl =     nvidia_ctl_ioctl,
@@ -46,6 +50,25 @@
     .d_maj =       CDEV_MAJOR,
     .d_flags =     D_TRACKCLOSE
 #endif
+
+/* Dragonfly */
+#if defined(__DragonFly__)
+    /* name */    "nvidiactl",
+    /* maj */     CDEV_MAJOR,
+    /* flags */    D_TRACKCLOSE,
+    /* port */     NULL,
+    /* autoq */    0,
+
+    /* open    */  nvidia_ctl_open,
+    /* close */    nvidia_ctl_close,
+    /* read */     noread,
+    /* write */    nowrite,
+    /* ioctl */    nvidia_ctl_ioctl,
+    /* poll */     nvidia_ctl_poll,
+    /* mmap */     nommap,
+    /* strategy */ nostrategy,
+    /* dump */     nodump,
+#endif
 };
 
 static dev_t          nvidia_ctl_cdev;
@@ -200,16 +223,20 @@
     struct nvidia_softc *sc;
 
     if (nvidia_count == 0) {
+
+
         /*
          * This routine is called from nvidia_attach, multiple times when
          * more than one device is installed - this makes it necessary to
          * prevent multiple calls to make_dev.
          */
+	cdevsw_add(&nvidia_ctl_cdevsw, -1, 255); /* XXX */
         nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw,
                 CDEV_CTL_MINOR,
                 UID_ROOT, GID_WHEEL, 0666,
                 "%s", nvidia_ctl_cdevsw.d_name);
 
+
         sc = &nvidia_ctl_sc;
         bzero(sc, sizeof(nvidia_softc_t));
         nvidia_ctl_state.os_state = sc;
@@ -218,7 +245,7 @@
         mtx_init(&sc->mtx_api, "ctl.mtx_api", NULL, MTX_DEF);
         mtx_init(&sc->mtx_rm,  "ctl.mtx_rm",  NULL, MTX_SPIN);
 #else
-        lockinit(&sc->api_lock, PZERO, "ctl.api_lock", 0, 0); 
+        lockinit(&sc->api_lock, 0, "ctl.api_lock", 0, 0); 
 #endif
     }
 
@@ -242,10 +269,17 @@
 #if __FreeBSD_version >= 500000
         mtx_destroy(&sc->mtx_rm);
         mtx_destroy(&sc->mtx_api);
-#else
+#elif defined(__FreeBSD__) && !defined(__DragonFly__)
         lockmgr(&sc->api_lock, LK_DRAIN, 0, curproc);
-#endif
         destroy_dev(nvidia_ctl_cdev);
+#else 
+        lockmgr(&sc->api_lock, LK_DRAIN, NULL, curthread);
+#endif
+
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
+	cdevsw_remove(&nvidia_ctl_cdevsw, -1, 255); /* XXX */
+#endif
+
     }
 
     return 0;
diff -urN ./src/nvidia_dev.c ../../nvidia-patched/src/nvidia_dev.c
--- ./src/nvidia_dev.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_dev.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else 
+#include "nv-dragonfly.h"
+#endif
 
 static d_open_t  nvidia_dev_open;
 static d_close_t nvidia_dev_close;
@@ -20,7 +24,7 @@
 static d_mmap_t  nvidia_dev_mmap;
 
 static struct cdevsw nvidia_dev_cdevsw = {
-#if __FreeBSD_version < 500105
+#if __FreeBSD_version < 500105 && !defined(__DragonFly__)
     /* open    */  nvidia_dev_open,
     /* close */    nvidia_dev_close,
     /* read */     noread,
@@ -38,7 +42,7 @@
     /* bmaj */     -1,
 #endif
     /* kqfilter */ NULL,
-#else
+#elif !defined(__DragonFly__)
     .d_open =      nvidia_dev_open,
     .d_close =     nvidia_dev_close,
     .d_ioctl =     nvidia_dev_ioctl,
@@ -48,6 +52,26 @@
     .d_maj =       CDEV_MAJOR,
     .d_flags =     D_MEM|D_TRACKCLOSE
 #endif
+
+#ifdef __DragonFly__
+    /* name */     "nvidia",
+    /* maj */      CDEV_MAJOR,
+    /* flags */    D_MEM|D_TRACKCLOSE,
+    /* port */    NULL,
+    /* autoq */    0,
+
+    /* open    */  nvidia_dev_open,
+    /* close */    nvidia_dev_close,
+    /* read */     noread,
+    /* write */    nowrite,
+    /* ioctl */    nvidia_dev_ioctl,
+    /* poll */     nvidia_dev_poll,
+    /* mmap */     nvidia_dev_mmap,
+    /* strategy */ nostrategy,
+    /* dump */     nodump,
+    /* psize */    nopsize,
+#endif
+
 };
 
 int nvidia_dev_open(
@@ -187,6 +211,7 @@
 
 int nvidia_dev_attach (struct nvidia_softc *sc)
 {
+    cdevsw_add(&nvidia_dev_cdevsw, -1, device_get_unit(sc->dev));
     sc->cdev = make_dev(&nvidia_dev_cdevsw,
                 device_get_unit(sc->dev),
                 UID_ROOT, GID_WHEEL, 0666,
@@ -199,7 +224,11 @@
 
 int nvidia_dev_detach (struct nvidia_softc *sc)
 {
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
     destroy_dev(sc->cdev);
+#else
+    cdevsw_remove(&nvidia_dev_cdevsw, -1, device_get_unit(sc->dev));
+#endif
     return 0;
 }
 
diff -urN ./src/nvidia_linux.c ../../nvidia-patched/src/nvidia_linux.c
--- ./src/nvidia_linux.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_linux.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 #define LINUX_IOCTL_NVIDIA_MIN 0x4600
 #define LINUX_IOCTL_NVIDIA_MAX 0x46ff
@@ -33,7 +37,11 @@
      * copy the user data in/out correctly.
      */
 
+#ifndef __DragonFly__
     return (ioctl(td, (struct ioctl_args *) args));
+#else 
+    return (ioctl((struct ioctl_args *) args));
+#endif
 }
 
 struct linux_ioctl_handler nvidia_handler = {
diff -urN ./src/nvidia_os.c ../../nvidia-patched/src/nvidia_os.c
--- ./src/nvidia_os.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os.c	2004-07-21 10:24:00.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 /*
@@ -94,7 +98,11 @@
     U032 size
 )
 {
+#ifndef __DragonFly__
     *address = malloc(size, M_NVIDIA, M_NOWAIT|M_ZERO);
+#else 
+    *address = malloc(size, M_NVIDIA, M_WAITOK|M_ZERO);
+#endif
     return *address ? RM_OK : RM_ERROR;
 }
 
@@ -164,7 +172,7 @@
 
 BOOL os_is_administrator(PHWINFO pDev)
 {
-#if __FreeBSD_version < 500000
+#if __FreeBSD_version < 500000 && !defined(__DragonFly__)
     return suser(curproc);
 #else
     return suser(curthread);
@@ -301,7 +309,11 @@
             *pte |= PG_N;
             va += PAGE_SIZE;
         } while (va < (vm_offset_t) vm + size);
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
         invltlb();
+#else /* DragonFly BSD */
+	cpu_invltlb();
+#endif
     }
 
     return vm;
@@ -561,8 +573,13 @@
      * XXX We need opt_global.h for the SMP and APIC_IO #define(s), which
      * is in ../../compile/SYSTEM_NAME (see config(8)). How do we get it?
      */
+#if !defined(__DragonFly__)
     return mp_ncpus;
 #else
+    return ncpus;
+#endif
+
+#else
     return 1; /* single processor system */
 #endif
 }
diff -urN ./src/nvidia_os_pci.c ../../nvidia-patched/src/nvidia_os_pci.c
--- ./src/nvidia_os_pci.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os_pci.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 VOID* os_pci_init_handle(
diff -urN ./src/nvidia_os_registry.c ../../nvidia-patched/src/nvidia_os_registry.c
--- ./src/nvidia_os_registry.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os_registry.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 /*
diff -urN ./src/nvidia_pci.c ../../nvidia-patched/src/nvidia_pci.c
--- ./src/nvidia_pci.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_pci.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 #define NVIDIA_VENDORID 0x10de
 #define NVIDIA_PCI_REG  0x10
@@ -95,8 +99,10 @@
 #if __FreeBSD_version >= 500000
     mtx_init(&sc->mtx_api, "dev.mtx_api", NULL, MTX_DEF);
     mtx_init(&sc->mtx_rm,  "dev.mtx_rm",  NULL, MTX_SPIN);
-#else
+#elif !defined(__DragonFly__)
     lockinit(&sc->api_lock, PZERO, "dev.api_lock", 0, 0); 
+#else
+    lockinit(&sc->api_lock, 0, "dev.api_lock", 0, 0); 
 #endif
     return 0;
 
@@ -114,8 +120,10 @@
 #if __FreeBSD_version >= 500000
     mtx_destroy(&sc->mtx_rm);
     mtx_destroy(&sc->mtx_api);
-#else
+#elif !defined(__DragonFly__)
     lockmgr(&sc->api_lock, LK_DRAIN, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_DRAIN, NULL, curthread);
 #endif
 
     status = nvidia_detach(dev);
diff -urN ./src/nvidia_subr.c ../../nvidia-patched/src/nvidia_subr.c
--- ./src/nvidia_subr.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_subr.c	2004-07-21 10:27:21.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 devclass_t nvidia_devclass;
@@ -51,15 +55,21 @@
         return status;
 
     nv_sysctl_init(nv);
+
+    callout_init(&sc->timer_ch);
+    
     return 0;
 }
 
 int nvidia_detach(device_t dev)
 {
     int status;
-    struct nvidia_softc *sc;
+    struct nvidia_softc *sc; /* gcc is a whiny bitch */
 
     sc = device_get_softc(dev);
+
+    crit_enter();
+    callout_stop(&sc->timer_ch); /* just in case */
     nv_sysctl_exit(sc->nv_state);
 
     if ((status = nvidia_dev_detach(sc)) != 0)
@@ -67,6 +77,7 @@
 
     if ((status = nvidia_ctl_detach()) != 0)
         return status;
+    crit_exit();
 
     return 0;
 }
@@ -297,7 +308,11 @@
     u_long cmd,
     caddr_t data,
     int fflag,
+#if !defined(__DragonFly__)
     d_thread_t *td
+#else 
+    struct thread *td
+#endif
 )
 {
     struct nvidia_softc *sc;
@@ -338,7 +353,11 @@
 
 int nvidia_close_ctl(
     dev_t dev,
+#if !defined(__DragonFly__)
     d_thread_t *td
+#else
+    struct thread *td
+#endif
 )
 {
     nv_state_t *nv = &nvidia_ctl_state;
@@ -762,7 +781,12 @@
      * of our system calls at a time.
      */
     struct nvidia_softc *sc = nv->os_state;
+#ifndef __DragonFly__
     lockmgr(&sc->api_lock, LK_EXCLUSIVE, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_EXCLUSIVE, NULL, curthread);
+#endif
+
 #endif
 }
 
@@ -781,7 +805,12 @@
      * its system call.
      */
     struct nvidia_softc *sc = nv->os_state;
+#ifndef __DragonFly__
     lockmgr(&sc->api_lock, LK_RELEASE, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_RELEASE, NULL, curthread);
+#endif
+
 #endif
 }
 
@@ -1677,7 +1706,8 @@
      * timeout.
      */
     sc = nv->os_state;
-    sc->timer_ch = timeout(nvidia_rc_timer, (void *) nv, hz);
+
+    callout_reset(&sc->timer_ch, hz, nvidia_rc_timer, nv);
 }
 
 int nv_start_rc_timer(
@@ -1689,7 +1719,8 @@
     if (nv->rc_timer_enabled != 0)
         return -EIO;
 
-    sc->timer_ch = timeout(nvidia_rc_timer, (void *) nv, hz);
+    callout_reset(&sc->timer_ch, hz, nvidia_rc_timer, nv);
+
     nv->rc_timer_enabled = 1;
 
     return 0;
@@ -1704,7 +1735,8 @@
     if (nv->rc_timer_enabled == 0)
         return -EIO;
 
-    untimeout(nvidia_rc_timer, (void *) nv, sc->timer_ch);
+    callout_stop(&sc->timer_ch);
+
     nv->rc_timer_enabled = 0;
 
     return 0;
diff -urN ./src/nvidia_sysctl.c ../../nvidia-patched/src/nvidia_sysctl.c
--- ./src/nvidia_sysctl.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_sysctl.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 struct sysctl_ctx_list sysctl_ctx;
 
@@ -231,7 +235,11 @@
                  * It also doesn't make sense to to iterate over multiple
                  * functions if this isn't a multi-function device.
                  */
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
                 hdrtype = pci_read_config(dev, PCIR_HEADERTYPE, 1);
+#else
+                hdrtype = pci_read_config(dev, PCIR_HDRTYPE, 1);
+#endif
 
                 if ((hdrtype & PCIM_MFDEV) == 0)
                     break;

--Boundary-00=_hxi/AYelIthQPpp
Content-Type: Text/Plain;
  charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

=2D----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hey people,

Attached is a cleaned up patch for the x11/nvidia-driver override port. It=
=20
brings in some fixes I discussed with Joerg, and it also might fix this=20
driver for SMP systems. Please test this patch if you have SMP, or have=20
nothing better to do :)

Note: this is NOT related to the prerelease driver I got from NVIDIA.

to test:

Drop patch in /usr/dfports/x11/nvidia-driver/files, overwriting the one tha=
t's=20
there. make install, be merry.

Cheers,
Emiel
=2D --=20
If only one could get that wonderful feeling of accomplishment without
having to accomplish anything.
=2D----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (FreeBSD)

iD8DBQFA/ixY4hAlCajuF/wRAtkHAKCpJBdS2U6jP+R+VnWmMmOZKb9PxwCfd47o
koEppihlyHcFhzpByuVtMrQ=3D
=3De3ON
=2D----END PGP SIGNATURE-----

--Boundary-00=_hxi/AYelIthQPpp
Content-Type: text/x-diff;
  charset="us-ascii";
  name="patch-dfly"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="patch-dfly"

diff -urN ./module/Makefile ../../nvidia-patched/module/Makefile
--- ./module/Makefile	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/module/Makefile	2004-07-21 10:14:32.000000000 +0200
@@ -6,7 +6,7 @@
 KMOD=		nvidia
 SRCS=		nvidia_ctl.c nvidia_dev.c nvidia_linux.c nvidia_os.c nvidia_os_pci.c nvidia_os_registry.c nvidia_pci.c nvidia_subr.c nvidia_sysctl.c 
 SRCS+=		device_if.h bus_if.h pci_if.h vnode_if.h
-CFLAGS+=	-I${NVIDIA_ROOT}/src -D__KERNEL__ -DNV_MAJOR_VERSION=1 -DNV_MINOR_VERSION=0 -DNV_PATCHLEVEL=4365  -DNVCPU_X86   -DNV_BSD   -DNV_INT64_OK   -DNV_UNIX     
+CFLAGS+=	-I${NVIDIA_ROOT}/src -D__KERNEL__ -DNV_MAJOR_VERSION=1 -DNV_MINOR_VERSION=0 -DNV_PATCHLEVEL=4365  -DNVCPU_X86   -DNV_BSD   -DNV_INT64_OK   -DNV_UNIX     -Werror
 NVOBJ=		${NVIDIA_ROOT}/obj/nv-kernel.o
 OBJS+=		NVIDIA.o
 NOOBJ=		true
diff -urN ./src/nv-dragonfly.h ../../nvidia-patched/src/nv-dragonfly.h
--- ./src/nv-dragonfly.h	1970-01-01 01:00:00.000000000 +0100
+++ ../../nvidia-patched/src/nv-dragonfly.h	2004-07-21 10:24:22.000000000 +0200
@@ -0,0 +1,297 @@
+/* _NVRM_COPYRIGHT_BEGIN_
+ *
+ * Copyright 2001 by NVIDIA Corporation.  All rights reserved.  All
+ * information contained herein is proprietary and confidential to NVIDIA
+ * Corporation.  Any use, reproduction, or disclosure without the written
+ * permission of NVIDIA Corporation is prohibited.
+ *
+ * _NVRM_COPYRIGHT_END_
+ */
+
+#ifndef __NV_DRAGONFLY_H
+#define __NV_DRAGONFLY_H
+
+#ifdef TRUE
+#undef TRUE
+#endif
+
+#ifdef FALSE
+#undef FALSE
+#endif
+
+#include <sys/param.h>
+#include <stdarg.h>
+
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <sys/pciio.h>
+#include <sys/vnode.h>
+
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/ioccom.h>
+#include <sys/malloc.h>
+#include <sys/socket.h>
+#include <sys/sysent.h>
+#include <sys/sysctl.h>
+
+#include <machine/resource.h>
+#include <machine/clock.h>
+#include <machine/stdarg.h>
+#include <machine/bus.h>
+#include <machine/bus_memio.h>
+#include <machine/vm86.h>
+
+#include <sys/conf.h>
+#include <sys/rman.h>
+#include <sys/proc.h>
+#include <sys/lock.h>
+#include <sys/mman.h>
+#include <sys/file.h>
+#include <sys/poll.h>
+
+#include <sys/syscall.h>
+#include <sys/memrange.h>
+#include <sys/sysproto.h>
+#include <sys/signalvar.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_page.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_object.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
+
+#include <dev/agp//agpvar.h>
+#include <sys/agpio.h>
+
+#include "net/if.h"
+#include "emulation/linux/i386/linux.h"
+#include "emulation/linux/linux_ioctl.h"
+
+#include <machine/smp.h>
+#include <bus/pci/pcireg.h>
+#include <bus/pci/pcivar.h>
+
+#include <sys/thread2.h>
+
+#define vm_page_lock_queues()
+#define vm_page_unlock_queues()
+
+/*
+ * The resource manager client tracking needs an identifier that uniquely
+ * represents a client connection across threads. It needs to be specific
+ * to the thread that allocated the client. The Linux struct file pointer
+ * is such an identifier. The per-process file descriptor table is enough
+ * on FreeBSD, due to its thread-aware reference counting.
+ */
+
+#define __TD_FDT(td)     ((td)->td_proc->p_fd)
+#define __TD_FDT_CNT(td) ((td)->td_proc->p_fd->fd_refcnt)
+
+
+/*
+ * The NVIDIA kernel module's malloc identifier, needed for both tracking
+ * and actual allocation/freeing purposes - declared here, but defined in
+ * nvidia_os.c.
+ */
+
+MALLOC_DECLARE(M_NVIDIA);
+
+/*
+ * This define controls if the module will be built to support the NVIDIA
+ * AGP GART driver or the FreeBSD AGPGART driver module. If you decide to
+ * use AGPGART, the agp.ko module must be preloaded from loader.conf.
+ */
+
+#undef USE_OS_AGP_GART
+
+/*
+ * This flag determines if system memory for use with the NVIDIA AGP GART
+ * driver is allocated as a contiguous block of kernel virtual memory, or
+ * as a VM object. The latter is better (tm), and thus the default.
+ */
+
+#define NV_AGP_USE_VM_OBJECT 1
+
+/*
+ * This option decides if the driver will be built with support for Linux
+ * compatibility. This makes nvidia.ko dependant on linux.ko; if you have
+ * no need for Linux 3D applications, you can safely unset this flag.
+ */
+
+#define NV_SUPPORT_LINUX_COMPAT 1
+
+/*
+ * The DMA memory allocation tracking structure. DMA memory alloctions on
+ * FreeBSD are tracked with their base address and size. Since PCI memory
+ * is allocated from kernel virtual memory and since AGP allocations have
+ * a contiguous range of addresses in the AGP aperture, base and size are
+ * sufficient to track allocations.
+ */
+
+typedef
+struct nv_alloc {
+    SLIST_ENTRY(nv_alloc) list;
+    u_int32_t size;
+    vm_offset_t address;
+    u_int32_t offset;
+    struct vm_object *object;
+} nv_alloc_t;
+
+typedef
+struct nv_alloc_private {
+    u_int32_t count;
+    u_int32_t alloc_type_contiguous;
+    u_int32_t alloc_type_cached;
+    u_int32_t alloc_type_kernel;
+    u_int32_t class;
+} nv_alloc_private_t;
+
+typedef
+struct nvidia_softc {
+    device_t dev;
+    device_t agp_dev;
+
+    struct resource *reg;
+    int reg_rid;
+    int reg_type;
+
+    struct resource *mem;
+    int mem_rid;
+    int mem_type;
+
+    struct resource *irq;
+    void *irq_ih;
+    int   irq_rid;
+
+    dev_t cdev;
+    nv_state_t *nv_state;
+
+    struct sysctl_ctx_list sysctl_ctx;
+    struct selinfo rsel;
+
+    struct callout timer_ch;
+
+    /* list of allocations */
+    SLIST_HEAD(alloc_list, nv_alloc) alloc_list;
+
+#if __FreeBSD_version >= 500000
+    struct mtx mtx_rm;
+    struct mtx mtx_api;
+#else
+    int spl;
+    struct lock api_lock;
+#endif
+} nvidia_softc_t;
+
+
+#define CDEV_MAJOR      180
+#define CDEV_CTL_MINOR  255
+
+extern devclass_t nvidia_devclass;
+extern nv_state_t nvidia_ctl_state;
+
+extern const char *pNVRM_ID;
+
+#define PCIR_CAP_LIST_ID   0x00
+#define PCIR_CAP_LIST_NEXT 0x01
+#define PCIR_CAP_ID_AGP    0x02
+
+/*
+ * Entries in the NVIDIA glue-layer registry are now described by the new
+ * shared nv_parm_t structure; please review nvidia_os_registry.c in case
+ * you need to make low-level configuration changes. The entries are also
+ * mapped into the SYSCTL hierarchy and thus easily accessible.
+ */
+
+extern nv_parm_t nv_parms[];
+
+
+/* nvidia_dev.c */
+int    nvidia_dev_attach     (struct nvidia_softc *);
+int    nvidia_dev_detach     (struct nvidia_softc *);
+
+/* nvidia_ctl.c */
+int    nvidia_ctl_attach     (void);
+int    nvidia_ctl_detach     (void);
+
+/* nvidia_subr.c */
+int    nvidia_attach         (device_t);
+int    nvidia_detach         (device_t);
+int    nvidia_suspend        (device_t);
+int    nvidia_resume         (device_t);
+int    nvidia_alloc          (device_t);
+int    nvidia_free           (device_t);
+void   nvidia_intr           (void *);
+int    nvidia_modevent       (module_t, int, void *);
+
+void   nvidia_rc_timer       (void *);
+
+void   nv_lock_api           (nv_state_t *);
+void   nv_unlock_api         (nv_state_t *);
+
+S032   nv_alloc_contig_pages (nv_state_t *, VOID **, U032);
+S032   nv_free_contig_pages  (nv_state_t *, VOID *);
+S032   nv_alloc_system_pages (nv_state_t *, VOID **, U032);
+S032   nv_free_system_pages  (nv_state_t *, VOID *);
+
+S032   nv_alloc_vm_object    (nv_state_t *, VOID **, U032);
+S032   nv_free_vm_object     (nv_state_t *, VOID *);
+
+void*  nv_find_alloc         (nv_state_t *, vm_offset_t);
+void*  nv_find_alloc_obj     (nv_state_t *, vm_offset_t);
+
+S032   nv_os_agp_init        (nv_state_t *, VOID **, VOID **, U032 *);
+S032   nv_os_agp_teardown    (nv_state_t *);
+S032   nv_alloc_agp_pages    (nv_state_t *, VOID **, U032, U032, VOID **);
+S032   nv_free_agp_pages     (nv_state_t *, VOID **, U032, VOID *);
+
+/* nvidia_sysctl.c */
+void   nvidia_sysctl_init    (void);
+void   nvidia_sysctl_exit    (void);
+
+U008   nvidia_find_cap       (device_t);
+void*  nvidia_find_bridge    (void);
+
+int    nvidia_sysctl_vbios   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_type    (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_rates   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_fw      (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_sba     (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_regs    (SYSCTL_HANDLER_ARGS);
+
+int    nvidia_sysctl_driver  (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_rate_s  (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_fw_s    (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_sba_s   (SYSCTL_HANDLER_ARGS);
+int    nvidia_sysctl_status  (SYSCTL_HANDLER_ARGS);
+
+void   nv_sysctl_init        (nv_state_t *);
+void   nv_sysctl_exit        (nv_state_t *);
+
+/* nvidia_linux.c */
+int    linux_ioctl_nvidia    (d_thread_t *, struct linux_ioctl_args *);
+void   nvidia_linux_init     (void);
+void   nvidia_linux_exit     (void);
+
+/* ioctl helpers */
+int    nvidia_set_primary     (struct nv_ioctl_primary_card *);
+int    nvidia_get_card_info   (struct nv_ioctl_card_info *);
+int    nvidia_get_api_version (struct nv_ioctl_rm_api_version *);
+int    nvidia_handle_ioctl    (dev_t, u_long, caddr_t, int, d_thread_t *);
+
+
+/* device helpers */
+int    nvidia_open_ctl       (void);
+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, vm_offset_t *);
+
+#endif /* __NV_DRAGONFLY_H */
+
diff -urN ./src/nvidia_ctl.c ../../nvidia-patched/src/nvidia_ctl.c
--- ./src/nvidia_ctl.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_ctl.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 static d_open_t  nvidia_ctl_open;
 static d_close_t nvidia_ctl_close;
@@ -19,7 +23,7 @@
 static d_poll_t  nvidia_ctl_poll;
 
 static struct cdevsw nvidia_ctl_cdevsw = {
-#if __FreeBSD_version < 500105
+#if __FreeBSD_version < 500105 && !defined(__DragonFly__)
     /* open    */  nvidia_ctl_open,
     /* close */    nvidia_ctl_close,
     /* read */     noread,
@@ -37,7 +41,7 @@
     /* bmaj */     -1,
 #endif
     /* kqfilter */ NULL,
-#else
+#elif !defined(__DragonFly__)
     .d_open =      nvidia_ctl_open,
     .d_close =     nvidia_ctl_close,
     .d_ioctl =     nvidia_ctl_ioctl,
@@ -46,6 +50,25 @@
     .d_maj =       CDEV_MAJOR,
     .d_flags =     D_TRACKCLOSE
 #endif
+
+/* Dragonfly */
+#if defined(__DragonFly__)
+    /* name */    "nvidiactl",
+    /* maj */     CDEV_MAJOR,
+    /* flags */    D_TRACKCLOSE,
+    /* port */     NULL,
+    /* autoq */    0,
+
+    /* open    */  nvidia_ctl_open,
+    /* close */    nvidia_ctl_close,
+    /* read */     noread,
+    /* write */    nowrite,
+    /* ioctl */    nvidia_ctl_ioctl,
+    /* poll */     nvidia_ctl_poll,
+    /* mmap */     nommap,
+    /* strategy */ nostrategy,
+    /* dump */     nodump,
+#endif
 };
 
 static dev_t          nvidia_ctl_cdev;
@@ -200,16 +223,20 @@
     struct nvidia_softc *sc;
 
     if (nvidia_count == 0) {
+
+
         /*
          * This routine is called from nvidia_attach, multiple times when
          * more than one device is installed - this makes it necessary to
          * prevent multiple calls to make_dev.
          */
+	cdevsw_add(&nvidia_ctl_cdevsw, -1, 255); /* XXX */
         nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw,
                 CDEV_CTL_MINOR,
                 UID_ROOT, GID_WHEEL, 0666,
                 "%s", nvidia_ctl_cdevsw.d_name);
 
+
         sc = &nvidia_ctl_sc;
         bzero(sc, sizeof(nvidia_softc_t));
         nvidia_ctl_state.os_state = sc;
@@ -218,7 +245,7 @@
         mtx_init(&sc->mtx_api, "ctl.mtx_api", NULL, MTX_DEF);
         mtx_init(&sc->mtx_rm,  "ctl.mtx_rm",  NULL, MTX_SPIN);
 #else
-        lockinit(&sc->api_lock, PZERO, "ctl.api_lock", 0, 0); 
+        lockinit(&sc->api_lock, 0, "ctl.api_lock", 0, 0); 
 #endif
     }
 
@@ -242,10 +269,17 @@
 #if __FreeBSD_version >= 500000
         mtx_destroy(&sc->mtx_rm);
         mtx_destroy(&sc->mtx_api);
-#else
+#elif defined(__FreeBSD__) && !defined(__DragonFly__)
         lockmgr(&sc->api_lock, LK_DRAIN, 0, curproc);
-#endif
         destroy_dev(nvidia_ctl_cdev);
+#else 
+        lockmgr(&sc->api_lock, LK_DRAIN, NULL, curthread);
+#endif
+
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
+	cdevsw_remove(&nvidia_ctl_cdevsw, -1, 255); /* XXX */
+#endif
+
     }
 
     return 0;
diff -urN ./src/nvidia_dev.c ../../nvidia-patched/src/nvidia_dev.c
--- ./src/nvidia_dev.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_dev.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else 
+#include "nv-dragonfly.h"
+#endif
 
 static d_open_t  nvidia_dev_open;
 static d_close_t nvidia_dev_close;
@@ -20,7 +24,7 @@
 static d_mmap_t  nvidia_dev_mmap;
 
 static struct cdevsw nvidia_dev_cdevsw = {
-#if __FreeBSD_version < 500105
+#if __FreeBSD_version < 500105 && !defined(__DragonFly__)
     /* open    */  nvidia_dev_open,
     /* close */    nvidia_dev_close,
     /* read */     noread,
@@ -38,7 +42,7 @@
     /* bmaj */     -1,
 #endif
     /* kqfilter */ NULL,
-#else
+#elif !defined(__DragonFly__)
     .d_open =      nvidia_dev_open,
     .d_close =     nvidia_dev_close,
     .d_ioctl =     nvidia_dev_ioctl,
@@ -48,6 +52,26 @@
     .d_maj =       CDEV_MAJOR,
     .d_flags =     D_MEM|D_TRACKCLOSE
 #endif
+
+#ifdef __DragonFly__
+    /* name */     "nvidia",
+    /* maj */      CDEV_MAJOR,
+    /* flags */    D_MEM|D_TRACKCLOSE,
+    /* port */    NULL,
+    /* autoq */    0,
+
+    /* open    */  nvidia_dev_open,
+    /* close */    nvidia_dev_close,
+    /* read */     noread,
+    /* write */    nowrite,
+    /* ioctl */    nvidia_dev_ioctl,
+    /* poll */     nvidia_dev_poll,
+    /* mmap */     nvidia_dev_mmap,
+    /* strategy */ nostrategy,
+    /* dump */     nodump,
+    /* psize */    nopsize,
+#endif
+
 };
 
 int nvidia_dev_open(
@@ -187,6 +211,7 @@
 
 int nvidia_dev_attach (struct nvidia_softc *sc)
 {
+    cdevsw_add(&nvidia_dev_cdevsw, -1, device_get_unit(sc->dev));
     sc->cdev = make_dev(&nvidia_dev_cdevsw,
                 device_get_unit(sc->dev),
                 UID_ROOT, GID_WHEEL, 0666,
@@ -199,7 +224,11 @@
 
 int nvidia_dev_detach (struct nvidia_softc *sc)
 {
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
     destroy_dev(sc->cdev);
+#else
+    cdevsw_remove(&nvidia_dev_cdevsw, -1, device_get_unit(sc->dev));
+#endif
     return 0;
 }
 
diff -urN ./src/nvidia_linux.c ../../nvidia-patched/src/nvidia_linux.c
--- ./src/nvidia_linux.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_linux.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 #define LINUX_IOCTL_NVIDIA_MIN 0x4600
 #define LINUX_IOCTL_NVIDIA_MAX 0x46ff
@@ -33,7 +37,11 @@
      * copy the user data in/out correctly.
      */
 
+#ifndef __DragonFly__
     return (ioctl(td, (struct ioctl_args *) args));
+#else 
+    return (ioctl((struct ioctl_args *) args));
+#endif
 }
 
 struct linux_ioctl_handler nvidia_handler = {
diff -urN ./src/nvidia_os.c ../../nvidia-patched/src/nvidia_os.c
--- ./src/nvidia_os.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os.c	2004-07-21 10:24:00.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 /*
@@ -94,7 +98,11 @@
     U032 size
 )
 {
+#ifndef __DragonFly__
     *address = malloc(size, M_NVIDIA, M_NOWAIT|M_ZERO);
+#else 
+    *address = malloc(size, M_NVIDIA, M_WAITOK|M_ZERO);
+#endif
     return *address ? RM_OK : RM_ERROR;
 }
 
@@ -164,7 +172,7 @@
 
 BOOL os_is_administrator(PHWINFO pDev)
 {
-#if __FreeBSD_version < 500000
+#if __FreeBSD_version < 500000 && !defined(__DragonFly__)
     return suser(curproc);
 #else
     return suser(curthread);
@@ -301,7 +309,11 @@
             *pte |= PG_N;
             va += PAGE_SIZE;
         } while (va < (vm_offset_t) vm + size);
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
         invltlb();
+#else /* DragonFly BSD */
+	cpu_invltlb();
+#endif
     }
 
     return vm;
@@ -561,8 +573,13 @@
      * XXX We need opt_global.h for the SMP and APIC_IO #define(s), which
      * is in ../../compile/SYSTEM_NAME (see config(8)). How do we get it?
      */
+#if !defined(__DragonFly__)
     return mp_ncpus;
 #else
+    return ncpus;
+#endif
+
+#else
     return 1; /* single processor system */
 #endif
 }
diff -urN ./src/nvidia_os_pci.c ../../nvidia-patched/src/nvidia_os_pci.c
--- ./src/nvidia_os_pci.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os_pci.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 VOID* os_pci_init_handle(
diff -urN ./src/nvidia_os_registry.c ../../nvidia-patched/src/nvidia_os_registry.c
--- ./src/nvidia_os_registry.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_os_registry.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 /*
diff -urN ./src/nvidia_pci.c ../../nvidia-patched/src/nvidia_pci.c
--- ./src/nvidia_pci.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_pci.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 #define NVIDIA_VENDORID 0x10de
 #define NVIDIA_PCI_REG  0x10
@@ -95,8 +99,10 @@
 #if __FreeBSD_version >= 500000
     mtx_init(&sc->mtx_api, "dev.mtx_api", NULL, MTX_DEF);
     mtx_init(&sc->mtx_rm,  "dev.mtx_rm",  NULL, MTX_SPIN);
-#else
+#elif !defined(__DragonFly__)
     lockinit(&sc->api_lock, PZERO, "dev.api_lock", 0, 0); 
+#else
+    lockinit(&sc->api_lock, 0, "dev.api_lock", 0, 0); 
 #endif
     return 0;
 
@@ -114,8 +120,10 @@
 #if __FreeBSD_version >= 500000
     mtx_destroy(&sc->mtx_rm);
     mtx_destroy(&sc->mtx_api);
-#else
+#elif !defined(__DragonFly__)
     lockmgr(&sc->api_lock, LK_DRAIN, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_DRAIN, NULL, curthread);
 #endif
 
     status = nvidia_detach(dev);
diff -urN ./src/nvidia_subr.c ../../nvidia-patched/src/nvidia_subr.c
--- ./src/nvidia_subr.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_subr.c	2004-07-21 10:27:21.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 
 devclass_t nvidia_devclass;
@@ -51,15 +55,21 @@
         return status;
 
     nv_sysctl_init(nv);
+
+    callout_init(&sc->timer_ch);
+    
     return 0;
 }
 
 int nvidia_detach(device_t dev)
 {
     int status;
-    struct nvidia_softc *sc;
+    struct nvidia_softc *sc; /* gcc is a whiny bitch */
 
     sc = device_get_softc(dev);
+
+    crit_enter();
+    callout_stop(&sc->timer_ch); /* just in case */
     nv_sysctl_exit(sc->nv_state);
 
     if ((status = nvidia_dev_detach(sc)) != 0)
@@ -67,6 +77,7 @@
 
     if ((status = nvidia_ctl_detach()) != 0)
         return status;
+    crit_exit();
 
     return 0;
 }
@@ -297,7 +308,11 @@
     u_long cmd,
     caddr_t data,
     int fflag,
+#if !defined(__DragonFly__)
     d_thread_t *td
+#else 
+    struct thread *td
+#endif
 )
 {
     struct nvidia_softc *sc;
@@ -338,7 +353,11 @@
 
 int nvidia_close_ctl(
     dev_t dev,
+#if !defined(__DragonFly__)
     d_thread_t *td
+#else
+    struct thread *td
+#endif
 )
 {
     nv_state_t *nv = &nvidia_ctl_state;
@@ -762,7 +781,12 @@
      * of our system calls at a time.
      */
     struct nvidia_softc *sc = nv->os_state;
+#ifndef __DragonFly__
     lockmgr(&sc->api_lock, LK_EXCLUSIVE, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_EXCLUSIVE, NULL, curthread);
+#endif
+
 #endif
 }
 
@@ -781,7 +805,12 @@
      * its system call.
      */
     struct nvidia_softc *sc = nv->os_state;
+#ifndef __DragonFly__
     lockmgr(&sc->api_lock, LK_RELEASE, 0, curproc);
+#else
+    lockmgr(&sc->api_lock, LK_RELEASE, NULL, curthread);
+#endif
+
 #endif
 }
 
@@ -1677,7 +1706,8 @@
      * timeout.
      */
     sc = nv->os_state;
-    sc->timer_ch = timeout(nvidia_rc_timer, (void *) nv, hz);
+
+    callout_reset(&sc->timer_ch, hz, nvidia_rc_timer, nv);
 }
 
 int nv_start_rc_timer(
@@ -1689,7 +1719,8 @@
     if (nv->rc_timer_enabled != 0)
         return -EIO;
 
-    sc->timer_ch = timeout(nvidia_rc_timer, (void *) nv, hz);
+    callout_reset(&sc->timer_ch, hz, nvidia_rc_timer, nv);
+
     nv->rc_timer_enabled = 1;
 
     return 0;
@@ -1704,7 +1735,8 @@
     if (nv->rc_timer_enabled == 0)
         return -EIO;
 
-    untimeout(nvidia_rc_timer, (void *) nv, sc->timer_ch);
+    callout_stop(&sc->timer_ch);
+
     nv->rc_timer_enabled = 0;
 
     return 0;
diff -urN ./src/nvidia_sysctl.c ../../nvidia-patched/src/nvidia_sysctl.c
--- ./src/nvidia_sysctl.c	2003-05-28 18:51:52.000000000 +0200
+++ ../../nvidia-patched/src/nvidia_sysctl.c	2004-07-21 10:14:32.000000000 +0200
@@ -11,7 +11,11 @@
 #include "nv-misc.h"
 #include "os-interface.h"
 #include "nv.h"
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
 #include "nv-freebsd.h"
+#else
+#include "nv-dragonfly.h"
+#endif
 
 struct sysctl_ctx_list sysctl_ctx;
 
@@ -231,7 +235,11 @@
                  * It also doesn't make sense to to iterate over multiple
                  * functions if this isn't a multi-function device.
                  */
+#if defined(__FreeBSD__) && !defined(__DragonFly__)
                 hdrtype = pci_read_config(dev, PCIR_HEADERTYPE, 1);
+#else
+                hdrtype = pci_read_config(dev, PCIR_HDRTYPE, 1);
+#endif
 
                 if ((hdrtype & PCIM_MFDEV) == 0)
                     break;

--Boundary-00=_hxi/AYelIthQPpp--

----
-------





More information about the Submit mailing list