i915_gem.c 101.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 * Copyright © 2008 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Authors:
 *    Eric Anholt <eric@anholt.net>
 *
 */

#include "drmP.h"
#include "drm.h"
#include "i915_drm.h"
#include "i915_drv.h"
C
Chris Wilson 已提交
32
#include "i915_trace.h"
33
#include "intel_drv.h"
34
#include <linux/shmem_fs.h>
35
#include <linux/slab.h>
36
#include <linux/swap.h>
J
Jesse Barnes 已提交
37
#include <linux/pci.h>
38

39
static __must_check int i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj);
40 41
static void i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj);
static void i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj);
42 43 44
static __must_check int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
						    unsigned alignment,
						    bool map_and_fenceable);
45 46
static void i915_gem_clear_fence_reg(struct drm_device *dev,
				     struct drm_i915_fence_reg *reg);
47 48
static int i915_gem_phys_pwrite(struct drm_device *dev,
				struct drm_i915_gem_object *obj,
49
				struct drm_i915_gem_pwrite *args,
50 51
				struct drm_file *file);
static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj);
52

53
static int i915_gem_inactive_shrink(struct shrinker *shrinker,
54
				    struct shrink_control *sc);
55
static void i915_gem_object_truncate(struct drm_i915_gem_object *obj);
56

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
/* some bookkeeping */
static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv,
				  size_t size)
{
	dev_priv->mm.object_count++;
	dev_priv->mm.object_memory += size;
}

static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv,
				     size_t size)
{
	dev_priv->mm.object_count--;
	dev_priv->mm.object_memory -= size;
}

72 73
static int
i915_gem_wait_for_error(struct drm_device *dev)
74 75 76 77 78 79 80 81 82 83 84 85 86
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct completion *x = &dev_priv->error_completion;
	unsigned long flags;
	int ret;

	if (!atomic_read(&dev_priv->mm.wedged))
		return 0;

	ret = wait_for_completion_interruptible(x);
	if (ret)
		return ret;

87 88 89 90 91 92 93 94 95 96 97
	if (atomic_read(&dev_priv->mm.wedged)) {
		/* GPU is hung, bump the completion count to account for
		 * the token we just consumed so that we never hit zero and
		 * end up waiting upon a subsequent completion event that
		 * will never happen.
		 */
		spin_lock_irqsave(&x->wait.lock, flags);
		x->done++;
		spin_unlock_irqrestore(&x->wait.lock, flags);
	}
	return 0;
98 99
}

100
int i915_mutex_lock_interruptible(struct drm_device *dev)
101 102 103
{
	int ret;

104
	ret = i915_gem_wait_for_error(dev);
105 106 107 108 109 110 111
	if (ret)
		return ret;

	ret = mutex_lock_interruptible(&dev->struct_mutex);
	if (ret)
		return ret;

112
	WARN_ON(i915_verify_lists(dev));
113 114
	return 0;
}
115

116
static inline bool
117
i915_gem_object_is_inactive(struct drm_i915_gem_object *obj)
118
{
119
	return obj->gtt_space && !obj->active && obj->pin_count == 0;
120 121
}

J
Jesse Barnes 已提交
122 123
int
i915_gem_init_ioctl(struct drm_device *dev, void *data,
124
		    struct drm_file *file)
J
Jesse Barnes 已提交
125 126
{
	struct drm_i915_gem_init *args = data;
127 128 129 130

	if (args->gtt_start >= args->gtt_end ||
	    (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1))
		return -EINVAL;
J
Jesse Barnes 已提交
131 132

	mutex_lock(&dev->struct_mutex);
133 134
	i915_gem_init_global_gtt(dev, args->gtt_start,
				 args->gtt_end, args->gtt_end);
135 136
	mutex_unlock(&dev->struct_mutex);

137
	return 0;
138 139
}

140 141
int
i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
142
			    struct drm_file *file)
143
{
144
	struct drm_i915_private *dev_priv = dev->dev_private;
145
	struct drm_i915_gem_get_aperture *args = data;
146 147
	struct drm_i915_gem_object *obj;
	size_t pinned;
148 149 150 151

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

152
	pinned = 0;
153
	mutex_lock(&dev->struct_mutex);
154 155
	list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list)
		pinned += obj->gtt_space->size;
156
	mutex_unlock(&dev->struct_mutex);
157

158
	args->aper_size = dev_priv->mm.gtt_total;
159
	args->aper_available_size = args->aper_size - pinned;
160

161 162 163
	return 0;
}

164 165 166 167 168
static int
i915_gem_create(struct drm_file *file,
		struct drm_device *dev,
		uint64_t size,
		uint32_t *handle_p)
169
{
170
	struct drm_i915_gem_object *obj;
171 172
	int ret;
	u32 handle;
173

174
	size = roundup(size, PAGE_SIZE);
175 176
	if (size == 0)
		return -EINVAL;
177 178

	/* Allocate the new object */
179
	obj = i915_gem_alloc_object(dev, size);
180 181 182
	if (obj == NULL)
		return -ENOMEM;

183
	ret = drm_gem_handle_create(file, &obj->base, &handle);
184
	if (ret) {
185 186
		drm_gem_object_release(&obj->base);
		i915_gem_info_remove_obj(dev->dev_private, obj->base.size);
187
		kfree(obj);
188
		return ret;
189
	}
190

191
	/* drop reference from allocate - handle holds it now */
192
	drm_gem_object_unreference(&obj->base);
193 194
	trace_i915_gem_object_create(obj);

195
	*handle_p = handle;
196 197 198
	return 0;
}

199 200 201 202 203 204
int
i915_gem_dumb_create(struct drm_file *file,
		     struct drm_device *dev,
		     struct drm_mode_create_dumb *args)
{
	/* have to work out size/pitch and return them */
205
	args->pitch = ALIGN(args->width * ((args->bpp + 7) / 8), 64);
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
	args->size = args->pitch * args->height;
	return i915_gem_create(file, dev,
			       args->size, &args->handle);
}

int i915_gem_dumb_destroy(struct drm_file *file,
			  struct drm_device *dev,
			  uint32_t handle)
{
	return drm_gem_handle_delete(file, handle);
}

/**
 * Creates a new mm object and returns a handle to it.
 */
int
i915_gem_create_ioctl(struct drm_device *dev, void *data,
		      struct drm_file *file)
{
	struct drm_i915_gem_create *args = data;
	return i915_gem_create(file, dev,
			       args->size, &args->handle);
}

230
static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
231
{
232
	drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
233 234

	return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
235
		obj->tiling_mode != I915_TILING_NONE;
236 237
}

238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
static inline int
__copy_to_user_swizzled(char __user *cpu_vaddr,
			const char *gpu_vaddr, int gpu_offset,
			int length)
{
	int ret, cpu_offset = 0;

	while (length > 0) {
		int cacheline_end = ALIGN(gpu_offset + 1, 64);
		int this_length = min(cacheline_end - gpu_offset, length);
		int swizzled_gpu_offset = gpu_offset ^ 64;

		ret = __copy_to_user(cpu_vaddr + cpu_offset,
				     gpu_vaddr + swizzled_gpu_offset,
				     this_length);
		if (ret)
			return ret + length;

		cpu_offset += this_length;
		gpu_offset += this_length;
		length -= this_length;
	}

	return 0;
}

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
static inline int
__copy_from_user_swizzled(char __user *gpu_vaddr, int gpu_offset,
			  const char *cpu_vaddr,
			  int length)
{
	int ret, cpu_offset = 0;

	while (length > 0) {
		int cacheline_end = ALIGN(gpu_offset + 1, 64);
		int this_length = min(cacheline_end - gpu_offset, length);
		int swizzled_gpu_offset = gpu_offset ^ 64;

		ret = __copy_from_user(gpu_vaddr + swizzled_gpu_offset,
				       cpu_vaddr + cpu_offset,
				       this_length);
		if (ret)
			return ret + length;

		cpu_offset += this_length;
		gpu_offset += this_length;
		length -= this_length;
	}

	return 0;
}

290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
/* Per-page copy function for the shmem pread fastpath.
 * Flushes invalid cachelines before reading the target if
 * needs_clflush is set. */
static int
shmem_pread_fast(struct page *page, int shmem_page_offset, int page_length,
		 char __user *user_data,
		 bool page_do_bit17_swizzling, bool needs_clflush)
{
	char *vaddr;
	int ret;

	if (page_do_bit17_swizzling)
		return -EINVAL;

	vaddr = kmap_atomic(page);
	if (needs_clflush)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);
	ret = __copy_to_user_inatomic(user_data,
				      vaddr + shmem_page_offset,
				      page_length);
	kunmap_atomic(vaddr);

	return ret;
}

/* Only difference to the fast-path function is that this can handle bit17
 * and uses non-atomic copy and kmap functions. */
static int
shmem_pread_slow(struct page *page, int shmem_page_offset, int page_length,
		 char __user *user_data,
		 bool page_do_bit17_swizzling, bool needs_clflush)
{
	char *vaddr;
	int ret;

	vaddr = kmap(page);
	if (needs_clflush)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);

	if (page_do_bit17_swizzling)
		ret = __copy_to_user_swizzled(user_data,
					      vaddr, shmem_page_offset,
					      page_length);
	else
		ret = __copy_to_user(user_data,
				     vaddr + shmem_page_offset,
				     page_length);
	kunmap(page);

	return ret;
}

344
static int
345 346 347 348
i915_gem_shmem_pread(struct drm_device *dev,
		     struct drm_i915_gem_object *obj,
		     struct drm_i915_gem_pread *args,
		     struct drm_file *file)
349
{
350
	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
351
	char __user *user_data;
352
	ssize_t remain;
353
	loff_t offset;
354
	int shmem_page_offset, page_length, ret = 0;
355
	int obj_do_bit17_swizzling, page_do_bit17_swizzling;
356
	int hit_slowpath = 0;
357
	int prefaulted = 0;
358
	int needs_clflush = 0;
359
	int release_page;
360

361
	user_data = (char __user *) (uintptr_t) args->data_ptr;
362 363
	remain = args->size;

364
	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
365

366 367 368 369 370 371 372 373 374 375 376 377
	if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)) {
		/* If we're not in the cpu read domain, set ourself into the gtt
		 * read domain and manually flush cachelines (if required). This
		 * optimizes for the case when the gpu will dirty the data
		 * anyway again before the next pread happens. */
		if (obj->cache_level == I915_CACHE_NONE)
			needs_clflush = 1;
		ret = i915_gem_object_set_to_gtt_domain(obj, false);
		if (ret)
			return ret;
	}

378
	offset = args->offset;
379 380

	while (remain > 0) {
381 382
		struct page *page;

383 384 385 386 387
		/* Operation in this page
		 *
		 * shmem_page_offset = offset within page in shmem file
		 * page_length = bytes to copy for this page
		 */
388
		shmem_page_offset = offset_in_page(offset);
389 390 391 392
		page_length = remain;
		if ((shmem_page_offset + page_length) > PAGE_SIZE)
			page_length = PAGE_SIZE - shmem_page_offset;

393 394 395 396 397 398 399 400 401 402
		if (obj->pages) {
			page = obj->pages[offset >> PAGE_SHIFT];
			release_page = 0;
		} else {
			page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
			if (IS_ERR(page)) {
				ret = PTR_ERR(page);
				goto out;
			}
			release_page = 1;
403
		}
404

405 406 407
		page_do_bit17_swizzling = obj_do_bit17_swizzling &&
			(page_to_phys(page) & (1 << 17)) != 0;

408 409 410 411 412
		ret = shmem_pread_fast(page, shmem_page_offset, page_length,
				       user_data, page_do_bit17_swizzling,
				       needs_clflush);
		if (ret == 0)
			goto next_page;
413 414

		hit_slowpath = 1;
415
		page_cache_get(page);
416 417
		mutex_unlock(&dev->struct_mutex);

418
		if (!prefaulted) {
419
			ret = fault_in_multipages_writeable(user_data, remain);
420 421 422 423 424 425 426 427
			/* Userspace is tricking us, but we've already clobbered
			 * its pages with the prefault and promised to write the
			 * data up to the first fault. Hence ignore any errors
			 * and just continue. */
			(void)ret;
			prefaulted = 1;
		}

428 429 430
		ret = shmem_pread_slow(page, shmem_page_offset, page_length,
				       user_data, page_do_bit17_swizzling,
				       needs_clflush);
431

432
		mutex_lock(&dev->struct_mutex);
433
		page_cache_release(page);
434
next_page:
435
		mark_page_accessed(page);
436 437
		if (release_page)
			page_cache_release(page);
438

439 440 441 442 443
		if (ret) {
			ret = -EFAULT;
			goto out;
		}

444
		remain -= page_length;
445
		user_data += page_length;
446 447 448
		offset += page_length;
	}

449
out:
450 451 452 453 454
	if (hit_slowpath) {
		/* Fixup: Kill any reinstated backing storage pages */
		if (obj->madv == __I915_MADV_PURGED)
			i915_gem_object_truncate(obj);
	}
455 456 457 458

	return ret;
}

459 460 461 462 463 464 465
/**
 * Reads data from the object referenced by handle.
 *
 * On error, the contents of *data are undefined.
 */
int
i915_gem_pread_ioctl(struct drm_device *dev, void *data,
466
		     struct drm_file *file)
467 468
{
	struct drm_i915_gem_pread *args = data;
469
	struct drm_i915_gem_object *obj;
470
	int ret = 0;
471

472 473 474 475 476 477 478 479
	if (args->size == 0)
		return 0;

	if (!access_ok(VERIFY_WRITE,
		       (char __user *)(uintptr_t)args->data_ptr,
		       args->size))
		return -EFAULT;

480
	ret = i915_mutex_lock_interruptible(dev);
481
	if (ret)
482
		return ret;
483

484
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
485
	if (&obj->base == NULL) {
486 487
		ret = -ENOENT;
		goto unlock;
488
	}
489

490
	/* Bounds check source.  */
491 492
	if (args->offset > obj->base.size ||
	    args->size > obj->base.size - args->offset) {
C
Chris Wilson 已提交
493
		ret = -EINVAL;
494
		goto out;
C
Chris Wilson 已提交
495 496
	}

C
Chris Wilson 已提交
497 498
	trace_i915_gem_object_pread(obj, args->offset, args->size);

499
	ret = i915_gem_shmem_pread(dev, obj, args, file);
500

501
out:
502
	drm_gem_object_unreference(&obj->base);
503
unlock:
504
	mutex_unlock(&dev->struct_mutex);
505
	return ret;
506 507
}

508 509
/* This is the fast write path which cannot handle
 * page faults in the source data
510
 */
511 512 513 514 515 516

static inline int
fast_user_write(struct io_mapping *mapping,
		loff_t page_base, int page_offset,
		char __user *user_data,
		int length)
517 518
{
	char *vaddr_atomic;
519
	unsigned long unwritten;
520

P
Peter Zijlstra 已提交
521
	vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
522 523
	unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset,
						      user_data, length);
P
Peter Zijlstra 已提交
524
	io_mapping_unmap_atomic(vaddr_atomic);
525
	return unwritten;
526 527
}

528 529 530 531
/**
 * This is the fast pwrite path, where we copy the data directly from the
 * user into the GTT, uncached.
 */
532
static int
533 534
i915_gem_gtt_pwrite_fast(struct drm_device *dev,
			 struct drm_i915_gem_object *obj,
535
			 struct drm_i915_gem_pwrite *args,
536
			 struct drm_file *file)
537
{
538
	drm_i915_private_t *dev_priv = dev->dev_private;
539
	ssize_t remain;
540
	loff_t offset, page_base;
541
	char __user *user_data;
D
Daniel Vetter 已提交
542 543 544 545 546 547 548 549 550 551 552 553 554
	int page_offset, page_length, ret;

	ret = i915_gem_object_pin(obj, 0, true);
	if (ret)
		goto out;

	ret = i915_gem_object_set_to_gtt_domain(obj, true);
	if (ret)
		goto out_unpin;

	ret = i915_gem_object_put_fence(obj);
	if (ret)
		goto out_unpin;
555 556 557 558

	user_data = (char __user *) (uintptr_t) args->data_ptr;
	remain = args->size;

559
	offset = obj->gtt_offset + args->offset;
560 561 562 563

	while (remain > 0) {
		/* Operation in this page
		 *
564 565 566
		 * page_base = page offset within aperture
		 * page_offset = offset within page
		 * page_length = bytes to copy for this page
567
		 */
568 569
		page_base = offset & PAGE_MASK;
		page_offset = offset_in_page(offset);
570 571 572 573 574
		page_length = remain;
		if ((page_offset + remain) > PAGE_SIZE)
			page_length = PAGE_SIZE - page_offset;

		/* If we get a fault while copying data, then (presumably) our
575 576
		 * source page isn't available.  Return the error and we'll
		 * retry in the slow path.
577
		 */
578
		if (fast_user_write(dev_priv->mm.gtt_mapping, page_base,
D
Daniel Vetter 已提交
579 580 581 582
				    page_offset, user_data, page_length)) {
			ret = -EFAULT;
			goto out_unpin;
		}
583

584 585 586
		remain -= page_length;
		user_data += page_length;
		offset += page_length;
587 588
	}

D
Daniel Vetter 已提交
589 590 591
out_unpin:
	i915_gem_object_unpin(obj);
out:
592 593 594
	return ret;
}

