i915_vma.c 27.0 KB
Newer Older
J
Joonas Lahtinen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * Copyright © 2016 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.
 *
 */
24

J
Joonas Lahtinen 已提交
25 26 27 28 29 30 31 32
#include "i915_vma.h"

#include "i915_drv.h"
#include "intel_ringbuffer.h"
#include "intel_frontbuffer.h"

#include <drm/drm_gem.h>

33
#if IS_ENABLED(CONFIG_DRM_I915_ERRLOG_GEM) && IS_ENABLED(CONFIG_DRM_DEBUG_MM)
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

#include <linux/stackdepot.h>

static void vma_print_allocator(struct i915_vma *vma, const char *reason)
{
	unsigned long entries[12];
	struct stack_trace trace = {
		.entries = entries,
		.max_entries = ARRAY_SIZE(entries),
	};
	char buf[512];

	if (!vma->node.stack) {
		DRM_DEBUG_DRIVER("vma.node [%08llx + %08llx] %s: unknown owner\n",
				 vma->node.start, vma->node.size, reason);
		return;
	}

	depot_fetch_stack(vma->node.stack, &trace);
	snprint_stack_trace(buf, sizeof(buf), &trace, 0);
	DRM_DEBUG_DRIVER("vma.node [%08llx + %08llx] %s: inserted at %s\n",
			 vma->node.start, vma->node.size, reason, buf);
}

#else

static void vma_print_allocator(struct i915_vma *vma, const char *reason)
{
}

#endif

66 67 68
static void obj_bump_mru(struct drm_i915_gem_object *obj)
{
	struct drm_i915_private *i915 = to_i915(obj->base.dev);
69

70 71 72 73 74 75 76 77 78
	spin_lock(&i915->mm.obj_lock);
	if (obj->bind_count)
		list_move_tail(&obj->mm.link, &i915->mm.bound_list);
	spin_unlock(&i915->mm.obj_lock);

	obj->mm.dirty = true; /* be paranoid  */
}

static void __i915_vma_retire(struct i915_active *ref)
J
Joonas Lahtinen 已提交
79
{
80
	struct i915_vma *vma = container_of(ref, typeof(*vma), active);
J
Joonas Lahtinen 已提交
81 82 83 84 85 86
	struct drm_i915_gem_object *obj = vma->obj;

	GEM_BUG_ON(!i915_gem_object_is_active(obj));
	if (--obj->active_count)
		return;

87 88 89 90 91 92 93
	/* Prune the shared fence arrays iff completely idle (inc. external) */
	if (reservation_object_trylock(obj->resv)) {
		if (reservation_object_test_signaled_rcu(obj->resv, true))
			reservation_object_add_excl_fence(obj->resv, NULL);
		reservation_object_unlock(obj->resv);
	}

94 95
	/*
	 * Bump our place on the bound list to keep it roughly in LRU order
J
Joonas Lahtinen 已提交
96 97 98
	 * so that we don't steal from recently used but inactive objects
	 * (unless we are forced to ofc!)
	 */
99
	obj_bump_mru(obj);
J
Joonas Lahtinen 已提交
100 101 102 103 104 105 106 107

	if (i915_gem_object_has_active_reference(obj)) {
		i915_gem_object_clear_active_reference(obj);
		i915_gem_object_put(obj);
	}
}

static struct i915_vma *
108 109 110
vma_create(struct drm_i915_gem_object *obj,
	   struct i915_address_space *vm,
	   const struct i915_ggtt_view *view)
J
Joonas Lahtinen 已提交
111 112 113 114
{
	struct i915_vma *vma;
	struct rb_node *rb, **p;

115
	/* The aliasing_ppgtt should never be used directly! */
116
	GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->vm);
117

118
	vma = kmem_cache_zalloc(vm->i915->vmas, GFP_KERNEL);
J
Joonas Lahtinen 已提交
119 120 121
	if (vma == NULL)
		return ERR_PTR(-ENOMEM);

122
	i915_active_init(vm->i915, &vma->active, __i915_vma_retire);
J
Joonas Lahtinen 已提交
123
	init_request_active(&vma->last_fence, NULL);
124

J
Joonas Lahtinen 已提交
125
	vma->vm = vm;
126
	vma->ops = &vm->vma_ops;
J
Joonas Lahtinen 已提交
127
	vma->obj = obj;
128
	vma->resv = obj->resv;
J
Joonas Lahtinen 已提交
129
	vma->size = obj->base.size;
130
	vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
J
Joonas Lahtinen 已提交
131

132
	if (view && view->type != I915_GGTT_VIEW_NORMAL) {
J
Joonas Lahtinen 已提交
133 134
		vma->ggtt_view = *view;
		if (view->type == I915_GGTT_VIEW_PARTIAL) {
135
			GEM_BUG_ON(range_overflows_t(u64,
136 137
						     view->partial.offset,
						     view->partial.size,
138
						     obj->base.size >> PAGE_SHIFT));
139
			vma->size = view->partial.size;
J
Joonas Lahtinen 已提交
140
			vma->size <<= PAGE_SHIFT;
141
			GEM_BUG_ON(vma->size > obj->base.size);
J
Joonas Lahtinen 已提交
142
		} else if (view->type == I915_GGTT_VIEW_ROTATED) {
143
			vma->size = intel_rotation_info_size(&view->rotated);
J
Joonas Lahtinen 已提交
144 145 146 147
			vma->size <<= PAGE_SHIFT;
		}
	}

