Merge branch 'upstream'
[nvidia.git] / src / nvidia_subr.c
index 71e68ed..efbfdbf 100644 (file)
@@ -17,7 +17,7 @@
 #include <machine/vm86.h>
 #endif
 
-uma_zone_t nvidia_stack_t_zone;
+MALLOC_DEFINE(M_NV_STACK, "nvstack", "NVidia stack");
 static nv_stack_t *__nvidia_init_sp = NULL;
 
 devclass_t nvidia_devclass;
@@ -41,6 +41,7 @@ int nvidia_attach(device_t dev)
     nv->device_id        = pci_get_device(dev);
     nv->interrupt_line   = pci_get_irq(dev);
     nv->handle           = dev;
+    callout_init(&sc->timer_ch);
 
     for (i = 0; i < NV_GPU_NUM_BARS; i++) {
         if (sc->BAR_recs[i] != NULL) {
@@ -315,7 +316,7 @@ int nvidia_handle_ioctl(
 {
     struct nvidia_softc *sc;
     nv_state_t *nv;
-    int unit = dev2unit(dev);
+    int unit = minor(dev);
     nv_stack_t *sp;
     void *args;
     nv_ioctl_xfer_t *xfer = NULL;
@@ -406,7 +407,7 @@ int nvidia_open_ctl(
     }
 
     if (filep == NULL) {
-        filep = malloc(sizeof(nvidia_filep_t), M_NVIDIA, M_NOWAIT | M_ZERO);
+        filep = kmalloc(sizeof(nvidia_filep_t), M_NVIDIA, M_NOWAIT | M_ZERO | M_NULLOK);
         if (filep == NULL)
             return ENOMEM;
         filep->fd_table = __TD_FDT(td);
@@ -495,7 +496,7 @@ int nvidia_open_dev(
     }
 
     if (filep == NULL) {
-        filep = malloc(sizeof(nvidia_filep_t), M_NVIDIA, M_NOWAIT | M_ZERO);
+        filep = kmalloc(sizeof(nvidia_filep_t), M_NVIDIA, M_NOWAIT | M_ZERO | M_NULLOK);
         if (filep == NULL)
             return ENOMEM;
         filep->fd_table = __TD_FDT(td);
@@ -631,14 +632,8 @@ int nvidia_modevent(
              */
             sc = &nvidia_ctl_sc;
 
-            nvidia_stack_t_zone = uma_zcreate("nv_stack_t", sizeof(nv_stack_t),
-                    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
-            if (nvidia_stack_t_zone == NULL)
-                return ENOMEM;
-
             NV_UMA_ZONE_ALLOC_STACK(sp);
             if (sp == NULL) {
-                uma_zdestroy(nvidia_stack_t_zone);
                 return ENOMEM;
             }
 
@@ -646,16 +641,15 @@ int nvidia_modevent(
             STAILQ_INIT(&sc->filep_queue);
 
             if (!rm_init_rm(sp)) {
-                printf("NVRM: rm_init_rm() failed!\n");
+                kprintf("NVRM: rm_init_rm() failed!\n");
                 NV_UMA_ZONE_FREE_STACK(sp);
-                uma_zdestroy(nvidia_stack_t_zone);
                 return EIO;
             }
 
             __nvidia_init_sp = sp;
 
-            mtx_init(&sc->rm_mtx, "ctl.rm_mtx", NULL, MTX_SPIN | MTX_RECURSE);
-            sx_init(&sc->api_sx, "ctl.api_sx");
+            spin_init(&sc->rm_lock);
+            lockinit(&sc->api_lock, "nvapi", 0, LK_CANRECURSE);
 
             nvidia_ctl_state.os_state = sc;
             sc->nv_state = (void *)&nvidia_ctl_state;
@@ -683,8 +677,8 @@ int nvidia_modevent(
 
             nv_unlock_api(nv);
 
-            mtx_destroy(&sc->rm_mtx);
-            sx_destroy(&sc->api_sx);
+            spin_uninit(&sc->rm_lock);
+            lockuninit(&sc->api_lock);
 
             sp = __nvidia_init_sp;
             rm_shutdown_rm(sp);
@@ -694,8 +688,6 @@ int nvidia_modevent(
             nvidia_sysctl_exit();
             nvidia_linux_exit();
 
-            uma_zdestroy(nvidia_stack_t_zone);
-
             break;
 
         default:
@@ -726,7 +718,7 @@ S032 nv_os_agp_init(
 
     sc->agp_dev = agp_find_device();
     if (!sc->agp_dev) {
-        printf("NVRM: agp_find_device failed, chipset unsupported?\n");
+        kprintf("NVRM: agp_find_device failed, chipset unsupported?\n");
         return -ENODEV;
     }
 
@@ -874,7 +866,7 @@ RM_STATUS NV_API_CALL nv_agp_init(
          * DON'T REDISTRIBUTE THE DRIVER WITH THIS SANITY CHECK REMOVED!
          * -------------------------------------------------------------
          */
-        printf("NVRM: detected agp.ko, aborting NVIDIA AGP setup!\n");
+        kprintf("NVRM: detected agp.ko, aborting NVIDIA AGP setup!\n");
         goto failed;
     }
 
@@ -955,25 +947,25 @@ void NV_API_CALL nv_lock_rm(nv_state_t *nv)
      * interrupts on the current processor.
      */
     struct nvidia_softc *sc = nv->os_state;
-    mtx_lock_spin(&sc->rm_mtx);
+    spin_lock_wr(&sc->rm_lock);
 }
 
 void NV_API_CALL nv_unlock_rm(nv_state_t *nv)
 {
     struct nvidia_softc *sc = nv->os_state;
-    mtx_unlock_spin(&sc->rm_mtx);
+    spin_unlock_wr(&sc->rm_lock);
 }
 
 void nv_lock_api(nv_state_t *nv)
 {
     struct nvidia_softc *sc = nv->os_state;
-    sx_xlock(&sc->api_sx);
+    lockmgr(&sc->api_lock, LK_EXCLUSIVE|LK_CANRECURSE);
 }
 
 void nv_unlock_api(nv_state_t *nv)
 {
     struct nvidia_softc *sc = nv->os_state;
-    sx_xunlock(&sc->api_sx);
+    lockmgr(&sc->api_lock, LK_RELEASE);
 }
 
 
@@ -987,7 +979,7 @@ void NV_API_CALL nv_post_event(
     struct nvidia_softc *sc;
     struct nvidia_event *et; 
 
-    et = malloc(sizeof(nvidia_event_t), M_NVIDIA, M_NOWAIT | M_ZERO);
+    et = kmalloc(sizeof(nvidia_event_t), M_NVIDIA, M_NOWAIT | M_ZERO | M_NULLOK);
     if (et == NULL)
         return;
 
@@ -1100,7 +1092,7 @@ S032 nv_alloc_contig_pages(
     if (os_alloc_contig_pages(&address, size) != RM_OK)
         return -ENOMEM;
 
-    at = malloc(sizeof(struct nvidia_alloc), M_NVIDIA, M_WAITOK | M_ZERO);
+    at = kmalloc(sizeof(struct nvidia_alloc), M_NVIDIA, M_WAITOK | M_ZERO);
     if (!at) {
         os_free_contig_pages(address, size);
         return -ENOMEM;
@@ -1164,12 +1156,12 @@ S032 nv_alloc_system_pages(
     int status;
 
     size = count * PAGE_SIZE;
-    at = malloc(sizeof(struct nvidia_alloc), M_NVIDIA, M_WAITOK | M_ZERO);
+    at = kmalloc(sizeof(struct nvidia_alloc), M_NVIDIA, M_WAITOK | M_ZERO);
     if (!at) {
         return -ENOMEM;
     }
 
-    address = malloc(size, M_NVIDIA, M_WAITOK | M_ZERO);
+    address = kmalloc(size, M_NVIDIA, M_WAITOK | M_ZERO);
     if (!address) {
         free(at, M_NVIDIA);
         return -ENOMEM;
@@ -1193,9 +1185,7 @@ S032 nv_alloc_system_pages(
 
     for (i = 0; i < count; i++) {
         pte_array[i] = (NvU64)vtophys(at->address + (i * PAGE_SIZE));
-        vm_page_lock_queues();
         vm_page_wire(PHYS_TO_VM_PAGE(pte_array[i]));
-        vm_page_unlock_queues();
     }
 
     *private = at;
@@ -1217,9 +1207,7 @@ S032 nv_free_system_pages(
     SLIST_REMOVE(&sc->alloc_list, at, nvidia_alloc, list);
 
     for (i = 0; i < count; i++) {
-        vm_page_lock_queues();
         vm_page_unwire(PHYS_TO_VM_PAGE(at->pte_array[i]), 0);
-        vm_page_unlock_queues();
     }
 
     if (at->cache_type != NV_MEMORY_CACHED)
@@ -1498,7 +1486,7 @@ NvU64 NV_API_CALL nv_get_kern_phys_address(NvU64 address)
         return DMAP_TO_PHYS(va);
 #endif
 
-    if (va < VM_MIN_KERNEL_ADDRESS) {
+    if (va < KERNBASE) {
         os_dbg_breakpoint();
         return 0;
     }
@@ -1511,7 +1499,7 @@ NvU64 NV_API_CALL nv_get_user_phys_address(NvU64 address)
     struct vmspace *vm;
     vm_offset_t va = (vm_offset_t) address;
 
-    if (va >= VM_MIN_KERNEL_ADDRESS) {
+    if (va >= KERNBASE) {
         os_dbg_breakpoint();
         return 0;
     }
@@ -1588,7 +1576,7 @@ void nvidia_rc_timer(void *data)
      */
     rm_run_rc_callback(sp, nv);
 
-    sc->timer_ch = timeout(nvidia_rc_timer, (void *) nv, hz);
+    callout_reset(&sc->timer_ch, hz, nvidia_rc_timer, (void *) nv);
 }
 
 int NV_API_CALL nv_start_rc_timer(
@@ -1600,7 +1588,7 @@ int NV_API_CALL nv_start_rc_timer(
     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, (void *) nv);
     nv->rc_timer_enabled = 1;
 
     return 0;
@@ -1615,7 +1603,7 @@ int NV_API_CALL nv_stop_rc_timer(
     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;