595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
/* Per-page copy function for the shmem pwrite fastpath.
 * Flushes invalid cachelines before writing to the target if
 * needs_clflush_before is set and flushes out any written cachelines after
 * writing if needs_clflush is set. */
static int
shmem_pwrite_fast(struct page *page, int shmem_page_offset, int page_length,
		  char __user *user_data,
		  bool page_do_bit17_swizzling,
		  bool needs_clflush_before,
		  bool needs_clflush_after)
{
	char *vaddr;
	int ret;

	if (page_do_bit17_swizzling)
		return -EINVAL;

	vaddr = kmap_atomic(page);
	if (needs_clflush_before)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);
	ret = __copy_from_user_inatomic_nocache(vaddr + shmem_page_offset,
						user_data,
						page_length);
	if (needs_clflush_after)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);
	kunmap_atomic(vaddr);

	return ret;
}

/* Only difference to the fast-path function is that this can handle bit17
 * and uses non-atomic copy and kmap functions. */
static int
shmem_pwrite_slow(struct page *page, int shmem_page_offset, int page_length,
		  char __user *user_data,
		  bool page_do_bit17_swizzling,
		  bool needs_clflush_before,
		  bool needs_clflush_after)
{
	char *vaddr;
	int ret;

	vaddr = kmap(page);
	if (needs_clflush_before)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);
	if (page_do_bit17_swizzling)
		ret = __copy_from_user_swizzled(vaddr, shmem_page_offset,
						user_data,
						page_length);
	else
		ret = __copy_from_user(vaddr + shmem_page_offset,
				       user_data,
				       page_length);
	if (needs_clflush_after)
		drm_clflush_virt_range(vaddr + shmem_page_offset,
				       page_length);
	kunmap(page);

	return ret;
}

659
static int
660 661 662 663
i915_gem_shmem_pwrite(struct drm_device *dev,
		      struct drm_i915_gem_object *obj,
		      struct drm_i915_gem_pwrite *args,
		      struct drm_file *file)
664
{
665
	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
666
	ssize_t remain;
667 668
	loff_t offset;
	char __user *user_data;
669
	int shmem_page_offset, page_length, ret = 0;
670
	int obj_do_bit17_swizzling, page_do_bit17_swizzling;
671
	int hit_slowpath = 0;
672 673
	int needs_clflush_after = 0;
	int needs_clflush_before = 0;
674
	int release_page;
675

676
	user_data = (char __user *) (uintptr_t) args->data_ptr;
677 678
	remain = args->size;

679
	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
680

681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
	if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
		/* If we're not in the cpu write domain, set ourself into the gtt
		 * write domain and manually flush cachelines (if required). This
		 * optimizes for the case when the gpu will use the data
		 * right away and we therefore have to clflush anyway. */
		if (obj->cache_level == I915_CACHE_NONE)
			needs_clflush_after = 1;
		ret = i915_gem_object_set_to_gtt_domain(obj, true);
		if (ret)
			return ret;
	}
	/* Same trick applies for invalidate partially written cachelines before
	 * writing.  */
	if (!(obj->base.read_domains & I915_GEM_DOMAIN_CPU)
	    && obj->cache_level == I915_CACHE_NONE)
		needs_clflush_before = 1;

698
	offset = args->offset;
699
	obj->dirty = 1;
700

701
	while (remain > 0) {
702
		struct page *page;
703
		int partial_cacheline_write;
704

705 706 707 708 709
		/* Operation in this page
		 *
		 * shmem_page_offset = offset within page in shmem file
		 * page_length = bytes to copy for this page
		 */
710
		shmem_page_offset = offset_in_page(offset);
711 712 713 714 715

		page_length = remain;
		if ((shmem_page_offset + page_length) > PAGE_SIZE)
			page_length = PAGE_SIZE - shmem_page_offset;

716 717 718 719 720 721 722
		/* If we don't overwrite a cacheline completely we need to be
		 * careful to have up-to-date data by first clflushing. Don't
		 * overcomplicate things and flush the entire patch. */
		partial_cacheline_write = needs_clflush_before &&
			((shmem_page_offset | page_length)
				& (boot_cpu_data.x86_clflush_size - 1));

723 724 725 726 727 728 729 730 731 732
		if (obj->pages) {
			page = obj->pages[offset >> PAGE_SHIFT];
			release_page = 0;
		} else {
			page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
			if (IS_ERR(page)) {
				ret = PTR_ERR(page);
				goto out;
			}
			release_page = 1;
733 734
		}

735 736 737
		page_do_bit17_swizzling = obj_do_bit17_swizzling &&
			(page_to_phys(page) & (1 << 17)) != 0;

738 739 740 741 742 743
		ret = shmem_pwrite_fast(page, shmem_page_offset, page_length,
					user_data, page_do_bit17_swizzling,
					partial_cacheline_write,
					needs_clflush_after);
		if (ret == 0)
			goto next_page;
744 745

		hit_slowpath = 1;
746
		page_cache_get(page);
747 748
		mutex_unlock(&dev->struct_mutex);

749 750 751 752
		ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
					user_data, page_do_bit17_swizzling,
					partial_cacheline_write,
					needs_clflush_after);
753

754
		mutex_lock(&dev->struct_mutex);
755
		page_cache_release(page);
756
next_page:
757 758
		set_page_dirty(page);
		mark_page_accessed(page);
759 760
		if (release_page)
			page_cache_release(page);
761

762 763 764 765 766
		if (ret) {
			ret = -EFAULT;
			goto out;
		}

767
		remain -= page_length;
768
		user_data += page_length;
769
		offset += page_length;
770 771
	}

772
out:
773 774 775 776 777 778 779 780 781 782
	if (hit_slowpath) {
		/* Fixup: Kill any reinstated backing storage pages */
		if (obj->madv == __I915_MADV_PURGED)
			i915_gem_object_truncate(obj);
		/* and flush dirty cachelines in case the object isn't in the cpu write
		 * domain anymore. */
		if (obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
			i915_gem_clflush_object(obj);
			intel_gtt_chipset_flush();
		}
783
	}
784

785 786 787
	if (needs_clflush_after)
		intel_gtt_chipset_flush();

788
	return ret;
789 790 791 792 793 794 795 796 797
}

/**
 * Writes data to the object referenced by handle.
 *
 * On error, the contents of the buffer that were to be modified are undefined.
 */
int
i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
798
		      struct drm_file *file)
799 800
{
	struct drm_i915_gem_pwrite *args = data;
801
	struct drm_i915_gem_object *obj;
802 803 804 805 806 807 808 809 810 811
	int ret;

	if (args->size == 0)
		return 0;

	if (!access_ok(VERIFY_READ,
		       (char __user *)(uintptr_t)args->data_ptr,
		       args->size))
		return -EFAULT;

812 813
	ret = fault_in_multipages_readable((char __user *)(uintptr_t)args->data_ptr,
					   args->size);
814 815
	if (ret)
		return -EFAULT;
816

817
	ret = i915_mutex_lock_interruptible(dev);
818
	if (ret)
819
		return ret;
820

821
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
822
	if (&obj->base == NULL) {
823 824
		ret = -ENOENT;
		goto unlock;
825
	}
826

827
	/* Bounds check destination. */
828 829
	if (args->offset > obj->base.size ||
	    args->size > obj->base.size - args->offset) {
C
Chris Wilson 已提交
830
		ret = -EINVAL;
831
		goto out;
C
Chris Wilson 已提交
832 833
	}

C
Chris Wilson 已提交
834 835
	trace_i915_gem_object_pwrite(obj, args->offset, args->size);

D
Daniel Vetter 已提交
836
	ret = -EFAULT;
837 838 839 840 841 842
	/* We can only do the GTT pwrite on untiled buffers, as otherwise
	 * it would end up going through the fenced access, and we'll get
	 * different detiling behavior between reading and writing.
	 * pread/pwrite currently are reading and writing from the CPU
	 * perspective, requiring manual detiling by the client.
	 */
843
	if (obj->phys_obj) {
844
		ret = i915_gem_phys_pwrite(dev, obj, args, file);
845 846 847 848
		goto out;
	}

	if (obj->gtt_space &&
849
	    obj->cache_level == I915_CACHE_NONE &&
850
	    obj->map_and_fenceable &&
851
	    obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
852
		ret = i915_gem_gtt_pwrite_fast(dev, obj, args, file);
D
Daniel Vetter 已提交
853 854 855
		/* Note that the gtt paths might fail with non-page-backed user
		 * pointers (e.g. gtt mappings when moving data between
		 * textures). Fallback to the shmem path in that case. */
856
	}
857

D
Daniel Vetter 已提交
858 859
	if (ret == -EFAULT)
		ret = i915_gem_shmem_pwrite(dev, obj, args, file);
860

861
out:
862
	drm_gem_object_unreference(&obj->base);
863
unlock:
864
	mutex_unlock(&dev->struct_mutex);
865 866 867 868
	return ret;
}

/**
869 870
 * Called when user space prepares to use an object with the CPU, either
 * through the mmap ioctl's mapping or a GTT mapping.
871 872 873
 */
int
i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
874
			  struct drm_file *file)
875 876
{
	struct drm_i915_gem_set_domain *args = data;
877
	struct drm_i915_gem_object *obj;
878 879
	uint32_t read_domains = args->read_domains;
	uint32_t write_domain = args->write_domain;
880 881 882 883 884
	int ret;

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

885
	/* Only handle setting domains to types used by the CPU. */
886
	if (write_domain & I915_GEM_GPU_DOMAINS)
887 888
		return -EINVAL;

889
	if (read_domains & I915_GEM_GPU_DOMAINS)
890 891 892 893 894 895 896 897
		return -EINVAL;

	/* Having something in the write domain implies it's in the read
	 * domain, and only that read domain.  Enforce that in the request.
	 */
	if (write_domain != 0 && read_domains != write_domain)
		return -EINVAL;

898
	ret = i915_mutex_lock_interruptible(dev);
899
	if (ret)
900
		return ret;
901

902
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
903
	if (&obj->base == NULL) {
904 905
		ret = -ENOENT;
		goto unlock;
906
	}
907

908 909
	if (read_domains & I915_GEM_DOMAIN_GTT) {
		ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
910 911 912 913 914 915 916

		/* Silently promote "you're not bound, there was nothing to do"
		 * to success, since the client was just asking us to
		 * make sure everything was done.
		 */
		if (ret == -EINVAL)
			ret = 0;
917
	} else {
918
		ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
919 920
	}

921
	drm_gem_object_unreference(&obj->base);
922
unlock:
923 924 925 926 927 928 929 930 931
	mutex_unlock(&dev->struct_mutex);
	return ret;
}

/**
 * Called when user space has done writes to this buffer
 */
int
i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
932
			 struct drm_file *file)
933 934
{
	struct drm_i915_gem_sw_finish *args = data;
935
	struct drm_i915_gem_object *obj;
936 937 938 939 940
	int ret = 0;

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

941
	ret = i915_mutex_lock_interruptible(dev);
942
	if (ret)
943
		return ret;
944

945
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
946
	if (&obj->base == NULL) {
947 948
		ret = -ENOENT;
		goto unlock;
949 950 951
	}

	/* Pinned buffers may be scanout, so flush the cache */
952
	if (obj->pin_count)
953 954
		i915_gem_object_flush_cpu_write_domain(obj);

955
	drm_gem_object_unreference(&obj->base);
956
unlock:
957 958 959 960 961 962 963 964 965 966 967 968 969
	mutex_unlock(&dev->struct_mutex);
	return ret;
}

/**
 * Maps the contents of an object, returning the address it is mapped
 * into.
 *
 * While the mapping holds a reference on the contents of the object, it doesn't
 * imply a ref on the object itself.
 */
int
i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
970
		    struct drm_file *file)
971 972 973 974 975 976 977 978
{
	struct drm_i915_gem_mmap *args = data;
	struct drm_gem_object *obj;
	unsigned long addr;

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

979
	obj = drm_gem_object_lookup(dev, file, args->handle);
980
	if (obj == NULL)
981
		return -ENOENT;
982 983 984 985 986 987

	down_write(&current->mm->mmap_sem);
	addr = do_mmap(obj->filp, 0, args->size,
		       PROT_READ | PROT_WRITE, MAP_SHARED,
		       args->offset);
	up_write(&current->mm->mmap_sem);
988
	drm_gem_object_unreference_unlocked(obj);
989 990 991 992 993 994 995 996
	if (IS_ERR((void *)addr))
		return addr;

	args->addr_ptr = (uint64_t) addr;

	return 0;
}

997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
/**
 * i915_gem_fault - fault a page into the GTT
 * vma: VMA in question
 * vmf: fault info
 *
 * The fault handler is set up by drm_gem_mmap() when a object is GTT mapped
 * from userspace.  The fault handler takes care of binding the object to
 * the GTT (if needed), allocating and programming a fence register (again,
 * only if needed based on whether the old reg is still valid or the object
 * is tiled) and inserting a new PTE into the faulting process.
 *
 * Note that the faulting process may involve evicting existing objects
 * from the GTT and/or fence registers to make room.  So performance may
 * suffer if the GTT working set is large or there are few fence registers
 * left.
 */
int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
1015 1016
	struct drm_i915_gem_object *obj = to_intel_bo(vma->vm_private_data);
	struct drm_device *dev = obj->base.dev;
1017
	drm_i915_private_t *dev_priv = dev->dev_private;
1018 1019 1020
	pgoff_t page_offset;
	unsigned long pfn;
	int ret = 0;
1021
	bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
1022 1023 1024 1025 1026

	/* We don't use vmf->pgoff since that has the fake offset */
	page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
		PAGE_SHIFT;

1027 1028 1029
	ret = i915_mutex_lock_interruptible(dev);
	if (ret)
		goto out;
1030

C
Chris Wilson 已提交
1031 1032
	trace_i915_gem_object_fault(obj, page_offset, true, write);

1033
	/* Now bind it into the GTT if needed */
1034 1035 1036 1037
	if (!obj->map_and_fenceable) {
		ret = i915_gem_object_unbind(obj);
		if (ret)
			goto unlock;
1038
	}
1039
	if (!obj->gtt_space) {
1040
		ret = i915_gem_object_bind_to_gtt(obj, 0, true);
1041 1042
		if (ret)
			goto unlock;
1043

1044 1045 1046 1047
		ret = i915_gem_object_set_to_gtt_domain(obj, write);
		if (ret)
			goto unlock;
	}
1048

1049 1050 1051
	if (!obj->has_global_gtt_mapping)
		i915_gem_gtt_bind_object(obj, obj->cache_level);

1052 1053 1054
	if (obj->tiling_mode == I915_TILING_NONE)
		ret = i915_gem_object_put_fence(obj);
	else
1055
		ret = i915_gem_object_get_fence(obj, NULL);
1056 1057
	if (ret)
		goto unlock;
1058

1059 1060
	if (i915_gem_object_is_inactive(obj))
		list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1061

1062 1063
	obj->fault_mappable = true;

1064
	pfn = ((dev->agp->base + obj->gtt_offset) >> PAGE_SHIFT) +
1065 1066 1067 1068
		page_offset;

	/* Finally, remap it using the new GTT offset */
	ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
1069
unlock:
1070
	mutex_unlock(&dev->struct_mutex);
1071
out:
1072
	switch (ret) {
1073
	case -EIO:
1074
	case -EAGAIN:
1075 1076 1077 1078 1079 1080 1081
		/* Give the error handler a chance to run and move the
		 * objects off the GPU active list. Next time we service the
		 * fault, we should be able to transition the page into the
		 * GTT without touching the GPU (and so avoid further
		 * EIO/EGAIN). If the GPU is wedged, then there is no issue
		 * with coherency, just lost writes.
		 */
1082
		set_need_resched();
1083 1084
	case 0:
	case -ERESTARTSYS:
1085
	case -EINTR:
1086
		return VM_FAULT_NOPAGE;
1087 1088 1089
	case -ENOMEM:
		return VM_FAULT_OOM;
	default:
1090
		return VM_FAULT_SIGBUS;
1091 1092 1093
	}
}

1094 1095 1096 1097
/**
 * i915_gem_release_mmap - remove physical page mappings
 * @obj: obj in question
 *
1098
 * Preserve the reservation of the mmapping with the DRM core code, but
1099 1100 1101 1102 1103 1104 1105 1106 1107
 * relinquish ownership of the pages back to the system.
 *
 * It is vital that we remove the page mapping if we have mapped a tiled
 * object through the GTT and then lose the fence register due to
 * resource pressure. Similarly if the object has been moved out of the
 * aperture, than pages mapped into userspace must be revoked. Removing the
 * mapping will then trigger a page fault on the next user access, allowing
 * fixup by i915_gem_fault().
 */
