Deleted Added
full compact
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 ---