i915_gem.c (237131) | i915_gem.c (248084) |
---|---|
1/*- 2 * Copyright �� 2008 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the --- 38 unchanged lines hidden (view full) --- 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 */ 53 54#include <sys/cdefs.h> | 1/*- 2 * Copyright �� 2008 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the --- 38 unchanged lines hidden (view full) --- 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 */ 53 54#include <sys/cdefs.h> |
55__FBSDID("$FreeBSD: head/sys/dev/drm2/i915/i915_gem.c 237131 2012-06-15 08:50:44Z kib $"); | 55__FBSDID("$FreeBSD: head/sys/dev/drm2/i915/i915_gem.c 248084 2013-03-09 02:32:23Z attilio $"); |
56 57#include <dev/drm2/drmP.h> 58#include <dev/drm2/drm.h> 59#include <dev/drm2/i915/i915_drm.h> 60#include <dev/drm2/i915/i915_drv.h> 61#include <dev/drm2/i915/intel_drv.h> 62#include <dev/drm2/i915/intel_ringbuffer.h> 63#include <sys/resourcevar.h> --- 921 unchanged lines hidden (view full) --- 985 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); 986 else 987 do_bit17_swizzling = 0; 988 989 obj->dirty = 1; 990 vm_obj = obj->base.vm_obj; 991 ret = 0; 992 | 56 57#include <dev/drm2/drmP.h> 58#include <dev/drm2/drm.h> 59#include <dev/drm2/i915/i915_drm.h> 60#include <dev/drm2/i915/i915_drv.h> 61#include <dev/drm2/i915/intel_drv.h> 62#include <dev/drm2/i915/intel_ringbuffer.h> 63#include <sys/resourcevar.h> --- 921 unchanged lines hidden (view full) --- 985 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); 986 else 987 do_bit17_swizzling = 0; 988 989 obj->dirty = 1; 990 vm_obj = obj->base.vm_obj; 991 ret = 0; 992 |
993 VM_OBJECT_LOCK(vm_obj); | 993 VM_OBJECT_WLOCK(vm_obj); |
994 vm_object_pip_add(vm_obj, 1); 995 while (size > 0) { 996 obj_pi = OFF_TO_IDX(offset); 997 obj_po = offset & PAGE_MASK; 998 999 m = i915_gem_wire_page(vm_obj, obj_pi); | 994 vm_object_pip_add(vm_obj, 1); 995 while (size > 0) { 996 obj_pi = OFF_TO_IDX(offset); 997 obj_po = offset & PAGE_MASK; 998 999 m = i915_gem_wire_page(vm_obj, obj_pi); |
1000 VM_OBJECT_UNLOCK(vm_obj); | 1000 VM_OBJECT_WUNLOCK(vm_obj); |
1001 1002 sched_pin(); 1003 sf = sf_buf_alloc(m, SFB_CPUPRIVATE); 1004 mkva = sf_buf_kva(sf); 1005 length = min(size, PAGE_SIZE - obj_po); 1006 while (length > 0) { 1007 if (do_bit17_swizzling && 1008 (VM_PAGE_TO_PHYS(m) & (1 << 17)) != 0) { --- 17 unchanged lines hidden (view full) --- 1026 data_ptr += cnt; 1027 size -= cnt; 1028 length -= cnt; 1029 offset += cnt; 1030 obj_po += cnt; 1031 } 1032 sf_buf_free(sf); 1033 sched_unpin(); | 1001 1002 sched_pin(); 1003 sf = sf_buf_alloc(m, SFB_CPUPRIVATE); 1004 mkva = sf_buf_kva(sf); 1005 length = min(size, PAGE_SIZE - obj_po); 1006 while (length > 0) { 1007 if (do_bit17_swizzling && 1008 (VM_PAGE_TO_PHYS(m) & (1 << 17)) != 0) { --- 17 unchanged lines hidden (view full) --- 1026 data_ptr += cnt; 1027 size -= cnt; 1028 length -= cnt; 1029 offset += cnt; 1030 obj_po += cnt; 1031 } 1032 sf_buf_free(sf); 1033 sched_unpin(); |
1034 VM_OBJECT_LOCK(vm_obj); | 1034 VM_OBJECT_WLOCK(vm_obj); |
1035 if (rw == UIO_WRITE) 1036 vm_page_dirty(m); 1037 vm_page_reference(m); 1038 vm_page_lock(m); 1039 vm_page_unwire(m, 1); 1040 vm_page_unlock(m); 1041 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 1042 1043 if (ret != 0) 1044 break; 1045 } 1046 vm_object_pip_wakeup(vm_obj); | 1035 if (rw == UIO_WRITE) 1036 vm_page_dirty(m); 1037 vm_page_reference(m); 1038 vm_page_lock(m); 1039 vm_page_unwire(m, 1); 1040 vm_page_unlock(m); 1041 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 1042 1043 if (ret != 0) 1044 break; 1045 } 1046 vm_object_pip_wakeup(vm_obj); |
1047 VM_OBJECT_UNLOCK(vm_obj); | 1047 VM_OBJECT_WUNLOCK(vm_obj); |
1048 1049 return (ret); 1050} 1051 1052static int 1053i915_gem_gtt_write(struct drm_device *dev, struct drm_i915_gem_object *obj, 1054 uint64_t data_ptr, uint64_t size, uint64_t offset, struct drm_file *file) 1055{ --- 296 unchanged lines hidden (view full) --- 1352 oldm = *mres; 1353 vm_page_lock(oldm); 1354 vm_page_remove(oldm); 1355 vm_page_unlock(oldm); 1356 *mres = NULL; 1357 } else 1358 oldm = NULL; 1359retry: | 1048 1049 return (ret); 1050} 1051 1052static int 1053i915_gem_gtt_write(struct drm_device *dev, struct drm_i915_gem_object *obj, 1054 uint64_t data_ptr, uint64_t size, uint64_t offset, struct drm_file *file) 1055{ --- 296 unchanged lines hidden (view full) --- 1352 oldm = *mres; 1353 vm_page_lock(oldm); 1354 vm_page_remove(oldm); 1355 vm_page_unlock(oldm); 1356 *mres = NULL; 1357 } else 1358 oldm = NULL; 1359retry: |
1360 VM_OBJECT_UNLOCK(vm_obj); | 1360 VM_OBJECT_WUNLOCK(vm_obj); |
1361unlocked_vmobj: 1362 cause = ret = 0; 1363 m = NULL; 1364 1365 1366 if (i915_intr_pf) { 1367 ret = i915_mutex_lock_interruptible(dev); 1368 if (ret != 0) { --- 33 unchanged lines hidden (view full) --- 1402 cause = 50; 1403 goto unlock; 1404 } 1405 1406 if (i915_gem_object_is_inactive(obj)) 1407 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list); 1408 1409 obj->fault_mappable = true; | 1361unlocked_vmobj: 1362 cause = ret = 0; 1363 m = NULL; 1364 1365 1366 if (i915_intr_pf) { 1367 ret = i915_mutex_lock_interruptible(dev); 1368 if (ret != 0) { --- 33 unchanged lines hidden (view full) --- 1402 cause = 50; 1403 goto unlock; 1404 } 1405 1406 if (i915_gem_object_is_inactive(obj)) 1407 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list); 1408 1409 obj->fault_mappable = true; |
1410 VM_OBJECT_LOCK(vm_obj); | 1410 VM_OBJECT_WLOCK(vm_obj); |
1411 m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset + 1412 offset); 1413 if (m == NULL) { 1414 cause = 60; 1415 ret = -EFAULT; 1416 goto unlock; 1417 } 1418 KASSERT((m->flags & PG_FICTITIOUS) != 0, --- 28 unchanged lines hidden (view full) --- 1447out: 1448 KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return")); 1449 CTR5(KTR_DRM, "fault_fail %p %jx %x err %d %d", gem_obj, offset, prot, 1450 -ret, cause); 1451 if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) { 1452 kern_yield(PRI_USER); 1453 goto unlocked_vmobj; 1454 } | 1411 m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset + 1412 offset); 1413 if (m == NULL) { 1414 cause = 60; 1415 ret = -EFAULT; 1416 goto unlock; 1417 } 1418 KASSERT((m->flags & PG_FICTITIOUS) != 0, --- 28 unchanged lines hidden (view full) --- 1447out: 1448 KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return")); 1449 CTR5(KTR_DRM, "fault_fail %p %jx %x err %d %d", gem_obj, offset, prot, 1450 -ret, cause); 1451 if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) { 1452 kern_yield(PRI_USER); 1453 goto unlocked_vmobj; 1454 } |
1455 VM_OBJECT_LOCK(vm_obj); | 1455 VM_OBJECT_WLOCK(vm_obj); |
1456 vm_object_pip_wakeup(vm_obj); 1457 return (VM_PAGER_ERROR); 1458} 1459 1460static void 1461i915_gem_pager_dtor(void *handle) 1462{ 1463 struct drm_gem_object *obj; --- 739 unchanged lines hidden (view full) --- 2203 int page_count, i, j; 2204 2205 dev = obj->base.dev; 2206 KASSERT(obj->pages == NULL, ("Obj already has pages")); 2207 page_count = obj->base.size / PAGE_SIZE; 2208 obj->pages = malloc(page_count * sizeof(vm_page_t), DRM_I915_GEM, 2209 M_WAITOK); 2210 vm_obj = obj->base.vm_obj; | 1456 vm_object_pip_wakeup(vm_obj); 1457 return (VM_PAGER_ERROR); 1458} 1459 1460static void 1461i915_gem_pager_dtor(void *handle) 1462{ 1463 struct drm_gem_object *obj; --- 739 unchanged lines hidden (view full) --- 2203 int page_count, i, j; 2204 2205 dev = obj->base.dev; 2206 KASSERT(obj->pages == NULL, ("Obj already has pages")); 2207 page_count = obj->base.size / PAGE_SIZE; 2208 obj->pages = malloc(page_count * sizeof(vm_page_t), DRM_I915_GEM, 2209 M_WAITOK); 2210 vm_obj = obj->base.vm_obj; |
2211 VM_OBJECT_LOCK(vm_obj); | 2211 VM_OBJECT_WLOCK(vm_obj); |
2212 for (i = 0; i < page_count; i++) { 2213 if ((obj->pages[i] = i915_gem_wire_page(vm_obj, i)) == NULL) 2214 goto failed; 2215 } | 2212 for (i = 0; i < page_count; i++) { 2213 if ((obj->pages[i] = i915_gem_wire_page(vm_obj, i)) == NULL) 2214 goto failed; 2215 } |
2216 VM_OBJECT_UNLOCK(vm_obj); | 2216 VM_OBJECT_WUNLOCK(vm_obj); |
2217 if (i915_gem_object_needs_bit17_swizzle(obj)) 2218 i915_gem_object_do_bit_17_swizzle(obj); 2219 return (0); 2220 2221failed: 2222 for (j = 0; j < i; j++) { 2223 m = obj->pages[j]; 2224 vm_page_lock(m); 2225 vm_page_unwire(m, 0); 2226 vm_page_unlock(m); 2227 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 2228 } | 2217 if (i915_gem_object_needs_bit17_swizzle(obj)) 2218 i915_gem_object_do_bit_17_swizzle(obj); 2219 return (0); 2220 2221failed: 2222 for (j = 0; j < i; j++) { 2223 m = obj->pages[j]; 2224 vm_page_lock(m); 2225 vm_page_unwire(m, 0); 2226 vm_page_unlock(m); 2227 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 2228 } |
2229 VM_OBJECT_UNLOCK(vm_obj); | 2229 VM_OBJECT_WUNLOCK(vm_obj); |
2230 free(obj->pages, DRM_I915_GEM); 2231 obj->pages = NULL; 2232 return (-EIO); 2233} 2234 2235#define GEM_PARANOID_CHECK_GTT 0 2236#if GEM_PARANOID_CHECK_GTT 2237static void --- 29 unchanged lines hidden (view full) --- 2267 2268 KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object")); 2269 2270 if (obj->tiling_mode != I915_TILING_NONE) 2271 i915_gem_object_save_bit_17_swizzle(obj); 2272 if (obj->madv == I915_MADV_DONTNEED) 2273 obj->dirty = 0; 2274 page_count = obj->base.size / PAGE_SIZE; | 2230 free(obj->pages, DRM_I915_GEM); 2231 obj->pages = NULL; 2232 return (-EIO); 2233} 2234 2235#define GEM_PARANOID_CHECK_GTT 0 2236#if GEM_PARANOID_CHECK_GTT 2237static void --- 29 unchanged lines hidden (view full) --- 2267 2268 KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object")); 2269 2270 if (obj->tiling_mode != I915_TILING_NONE) 2271 i915_gem_object_save_bit_17_swizzle(obj); 2272 if (obj->madv == I915_MADV_DONTNEED) 2273 obj->dirty = 0; 2274 page_count = obj->base.size / PAGE_SIZE; |
2275 VM_OBJECT_LOCK(obj->base.vm_obj); | 2275 VM_OBJECT_WLOCK(obj->base.vm_obj); |
2276#if GEM_PARANOID_CHECK_GTT 2277 i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count); 2278#endif 2279 for (i = 0; i < page_count; i++) { 2280 m = obj->pages[i]; 2281 if (obj->dirty) 2282 vm_page_dirty(m); 2283 if (obj->madv == I915_MADV_WILLNEED) 2284 vm_page_reference(m); 2285 vm_page_lock(m); 2286 vm_page_unwire(obj->pages[i], 1); 2287 vm_page_unlock(m); 2288 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 2289 } | 2276#if GEM_PARANOID_CHECK_GTT 2277 i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count); 2278#endif 2279 for (i = 0; i < page_count; i++) { 2280 m = obj->pages[i]; 2281 if (obj->dirty) 2282 vm_page_dirty(m); 2283 if (obj->madv == I915_MADV_WILLNEED) 2284 vm_page_reference(m); 2285 vm_page_lock(m); 2286 vm_page_unwire(obj->pages[i], 1); 2287 vm_page_unlock(m); 2288 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 2289 } |
2290 VM_OBJECT_UNLOCK(obj->base.vm_obj); | 2290 VM_OBJECT_WUNLOCK(obj->base.vm_obj); |
2291 obj->dirty = 0; 2292 free(obj->pages, DRM_I915_GEM); 2293 obj->pages = NULL; 2294} 2295 2296void 2297i915_gem_release_mmap(struct drm_i915_gem_object *obj) 2298{ --- 5 unchanged lines hidden (view full) --- 2304 return; 2305 2306 CTR3(KTR_DRM, "release_mmap %p %x %x", obj, obj->gtt_offset, 2307 OFF_TO_IDX(obj->base.size)); 2308 devobj = cdev_pager_lookup(obj); 2309 if (devobj != NULL) { 2310 page_count = OFF_TO_IDX(obj->base.size); 2311 | 2291 obj->dirty = 0; 2292 free(obj->pages, DRM_I915_GEM); 2293 obj->pages = NULL; 2294} 2295 2296void 2297i915_gem_release_mmap(struct drm_i915_gem_object *obj) 2298{ --- 5 unchanged lines hidden (view full) --- 2304 return; 2305 2306 CTR3(KTR_DRM, "release_mmap %p %x %x", obj, obj->gtt_offset, 2307 OFF_TO_IDX(obj->base.size)); 2308 devobj = cdev_pager_lookup(obj); 2309 if (devobj != NULL) { 2310 page_count = OFF_TO_IDX(obj->base.size); 2311 |
2312 VM_OBJECT_LOCK(devobj); | 2312 VM_OBJECT_WLOCK(devobj); |
2313retry: 2314 for (i = 0; i < page_count; i++) { 2315 m = vm_page_lookup(devobj, i); 2316 if (m == NULL) 2317 continue; 2318 if (vm_page_sleep_if_busy(m, true, "915unm")) 2319 goto retry; 2320 cdev_pager_free_page(devobj, m); 2321 } | 2313retry: 2314 for (i = 0; i < page_count; i++) { 2315 m = vm_page_lookup(devobj, i); 2316 if (m == NULL) 2317 continue; 2318 if (vm_page_sleep_if_busy(m, true, "915unm")) 2319 goto retry; 2320 cdev_pager_free_page(devobj, m); 2321 } |
2322 VM_OBJECT_UNLOCK(devobj); | 2322 VM_OBJECT_WUNLOCK(devobj); |
2323 vm_object_deallocate(devobj); 2324 } 2325 2326 obj->fault_mappable = false; 2327} 2328 2329int 2330i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj) --- 101 unchanged lines hidden (view full) --- 2432} 2433 2434static void 2435i915_gem_object_truncate(struct drm_i915_gem_object *obj) 2436{ 2437 vm_object_t vm_obj; 2438 2439 vm_obj = obj->base.vm_obj; | 2323 vm_object_deallocate(devobj); 2324 } 2325 2326 obj->fault_mappable = false; 2327} 2328 2329int 2330i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj) --- 101 unchanged lines hidden (view full) --- 2432} 2433 2434static void 2435i915_gem_object_truncate(struct drm_i915_gem_object *obj) 2436{ 2437 vm_object_t vm_obj; 2438 2439 vm_obj = obj->base.vm_obj; |
2440 VM_OBJECT_LOCK(vm_obj); | 2440 VM_OBJECT_WLOCK(vm_obj); |
2441 vm_object_page_remove(vm_obj, 0, 0, false); | 2441 vm_object_page_remove(vm_obj, 0, 0, false); |
2442 VM_OBJECT_UNLOCK(vm_obj); | 2442 VM_OBJECT_WUNLOCK(vm_obj); |
2443 obj->madv = I915_MADV_PURGED_INTERNAL; 2444} 2445 2446static inline int 2447i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj) 2448{ 2449 2450 return (obj->madv == I915_MADV_DONTNEED); --- 32 unchanged lines hidden (view full) --- 2483} 2484 2485static vm_page_t 2486i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex) 2487{ 2488 vm_page_t m; 2489 int rv; 2490 | 2443 obj->madv = I915_MADV_PURGED_INTERNAL; 2444} 2445 2446static inline int 2447i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj) 2448{ 2449 2450 return (obj->madv == I915_MADV_DONTNEED); --- 32 unchanged lines hidden (view full) --- 2483} 2484 2485static vm_page_t 2486i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex) 2487{ 2488 vm_page_t m; 2489 int rv; 2490 |
2491 VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); | 2491 VM_OBJECT_ASSERT_WLOCKED(object); |
2492 m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 2493 if (m->valid != VM_PAGE_BITS_ALL) { 2494 if (vm_pager_has_page(object, pindex, NULL, NULL)) { 2495 rv = vm_pager_get_pages(object, &m, 1, 0); 2496 m = vm_page_lookup(object, pindex); 2497 if (m == NULL) 2498 return (NULL); 2499 if (rv != VM_PAGER_OK) { --- 1062 unchanged lines hidden (view full) --- 3562 char *vaddr, *dst; 3563 int i, page_count; 3564 3565 if (obj->phys_obj == NULL) 3566 return; 3567 vaddr = obj->phys_obj->handle->vaddr; 3568 3569 page_count = obj->base.size / PAGE_SIZE; | 2492 m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 2493 if (m->valid != VM_PAGE_BITS_ALL) { 2494 if (vm_pager_has_page(object, pindex, NULL, NULL)) { 2495 rv = vm_pager_get_pages(object, &m, 1, 0); 2496 m = vm_page_lookup(object, pindex); 2497 if (m == NULL) 2498 return (NULL); 2499 if (rv != VM_PAGER_OK) { --- 1062 unchanged lines hidden (view full) --- 3562 char *vaddr, *dst; 3563 int i, page_count; 3564 3565 if (obj->phys_obj == NULL) 3566 return; 3567 vaddr = obj->phys_obj->handle->vaddr; 3568 3569 page_count = obj->base.size / PAGE_SIZE; |
3570 VM_OBJECT_LOCK(obj->base.vm_obj); | 3570 VM_OBJECT_WLOCK(obj->base.vm_obj); |
3571 for (i = 0; i < page_count; i++) { 3572 m = i915_gem_wire_page(obj->base.vm_obj, i); 3573 if (m == NULL) 3574 continue; /* XXX */ 3575 | 3571 for (i = 0; i < page_count; i++) { 3572 m = i915_gem_wire_page(obj->base.vm_obj, i); 3573 if (m == NULL) 3574 continue; /* XXX */ 3575 |
3576 VM_OBJECT_UNLOCK(obj->base.vm_obj); | 3576 VM_OBJECT_WUNLOCK(obj->base.vm_obj); |
3577 sf = sf_buf_alloc(m, 0); 3578 if (sf != NULL) { 3579 dst = (char *)sf_buf_kva(sf); 3580 memcpy(dst, vaddr + IDX_TO_OFF(i), PAGE_SIZE); 3581 sf_buf_free(sf); 3582 } 3583 drm_clflush_pages(&m, 1); 3584 | 3577 sf = sf_buf_alloc(m, 0); 3578 if (sf != NULL) { 3579 dst = (char *)sf_buf_kva(sf); 3580 memcpy(dst, vaddr + IDX_TO_OFF(i), PAGE_SIZE); 3581 sf_buf_free(sf); 3582 } 3583 drm_clflush_pages(&m, 1); 3584 |
3585 VM_OBJECT_LOCK(obj->base.vm_obj); | 3585 VM_OBJECT_WLOCK(obj->base.vm_obj); |
3586 vm_page_reference(m); 3587 vm_page_lock(m); 3588 vm_page_dirty(m); 3589 vm_page_unwire(m, 0); 3590 vm_page_unlock(m); 3591 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 3592 } | 3586 vm_page_reference(m); 3587 vm_page_lock(m); 3588 vm_page_dirty(m); 3589 vm_page_unwire(m, 0); 3590 vm_page_unlock(m); 3591 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 3592 } |
3593 VM_OBJECT_UNLOCK(obj->base.vm_obj); | 3593 VM_OBJECT_WUNLOCK(obj->base.vm_obj); |
3594 intel_gtt_chipset_flush(); 3595 3596 obj->phys_obj->cur_obj = NULL; 3597 obj->phys_obj = NULL; 3598} 3599 3600int 3601i915_gem_attach_phys_object(struct drm_device *dev, --- 25 unchanged lines hidden (view full) --- 3627 } 3628 3629 /* bind to the object */ 3630 obj->phys_obj = dev_priv->mm.phys_objs[id - 1]; 3631 obj->phys_obj->cur_obj = obj; 3632 3633 page_count = obj->base.size / PAGE_SIZE; 3634 | 3594 intel_gtt_chipset_flush(); 3595 3596 obj->phys_obj->cur_obj = NULL; 3597 obj->phys_obj = NULL; 3598} 3599 3600int 3601i915_gem_attach_phys_object(struct drm_device *dev, --- 25 unchanged lines hidden (view full) --- 3627 } 3628 3629 /* bind to the object */ 3630 obj->phys_obj = dev_priv->mm.phys_objs[id - 1]; 3631 obj->phys_obj->cur_obj = obj; 3632 3633 page_count = obj->base.size / PAGE_SIZE; 3634 |
3635 VM_OBJECT_LOCK(obj->base.vm_obj); | 3635 VM_OBJECT_WLOCK(obj->base.vm_obj); |
3636 ret = 0; 3637 for (i = 0; i < page_count; i++) { 3638 m = i915_gem_wire_page(obj->base.vm_obj, i); 3639 if (m == NULL) { 3640 ret = -EIO; 3641 break; 3642 } | 3636 ret = 0; 3637 for (i = 0; i < page_count; i++) { 3638 m = i915_gem_wire_page(obj->base.vm_obj, i); 3639 if (m == NULL) { 3640 ret = -EIO; 3641 break; 3642 } |
3643 VM_OBJECT_UNLOCK(obj->base.vm_obj); | 3643 VM_OBJECT_WUNLOCK(obj->base.vm_obj); |
3644 sf = sf_buf_alloc(m, 0); 3645 src = (char *)sf_buf_kva(sf); 3646 dst = (char *)obj->phys_obj->handle->vaddr + IDX_TO_OFF(i); 3647 memcpy(dst, src, PAGE_SIZE); 3648 sf_buf_free(sf); 3649 | 3644 sf = sf_buf_alloc(m, 0); 3645 src = (char *)sf_buf_kva(sf); 3646 dst = (char *)obj->phys_obj->handle->vaddr + IDX_TO_OFF(i); 3647 memcpy(dst, src, PAGE_SIZE); 3648 sf_buf_free(sf); 3649 |
3650 VM_OBJECT_LOCK(obj->base.vm_obj); | 3650 VM_OBJECT_WLOCK(obj->base.vm_obj); |
3651 3652 vm_page_reference(m); 3653 vm_page_lock(m); 3654 vm_page_unwire(m, 0); 3655 vm_page_unlock(m); 3656 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 3657 } | 3651 3652 vm_page_reference(m); 3653 vm_page_lock(m); 3654 vm_page_unwire(m, 0); 3655 vm_page_unlock(m); 3656 atomic_add_long(&i915_gem_wired_pages_cnt, -1); 3657 } |
3658 VM_OBJECT_UNLOCK(obj->base.vm_obj); | 3658 VM_OBJECT_WUNLOCK(obj->base.vm_obj); |
3659 3660 return (0); 3661} 3662 3663static int 3664i915_gem_phys_pwrite(struct drm_device *dev, struct drm_i915_gem_object *obj, 3665 uint64_t data_ptr, uint64_t offset, uint64_t size, 3666 struct drm_file *file_priv) --- 94 unchanged lines hidden --- | 3659 3660 return (0); 3661} 3662 3663static int 3664i915_gem_phys_pwrite(struct drm_device *dev, struct drm_i915_gem_object *obj, 3665 uint64_t data_ptr, uint64_t offset, uint64_t size, 3666 struct drm_file *file_priv) --- 94 unchanged lines hidden --- |