1108
void
1109
i915_gem_release_mmap(struct drm_i915_gem_object *obj)
1110
{
1111 1112
	if (!obj->fault_mappable)
		return;
1113

1114 1115 1116 1117
	if (obj->base.dev->dev_mapping)
		unmap_mapping_range(obj->base.dev->dev_mapping,
				    (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT,
				    obj->base.size, 1);
1118

1119
	obj->fault_mappable = false;
1120 1121
}

1122
static uint32_t
1123
i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
1124
{
1125
	uint32_t gtt_size;
1126 1127

	if (INTEL_INFO(dev)->gen >= 4 ||
1128 1129
	    tiling_mode == I915_TILING_NONE)
		return size;
1130 1131 1132

	/* Previous chips need a power-of-two fence region when tiling */
	if (INTEL_INFO(dev)->gen == 3)
1133
		gtt_size = 1024*1024;
1134
	else
1135
		gtt_size = 512*1024;
1136

1137 1138
	while (gtt_size < size)
		gtt_size <<= 1;
1139

1140
	return gtt_size;
1141 1142
}

1143 1144 1145 1146 1147
/**
 * i915_gem_get_gtt_alignment - return required GTT alignment for an object
 * @obj: object to check
 *
 * Return the required GTT alignment for an object, taking into account
1148
 * potential fence register mapping.
1149 1150
 */
static uint32_t
1151 1152 1153
i915_gem_get_gtt_alignment(struct drm_device *dev,
			   uint32_t size,
			   int tiling_mode)
1154 1155 1156 1157 1158
{
	/*
	 * Minimum alignment is 4k (GTT page size), but might be greater
	 * if a fence register is needed for the object.
	 */
1159
	if (INTEL_INFO(dev)->gen >= 4 ||
1160
	    tiling_mode == I915_TILING_NONE)
1161 1162
		return 4096;

1163 1164 1165 1166
	/*
	 * Previous chips need to be aligned to the size of the smallest
	 * fence register that can contain the object.
	 */
1167
	return i915_gem_get_gtt_size(dev, size, tiling_mode);
1168 1169
}

1170 1171 1172
/**
 * i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an
 *					 unfenced object
1173 1174 1175
 * @dev: the device
 * @size: size of the object
 * @tiling_mode: tiling mode of the object
1176 1177 1178 1179
 *
 * Return the required GTT alignment for an object, only taking into account
 * unfenced tiled surface requirements.
 */
1180
uint32_t
1181 1182 1183
i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev,
				    uint32_t size,
				    int tiling_mode)
1184 1185 1186 1187 1188
{
	/*
	 * Minimum alignment is 4k (GTT page size) for sane hw.
	 */
	if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev) ||
1189
	    tiling_mode == I915_TILING_NONE)
1190 1191
		return 4096;

1192 1193 1194
	/* Previous hardware however needs to be aligned to a power-of-two
	 * tile height. The simplest method for determining this is to reuse
	 * the power-of-tile object size.
1195
	 */
1196
	return i915_gem_get_gtt_size(dev, size, tiling_mode);
1197 1198
}

1199
int
1200 1201 1202 1203
i915_gem_mmap_gtt(struct drm_file *file,
		  struct drm_device *dev,
		  uint32_t handle,
		  uint64_t *offset)
1204
{
1205
	struct drm_i915_private *dev_priv = dev->dev_private;
1206
	struct drm_i915_gem_object *obj;
1207 1208 1209 1210 1211
	int ret;

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

1212
	ret = i915_mutex_lock_interruptible(dev);
1213
	if (ret)
1214
		return ret;
1215

1216
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1217
	if (&obj->base == NULL) {
1218 1219 1220
		ret = -ENOENT;
		goto unlock;
	}
1221

1222
	if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
1223
		ret = -E2BIG;
1224
		goto out;
1225 1226
	}

1227
	if (obj->madv != I915_MADV_WILLNEED) {
1228
		DRM_ERROR("Attempting to mmap a purgeable buffer\n");
1229 1230
		ret = -EINVAL;
		goto out;
1231 1232
	}

1233
	if (!obj->base.map_list.map) {
1234
		ret = drm_gem_create_mmap_offset(&obj->base);
1235 1236
		if (ret)
			goto out;
1237 1238
	}

1239
	*offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT;
1240

1241
out:
1242
	drm_gem_object_unreference(&obj->base);
1243
unlock:
1244
	mutex_unlock(&dev->struct_mutex);
1245
	return ret;
1246 1247
}

1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
/**
 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
 * @dev: DRM device
 * @data: GTT mapping ioctl data
 * @file: GEM object info
 *
 * Simply returns the fake offset to userspace so it can mmap it.
 * The mmap call will end up in drm_gem_mmap(), which will set things
 * up so we can get faults in the handler above.
 *
 * The fault handler will take care of binding the object into the GTT
 * (since it may have been evicted to make room for something), allocating
 * a fence register, and mapping the appropriate aperture address into
 * userspace.
 */
int
i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
			struct drm_file *file)
{
	struct drm_i915_gem_mmap_gtt *args = data;

	if (!(dev->driver->driver_features & DRIVER_GEM))
		return -ENODEV;

	return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
}


1276
static int
1277
i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
			      gfp_t gfpmask)
{
	int page_count, i;
	struct address_space *mapping;
	struct inode *inode;
	struct page *page;

	/* Get the list of pages out of our struct file.  They'll be pinned
	 * at this point until we release them.
	 */
1288 1289 1290 1291
	page_count = obj->base.size / PAGE_SIZE;
	BUG_ON(obj->pages != NULL);
	obj->pages = drm_malloc_ab(page_count, sizeof(struct page *));
	if (obj->pages == NULL)
1292 1293
		return -ENOMEM;

1294
	inode = obj->base.filp->f_path.dentry->d_inode;
1295
	mapping = inode->i_mapping;
1296 1297
	gfpmask |= mapping_gfp_mask(mapping);

1298
	for (i = 0; i < page_count; i++) {
1299
		page = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
1300 1301 1302
		if (IS_ERR(page))
			goto err_pages;

1303
		obj->pages[i] = page;
1304 1305
	}

1306
	if (i915_gem_object_needs_bit17_swizzle(obj))
1307 1308 1309 1310 1311 1312
		i915_gem_object_do_bit_17_swizzle(obj);

	return 0;

err_pages:
	while (i--)
1313
		page_cache_release(obj->pages[i]);
1314

1315 1316
	drm_free_large(obj->pages);
	obj->pages = NULL;
1317 1318 1319
	return PTR_ERR(page);
}

1320
static void
1321
i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
1322
{
1323
	int page_count = obj->base.size / PAGE_SIZE;
1324 1325
	int i;

1326
	BUG_ON(obj->madv == __I915_MADV_PURGED);
1327

1328
	if (i915_gem_object_needs_bit17_swizzle(obj))
1329 1330
		i915_gem_object_save_bit_17_swizzle(obj);

1331 1332
	if (obj->madv == I915_MADV_DONTNEED)
		obj->dirty = 0;
1333 1334

	for (i = 0; i < page_count; i++) {
1335 1336
		if (obj->dirty)
			set_page_dirty(obj->pages[i]);
1337

1338 1339
		if (obj->madv == I915_MADV_WILLNEED)
			mark_page_accessed(obj->pages[i]);
1340

1341
		page_cache_release(obj->pages[i]);
1342
	}
1343
	obj->dirty = 0;
1344

1345 1346
	drm_free_large(obj->pages);
	obj->pages = NULL;
1347 1348
}

1349
void
1350
i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
1351 1352
			       struct intel_ring_buffer *ring,
			       u32 seqno)
1353
{
1354
	struct drm_device *dev = obj->base.dev;
1355
	struct drm_i915_private *dev_priv = dev->dev_private;
1356

1357
	BUG_ON(ring == NULL);
1358
	obj->ring = ring;
1359 1360

	/* Add a reference if we're newly entering the active list. */
1361 1362 1363
	if (!obj->active) {
		drm_gem_object_reference(&obj->base);
		obj->active = 1;
1364
	}
1365

1366
	/* Move from whatever list we were on to the tail of execution. */
1367 1368
	list_move_tail(&obj->mm_list, &dev_priv->mm.active_list);
	list_move_tail(&obj->ring_list, &ring->active_list);
1369

1370
	obj->last_rendering_seqno = seqno;
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388
	if (obj->fenced_gpu_access) {
		struct drm_i915_fence_reg *reg;

		BUG_ON(obj->fence_reg == I915_FENCE_REG_NONE);

		obj->last_fenced_seqno = seqno;
		obj->last_fenced_ring = ring;

		reg = &dev_priv->fence_regs[obj->fence_reg];
		list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
	}
}

static void
i915_gem_object_move_off_active(struct drm_i915_gem_object *obj)
{
	list_del_init(&obj->ring_list);
	obj->last_rendering_seqno = 0;
1389 1390
}

1391
static void
1392
i915_gem_object_move_to_flushing(struct drm_i915_gem_object *obj)
1393
{
1394
	struct drm_device *dev = obj->base.dev;
1395 1396
	drm_i915_private_t *dev_priv = dev->dev_private;

1397 1398
	BUG_ON(!obj->active);
	list_move_tail(&obj->mm_list, &dev_priv->mm.flushing_list);
1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421

	i915_gem_object_move_off_active(obj);
}

static void
i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
{
	struct drm_device *dev = obj->base.dev;
	struct drm_i915_private *dev_priv = dev->dev_private;

	if (obj->pin_count != 0)
		list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
	else
		list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);

	BUG_ON(!list_empty(&obj->gpu_write_list));
	BUG_ON(!obj->active);
	obj->ring = NULL;

	i915_gem_object_move_off_active(obj);
	obj->fenced_gpu_access = false;

	obj->active = 0;
1422
	obj->pending_gpu_write = false;
1423 1424 1425
	drm_gem_object_unreference(&obj->base);

	WARN_ON(i915_verify_lists(dev));
1426
}
1427

1428 1429
/* Immediately discard the backing storage */
static void
1430
i915_gem_object_truncate(struct drm_i915_gem_object *obj)
1431
{
C
Chris Wilson 已提交
1432
	struct inode *inode;
1433

1434 1435 1436
	/* Our goal here is to return as much of the memory as
	 * is possible back to the system as we are called from OOM.
	 * To do this we must instruct the shmfs to drop all of its
1437
	 * backing pages, *now*.
1438
	 */
1439
	inode = obj->base.filp->f_path.dentry->d_inode;
1440
	shmem_truncate_range(inode, 0, (loff_t)-1);
C
Chris Wilson 已提交
1441

1442 1443 1444
	if (obj->base.map_list.map)
		drm_gem_free_mmap_offset(&obj->base);

1445
	obj->madv = __I915_MADV_PURGED;
1446 1447 1448
}

static inline int
1449
i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj)
1450
{
1451
	return obj->madv == I915_MADV_DONTNEED;
1452 1453
}

1454
static void
C
Chris Wilson 已提交
1455 1456
i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
			       uint32_t flush_domains)
1457
{
1458
	struct drm_i915_gem_object *obj, *next;
1459

1460
	list_for_each_entry_safe(obj, next,
1461
				 &ring->gpu_write_list,
1462
				 gpu_write_list) {
1463 1464
		if (obj->base.write_domain & flush_domains) {
			uint32_t old_write_domain = obj->base.write_domain;
1465

1466 1467
			obj->base.write_domain = 0;
			list_del_init(&obj->gpu_write_list);
1468
			i915_gem_object_move_to_active(obj, ring,
C
Chris Wilson 已提交
1469
						       i915_gem_next_request_seqno(ring));
1470 1471

			trace_i915_gem_object_change_domain(obj,
1472
							    obj->base.read_domains,
1473 1474 1475 1476
							    old_write_domain);
		}
	}
}
1477

1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
static u32
i915_gem_get_seqno(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	u32 seqno = dev_priv->next_seqno;

	/* reserve 0 for non-seqno */
	if (++dev_priv->next_seqno == 0)
		dev_priv->next_seqno = 1;

	return seqno;
}

u32
i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
{
	if (ring->outstanding_lazy_request == 0)
		ring->outstanding_lazy_request = i915_gem_get_seqno(ring->dev);

	return ring->outstanding_lazy_request;
}

1500
int
C
Chris Wilson 已提交
1501
i915_add_request(struct intel_ring_buffer *ring,
1502
		 struct drm_file *file,
C
Chris Wilson 已提交
1503
		 struct drm_i915_gem_request *request)
1504
{
C
Chris Wilson 已提交
1505
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
1506
	uint32_t seqno;
1507
	u32 request_ring_position;
1508
	int was_empty;
1509 1510 1511
	int ret;

	BUG_ON(request == NULL);
1512
	seqno = i915_gem_next_request_seqno(ring);
1513

1514 1515 1516 1517 1518 1519 1520
	/* Record the position of the start of the request so that
	 * should we detect the updated seqno part-way through the
	 * GPU processing the request, we never over-estimate the
	 * position of the head.
	 */
	request_ring_position = intel_ring_get_tail(ring);

1521 1522 1523
	ret = ring->add_request(ring, &seqno);
	if (ret)
	    return ret;
1524

C
Chris Wilson 已提交
1525
	trace_i915_gem_request_add(ring, seqno);
1526 1527

	request->seqno = seqno;
1528
	request->ring = ring;
1529
	request->tail = request_ring_position;
1530
	request->emitted_jiffies = jiffies;
1531 1532 1533
	was_empty = list_empty(&ring->request_list);
	list_add_tail(&request->list, &ring->request_list);

C
Chris Wilson 已提交
1534 1535 1536
	if (file) {
		struct drm_i915_file_private *file_priv = file->driver_priv;

1537
		spin_lock(&file_priv->mm.lock);
1538
		request->file_priv = file_priv;
1539
		list_add_tail(&request->client_list,
1540
			      &file_priv->mm.request_list);
1541
		spin_unlock(&file_priv->mm.lock);
1542
	}
1543

1544
	ring->outstanding_lazy_request = 0;
C
Chris Wilson 已提交
1545

B
Ben Gamari 已提交
1546
	if (!dev_priv->mm.suspended) {
1547 1548 1549 1550 1551
		if (i915_enable_hangcheck) {
			mod_timer(&dev_priv->hangcheck_timer,
				  jiffies +
				  msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
		}
B
Ben Gamari 已提交
1552
		if (was_empty)
1553 1554
			queue_delayed_work(dev_priv->wq,
					   &dev_priv->mm.retire_work, HZ);
B
Ben Gamari 已提交
1555
	}
1556
	return 0;
1557 1558
}

1559 1560
static inline void
i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
1561
{
1562
	struct drm_i915_file_private *file_priv = request->file_priv;
1563

1564 1565
	if (!file_priv)
		return;
C
Chris Wilson 已提交
1566

1567
	spin_lock(&file_priv->mm.lock);
1568 1569 1570 1571
	if (request->file_priv) {
		list_del(&request->client_list);
		request->file_priv = NULL;
	}
1572
	spin_unlock(&file_priv->mm.lock);
1573 1574
}

1575 1576
static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
				      struct intel_ring_buffer *ring)
1577
{
1578 1579
	while (!list_empty(&ring->request_list)) {
		struct drm_i915_gem_request *request;
1580

1581 1582 1583
		request = list_first_entry(&ring->request_list,
					   struct drm_i915_gem_request,
					   list);
1584

1585
		list_del(&request->list);
1586
		i915_gem_request_remove_from_client(request);
1587 1588
		kfree(request);
	}
1589

1590
	while (!list_empty(&ring->active_list)) {
1591
		struct drm_i915_gem_object *obj;
1592

1593 1594 1595
		obj = list_first_entry(&ring->active_list,
				       struct drm_i915_gem_object,
				       ring_list);
1596

1597 1598 1599
		obj->base.write_domain = 0;
		list_del_init(&obj->gpu_write_list);
		i915_gem_object_move_to_inactive(obj);
1600 1601 1602
	}
}

1603 1604 1605 1606 1607
static void i915_gem_reset_fences(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int i;

1608
	for (i = 0; i < dev_priv->num_fence_regs; i++) {
1609
		struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
1610 1611 1612 1613 1614 1615 1616 1617
		struct drm_i915_gem_object *obj = reg->obj;

		if (!obj)
			continue;

		if (obj->tiling_mode)
			i915_gem_release_mmap(obj);

1618 1619 1620 1621 1622
		reg->obj->fence_reg = I915_FENCE_REG_NONE;
		reg->obj->fenced_gpu_access = false;
		reg->obj->last_fenced_seqno = 0;
		reg->obj->last_fenced_ring = NULL;
		i915_gem_clear_fence_reg(dev, reg);
1623 1624 1625
	}
}