148 149 150
	if (unlikely(vma->size > vm->total))
		goto err_vma;

151 152
	GEM_BUG_ON(!IS_ALIGNED(vma->size, I915_GTT_PAGE_SIZE));

J
Joonas Lahtinen 已提交
153
	if (i915_is_ggtt(vm)) {
154 155 156
		if (unlikely(overflows_type(vma->size, u32)))
			goto err_vma;

157 158 159
		vma->fence_size = i915_gem_fence_size(vm->i915, vma->size,
						      i915_gem_object_get_tiling(obj),
						      i915_gem_object_get_stride(obj));
160 161 162 163
		if (unlikely(vma->fence_size < vma->size || /* overflow */
			     vma->fence_size > vm->total))
			goto err_vma;

164
		GEM_BUG_ON(!IS_ALIGNED(vma->fence_size, I915_GTT_MIN_ALIGNMENT));
165

166 167 168
		vma->fence_alignment = i915_gem_fence_alignment(vm->i915, vma->size,
								i915_gem_object_get_tiling(obj),
								i915_gem_object_get_stride(obj));
169 170
		GEM_BUG_ON(!is_power_of_2(vma->fence_alignment));

J
Joonas Lahtinen 已提交
171 172 173
		vma->flags |= I915_VMA_GGTT;
	}

174 175
	spin_lock(&obj->vma.lock);

J
Joonas Lahtinen 已提交
176
	rb = NULL;
177
	p = &obj->vma.tree.rb_node;
J
Joonas Lahtinen 已提交
178 179
	while (*p) {
		struct i915_vma *pos;
180
		long cmp;
J
Joonas Lahtinen 已提交
181 182 183

		rb = *p;
		pos = rb_entry(rb, struct i915_vma, obj_node);
184 185 186 187 188 189 190 191 192 193 194 195 196 197

		/*
		 * If the view already exists in the tree, another thread
		 * already created a matching vma, so return the older instance
		 * and dispose of ours.
		 */
		cmp = i915_vma_compare(pos, vm, view);
		if (cmp == 0) {
			spin_unlock(&obj->vma.lock);
			kmem_cache_free(vm->i915->vmas, vma);
			return pos;
		}

		if (cmp < 0)
J
Joonas Lahtinen 已提交
198 199 200 201 202
			p = &rb->rb_right;
		else
			p = &rb->rb_left;
	}
	rb_link_node(&vma->obj_node, rb, p);
203 204 205 206 207 208 209 210 211 212 213 214 215 216
	rb_insert_color(&vma->obj_node, &obj->vma.tree);

	if (i915_vma_is_ggtt(vma))
		/*
		 * We put the GGTT vma at the start of the vma-list, followed
		 * by the ppGGTT vma. This allows us to break early when
		 * iterating over only the GGTT vma for an object, see
		 * for_each_ggtt_vma()
		 */
		list_add(&vma->obj_link, &obj->vma.list);
	else
		list_add_tail(&vma->obj_link, &obj->vma.list);

	spin_unlock(&obj->vma.lock);
217 218

	mutex_lock(&vm->mutex);
219
	list_add(&vma->vm_link, &vm->unbound_list);
220
	mutex_unlock(&vm->mutex);
J
Joonas Lahtinen 已提交
221 222

	return vma;
223 224 225 226

err_vma:
	kmem_cache_free(vm->i915->vmas, vma);
	return ERR_PTR(-E2BIG);
J
Joonas Lahtinen 已提交
227 228
}

229 230 231 232
static struct i915_vma *
vma_lookup(struct drm_i915_gem_object *obj,
	   struct i915_address_space *vm,
	   const struct i915_ggtt_view *view)
233 234 235
{
	struct rb_node *rb;

236
	rb = obj->vma.tree.rb_node;
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 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
	while (rb) {
		struct i915_vma *vma = rb_entry(rb, struct i915_vma, obj_node);
		long cmp;

		cmp = i915_vma_compare(vma, vm, view);
		if (cmp == 0)
			return vma;

		if (cmp < 0)
			rb = rb->rb_right;
		else
			rb = rb->rb_left;
	}

	return NULL;
}

/**
 * i915_vma_instance - return the singleton instance of the VMA
 * @obj: parent &struct drm_i915_gem_object to be mapped
 * @vm: address space in which the mapping is located
 * @view: additional mapping requirements
 *
 * i915_vma_instance() looks up an existing VMA of the @obj in the @vm with
 * the same @view characteristics. If a match is not found, one is created.
 * Once created, the VMA is kept until either the object is freed, or the
 * address space is closed.
 *
 * Must be called with struct_mutex held.
 *
 * Returns the vma, or an error pointer.
 */
