xref: /dragonfly/sys/dev/drm/i915/i915_gem.c (revision 0dace59e)
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
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Eric Anholt <eric@anholt.net>
25  *
26  * Copyright (c) 2011 The FreeBSD Foundation
27  * All rights reserved.
28  *
29  * This software was developed by Konstantin Belousov under sponsorship from
30  * the FreeBSD Foundation.
31  *
32  * Redistribution and use in source and binary forms, with or without
33  * modification, are permitted provided that the following conditions
34  * are met:
35  * 1. Redistributions of source code must retain the above copyright
36  *    notice, this list of conditions and the following disclaimer.
37  * 2. Redistributions in binary form must reproduce the above copyright
38  *    notice, this list of conditions and the following disclaimer in the
39  *    documentation and/or other materials provided with the distribution.
40  *
41  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
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  * $FreeBSD: head/sys/dev/drm2/i915/i915_gem.c 253497 2013-07-20 13:52:40Z kib $
54  */
55 
56 #include <sys/resourcevar.h>
57 #include <sys/sfbuf.h>
58 
59 #include <drm/drmP.h>
60 #include "i915_drm.h"
61 #include "i915_drv.h"
62 #include "intel_drv.h"
63 #include "intel_ringbuffer.h"
64 
65 static void i915_gem_object_flush_cpu_write_domain(
66     struct drm_i915_gem_object *obj);
67 static uint32_t i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size,
68     int tiling_mode);
69 static uint32_t i915_gem_get_gtt_alignment(struct drm_device *dev,
70     uint32_t size, int tiling_mode);
71 static int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
72     unsigned alignment, bool map_and_fenceable);
73 static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
74     int flags);
75 static void i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj);
76 static int i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj,
77     bool write);
78 static void i915_gem_object_set_to_full_cpu_read_domain(
79     struct drm_i915_gem_object *obj);
80 static int i915_gem_object_set_cpu_read_domain_range(
81     struct drm_i915_gem_object *obj, uint64_t offset, uint64_t size);
82 static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj);
83 static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
84 static int i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj);
85 static bool i915_gem_object_is_inactive(struct drm_i915_gem_object *obj);
86 static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj);
87 static vm_page_t i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex);
88 static void i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
89     uint32_t flush_domains);
90 static void i915_gem_clear_fence_reg(struct drm_device *dev,
91     struct drm_i915_fence_reg *reg);
92 static void i915_gem_reset_fences(struct drm_device *dev);
93 static void i915_gem_retire_task_handler(void *arg, int pending);
94 static int i915_gem_phys_pwrite(struct drm_device *dev,
95     struct drm_i915_gem_object *obj, uint64_t data_ptr, uint64_t offset,
96     uint64_t size, struct drm_file *file_priv);
97 static void i915_gem_lowmem(void *arg);
98 
99 MALLOC_DEFINE(DRM_I915_GEM, "i915gem", "Allocations from i915 gem");
100 long i915_gem_wired_pages_cnt;
101 
102 static void
103 i915_gem_info_add_obj(struct drm_i915_private *dev_priv, size_t size)
104 {
105 
106 	dev_priv->mm.object_count++;
107 	dev_priv->mm.object_memory += size;
108 }
109 
110 static void
111 i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, size_t size)
112 {
113 
114 	dev_priv->mm.object_count--;
115 	dev_priv->mm.object_memory -= size;
116 }
117 
118 static int
119 i915_gem_wait_for_error(struct drm_device *dev)
120 {
121 	struct drm_i915_private *dev_priv;
122 	int ret;
123 
124 	dev_priv = dev->dev_private;
125 	if (!atomic_load_acq_int(&dev_priv->mm.wedged))
126 		return (0);
127 
128 	lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
129 	while (dev_priv->error_completion == 0) {
130 		ret = -lksleep(&dev_priv->error_completion,
131 		    &dev_priv->error_completion_lock, PCATCH, "915wco", 0);
132 		if (ret != 0) {
133 			lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
134 			return (ret);
135 		}
136 	}
137 	lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
138 
139 	if (atomic_load_acq_int(&dev_priv->mm.wedged)) {
140 		lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
141 		dev_priv->error_completion++;
142 		lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
143 	}
144 	return (0);
145 }
146 
147 int
148 i915_mutex_lock_interruptible(struct drm_device *dev)
149 {
150 	struct drm_i915_private *dev_priv;
151 	int ret;
152 
153 	dev_priv = dev->dev_private;
154 	ret = i915_gem_wait_for_error(dev);
155 	if (ret != 0)
156 		return (ret);
157 
158 	/*
159 	 * interruptible shall it be. might indeed be if dev_lock is
160 	 * changed to sx
161 	 */
162 	ret = lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_SLEEPFAIL);
163 	if (ret != 0)
164 		return (-ret);
165 
166 	return (0);
167 }
168 
169 
170 static void
171 i915_gem_free_object_tail(struct drm_i915_gem_object *obj)
172 {
173 	struct drm_device *dev;
174 	drm_i915_private_t *dev_priv;
175 	int ret;
176 
177 	dev = obj->base.dev;
178 	dev_priv = dev->dev_private;
179 
180 	ret = i915_gem_object_unbind(obj);
181 	if (ret == -ERESTART) {
182 		list_move(&obj->mm_list, &dev_priv->mm.deferred_free_list);
183 		return;
184 	}
185 
186 	drm_gem_free_mmap_offset(&obj->base);
187 	drm_gem_object_release(&obj->base);
188 	i915_gem_info_remove_obj(dev_priv, obj->base.size);
189 
190 	drm_free(obj->page_cpu_valid, DRM_I915_GEM);
191 	drm_free(obj->bit_17, DRM_I915_GEM);
192 	drm_free(obj, DRM_I915_GEM);
193 }
194 
195 void
196 i915_gem_free_object(struct drm_gem_object *gem_obj)
197 {
198 	struct drm_i915_gem_object *obj;
199 	struct drm_device *dev;
200 
201 	obj = to_intel_bo(gem_obj);
202 	dev = obj->base.dev;
203 
204 	while (obj->pin_count > 0)
205 		i915_gem_object_unpin(obj);
206 
207 	if (obj->phys_obj != NULL)
208 		i915_gem_detach_phys_object(dev, obj);
209 
210 	i915_gem_free_object_tail(obj);
211 }
212 
213 static void
214 init_ring_lists(struct intel_ring_buffer *ring)
215 {
216 
217 	INIT_LIST_HEAD(&ring->active_list);
218 	INIT_LIST_HEAD(&ring->request_list);
219 	INIT_LIST_HEAD(&ring->gpu_write_list);
220 }
221 
222 void
223 i915_gem_load(struct drm_device *dev)
224 {
225 	drm_i915_private_t *dev_priv;
226 	int i;
227 
228 	dev_priv = dev->dev_private;
229 
230 	INIT_LIST_HEAD(&dev_priv->mm.active_list);
231 	INIT_LIST_HEAD(&dev_priv->mm.flushing_list);
232 	INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
233 	INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
234 	INIT_LIST_HEAD(&dev_priv->mm.fence_list);
235 	INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
236 	INIT_LIST_HEAD(&dev_priv->mm.gtt_list);
237 	for (i = 0; i < I915_NUM_RINGS; i++)
238 		init_ring_lists(&dev_priv->rings[i]);
239 	for (i = 0; i < I915_MAX_NUM_FENCES; i++)
240 		INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
241 	TIMEOUT_TASK_INIT(dev_priv->tq, &dev_priv->mm.retire_task, 0,
242 	    i915_gem_retire_task_handler, dev_priv);
243 	dev_priv->error_completion = 0;
244 
245 	/* On GEN3 we really need to make sure the ARB C3 LP bit is set */
246 	if (IS_GEN3(dev)) {
247 		u32 tmp = I915_READ(MI_ARB_STATE);
248 		if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
249 			/*
250 			 * arb state is a masked write, so set bit +
251 			 * bit in mask.
252 			 */
253 			tmp = MI_ARB_C3_LP_WRITE_ENABLE |
254 			    (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
255 			I915_WRITE(MI_ARB_STATE, tmp);
256 		}
257 	}
258 
259 	dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
260 
261 	/* Old X drivers will take 0-2 for front, back, depth buffers */
262 	if (!drm_core_check_feature(dev, DRIVER_MODESET))
263 		dev_priv->fence_reg_start = 3;
264 
265 	if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) ||
266 	    IS_G33(dev))
267 		dev_priv->num_fence_regs = 16;
268 	else
269 		dev_priv->num_fence_regs = 8;
270 
271 	/* Initialize fence registers to zero */
272 	for (i = 0; i < dev_priv->num_fence_regs; i++) {
273 		i915_gem_clear_fence_reg(dev, &dev_priv->fence_regs[i]);
274 	}
275 	i915_gem_detect_bit_6_swizzle(dev);
276 	dev_priv->mm.interruptible = true;
277 
278 	dev_priv->mm.i915_lowmem = EVENTHANDLER_REGISTER(vm_lowmem,
279 	    i915_gem_lowmem, dev, EVENTHANDLER_PRI_ANY);
280 }
281 
282 int
283 i915_gem_do_init(struct drm_device *dev, unsigned long start,
284     unsigned long mappable_end, unsigned long end)
285 {
286 	drm_i915_private_t *dev_priv;
287 	unsigned long mappable;
288 	int error;
289 
290 	dev_priv = dev->dev_private;
291 	mappable = min(end, mappable_end) - start;
292 
293 	drm_mm_init(&dev_priv->mm.gtt_space, start, end - start);
294 
295 	dev_priv->mm.gtt_start = start;
296 	dev_priv->mm.gtt_mappable_end = mappable_end;
297 	dev_priv->mm.gtt_end = end;
298 	dev_priv->mm.gtt_total = end - start;
299 	dev_priv->mm.mappable_gtt_total = mappable;
300 
301 	/* Take over this portion of the GTT */
302 	intel_gtt_clear_range(start / PAGE_SIZE, (end-start) / PAGE_SIZE);
303 	device_printf(dev->device,
304 	    "taking over the fictitious range 0x%lx-0x%lx\n",
305 	    dev->agp->base + start, dev->agp->base + start + mappable);
306 	error = -vm_phys_fictitious_reg_range(dev->agp->base + start,
307 	    dev->agp->base + start + mappable, VM_MEMATTR_WRITE_COMBINING);
308 	return (error);
309 }
310 
311 int
312 i915_gem_init_ioctl(struct drm_device *dev, void *data,
313     struct drm_file *file)
314 {
315 	struct drm_i915_gem_init *args;
316 	drm_i915_private_t *dev_priv;
317 
318 	dev_priv = dev->dev_private;
319 	args = data;
320 
321 	if (args->gtt_start >= args->gtt_end ||
322 	    (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1))
323 		return (-EINVAL);
324 
325 	/*
326 	 * XXXKIB. The second-time initialization should be guarded
327 	 * against.
328 	 */
329 	lockmgr(&dev->dev_lock, LK_EXCLUSIVE|LK_RETRY|LK_CANRECURSE);
330 	i915_gem_do_init(dev, args->gtt_start, args->gtt_end, args->gtt_end);
331 	lockmgr(&dev->dev_lock, LK_RELEASE);
332 
333 	return 0;
334 }
335 
336 int
337 i915_gem_idle(struct drm_device *dev)
338 {
339 	drm_i915_private_t *dev_priv;
340 	int ret;
341 
342 	dev_priv = dev->dev_private;
343 	if (dev_priv->mm.suspended)
344 		return (0);
345 
346 	ret = i915_gpu_idle(dev, true);
347 	if (ret != 0)
348 		return (ret);
349 
350 	/* Under UMS, be paranoid and evict. */
351 	if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
352 		ret = i915_gem_evict_inactive(dev, false);
353 		if (ret != 0)
354 			return ret;
355 	}
356 
357 	i915_gem_reset_fences(dev);
358 
359 	/* Hack!  Don't let anybody do execbuf while we don't control the chip.
360 	 * We need to replace this with a semaphore, or something.
361 	 * And not confound mm.suspended!
362 	 */
363 	dev_priv->mm.suspended = 1;
364 	callout_stop(&dev_priv->hangcheck_timer);
365 
366 	i915_kernel_lost_context(dev);
367 	i915_gem_cleanup_ringbuffer(dev);
368 
369 	/* Cancel the retire work handler, which should be idle now. */
370 	taskqueue_cancel_timeout(dev_priv->tq, &dev_priv->mm.retire_task, NULL);
371 	return (ret);
372 }
373 
374 void
375 i915_gem_init_swizzling(struct drm_device *dev)
376 {
377 	drm_i915_private_t *dev_priv;
378 
379 	dev_priv = dev->dev_private;
380 
381 	if (INTEL_INFO(dev)->gen < 5 ||
382 	    dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
383 		return;
384 
385 	I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
386 				 DISP_TILE_SURFACE_SWIZZLING);
387 
388 	if (IS_GEN5(dev))
389 		return;
390 
391 	I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
392 	if (IS_GEN6(dev))
393 		I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_SNB));
394 	else
395 		I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB));
396 }
397 
398 void
399 i915_gem_init_ppgtt(struct drm_device *dev)
400 {
401 	drm_i915_private_t *dev_priv;
402 	struct i915_hw_ppgtt *ppgtt;
403 	uint32_t pd_offset, pd_entry;
404 	vm_paddr_t pt_addr;
405 	struct intel_ring_buffer *ring;
406 	u_int first_pd_entry_in_global_pt, i;
407 
408 	dev_priv = dev->dev_private;
409 	ppgtt = dev_priv->mm.aliasing_ppgtt;
410 	if (ppgtt == NULL)
411 		return;
412 
413 	first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES;
414 	for (i = 0; i < ppgtt->num_pd_entries; i++) {
415 		pt_addr = VM_PAGE_TO_PHYS(ppgtt->pt_pages[i]);
416 		pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
417 		pd_entry |= GEN6_PDE_VALID;
418 		intel_gtt_write(first_pd_entry_in_global_pt + i, pd_entry);
419 	}
420 	intel_gtt_read_pte(first_pd_entry_in_global_pt);
421 
422 	pd_offset = ppgtt->pd_offset;
423 	pd_offset /= 64; /* in cachelines, */
424 	pd_offset <<= 16;
425 
426 	if (INTEL_INFO(dev)->gen == 6) {
427 		uint32_t ecochk = I915_READ(GAM_ECOCHK);
428 		I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
429 				       ECOCHK_PPGTT_CACHE64B);
430 		I915_WRITE(GFX_MODE, GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
431 	} else if (INTEL_INFO(dev)->gen >= 7) {
432 		I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
433 		/* GFX_MODE is per-ring on gen7+ */
434 	}
435 
436 	for (i = 0; i < I915_NUM_RINGS; i++) {
437 		ring = &dev_priv->rings[i];
438 
439 		if (INTEL_INFO(dev)->gen >= 7)
440 			I915_WRITE(RING_MODE_GEN7(ring),
441 				   GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
442 
443 		I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
444 		I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
445 	}
446 }
447 
448 int
449 i915_gem_init_hw(struct drm_device *dev)
450 {
451 	drm_i915_private_t *dev_priv;
452 	int ret;
453 
454 	dev_priv = dev->dev_private;
455 
456 	i915_gem_init_swizzling(dev);
457 
458 	ret = intel_init_render_ring_buffer(dev);
459 	if (ret != 0)
460 		return (ret);
461 
462 	if (HAS_BSD(dev)) {
463 		ret = intel_init_bsd_ring_buffer(dev);
464 		if (ret != 0)
465 			goto cleanup_render_ring;
466 	}
467 
468 	if (HAS_BLT(dev)) {
469 		ret = intel_init_blt_ring_buffer(dev);
470 		if (ret != 0)
471 			goto cleanup_bsd_ring;
472 	}
473 
474 	dev_priv->next_seqno = 1;
475 	i915_gem_init_ppgtt(dev);
476 	return (0);
477 
478 cleanup_bsd_ring:
479 	intel_cleanup_ring_buffer(&dev_priv->rings[VCS]);
480 cleanup_render_ring:
481 	intel_cleanup_ring_buffer(&dev_priv->rings[RCS]);
482 	return (ret);
483 }
484 
485 int
486 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
487     struct drm_file *file)
488 {
489 	struct drm_i915_private *dev_priv;
490 	struct drm_i915_gem_get_aperture *args;
491 	struct drm_i915_gem_object *obj;
492 	size_t pinned;
493 
494 	dev_priv = dev->dev_private;
495 	args = data;
496 
497 	if (!(dev->driver->driver_features & DRIVER_GEM))
498 		return (-ENODEV);
499 
500 	pinned = 0;
501 	DRM_LOCK(dev);
502 	list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list)
503 		pinned += obj->gtt_space->size;
504 	DRM_UNLOCK(dev);
505 
506 	args->aper_size = dev_priv->mm.gtt_total;
507 	args->aper_available_size = args->aper_size - pinned;
508 
509 	return (0);
510 }
511 
512 int
513 i915_gem_object_pin(struct drm_i915_gem_object *obj, uint32_t alignment,
514      bool map_and_fenceable)
515 {
516 	struct drm_device *dev;
517 	struct drm_i915_private *dev_priv;
518 	int ret;
519 
520 	dev = obj->base.dev;
521 	dev_priv = dev->dev_private;
522 
523 	KASSERT(obj->pin_count != DRM_I915_GEM_OBJECT_MAX_PIN_COUNT,
524 	    ("Max pin count"));
525 
526 	if (obj->gtt_space != NULL) {
527 		if ((alignment && obj->gtt_offset & (alignment - 1)) ||
528 		    (map_and_fenceable && !obj->map_and_fenceable)) {
529 			DRM_DEBUG("bo is already pinned with incorrect alignment:"
530 			     " offset=%x, req.alignment=%x, req.map_and_fenceable=%d,"
531 			     " obj->map_and_fenceable=%d\n",
532 			     obj->gtt_offset, alignment,
533 			     map_and_fenceable,
534 			     obj->map_and_fenceable);
535 			ret = i915_gem_object_unbind(obj);
536 			if (ret != 0)
537 				return (ret);
538 		}
539 	}
540 
541 	if (obj->gtt_space == NULL) {
542 		ret = i915_gem_object_bind_to_gtt(obj, alignment,
543 		    map_and_fenceable);
544 		if (ret)
545 			return (ret);
546 	}
547 
548 	if (obj->pin_count++ == 0 && !obj->active)
549 		list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
550 	obj->pin_mappable |= map_and_fenceable;
551 
552 #if 1
553 	KIB_NOTYET();
554 #else
555 	WARN_ON(i915_verify_lists(dev));
556 #endif
557 	return (0);
558 }
559 
560 void
561 i915_gem_object_unpin(struct drm_i915_gem_object *obj)
562 {
563 	struct drm_device *dev;
564 	drm_i915_private_t *dev_priv;
565 
566 	dev = obj->base.dev;
567 	dev_priv = dev->dev_private;
568 
569 #if 1
570 	KIB_NOTYET();
571 #else
572 	WARN_ON(i915_verify_lists(dev));
573 #endif
574 
575 	KASSERT(obj->pin_count != 0, ("zero pin count"));
576 	KASSERT(obj->gtt_space != NULL, ("No gtt mapping"));
577 
578 	if (--obj->pin_count == 0) {
579 		if (!obj->active)
580 			list_move_tail(&obj->mm_list,
581 			    &dev_priv->mm.inactive_list);
582 		obj->pin_mappable = false;
583 	}
584 #if 1
585 	KIB_NOTYET();
586 #else
587 	WARN_ON(i915_verify_lists(dev));
588 #endif
589 }
590 
591 int
592 i915_gem_pin_ioctl(struct drm_device *dev, void *data,
593     struct drm_file *file)
594 {
595 	struct drm_i915_gem_pin *args;
596 	struct drm_i915_gem_object *obj;
597 	struct drm_gem_object *gobj;
598 	int ret;
599 
600 	args = data;
601 
602 	ret = i915_mutex_lock_interruptible(dev);
603 	if (ret != 0)
604 		return ret;
605 
606 	gobj = drm_gem_object_lookup(dev, file, args->handle);
607 	if (gobj == NULL) {
608 		ret = -ENOENT;
609 		goto unlock;
610 	}
611 	obj = to_intel_bo(gobj);
612 
613 	if (obj->madv != I915_MADV_WILLNEED) {
614 		DRM_ERROR("Attempting to pin a purgeable buffer\n");
615 		ret = -EINVAL;
616 		goto out;
617 	}
618 
619 	if (obj->pin_filp != NULL && obj->pin_filp != file) {
620 		DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
621 		    args->handle);
622 		ret = -EINVAL;
623 		goto out;
624 	}
625 
626 	obj->user_pin_count++;
627 	obj->pin_filp = file;
628 	if (obj->user_pin_count == 1) {
629 		ret = i915_gem_object_pin(obj, args->alignment, true);
630 		if (ret != 0)
631 			goto out;
632 	}
633 
634 	/* XXX - flush the CPU caches for pinned objects
635 	 * as the X server doesn't manage domains yet
636 	 */
637 	i915_gem_object_flush_cpu_write_domain(obj);
638 	args->offset = obj->gtt_offset;
639 out:
640 	drm_gem_object_unreference(&obj->base);
641 unlock:
642 	DRM_UNLOCK(dev);
643 	return (ret);
644 }
645 
646 int
647 i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
648     struct drm_file *file)
649 {
650 	struct drm_i915_gem_pin *args;
651 	struct drm_i915_gem_object *obj;
652 	int ret;
653 
654 	args = data;
655 	ret = i915_mutex_lock_interruptible(dev);
656 	if (ret != 0)
657 		return (ret);
658 
659 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
660 	if (&obj->base == NULL) {
661 		ret = -ENOENT;
662 		goto unlock;
663 	}
664 
665 	if (obj->pin_filp != file) {
666 		DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
667 		    args->handle);
668 		ret = -EINVAL;
669 		goto out;
670 	}
671 	obj->user_pin_count--;
672 	if (obj->user_pin_count == 0) {
673 		obj->pin_filp = NULL;
674 		i915_gem_object_unpin(obj);
675 	}
676 
677 out:
678 	drm_gem_object_unreference(&obj->base);
679 unlock:
680 	DRM_UNLOCK(dev);
681 	return (ret);
682 }
683 
684 int
685 i915_gem_busy_ioctl(struct drm_device *dev, void *data,
686     struct drm_file *file)
687 {
688 	struct drm_i915_gem_busy *args;
689 	struct drm_i915_gem_object *obj;
690 	struct drm_i915_gem_request *request;
691 	int ret;
692 
693 	args = data;
694 
695 	ret = i915_mutex_lock_interruptible(dev);
696 	if (ret != 0)
697 		return ret;
698 
699 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
700 	if (&obj->base == NULL) {
701 		ret = -ENOENT;
702 		goto unlock;
703 	}
704 
705 	args->busy = obj->active;
706 	if (args->busy) {
707 		if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
708 			ret = i915_gem_flush_ring(obj->ring,
709 			    0, obj->base.write_domain);
710 		} else if (obj->ring->outstanding_lazy_request ==
711 		    obj->last_rendering_seqno) {
712 			request = kmalloc(sizeof(*request), DRM_I915_GEM,
713 			    M_WAITOK | M_ZERO);
714 			ret = i915_add_request(obj->ring, NULL, request);
715 			if (ret != 0)
716 				drm_free(request, DRM_I915_GEM);
717 		}
718 
719 		i915_gem_retire_requests_ring(obj->ring);
720 		args->busy = obj->active;
721 	}
722 
723 	drm_gem_object_unreference(&obj->base);
724 unlock:
725 	DRM_UNLOCK(dev);
726 	return (ret);
727 }
728 
729 /* Throttle our rendering by waiting until the ring has completed our requests
730  * emitted over 20 msec ago.
731  *
732  * Note that if we were to use the current jiffies each time around the loop,
733  * we wouldn't escape the function with any frames outstanding if the time to
734  * render a frame was over 20ms.
735  *
736  * This should get us reasonable parallelism between CPU and GPU but also
737  * relatively low latency when blocking on a particular request to finish.
738  */
739 static int
740 i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
741 {
742 	struct drm_i915_private *dev_priv = dev->dev_private;
743 	struct drm_i915_file_private *file_priv = file->driver_priv;
744 	unsigned long recent_enough = ticks - (20 * hz / 1000);
745 	struct drm_i915_gem_request *request;
746 	struct intel_ring_buffer *ring = NULL;
747 	u32 seqno = 0;
748 	int ret;
749 
750 	dev_priv = dev->dev_private;
751 	if (atomic_load_acq_int(&dev_priv->mm.wedged))
752 		return (-EIO);
753 
754 	recent_enough = ticks - (20 * hz / 1000);
755 	ring = NULL;
756 	seqno = 0;
757 
758 	spin_lock(&file_priv->mm.lock);
759 	list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
760 		if (time_after_eq(request->emitted_jiffies, recent_enough))
761 			break;
762 
763 		ring = request->ring;
764 		seqno = request->seqno;
765 	}
766 	spin_unlock(&file_priv->mm.lock);
767 
768 	if (seqno == 0)
769 		return 0;
770 
771 	ret = 0;
772 	lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
773 	if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
774 		if (ring->irq_get(ring)) {
775 			while (ret == 0 &&
776 			    !(i915_seqno_passed(ring->get_seqno(ring), seqno) ||
777 			    atomic_load_acq_int(&dev_priv->mm.wedged)))
778 				ret = -lksleep(ring, &ring->irq_lock, PCATCH,
779 				    "915thr", 0);
780 			ring->irq_put(ring);
781 			if (ret == 0 && atomic_load_acq_int(&dev_priv->mm.wedged))
782 				ret = -EIO;
783 		} else if (_intel_wait_for(dev,
784 		    i915_seqno_passed(ring->get_seqno(ring), seqno) ||
785 		    atomic_load_acq_int(&dev_priv->mm.wedged), 3000, 0, "915rtr")) {
786 			ret = -EBUSY;
787 		}
788 	}
789 	lockmgr(&ring->irq_lock, LK_RELEASE);
790 
791 	if (ret == 0)
792 		taskqueue_enqueue_timeout(dev_priv->tq,
793 		    &dev_priv->mm.retire_task, 0);
794 
795 	return ret;
796 }
797 
798 int
799 i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
800     struct drm_file *file_priv)
801 {
802 
803 	return (i915_gem_ring_throttle(dev, file_priv));
804 }
805 
806 int
807 i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
808     struct drm_file *file_priv)
809 {
810 	struct drm_i915_gem_madvise *args;
811 	struct drm_i915_gem_object *obj;
812 	int ret;
813 
814 	args = data;
815 	switch (args->madv) {
816 	case I915_MADV_DONTNEED:
817 	case I915_MADV_WILLNEED:
818 		break;
819 	default:
820 		return (-EINVAL);
821 	}
822 
823 	ret = i915_mutex_lock_interruptible(dev);
824 	if (ret != 0)
825 		return (ret);
826 
827 	obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
828 	if (&obj->base == NULL) {
829 		ret = -ENOENT;
830 		goto unlock;
831 	}
832 
833 	if (obj->pin_count != 0) {
834 		ret = -EINVAL;
835 		goto out;
836 	}
837 
838 	if (obj->madv != I915_MADV_PURGED_INTERNAL)
839 		obj->madv = args->madv;
840 	if (i915_gem_object_is_purgeable(obj) && obj->gtt_space == NULL)
841 		i915_gem_object_truncate(obj);
842 	args->retained = obj->madv != I915_MADV_PURGED_INTERNAL;
843 
844 out:
845 	drm_gem_object_unreference(&obj->base);
846 unlock:
847 	DRM_UNLOCK(dev);
848 	return (ret);
849 }
850 
851 void
852 i915_gem_cleanup_ringbuffer(struct drm_device *dev)
853 {
854 	drm_i915_private_t *dev_priv;
855 	int i;
856 
857 	dev_priv = dev->dev_private;
858 	for (i = 0; i < I915_NUM_RINGS; i++)
859 		intel_cleanup_ring_buffer(&dev_priv->rings[i]);
860 }
861 
862 int
863 i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
864     struct drm_file *file_priv)
865 {
866 	drm_i915_private_t *dev_priv;
867 	int ret, i;
868 
869 	if (drm_core_check_feature(dev, DRIVER_MODESET))
870 		return (0);
871 	dev_priv = dev->dev_private;
872 	if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) {
873 		DRM_ERROR("Reenabling wedged hardware, good luck\n");
874 		atomic_store_rel_int(&dev_priv->mm.wedged, 0);
875 	}
876 
877 	dev_priv->mm.suspended = 0;
878 
879 	ret = i915_gem_init_hw(dev);
880 	if (ret != 0) {
881 		return (ret);
882 	}
883 
884 	KASSERT(list_empty(&dev_priv->mm.active_list), ("active list"));
885 	KASSERT(list_empty(&dev_priv->mm.flushing_list), ("flushing list"));
886 	KASSERT(list_empty(&dev_priv->mm.inactive_list), ("inactive list"));
887 	for (i = 0; i < I915_NUM_RINGS; i++) {
888 		KASSERT(list_empty(&dev_priv->rings[i].active_list),
889 		    ("ring %d active list", i));
890 		KASSERT(list_empty(&dev_priv->rings[i].request_list),
891 		    ("ring %d request list", i));
892 	}
893 
894 	DRM_UNLOCK(dev);
895 	ret = drm_irq_install(dev);
896 	DRM_LOCK(dev);
897 	if (ret)
898 		goto cleanup_ringbuffer;
899 
900 	return (0);
901 
902 cleanup_ringbuffer:
903 	i915_gem_cleanup_ringbuffer(dev);
904 	dev_priv->mm.suspended = 1;
905 
906 	return (ret);
907 }
908 
909 int
910 i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
911     struct drm_file *file_priv)
912 {
913 
914 	if (drm_core_check_feature(dev, DRIVER_MODESET))
915 		return 0;
916 
917 	drm_irq_uninstall(dev);
918 	return (i915_gem_idle(dev));
919 }
920 
921 int
922 i915_gem_create(struct drm_file *file, struct drm_device *dev, uint64_t size,
923     uint32_t *handle_p)
924 {
925 	struct drm_i915_gem_object *obj;
926 	uint32_t handle;
927 	int ret;
928 
929 	size = roundup(size, PAGE_SIZE);
930 	if (size == 0)
931 		return (-EINVAL);
932 
933 	obj = i915_gem_alloc_object(dev, size);
934 	if (obj == NULL)
935 		return (-ENOMEM);
936 
937 	handle = 0;
938 	ret = drm_gem_handle_create(file, &obj->base, &handle);
939 	if (ret != 0) {
940 		drm_gem_object_release(&obj->base);
941 		i915_gem_info_remove_obj(dev->dev_private, obj->base.size);
942 		drm_free(obj, DRM_I915_GEM);
943 		return (-ret);
944 	}
945 
946 	/* drop reference from allocate - handle holds it now */
947 	drm_gem_object_unreference(&obj->base);
948 	*handle_p = handle;
949 	return (0);
950 }
951 
952 int
953 i915_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
954     struct drm_mode_create_dumb *args)
955 {
956 
957 	/* have to work out size/pitch and return them */
958 	args->pitch = roundup2(args->width * ((args->bpp + 7) / 8), 64);
959 	args->size = args->pitch * args->height;
960 	return (i915_gem_create(file, dev, args->size, &args->handle));
961 }
962 
963 int
964 i915_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev,
965     uint32_t handle)
966 {
967 
968 	return (drm_gem_handle_delete(file, handle));
969 }
970 
971 int
972 i915_gem_create_ioctl(struct drm_device *dev, void *data,
973     struct drm_file *file)
974 {
975 	struct drm_i915_gem_create *args = data;
976 
977 	return (i915_gem_create(file, dev, args->size, &args->handle));
978 }
979 
980 static inline void vm_page_reference(vm_page_t m)
981 {
982 	vm_page_flag_set(m, PG_REFERENCED);
983 }
984 
985 static int
986 i915_gem_swap_io(struct drm_device *dev, struct drm_i915_gem_object *obj,
987     uint64_t data_ptr, uint64_t size, uint64_t offset, enum uio_rw rw,
988     struct drm_file *file)
989 {
990 	vm_object_t vm_obj;
991 	vm_page_t m;
992 	struct sf_buf *sf;
993 	vm_offset_t mkva;
994 	vm_pindex_t obj_pi;
995 	int cnt, do_bit17_swizzling, length, obj_po, ret, swizzled_po;
996 
997 	if (obj->gtt_offset != 0 && rw == UIO_READ)
998 		do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
999 	else
1000 		do_bit17_swizzling = 0;
1001 
1002 	obj->dirty = 1;
1003 	vm_obj = obj->base.vm_obj;
1004 	ret = 0;
1005 
1006 	VM_OBJECT_LOCK(vm_obj);
1007 	vm_object_pip_add(vm_obj, 1);
1008 	while (size > 0) {
1009 		obj_pi = OFF_TO_IDX(offset);
1010 		obj_po = offset & PAGE_MASK;
1011 
1012 		m = i915_gem_wire_page(vm_obj, obj_pi);
1013 		VM_OBJECT_UNLOCK(vm_obj);
1014 
1015 		sf = sf_buf_alloc(m);
1016 		mkva = sf_buf_kva(sf);
1017 		length = min(size, PAGE_SIZE - obj_po);
1018 		while (length > 0) {
1019 			if (do_bit17_swizzling &&
1020 			    (VM_PAGE_TO_PHYS(m) & (1 << 17)) != 0) {
1021 				cnt = roundup2(obj_po + 1, 64);
1022 				cnt = min(cnt - obj_po, length);
1023 				swizzled_po = obj_po ^ 64;
1024 			} else {
1025 				cnt = length;
1026 				swizzled_po = obj_po;
1027 			}
1028 			if (rw == UIO_READ)
1029 				ret = -copyout_nofault(
1030 				    (char *)mkva + swizzled_po,
1031 				    (void *)(uintptr_t)data_ptr, cnt);
1032 			else
1033 				ret = -copyin_nofault(
1034 				    (void *)(uintptr_t)data_ptr,
1035 				    (char *)mkva + swizzled_po, cnt);
1036 			if (ret != 0)
1037 				break;
1038 			data_ptr += cnt;
1039 			size -= cnt;
1040 			length -= cnt;
1041 			offset += cnt;
1042 			obj_po += cnt;
1043 		}
1044 		sf_buf_free(sf);
1045 		VM_OBJECT_LOCK(vm_obj);
1046 		if (rw == UIO_WRITE)
1047 			vm_page_dirty(m);
1048 		vm_page_reference(m);
1049 		vm_page_busy_wait(m, FALSE, "i915gem");
1050 		vm_page_unwire(m, 1);
1051 		vm_page_wakeup(m);
1052 		atomic_add_long(&i915_gem_wired_pages_cnt, -1);
1053 
1054 		if (ret != 0)
1055 			break;
1056 	}
1057 	vm_object_pip_wakeup(vm_obj);
1058 	VM_OBJECT_UNLOCK(vm_obj);
1059 
1060 	return (ret);
1061 }
1062 
1063 static int
1064 i915_gem_gtt_write(struct drm_device *dev, struct drm_i915_gem_object *obj,
1065     uint64_t data_ptr, uint64_t size, uint64_t offset, struct drm_file *file)
1066 {
1067 	vm_offset_t mkva;
1068 	int ret;
1069 
1070 	/*
1071 	 * Pass the unaligned physical address and size to pmap_mapdev_attr()
1072 	 * so it can properly calculate whether an extra page needs to be
1073 	 * mapped or not to cover the requested range.  The function will
1074 	 * add the page offset into the returned mkva for us.
1075 	 */
1076 	mkva = (vm_offset_t)pmap_mapdev_attr(dev->agp->base + obj->gtt_offset +
1077 	    offset, size, PAT_WRITE_COMBINING);
1078 	ret = -copyin_nofault((void *)(uintptr_t)data_ptr, (char *)mkva, size);
1079 	pmap_unmapdev(mkva, size);
1080 	return (ret);
1081 }
1082 
1083 static int
1084 i915_gem_obj_io(struct drm_device *dev, uint32_t handle, uint64_t data_ptr,
1085     uint64_t size, uint64_t offset, enum uio_rw rw, struct drm_file *file)
1086 {
1087 	struct drm_i915_gem_object *obj;
1088 	vm_page_t *ma;
1089 	vm_offset_t start, end;
1090 	int npages, ret;
1091 
1092 	if (size == 0)
1093 		return (0);
1094 	start = trunc_page(data_ptr);
1095 	end = round_page(data_ptr + size);
1096 	npages = howmany(end - start, PAGE_SIZE);
1097 	ma = kmalloc(npages * sizeof(vm_page_t), DRM_I915_GEM, M_WAITOK |
1098 	    M_ZERO);
1099 	npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map,
1100 	    (vm_offset_t)data_ptr, size,
1101 	    (rw == UIO_READ ? VM_PROT_WRITE : 0 ) | VM_PROT_READ, ma, npages);
1102 	if (npages == -1) {
1103 		ret = -EFAULT;
1104 		goto free_ma;
1105 	}
1106 
1107 	ret = i915_mutex_lock_interruptible(dev);
1108 	if (ret != 0)
1109 		goto unlocked;
1110 
1111 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1112 	if (&obj->base == NULL) {
1113 		ret = -ENOENT;
1114 		goto unlock;
1115 	}
1116 	if (offset > obj->base.size || size > obj->base.size - offset) {
1117 		ret = -EINVAL;
1118 		goto out;
1119 	}
1120 
1121 	if (rw == UIO_READ) {
1122 		ret = i915_gem_object_set_cpu_read_domain_range(obj,
1123 		    offset, size);
1124 		if (ret != 0)
1125 			goto out;
1126 		ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset,
1127 		    UIO_READ, file);
1128 	} else {
1129 		if (obj->phys_obj) {
1130 			ret = i915_gem_phys_pwrite(dev, obj, data_ptr, offset,
1131 			    size, file);
1132 		} else if (obj->gtt_space &&
1133 		    obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
1134 			ret = i915_gem_object_pin(obj, 0, true);
1135 			if (ret != 0)
1136 				goto out;
1137 			ret = i915_gem_object_set_to_gtt_domain(obj, true);
1138 			if (ret != 0)
1139 				goto out_unpin;
1140 			ret = i915_gem_object_put_fence(obj);
1141 			if (ret != 0)
1142 				goto out_unpin;
1143 			ret = i915_gem_gtt_write(dev, obj, data_ptr, size,
1144 			    offset, file);
1145 out_unpin:
1146 			i915_gem_object_unpin(obj);
1147 		} else {
1148 			ret = i915_gem_object_set_to_cpu_domain(obj, true);
1149 			if (ret != 0)
1150 				goto out;
1151 			ret = i915_gem_swap_io(dev, obj, data_ptr, size, offset,
1152 			    UIO_WRITE, file);
1153 		}
1154 	}
1155 out:
1156 	drm_gem_object_unreference(&obj->base);
1157 unlock:
1158 	DRM_UNLOCK(dev);
1159 unlocked:
1160 	vm_page_unhold_pages(ma, npages);
1161 free_ma:
1162 	drm_free(ma, DRM_I915_GEM);
1163 	return (ret);
1164 }
1165 
1166 int
1167 i915_gem_pread_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
1168 {
1169 	struct drm_i915_gem_pread *args;
1170 
1171 	args = data;
1172 	return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size,
1173 	    args->offset, UIO_READ, file));
1174 }
1175 
1176 int
1177 i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
1178 {
1179 	struct drm_i915_gem_pwrite *args;
1180 
1181 	args = data;
1182 	return (i915_gem_obj_io(dev, args->handle, args->data_ptr, args->size,
1183 	    args->offset, UIO_WRITE, file));
1184 }
1185 
1186 int
1187 i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1188     struct drm_file *file)
1189 {
1190 	struct drm_i915_gem_set_domain *args;
1191 	struct drm_i915_gem_object *obj;
1192 	uint32_t read_domains;
1193 	uint32_t write_domain;
1194 	int ret;
1195 
1196 	if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1197 		return (-ENODEV);
1198 
1199 	args = data;
1200 	read_domains = args->read_domains;
1201 	write_domain = args->write_domain;
1202 
1203 	if ((write_domain & I915_GEM_GPU_DOMAINS) != 0 ||
1204 	    (read_domains & I915_GEM_GPU_DOMAINS) != 0 ||
1205 	    (write_domain != 0 && read_domains != write_domain))
1206 		return (-EINVAL);
1207 
1208 	ret = i915_mutex_lock_interruptible(dev);
1209 	if (ret != 0)
1210 		return (ret);
1211 
1212 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1213 	if (&obj->base == NULL) {
1214 		ret = -ENOENT;
1215 		goto unlock;
1216 	}
1217 
1218 	if ((read_domains & I915_GEM_DOMAIN_GTT) != 0) {
1219 		ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
1220 		if (ret == -EINVAL)
1221 			ret = 0;
1222 	} else
1223 		ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
1224 
1225 	drm_gem_object_unreference(&obj->base);
1226 unlock:
1227 	DRM_UNLOCK(dev);
1228 	return (ret);
1229 }
1230 
1231 int
1232 i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
1233     struct drm_file *file)
1234 {
1235 	struct drm_i915_gem_sw_finish *args;
1236 	struct drm_i915_gem_object *obj;
1237 	int ret;
1238 
1239 	args = data;
1240 	ret = 0;
1241 	if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1242 		return (ENODEV);
1243 	ret = i915_mutex_lock_interruptible(dev);
1244 	if (ret != 0)
1245 		return (ret);
1246 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1247 	if (&obj->base == NULL) {
1248 		ret = -ENOENT;
1249 		goto unlock;
1250 	}
1251 	if (obj->pin_count != 0)
1252 		i915_gem_object_flush_cpu_write_domain(obj);
1253 	drm_gem_object_unreference(&obj->base);
1254 unlock:
1255 	DRM_UNLOCK(dev);
1256 	return (ret);
1257 }
1258 
1259 int
1260 i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
1261     struct drm_file *file)
1262 {
1263 	struct drm_i915_gem_mmap *args;
1264 	struct drm_gem_object *obj;
1265 	struct proc *p;
1266 	vm_map_t map;
1267 	vm_offset_t addr;
1268 	vm_size_t size;
1269 	int error, rv;
1270 
1271 	args = data;
1272 
1273 	if ((dev->driver->driver_features & DRIVER_GEM) == 0)
1274 		return (-ENODEV);
1275 
1276 	obj = drm_gem_object_lookup(dev, file, args->handle);
1277 	if (obj == NULL)
1278 		return (-ENOENT);
1279 	error = 0;
1280 	if (args->size == 0)
1281 		goto out;
1282 	p = curproc;
1283 	map = &p->p_vmspace->vm_map;
1284 	size = round_page(args->size);
1285 	PROC_LOCK(p);
1286 	if (map->size + size > p->p_rlimit[RLIMIT_VMEM].rlim_cur) {
1287 		PROC_UNLOCK(p);
1288 		error = ENOMEM;
1289 		goto out;
1290 	}
1291 	PROC_UNLOCK(p);
1292 
1293 	addr = 0;
1294 	vm_object_hold(obj->vm_obj);
1295 	vm_object_reference_locked(obj->vm_obj);
1296 	vm_object_drop(obj->vm_obj);
1297 	DRM_UNLOCK(dev);
1298 	rv = vm_map_find(map, obj->vm_obj, args->offset, &addr, args->size,
1299 	    PAGE_SIZE, /* align */
1300 	    TRUE, /* fitit */
1301 	    VM_MAPTYPE_NORMAL, /* maptype */
1302 	    VM_PROT_READ | VM_PROT_WRITE, /* prot */
1303 	    VM_PROT_READ | VM_PROT_WRITE, /* max */
1304 	    MAP_SHARED /* cow */);
1305 	if (rv != KERN_SUCCESS) {
1306 		vm_object_deallocate(obj->vm_obj);
1307 		error = -vm_mmap_to_errno(rv);
1308 	} else {
1309 		args->addr_ptr = (uint64_t)addr;
1310 	}
1311 	DRM_LOCK(dev);
1312 out:
1313 	drm_gem_object_unreference(obj);
1314 	return (error);
1315 }
1316 
1317 static int
1318 i915_gem_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,
1319     vm_ooffset_t foff, struct ucred *cred, u_short *color)
1320 {
1321 
1322 	*color = 0; /* XXXKIB */
1323 	return (0);
1324 }
1325 
1326 int i915_intr_pf;
1327 
1328 static int
1329 i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot,
1330     vm_page_t *mres)
1331 {
1332 	struct drm_gem_object *gem_obj;
1333 	struct drm_i915_gem_object *obj;
1334 	struct drm_device *dev;
1335 	drm_i915_private_t *dev_priv;
1336 	vm_page_t m, oldm;
1337 	int cause, ret;
1338 	bool write;
1339 
1340 	gem_obj = vm_obj->handle;
1341 	obj = to_intel_bo(gem_obj);
1342 	dev = obj->base.dev;
1343 	dev_priv = dev->dev_private;
1344 #if 0
1345 	write = (prot & VM_PROT_WRITE) != 0;
1346 #else
1347 	write = true;
1348 #endif
1349 	vm_object_pip_add(vm_obj, 1);
1350 
1351 	/*
1352 	 * Remove the placeholder page inserted by vm_fault() from the
1353 	 * object before dropping the object lock. If
1354 	 * i915_gem_release_mmap() is active in parallel on this gem
1355 	 * object, then it owns the drm device sx and might find the
1356 	 * placeholder already. Then, since the page is busy,
1357 	 * i915_gem_release_mmap() sleeps waiting for the busy state
1358 	 * of the page cleared. We will be not able to acquire drm
1359 	 * device lock until i915_gem_release_mmap() is able to make a
1360 	 * progress.
1361 	 */
1362 	if (*mres != NULL) {
1363 		oldm = *mres;
1364 		vm_page_remove(oldm);
1365 		*mres = NULL;
1366 	} else
1367 		oldm = NULL;
1368 retry:
1369 	VM_OBJECT_UNLOCK(vm_obj);
1370 unlocked_vmobj:
1371 	cause = ret = 0;
1372 	m = NULL;
1373 
1374 	if (i915_intr_pf) {
1375 		ret = i915_mutex_lock_interruptible(dev);
1376 		if (ret != 0) {
1377 			cause = 10;
1378 			goto out;
1379 		}
1380 	} else
1381 		DRM_LOCK(dev);
1382 
1383 	/*
1384 	 * Since the object lock was dropped, other thread might have
1385 	 * faulted on the same GTT address and instantiated the
1386 	 * mapping for the page.  Recheck.
1387 	 */
1388 	VM_OBJECT_LOCK(vm_obj);
1389 	m = vm_page_lookup(vm_obj, OFF_TO_IDX(offset));
1390 	if (m != NULL) {
1391 		if ((m->flags & PG_BUSY) != 0) {
1392 			DRM_UNLOCK(dev);
1393 #if 0 /* XXX */
1394 			vm_page_sleep(m, "915pee");
1395 #endif
1396 			goto retry;
1397 		}
1398 		goto have_page;
1399 	} else
1400 		VM_OBJECT_UNLOCK(vm_obj);
1401 
1402 	/* Now bind it into the GTT if needed */
1403 	if (!obj->map_and_fenceable) {
1404 		ret = i915_gem_object_unbind(obj);
1405 		if (ret != 0) {
1406 			cause = 20;
1407 			goto unlock;
1408 		}
1409 	}
1410 	if (!obj->gtt_space) {
1411 		ret = i915_gem_object_bind_to_gtt(obj, 0, true);
1412 		if (ret != 0) {
1413 			cause = 30;
1414 			goto unlock;
1415 		}
1416 
1417 		ret = i915_gem_object_set_to_gtt_domain(obj, write);
1418 		if (ret != 0) {
1419 			cause = 40;
1420 			goto unlock;
1421 		}
1422 	}
1423 
1424 	if (obj->tiling_mode == I915_TILING_NONE)
1425 		ret = i915_gem_object_put_fence(obj);
1426 	else
1427 		ret = i915_gem_object_get_fence(obj, NULL);
1428 	if (ret != 0) {
1429 		cause = 50;
1430 		goto unlock;
1431 	}
1432 
1433 	if (i915_gem_object_is_inactive(obj))
1434 		list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1435 
1436 	obj->fault_mappable = true;
1437 	VM_OBJECT_LOCK(vm_obj);
1438 	m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset +
1439 	    offset);
1440 	if (m == NULL) {
1441 		cause = 60;
1442 		ret = -EFAULT;
1443 		goto unlock;
1444 	}
1445 	KASSERT((m->flags & PG_FICTITIOUS) != 0,
1446 	    ("not fictitious %p", m));
1447 	KASSERT(m->wire_count == 1, ("wire_count not 1 %p", m));
1448 
1449 	if ((m->flags & PG_BUSY) != 0) {
1450 		DRM_UNLOCK(dev);
1451 #if 0 /* XXX */
1452 		vm_page_sleep(m, "915pbs");
1453 #endif
1454 		goto retry;
1455 	}
1456 	m->valid = VM_PAGE_BITS_ALL;
1457 	vm_page_insert(m, vm_obj, OFF_TO_IDX(offset));
1458 have_page:
1459 	*mres = m;
1460 	vm_page_busy_try(m, false);
1461 
1462 	DRM_UNLOCK(dev);
1463 	if (oldm != NULL) {
1464 		vm_page_free(oldm);
1465 	}
1466 	vm_object_pip_wakeup(vm_obj);
1467 	return (VM_PAGER_OK);
1468 
1469 unlock:
1470 	DRM_UNLOCK(dev);
1471 out:
1472 	KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return"));
1473 	if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) {
1474 		goto unlocked_vmobj;
1475 	}
1476 	VM_OBJECT_LOCK(vm_obj);
1477 	vm_object_pip_wakeup(vm_obj);
1478 	return (VM_PAGER_ERROR);
1479 }
1480 
1481 static void
1482 i915_gem_pager_dtor(void *handle)
1483 {
1484 	struct drm_gem_object *obj;
1485 	struct drm_device *dev;
1486 
1487 	obj = handle;
1488 	dev = obj->dev;
1489 
1490 	DRM_LOCK(dev);
1491 	drm_gem_free_mmap_offset(obj);
1492 	i915_gem_release_mmap(to_intel_bo(obj));
1493 	drm_gem_object_unreference(obj);
1494 	DRM_UNLOCK(dev);
1495 }
1496 
1497 struct cdev_pager_ops i915_gem_pager_ops = {
1498 	.cdev_pg_fault	= i915_gem_pager_fault,
1499 	.cdev_pg_ctor	= i915_gem_pager_ctor,
1500 	.cdev_pg_dtor	= i915_gem_pager_dtor
1501 };
1502 
1503 int
1504 i915_gem_mmap_gtt(struct drm_file *file, struct drm_device *dev,
1505     uint32_t handle, uint64_t *offset)
1506 {
1507 	struct drm_i915_private *dev_priv;
1508 	struct drm_i915_gem_object *obj;
1509 	int ret;
1510 
1511 	if (!(dev->driver->driver_features & DRIVER_GEM))
1512 		return (-ENODEV);
1513 
1514 	dev_priv = dev->dev_private;
1515 
1516 	ret = i915_mutex_lock_interruptible(dev);
1517 	if (ret != 0)
1518 		return (ret);
1519 
1520 	obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1521 	if (&obj->base == NULL) {
1522 		ret = -ENOENT;
1523 		goto unlock;
1524 	}
1525 
1526 	if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
1527 		ret = -E2BIG;
1528 		goto out;
1529 	}
1530 
1531 	if (obj->madv != I915_MADV_WILLNEED) {
1532 		DRM_ERROR("Attempting to mmap a purgeable buffer\n");
1533 		ret = -EINVAL;
1534 		goto out;
1535 	}
1536 
1537 	ret = drm_gem_create_mmap_offset(&obj->base);
1538 	if (ret != 0)
1539 		goto out;
1540 
1541 	*offset = DRM_GEM_MAPPING_OFF(obj->base.map_list.key) |
1542 	    DRM_GEM_MAPPING_KEY;
1543 out:
1544 	drm_gem_object_unreference(&obj->base);
1545 unlock:
1546 	DRM_UNLOCK(dev);
1547 	return (ret);
1548 }
1549 
1550 int
1551 i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1552     struct drm_file *file)
1553 {
1554 	struct drm_i915_private *dev_priv;
1555 	struct drm_i915_gem_mmap_gtt *args;
1556 
1557 	dev_priv = dev->dev_private;
1558 	args = data;
1559 
1560 	return (i915_gem_mmap_gtt(file, dev, args->handle, &args->offset));
1561 }
1562 
1563 struct drm_i915_gem_object *
1564 i915_gem_alloc_object(struct drm_device *dev, size_t size)
1565 {
1566 	struct drm_i915_private *dev_priv;
1567 	struct drm_i915_gem_object *obj;
1568 
1569 	dev_priv = dev->dev_private;
1570 
1571 	obj = kmalloc(sizeof(*obj), DRM_I915_GEM, M_WAITOK | M_ZERO);
1572 
1573 	if (drm_gem_object_init(dev, &obj->base, size) != 0) {
1574 		drm_free(obj, DRM_I915_GEM);
1575 		return (NULL);
1576 	}
1577 
1578 	obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1579 	obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1580 
1581 	if (HAS_LLC(dev))
1582 		obj->cache_level = I915_CACHE_LLC;
1583 	else
1584 		obj->cache_level = I915_CACHE_NONE;
1585 	obj->base.driver_private = NULL;
1586 	obj->fence_reg = I915_FENCE_REG_NONE;
1587 	INIT_LIST_HEAD(&obj->mm_list);
1588 	INIT_LIST_HEAD(&obj->gtt_list);
1589 	INIT_LIST_HEAD(&obj->ring_list);
1590 	INIT_LIST_HEAD(&obj->exec_list);
1591 	INIT_LIST_HEAD(&obj->gpu_write_list);
1592 	obj->madv = I915_MADV_WILLNEED;
1593 	/* Avoid an unnecessary call to unbind on the first bind. */
1594 	obj->map_and_fenceable = true;
1595 
1596 	i915_gem_info_add_obj(dev_priv, size);
1597 
1598 	return (obj);
1599 }
1600 
1601 void
1602 i915_gem_clflush_object(struct drm_i915_gem_object *obj)
1603 {
1604 
1605 	/* If we don't have a page list set up, then we're not pinned
1606 	 * to GPU, and we can ignore the cache flush because it'll happen
1607 	 * again at bind time.
1608 	 */
1609 	if (obj->pages == NULL)
1610 		return;
1611 
1612 	/* If the GPU is snooping the contents of the CPU cache,
1613 	 * we do not need to manually clear the CPU cache lines.  However,
1614 	 * the caches are only snooped when the render cache is
1615 	 * flushed/invalidated.  As we always have to emit invalidations
1616 	 * and flushes when moving into and out of the RENDER domain, correct
1617 	 * snooping behaviour occurs naturally as the result of our domain
1618 	 * tracking.
1619 	 */
1620 	if (obj->cache_level != I915_CACHE_NONE)
1621 		return;
1622 
1623 	drm_clflush_pages(obj->pages, obj->base.size / PAGE_SIZE);
1624 }
1625 
1626 static void
1627 i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
1628 {
1629 	uint32_t old_write_domain;
1630 
1631 	if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
1632 		return;
1633 
1634 	i915_gem_clflush_object(obj);
1635 	intel_gtt_chipset_flush();
1636 	old_write_domain = obj->base.write_domain;
1637 	obj->base.write_domain = 0;
1638 }
1639 
1640 static int
1641 i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj)
1642 {
1643 
1644 	if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0)
1645 		return (0);
1646 	return (i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain));
1647 }
1648 
1649 static void
1650 i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
1651 {
1652 	uint32_t old_write_domain;
1653 
1654 	if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
1655 		return;
1656 
1657 	cpu_sfence();
1658 
1659 	old_write_domain = obj->base.write_domain;
1660 	obj->base.write_domain = 0;
1661 }
1662 
1663 int
1664 i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
1665 {
1666 	uint32_t old_write_domain, old_read_domains;
1667 	int ret;
1668 
1669 	if (obj->gtt_space == NULL)
1670 		return (-EINVAL);
1671 
1672 	if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
1673 		return 0;
1674 
1675 	ret = i915_gem_object_flush_gpu_write_domain(obj);
1676 	if (ret != 0)
1677 		return (ret);
1678 
1679 	if (obj->pending_gpu_write || write) {
1680 		ret = i915_gem_object_wait_rendering(obj);
1681 		if (ret != 0)
1682 			return (ret);
1683 	}
1684 
1685 	i915_gem_object_flush_cpu_write_domain(obj);
1686 
1687 	old_write_domain = obj->base.write_domain;
1688 	old_read_domains = obj->base.read_domains;
1689 
1690 	KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0,
1691 	    ("In GTT write domain"));
1692 	obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
1693 	if (write) {
1694 		obj->base.read_domains = I915_GEM_DOMAIN_GTT;
1695 		obj->base.write_domain = I915_GEM_DOMAIN_GTT;
1696 		obj->dirty = 1;
1697 	}
1698 
1699 	return (0);
1700 }
1701 
1702 int
1703 i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
1704     enum i915_cache_level cache_level)
1705 {
1706 	struct drm_device *dev;
1707 	drm_i915_private_t *dev_priv;
1708 	int ret;
1709 
1710 	if (obj->cache_level == cache_level)
1711 		return 0;
1712 
1713 	if (obj->pin_count) {
1714 		DRM_DEBUG("can not change the cache level of pinned objects\n");
1715 		return (-EBUSY);
1716 	}
1717 
1718 	dev = obj->base.dev;
1719 	dev_priv = dev->dev_private;
1720 	if (obj->gtt_space) {
1721 		ret = i915_gem_object_finish_gpu(obj);
1722 		if (ret != 0)
1723 			return (ret);
1724 
1725 		i915_gem_object_finish_gtt(obj);
1726 
1727 		/* Before SandyBridge, you could not use tiling or fence
1728 		 * registers with snooped memory, so relinquish any fences
1729 		 * currently pointing to our region in the aperture.
1730 		 */
1731 		if (INTEL_INFO(obj->base.dev)->gen < 6) {
1732 			ret = i915_gem_object_put_fence(obj);
1733 			if (ret != 0)
1734 				return (ret);
1735 		}
1736 
1737 		i915_gem_gtt_rebind_object(obj, cache_level);
1738 		if (obj->has_aliasing_ppgtt_mapping)
1739 			i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
1740 			    obj, cache_level);
1741 	}
1742 
1743 	if (cache_level == I915_CACHE_NONE) {
1744 		u32 old_read_domains, old_write_domain;
1745 
1746 		/* If we're coming from LLC cached, then we haven't
1747 		 * actually been tracking whether the data is in the
1748 		 * CPU cache or not, since we only allow one bit set
1749 		 * in obj->write_domain and have been skipping the clflushes.
1750 		 * Just set it to the CPU cache for now.
1751 		 */
1752 		KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1753 		    ("obj %p in CPU write domain", obj));
1754 		KASSERT((obj->base.read_domains & ~I915_GEM_DOMAIN_CPU) == 0,
1755 		    ("obj %p in CPU read domain", obj));
1756 
1757 		old_read_domains = obj->base.read_domains;
1758 		old_write_domain = obj->base.write_domain;
1759 
1760 		obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1761 		obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1762 
1763 	}
1764 
1765 	obj->cache_level = cache_level;
1766 	return (0);
1767 }
1768 
1769 int
1770 i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
1771     u32 alignment, struct intel_ring_buffer *pipelined)
1772 {
1773 	u32 old_read_domains, old_write_domain;
1774 	int ret;
1775 
1776 	ret = i915_gem_object_flush_gpu_write_domain(obj);
1777 	if (ret != 0)
1778 		return (ret);
1779 
1780 	if (pipelined != obj->ring) {
1781 		ret = i915_gem_object_wait_rendering(obj);
1782 		if (ret == -ERESTART || ret == -EINTR)
1783 			return (ret);
1784 	}
1785 
1786 	ret = i915_gem_object_set_cache_level(obj, I915_CACHE_NONE);
1787 	if (ret != 0)
1788 		return (ret);
1789 
1790 	ret = i915_gem_object_pin(obj, alignment, true);
1791 	if (ret != 0)
1792 		return (ret);
1793 
1794 	i915_gem_object_flush_cpu_write_domain(obj);
1795 
1796 	old_write_domain = obj->base.write_domain;
1797 	old_read_domains = obj->base.read_domains;
1798 
1799 	KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) == 0,
1800 	    ("obj %p in GTT write domain", obj));
1801 	obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
1802 
1803 	return (0);
1804 }
1805 
1806 int
1807 i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
1808 {
1809 	int ret;
1810 
1811 	if ((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0)
1812 		return (0);
1813 
1814 	if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
1815 		ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
1816 		if (ret != 0)
1817 			return (ret);
1818 	}
1819 
1820 	ret = i915_gem_object_wait_rendering(obj);
1821 	if (ret != 0)
1822 		return (ret);
1823 
1824 	obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
1825 
1826 	return (0);
1827 }
1828 
1829 static int
1830 i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
1831 {
1832 	uint32_t old_write_domain, old_read_domains;
1833 	int ret;
1834 
1835 	if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
1836 		return 0;
1837 
1838 	ret = i915_gem_object_flush_gpu_write_domain(obj);
1839 	if (ret != 0)
1840 		return (ret);
1841 
1842 	ret = i915_gem_object_wait_rendering(obj);
1843 	if (ret != 0)
1844 		return (ret);
1845 
1846 	i915_gem_object_flush_gtt_write_domain(obj);
1847 	i915_gem_object_set_to_full_cpu_read_domain(obj);
1848 
1849 	old_write_domain = obj->base.write_domain;
1850 	old_read_domains = obj->base.read_domains;
1851 
1852 	if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
1853 		i915_gem_clflush_object(obj);
1854 		obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
1855 	}
1856 
1857 	KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1858 	    ("In cpu write domain"));
1859 
1860 	if (write) {
1861 		obj->base.read_domains = I915_GEM_DOMAIN_CPU;
1862 		obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1863 	}
1864 
1865 	return (0);
1866 }
1867 
1868 static void
1869 i915_gem_object_set_to_full_cpu_read_domain(struct drm_i915_gem_object *obj)
1870 {
1871 	int i;
1872 
1873 	if (obj->page_cpu_valid == NULL)
1874 		return;
1875 
1876 	if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0) {
1877 		for (i = 0; i <= (obj->base.size - 1) / PAGE_SIZE; i++) {
1878 			if (obj->page_cpu_valid[i] != 0)
1879 				continue;
1880 			drm_clflush_pages(obj->pages + i, 1);
1881 		}
1882 	}
1883 
1884 	drm_free(obj->page_cpu_valid, DRM_I915_GEM);
1885 	obj->page_cpu_valid = NULL;
1886 }
1887 
1888 static int
1889 i915_gem_object_set_cpu_read_domain_range(struct drm_i915_gem_object *obj,
1890     uint64_t offset, uint64_t size)
1891 {
1892 	uint32_t old_read_domains;
1893 	int i, ret;
1894 
1895 	if (offset == 0 && size == obj->base.size)
1896 		return (i915_gem_object_set_to_cpu_domain(obj, 0));
1897 
1898 	ret = i915_gem_object_flush_gpu_write_domain(obj);
1899 	if (ret != 0)
1900 		return (ret);
1901 	ret = i915_gem_object_wait_rendering(obj);
1902 	if (ret != 0)
1903 		return (ret);
1904 
1905 	i915_gem_object_flush_gtt_write_domain(obj);
1906 
1907 	if (obj->page_cpu_valid == NULL &&
1908 	    (obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0)
1909 		return (0);
1910 
1911 	if (obj->page_cpu_valid == NULL) {
1912 		obj->page_cpu_valid = kmalloc(obj->base.size / PAGE_SIZE,
1913 		    DRM_I915_GEM, M_WAITOK | M_ZERO);
1914 	} else if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0)
1915 		memset(obj->page_cpu_valid, 0, obj->base.size / PAGE_SIZE);
1916 
1917 	for (i = offset / PAGE_SIZE; i <= (offset + size - 1) / PAGE_SIZE;
1918 	     i++) {
1919 		if (obj->page_cpu_valid[i])
1920 			continue;
1921 		drm_clflush_pages(obj->pages + i, 1);
1922 		obj->page_cpu_valid[i] = 1;
1923 	}
1924 
1925 	KASSERT((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) == 0,
1926 	    ("In gpu write domain"));
1927 
1928 	old_read_domains = obj->base.read_domains;
1929 	obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
1930 
1931 	return (0);
1932 }
1933 
1934 static uint32_t
1935 i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
1936 {
1937 	uint32_t gtt_size;
1938 
1939 	if (INTEL_INFO(dev)->gen >= 4 ||
1940 	    tiling_mode == I915_TILING_NONE)
1941 		return (size);
1942 
1943 	/* Previous chips need a power-of-two fence region when tiling */
1944 	if (INTEL_INFO(dev)->gen == 3)
1945 		gtt_size = 1024*1024;
1946 	else
1947 		gtt_size = 512*1024;
1948 
1949 	while (gtt_size < size)
1950 		gtt_size <<= 1;
1951 
1952 	return (gtt_size);
1953 }
1954 
1955 /**
1956  * i915_gem_get_gtt_alignment - return required GTT alignment for an object
1957  * @obj: object to check
1958  *
1959  * Return the required GTT alignment for an object, taking into account
1960  * potential fence register mapping.
1961  */
1962 static uint32_t
1963 i915_gem_get_gtt_alignment(struct drm_device *dev, uint32_t size,
1964      int tiling_mode)
1965 {
1966 
1967 	/*
1968 	 * Minimum alignment is 4k (GTT page size), but might be greater
1969 	 * if a fence register is needed for the object.
1970 	 */
1971 	if (INTEL_INFO(dev)->gen >= 4 ||
1972 	    tiling_mode == I915_TILING_NONE)
1973 		return (4096);
1974 
1975 	/*
1976 	 * Previous chips need to be aligned to the size of the smallest
1977 	 * fence register that can contain the object.
1978 	 */
1979 	return (i915_gem_get_gtt_size(dev, size, tiling_mode));
1980 }
1981 
1982 uint32_t
1983 i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, uint32_t size,
1984     int tiling_mode)
1985 {
1986 
1987 	if (tiling_mode == I915_TILING_NONE)
1988 		return (4096);
1989 
1990 	/*
1991 	 * Minimum alignment is 4k (GTT page size) for sane hw.
1992 	 */
1993 	if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev))
1994 		return (4096);
1995 
1996 	/*
1997 	 * Previous hardware however needs to be aligned to a power-of-two
1998 	 * tile height. The simplest method for determining this is to reuse
1999 	 * the power-of-tile object size.
2000          */
2001 	return (i915_gem_get_gtt_size(dev, size, tiling_mode));
2002 }
2003 
2004 static int
2005 i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2006     unsigned alignment, bool map_and_fenceable)
2007 {
2008 	struct drm_device *dev;
2009 	struct drm_i915_private *dev_priv;
2010 	struct drm_mm_node *free_space;
2011 	uint32_t size, fence_size, fence_alignment, unfenced_alignment;
2012 	bool mappable, fenceable;
2013 	int ret;
2014 
2015 	dev = obj->base.dev;
2016 	dev_priv = dev->dev_private;
2017 
2018 	if (obj->madv != I915_MADV_WILLNEED) {
2019 		DRM_ERROR("Attempting to bind a purgeable object\n");
2020 		return (-EINVAL);
2021 	}
2022 
2023 	fence_size = i915_gem_get_gtt_size(dev, obj->base.size,
2024 	    obj->tiling_mode);
2025 	fence_alignment = i915_gem_get_gtt_alignment(dev, obj->base.size,
2026 	    obj->tiling_mode);
2027 	unfenced_alignment = i915_gem_get_unfenced_gtt_alignment(dev,
2028 	    obj->base.size, obj->tiling_mode);
2029 	if (alignment == 0)
2030 		alignment = map_and_fenceable ? fence_alignment :
2031 		    unfenced_alignment;
2032 	if (map_and_fenceable && (alignment & (fence_alignment - 1)) != 0) {
2033 		DRM_ERROR("Invalid object alignment requested %u\n", alignment);
2034 		return (-EINVAL);
2035 	}
2036 
2037 	size = map_and_fenceable ? fence_size : obj->base.size;
2038 
2039 	/* If the object is bigger than the entire aperture, reject it early
2040 	 * before evicting everything in a vain attempt to find space.
2041 	 */
2042 	if (obj->base.size > (map_and_fenceable ?
2043 	    dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
2044 		DRM_ERROR(
2045 "Attempting to bind an object larger than the aperture\n");
2046 		return (-E2BIG);
2047 	}
2048 
2049  search_free:
2050 	if (map_and_fenceable)
2051 		free_space = drm_mm_search_free_in_range(
2052 		    &dev_priv->mm.gtt_space, size, alignment, 0,
2053 		    dev_priv->mm.gtt_mappable_end, 0);
2054 	else
2055 		free_space = drm_mm_search_free(&dev_priv->mm.gtt_space,
2056 		    size, alignment, 0);
2057 	if (free_space != NULL) {
2058 		if (map_and_fenceable)
2059 			obj->gtt_space = drm_mm_get_block_range_generic(
2060 			    free_space, size, alignment, 0,
2061 			    dev_priv->mm.gtt_mappable_end, 1);
2062 		else
2063 			obj->gtt_space = drm_mm_get_block_generic(free_space,
2064 			    size, alignment, 1);
2065 	}
2066 	if (obj->gtt_space == NULL) {
2067 		ret = i915_gem_evict_something(dev, size, alignment,
2068 		    map_and_fenceable);
2069 		if (ret != 0)
2070 			return (ret);
2071 		goto search_free;
2072 	}
2073 	ret = i915_gem_object_get_pages_gtt(obj, 0);
2074 	if (ret != 0) {
2075 		drm_mm_put_block(obj->gtt_space);
2076 		obj->gtt_space = NULL;
2077 		/*
2078 		 * i915_gem_object_get_pages_gtt() cannot return
2079 		 * ENOMEM, since we use vm_page_grab(VM_ALLOC_RETRY)
2080 		 * (which does not support operation without a flag
2081 		 * anyway).
2082 		 */
2083 		return (ret);
2084 	}
2085 
2086 	ret = i915_gem_gtt_bind_object(obj);
2087 	if (ret != 0) {
2088 		i915_gem_object_put_pages_gtt(obj);
2089 		drm_mm_put_block(obj->gtt_space);
2090 		obj->gtt_space = NULL;
2091 		if (i915_gem_evict_everything(dev, false))
2092 			return (ret);
2093 		goto search_free;
2094 	}
2095 
2096 	list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list);
2097 	list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2098 
2099 	KASSERT((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0,
2100 	    ("Object in gpu read domain"));
2101 	KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0,
2102 	    ("Object in gpu write domain"));
2103 
2104 	obj->gtt_offset = obj->gtt_space->start;
2105 
2106 	fenceable =
2107 		obj->gtt_space->size == fence_size &&
2108 		(obj->gtt_space->start & (fence_alignment - 1)) == 0;
2109 
2110 	mappable =
2111 		obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
2112 	obj->map_and_fenceable = mappable && fenceable;
2113 
2114 	return (0);
2115 }
2116 
2117 static void
2118 i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
2119 {
2120 	u32 old_write_domain, old_read_domains;
2121 
2122 	/* Act a barrier for all accesses through the GTT */
2123 	cpu_mfence();
2124 
2125 	/* Force a pagefault for domain tracking on next user access */
2126 	i915_gem_release_mmap(obj);
2127 
2128 	if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
2129 		return;
2130 
2131 	old_read_domains = obj->base.read_domains;
2132 	old_write_domain = obj->base.write_domain;
2133 
2134 	obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT;
2135 	obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT;
2136 
2137 }
2138 
2139 int
2140 i915_gem_object_unbind(struct drm_i915_gem_object *obj)
2141 {
2142 	drm_i915_private_t *dev_priv;
2143 	int ret;
2144 
2145 	dev_priv = obj->base.dev->dev_private;
2146 	ret = 0;
2147 	if (obj->gtt_space == NULL)
2148 		return (0);
2149 	if (obj->pin_count != 0) {
2150 		DRM_ERROR("Attempting to unbind pinned buffer\n");
2151 		return (-EINVAL);
2152 	}
2153 
2154 	ret = i915_gem_object_finish_gpu(obj);
2155 	if (ret == -ERESTART || ret == -EINTR)
2156 		return (ret);
2157 
2158 	i915_gem_object_finish_gtt(obj);
2159 
2160 	if (ret == 0)
2161 		ret = i915_gem_object_set_to_cpu_domain(obj, 1);
2162 	if (ret == -ERESTART || ret == -EINTR)
2163 		return (ret);
2164 	if (ret != 0) {
2165 		i915_gem_clflush_object(obj);
2166 		obj->base.read_domains = obj->base.write_domain =
2167 		    I915_GEM_DOMAIN_CPU;
2168 	}
2169 
2170 	ret = i915_gem_object_put_fence(obj);
2171 	if (ret == -ERESTART)
2172 		return (ret);
2173 
2174 	i915_gem_gtt_unbind_object(obj);
2175 	if (obj->has_aliasing_ppgtt_mapping) {
2176 		i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj);
2177 		obj->has_aliasing_ppgtt_mapping = 0;
2178 	}
2179 	i915_gem_object_put_pages_gtt(obj);
2180 
2181 	list_del_init(&obj->gtt_list);
2182 	list_del_init(&obj->mm_list);
2183 	obj->map_and_fenceable = true;
2184 
2185 	drm_mm_put_block(obj->gtt_space);
2186 	obj->gtt_space = NULL;
2187 	obj->gtt_offset = 0;
2188 
2189 	if (i915_gem_object_is_purgeable(obj))
2190 		i915_gem_object_truncate(obj);
2191 
2192 	return (ret);
2193 }
2194 
2195 static int
2196 i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
2197     int flags)
2198 {
2199 	struct drm_device *dev;
2200 	vm_object_t vm_obj;
2201 	vm_page_t m;
2202 	int page_count, i, j;
2203 
2204 	dev = obj->base.dev;
2205 	KASSERT(obj->pages == NULL, ("Obj already has pages"));
2206 	page_count = obj->base.size / PAGE_SIZE;
2207 	obj->pages = kmalloc(page_count * sizeof(vm_page_t), DRM_I915_GEM,
2208 	    M_WAITOK);
2209 	vm_obj = obj->base.vm_obj;
2210 	VM_OBJECT_LOCK(vm_obj);
2211 	for (i = 0; i < page_count; i++) {
2212 		if ((obj->pages[i] = i915_gem_wire_page(vm_obj, i)) == NULL)
2213 			goto failed;
2214 	}
2215 	VM_OBJECT_UNLOCK(vm_obj);
2216 	if (i915_gem_object_needs_bit17_swizzle(obj))
2217 		i915_gem_object_do_bit_17_swizzle(obj);
2218 	return (0);
2219 
2220 failed:
2221 	for (j = 0; j < i; j++) {
2222 		m = obj->pages[j];
2223 		vm_page_busy_wait(m, FALSE, "i915gem");
2224 		vm_page_unwire(m, 0);
2225 		vm_page_wakeup(m);
2226 		atomic_add_long(&i915_gem_wired_pages_cnt, -1);
2227 	}
2228 	VM_OBJECT_UNLOCK(vm_obj);
2229 	drm_free(obj->pages, DRM_I915_GEM);
2230 	obj->pages = NULL;
2231 	return (-EIO);
2232 }
2233 
2234 #define	GEM_PARANOID_CHECK_GTT 0
2235 #if GEM_PARANOID_CHECK_GTT
2236 static void
2237 i915_gem_assert_pages_not_mapped(struct drm_device *dev, vm_page_t *ma,
2238     int page_count)
2239 {
2240 	struct drm_i915_private *dev_priv;
2241 	vm_paddr_t pa;
2242 	unsigned long start, end;
2243 	u_int i;
2244 	int j;
2245 
2246 	dev_priv = dev->dev_private;
2247 	start = OFF_TO_IDX(dev_priv->mm.gtt_start);
2248 	end = OFF_TO_IDX(dev_priv->mm.gtt_end);
2249 	for (i = start; i < end; i++) {
2250 		pa = intel_gtt_read_pte_paddr(i);
2251 		for (j = 0; j < page_count; j++) {
2252 			if (pa == VM_PAGE_TO_PHYS(ma[j])) {
2253 				panic("Page %p in GTT pte index %d pte %x",
2254 				    ma[i], i, intel_gtt_read_pte(i));
2255 			}
2256 		}
2257 	}
2258 }
2259 #endif
2260 
2261 static void
2262 i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
2263 {
2264 	vm_page_t m;
2265 	int page_count, i;
2266 
2267 	KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object"));
2268 
2269 	if (obj->tiling_mode != I915_TILING_NONE)
2270 		i915_gem_object_save_bit_17_swizzle(obj);
2271 	if (obj->madv == I915_MADV_DONTNEED)
2272 		obj->dirty = 0;
2273 	page_count = obj->base.size / PAGE_SIZE;
2274 	VM_OBJECT_LOCK(obj->base.vm_obj);
2275 #if GEM_PARANOID_CHECK_GTT
2276 	i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count);
2277 #endif
2278 	for (i = 0; i < page_count; i++) {
2279 		m = obj->pages[i];
2280 		if (obj->dirty)
2281 			vm_page_dirty(m);
2282 		if (obj->madv == I915_MADV_WILLNEED)
2283 			vm_page_reference(m);
2284 		vm_page_busy_wait(obj->pages[i], FALSE, "i915gem");
2285 		vm_page_unwire(obj->pages[i], 1);
2286 		vm_page_wakeup(obj->pages[i]);
2287 		atomic_add_long(&i915_gem_wired_pages_cnt, -1);
2288 	}
2289 	VM_OBJECT_UNLOCK(obj->base.vm_obj);
2290 	obj->dirty = 0;
2291 	drm_free(obj->pages, DRM_I915_GEM);
2292 	obj->pages = NULL;
2293 }
2294 
2295 void
2296 i915_gem_release_mmap(struct drm_i915_gem_object *obj)
2297 {
2298 	vm_object_t devobj;
2299 	vm_page_t m;
2300 	int i, page_count;
2301 
2302 	if (!obj->fault_mappable)
2303 		return;
2304 
2305 	devobj = cdev_pager_lookup(obj);
2306 	if (devobj != NULL) {
2307 		page_count = OFF_TO_IDX(obj->base.size);
2308 
2309 		VM_OBJECT_LOCK(devobj);
2310 		for (i = 0; i < page_count; i++) {
2311 			m = vm_page_lookup_busy_wait(devobj, i, TRUE, "915unm");
2312 			if (m == NULL)
2313 				continue;
2314 			cdev_pager_free_page(devobj, m);
2315 		}
2316 		VM_OBJECT_UNLOCK(devobj);
2317 		vm_object_deallocate(devobj);
2318 	}
2319 
2320 	obj->fault_mappable = false;
2321 }
2322 
2323 int
2324 i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj)
2325 {
2326 	int ret;
2327 
2328 	KASSERT((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0,
2329 	    ("In GPU write domain"));
2330 
2331 	if (obj->active) {
2332 		ret = i915_wait_request(obj->ring, obj->last_rendering_seqno,
2333 		    true);
2334 		if (ret != 0)
2335 			return (ret);
2336 	}
2337 	return (0);
2338 }
2339 
2340 void
2341 i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
2342     struct intel_ring_buffer *ring, uint32_t seqno)
2343 {
2344 	struct drm_device *dev = obj->base.dev;
2345 	struct drm_i915_private *dev_priv = dev->dev_private;
2346 	struct drm_i915_fence_reg *reg;
2347 
2348 	obj->ring = ring;
2349 	KASSERT(ring != NULL, ("NULL ring"));
2350 
2351 	/* Add a reference if we're newly entering the active list. */
2352 	if (!obj->active) {
2353 		drm_gem_object_reference(&obj->base);
2354 		obj->active = 1;
2355 	}
2356 
2357 	/* Move from whatever list we were on to the tail of execution. */
2358 	list_move_tail(&obj->mm_list, &dev_priv->mm.active_list);
2359 	list_move_tail(&obj->ring_list, &ring->active_list);
2360 
2361 	obj->last_rendering_seqno = seqno;
2362 	if (obj->fenced_gpu_access) {
2363 		obj->last_fenced_seqno = seqno;
2364 		obj->last_fenced_ring = ring;
2365 
2366 		/* Bump MRU to take account of the delayed flush */
2367 		if (obj->fence_reg != I915_FENCE_REG_NONE) {
2368 			reg = &dev_priv->fence_regs[obj->fence_reg];
2369 			list_move_tail(&reg->lru_list,
2370 				       &dev_priv->mm.fence_list);
2371 		}
2372 	}
2373 }
2374 
2375 static void
2376 i915_gem_object_move_off_active(struct drm_i915_gem_object *obj)
2377 {
2378 	list_del_init(&obj->ring_list);
2379 	obj->last_rendering_seqno = 0;
2380 	obj->last_fenced_seqno = 0;
2381 }
2382 
2383 static void
2384 i915_gem_object_move_to_flushing(struct drm_i915_gem_object *obj)
2385 {
2386 	struct drm_device *dev = obj->base.dev;
2387 	drm_i915_private_t *dev_priv = dev->dev_private;
2388 
2389 	KASSERT(obj->active, ("Object not active"));
2390 	list_move_tail(&obj->mm_list, &dev_priv->mm.flushing_list);
2391 
2392 	i915_gem_object_move_off_active(obj);
2393 }
2394 
2395 static void
2396 i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
2397 {
2398 	struct drm_device *dev = obj->base.dev;
2399 	struct drm_i915_private *dev_priv = dev->dev_private;
2400 
2401 	if (obj->pin_count != 0)
2402 		list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
2403 	else
2404 		list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2405 
2406 	KASSERT(list_empty(&obj->gpu_write_list), ("On gpu_write_list"));
2407 	KASSERT(obj->active, ("Object not active"));
2408 	obj->ring = NULL;
2409 	obj->last_fenced_ring = NULL;
2410 
2411 	i915_gem_object_move_off_active(obj);
2412 	obj->fenced_gpu_access = false;
2413 
2414 	obj->active = 0;
2415 	obj->pending_gpu_write = false;
2416 	drm_gem_object_unreference(&obj->base);
2417 
2418 #if 1
2419 	KIB_NOTYET();
2420 #else
2421 	WARN_ON(i915_verify_lists(dev));
2422 #endif
2423 }
2424 
2425 static void
2426 i915_gem_object_truncate(struct drm_i915_gem_object *obj)
2427 {
2428 	vm_object_t vm_obj;
2429 
2430 	vm_obj = obj->base.vm_obj;
2431 	VM_OBJECT_LOCK(vm_obj);
2432 	vm_object_page_remove(vm_obj, 0, 0, false);
2433 	VM_OBJECT_UNLOCK(vm_obj);
2434 	obj->madv = I915_MADV_PURGED_INTERNAL;
2435 }
2436 
2437 static inline int
2438 i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj)
2439 {
2440 
2441 	return (obj->madv == I915_MADV_DONTNEED);
2442 }
2443 
2444 static void
2445 i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
2446     uint32_t flush_domains)
2447 {
2448 	struct drm_i915_gem_object *obj, *next;
2449 	uint32_t old_write_domain;
2450 
2451 	list_for_each_entry_safe(obj, next, &ring->gpu_write_list,
2452 	    gpu_write_list) {
2453 		if (obj->base.write_domain & flush_domains) {
2454 			old_write_domain = obj->base.write_domain;
2455 			obj->base.write_domain = 0;
2456 			list_del_init(&obj->gpu_write_list);
2457 			i915_gem_object_move_to_active(obj, ring,
2458 			    i915_gem_next_request_seqno(ring));
2459 		}
2460 	}
2461 }
2462 
2463 static int
2464 i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
2465 {
2466 	drm_i915_private_t *dev_priv;
2467 
2468 	dev_priv = obj->base.dev->dev_private;
2469 	return (dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
2470 	    obj->tiling_mode != I915_TILING_NONE);
2471 }
2472 
2473 #define	VM_OBJECT_LOCK_ASSERT_OWNED(object)
2474 
2475 static vm_page_t
2476 i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex)
2477 {
2478 	vm_page_t m;
2479 	int rv;
2480 
2481 	VM_OBJECT_LOCK_ASSERT_OWNED(object);
2482 	m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
2483 	if (m->valid != VM_PAGE_BITS_ALL) {
2484 		if (vm_pager_has_page(object, pindex)) {
2485 			rv = vm_pager_get_page(object, &m, 1);
2486 			m = vm_page_lookup(object, pindex);
2487 			if (m == NULL)
2488 				return (NULL);
2489 			if (rv != VM_PAGER_OK) {
2490 				vm_page_free(m);
2491 				return (NULL);
2492 			}
2493 		} else {
2494 			pmap_zero_page(VM_PAGE_TO_PHYS(m));
2495 			m->valid = VM_PAGE_BITS_ALL;
2496 			m->dirty = 0;
2497 		}
2498 	}
2499 	vm_page_wire(m);
2500 	vm_page_wakeup(m);
2501 	atomic_add_long(&i915_gem_wired_pages_cnt, 1);
2502 	return (m);
2503 }
2504 
2505 int
2506 i915_gem_flush_ring(struct intel_ring_buffer *ring, uint32_t invalidate_domains,
2507     uint32_t flush_domains)
2508 {
2509 	int ret;
2510 
2511 	if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0)
2512 		return 0;
2513 
2514 	ret = ring->flush(ring, invalidate_domains, flush_domains);
2515 	if (ret)
2516 		return ret;
2517 
2518 	if (flush_domains & I915_GEM_GPU_DOMAINS)
2519 		i915_gem_process_flushing_list(ring, flush_domains);
2520 	return 0;
2521 }
2522 
2523 static int
2524 i915_ring_idle(struct intel_ring_buffer *ring, bool do_retire)
2525 {
2526 	int ret;
2527 
2528 	if (list_empty(&ring->gpu_write_list) && list_empty(&ring->active_list))
2529 		return 0;
2530 
2531 	if (!list_empty(&ring->gpu_write_list)) {
2532 		ret = i915_gem_flush_ring(ring, I915_GEM_GPU_DOMAINS,
2533 		    I915_GEM_GPU_DOMAINS);
2534 		if (ret != 0)
2535 			return ret;
2536 	}
2537 
2538 	return (i915_wait_request(ring, i915_gem_next_request_seqno(ring),
2539 	    do_retire));
2540 }
2541 
2542 int
2543 i915_gpu_idle(struct drm_device *dev, bool do_retire)
2544 {
2545 	drm_i915_private_t *dev_priv = dev->dev_private;
2546 	int ret, i;
2547 
2548 	/* Flush everything onto the inactive list. */
2549 	for (i = 0; i < I915_NUM_RINGS; i++) {
2550 		ret = i915_ring_idle(&dev_priv->rings[i], do_retire);
2551 		if (ret)
2552 			return ret;
2553 	}
2554 
2555 	return 0;
2556 }
2557 
2558 int
2559 i915_wait_request(struct intel_ring_buffer *ring, uint32_t seqno, bool do_retire)
2560 {
2561 	drm_i915_private_t *dev_priv;
2562 	struct drm_i915_gem_request *request;
2563 	uint32_t ier;
2564 	int flags, ret;
2565 	bool recovery_complete;
2566 
2567 	KASSERT(seqno != 0, ("Zero seqno"));
2568 
2569 	dev_priv = ring->dev->dev_private;
2570 	ret = 0;
2571 
2572 	if (atomic_load_acq_int(&dev_priv->mm.wedged) != 0) {
2573 		/* Give the error handler a chance to run. */
2574 		lockmgr(&dev_priv->error_completion_lock, LK_EXCLUSIVE);
2575 		recovery_complete = (&dev_priv->error_completion) > 0;
2576 		lockmgr(&dev_priv->error_completion_lock, LK_RELEASE);
2577 		return (recovery_complete ? -EIO : -EAGAIN);
2578 	}
2579 
2580 	if (seqno == ring->outstanding_lazy_request) {
2581 		request = kmalloc(sizeof(*request), DRM_I915_GEM,
2582 		    M_WAITOK | M_ZERO);
2583 		if (request == NULL)
2584 			return (-ENOMEM);
2585 
2586 		ret = i915_add_request(ring, NULL, request);
2587 		if (ret != 0) {
2588 			drm_free(request, DRM_I915_GEM);
2589 			return (ret);
2590 		}
2591 
2592 		seqno = request->seqno;
2593 	}
2594 
2595 	if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
2596 		if (HAS_PCH_SPLIT(ring->dev))
2597 			ier = I915_READ(DEIER) | I915_READ(GTIER);
2598 		else
2599 			ier = I915_READ(IER);
2600 		if (!ier) {
2601 			DRM_ERROR("something (likely vbetool) disabled "
2602 				  "interrupts, re-enabling\n");
2603 			ring->dev->driver->irq_preinstall(ring->dev);
2604 			ring->dev->driver->irq_postinstall(ring->dev);
2605 		}
2606 
2607 		ring->waiting_seqno = seqno;
2608 		lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
2609 		if (ring->irq_get(ring)) {
2610 			flags = dev_priv->mm.interruptible ? PCATCH : 0;
2611 			while (!i915_seqno_passed(ring->get_seqno(ring), seqno)
2612 			    && !atomic_load_acq_int(&dev_priv->mm.wedged) &&
2613 			    ret == 0) {
2614 				ret = -lksleep(ring, &ring->irq_lock, flags,
2615 				    "915gwr", 0);
2616 			}
2617 			ring->irq_put(ring);
2618 			lockmgr(&ring->irq_lock, LK_RELEASE);
2619 		} else {
2620 			lockmgr(&ring->irq_lock, LK_RELEASE);
2621 			if (_intel_wait_for(ring->dev,
2622 			    i915_seqno_passed(ring->get_seqno(ring), seqno) ||
2623 			    atomic_load_acq_int(&dev_priv->mm.wedged), 3000,
2624 			    0, "i915wrq") != 0)
2625 				ret = -EBUSY;
2626 		}
2627 		ring->waiting_seqno = 0;
2628 
2629 	}
2630 	if (atomic_load_acq_int(&dev_priv->mm.wedged))
2631 		ret = -EAGAIN;
2632 
2633 	/* Directly dispatch request retiring.  While we have the work queue
2634 	 * to handle this, the waiter on a request often wants an associated
2635 	 * buffer to have made it to the inactive list, and we would need
2636 	 * a separate wait queue to handle that.
2637 	 */
2638 	if (ret == 0 && do_retire)
2639 		i915_gem_retire_requests_ring(ring);
2640 
2641 	return (ret);
2642 }
2643 
2644 static u32
2645 i915_gem_get_seqno(struct drm_device *dev)
2646 {
2647 	drm_i915_private_t *dev_priv = dev->dev_private;
2648 	u32 seqno = dev_priv->next_seqno;
2649 
2650 	/* reserve 0 for non-seqno */
2651 	if (++dev_priv->next_seqno == 0)
2652 		dev_priv->next_seqno = 1;
2653 
2654 	return seqno;
2655 }
2656 
2657 u32
2658 i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
2659 {
2660 	if (ring->outstanding_lazy_request == 0)
2661 		ring->outstanding_lazy_request = i915_gem_get_seqno(ring->dev);
2662 
2663 	return ring->outstanding_lazy_request;
2664 }
2665 
2666 int
2667 i915_add_request(struct intel_ring_buffer *ring, struct drm_file *file,
2668      struct drm_i915_gem_request *request)
2669 {
2670 	drm_i915_private_t *dev_priv;
2671 	struct drm_i915_file_private *file_priv;
2672 	uint32_t seqno;
2673 	u32 request_ring_position;
2674 	int was_empty;
2675 	int ret;
2676 
2677 	KASSERT(request != NULL, ("NULL request in add"));
2678 	DRM_LOCK_ASSERT(ring->dev);
2679 	dev_priv = ring->dev->dev_private;
2680 
2681 	seqno = i915_gem_next_request_seqno(ring);
2682 	request_ring_position = intel_ring_get_tail(ring);
2683 
2684 	ret = ring->add_request(ring, &seqno);
2685 	if (ret != 0)
2686 	    return ret;
2687 
2688 	request->seqno = seqno;
2689 	request->ring = ring;
2690 	request->tail = request_ring_position;
2691 	request->emitted_jiffies = ticks;
2692 	was_empty = list_empty(&ring->request_list);
2693 	list_add_tail(&request->list, &ring->request_list);
2694 
2695 	if (file != NULL) {
2696 		file_priv = file->driver_priv;
2697 
2698 		spin_lock(&file_priv->mm.lock);
2699 		request->file_priv = file_priv;
2700 		list_add_tail(&request->client_list,
2701 		    &file_priv->mm.request_list);
2702 		spin_unlock(&file_priv->mm.lock);
2703 	}
2704 
2705 	ring->outstanding_lazy_request = 0;
2706 
2707 	if (!dev_priv->mm.suspended) {
2708 		if (i915_enable_hangcheck) {
2709 			callout_reset(&dev_priv->hangcheck_timer,
2710 			    DRM_I915_HANGCHECK_PERIOD, i915_hangcheck_elapsed, ring->dev);
2711 		}
2712 		if (was_empty)
2713 			taskqueue_enqueue_timeout(dev_priv->tq,
2714 			    &dev_priv->mm.retire_task, hz);
2715 	}
2716 	return (0);
2717 }
2718 
2719 static inline void
2720 i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
2721 {
2722 	struct drm_i915_file_private *file_priv = request->file_priv;
2723 
2724 	if (!file_priv)
2725 		return;
2726 
2727 	DRM_LOCK_ASSERT(request->ring->dev);
2728 
2729 	spin_lock(&file_priv->mm.lock);
2730 	if (request->file_priv != NULL) {
2731 		list_del(&request->client_list);
2732 		request->file_priv = NULL;
2733 	}
2734 	spin_unlock(&file_priv->mm.lock);
2735 }
2736 
2737 void
2738 i915_gem_release(struct drm_device *dev, struct drm_file *file)
2739 {
2740 	struct drm_i915_file_private *file_priv;
2741 	struct drm_i915_gem_request *request;
2742 
2743 	file_priv = file->driver_priv;
2744 
2745 	/* Clean up our request list when the client is going away, so that
2746 	 * later retire_requests won't dereference our soon-to-be-gone
2747 	 * file_priv.
2748 	 */
2749 	spin_lock(&file_priv->mm.lock);
2750 	while (!list_empty(&file_priv->mm.request_list)) {
2751 		request = list_first_entry(&file_priv->mm.request_list,
2752 					   struct drm_i915_gem_request,
2753 					   client_list);
2754 		list_del(&request->client_list);
2755 		request->file_priv = NULL;
2756 	}
2757 	spin_unlock(&file_priv->mm.lock);
2758 }
2759 
2760 static void
2761 i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
2762     struct intel_ring_buffer *ring)
2763 {
2764 
2765 	if (ring->dev != NULL)
2766 		DRM_LOCK_ASSERT(ring->dev);
2767 
2768 	while (!list_empty(&ring->request_list)) {
2769 		struct drm_i915_gem_request *request;
2770 
2771 		request = list_first_entry(&ring->request_list,
2772 		    struct drm_i915_gem_request, list);
2773 
2774 		list_del(&request->list);
2775 		i915_gem_request_remove_from_client(request);
2776 		drm_free(request, DRM_I915_GEM);
2777 	}
2778 
2779 	while (!list_empty(&ring->active_list)) {
2780 		struct drm_i915_gem_object *obj;
2781 
2782 		obj = list_first_entry(&ring->active_list,
2783 		    struct drm_i915_gem_object, ring_list);
2784 
2785 		obj->base.write_domain = 0;
2786 		list_del_init(&obj->gpu_write_list);
2787 		i915_gem_object_move_to_inactive(obj);
2788 	}
2789 }
2790 
2791 static void
2792 i915_gem_reset_fences(struct drm_device *dev)
2793 {
2794 	struct drm_i915_private *dev_priv = dev->dev_private;
2795 	int i;
2796 
2797 	for (i = 0; i < dev_priv->num_fence_regs; i++) {
2798 		struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
2799 		struct drm_i915_gem_object *obj = reg->obj;
2800 
2801 		if (!obj)
2802 			continue;
2803 
2804 		if (obj->tiling_mode)
2805 			i915_gem_release_mmap(obj);
2806 
2807 		reg->obj->fence_reg = I915_FENCE_REG_NONE;
2808 		reg->obj->fenced_gpu_access = false;
2809 		reg->obj->last_fenced_seqno = 0;
2810 		reg->obj->last_fenced_ring = NULL;
2811 		i915_gem_clear_fence_reg(dev, reg);
2812 	}
2813 }
2814 
2815 void
2816 i915_gem_reset(struct drm_device *dev)
2817 {
2818 	struct drm_i915_private *dev_priv = dev->dev_private;
2819 	struct drm_i915_gem_object *obj;
2820 	int i;
2821 
2822 	for (i = 0; i < I915_NUM_RINGS; i++)
2823 		i915_gem_reset_ring_lists(dev_priv, &dev_priv->rings[i]);
2824 
2825 	/* Remove anything from the flushing lists. The GPU cache is likely
2826 	 * to be lost on reset along with the data, so simply move the
2827 	 * lost bo to the inactive list.
2828 	 */
2829 	while (!list_empty(&dev_priv->mm.flushing_list)) {
2830 		obj = list_first_entry(&dev_priv->mm.flushing_list,
2831 				      struct drm_i915_gem_object,
2832 				      mm_list);
2833 
2834 		obj->base.write_domain = 0;
2835 		list_del_init(&obj->gpu_write_list);
2836 		i915_gem_object_move_to_inactive(obj);
2837 	}
2838 
2839 	/* Move everything out of the GPU domains to ensure we do any
2840 	 * necessary invalidation upon reuse.
2841 	 */
2842 	list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) {
2843 		obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
2844 	}
2845 
2846 	/* The fence registers are invalidated so clear them out */
2847 	i915_gem_reset_fences(dev);
2848 }
2849 
2850 /**
2851  * This function clears the request list as sequence numbers are passed.
2852  */
2853 void
2854 i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
2855 {
2856 	uint32_t seqno;
2857 	int i;
2858 
2859 	if (list_empty(&ring->request_list))
2860 		return;
2861 
2862 	seqno = ring->get_seqno(ring);
2863 	for (i = 0; i < DRM_ARRAY_SIZE(ring->sync_seqno); i++)
2864 		if (seqno >= ring->sync_seqno[i])
2865 			ring->sync_seqno[i] = 0;
2866 
2867 	while (!list_empty(&ring->request_list)) {
2868 		struct drm_i915_gem_request *request;
2869 
2870 		request = list_first_entry(&ring->request_list,
2871 					   struct drm_i915_gem_request,
2872 					   list);
2873 
2874 		if (!i915_seqno_passed(seqno, request->seqno))
2875 			break;
2876 
2877 		ring->last_retired_head = request->tail;
2878 
2879 		list_del(&request->list);
2880 		i915_gem_request_remove_from_client(request);
2881 		drm_free(request, DRM_I915_GEM);
2882 	}
2883 
2884 	/* Move any buffers on the active list that are no longer referenced
2885 	 * by the ringbuffer to the flushing/inactive lists as appropriate.
2886 	 */
2887 	while (!list_empty(&ring->active_list)) {
2888 		struct drm_i915_gem_object *obj;
2889 
2890 		obj = list_first_entry(&ring->active_list,
2891 				      struct drm_i915_gem_object,
2892 				      ring_list);
2893 
2894 		if (!i915_seqno_passed(seqno, obj->last_rendering_seqno))
2895 			break;
2896 
2897 		if (obj->base.write_domain != 0)
2898 			i915_gem_object_move_to_flushing(obj);
2899 		else
2900 			i915_gem_object_move_to_inactive(obj);
2901 	}
2902 
2903 	if (ring->trace_irq_seqno &&
2904 	    i915_seqno_passed(seqno, ring->trace_irq_seqno)) {
2905 		lockmgr(&ring->irq_lock, LK_EXCLUSIVE);
2906 		ring->irq_put(ring);
2907 		lockmgr(&ring->irq_lock, LK_RELEASE);
2908 		ring->trace_irq_seqno = 0;
2909 	}
2910 }
2911 
2912 void
2913 i915_gem_retire_requests(struct drm_device *dev)
2914 {
2915 	drm_i915_private_t *dev_priv = dev->dev_private;
2916 	struct drm_i915_gem_object *obj, *next;
2917 	int i;
2918 
2919 	if (!list_empty(&dev_priv->mm.deferred_free_list)) {
2920 		list_for_each_entry_safe(obj, next,
2921 		    &dev_priv->mm.deferred_free_list, mm_list)
2922 			i915_gem_free_object_tail(obj);
2923 	}
2924 
2925 	for (i = 0; i < I915_NUM_RINGS; i++)
2926 		i915_gem_retire_requests_ring(&dev_priv->rings[i]);
2927 }
2928 
2929 static int
2930 sandybridge_write_fence_reg(struct drm_i915_gem_object *obj,
2931     struct intel_ring_buffer *pipelined)
2932 {
2933 	struct drm_device *dev = obj->base.dev;
2934 	drm_i915_private_t *dev_priv = dev->dev_private;
2935 	u32 size = obj->gtt_space->size;
2936 	int regnum = obj->fence_reg;
2937 	uint64_t val;
2938 
2939 	val = (uint64_t)((obj->gtt_offset + size - 4096) &
2940 			 0xfffff000) << 32;
2941 	val |= obj->gtt_offset & 0xfffff000;
2942 	val |= (uint64_t)((obj->stride / 128) - 1) <<
2943 		SANDYBRIDGE_FENCE_PITCH_SHIFT;
2944 
2945 	if (obj->tiling_mode == I915_TILING_Y)
2946 		val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2947 	val |= I965_FENCE_REG_VALID;
2948 
2949 	if (pipelined) {
2950 		int ret = intel_ring_begin(pipelined, 6);
2951 		if (ret)
2952 			return ret;
2953 
2954 		intel_ring_emit(pipelined, MI_NOOP);
2955 		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2956 		intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8);
2957 		intel_ring_emit(pipelined, (u32)val);
2958 		intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8 + 4);
2959 		intel_ring_emit(pipelined, (u32)(val >> 32));
2960 		intel_ring_advance(pipelined);
2961 	} else
2962 		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + regnum * 8, val);
2963 
2964 	return 0;
2965 }
2966 
2967 static int
2968 i965_write_fence_reg(struct drm_i915_gem_object *obj,
2969     struct intel_ring_buffer *pipelined)
2970 {
2971 	struct drm_device *dev = obj->base.dev;
2972 	drm_i915_private_t *dev_priv = dev->dev_private;
2973 	u32 size = obj->gtt_space->size;
2974 	int regnum = obj->fence_reg;
2975 	uint64_t val;
2976 
2977 	val = (uint64_t)((obj->gtt_offset + size - 4096) &
2978 		    0xfffff000) << 32;
2979 	val |= obj->gtt_offset & 0xfffff000;
2980 	val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT;
2981 	if (obj->tiling_mode == I915_TILING_Y)
2982 		val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2983 	val |= I965_FENCE_REG_VALID;
2984 
2985 	if (pipelined) {
2986 		int ret = intel_ring_begin(pipelined, 6);
2987 		if (ret)
2988 			return ret;
2989 
2990 		intel_ring_emit(pipelined, MI_NOOP);
2991 		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2992 		intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8);
2993 		intel_ring_emit(pipelined, (u32)val);
2994 		intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8 + 4);
2995 		intel_ring_emit(pipelined, (u32)(val >> 32));
2996 		intel_ring_advance(pipelined);
2997 	} else
2998 		I915_WRITE64(FENCE_REG_965_0 + regnum * 8, val);
2999 
3000 	return 0;
3001 }
3002 
3003 static int
3004 i915_write_fence_reg(struct drm_i915_gem_object *obj,
3005     struct intel_ring_buffer *pipelined)
3006 {
3007 	struct drm_device *dev = obj->base.dev;
3008 	drm_i915_private_t *dev_priv = dev->dev_private;
3009 	u32 size = obj->gtt_space->size;
3010 	u32 fence_reg, val, pitch_val;
3011 	int tile_width;
3012 
3013 	if ((obj->gtt_offset & ~I915_FENCE_START_MASK) ||
3014 	    (size & -size) != size || (obj->gtt_offset & (size - 1))) {
3015 		kprintf(
3016 "object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
3017 		 obj->gtt_offset, obj->map_and_fenceable, size);
3018 		return -EINVAL;
3019 	}
3020 
3021 	if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
3022 		tile_width = 128;
3023 	else
3024 		tile_width = 512;
3025 
3026 	/* Note: pitch better be a power of two tile widths */
3027 	pitch_val = obj->stride / tile_width;
3028 	pitch_val = ffs(pitch_val) - 1;
3029 
3030 	val = obj->gtt_offset;
3031 	if (obj->tiling_mode == I915_TILING_Y)
3032 		val |= 1 << I830_FENCE_TILING_Y_SHIFT;
3033 	val |= I915_FENCE_SIZE_BITS(size);
3034 	val |= pitch_val << I830_FENCE_PITCH_SHIFT;
3035 	val |= I830_FENCE_REG_VALID;
3036 
3037 	fence_reg = obj->fence_reg;
3038 	if (fence_reg < 8)
3039 		fence_reg = FENCE_REG_830_0 + fence_reg * 4;
3040 	else
3041 		fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
3042 
3043 	if (pipelined) {
3044 		int ret = intel_ring_begin(pipelined, 4);
3045 		if (ret)
3046 			return ret;
3047 
3048 		intel_ring_emit(pipelined, MI_NOOP);
3049 		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
3050 		intel_ring_emit(pipelined, fence_reg);
3051 		intel_ring_emit(pipelined, val);
3052 		intel_ring_advance(pipelined);
3053 	} else
3054 		I915_WRITE(fence_reg, val);
3055 
3056 	return 0;
3057 }
3058 
3059 static int
3060 i830_write_fence_reg(struct drm_i915_gem_object *obj,
3061     struct intel_ring_buffer *pipelined)
3062 {
3063 	struct drm_device *dev = obj->base.dev;
3064 	drm_i915_private_t *dev_priv = dev->dev_private;
3065 	u32 size = obj->gtt_space->size;
3066 	int regnum = obj->fence_reg;
3067 	uint32_t val;
3068 	uint32_t pitch_val;
3069 
3070 	if ((obj->gtt_offset & ~I830_FENCE_START_MASK) ||
3071 	    (size & -size) != size || (obj->gtt_offset & (size - 1))) {
3072 		kprintf(
3073 "object 0x%08x not 512K or pot-size 0x%08x aligned\n",
3074 		    obj->gtt_offset, size);
3075 		return -EINVAL;
3076 	}
3077 
3078 	pitch_val = obj->stride / 128;
3079 	pitch_val = ffs(pitch_val) - 1;
3080 
3081 	val = obj->gtt_offset;
3082 	if (obj->tiling_mode == I915_TILING_Y)
3083 		val |= 1 << I830_FENCE_TILING_Y_SHIFT;
3084 	val |= I830_FENCE_SIZE_BITS(size);
3085 	val |= pitch_val << I830_FENCE_PITCH_SHIFT;
3086 	val |= I830_FENCE_REG_VALID;
3087 
3088 	if (pipelined) {
3089 		int ret = intel_ring_begin(pipelined, 4);
3090 		if (ret)
3091 			return ret;
3092 
3093 		intel_ring_emit(pipelined, MI_NOOP);
3094 		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
3095 		intel_ring_emit(pipelined, FENCE_REG_830_0 + regnum*4);
3096 		intel_ring_emit(pipelined, val);
3097 		intel_ring_advance(pipelined);
3098 	} else
3099 		I915_WRITE(FENCE_REG_830_0 + regnum * 4, val);
3100 
3101 	return 0;
3102 }
3103 
3104 static bool ring_passed_seqno(struct intel_ring_buffer *ring, u32 seqno)
3105 {
3106 	return i915_seqno_passed(ring->get_seqno(ring), seqno);
3107 }
3108 
3109 static int
3110 i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
3111     struct intel_ring_buffer *pipelined)
3112 {
3113 	int ret;
3114 
3115 	if (obj->fenced_gpu_access) {
3116 		if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
3117 			ret = i915_gem_flush_ring(obj->last_fenced_ring, 0,
3118 			    obj->base.write_domain);
3119 			if (ret)
3120 				return ret;
3121 		}
3122 
3123 		obj->fenced_gpu_access = false;
3124 	}
3125 
3126 	if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) {
3127 		if (!ring_passed_seqno(obj->last_fenced_ring,
3128 				       obj->last_fenced_seqno)) {
3129 			ret = i915_wait_request(obj->last_fenced_ring,
3130 						obj->last_fenced_seqno,
3131 						true);
3132 			if (ret)
3133 				return ret;
3134 		}
3135 
3136 		obj->last_fenced_seqno = 0;
3137 		obj->last_fenced_ring = NULL;
3138 	}
3139 
3140 	/* Ensure that all CPU reads are completed before installing a fence
3141 	 * and all writes before removing the fence.
3142 	 */
3143 	if (obj->base.read_domains & I915_GEM_DOMAIN_GTT)
3144 		cpu_mfence();
3145 
3146 	return 0;
3147 }
3148 
3149 int
3150 i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
3151 {
3152 	int ret;
3153 
3154 	if (obj->tiling_mode)
3155 		i915_gem_release_mmap(obj);
3156 
3157 	ret = i915_gem_object_flush_fence(obj, NULL);
3158 	if (ret)
3159 		return ret;
3160 
3161 	if (obj->fence_reg != I915_FENCE_REG_NONE) {
3162 		struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
3163 
3164 		if (dev_priv->fence_regs[obj->fence_reg].pin_count != 0)
3165 			kprintf("%s: pin_count %d\n", __func__,
3166 			    dev_priv->fence_regs[obj->fence_reg].pin_count);
3167 		i915_gem_clear_fence_reg(obj->base.dev,
3168 					 &dev_priv->fence_regs[obj->fence_reg]);
3169 
3170 		obj->fence_reg = I915_FENCE_REG_NONE;
3171 	}
3172 
3173 	return 0;
3174 }
3175 
3176 static struct drm_i915_fence_reg *
3177 i915_find_fence_reg(struct drm_device *dev, struct intel_ring_buffer *pipelined)
3178 {
3179 	struct drm_i915_private *dev_priv = dev->dev_private;
3180 	struct drm_i915_fence_reg *reg, *first, *avail;
3181 	int i;
3182 
3183 	/* First try to find a free reg */
3184 	avail = NULL;
3185 	for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
3186 		reg = &dev_priv->fence_regs[i];
3187 		if (!reg->obj)
3188 			return reg;
3189 
3190 		if (!reg->pin_count)
3191 			avail = reg;
3192 	}
3193 
3194 	if (avail == NULL)
3195 		return NULL;
3196 
3197 	/* None available, try to steal one or wait for a user to finish */
3198 	avail = first = NULL;
3199 	list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
3200 		if (reg->pin_count)
3201 			continue;
3202 
3203 		if (first == NULL)
3204 			first = reg;
3205 
3206 		if (!pipelined ||
3207 		    !reg->obj->last_fenced_ring ||
3208 		    reg->obj->last_fenced_ring == pipelined) {
3209 			avail = reg;
3210 			break;
3211 		}
3212 	}
3213 
3214 	if (avail == NULL)
3215 		avail = first;
3216 
3217 	return avail;
3218 }
3219 
3220 int
3221 i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
3222     struct intel_ring_buffer *pipelined)
3223 {
3224 	struct drm_device *dev = obj->base.dev;
3225 	struct drm_i915_private *dev_priv = dev->dev_private;
3226 	struct drm_i915_fence_reg *reg;
3227 	int ret;
3228 
3229 	pipelined = NULL;
3230 	ret = 0;
3231 
3232 	if (obj->fence_reg != I915_FENCE_REG_NONE) {
3233 		reg = &dev_priv->fence_regs[obj->fence_reg];
3234 		list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
3235 
3236 		if (obj->tiling_changed) {
3237 			ret = i915_gem_object_flush_fence(obj, pipelined);
3238 			if (ret)
3239 				return ret;
3240 
3241 			if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
3242 				pipelined = NULL;
3243 
3244 			if (pipelined) {
3245 				reg->setup_seqno =
3246 					i915_gem_next_request_seqno(pipelined);
3247 				obj->last_fenced_seqno = reg->setup_seqno;
3248 				obj->last_fenced_ring = pipelined;
3249 			}
3250 
3251 			goto update;
3252 		}
3253 
3254 		if (!pipelined) {
3255 			if (reg->setup_seqno) {
3256 				if (!ring_passed_seqno(obj->last_fenced_ring,
3257 				    reg->setup_seqno)) {
3258 					ret = i915_wait_request(
3259 					    obj->last_fenced_ring,
3260 					    reg->setup_seqno,
3261 					    true);
3262 					if (ret)
3263 						return ret;
3264 				}
3265 
3266 				reg->setup_seqno = 0;
3267 			}
3268 		} else if (obj->last_fenced_ring &&
3269 			   obj->last_fenced_ring != pipelined) {
3270 			ret = i915_gem_object_flush_fence(obj, pipelined);
3271 			if (ret)
3272 				return ret;
3273 		}
3274 
3275 		if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
3276 			pipelined = NULL;
3277 		KASSERT(pipelined || reg->setup_seqno == 0, ("!pipelined"));
3278 
3279 		if (obj->tiling_changed) {
3280 			if (pipelined) {
3281 				reg->setup_seqno =
3282 					i915_gem_next_request_seqno(pipelined);
3283 				obj->last_fenced_seqno = reg->setup_seqno;
3284 				obj->last_fenced_ring = pipelined;
3285 			}
3286 			goto update;
3287 		}
3288 
3289 		return 0;
3290 	}
3291 
3292 	reg = i915_find_fence_reg(dev, pipelined);
3293 	if (reg == NULL)
3294 		return -EDEADLK;
3295 
3296 	ret = i915_gem_object_flush_fence(obj, pipelined);
3297 	if (ret)
3298 		return ret;
3299 
3300 	if (reg->obj) {
3301 		struct drm_i915_gem_object *old = reg->obj;
3302 
3303 		drm_gem_object_reference(&old->base);
3304 
3305 		if (old->tiling_mode)
3306 			i915_gem_release_mmap(old);
3307 
3308 		ret = i915_gem_object_flush_fence(old, pipelined);
3309 		if (ret) {
3310 			drm_gem_object_unreference(&old->base);
3311 			return ret;
3312 		}
3313 
3314 		if (old->last_fenced_seqno == 0 && obj->last_fenced_seqno == 0)
3315 			pipelined = NULL;
3316 
3317 		old->fence_reg = I915_FENCE_REG_NONE;
3318 		old->last_fenced_ring = pipelined;
3319 		old->last_fenced_seqno =
3320 			pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
3321 
3322 		drm_gem_object_unreference(&old->base);
3323 	} else if (obj->last_fenced_seqno == 0)
3324 		pipelined = NULL;
3325 
3326 	reg->obj = obj;
3327 	list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
3328 	obj->fence_reg = reg - dev_priv->fence_regs;
3329 	obj->last_fenced_ring = pipelined;
3330 
3331 	reg->setup_seqno =
3332 		pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
3333 	obj->last_fenced_seqno = reg->setup_seqno;
3334 
3335 update:
3336 	obj->tiling_changed = false;
3337 	switch (INTEL_INFO(dev)->gen) {
3338 	case 7:
3339 	case 6:
3340 		ret = sandybridge_write_fence_reg(obj, pipelined);
3341 		break;
3342 	case 5:
3343 	case 4:
3344 		ret = i965_write_fence_reg(obj, pipelined);
3345 		break;
3346 	case 3:
3347 		ret = i915_write_fence_reg(obj, pipelined);
3348 		break;
3349 	case 2:
3350 		ret = i830_write_fence_reg(obj, pipelined);
3351 		break;
3352 	}
3353 
3354 	return ret;
3355 }
3356 
3357 static void
3358 i915_gem_clear_fence_reg(struct drm_device *dev, struct drm_i915_fence_reg *reg)
3359 {
3360 	drm_i915_private_t *dev_priv = dev->dev_private;
3361 	uint32_t fence_reg = reg - dev_priv->fence_regs;
3362 
3363 	switch (INTEL_INFO(dev)->gen) {
3364 	case 7:
3365 	case 6:
3366 		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + fence_reg*8, 0);
3367 		break;
3368 	case 5:
3369 	case 4:
3370 		I915_WRITE64(FENCE_REG_965_0 + fence_reg*8, 0);
3371 		break;
3372 	case 3:
3373 		if (fence_reg >= 8)
3374 			fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
3375 		else
3376 	case 2:
3377 			fence_reg = FENCE_REG_830_0 + fence_reg * 4;
3378 
3379 		I915_WRITE(fence_reg, 0);
3380 		break;
3381 	}
3382 
3383 	list_del_init(&reg->lru_list);
3384 	reg->obj = NULL;
3385 	reg->setup_seqno = 0;
3386 	reg->pin_count = 0;
3387 }
3388 
3389 int
3390 i915_gem_init_object(struct drm_gem_object *obj)
3391 {
3392 
3393 	kprintf("i915_gem_init_object called\n");
3394 	return (0);
3395 }
3396 
3397 static bool
3398 i915_gem_object_is_inactive(struct drm_i915_gem_object *obj)
3399 {
3400 
3401 	return (obj->gtt_space && !obj->active && obj->pin_count == 0);
3402 }
3403 
3404 static void
3405 i915_gem_retire_task_handler(void *arg, int pending)
3406 {
3407 	drm_i915_private_t *dev_priv;
3408 	struct drm_device *dev;
3409 	bool idle;
3410 	int i;
3411 
3412 	dev_priv = arg;
3413 	dev = dev_priv->dev;
3414 
3415 	/* Come back later if the device is busy... */
3416 	if (lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_NOWAIT)) {
3417 		taskqueue_enqueue_timeout(dev_priv->tq,
3418 		    &dev_priv->mm.retire_task, hz);
3419 		return;
3420 	}
3421 
3422 	i915_gem_retire_requests(dev);
3423 
3424 	/* Send a periodic flush down the ring so we don't hold onto GEM
3425 	 * objects indefinitely.
3426 	 */
3427 	idle = true;
3428 	for (i = 0; i < I915_NUM_RINGS; i++) {
3429 		struct intel_ring_buffer *ring = &dev_priv->rings[i];
3430 
3431 		if (!list_empty(&ring->gpu_write_list)) {
3432 			struct drm_i915_gem_request *request;
3433 			int ret;
3434 
3435 			ret = i915_gem_flush_ring(ring,
3436 						  0, I915_GEM_GPU_DOMAINS);
3437 			request = kmalloc(sizeof(*request), DRM_I915_GEM,
3438 			    M_WAITOK | M_ZERO);
3439 			if (ret || request == NULL ||
3440 			    i915_add_request(ring, NULL, request))
3441 				drm_free(request, DRM_I915_GEM);
3442 		}
3443 
3444 		idle &= list_empty(&ring->request_list);
3445 	}
3446 
3447 	if (!dev_priv->mm.suspended && !idle)
3448 		taskqueue_enqueue_timeout(dev_priv->tq,
3449 		    &dev_priv->mm.retire_task, hz);
3450 
3451 	DRM_UNLOCK(dev);
3452 }
3453 
3454 void
3455 i915_gem_lastclose(struct drm_device *dev)
3456 {
3457 	int ret;
3458 
3459 	if (drm_core_check_feature(dev, DRIVER_MODESET))
3460 		return;
3461 
3462 	ret = i915_gem_idle(dev);
3463 	if (ret != 0)
3464 		DRM_ERROR("failed to idle hardware: %d\n", ret);
3465 }
3466 
3467 static int
3468 i915_gem_init_phys_object(struct drm_device *dev, int id, int size, int align)
3469 {
3470 	drm_i915_private_t *dev_priv;
3471 	struct drm_i915_gem_phys_object *phys_obj;
3472 	int ret;
3473 
3474 	dev_priv = dev->dev_private;
3475 	if (dev_priv->mm.phys_objs[id - 1] != NULL || size == 0)
3476 		return (0);
3477 
3478 	phys_obj = kmalloc(sizeof(struct drm_i915_gem_phys_object), DRM_I915_GEM,
3479 	    M_WAITOK | M_ZERO);
3480 
3481 	phys_obj->id = id;
3482 
3483 	phys_obj->handle = drm_pci_alloc(dev, size, align, ~0);
3484 	if (phys_obj->handle == NULL) {
3485 		ret = -ENOMEM;
3486 		goto free_obj;
3487 	}
3488 	pmap_change_attr((vm_offset_t)phys_obj->handle->vaddr,
3489 	    size / PAGE_SIZE, PAT_WRITE_COMBINING);
3490 
3491 	dev_priv->mm.phys_objs[id - 1] = phys_obj;
3492 
3493 	return (0);
3494 
3495 free_obj:
3496 	drm_free(phys_obj, DRM_I915_GEM);
3497 	return (ret);
3498 }
3499 
3500 static void
3501 i915_gem_free_phys_object(struct drm_device *dev, int id)
3502 {
3503 	drm_i915_private_t *dev_priv;
3504 	struct drm_i915_gem_phys_object *phys_obj;
3505 
3506 	dev_priv = dev->dev_private;
3507 	if (dev_priv->mm.phys_objs[id - 1] == NULL)
3508 		return;
3509 
3510 	phys_obj = dev_priv->mm.phys_objs[id - 1];
3511 	if (phys_obj->cur_obj != NULL)
3512 		i915_gem_detach_phys_object(dev, phys_obj->cur_obj);
3513 
3514 	drm_pci_free(dev, phys_obj->handle);
3515 	drm_free(phys_obj, DRM_I915_GEM);
3516 	dev_priv->mm.phys_objs[id - 1] = NULL;
3517 }
3518 
3519 void
3520 i915_gem_free_all_phys_object(struct drm_device *dev)
3521 {
3522 	int i;
3523 
3524 	for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++)
3525 		i915_gem_free_phys_object(dev, i);
3526 }
3527 
3528 void
3529 i915_gem_detach_phys_object(struct drm_device *dev,
3530     struct drm_i915_gem_object *obj)
3531 {
3532 	vm_page_t m;
3533 	struct sf_buf *sf;
3534 	char *vaddr, *dst;
3535 	int i, page_count;
3536 
3537 	if (obj->phys_obj == NULL)
3538 		return;
3539 	vaddr = obj->phys_obj->handle->vaddr;
3540 
3541 	page_count = obj->base.size / PAGE_SIZE;
3542 	VM_OBJECT_LOCK(obj->base.vm_obj);
3543 	for (i = 0; i < page_count; i++) {
3544 		m = i915_gem_wire_page(obj->base.vm_obj, i);
3545 		if (m == NULL)
3546 			continue; /* XXX */
3547 
3548 		VM_OBJECT_UNLOCK(obj->base.vm_obj);
3549 		sf = sf_buf_alloc(m);
3550 		if (sf != NULL) {
3551 			dst = (char *)sf_buf_kva(sf);
3552 			memcpy(dst, vaddr + IDX_TO_OFF(i), PAGE_SIZE);
3553 			sf_buf_free(sf);
3554 		}
3555 		drm_clflush_pages(&m, 1);
3556 
3557 		VM_OBJECT_LOCK(obj->base.vm_obj);
3558 		vm_page_reference(m);
3559 		vm_page_dirty(m);
3560 		vm_page_busy_wait(m, FALSE, "i915gem");
3561 		vm_page_unwire(m, 0);
3562 		vm_page_wakeup(m);
3563 		atomic_add_long(&i915_gem_wired_pages_cnt, -1);
3564 	}
3565 	VM_OBJECT_UNLOCK(obj->base.vm_obj);
3566 	intel_gtt_chipset_flush();
3567 
3568 	obj->phys_obj->cur_obj = NULL;
3569 	obj->phys_obj = NULL;
3570 }
3571 
3572 int
3573 i915_gem_attach_phys_object(struct drm_device *dev,
3574     struct drm_i915_gem_object *obj, int id, int align)
3575 {
3576 	drm_i915_private_t *dev_priv;
3577 	vm_page_t m;
3578 	struct sf_buf *sf;
3579 	char *dst, *src;
3580 	int i, page_count, ret;
3581 
3582 	if (id > I915_MAX_PHYS_OBJECT)
3583 		return (-EINVAL);
3584 
3585 	if (obj->phys_obj != NULL) {
3586 		if (obj->phys_obj->id == id)
3587 			return (0);
3588 		i915_gem_detach_phys_object(dev, obj);
3589 	}
3590 
3591 	dev_priv = dev->dev_private;
3592 	if (dev_priv->mm.phys_objs[id - 1] == NULL) {
3593 		ret = i915_gem_init_phys_object(dev, id, obj->base.size, align);
3594 		if (ret != 0) {
3595 			DRM_ERROR("failed to init phys object %d size: %zu\n",
3596 				  id, obj->base.size);
3597 			return (ret);
3598 		}
3599 	}
3600 
3601 	/* bind to the object */
3602 	obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
3603 	obj->phys_obj->cur_obj = obj;
3604 
3605 	page_count = obj->base.size / PAGE_SIZE;
3606 
3607 	VM_OBJECT_LOCK(obj->base.vm_obj);
3608 	ret = 0;
3609 	for (i = 0; i < page_count; i++) {
3610 		m = i915_gem_wire_page(obj->base.vm_obj, i);
3611 		if (m == NULL) {
3612 			ret = -EIO;
3613 			break;
3614 		}
3615 		VM_OBJECT_UNLOCK(obj->base.vm_obj);
3616 		sf = sf_buf_alloc(m);
3617 		src = (char *)sf_buf_kva(sf);
3618 		dst = (char *)obj->phys_obj->handle->vaddr + IDX_TO_OFF(i);
3619 		memcpy(dst, src, PAGE_SIZE);
3620 		sf_buf_free(sf);
3621 
3622 		VM_OBJECT_LOCK(obj->base.vm_obj);
3623 
3624 		vm_page_reference(m);
3625 		vm_page_busy_wait(m, FALSE, "i915gem");
3626 		vm_page_unwire(m, 0);
3627 		vm_page_wakeup(m);
3628 		atomic_add_long(&i915_gem_wired_pages_cnt, -1);
3629 	}
3630 	VM_OBJECT_UNLOCK(obj->base.vm_obj);
3631 
3632 	return (0);
3633 }
3634 
3635 static int
3636 i915_gem_phys_pwrite(struct drm_device *dev, struct drm_i915_gem_object *obj,
3637     uint64_t data_ptr, uint64_t offset, uint64_t size,
3638     struct drm_file *file_priv)
3639 {
3640 	char *user_data, *vaddr;
3641 	int ret;
3642 
3643 	vaddr = (char *)obj->phys_obj->handle->vaddr + offset;
3644 	user_data = (char *)(uintptr_t)data_ptr;
3645 
3646 	if (copyin_nofault(user_data, vaddr, size) != 0) {
3647 		/* The physical object once assigned is fixed for the lifetime
3648 		 * of the obj, so we can safely drop the lock and continue
3649 		 * to access vaddr.
3650 		 */
3651 		DRM_UNLOCK(dev);
3652 		ret = -copyin(user_data, vaddr, size);
3653 		DRM_LOCK(dev);
3654 		if (ret != 0)
3655 			return (ret);
3656 	}
3657 
3658 	intel_gtt_chipset_flush();
3659 	return (0);
3660 }
3661 
3662 static int
3663 i915_gpu_is_active(struct drm_device *dev)
3664 {
3665 	drm_i915_private_t *dev_priv;
3666 
3667 	dev_priv = dev->dev_private;
3668 	return (!list_empty(&dev_priv->mm.flushing_list) ||
3669 	    !list_empty(&dev_priv->mm.active_list));
3670 }
3671 
3672 static void
3673 i915_gem_lowmem(void *arg)
3674 {
3675 	struct drm_device *dev;
3676 	struct drm_i915_private *dev_priv;
3677 	struct drm_i915_gem_object *obj, *next;
3678 	int cnt, cnt_fail, cnt_total;
3679 
3680 	dev = arg;
3681 	dev_priv = dev->dev_private;
3682 
3683 	if (lockmgr(&dev->dev_struct_lock, LK_EXCLUSIVE|LK_NOWAIT))
3684 		return;
3685 
3686 rescan:
3687 	/* first scan for clean buffers */
3688 	i915_gem_retire_requests(dev);
3689 
3690 	cnt_total = cnt_fail = cnt = 0;
3691 
3692 	list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list,
3693 	    mm_list) {
3694 		if (i915_gem_object_is_purgeable(obj)) {
3695 			if (i915_gem_object_unbind(obj) != 0)
3696 				cnt_total++;
3697 		} else
3698 			cnt_total++;
3699 	}
3700 
3701 	/* second pass, evict/count anything still on the inactive list */
3702 	list_for_each_entry_safe(obj, next, &dev_priv->mm.inactive_list,
3703 	    mm_list) {
3704 		if (i915_gem_object_unbind(obj) == 0)
3705 			cnt++;
3706 		else
3707 			cnt_fail++;
3708 	}
3709 
3710 	if (cnt_fail > cnt_total / 100 && i915_gpu_is_active(dev)) {
3711 		/*
3712 		 * We are desperate for pages, so as a last resort, wait
3713 		 * for the GPU to finish and discard whatever we can.
3714 		 * This has a dramatic impact to reduce the number of
3715 		 * OOM-killer events whilst running the GPU aggressively.
3716 		 */
3717 		if (i915_gpu_idle(dev, true) == 0)
3718 			goto rescan;
3719 	}
3720 	DRM_UNLOCK(dev);
3721 }
3722 
3723 void
3724 i915_gem_unload(struct drm_device *dev)
3725 {
3726 	struct drm_i915_private *dev_priv;
3727 
3728 	dev_priv = dev->dev_private;
3729 	EVENTHANDLER_DEREGISTER(vm_lowmem, dev_priv->mm.i915_lowmem);
3730 }
3731