1626
void i915_gem_reset(struct drm_device *dev)
1627
{
1628
	struct drm_i915_private *dev_priv = dev->dev_private;
1629
	struct drm_i915_gem_object *obj;
1630
	int i;
1631

1632 1633
	for (i = 0; i < I915_NUM_RINGS; i++)
		i915_gem_reset_ring_lists(dev_priv, &dev_priv->ring[i]);
1634 1635 1636 1637 1638 1639

	/* Remove anything from the flushing lists. The GPU cache is likely
	 * to be lost on reset along with the data, so simply move the
	 * lost bo to the inactive list.
	 */
	while (!list_empty(&dev_priv->mm.flushing_list)) {
1640
		obj = list_first_entry(&dev_priv->mm.flushing_list,
1641 1642
				      struct drm_i915_gem_object,
				      mm_list);
1643

1644 1645 1646
		obj->base.write_domain = 0;
		list_del_init(&obj->gpu_write_list);
		i915_gem_object_move_to_inactive(obj);
1647 1648 1649 1650 1651
	}

	/* Move everything out of the GPU domains to ensure we do any
	 * necessary invalidation upon reuse.
	 */
1652
	list_for_each_entry(obj,
1653
			    &dev_priv->mm.inactive_list,
1654
			    mm_list)
1655
	{
1656
		obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
1657
	}
1658 1659

	/* The fence registers are invalidated so clear them out */
1660
	i915_gem_reset_fences(dev);
1661 1662 1663 1664 1665
}

/**
 * This function clears the request list as sequence numbers are passed.
 */
1666
void
C
Chris Wilson 已提交
1667
i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
1668 1669
{
	uint32_t seqno;
1670
	int i;
1671

C
Chris Wilson 已提交
1672
	if (list_empty(&ring->request_list))
1673 1674
		return;

C
Chris Wilson 已提交
1675
	WARN_ON(i915_verify_lists(ring->dev));
1676

1677
	seqno = ring->get_seqno(ring);
1678

1679
	for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++)
1680 1681 1682
		if (seqno >= ring->sync_seqno[i])
			ring->sync_seqno[i] = 0;

1683
	while (!list_empty(&ring->request_list)) {
1684 1685
		struct drm_i915_gem_request *request;

1686
		request = list_first_entry(&ring->request_list,
1687 1688 1689
					   struct drm_i915_gem_request,
					   list);

1690
		if (!i915_seqno_passed(seqno, request->seqno))
1691 1692
			break;

C
Chris Wilson 已提交
1693
		trace_i915_gem_request_retire(ring, request->seqno);
1694 1695 1696 1697 1698 1699
		/* We know the GPU must have read the request to have
		 * sent us the seqno + interrupt, so use the position
		 * of tail of the request to update the last known position
		 * of the GPU head.
		 */
		ring->last_retired_head = request->tail;
1700 1701

		list_del(&request->list);
1702
		i915_gem_request_remove_from_client(request);
1703 1704
		kfree(request);
	}
1705

1706 1707 1708 1709
	/* Move any buffers on the active list that are no longer referenced
	 * by the ringbuffer to the flushing/inactive lists as appropriate.
	 */
	while (!list_empty(&ring->active_list)) {
1710
		struct drm_i915_gem_object *obj;
1711

1712
		obj = list_first_entry(&ring->active_list,
1713 1714
				      struct drm_i915_gem_object,
				      ring_list);
1715

1716
		if (!i915_seqno_passed(seqno, obj->last_rendering_seqno))
1717
			break;
1718

1719
		if (obj->base.write_domain != 0)
1720 1721 1722
			i915_gem_object_move_to_flushing(obj);
		else
			i915_gem_object_move_to_inactive(obj);
1723
	}
1724

C
Chris Wilson 已提交
1725 1726
	if (unlikely(ring->trace_irq_seqno &&
		     i915_seqno_passed(seqno, ring->trace_irq_seqno))) {
1727
		ring->irq_put(ring);
C
Chris Wilson 已提交
1728
		ring->trace_irq_seqno = 0;
1729
	}
1730

C
Chris Wilson 已提交
1731
	WARN_ON(i915_verify_lists(ring->dev));
1732 1733
}

1734 1735 1736 1737
void
i915_gem_retire_requests(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
1738
	int i;
1739

1740
	if (!list_empty(&dev_priv->mm.deferred_free_list)) {
1741
	    struct drm_i915_gem_object *obj, *next;
1742 1743 1744 1745 1746 1747

	    /* We must be careful that during unbind() we do not
	     * accidentally infinitely recurse into retire requests.
	     * Currently:
	     *   retire -> free -> unbind -> wait -> retire_ring
	     */
1748
	    list_for_each_entry_safe(obj, next,
1749
				     &dev_priv->mm.deferred_free_list,
1750
				     mm_list)
1751
		    i915_gem_free_object_tail(obj);
1752 1753
	}

1754
	for (i = 0; i < I915_NUM_RINGS; i++)
C
Chris Wilson 已提交
1755
		i915_gem_retire_requests_ring(&dev_priv->ring[i]);
1756 1757
}

1758
static void
1759 1760 1761 1762
i915_gem_retire_work_handler(struct work_struct *work)
{
	drm_i915_private_t *dev_priv;
	struct drm_device *dev;
1763 1764
	bool idle;
	int i;
1765 1766 1767 1768 1769

	dev_priv = container_of(work, drm_i915_private_t,
				mm.retire_work.work);
	dev = dev_priv->dev;

1770 1771 1772 1773 1774 1775
	/* Come back later if the device is busy... */
	if (!mutex_trylock(&dev->struct_mutex)) {
		queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
		return;
	}

1776
	i915_gem_retire_requests(dev);
1777

1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788
	/* Send a periodic flush down the ring so we don't hold onto GEM
	 * objects indefinitely.
	 */
	idle = true;
	for (i = 0; i < I915_NUM_RINGS; i++) {
		struct intel_ring_buffer *ring = &dev_priv->ring[i];

		if (!list_empty(&ring->gpu_write_list)) {
			struct drm_i915_gem_request *request;
			int ret;

C
Chris Wilson 已提交
1789 1790
			ret = i915_gem_flush_ring(ring,
						  0, I915_GEM_GPU_DOMAINS);
1791 1792
			request = kzalloc(sizeof(*request), GFP_KERNEL);
			if (ret || request == NULL ||
C
Chris Wilson 已提交
1793
			    i915_add_request(ring, NULL, request))
1794 1795 1796 1797 1798 1799 1800
			    kfree(request);
		}

		idle &= list_empty(&ring->request_list);
	}

	if (!dev_priv->mm.suspended && !idle)
1801
		queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
1802

1803 1804 1805
	mutex_unlock(&dev->struct_mutex);
}

C
Chris Wilson 已提交
1806 1807 1808 1809
/**
 * Waits for a sequence number to be signaled, and cleans up the
 * request and object lists appropriately for that event.
 */
1810
int
C
Chris Wilson 已提交
1811
i915_wait_request(struct intel_ring_buffer *ring,
1812 1813
		  uint32_t seqno,
		  bool do_retire)
1814
{
C
Chris Wilson 已提交
1815
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
1816
	u32 ier;
1817 1818 1819 1820
	int ret = 0;

	BUG_ON(seqno == 0);

1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
	if (atomic_read(&dev_priv->mm.wedged)) {
		struct completion *x = &dev_priv->error_completion;
		bool recovery_complete;
		unsigned long flags;

		/* Give the error handler a chance to run. */
		spin_lock_irqsave(&x->wait.lock, flags);
		recovery_complete = x->done > 0;
		spin_unlock_irqrestore(&x->wait.lock, flags);

		return recovery_complete ? -EIO : -EAGAIN;
	}
1833

1834
	if (seqno == ring->outstanding_lazy_request) {
1835 1836 1837 1838
		struct drm_i915_gem_request *request;

		request = kzalloc(sizeof(*request), GFP_KERNEL);
		if (request == NULL)
1839
			return -ENOMEM;
1840

C
Chris Wilson 已提交
1841
		ret = i915_add_request(ring, NULL, request);
1842 1843 1844 1845 1846 1847
		if (ret) {
			kfree(request);
			return ret;
		}

		seqno = request->seqno;
1848
	}
1849

1850
	if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
C
Chris Wilson 已提交
1851
		if (HAS_PCH_SPLIT(ring->dev))
1852 1853 1854
			ier = I915_READ(DEIER) | I915_READ(GTIER);
		else
			ier = I915_READ(IER);
1855 1856 1857
		if (!ier) {
			DRM_ERROR("something (likely vbetool) disabled "
				  "interrupts, re-enabling\n");
1858 1859
			ring->dev->driver->irq_preinstall(ring->dev);
			ring->dev->driver->irq_postinstall(ring->dev);
1860 1861
		}

C
Chris Wilson 已提交
1862
		trace_i915_gem_request_wait_begin(ring, seqno);
C
Chris Wilson 已提交
1863

1864
		ring->waiting_seqno = seqno;
1865
		if (ring->irq_get(ring)) {
1866
			if (dev_priv->mm.interruptible)
1867 1868 1869 1870 1871 1872 1873 1874 1875
				ret = wait_event_interruptible(ring->irq_queue,
							       i915_seqno_passed(ring->get_seqno(ring), seqno)
							       || atomic_read(&dev_priv->mm.wedged));
			else
				wait_event(ring->irq_queue,
					   i915_seqno_passed(ring->get_seqno(ring), seqno)
					   || atomic_read(&dev_priv->mm.wedged));

			ring->irq_put(ring);
1876 1877 1878
		} else if (wait_for_atomic(i915_seqno_passed(ring->get_seqno(ring),
							     seqno) ||
					   atomic_read(&dev_priv->mm.wedged), 3000))
1879
			ret = -EBUSY;
1880
		ring->waiting_seqno = 0;
C
Chris Wilson 已提交
1881

C
Chris Wilson 已提交
1882
		trace_i915_gem_request_wait_end(ring, seqno);
1883
	}
1884
	if (atomic_read(&dev_priv->mm.wedged))
1885
		ret = -EAGAIN;
1886 1887 1888 1889 1890 1891

	/* Directly dispatch request retiring.  While we have the work queue
	 * to handle this, the waiter on a request often wants an associated
	 * buffer to have made it to the inactive list, and we would need
	 * a separate wait queue to handle that.
	 */
1892
	if (ret == 0 && do_retire)
C
Chris Wilson 已提交
1893
		i915_gem_retire_requests_ring(ring);
1894 1895 1896 1897 1898 1899 1900 1901

	return ret;
}

/**
 * Ensures that all rendering to the object has completed and the object is
 * safe to unbind from the GTT or access from the CPU.
 */
1902
int
1903
i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj)
1904 1905 1906
{
	int ret;

1907 1908
	/* This function only exists to support waiting for existing rendering,
	 * not for emitting required flushes.
1909
	 */
1910
	BUG_ON((obj->base.write_domain & I915_GEM_GPU_DOMAINS) != 0);
1911 1912 1913 1914

	/* If there is rendering queued on the buffer being evicted, wait for
	 * it.
	 */
1915
	if (obj->active) {
1916 1917
		ret = i915_wait_request(obj->ring, obj->last_rendering_seqno,
					true);
1918
		if (ret)
1919 1920 1921 1922 1923 1924
			return ret;
	}

	return 0;
}

1925 1926 1927 1928 1929 1930 1931 1932 1933 1934
static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
{
	u32 old_write_domain, old_read_domains;

	/* Act a barrier for all accesses through the GTT */
	mb();

	/* Force a pagefault for domain tracking on next user access */
	i915_gem_release_mmap(obj);

1935 1936 1937
	if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
		return;

1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948
	old_read_domains = obj->base.read_domains;
	old_write_domain = obj->base.write_domain;

	obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT;
	obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT;

	trace_i915_gem_object_change_domain(obj,
					    old_read_domains,
					    old_write_domain);
}

1949 1950 1951
/**
 * Unbinds an object from the GTT aperture.
 */
1952
int
1953
i915_gem_object_unbind(struct drm_i915_gem_object *obj)
1954
{
1955
	drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
1956 1957
	int ret = 0;

1958
	if (obj->gtt_space == NULL)
1959 1960
		return 0;

1961
	if (obj->pin_count != 0) {
1962 1963 1964 1965
		DRM_ERROR("Attempting to unbind pinned buffer\n");
		return -EINVAL;
	}

1966 1967 1968 1969 1970 1971 1972 1973
	ret = i915_gem_object_finish_gpu(obj);
	if (ret == -ERESTARTSYS)
		return ret;
	/* Continue on if we fail due to EIO, the GPU is hung so we
	 * should be safe and we need to cleanup or else we might
	 * cause memory corruption through use-after-free.
	 */

1974
	i915_gem_object_finish_gtt(obj);
1975

1976 1977
	/* Move the object to the CPU domain to ensure that
	 * any possible CPU writes while it's not in the GTT
1978
	 * are flushed when we go to remap it.
1979
	 */
1980 1981
	if (ret == 0)
		ret = i915_gem_object_set_to_cpu_domain(obj, 1);
1982
	if (ret == -ERESTARTSYS)
1983
		return ret;
1984
	if (ret) {
1985 1986 1987
		/* In the event of a disaster, abandon all caches and
		 * hope for the best.
		 */
1988
		i915_gem_clflush_object(obj);
1989
		obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
1990
	}
1991

1992
	/* release the fence reg _after_ flushing */
1993 1994 1995
	ret = i915_gem_object_put_fence(obj);
	if (ret == -ERESTARTSYS)
		return ret;
1996

C
Chris Wilson 已提交
1997 1998
	trace_i915_gem_object_unbind(obj);

1999 2000
	if (obj->has_global_gtt_mapping)
		i915_gem_gtt_unbind_object(obj);
2001 2002 2003 2004
	if (obj->has_aliasing_ppgtt_mapping) {
		i915_ppgtt_unbind_object(dev_priv->mm.aliasing_ppgtt, obj);
		obj->has_aliasing_ppgtt_mapping = 0;
	}
2005
	i915_gem_gtt_finish_object(obj);
2006

2007
	i915_gem_object_put_pages_gtt(obj);
2008

2009
	list_del_init(&obj->gtt_list);
2010
	list_del_init(&obj->mm_list);
2011
	/* Avoid an unnecessary call to unbind on rebind. */
2012
	obj->map_and_fenceable = true;
2013

2014 2015 2016
	drm_mm_put_block(obj->gtt_space);
	obj->gtt_space = NULL;
	obj->gtt_offset = 0;
2017

2018
	if (i915_gem_object_is_purgeable(obj))
2019 2020
		i915_gem_object_truncate(obj);

2021
	return ret;
2022 2023
}

2024
int
C
Chris Wilson 已提交
2025
i915_gem_flush_ring(struct intel_ring_buffer *ring,
2026 2027 2028
		    uint32_t invalidate_domains,
		    uint32_t flush_domains)
{
2029 2030
	int ret;

2031 2032 2033
	if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0)
		return 0;

C
Chris Wilson 已提交
2034 2035
	trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains);

2036 2037 2038 2039
	ret = ring->flush(ring, invalidate_domains, flush_domains);
	if (ret)
		return ret;

2040 2041 2042
	if (flush_domains & I915_GEM_GPU_DOMAINS)
		i915_gem_process_flushing_list(ring, flush_domains);

2043
	return 0;
2044 2045
}

2046
static int i915_ring_idle(struct intel_ring_buffer *ring, bool do_retire)
2047
{
2048 2049
	int ret;

2050
	if (list_empty(&ring->gpu_write_list) && list_empty(&ring->active_list))
2051 2052
		return 0;

2053
	if (!list_empty(&ring->gpu_write_list)) {
C
Chris Wilson 已提交
2054
		ret = i915_gem_flush_ring(ring,
2055
				    I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
2056 2057 2058 2059
		if (ret)
			return ret;
	}

2060 2061
	return i915_wait_request(ring, i915_gem_next_request_seqno(ring),
				 do_retire);
2062 2063
}

2064
int i915_gpu_idle(struct drm_device *dev, bool do_retire)
2065 2066
{
	drm_i915_private_t *dev_priv = dev->dev_private;
2067
	int ret, i;
2068 2069

	/* Flush everything onto the inactive list. */
2070
	for (i = 0; i < I915_NUM_RINGS; i++) {
2071
		ret = i915_ring_idle(&dev_priv->ring[i], do_retire);
2072 2073 2074
		if (ret)
			return ret;
	}
2075

2076
	return 0;
2077 2078
}

2079 2080
static int sandybridge_write_fence_reg(struct drm_i915_gem_object *obj,
				       struct intel_ring_buffer *pipelined)
2081
{
2082
	struct drm_device *dev = obj->base.dev;
2083
	drm_i915_private_t *dev_priv = dev->dev_private;
2084 2085
	u32 size = obj->gtt_space->size;
	int regnum = obj->fence_reg;
2086 2087
	uint64_t val;

2088
	val = (uint64_t)((obj->gtt_offset + size - 4096) &
2089
			 0xfffff000) << 32;
2090 2091
	val |= obj->gtt_offset & 0xfffff000;
	val |= (uint64_t)((obj->stride / 128) - 1) <<
2092 2093
		SANDYBRIDGE_FENCE_PITCH_SHIFT;

2094
	if (obj->tiling_mode == I915_TILING_Y)
2095 2096 2097
		val |= 1 << I965_FENCE_TILING_Y_SHIFT;
	val |= I965_FENCE_REG_VALID;

2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113
	if (pipelined) {
		int ret = intel_ring_begin(pipelined, 6);
		if (ret)
			return ret;

		intel_ring_emit(pipelined, MI_NOOP);
		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
		intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8);
		intel_ring_emit(pipelined, (u32)val);
		intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8 + 4);
		intel_ring_emit(pipelined, (u32)(val >> 32));
		intel_ring_advance(pipelined);
	} else
		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + regnum * 8, val);

	return 0;
