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