struct i915_vma *
i915_vma_instance(struct drm_i915_gem_object *obj,
		  struct i915_address_space *vm,
		  const struct i915_ggtt_view *view)
{
	struct i915_vma *vma;

	GEM_BUG_ON(view && !i915_is_ggtt(vm));
	GEM_BUG_ON(vm->closed);

279
	spin_lock(&obj->vma.lock);
280
	vma = vma_lookup(obj, vm, view);
281 282 283 284
	spin_unlock(&obj->vma.lock);

	/* vma_create() will resolve the race if another creates the vma */
	if (unlikely(!vma))
285
		vma = vma_create(obj, vm, view);
286

287
	GEM_BUG_ON(!IS_ERR(vma) && i915_vma_compare(vma, vm, view));
288 289 290
	return vma;
}

J
Joonas Lahtinen 已提交
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
/**
 * i915_vma_bind - Sets up PTEs for an VMA in it's corresponding address space.
 * @vma: VMA to map
 * @cache_level: mapping cache level
 * @flags: flags like global or local mapping
 *
 * DMA addresses are taken from the scatter-gather table of this object (or of
 * this VMA in case of non-default GGTT views) and PTE entries set up.
 * Note that DMA addresses are also the only part of the SG table we care about.
 */
int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
		  u32 flags)
{
	u32 bind_flags;
	u32 vma_flags;
	int ret;

308 309 310
	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
	GEM_BUG_ON(vma->size > vma->node.size);

311 312 313
	if (GEM_DEBUG_WARN_ON(range_overflows(vma->node.start,
					      vma->node.size,
					      vma->vm->total)))
314 315
		return -ENODEV;

316
	if (GEM_DEBUG_WARN_ON(!flags))
J
Joonas Lahtinen 已提交
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
		return -EINVAL;

	bind_flags = 0;
	if (flags & PIN_GLOBAL)
		bind_flags |= I915_VMA_GLOBAL_BIND;
	if (flags & PIN_USER)
		bind_flags |= I915_VMA_LOCAL_BIND;

	vma_flags = vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND);
	if (flags & PIN_UPDATE)
		bind_flags |= vma_flags;
	else
		bind_flags &= ~vma_flags;
	if (bind_flags == 0)
		return 0;

333 334
	GEM_BUG_ON(!vma->pages);

335
	trace_i915_vma_bind(vma, bind_flags);
336
	ret = vma->ops->bind_vma(vma, cache_level, bind_flags);
J
Joonas Lahtinen 已提交
337 338 339 340 341 342 343 344 345 346
	if (ret)
		return ret;

	vma->flags |= bind_flags;
	return 0;
}

void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
{
	void __iomem *ptr;
C
Chris Wilson 已提交
347
	int err;
J
Joonas Lahtinen 已提交
348 349

	/* Access through the GTT requires the device to be awake. */
350
	assert_rpm_wakelock_held(vma->vm->i915);
J
Joonas Lahtinen 已提交
351

352
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
C
Chris Wilson 已提交
353 354 355 356
	if (WARN_ON(!i915_vma_is_map_and_fenceable(vma))) {
		err = -ENODEV;
		goto err;
	}
J
Joonas Lahtinen 已提交
357 358 359 360 361 362

	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
	GEM_BUG_ON((vma->flags & I915_VMA_GLOBAL_BIND) == 0);

	ptr = vma->iomap;
	if (ptr == NULL) {
363
		ptr = io_mapping_map_wc(&i915_vm_to_ggtt(vma->vm)->iomap,
J
Joonas Lahtinen 已提交
364 365
					vma->node.start,
					vma->node.size);
C
Chris Wilson 已提交
366 367 368 369
		if (ptr == NULL) {
			err = -ENOMEM;
			goto err;
		}
J
Joonas Lahtinen 已提交
370 371 372 373 374

		vma->iomap = ptr;
	}

	__i915_vma_pin(vma);
C
Chris Wilson 已提交
375

376
	err = i915_vma_pin_fence(vma);
C
Chris Wilson 已提交
377 378 379
	if (err)
		goto err_unpin;

380
	i915_vma_set_ggtt_write(vma);
J
Joonas Lahtinen 已提交
381
	return ptr;
C
Chris Wilson 已提交
382 383 384 385 386 387 388

err_unpin:
	__i915_vma_unpin(vma);
err:
	return IO_ERR_PTR(err);
}

389 390 391 392 393 394 395 396 397 398
void i915_vma_flush_writes(struct i915_vma *vma)
{
	if (!i915_vma_has_ggtt_write(vma))
		return;

	i915_gem_flush_ggtt_writes(vma->vm->i915);

	i915_vma_unset_ggtt_write(vma);
}

C
Chris Wilson 已提交
399 400
void i915_vma_unpin_iomap(struct i915_vma *vma)
{
401
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
C
Chris Wilson 已提交
402 403 404

	GEM_BUG_ON(vma->iomap == NULL);

405 406
	i915_vma_flush_writes(vma);

C
Chris Wilson 已提交
407 408
	i915_vma_unpin_fence(vma);
	i915_vma_unpin(vma);
J
Joonas Lahtinen 已提交
409 410
}