2114 2115
}

2116 2117
static int i965_write_fence_reg(struct drm_i915_gem_object *obj,
				struct intel_ring_buffer *pipelined)
2118
{
2119
	struct drm_device *dev = obj->base.dev;
2120
	drm_i915_private_t *dev_priv = dev->dev_private;
2121 2122
	u32 size = obj->gtt_space->size;
	int regnum = obj->fence_reg;
2123 2124
	uint64_t val;

2125
	val = (uint64_t)((obj->gtt_offset + size - 4096) &
2126
		    0xfffff000) << 32;
2127 2128 2129
	val |= obj->gtt_offset & 0xfffff000;
	val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT;
	if (obj->tiling_mode == I915_TILING_Y)
2130 2131 2132
		val |= 1 << I965_FENCE_TILING_Y_SHIFT;
	val |= I965_FENCE_REG_VALID;

2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148
	if (pipelined) {
		int ret = intel_ring_begin(pipelined, 6);
		if (ret)
			return ret;

		intel_ring_emit(pipelined, MI_NOOP);
		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
		intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8);
		intel_ring_emit(pipelined, (u32)val);
		intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8 + 4);
		intel_ring_emit(pipelined, (u32)(val >> 32));
		intel_ring_advance(pipelined);
	} else
		I915_WRITE64(FENCE_REG_965_0 + regnum * 8, val);

	return 0;
2149 2150
}

2151 2152
static int i915_write_fence_reg(struct drm_i915_gem_object *obj,
				struct intel_ring_buffer *pipelined)
2153
{
2154
	struct drm_device *dev = obj->base.dev;
2155
	drm_i915_private_t *dev_priv = dev->dev_private;
2156
	u32 size = obj->gtt_space->size;
2157
	u32 fence_reg, val, pitch_val;
2158
	int tile_width;
2159

2160 2161 2162 2163 2164 2165
	if (WARN((obj->gtt_offset & ~I915_FENCE_START_MASK) ||
		 (size & -size) != size ||
		 (obj->gtt_offset & (size - 1)),
		 "object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
		 obj->gtt_offset, obj->map_and_fenceable, size))
		return -EINVAL;
2166

2167
	if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
2168
		tile_width = 128;
2169
	else
2170 2171 2172
		tile_width = 512;

	/* Note: pitch better be a power of two tile widths */
2173
	pitch_val = obj->stride / tile_width;
2174
	pitch_val = ffs(pitch_val) - 1;
2175

2176 2177
	val = obj->gtt_offset;
	if (obj->tiling_mode == I915_TILING_Y)
2178
		val |= 1 << I830_FENCE_TILING_Y_SHIFT;
2179
	val |= I915_FENCE_SIZE_BITS(size);
2180 2181 2182
	val |= pitch_val << I830_FENCE_PITCH_SHIFT;
	val |= I830_FENCE_REG_VALID;

2183
	fence_reg = obj->fence_reg;
2184 2185
	if (fence_reg < 8)
		fence_reg = FENCE_REG_830_0 + fence_reg * 4;
2186
	else
2187
		fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202

	if (pipelined) {
		int ret = intel_ring_begin(pipelined, 4);
		if (ret)
			return ret;

		intel_ring_emit(pipelined, MI_NOOP);
		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
		intel_ring_emit(pipelined, fence_reg);
		intel_ring_emit(pipelined, val);
		intel_ring_advance(pipelined);
	} else
		I915_WRITE(fence_reg, val);

	return 0;
2203 2204
}

2205 2206
static int i830_write_fence_reg(struct drm_i915_gem_object *obj,
				struct intel_ring_buffer *pipelined)
2207
{
2208
	struct drm_device *dev = obj->base.dev;
2209
	drm_i915_private_t *dev_priv = dev->dev_private;
2210 2211
	u32 size = obj->gtt_space->size;
	int regnum = obj->fence_reg;
2212 2213 2214
	uint32_t val;
	uint32_t pitch_val;

2215 2216 2217 2218 2219 2220
	if (WARN((obj->gtt_offset & ~I830_FENCE_START_MASK) ||
		 (size & -size) != size ||
		 (obj->gtt_offset & (size - 1)),
		 "object 0x%08x not 512K or pot-size 0x%08x aligned\n",
		 obj->gtt_offset, size))
		return -EINVAL;
2221

2222
	pitch_val = obj->stride / 128;
2223 2224
	pitch_val = ffs(pitch_val) - 1;

2225 2226
	val = obj->gtt_offset;
	if (obj->tiling_mode == I915_TILING_Y)
2227
		val |= 1 << I830_FENCE_TILING_Y_SHIFT;
2228
	val |= I830_FENCE_SIZE_BITS(size);
2229 2230 2231
	val |= pitch_val << I830_FENCE_PITCH_SHIFT;
	val |= I830_FENCE_REG_VALID;

2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245
	if (pipelined) {
		int ret = intel_ring_begin(pipelined, 4);
		if (ret)
			return ret;

		intel_ring_emit(pipelined, MI_NOOP);
		intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
		intel_ring_emit(pipelined, FENCE_REG_830_0 + regnum*4);
		intel_ring_emit(pipelined, val);
		intel_ring_advance(pipelined);
	} else
		I915_WRITE(FENCE_REG_830_0 + regnum * 4, val);

	return 0;
2246 2247
}

2248 2249 2250 2251 2252 2253 2254
static bool ring_passed_seqno(struct intel_ring_buffer *ring, u32 seqno)
{
	return i915_seqno_passed(ring->get_seqno(ring), seqno);
}

static int
i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
2255
			    struct intel_ring_buffer *pipelined)
2256 2257 2258 2259
{
	int ret;

	if (obj->fenced_gpu_access) {
2260
		if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
C
Chris Wilson 已提交
2261
			ret = i915_gem_flush_ring(obj->last_fenced_ring,
2262 2263 2264 2265
						  0, obj->base.write_domain);
			if (ret)
				return ret;
		}
2266 2267 2268 2269 2270 2271 2272

		obj->fenced_gpu_access = false;
	}

	if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) {
		if (!ring_passed_seqno(obj->last_fenced_ring,
				       obj->last_fenced_seqno)) {
C
Chris Wilson 已提交
2273
			ret = i915_wait_request(obj->last_fenced_ring,
2274 2275
						obj->last_fenced_seqno,
						true);
2276 2277 2278 2279 2280 2281 2282 2283
			if (ret)
				return ret;
		}

		obj->last_fenced_seqno = 0;
		obj->last_fenced_ring = NULL;
	}

2284 2285 2286 2287 2288 2289
	/* Ensure that all CPU reads are completed before installing a fence
	 * and all writes before removing the fence.
	 */
	if (obj->base.read_domains & I915_GEM_DOMAIN_GTT)
		mb();

2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300
	return 0;
}

int
i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
{
	int ret;

	if (obj->tiling_mode)
		i915_gem_release_mmap(obj);

2301
	ret = i915_gem_object_flush_fence(obj, NULL);
2302 2303 2304 2305 2306
	if (ret)
		return ret;

	if (obj->fence_reg != I915_FENCE_REG_NONE) {
		struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
2307 2308

		WARN_ON(dev_priv->fence_regs[obj->fence_reg].pin_count);
2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320
		i915_gem_clear_fence_reg(obj->base.dev,
					 &dev_priv->fence_regs[obj->fence_reg]);

		obj->fence_reg = I915_FENCE_REG_NONE;
	}

	return 0;
}

static struct drm_i915_fence_reg *
i915_find_fence_reg(struct drm_device *dev,
		    struct intel_ring_buffer *pipelined)
2321 2322
{
	struct drm_i915_private *dev_priv = dev->dev_private;
2323 2324
	struct drm_i915_fence_reg *reg, *first, *avail;
	int i;
2325 2326

	/* First try to find a free reg */
2327
	avail = NULL;
2328 2329 2330
	for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
		reg = &dev_priv->fence_regs[i];
		if (!reg->obj)
2331
			return reg;
2332

2333
		if (!reg->pin_count)
2334
			avail = reg;
2335 2336
	}

2337 2338
	if (avail == NULL)
		return NULL;
2339 2340

	/* None available, try to steal one or wait for a user to finish */
2341 2342
	avail = first = NULL;
	list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
2343
		if (reg->pin_count)
2344 2345
			continue;

2346 2347 2348 2349 2350 2351 2352 2353 2354
		if (first == NULL)
			first = reg;

		if (!pipelined ||
		    !reg->obj->last_fenced_ring ||
		    reg->obj->last_fenced_ring == pipelined) {
			avail = reg;
			break;
		}
2355 2356
	}

2357 2358
	if (avail == NULL)
		avail = first;
2359

2360
	return avail;
2361 2362
}

2363
/**
2364
 * i915_gem_object_get_fence - set up a fence reg for an object
2365
 * @obj: object to map through a fence reg
2366 2367
 * @pipelined: ring on which to queue the change, or NULL for CPU access
 * @interruptible: must we wait uninterruptibly for the register to retire?
2368 2369 2370 2371 2372 2373 2374 2375 2376 2377
 *
 * When mapping objects through the GTT, userspace wants to be able to write
 * to them without having to worry about swizzling if the object is tiled.
 *
 * This function walks the fence regs looking for a free one for @obj,
 * stealing one if it can't find any.
 *
 * It then sets up the reg based on the object's properties: address, pitch
 * and tiling format.
 */
2378
int
2379
i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
2380
			  struct intel_ring_buffer *pipelined)
2381
{
2382
	struct drm_device *dev = obj->base.dev;
J
Jesse Barnes 已提交
2383
	struct drm_i915_private *dev_priv = dev->dev_private;
2384
	struct drm_i915_fence_reg *reg;
2385
	int ret;
2386

2387 2388 2389
	/* XXX disable pipelining. There are bugs. Shocking. */
	pipelined = NULL;

2390
	/* Just update our place in the LRU if our fence is getting reused. */
2391 2392
	if (obj->fence_reg != I915_FENCE_REG_NONE) {
		reg = &dev_priv->fence_regs[obj->fence_reg];
2393
		list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
2394

2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411
		if (obj->tiling_changed) {
			ret = i915_gem_object_flush_fence(obj, pipelined);
			if (ret)
				return ret;

			if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
				pipelined = NULL;

			if (pipelined) {
				reg->setup_seqno =
					i915_gem_next_request_seqno(pipelined);
				obj->last_fenced_seqno = reg->setup_seqno;
				obj->last_fenced_ring = pipelined;
			}

			goto update;
		}
2412 2413 2414 2415 2416

		if (!pipelined) {
			if (reg->setup_seqno) {
				if (!ring_passed_seqno(obj->last_fenced_ring,
						       reg->setup_seqno)) {
C
Chris Wilson 已提交
2417
					ret = i915_wait_request(obj->last_fenced_ring,
2418 2419
								reg->setup_seqno,
								true);
2420 2421 2422 2423 2424 2425 2426 2427
					if (ret)
						return ret;
				}

				reg->setup_seqno = 0;
			}
		} else if (obj->last_fenced_ring &&
			   obj->last_fenced_ring != pipelined) {
2428
			ret = i915_gem_object_flush_fence(obj, pipelined);
2429 2430 2431 2432
			if (ret)
				return ret;
		}

2433 2434 2435
		return 0;
	}

2436 2437
	reg = i915_find_fence_reg(dev, pipelined);
	if (reg == NULL)
2438
		return -EDEADLK;
2439

2440
	ret = i915_gem_object_flush_fence(obj, pipelined);
2441
	if (ret)
2442
		return ret;
2443

2444 2445 2446 2447 2448 2449 2450 2451
	if (reg->obj) {
		struct drm_i915_gem_object *old = reg->obj;

		drm_gem_object_reference(&old->base);

		if (old->tiling_mode)
			i915_gem_release_mmap(old);

2452
		ret = i915_gem_object_flush_fence(old, pipelined);
2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463
		if (ret) {
			drm_gem_object_unreference(&old->base);
			return ret;
		}

		if (old->last_fenced_seqno == 0 && obj->last_fenced_seqno == 0)
			pipelined = NULL;

		old->fence_reg = I915_FENCE_REG_NONE;
		old->last_fenced_ring = pipelined;
		old->last_fenced_seqno =
C
Chris Wilson 已提交
2464
			pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
2465 2466 2467 2468

		drm_gem_object_unreference(&old->base);
	} else if (obj->last_fenced_seqno == 0)
		pipelined = NULL;
2469

2470
	reg->obj = obj;
2471 2472 2473
	list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
	obj->fence_reg = reg - dev_priv->fence_regs;
	obj->last_fenced_ring = pipelined;
2474

2475
	reg->setup_seqno =
C
Chris Wilson 已提交
2476
		pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
2477 2478 2479 2480
	obj->last_fenced_seqno = reg->setup_seqno;

update:
	obj->tiling_changed = false;
2481
	switch (INTEL_INFO(dev)->gen) {
2482
	case 7:
2483
	case 6:
2484
		ret = sandybridge_write_fence_reg(obj, pipelined);
2485 2486 2487
		break;
	case 5:
	case 4:
2488
		ret = i965_write_fence_reg(obj, pipelined);
2489 2490
		break;
	case 3:
2491
		ret = i915_write_fence_reg(obj, pipelined);
2492 2493
		break;
	case 2:
2494
		ret = i830_write_fence_reg(obj, pipelined);
2495 2496
		break;
	}
2497

2498
	return ret;
2499 2500 2501 2502 2503 2504 2505
}

/**
 * i915_gem_clear_fence_reg - clear out fence register info
 * @obj: object to clear
 *
 * Zeroes out the fence register itself and clears out the associated
2506
 * data structures in dev_priv and obj.
2507 2508
 */
static void
2509 2510
i915_gem_clear_fence_reg(struct drm_device *dev,
			 struct drm_i915_fence_reg *reg)
2511
{
J
Jesse Barnes 已提交
2512
	drm_i915_private_t *dev_priv = dev->dev_private;
2513
	uint32_t fence_reg = reg - dev_priv->fence_regs;
2514

2515
	switch (INTEL_INFO(dev)->gen) {
2516
	case 7:
2517
	case 6:
2518
		I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + fence_reg*8, 0);
2519 2520 2521
		break;
	case 5:
	case 4:
2522
		I915_WRITE64(FENCE_REG_965_0 + fence_reg*8, 0);
2523 2524
		break;
	case 3:
2525 2526
		if (fence_reg >= 8)
			fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
2527
		else
2528
	case 2:
2529
			fence_reg = FENCE_REG_830_0 + fence_reg * 4;
2530 2531

		I915_WRITE(fence_reg, 0);
2532
		break;
2533
	}
2534

2535
	list_del_init(&reg->lru_list);
2536 2537
	reg->obj = NULL;
	reg->setup_seqno = 0;
2538
	reg->pin_count = 0;
2539 2540
}

2541 2542 2543 2544
/**
 * Finds free space in the GTT aperture and binds the object there.
 */
static int
2545
i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2546
			    unsigned alignment,
2547
			    bool map_and_fenceable)
