include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / gpu / drm / ttm / ttm_bo_util.c
index bdec583..d764e82 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/io.h>
 #include <linux/highmem.h>
 #include <linux/wait.h>
+#include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/module.h>
 
@@ -41,9 +42,9 @@ void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
        struct ttm_mem_reg *old_mem = &bo->mem;
 
        if (old_mem->mm_node) {
-               spin_lock(&bo->bdev->lru_lock);
+               spin_lock(&bo->glob->lru_lock);
                drm_mm_put_block(old_mem->mm_node);
-               spin_unlock(&bo->bdev->lru_lock);
+               spin_unlock(&bo->glob->lru_lock);
        }
        old_mem->mm_node = NULL;
 }
@@ -53,7 +54,6 @@ int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
 {
        struct ttm_tt *ttm = bo->ttm;
        struct ttm_mem_reg *old_mem = &bo->mem;
-       uint32_t save_flags = old_mem->placement;
        int ret;
 
        if (old_mem->mem_type != TTM_PL_SYSTEM) {
@@ -62,7 +62,6 @@ int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
                ttm_flag_masked(&old_mem->placement, TTM_PL_FLAG_SYSTEM,
                                TTM_PL_MASK_MEM);
                old_mem->mem_type = TTM_PL_SYSTEM;
-               save_flags = old_mem->placement;
        }
 
        ret = ttm_tt_set_placement_caching(ttm, new_mem->placement);
@@ -77,7 +76,7 @@ int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
 
        *old_mem = *new_mem;
        new_mem->mm_node = NULL;
-       ttm_flag_masked(&save_flags, new_mem->placement, TTM_PL_MASK_MEMTYPE);
+
        return 0;
 }
 EXPORT_SYMBOL(ttm_bo_move_ttm);
@@ -136,7 +135,8 @@ static int ttm_copy_io_page(void *dst, void *src, unsigned long page)
 }
 
 static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
-                               unsigned long page)
+                               unsigned long page,
+                               pgprot_t prot)
 {
        struct page *d = ttm_tt_get_page(ttm, page);
        void *dst;
@@ -145,17 +145,35 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
                return -ENOMEM;
 
        src = (void *)((unsigned long)src + (page << PAGE_SHIFT));
-       dst = kmap(d);
+
+#ifdef CONFIG_X86
+       dst = kmap_atomic_prot(d, KM_USER0, prot);
+#else
+       if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
+               dst = vmap(&d, 1, 0, prot);
+       else
+               dst = kmap(d);
+#endif
        if (!dst)
                return -ENOMEM;
 
        memcpy_fromio(dst, src, PAGE_SIZE);
-       kunmap(d);
+
+#ifdef CONFIG_X86
+       kunmap_atomic(dst, KM_USER0);
+#else
+       if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
+               vunmap(dst);
+       else
+               kunmap(d);
+#endif
+
        return 0;
 }
 
 static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
-                               unsigned long page)
+                               unsigned long page,
+                               pgprot_t prot)
 {
        struct page *s = ttm_tt_get_page(ttm, page);
        void *src;
@@ -164,12 +182,28 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
                return -ENOMEM;
 
        dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT));
-       src = kmap(s);
+#ifdef CONFIG_X86
+       src = kmap_atomic_prot(s, KM_USER0, prot);
+#else
+       if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
+               src = vmap(&s, 1, 0, prot);
+       else
+               src = kmap(s);
+#endif
        if (!src)
                return -ENOMEM;
 
        memcpy_toio(dst, src, PAGE_SIZE);
-       kunmap(s);
+
+#ifdef CONFIG_X86
+       kunmap_atomic(src, KM_USER0);
+#else
+       if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
+               vunmap(src);
+       else
+               kunmap(s);
+#endif
+
        return 0;
 }
 
@@ -184,7 +218,6 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
        void *old_iomap;
        void *new_iomap;
        int ret;
-       uint32_t save_flags = old_mem->placement;
        unsigned long i;
        unsigned long page;
        unsigned long add = 0;
@@ -214,11 +247,17 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
 
        for (i = 0; i < new_mem->num_pages; ++i) {
                page = i * dir + add;
-               if (old_iomap == NULL)
-                       ret = ttm_copy_ttm_io_page(ttm, new_iomap, page);
-               else if (new_iomap == NULL)
-                       ret = ttm_copy_io_ttm_page(ttm, old_iomap, page);
-               else
+               if (old_iomap == NULL) {
+                       pgprot_t prot = ttm_io_prot(old_mem->placement,
+                                                   PAGE_KERNEL);
+                       ret = ttm_copy_ttm_io_page(ttm, new_iomap, page,
+                                                  prot);
+               } else if (new_iomap == NULL) {
+                       pgprot_t prot = ttm_io_prot(new_mem->placement,
+                                                   PAGE_KERNEL);
+                       ret = ttm_copy_io_ttm_page(ttm, old_iomap, page,
+                                                  prot);
+               } else
                        ret = ttm_copy_io_page(new_iomap, old_iomap, page);
                if (ret)
                        goto out1;
@@ -229,7 +268,6 @@ out2:
 
        *old_mem = *new_mem;
        new_mem->mm_node = NULL;
-       ttm_flag_masked(&save_flags, new_mem->placement, TTM_PL_MASK_MEMTYPE);
 
        if ((man->flags & TTM_MEMTYPE_FLAG_FIXED) && (ttm != NULL)) {
                ttm_tt_unbind(ttm);
@@ -328,6 +366,7 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp)
 #endif
        return tmp;
 }
+EXPORT_SYMBOL(ttm_io_prot);
 
 static int ttm_bo_ioremap(struct ttm_buffer_object *bo,
                          unsigned long bus_base,
@@ -386,7 +425,7 @@ static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
 
                /*
                 * We need to use vmap to get the desired page protection
-                * or to make the buffer object look contigous.
+                * or to make the buffer object look contiguous.
                 */
                prot = (mem->placement & TTM_PL_FLAG_CACHED) ?
                        PAGE_KERNEL :
@@ -495,7 +534,6 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
        struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type];
        struct ttm_mem_reg *old_mem = &bo->mem;
        int ret;
-       uint32_t save_flags = old_mem->placement;
        struct ttm_buffer_object *ghost_obj;
        void *tmp_obj = NULL;
 
@@ -509,8 +547,8 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
        if (evict) {
                ret = ttm_bo_wait(bo, false, false, false);
                spin_unlock(&bo->lock);
-               driver->sync_obj_unref(&bo->sync_obj);
-
+               if (tmp_obj)
+                       driver->sync_obj_unref(&tmp_obj);
                if (ret)
                        return ret;
 
@@ -532,6 +570,8 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
 
                set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
                spin_unlock(&bo->lock);
+               if (tmp_obj)
+                       driver->sync_obj_unref(&tmp_obj);
 
                ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                if (ret)
@@ -554,7 +594,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
 
        *old_mem = *new_mem;
        new_mem->mm_node = NULL;
-       ttm_flag_masked(&save_flags, new_mem->placement, TTM_PL_MASK_MEMTYPE);
+
        return 0;
 }
 EXPORT_SYMBOL(ttm_bo_move_accel_cleanup);