411
void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags)
J
Joonas Lahtinen 已提交
412 413 414 415 416 417 418 419 420
{
	struct i915_vma *vma;
	struct drm_i915_gem_object *obj;

	vma = fetch_and_zero(p_vma);
	if (!vma)
		return;

	obj = vma->obj;
421
	GEM_BUG_ON(!obj);
J
Joonas Lahtinen 已提交
422 423 424 425

	i915_vma_unpin(vma);
	i915_vma_close(vma);

426 427 428
	if (flags & I915_VMA_RELEASE_MAP)
		i915_gem_object_unpin_map(obj);

J
Joonas Lahtinen 已提交
429 430 431
	__i915_gem_object_release_unless_active(obj);
}

432 433
bool i915_vma_misplaced(const struct i915_vma *vma,
			u64 size, u64 alignment, u64 flags)
J
Joonas Lahtinen 已提交
434 435 436 437 438 439 440
{
	if (!drm_mm_node_allocated(&vma->node))
		return false;

	if (vma->node.size < size)
		return true;

441 442
	GEM_BUG_ON(alignment && !is_power_of_2(alignment));
	if (alignment && !IS_ALIGNED(vma->node.start, alignment))
J
Joonas Lahtinen 已提交
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
		return true;

	if (flags & PIN_MAPPABLE && !i915_vma_is_map_and_fenceable(vma))
		return true;

	if (flags & PIN_OFFSET_BIAS &&
	    vma->node.start < (flags & PIN_OFFSET_MASK))
		return true;

	if (flags & PIN_OFFSET_FIXED &&
	    vma->node.start != (flags & PIN_OFFSET_MASK))
		return true;

	return false;
}

void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
{
	bool mappable, fenceable;

463 464
	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
	GEM_BUG_ON(!vma->fence_size);
J
Joonas Lahtinen 已提交
465 466 467 468 469

	/*
	 * Explicitly disable for rotated VMA since the display does not
	 * need the fence and the VMA is not accessible to other users.
	 */
470 471 472 473
	if (vma->ggtt_view.type == I915_GGTT_VIEW_ROTATED)
		return;

	fenceable = (vma->node.size >= vma->fence_size &&
474
		     IS_ALIGNED(vma->node.start, vma->fence_alignment));
475 476 477 478

	mappable = vma->node.start + vma->fence_size <= i915_vm_to_ggtt(vma->vm)->mappable_end;

	if (mappable && fenceable)
J
Joonas Lahtinen 已提交
479 480 481 482 483
		vma->flags |= I915_VMA_CAN_FENCE;
	else
		vma->flags &= ~I915_VMA_CAN_FENCE;
}

484
static bool color_differs(struct drm_mm_node *node, unsigned long color)
J
Joonas Lahtinen 已提交
485
{
486 487 488 489 490 491
	return node->allocated && node->color != color;
}

bool i915_gem_valid_gtt_space(struct i915_vma *vma, unsigned long cache_level)
{
	struct drm_mm_node *node = &vma->node;
J
Joonas Lahtinen 已提交
492 493 494 495 496 497 498 499 500 501 502 503
	struct drm_mm_node *other;

	/*
	 * On some machines we have to be careful when putting differing types
	 * of snoopable memory together to avoid the prefetcher crossing memory
	 * domains and dying. During vm initialisation, we decide whether or not
	 * these constraints apply and set the drm_mm.color_adjust
	 * appropriately.
	 */
	if (vma->vm->mm.color_adjust == NULL)
		return true;

504 505 506
	/* Only valid to be called on an already inserted vma */
	GEM_BUG_ON(!drm_mm_node_allocated(node));
	GEM_BUG_ON(list_empty(&node->node_list));
J
Joonas Lahtinen 已提交
507

508
	other = list_prev_entry(node, node_list);
509
	if (color_differs(other, cache_level) && !drm_mm_hole_follows(other))
J
Joonas Lahtinen 已提交
510 511
		return false;

512
	other = list_next_entry(node, node_list);
513
	if (color_differs(other, cache_level) && !drm_mm_hole_follows(node))
J
Joonas Lahtinen 已提交
514 515 516 517 518
		return false;

	return true;
}

519 520 521 522 523 524 525 526 527 528 529 530
static void assert_bind_count(const struct drm_i915_gem_object *obj)
{
	/*
	 * Combine the assertion that the object is bound and that we have
	 * pinned its pages. But we should never have bound the object
	 * more than we have pinned its pages. (For complete accuracy, we
	 * assume that no else is pinning the pages, but as a rough assertion
	 * that we will not run into problems later, this will do!)
	 */
	GEM_BUG_ON(atomic_read(&obj->mm.pages_pin_count) < obj->bind_count);
}

J
Joonas Lahtinen 已提交
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
/**
 * i915_vma_insert - finds a slot for the vma in its address space
 * @vma: the vma
 * @size: requested size in bytes (can be larger than the VMA)
 * @alignment: required alignment
 * @flags: mask of PIN_* flags to use
 *
 * First we try to allocate some free space that meets the requirements for
 * the VMA. Failiing that, if the flags permit, it will evict an old VMA,
 * preferrably the oldest idle entry to make room for the new VMA.
 *
 * Returns:
 * 0 on success, negative error code otherwise.
 */