2548
{
2549
	struct drm_device *dev = obj->base.dev;
2550 2551
	drm_i915_private_t *dev_priv = dev->dev_private;
	struct drm_mm_node *free_space;
2552
	gfp_t gfpmask = __GFP_NORETRY | __GFP_NOWARN;
2553
	u32 size, fence_size, fence_alignment, unfenced_alignment;
2554
	bool mappable, fenceable;
2555
	int ret;
2556

2557
	if (obj->madv != I915_MADV_WILLNEED) {
2558 2559 2560 2561
		DRM_ERROR("Attempting to bind a purgeable object\n");
		return -EINVAL;
	}

2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
	fence_size = i915_gem_get_gtt_size(dev,
					   obj->base.size,
					   obj->tiling_mode);
	fence_alignment = i915_gem_get_gtt_alignment(dev,
						     obj->base.size,
						     obj->tiling_mode);
	unfenced_alignment =
		i915_gem_get_unfenced_gtt_alignment(dev,
						    obj->base.size,
						    obj->tiling_mode);
2572

2573
	if (alignment == 0)
2574 2575
		alignment = map_and_fenceable ? fence_alignment :
						unfenced_alignment;
2576
	if (map_and_fenceable && alignment & (fence_alignment - 1)) {
2577 2578 2579 2580
		DRM_ERROR("Invalid object alignment requested %u\n", alignment);
		return -EINVAL;
	}

2581
	size = map_and_fenceable ? fence_size : obj->base.size;
2582

2583 2584 2585
	/* If the object is bigger than the entire aperture, reject it early
	 * before evicting everything in a vain attempt to find space.
	 */
2586
	if (obj->base.size >
2587
	    (map_and_fenceable ? dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
2588 2589 2590 2591
		DRM_ERROR("Attempting to bind an object larger than the aperture\n");
		return -E2BIG;
	}

2592
 search_free:
2593
	if (map_and_fenceable)
2594 2595
		free_space =
			drm_mm_search_free_in_range(&dev_priv->mm.gtt_space,
2596
						    size, alignment, 0,
2597 2598 2599 2600
						    dev_priv->mm.gtt_mappable_end,
						    0);
	else
		free_space = drm_mm_search_free(&dev_priv->mm.gtt_space,
2601
						size, alignment, 0);
2602 2603

	if (free_space != NULL) {
2604
		if (map_and_fenceable)
2605
			obj->gtt_space =
2606
				drm_mm_get_block_range_generic(free_space,
2607
							       size, alignment, 0,
2608 2609 2610
							       dev_priv->mm.gtt_mappable_end,
							       0);
		else
2611
			obj->gtt_space =
2612
				drm_mm_get_block(free_space, size, alignment);
2613
	}
2614
	if (obj->gtt_space == NULL) {
2615 2616 2617
		/* If the gtt is empty and we're still having trouble
		 * fitting our object in, we're out of memory.
		 */
2618 2619
		ret = i915_gem_evict_something(dev, size, alignment,
					       map_and_fenceable);
2620
		if (ret)
2621
			return ret;
2622

2623 2624 2625
		goto search_free;
	}

2626
	ret = i915_gem_object_get_pages_gtt(obj, gfpmask);
2627
	if (ret) {
2628 2629
		drm_mm_put_block(obj->gtt_space);
		obj->gtt_space = NULL;
2630 2631

		if (ret == -ENOMEM) {
2632 2633
			/* first try to reclaim some memory by clearing the GTT */
			ret = i915_gem_evict_everything(dev, false);
2634 2635
			if (ret) {
				/* now try to shrink everyone else */
2636 2637 2638
				if (gfpmask) {
					gfpmask = 0;
					goto search_free;
2639 2640
				}

2641
				return -ENOMEM;
2642 2643 2644 2645 2646
			}

			goto search_free;
		}

2647 2648 2649
		return ret;
	}

2650
	ret = i915_gem_gtt_prepare_object(obj);
2651
	if (ret) {
2652
		i915_gem_object_put_pages_gtt(obj);
2653 2654
		drm_mm_put_block(obj->gtt_space);
		obj->gtt_space = NULL;
2655

2656
		if (i915_gem_evict_everything(dev, false))
2657 2658 2659
			return ret;

		goto search_free;
2660
	}
2661 2662 2663

	if (!dev_priv->mm.aliasing_ppgtt)
		i915_gem_gtt_bind_object(obj, obj->cache_level);
2664

2665
	list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list);
2666
	list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2667

2668 2669 2670 2671
	/* Assert that the object is not currently in any GPU domain. As it
	 * wasn't in the GTT, there shouldn't be any way it could have been in
	 * a GPU cache
	 */
2672 2673
	BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
	BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
2674

2675
	obj->gtt_offset = obj->gtt_space->start;
C
Chris Wilson 已提交
2676

2677
	fenceable =
2678
		obj->gtt_space->size == fence_size &&
2679
		(obj->gtt_space->start & (fence_alignment - 1)) == 0;
2680

2681
	mappable =
2682
		obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
2683

2684
	obj->map_and_fenceable = mappable && fenceable;
2685

C
Chris Wilson 已提交
2686
	trace_i915_gem_object_bind(obj, map_and_fenceable);
2687 2688 2689 2690
	return 0;
}

void
2691
i915_gem_clflush_object(struct drm_i915_gem_object *obj)
2692 2693 2694 2695 2696
{
	/* If we don't have a page list set up, then we're not pinned
	 * to GPU, and we can ignore the cache flush because it'll happen
	 * again at bind time.
	 */
2697
	if (obj->pages == NULL)
2698 2699
		return;

2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710
	/* If the GPU is snooping the contents of the CPU cache,
	 * we do not need to manually clear the CPU cache lines.  However,
	 * the caches are only snooped when the render cache is
	 * flushed/invalidated.  As we always have to emit invalidations
	 * and flushes when moving into and out of the RENDER domain, correct
	 * snooping behaviour occurs naturally as the result of our domain
	 * tracking.
	 */
	if (obj->cache_level != I915_CACHE_NONE)
		return;

C
Chris Wilson 已提交
2711
	trace_i915_gem_object_clflush(obj);
2712

2713
	drm_clflush_pages(obj->pages, obj->base.size / PAGE_SIZE);
2714 2715
}

2716
/** Flushes any GPU write domain for the object if it's dirty. */
2717
static int
2718
i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj)
2719
{
2720
	if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0)
2721
		return 0;
2722 2723

	/* Queue the GPU write cache flushing we need. */
C
Chris Wilson 已提交
2724
	return i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
2725 2726 2727 2728
}

/** Flushes the GTT write domain for the object if it's dirty. */
static void
2729
i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
2730
{
C
Chris Wilson 已提交
2731 2732
	uint32_t old_write_domain;

2733
	if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
2734 2735
		return;

2736
	/* No actual flushing is required for the GTT write domain.  Writes
2737 2738
	 * to it immediately go to main memory as far as we know, so there's
	 * no chipset flush.  It also doesn't land in render cache.
2739 2740 2741 2742
	 *
	 * However, we do have to enforce the order so that all writes through
	 * the GTT land before any writes to the device, such as updates to
	 * the GATT itself.
2743
	 */
2744 2745
	wmb();

2746 2747
	old_write_domain = obj->base.write_domain;
	obj->base.write_domain = 0;
C
Chris Wilson 已提交
2748 2749

	trace_i915_gem_object_change_domain(obj,
2750
					    obj->base.read_domains,
C
Chris Wilson 已提交
2751
					    old_write_domain);
2752 2753 2754 2755
}

/** Flushes the CPU write domain for the object if it's dirty. */
static void
2756
i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
2757
{
C
Chris Wilson 已提交
2758
	uint32_t old_write_domain;
2759

2760
	if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
2761 2762 2763
		return;

	i915_gem_clflush_object(obj);
2764
	intel_gtt_chipset_flush();
2765 2766
	old_write_domain = obj->base.write_domain;
	obj->base.write_domain = 0;
C
Chris Wilson 已提交
2767 2768

	trace_i915_gem_object_change_domain(obj,
2769
					    obj->base.read_domains,
C
Chris Wilson 已提交
2770
					    old_write_domain);
2771 2772
}

2773 2774 2775 2776 2777 2778
/**
 * Moves a single object to the GTT read, and possibly write domain.
 *
 * This function returns when the move is complete, including waiting on
 * flushes to occur.
 */
J
Jesse Barnes 已提交
2779
int
2780
i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
2781
{
C
Chris Wilson 已提交
2782
	uint32_t old_write_domain, old_read_domains;
2783
	int ret;
2784

2785
	/* Not valid to be called on unbound objects. */
2786
	if (obj->gtt_space == NULL)
2787 2788
		return -EINVAL;

2789 2790 2791
	if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
		return 0;

2792 2793 2794 2795
	ret = i915_gem_object_flush_gpu_write_domain(obj);
	if (ret)
		return ret;

2796
	if (obj->pending_gpu_write || write) {
2797
		ret = i915_gem_object_wait_rendering(obj);
2798 2799 2800
		if (ret)
			return ret;
	}
2801

2802
	i915_gem_object_flush_cpu_write_domain(obj);
C
Chris Wilson 已提交
2803

2804 2805
	old_write_domain = obj->base.write_domain;
	old_read_domains = obj->base.read_domains;
C
Chris Wilson 已提交
2806

2807 2808 2809
	/* It should now be out of any other write domains, and we can update
	 * the domain values for our changes.
	 */
2810 2811
	BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
	obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
2812
	if (write) {
2813 2814 2815
		obj->base.read_domains = I915_GEM_DOMAIN_GTT;
		obj->base.write_domain = I915_GEM_DOMAIN_GTT;
		obj->dirty = 1;
2816 2817
	}

C
Chris Wilson 已提交
2818 2819 2820 2821
	trace_i915_gem_object_change_domain(obj,
					    old_read_domains,
					    old_write_domain);

2822 2823 2824
	return 0;
}

2825 2826 2827
int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
				    enum i915_cache_level cache_level)
{
2828 2829
	struct drm_device *dev = obj->base.dev;
	drm_i915_private_t *dev_priv = dev->dev_private;
2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856
	int ret;

	if (obj->cache_level == cache_level)
		return 0;

	if (obj->pin_count) {
		DRM_DEBUG("can not change the cache level of pinned objects\n");
		return -EBUSY;
	}

	if (obj->gtt_space) {
		ret = i915_gem_object_finish_gpu(obj);
		if (ret)
			return ret;

		i915_gem_object_finish_gtt(obj);

		/* Before SandyBridge, you could not use tiling or fence
		 * registers with snooped memory, so relinquish any fences
		 * currently pointing to our region in the aperture.
		 */
		if (INTEL_INFO(obj->base.dev)->gen < 6) {
			ret = i915_gem_object_put_fence(obj);
			if (ret)
				return ret;
		}

2857 2858
		if (obj->has_global_gtt_mapping)
			i915_gem_gtt_bind_object(obj, cache_level);
2859 2860 2861
		if (obj->has_aliasing_ppgtt_mapping)
			i915_ppgtt_bind_object(dev_priv->mm.aliasing_ppgtt,
					       obj, cache_level);
2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890
	}

	if (cache_level == I915_CACHE_NONE) {
		u32 old_read_domains, old_write_domain;

		/* If we're coming from LLC cached, then we haven't
		 * actually been tracking whether the data is in the
		 * CPU cache or not, since we only allow one bit set
		 * in obj->write_domain and have been skipping the clflushes.
		 * Just set it to the CPU cache for now.
		 */
		WARN_ON(obj->base.write_domain & ~I915_GEM_DOMAIN_CPU);
		WARN_ON(obj->base.read_domains & ~I915_GEM_DOMAIN_CPU);

		old_read_domains = obj->base.read_domains;
		old_write_domain = obj->base.write_domain;

		obj->base.read_domains = I915_GEM_DOMAIN_CPU;
		obj->base.write_domain = I915_GEM_DOMAIN_CPU;

		trace_i915_gem_object_change_domain(obj,
						    old_read_domains,
						    old_write_domain);
	}

	obj->cache_level = cache_level;
	return 0;
}

2891
/*
2892 2893 2894 2895 2896 2897 2898 2899
 * Prepare buffer for display plane (scanout, cursors, etc).
 * Can be called from an uninterruptible phase (modesetting) and allows
 * any flushes to be pipelined (for pageflips).
 *
 * For the display plane, we want to be in the GTT but out of any write
 * domains. So in many ways this looks like set_to_gtt_domain() apart from the
 * ability to pipeline the waits, pinning and any additional subtleties
 * that may differentiate the display plane from ordinary buffers.
2900 2901
 */
int
2902 2903
i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
				     u32 alignment,
2904
				     struct intel_ring_buffer *pipelined)
2905
{
2906
	u32 old_read_domains, old_write_domain;
2907 2908
	int ret;

2909 2910 2911 2912
	ret = i915_gem_object_flush_gpu_write_domain(obj);
	if (ret)
		return ret;

2913
	if (pipelined != obj->ring) {
2914
		ret = i915_gem_object_wait_rendering(obj);
2915
		if (ret == -ERESTARTSYS)
2916 2917 2918
			return ret;
	}

2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931
	/* The display engine is not coherent with the LLC cache on gen6.  As
	 * a result, we make sure that the pinning that is about to occur is
	 * done with uncached PTEs. This is lowest common denominator for all
	 * chipsets.
	 *
	 * However for gen6+, we could do better by using the GFDT bit instead
	 * of uncaching, which would allow us to flush all the LLC-cached data
	 * with that bit in the PTE to main memory with just one PIPE_CONTROL.
	 */
	ret = i915_gem_object_set_cache_level(obj, I915_CACHE_NONE);
	if (ret)
		return ret;

2932 2933 2934 2935 2936 2937 2938 2939
	/* As the user may map the buffer once pinned in the display plane
	 * (e.g. libkms for the bootup splash), we have to ensure that we
	 * always use map_and_fenceable for all scanout buffers.
	 */
	ret = i915_gem_object_pin(obj, alignment, true);
	if (ret)
		return ret;

2940 2941
	i915_gem_object_flush_cpu_write_domain(obj);

2942
	old_write_domain = obj->base.write_domain;
2943
	old_read_domains = obj->base.read_domains;
2944 2945 2946 2947 2948

	/* It should now be out of any other write domains, and we can update
	 * the domain values for our changes.
	 */
	BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
2949
	obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
2950 2951 2952

	trace_i915_gem_object_change_domain(obj,
					    old_read_domains,
2953
					    old_write_domain);
2954 2955 2956 2957

	return 0;
}

2958
int
2959
i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
2960
{
2961 2962
	int ret;

2963
	if ((obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0)
2964 2965
		return 0;

2966
	if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
C
Chris Wilson 已提交
2967
		ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
2968 2969 2970
		if (ret)
			return ret;
	}
2971

2972 2973 2974 2975
	ret = i915_gem_object_wait_rendering(obj);
	if (ret)
		return ret;

2976 2977
	/* Ensure that we invalidate the GPU's caches and TLBs. */
	obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
2978
	return 0;
2979 2980
}

2981 2982 2983 2984 2985 2986
/**
 * Moves a single object to the CPU read, and possibly write domain.
 *
 * This function returns when the move is complete, including waiting on
 * flushes to occur.
 */
2987
int
2988
i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
2989
{
C
Chris Wilson 已提交
2990
	uint32_t old_write_domain, old_read_domains;
2991 2992
	int ret;

2993 2994 2995
	if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
		return 0;

2996 2997 2998 2999
	ret = i915_gem_object_flush_gpu_write_domain(obj);
	if (ret)
		return ret;

3000
	ret = i915_gem_object_wait_rendering(obj);
3001
	if (ret)
3002
		return ret;
3003

3004
	i915_gem_object_flush_gtt_write_domain(obj);
3005

3006 3007
	old_write_domain = obj->base.write_domain;
	old_read_domains = obj->base.read_domains;
C
Chris Wilson 已提交
3008

3009
	/* Flush the CPU cache if it's still invalid. */
3010
	if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
3011 3012
		i915_gem_clflush_object(obj);

3013
		obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
3014 3015 3016 3017 3018
	}

	/* It should now be out of any other write domains, and we can update
	 * the domain values for our changes.
	 */
3019
	BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
3020 3021 3022 3023 3024

	/* If we're writing through the CPU, then the GPU read domains will
	 * need to be invalidated at next use.
	 */
	if (write) {
3025 3026
		obj->base.read_domains = I915_GEM_DOMAIN_CPU;
		obj->base.write_domain = I915_GEM_DOMAIN_CPU;
3027
	}
3028

C
Chris Wilson 已提交
3029 3030 3031 3032
	trace_i915_gem_object_change_domain(obj,
					    old_read_domains,
					    old_write_domain);

3033 3034 3035
	return 0;
}

3036 3037 3038
/* Throttle our rendering by waiting until the ring has completed our requests
 * emitted over 20 msec ago.
 *
3039 3040 3041 3042
 * Note that if we were to use the current jiffies each time around the loop,
 * we wouldn't escape the function with any frames outstanding if the time to
 * render a frame was over 20ms.
 *
3043 3044 3045
 * This should get us reasonable parallelism between CPU and GPU but also
 * relatively low latency when blocking on a particular request to finish.
 */
3046
static int
3047
i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
3048
{
3049 3050
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_file_private *file_priv = file->driver_priv;
3051
	unsigned long recent_enough = jiffies - msecs_to_jiffies(20);
3052 3053 3054 3055
	struct drm_i915_gem_request *request;
	struct intel_ring_buffer *ring = NULL;
	u32 seqno = 0;
	int ret;
3056

3057 3058 3059
	if (atomic_read(&dev_priv->mm.wedged))
		return -EIO;

3060
	spin_lock(&file_priv->mm.lock);
3061
	list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
3062 3063
		if (time_after_eq(request->emitted_jiffies, recent_enough))
			break;
3064

3065 3066
		ring = request->ring;
		seqno = request->seqno;
3067
	}
3068
	spin_unlock(&file_priv->mm.lock);
3069

