Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / ttm / ttm_bo_vm.c
index 668dbe8b8dd3c9e486ebd483942c827dcd8d40a6..fe6cb77899f4b22ffc388190fb08e909fc4a298a 100644 (file)
@@ -74,9 +74,6 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        struct ttm_buffer_object *bo = (struct ttm_buffer_object *)
            vma->vm_private_data;
        struct ttm_bo_device *bdev = bo->bdev;
-       unsigned long bus_base;
-       unsigned long bus_offset;
-       unsigned long bus_size;
        unsigned long page_offset;
        unsigned long page_last;
        unsigned long pfn;
@@ -84,7 +81,6 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        struct page *page;
        int ret;
        int i;
-       bool is_iomem;
        unsigned long address = (unsigned long)vmf->virtual_address;
        int retval = VM_FAULT_NOPAGE;
 
@@ -101,8 +97,21 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                return VM_FAULT_NOPAGE;
        }
 
-       if (bdev->driver->fault_reserve_notify)
-               bdev->driver->fault_reserve_notify(bo);
+       if (bdev->driver->fault_reserve_notify) {
+               ret = bdev->driver->fault_reserve_notify(bo);
+               switch (ret) {
+               case 0:
+                       break;
+               case -EBUSY:
+                       set_need_resched();
+               case -ERESTARTSYS:
+                       retval = VM_FAULT_NOPAGE;
+                       goto out_unlock;
+               default:
+                       retval = VM_FAULT_SIGBUS;
+                       goto out_unlock;
+               }
+       }
 
        /*
         * Wait for buffer data in transit, due to a pipelined
@@ -122,15 +131,12 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                spin_unlock(&bo->lock);
 
 
-       ret = ttm_bo_pci_offset(bdev, &bo->mem, &bus_base, &bus_offset,
-                               &bus_size);
-       if (unlikely(ret != 0)) {
+       ret = ttm_mem_io_reserve(bdev, &bo->mem);
+       if (ret) {
                retval = VM_FAULT_SIGBUS;
                goto out_unlock;
        }
 
-       is_iomem = (bus_size != 0);
-
        page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) +
            bo->vm_node->start - vma->vm_pgoff;
        page_last = ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) +
@@ -154,8 +160,7 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
         * vma->vm_page_prot when the object changes caching policy, with
         * the correct locks held.
         */
-
-       if (is_iomem) {
+       if (bo->mem.bus.is_iomem) {
                vma->vm_page_prot = ttm_io_prot(bo->mem.placement,
                                                vma->vm_page_prot);
        } else {
@@ -171,10 +176,8 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
         */
 
        for (i = 0; i < TTM_BO_VM_NUM_PREFAULT; ++i) {
-
-               if (is_iomem)
-                       pfn = ((bus_base + bus_offset) >> PAGE_SHIFT) +
-                           page_offset;
+               if (bo->mem.bus.is_iomem)
+                       pfn = ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT) + page_offset;
                else {
                        page = ttm_tt_get_page(ttm, page_offset);
                        if (unlikely(!page && i == 0)) {
@@ -198,7 +201,6 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                        retval =
                            (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS;
                        goto out_unlock;
-
                }
 
                address += PAGE_SIZE;
@@ -221,8 +223,7 @@ static void ttm_bo_vm_open(struct vm_area_struct *vma)
 
 static void ttm_bo_vm_close(struct vm_area_struct *vma)
 {
-       struct ttm_buffer_object *bo =
-           (struct ttm_buffer_object *)vma->vm_private_data;
+       struct ttm_buffer_object *bo = (struct ttm_buffer_object *)vma->vm_private_data;
 
        ttm_bo_unref(&bo);
        vma->vm_private_data = NULL;