static int
i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
{
548
	struct drm_i915_private *dev_priv = vma->vm->i915;
549
	unsigned int cache_level;
J
Joonas Lahtinen 已提交
550 551 552
	u64 start, end;
	int ret;

553
	GEM_BUG_ON(i915_vma_is_closed(vma));
J
Joonas Lahtinen 已提交
554 555 556 557
	GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));
	GEM_BUG_ON(drm_mm_node_allocated(&vma->node));

	size = max(size, vma->size);
558 559 560 561 562 563
	alignment = max(alignment, vma->display_alignment);
	if (flags & PIN_MAPPABLE) {
		size = max_t(typeof(size), size, vma->fence_size);
		alignment = max_t(typeof(alignment),
				  alignment, vma->fence_alignment);
	}
J
Joonas Lahtinen 已提交
564

565 566 567 568
	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
	GEM_BUG_ON(!IS_ALIGNED(alignment, I915_GTT_MIN_ALIGNMENT));
	GEM_BUG_ON(!is_power_of_2(alignment));

J
Joonas Lahtinen 已提交
569
	start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0;
570
	GEM_BUG_ON(!IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
J
Joonas Lahtinen 已提交
571 572 573 574 575

	end = vma->vm->total;
	if (flags & PIN_MAPPABLE)
		end = min_t(u64, end, dev_priv->ggtt.mappable_end);
	if (flags & PIN_ZONE_4G)
576 577
		end = min_t(u64, end, (1ULL << 32) - I915_GTT_PAGE_SIZE);
	GEM_BUG_ON(!IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
J
Joonas Lahtinen 已提交
578 579 580 581 582 583

	/* If binding the object/GGTT view requires more space than the entire
	 * aperture has, reject it early before evicting everything in a vain
	 * attempt to find space.
	 */
	if (size > end) {
584 585
		DRM_DEBUG("Attempting to bind an object larger than the aperture: request=%llu > %s aperture=%llu\n",
			  size, flags & PIN_MAPPABLE ? "mappable" : "total",
J
Joonas Lahtinen 已提交
586
			  end);
587
		return -ENOSPC;
J
Joonas Lahtinen 已提交
588 589
	}

590 591 592 593 594 595 596 597 598
	if (vma->obj) {
		ret = i915_gem_object_pin_pages(vma->obj);
		if (ret)
			return ret;

		cache_level = vma->obj->cache_level;
	} else {
		cache_level = 0;
	}
J
Joonas Lahtinen 已提交
599

600 601
	GEM_BUG_ON(vma->pages);

602
	ret = vma->ops->set_pages(vma);
603 604 605
	if (ret)
		goto err_unpin;

J
Joonas Lahtinen 已提交
606 607
	if (flags & PIN_OFFSET_FIXED) {
		u64 offset = flags & PIN_OFFSET_MASK;
608
		if (!IS_ALIGNED(offset, alignment) ||
C
Chris Wilson 已提交
609
		    range_overflows(offset, size, end)) {
J
Joonas Lahtinen 已提交
610
			ret = -EINVAL;
611
			goto err_clear;
J
Joonas Lahtinen 已提交
612 613
		}

614
		ret = i915_gem_gtt_reserve(vma->vm, &vma->node,
615
					   size, offset, cache_level,
616 617
					   flags);
		if (ret)
618
			goto err_clear;
J
Joonas Lahtinen 已提交
619
	} else {
620 621 622 623 624 625 626 627 628 629
		/*
		 * We only support huge gtt pages through the 48b PPGTT,
		 * however we also don't want to force any alignment for
		 * objects which need to be tightly packed into the low 32bits.
		 *
		 * Note that we assume that GGTT are limited to 4GiB for the
		 * forseeable future. See also i915_ggtt_offset().
		 */
		if (upper_32_bits(end - 1) &&
		    vma->page_sizes.sg > I915_GTT_PAGE_SIZE) {
M
Matthew Auld 已提交
630 631 632 633 634 635
			/*
			 * We can't mix 64K and 4K PTEs in the same page-table
			 * (2M block), and so to avoid the ugliness and
			 * complexity of coloring we opt for just aligning 64K
			 * objects to 2M.
			 */
636
			u64 page_alignment =
M
Matthew Auld 已提交
637 638
				rounddown_pow_of_two(vma->page_sizes.sg |
						     I915_GTT_PAGE_SIZE_2M);
639

640 641 642 643 644 645 646
			/*
			 * Check we don't expand for the limited Global GTT
			 * (mappable aperture is even more precious!). This
			 * also checks that we exclude the aliasing-ppgtt.
			 */
			GEM_BUG_ON(i915_vma_is_ggtt(vma));

647
			alignment = max(alignment, page_alignment);
M
Matthew Auld 已提交
648 649 650

			if (vma->page_sizes.sg & I915_GTT_PAGE_SIZE_64K)
				size = round_up(size, I915_GTT_PAGE_SIZE_2M);
651 652
		}

653
		ret = i915_gem_gtt_insert(vma->vm, &vma->node,
654
					  size, alignment, cache_level,
655 656
					  start, end, flags);
		if (ret)
657
			goto err_clear;
J
Joonas Lahtinen 已提交
658 659 660 661

		GEM_BUG_ON(vma->node.start < start);
		GEM_BUG_ON(vma->node.start + vma->node.size > end);
	}
662
	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
663
	GEM_BUG_ON(!i915_gem_valid_gtt_space(vma, cache_level));
J
Joonas Lahtinen 已提交
664

665
	mutex_lock(&vma->vm->mutex);
666
	list_move_tail(&vma->vm_link, &vma->vm->bound_list);
667
	mutex_unlock(&vma->vm->mutex);
668

669 670 671 672 673 674 675
	if (vma->obj) {
		struct drm_i915_gem_object *obj = vma->obj;

		spin_lock(&dev_priv->mm.obj_lock);
		list_move_tail(&obj->mm.link, &dev_priv->mm.bound_list);
		obj->bind_count++;
		spin_unlock(&dev_priv->mm.obj_lock);
676

677 678
		assert_bind_count(obj);
	}
J
Joonas Lahtinen 已提交
679 680 681

	return 0;

682
err_clear:
683
	vma->ops->clear_pages(vma);
J
Joonas Lahtinen 已提交
684
err_unpin:
685 686
	if (vma->obj)
		i915_gem_object_unpin_pages(vma->obj);
J
Joonas Lahtinen 已提交
687 688 689
	return ret;
}

690 691 692
static void
i915_vma_remove(struct i915_vma *vma)
{
693
	struct drm_i915_private *i915 = vma->vm->i915;
694 695 696 697

	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
	GEM_BUG_ON(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));

698
	vma->ops->clear_pages(vma);
699

700
	mutex_lock(&vma->vm->mutex);
701 702
	drm_mm_remove_node(&vma->node);
	list_move_tail(&vma->vm_link, &vma->vm->unbound_list);
703
	mutex_unlock(&vma->vm->mutex);
704

705 706
	/*
	 * Since the unbound list is global, only move to that list if
707 708
	 * no more VMAs exist.
	 */
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
	if (vma->obj) {
		struct drm_i915_gem_object *obj = vma->obj;

		spin_lock(&i915->mm.obj_lock);
		if (--obj->bind_count == 0)
			list_move_tail(&obj->mm.link, &i915->mm.unbound_list);
		spin_unlock(&i915->mm.obj_lock);

		/*
		 * And finally now the object is completely decoupled from this
		 * vma, we can drop its hold on the backing storage and allow
		 * it to be reaped by the shrinker.
		 */
		i915_gem_object_unpin_pages(obj);
		assert_bind_count(obj);
	}
725 726
}