3070 3071
	if (seqno == 0)
		return 0;
3072

3073
	ret = 0;
3074
	if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
3075 3076 3077 3078 3079
		/* And wait for the seqno passing without holding any locks and
		 * causing extra latency for others. This is safe as the irq
		 * generation is designed to be run atomically and so is
		 * lockless.
		 */
3080 3081 3082 3083 3084
		if (ring->irq_get(ring)) {
			ret = wait_event_interruptible(ring->irq_queue,
						       i915_seqno_passed(ring->get_seqno(ring), seqno)
						       || atomic_read(&dev_priv->mm.wedged));
			ring->irq_put(ring);
3085

3086 3087
			if (ret == 0 && atomic_read(&dev_priv->mm.wedged))
				ret = -EIO;
3088 3089
		} else if (wait_for_atomic(i915_seqno_passed(ring->get_seqno(ring),
							     seqno) ||
3090 3091
				    atomic_read(&dev_priv->mm.wedged), 3000)) {
			ret = -EBUSY;
3092
		}
3093 3094
	}

3095 3096
	if (ret == 0)
		queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0);
3097 3098 3099 3100

	return ret;
}

3101
int
3102 3103
i915_gem_object_pin(struct drm_i915_gem_object *obj,
		    uint32_t alignment,
3104
		    bool map_and_fenceable)
3105
{
3106
	struct drm_device *dev = obj->base.dev;
C
Chris Wilson 已提交
3107
	struct drm_i915_private *dev_priv = dev->dev_private;
3108 3109
	int ret;

3110
	BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT);
3111
	WARN_ON(i915_verify_lists(dev));
3112

3113 3114 3115 3116
	if (obj->gtt_space != NULL) {
		if ((alignment && obj->gtt_offset & (alignment - 1)) ||
		    (map_and_fenceable && !obj->map_and_fenceable)) {
			WARN(obj->pin_count,
3117
			     "bo is already pinned with incorrect alignment:"
3118 3119
			     " offset=%x, req.alignment=%x, req.map_and_fenceable=%d,"
			     " obj->map_and_fenceable=%d\n",
3120
			     obj->gtt_offset, alignment,
3121
			     map_and_fenceable,
3122
			     obj->map_and_fenceable);
3123 3124 3125 3126 3127 3128
			ret = i915_gem_object_unbind(obj);
			if (ret)
				return ret;
		}
	}

3129
	if (obj->gtt_space == NULL) {
3130
		ret = i915_gem_object_bind_to_gtt(obj, alignment,
3131
						  map_and_fenceable);
3132
		if (ret)
3133
			return ret;
3134
	}
J
Jesse Barnes 已提交
3135

3136 3137 3138
	if (!obj->has_global_gtt_mapping && map_and_fenceable)
		i915_gem_gtt_bind_object(obj, obj->cache_level);

3139 3140 3141
	if (obj->pin_count++ == 0) {
		if (!obj->active)
			list_move_tail(&obj->mm_list,
C
Chris Wilson 已提交
3142
				       &dev_priv->mm.pinned_list);
3143
	}
3144
	obj->pin_mappable |= map_and_fenceable;
3145

3146
	WARN_ON(i915_verify_lists(dev));
3147 3148 3149 3150
	return 0;
}

void
3151
i915_gem_object_unpin(struct drm_i915_gem_object *obj)
3152
{
3153
	struct drm_device *dev = obj->base.dev;
3154 3155
	drm_i915_private_t *dev_priv = dev->dev_private;

3156
	WARN_ON(i915_verify_lists(dev));
3157 3158
	BUG_ON(obj->pin_count == 0);
	BUG_ON(obj->gtt_space == NULL);
3159

3160 3161 3162
	if (--obj->pin_count == 0) {
		if (!obj->active)
			list_move_tail(&obj->mm_list,
3163
				       &dev_priv->mm.inactive_list);
3164
		obj->pin_mappable = false;
3165
	}
3166
	WARN_ON(i915_verify_lists(dev));
3167 3168 3169 3170
}

int
i915_gem_pin_ioctl(struct drm_device *dev, void *data,
3171
		   struct drm_file *file)
3172 3173
{
	struct drm_i915_gem_pin *args = data;
3174
	struct drm_i915_gem_object *obj;
3175 3176
	int ret;

3177 3178 3179
	ret = i915_mutex_lock_interruptible(dev);
	if (ret)
		return ret;
3180

3181
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
3182
	if (&obj->base == NULL) {
3183 3184
		ret = -ENOENT;
		goto unlock;
3185 3186
	}

3187
	if (obj->madv != I915_MADV_WILLNEED) {
C
Chris Wilson 已提交
3188
		DRM_ERROR("Attempting to pin a purgeable buffer\n");
3189 3190
		ret = -EINVAL;
		goto out;
3191 3192
	}

3193
	if (obj->pin_filp != NULL && obj->pin_filp != file) {
J
Jesse Barnes 已提交
3194 3195
		DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
			  args->handle);
3196 3197
		ret = -EINVAL;
		goto out;
J
Jesse Barnes 已提交
3198 3199
	}

3200 3201 3202
	obj->user_pin_count++;
	obj->pin_filp = file;
	if (obj->user_pin_count == 1) {
3203
		ret = i915_gem_object_pin(obj, args->alignment, true);
3204 3205
		if (ret)
			goto out;
3206 3207 3208 3209 3210
	}

	/* XXX - flush the CPU caches for pinned objects
	 * as the X server doesn't manage domains yet
	 */
3211
	i915_gem_object_flush_cpu_write_domain(obj);
3212
	args->offset = obj->gtt_offset;
3213
out:
3214
	drm_gem_object_unreference(&obj->base);
3215
unlock:
3216
	mutex_unlock(&dev->struct_mutex);
3217
	return ret;
3218 3219 3220 3221
}

int
i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
3222
		     struct drm_file *file)
3223 3224
{
	struct drm_i915_gem_pin *args = data;
3225
	struct drm_i915_gem_object *obj;
3226
	int ret;
3227

3228 3229 3230
	ret = i915_mutex_lock_interruptible(dev);
	if (ret)
		return ret;
3231

3232
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
3233
	if (&obj->base == NULL) {
3234 3235
		ret = -ENOENT;
		goto unlock;
3236
	}
3237

3238
	if (obj->pin_filp != file) {
J
Jesse Barnes 已提交
3239 3240
		DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
			  args->handle);
3241 3242
		ret = -EINVAL;
		goto out;
J
Jesse Barnes 已提交
3243
	}
3244 3245 3246
	obj->user_pin_count--;
	if (obj->user_pin_count == 0) {
		obj->pin_filp = NULL;
J
Jesse Barnes 已提交
3247 3248
		i915_gem_object_unpin(obj);
	}
3249

3250
out:
3251
	drm_gem_object_unreference(&obj->base);
3252
unlock:
3253
	mutex_unlock(&dev->struct_mutex);
3254
	return ret;
3255 3256 3257 3258
}

int
i915_gem_busy_ioctl(struct drm_device *dev, void *data,
3259
		    struct drm_file *file)
3260 3261
{
	struct drm_i915_gem_busy *args = data;
3262
	struct drm_i915_gem_object *obj;
3263 3264
	int ret;

3265
	ret = i915_mutex_lock_interruptible(dev);
3266
	if (ret)
3267
		return ret;
3268

3269
	obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
3270
	if (&obj->base == NULL) {
3271 3272
		ret = -ENOENT;
		goto unlock;
3273
	}
3274

3275 3276 3277 3278
	/* Count all active objects as busy, even if they are currently not used
	 * by the gpu. Users of this interface expect objects to eventually
	 * become non-busy without any further actions, therefore emit any
	 * necessary flushes here.
3279
	 */
3280
	args->busy = obj->active;
3281 3282 3283 3284 3285 3286
	if (args->busy) {
		/* Unconditionally flush objects, even when the gpu still uses this
		 * object. Userspace calling this function indicates that it wants to
		 * use this buffer rather sooner than later, so issuing the required
		 * flush earlier is beneficial.
		 */
3287
		if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
C
Chris Wilson 已提交
3288
			ret = i915_gem_flush_ring(obj->ring,
3289
						  0, obj->base.write_domain);
3290 3291 3292 3293
		} else if (obj->ring->outstanding_lazy_request ==
			   obj->last_rendering_seqno) {
			struct drm_i915_gem_request *request;

3294 3295 3296
			/* This ring is not being cleared by active usage,
			 * so emit a request to do so.
			 */
3297
			request = kzalloc(sizeof(*request), GFP_KERNEL);
3298
			if (request) {
3299
				ret = i915_add_request(obj->ring, NULL, request);
3300 3301 3302
				if (ret)
					kfree(request);
			} else
3303 3304
				ret = -ENOMEM;
		}
3305 3306 3307 3308 3309 3310

		/* Update the active list for the hardware's current position.
		 * Otherwise this only updates on a delayed timer or when irqs
		 * are actually unmasked, and our working set ends up being
		 * larger than required.
		 */
C
Chris Wilson 已提交
3311
		i915_gem_retire_requests_ring(obj->ring);
3312

3313
		args->busy = obj->active;
3314
	}
3315

3316
	drm_gem_object_unreference(&obj->base);
3317
unlock:
3318
	mutex_unlock(&dev->struct_mutex);
3319
	return ret;
3320 3321 3322 3323 3324 3325
}

int
i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
			struct drm_file *file_priv)
{
3326
	return i915_gem_ring_throttle(dev, file_priv);
3327 3328
}

3329 3330 3331 3332 3333
int
i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
		       struct drm_file *file_priv)
{
	struct drm_i915_gem_madvise *args = data;
3334
	struct drm_i915_gem_object *obj;
3335
	int ret;
3336 3337 3338 3339 3340 3341 3342 3343 3344

	switch (args->madv) {
	case I915_MADV_DONTNEED:
	case I915_MADV_WILLNEED:
	    break;
	default:
	    return -EINVAL;
	}

3345 3346 3347 3348
	ret = i915_mutex_lock_interruptible(dev);
	if (ret)
		return ret;

3349
	obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
3350
	if (&obj->base == NULL) {
3351 3352
		ret = -ENOENT;
		goto unlock;
3353 3354
	}

3355
	if (obj->pin_count) {
3356 3357
		ret = -EINVAL;
		goto out;
3358 3359
	}

3360 3361
	if (obj->madv != __I915_MADV_PURGED)
		obj->madv = args->madv;
3362

3363
	/* if the object is no longer bound, discard its backing storage */
3364 3365
	if (i915_gem_object_is_purgeable(obj) &&
	    obj->gtt_space == NULL)
3366 3367
		i915_gem_object_truncate(obj);

3368
	args->retained = obj->madv != __I915_MADV_PURGED;
C
Chris Wilson 已提交
3369

3370
out:
3371
	drm_gem_object_unreference(&obj->base);
3372
unlock:
3373
	mutex_unlock(&dev->struct_mutex);
3374
	return ret;
3375 3376
}

3377 3378
struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
						  size_t size)
3379
{
3380
	struct drm_i915_private *dev_priv = dev->dev_private;
3381
	struct drm_i915_gem_object *obj;
3382
	struct address_space *mapping;
3383

3384 3385 3386
	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
	if (obj == NULL)
		return NULL;
3387

3388 3389 3390 3391
	if (drm_gem_object_init(dev, &obj->base, size) != 0) {
		kfree(obj);
		return NULL;
	}
3392

3393 3394 3395
	mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
	mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_RECLAIMABLE);

3396 3397
	i915_gem_info_add_obj(dev_priv, size);

3398 3399
	obj->base.write_domain = I915_GEM_DOMAIN_CPU;
	obj->base.read_domains = I915_GEM_DOMAIN_CPU;
3400

3401 3402
	if (HAS_LLC(dev)) {
		/* On some devices, we can have the GPU use the LLC (the CPU
3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417
		 * cache) for about a 10% performance improvement
		 * compared to uncached.  Graphics requests other than
		 * display scanout are coherent with the CPU in
		 * accessing this cache.  This means in this mode we
		 * don't need to clflush on the CPU side, and on the
		 * GPU side we only need to flush internal caches to
		 * get data visible to the CPU.
		 *
		 * However, we maintain the display planes as UC, and so
		 * need to rebind when first used as such.
		 */
		obj->cache_level = I915_CACHE_LLC;
	} else
		obj->cache_level = I915_CACHE_NONE;

3418
	obj->base.driver_private = NULL;
3419
	obj->fence_reg = I915_FENCE_REG_NONE;
3420
	INIT_LIST_HEAD(&obj->mm_list);
D
Daniel Vetter 已提交
3421
	INIT_LIST_HEAD(&obj->gtt_list);
3422
	INIT_LIST_HEAD(&obj->ring_list);
3423
	INIT_LIST_HEAD(&obj->exec_list);
3424 3425
	INIT_LIST_HEAD(&obj->gpu_write_list);
	obj->madv = I915_MADV_WILLNEED;
3426 3427
	/* Avoid an unnecessary call to unbind on the first bind. */
	obj->map_and_fenceable = true;
3428

3429
	return obj;
3430 3431 3432 3433 3434
}

int i915_gem_init_object(struct drm_gem_object *obj)
{
	BUG();
3435

3436 3437 3438
	return 0;
}

3439
static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj)
3440
{
3441
	struct drm_device *dev = obj->base.dev;
3442 3443
	drm_i915_private_t *dev_priv = dev->dev_private;
	int ret;
3444

3445 3446
	ret = i915_gem_object_unbind(obj);
	if (ret == -ERESTARTSYS) {
3447
		list_move(&obj->mm_list,
3448 3449 3450
			  &dev_priv->mm.deferred_free_list);
		return;
	}
3451

3452 3453
	trace_i915_gem_object_destroy(obj);

3454
	if (obj->base.map_list.map)
3455
		drm_gem_free_mmap_offset(&obj->base);
3456

3457 3458
	drm_gem_object_release(&obj->base);
	i915_gem_info_remove_obj(dev_priv, obj->base.size);
3459

3460 3461
	kfree(obj->bit_17);
	kfree(obj);
3462 3463
}

3464
void i915_gem_free_object(struct drm_gem_object *gem_obj)
3465
{
3466 3467
	struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
	struct drm_device *dev = obj->base.dev;
3468

3469
	while (obj->pin_count > 0)
3470 3471
		i915_gem_object_unpin(obj);

3472
	if (obj->phys_obj)
3473 3474 3475 3476 3477
		i915_gem_detach_phys_object(dev, obj);

	i915_gem_free_object_tail(obj);
}

3478 3479 3480 3481 3482
int
i915_gem_idle(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	int ret;
3483

3484
	mutex_lock(&dev->struct_mutex);
C
Chris Wilson 已提交
3485

3486
	if (dev_priv->mm.suspended) {
3487 3488
		mutex_unlock(&dev->struct_mutex);
		return 0;
3489 3490
	}

3491
	ret = i915_gpu_idle(dev, true);
3492 3493
	if (ret) {
		mutex_unlock(&dev->struct_mutex);
3494
		return ret;
3495
	}
3496

3497 3498
	/* Under UMS, be paranoid and evict. */
	if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
3499
		ret = i915_gem_evict_inactive(dev, false);
3500 3501 3502 3503 3504 3505
		if (ret) {
			mutex_unlock(&dev->struct_mutex);
			return ret;
		}
	}

3506 3507
	i915_gem_reset_fences(dev);

3508 3509 3510 3511 3512
	/* Hack!  Don't let anybody do execbuf while we don't control the chip.
	 * We need to replace this with a semaphore, or something.
	 * And not confound mm.suspended!
	 */
	dev_priv->mm.suspended = 1;
3513
	del_timer_sync(&dev_priv->hangcheck_timer);
3514 3515

	i915_kernel_lost_context(dev);
3516
	i915_gem_cleanup_ringbuffer(dev);
3517

3518 3519
	mutex_unlock(&dev->struct_mutex);

3520 3521 3522
	/* Cancel the retire work handler, which should be idle now. */
	cancel_delayed_work_sync(&dev_priv->mm.retire_work);

3523 3524 3525
	return 0;
}

3526 3527 3528 3529
void i915_gem_init_swizzling(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;

3530
	if (INTEL_INFO(dev)->gen < 5 ||
3531 3532 3533 3534 3535 3536
	    dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_NONE)
		return;

	I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
				 DISP_TILE_SURFACE_SWIZZLING);

3537 3538 3539
	if (IS_GEN5(dev))
		return;

3540 3541 3542 3543 3544 3545
	I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_SWZCTL);
	if (IS_GEN6(dev))
		I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_SNB));
	else
		I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB));
}
D
Daniel Vetter 已提交
3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582