J
Joonas Lahtinen 已提交
727 728 729
int __i915_vma_do_pin(struct i915_vma *vma,
		      u64 size, u64 alignment, u64 flags)
{
730
	const unsigned int bound = vma->flags;
J
Joonas Lahtinen 已提交
731 732
	int ret;

733
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
J
Joonas Lahtinen 已提交
734 735 736 737 738
	GEM_BUG_ON((flags & (PIN_GLOBAL | PIN_USER)) == 0);
	GEM_BUG_ON((flags & PIN_GLOBAL) && !i915_vma_is_ggtt(vma));

	if (WARN_ON(bound & I915_VMA_PIN_OVERFLOW)) {
		ret = -EBUSY;
739
		goto err_unpin;
J
Joonas Lahtinen 已提交
740 741 742 743 744
	}

	if ((bound & I915_VMA_BIND_MASK) == 0) {
		ret = i915_vma_insert(vma, size, alignment, flags);
		if (ret)
745
			goto err_unpin;
J
Joonas Lahtinen 已提交
746
	}
747
	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
J
Joonas Lahtinen 已提交
748

749
	ret = i915_vma_bind(vma, vma->obj ? vma->obj->cache_level : 0, flags);
J
Joonas Lahtinen 已提交
750
	if (ret)
751
		goto err_remove;
J
Joonas Lahtinen 已提交
752

753 754
	GEM_BUG_ON((vma->flags & I915_VMA_BIND_MASK) == 0);

J
Joonas Lahtinen 已提交
755 756 757 758 759 760
	if ((bound ^ vma->flags) & I915_VMA_GLOBAL_BIND)
		__i915_vma_set_map_and_fenceable(vma);

	GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
	return 0;

761 762 763
err_remove:
	if ((bound & I915_VMA_BIND_MASK) == 0) {
		i915_vma_remove(vma);
764
		GEM_BUG_ON(vma->pages);
765
		GEM_BUG_ON(vma->flags & I915_VMA_BIND_MASK);
766 767
	}
err_unpin:
J
Joonas Lahtinen 已提交
768 769 770 771
	__i915_vma_unpin(vma);
	return ret;
}

772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
void i915_vma_close(struct i915_vma *vma)
{
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);

	GEM_BUG_ON(i915_vma_is_closed(vma));
	vma->flags |= I915_VMA_CLOSED;

	/*
	 * We defer actually closing, unbinding and destroying the VMA until
	 * the next idle point, or if the object is freed in the meantime. By
	 * postponing the unbind, we allow for it to be resurrected by the
	 * client, avoiding the work required to rebind the VMA. This is
	 * advantageous for DRI, where the client/server pass objects
	 * between themselves, temporarily opening a local VMA to the
	 * object, and then closing it again. The same object is then reused
	 * on the next frame (or two, depending on the depth of the swap queue)
	 * causing us to rebind the VMA once more. This ends up being a lot
	 * of wasted work for the steady state.
	 */
	list_add_tail(&vma->closed_link, &vma->vm->i915->gt.closed_vma);
}

void i915_vma_reopen(struct i915_vma *vma)
{
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);

	if (vma->flags & I915_VMA_CLOSED) {
		vma->flags &= ~I915_VMA_CLOSED;
		list_del(&vma->closed_link);
	}
}

static void __i915_vma_destroy(struct i915_vma *vma)
J
Joonas Lahtinen 已提交
805
{
806
	struct drm_i915_private *i915 = vma->vm->i915;
807

J
Joonas Lahtinen 已提交
808 809 810
	GEM_BUG_ON(vma->node.allocated);
	GEM_BUG_ON(vma->fence);

811 812
	GEM_BUG_ON(i915_gem_active_isset(&vma->last_fence));

813
	mutex_lock(&vma->vm->mutex);
J
Joonas Lahtinen 已提交
814
	list_del(&vma->vm_link);
815 816
	mutex_unlock(&vma->vm->mutex);

817 818 819 820 821 822 823 824
	if (vma->obj) {
		struct drm_i915_gem_object *obj = vma->obj;

		spin_lock(&obj->vma.lock);
		list_del(&vma->obj_link);
		rb_erase(&vma->obj_node, &vma->obj->vma.tree);
		spin_unlock(&obj->vma.lock);
	}
825

826
	i915_active_fini(&vma->active);
827

828
	kmem_cache_free(i915->vmas, vma);
J
Joonas Lahtinen 已提交
829 830
}

831
void i915_vma_destroy(struct i915_vma *vma)
J
Joonas Lahtinen 已提交
832
{
833
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
J
Joonas Lahtinen 已提交
834

835 836 837 838 839 840 841 842 843 844 845 846 847
	GEM_BUG_ON(i915_vma_is_active(vma));
	GEM_BUG_ON(i915_vma_is_pinned(vma));

	if (i915_vma_is_closed(vma))
		list_del(&vma->closed_link);

	WARN_ON(i915_vma_unbind(vma));
	__i915_vma_destroy(vma);
}

void i915_vma_parked(struct drm_i915_private *i915)
{
	struct i915_vma *vma, *next;
J
Joonas Lahtinen 已提交
848

849 850 851 852 853 854
	list_for_each_entry_safe(vma, next, &i915->gt.closed_vma, closed_link) {
		GEM_BUG_ON(!i915_vma_is_closed(vma));
		i915_vma_destroy(vma);
	}

	GEM_BUG_ON(!list_empty(&i915->gt.closed_vma));
J
Joonas Lahtinen 已提交
855 856 857 858 859 860 861 862 863 864 865 866 867
}

static void __i915_vma_iounmap(struct i915_vma *vma)
{
	GEM_BUG_ON(i915_vma_is_pinned(vma));

	if (vma->iomap == NULL)
		return;

	io_mapping_unmap(vma->iomap);
	vma->iomap = NULL;
}

868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
void i915_vma_revoke_mmap(struct i915_vma *vma)
{
	struct drm_vma_offset_node *node = &vma->obj->base.vma_node;
	u64 vma_offset;

	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);

	if (!i915_vma_has_userfault(vma))
		return;

	GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma));
	GEM_BUG_ON(!vma->obj->userfault_count);

	vma_offset = vma->ggtt_view.partial.offset << PAGE_SHIFT;
	unmap_mapping_range(vma->vm->i915->drm.anon_inode->i_mapping,
			    drm_vma_node_offset_addr(node) + vma_offset,
			    vma->size,
			    1);

	i915_vma_unset_userfault(vma);
	if (!--vma->obj->userfault_count)
		list_del(&vma->obj->userfault_link);
}

892 893 894 895 896 897 898 899 900 901 902 903 904 905
static void export_fence(struct i915_vma *vma,
			 struct i915_request *rq,
			 unsigned int flags)
{
	struct reservation_object *resv = vma->resv;

	/*
	 * Ignore errors from failing to allocate the new fence, we can't
	 * handle an error right now. Worst case should be missed
	 * synchronisation leading to rendering corruption.
	 */
	reservation_object_lock(resv, NULL);
	if (flags & EXEC_OBJECT_WRITE)
		reservation_object_add_excl_fence(resv, &rq->fence);
906
	else if (reservation_object_reserve_shared(resv, 1) == 0)
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
		reservation_object_add_shared_fence(resv, &rq->fence);
	reservation_object_unlock(resv);
}