void i915_gem_init_ppgtt(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	uint32_t pd_offset;
	struct intel_ring_buffer *ring;
	int i;

	if (!dev_priv->mm.aliasing_ppgtt)
		return;

	pd_offset = dev_priv->mm.aliasing_ppgtt->pd_offset;
	pd_offset /= 64; /* in cachelines, */
	pd_offset <<= 16;

	if (INTEL_INFO(dev)->gen == 6) {
		uint32_t ecochk = I915_READ(GAM_ECOCHK);
		I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
				       ECOCHK_PPGTT_CACHE64B);
		I915_WRITE(GFX_MODE, GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
	} else if (INTEL_INFO(dev)->gen >= 7) {
		I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
		/* GFX_MODE is per-ring on gen7+ */
	}

	for (i = 0; i < I915_NUM_RINGS; i++) {
		ring = &dev_priv->ring[i];

		if (INTEL_INFO(dev)->gen >= 7)
			I915_WRITE(RING_MODE_GEN7(ring),
				   GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));

		I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
		I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
	}
}

3583
int
3584
i915_gem_init_hw(struct drm_device *dev)
3585 3586 3587
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	int ret;
3588

3589 3590
	i915_gem_init_swizzling(dev);

3591
	ret = intel_init_render_ring_buffer(dev);
3592
	if (ret)
3593
		return ret;
3594 3595

	if (HAS_BSD(dev)) {
3596
		ret = intel_init_bsd_ring_buffer(dev);
3597 3598
		if (ret)
			goto cleanup_render_ring;
3599
	}
3600

3601 3602 3603 3604 3605 3606
	if (HAS_BLT(dev)) {
		ret = intel_init_blt_ring_buffer(dev);
		if (ret)
			goto cleanup_bsd_ring;
	}

3607 3608
	dev_priv->next_seqno = 1;

D
Daniel Vetter 已提交
3609 3610
	i915_gem_init_ppgtt(dev);

3611 3612
	return 0;

3613
cleanup_bsd_ring:
3614
	intel_cleanup_ring_buffer(&dev_priv->ring[VCS]);
3615
cleanup_render_ring:
3616
	intel_cleanup_ring_buffer(&dev_priv->ring[RCS]);
3617 3618 3619 3620 3621 3622 3623
	return ret;
}

void
i915_gem_cleanup_ringbuffer(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
3624
	int i;
3625

3626 3627
	for (i = 0; i < I915_NUM_RINGS; i++)
		intel_cleanup_ring_buffer(&dev_priv->ring[i]);
3628 3629
}

3630 3631 3632 3633 3634
int
i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
		       struct drm_file *file_priv)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
3635
	int ret, i;
3636

J
Jesse Barnes 已提交
3637 3638 3639
	if (drm_core_check_feature(dev, DRIVER_MODESET))
		return 0;

3640
	if (atomic_read(&dev_priv->mm.wedged)) {
3641
		DRM_ERROR("Reenabling wedged hardware, good luck\n");
3642
		atomic_set(&dev_priv->mm.wedged, 0);
3643 3644 3645
	}

	mutex_lock(&dev->struct_mutex);
3646 3647
	dev_priv->mm.suspended = 0;

3648
	ret = i915_gem_init_hw(dev);
3649 3650
	if (ret != 0) {
		mutex_unlock(&dev->struct_mutex);
3651
		return ret;
3652
	}
3653

3654
	BUG_ON(!list_empty(&dev_priv->mm.active_list));
3655 3656
	BUG_ON(!list_empty(&dev_priv->mm.flushing_list));
	BUG_ON(!list_empty(&dev_priv->mm.inactive_list));
3657 3658 3659 3660
	for (i = 0; i < I915_NUM_RINGS; i++) {
		BUG_ON(!list_empty(&dev_priv->ring[i].active_list));
		BUG_ON(!list_empty(&dev_priv->ring[i].request_list));
	}
3661
	mutex_unlock(&dev->struct_mutex);
3662

3663 3664 3665
	ret = drm_irq_install(dev);
	if (ret)
		goto cleanup_ringbuffer;
3666

3667
	return 0;
3668 3669 3670 3671 3672 3673 3674 3675

cleanup_ringbuffer:
	mutex_lock(&dev->struct_mutex);
	i915_gem_cleanup_ringbuffer(dev);
	dev_priv->mm.suspended = 1;
	mutex_unlock(&dev->struct_mutex);

	return ret;
3676 3677 3678 3679 3680 3681
}

int
i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
		       struct drm_file *file_priv)
{
J
Jesse Barnes 已提交
3682 3683 3684
	if (drm_core_check_feature(dev, DRIVER_MODESET))
		return 0;

3685
	drm_irq_uninstall(dev);
3686
	return i915_gem_idle(dev);
3687 3688 3689 3690 3691 3692 3693
}

void
i915_gem_lastclose(struct drm_device *dev)
{
	int ret;

3694 3695 3696
	if (drm_core_check_feature(dev, DRIVER_MODESET))
		return;

3697 3698 3699
	ret = i915_gem_idle(dev);
	if (ret)
		DRM_ERROR("failed to idle hardware: %d\n", ret);
3700 3701
}

3702 3703 3704 3705 3706 3707 3708 3709
static void
init_ring_lists(struct intel_ring_buffer *ring)
{
	INIT_LIST_HEAD(&ring->active_list);
	INIT_LIST_HEAD(&ring->request_list);
	INIT_LIST_HEAD(&ring->gpu_write_list);
}

3710 3711 3712
void
i915_gem_load(struct drm_device *dev)
{
3713
	int i;
3714 3715
	drm_i915_private_t *dev_priv = dev->dev_private;

3716
	INIT_LIST_HEAD(&dev_priv->mm.active_list);
3717 3718
	INIT_LIST_HEAD(&dev_priv->mm.flushing_list);
	INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
C
Chris Wilson 已提交
3719
	INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
3720
	INIT_LIST_HEAD(&dev_priv->mm.fence_list);
3721
	INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
D
Daniel Vetter 已提交
3722
	INIT_LIST_HEAD(&dev_priv->mm.gtt_list);
3723 3724
	for (i = 0; i < I915_NUM_RINGS; i++)
		init_ring_lists(&dev_priv->ring[i]);
3725
	for (i = 0; i < I915_MAX_NUM_FENCES; i++)
3726
		INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
3727 3728
	INIT_DELAYED_WORK(&dev_priv->mm.retire_work,
			  i915_gem_retire_work_handler);
3729
	init_completion(&dev_priv->error_completion);
3730

3731 3732 3733 3734 3735 3736 3737 3738 3739 3740
	/* On GEN3 we really need to make sure the ARB C3 LP bit is set */
	if (IS_GEN3(dev)) {
		u32 tmp = I915_READ(MI_ARB_STATE);
		if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) {
			/* arb state is a masked write, so set bit + bit in mask */
			tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT);
			I915_WRITE(MI_ARB_STATE, tmp);
		}
	}

3741 3742
	dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;

3743
	/* Old X drivers will take 0-2 for front, back, depth buffers */
3744 3745
	if (!drm_core_check_feature(dev, DRIVER_MODESET))
		dev_priv->fence_reg_start = 3;
3746

3747
	if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
3748 3749 3750 3751
		dev_priv->num_fence_regs = 16;
	else
		dev_priv->num_fence_regs = 8;

3752
	/* Initialize fence registers to zero */
3753 3754
	for (i = 0; i < dev_priv->num_fence_regs; i++) {
		i915_gem_clear_fence_reg(dev, &dev_priv->fence_regs[i]);
3755
	}
3756

3757
	i915_gem_detect_bit_6_swizzle(dev);
3758
	init_waitqueue_head(&dev_priv->pending_flip_queue);
3759

3760 3761
	dev_priv->mm.interruptible = true;

3762 3763 3764
	dev_priv->mm.inactive_shrinker.shrink = i915_gem_inactive_shrink;
	dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS;
	register_shrinker(&dev_priv->mm.inactive_shrinker);
3765
}
3766 3767 3768 3769 3770

/*
 * Create a physically contiguous memory object for this object
 * e.g. for cursor + overlay regs
 */
3771 3772
static int i915_gem_init_phys_object(struct drm_device *dev,
				     int id, int size, int align)
3773 3774 3775 3776 3777 3778 3779 3780
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	struct drm_i915_gem_phys_object *phys_obj;
	int ret;

	if (dev_priv->mm.phys_objs[id - 1] || !size)
		return 0;

3781
	phys_obj = kzalloc(sizeof(struct drm_i915_gem_phys_object), GFP_KERNEL);
3782 3783 3784 3785 3786
	if (!phys_obj)
		return -ENOMEM;

	phys_obj->id = id;

3787
	phys_obj->handle = drm_pci_alloc(dev, size, align);
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799
	if (!phys_obj->handle) {
		ret = -ENOMEM;
		goto kfree_obj;
	}
#ifdef CONFIG_X86
	set_memory_wc((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
#endif

	dev_priv->mm.phys_objs[id - 1] = phys_obj;

	return 0;
kfree_obj:
3800
	kfree(phys_obj);
3801 3802 3803
	return ret;
}

3804
static void i915_gem_free_phys_object(struct drm_device *dev, int id)
3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	struct drm_i915_gem_phys_object *phys_obj;

	if (!dev_priv->mm.phys_objs[id - 1])
		return;

	phys_obj = dev_priv->mm.phys_objs[id - 1];
	if (phys_obj->cur_obj) {
		i915_gem_detach_phys_object(dev, phys_obj->cur_obj);
	}

#ifdef CONFIG_X86
	set_memory_wb((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
#endif
	drm_pci_free(dev, phys_obj->handle);
	kfree(phys_obj);
	dev_priv->mm.phys_objs[id - 1] = NULL;
}

void i915_gem_free_all_phys_object(struct drm_device *dev)
{
	int i;

3829
	for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++)
3830 3831 3832 3833
		i915_gem_free_phys_object(dev, i);
}

void i915_gem_detach_phys_object(struct drm_device *dev,
3834
				 struct drm_i915_gem_object *obj)
3835
{
3836
	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
3837
	char *vaddr;
3838 3839 3840
	int i;
	int page_count;

3841
	if (!obj->phys_obj)
3842
		return;
3843
	vaddr = obj->phys_obj->handle->vaddr;
3844

3845
	page_count = obj->base.size / PAGE_SIZE;
3846
	for (i = 0; i < page_count; i++) {
3847
		struct page *page = shmem_read_mapping_page(mapping, i);
3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858
		if (!IS_ERR(page)) {
			char *dst = kmap_atomic(page);
			memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
			kunmap_atomic(dst);

			drm_clflush_pages(&page, 1);

			set_page_dirty(page);
			mark_page_accessed(page);
			page_cache_release(page);
		}
3859
	}
3860
	intel_gtt_chipset_flush();
3861

3862 3863
	obj->phys_obj->cur_obj = NULL;
	obj->phys_obj = NULL;
3864 3865 3866 3867
}

int
i915_gem_attach_phys_object(struct drm_device *dev,
3868
			    struct drm_i915_gem_object *obj,
3869 3870
			    int id,
			    int align)
3871
{
3872
	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
3873 3874 3875 3876 3877 3878 3879 3880
	drm_i915_private_t *dev_priv = dev->dev_private;
	int ret = 0;
	int page_count;
	int i;

	if (id > I915_MAX_PHYS_OBJECT)
		return -EINVAL;

3881 3882
	if (obj->phys_obj) {
		if (obj->phys_obj->id == id)
3883 3884 3885 3886 3887 3888 3889
			return 0;
		i915_gem_detach_phys_object(dev, obj);
	}

	/* create a new object */
	if (!dev_priv->mm.phys_objs[id - 1]) {
		ret = i915_gem_init_phys_object(dev, id,
3890
						obj->base.size, align);
3891
		if (ret) {
3892 3893
			DRM_ERROR("failed to init phys object %d size: %zu\n",
				  id, obj->base.size);
3894
			return ret;
3895 3896 3897 3898
		}
	}

	/* bind to the object */
3899 3900
	obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
	obj->phys_obj->cur_obj = obj;
3901

3902
	page_count = obj->base.size / PAGE_SIZE;
3903 3904

	for (i = 0; i < page_count; i++) {
3905 3906 3907
		struct page *page;
		char *dst, *src;

3908
		page = shmem_read_mapping_page(mapping, i);
3909 3910
		if (IS_ERR(page))
			return PTR_ERR(page);
3911

3912
		src = kmap_atomic(page);
3913
		dst = obj->phys_obj->handle->vaddr + (i * PAGE_SIZE);
3914
		memcpy(dst, src, PAGE_SIZE);
P
Peter Zijlstra 已提交
3915
		kunmap_atomic(src);
3916

3917 3918 3919
		mark_page_accessed(page);
		page_cache_release(page);
	}
3920

3921 3922 3923 3924
	return 0;
}

static int
3925 3926
i915_gem_phys_pwrite(struct drm_device *dev,
		     struct drm_i915_gem_object *obj,
3927 3928 3929
		     struct drm_i915_gem_pwrite *args,
		     struct drm_file *file_priv)
{
3930
	void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
3931
	char __user *user_data = (char __user *) (uintptr_t) args->data_ptr;
3932

3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945
	if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
		unsigned long unwritten;

		/* The physical object once assigned is fixed for the lifetime
		 * of the obj, so we can safely drop the lock and continue
		 * to access vaddr.
		 */
		mutex_unlock(&dev->struct_mutex);
		unwritten = copy_from_user(vaddr, user_data, args->size);
		mutex_lock(&dev->struct_mutex);
		if (unwritten)
			return -EFAULT;
	}
3946

3947
	intel_gtt_chipset_flush();
3948 3949
	return 0;
}
3950

3951
void i915_gem_release(struct drm_device *dev, struct drm_file *file)
3952
{
3953
	struct drm_i915_file_private *file_priv = file->driver_priv;
3954 3955 3956 3957 3958

	/* Clean up our request list when the client is going away, so that
	 * later retire_requests won't dereference our soon-to-be-gone
	 * file_priv.
	 */
3959
	spin_lock(&file_priv->mm.lock);
3960 3961 3962 3963 3964 3965 3966 3967 3968
	while (!list_empty(&file_priv->mm.request_list)) {
		struct drm_i915_gem_request *request;

		request = list_first_entry(&file_priv->mm.request_list,
					   struct drm_i915_gem_request,
					   client_list);
		list_del(&request->client_list);
		request->file_priv = NULL;
	}
3969
	spin_unlock(&file_priv->mm.lock);
3970
}
3971

3972 3973 3974 3975 3976 3977 3978
static int
i915_gpu_is_active(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	int lists_empty;

	lists_empty = list_empty(&dev_priv->mm.flushing_list) &&
3979
		      list_empty(&dev_priv->mm.active_list);
3980 3981 3982 3983

	return !lists_empty;
}

3984
static int
3985
i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
3986
{
3987 3988 3989 3990 3991 3992
	struct drm_i915_private *dev_priv =
		container_of(shrinker,
			     struct drm_i915_private,
			     mm.inactive_shrinker);
	struct drm_device *dev = dev_priv->dev;
	struct drm_i915_gem_object *obj, *next;
3993
	int nr_to_scan = sc->nr_to_scan;
3994 3995 3996
	int cnt;

	if (!mutex_trylock(&dev->struct_mutex))
3997
		return 0;
3998 3999 4000

	/* "fast-path" to count number of available objects */
	if (nr_to_scan == 0) {
4001 4002 4003 4004 4005 4006 4007
		cnt = 0;
		list_for_each_entry(obj,
				    &dev_priv->mm.inactive_list,
				    mm_list)
			cnt++;
		mutex_unlock(&dev->struct_mutex);
		return cnt / 100 * sysctl_vfs_cache_pressure;
4008 4009
	}

4010
rescan:
4011
	/* first scan for clean buffers */
4012
	i915_gem_retire_requests(dev);
4013

4014 4015 4016 4017
	list_for_each_entry_safe(obj, next,
				 &dev_priv->mm.inactive_list,
				 mm_list) {
		if (i915_gem_object_is_purgeable(obj)) {
4018 4019
			if (i915_gem_object_unbind(obj) == 0 &&
			    --nr_to_scan == 0)
4020
				break;
4021 4022 4023 4024
		}
	}

	/* second pass, evict/count anything still on the inactive list */
4025 4026 4027 4028
	cnt = 0;
	list_for_each_entry_safe(obj, next,
				 &dev_priv->mm.inactive_list,
				 mm_list) {
4029 4030
		if (nr_to_scan &&
		    i915_gem_object_unbind(obj) == 0)
4031
			nr_to_scan--;
4032
		else
4033 4034 4035 4036
			cnt++;
	}

	if (nr_to_scan && i915_gpu_is_active(dev)) {
4037 4038 4039 4040 4041 4042
		/*
		 * We are desperate for pages, so as a last resort, wait
		 * for the GPU to finish and discard whatever we can.
		 * This has a dramatic impact to reduce the number of
		 * OOM-killer events whilst running the GPU aggressively.
		 */
4043
		if (i915_gpu_idle(dev, true) == 0)
4044 4045
			goto rescan;
	}
4046 4047
	mutex_unlock(&dev->struct_mutex);
	return cnt / 100 * sysctl_vfs_cache_pressure;
4048
}