int i915_vma_move_to_active(struct i915_vma *vma,
			    struct i915_request *rq,
			    unsigned int flags)
{
	struct drm_i915_gem_object *obj = vma->obj;

	lockdep_assert_held(&rq->i915->drm.struct_mutex);
	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));

	/*
	 * Add a reference if we're newly entering the active list.
	 * The order in which we add operations to the retirement queue is
	 * vital here: mark_active adds to the start of the callback list,
	 * such that subsequent callbacks are called first. Therefore we
	 * add the active reference first and queue for it to be dropped
	 * *last*.
	 */
928
	if (!vma->active.count)
929
		obj->active_count++;
930 931 932 933 934 935 936

	if (unlikely(i915_active_ref(&vma->active, rq->fence.context, rq))) {
		if (!vma->active.count)
			obj->active_count--;
		return -ENOMEM;
	}

937 938
	GEM_BUG_ON(!i915_vma_is_active(vma));
	GEM_BUG_ON(!obj->active_count);
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957

	obj->write_domain = 0;
	if (flags & EXEC_OBJECT_WRITE) {
		obj->write_domain = I915_GEM_DOMAIN_RENDER;

		if (intel_fb_obj_invalidate(obj, ORIGIN_CS))
			i915_gem_active_set(&obj->frontbuffer_write, rq);

		obj->read_domains = 0;
	}
	obj->read_domains |= I915_GEM_GPU_DOMAINS;

	if (flags & EXEC_OBJECT_NEEDS_FENCE)
		i915_gem_active_set(&vma->last_fence, rq);

	export_fence(vma, rq, flags);
	return 0;
}

J
Joonas Lahtinen 已提交
958 959 960 961
int i915_vma_unbind(struct i915_vma *vma)
{
	int ret;

962
	lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
J
Joonas Lahtinen 已提交
963

964 965
	/*
	 * First wait upon any activity as retiring the request may
J
Joonas Lahtinen 已提交
966 967
	 * have side-effects such as unpinning or even unbinding this vma.
	 */
968
	might_sleep();
969
	if (i915_vma_is_active(vma)) {
970 971
		/*
		 * When a closed VMA is retired, it is unbound - eek.
J
Joonas Lahtinen 已提交
972 973 974 975 976 977 978 979 980 981 982 983 984
		 * In order to prevent it from being recursively closed,
		 * take a pin on the vma so that the second unbind is
		 * aborted.
		 *
		 * Even more scary is that the retire callback may free
		 * the object (last active vma). To prevent the explosion
		 * we defer the actual object free to a worker that can
		 * only proceed once it acquires the struct_mutex (which
		 * we currently hold, therefore it cannot free this object
		 * before we are finished).
		 */
		__i915_vma_pin(vma);

985
		ret = i915_active_wait(&vma->active);
986 987 988
		if (ret)
			goto unpin;

989 990 991
		ret = i915_gem_active_retire(&vma->last_fence,
					     &vma->vm->i915->drm.struct_mutex);
unpin:
J
Joonas Lahtinen 已提交
992 993 994 995
		__i915_vma_unpin(vma);
		if (ret)
			return ret;
	}
996
	GEM_BUG_ON(i915_vma_is_active(vma));
J
Joonas Lahtinen 已提交
997

998 999
	if (i915_vma_is_pinned(vma)) {
		vma_print_allocator(vma, "is pinned");
J
Joonas Lahtinen 已提交
1000
		return -EBUSY;
1001
	}
J
Joonas Lahtinen 已提交
1002 1003

	if (!drm_mm_node_allocated(&vma->node))
1004
		return 0;
J
Joonas Lahtinen 已提交
1005 1006

	if (i915_vma_is_map_and_fenceable(vma)) {
1007 1008 1009 1010 1011 1012 1013 1014 1015
		/*
		 * Check that we have flushed all writes through the GGTT
		 * before the unbind, other due to non-strict nature of those
		 * indirect writes they may end up referencing the GGTT PTE
		 * after the unbind.
		 */
		i915_vma_flush_writes(vma);
		GEM_BUG_ON(i915_vma_has_ggtt_write(vma));

J
Joonas Lahtinen 已提交
1016 1017 1018 1019 1020 1021
		/* release the fence reg _after_ flushing */
		ret = i915_vma_put_fence(vma);
		if (ret)
			return ret;

		/* Force a pagefault for domain tracking on next user access */
1022
		i915_vma_revoke_mmap(vma);
J
Joonas Lahtinen 已提交
1023 1024 1025 1026

		__i915_vma_iounmap(vma);
		vma->flags &= ~I915_VMA_CAN_FENCE;
	}
1027 1028
	GEM_BUG_ON(vma->fence);
	GEM_BUG_ON(i915_vma_has_userfault(vma));
J
Joonas Lahtinen 已提交
1029 1030 1031

	if (likely(!vma->vm->closed)) {
		trace_i915_vma_unbind(vma);
1032
		vma->ops->unbind_vma(vma);
J
Joonas Lahtinen 已提交
1033 1034 1035
	}
	vma->flags &= ~(I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND);

1036
	i915_vma_remove(vma);
J
Joonas Lahtinen 已提交
1037 1038 1039 1040

	return 0;
}

C
Chris Wilson 已提交
1041 1042 1043
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/i915_vma.c"
#endif