xref: /linux/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
1 /*
2  * Copyright © 2016 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  */
24 
25 #include <linux/list_sort.h>
26 #include <linux/prime_numbers.h>
27 
28 #include "gem/i915_gem_context.h"
29 #include "gem/i915_gem_internal.h"
30 #include "gem/i915_gem_region.h"
31 #include "gem/selftests/mock_context.h"
32 #include "gt/intel_context.h"
33 #include "gt/intel_gpu_commands.h"
34 #include "gt/intel_gtt.h"
35 
36 #include "i915_random.h"
37 #include "i915_selftest.h"
38 #include "i915_vma_resource.h"
39 
40 #include "mock_drm.h"
41 #include "mock_gem_device.h"
42 #include "mock_gtt.h"
43 #include "igt_flush_test.h"
44 
45 static void cleanup_freed_objects(struct drm_i915_private *i915)
46 {
47 	i915_gem_drain_freed_objects(i915);
48 }
49 
50 static void fake_free_pages(struct drm_i915_gem_object *obj,
51 			    struct sg_table *pages)
52 {
53 	sg_free_table(pages);
54 	kfree(pages);
55 }
56 
57 static int fake_get_pages(struct drm_i915_gem_object *obj)
58 {
59 #define GFP (GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY)
60 #define PFN_BIAS 0x1000
61 	struct sg_table *pages;
62 	struct scatterlist *sg;
63 	unsigned int sg_page_sizes;
64 	typeof(obj->base.size) rem;
65 
66 	pages = kmalloc(sizeof(*pages), GFP);
67 	if (!pages)
68 		return -ENOMEM;
69 
70 	rem = round_up(obj->base.size, BIT(31)) >> 31;
71 	if (sg_alloc_table(pages, rem, GFP)) {
72 		kfree(pages);
73 		return -ENOMEM;
74 	}
75 
76 	sg_page_sizes = 0;
77 	rem = obj->base.size;
78 	for (sg = pages->sgl; sg; sg = sg_next(sg)) {
79 		unsigned long len = min_t(typeof(rem), rem, BIT(31));
80 
81 		GEM_BUG_ON(!len);
82 		sg_set_page(sg, pfn_to_page(PFN_BIAS), len, 0);
83 		sg_dma_address(sg) = page_to_phys(sg_page(sg));
84 		sg_dma_len(sg) = len;
85 		sg_page_sizes |= len;
86 
87 		rem -= len;
88 	}
89 	GEM_BUG_ON(rem);
90 
91 	__i915_gem_object_set_pages(obj, pages, sg_page_sizes);
92 
93 	return 0;
94 #undef GFP
95 }
96 
97 static void fake_put_pages(struct drm_i915_gem_object *obj,
98 			   struct sg_table *pages)
99 {
100 	fake_free_pages(obj, pages);
101 	obj->mm.dirty = false;
102 }
103 
104 static const struct drm_i915_gem_object_ops fake_ops = {
105 	.name = "fake-gem",
106 	.flags = I915_GEM_OBJECT_IS_SHRINKABLE,
107 	.get_pages = fake_get_pages,
108 	.put_pages = fake_put_pages,
109 };
110 
111 static struct drm_i915_gem_object *
112 fake_dma_object(struct drm_i915_private *i915, u64 size)
113 {
114 	static struct lock_class_key lock_class;
115 	struct drm_i915_gem_object *obj;
116 
117 	GEM_BUG_ON(!size);
118 	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
119 
120 	if (overflows_type(size, obj->base.size))
121 		return ERR_PTR(-E2BIG);
122 
123 	obj = i915_gem_object_alloc();
124 	if (!obj)
125 		goto err;
126 
127 	drm_gem_private_object_init(&i915->drm, &obj->base, size);
128 	i915_gem_object_init(obj, &fake_ops, &lock_class, 0);
129 
130 	i915_gem_object_set_volatile(obj);
131 
132 	obj->write_domain = I915_GEM_DOMAIN_CPU;
133 	obj->read_domains = I915_GEM_DOMAIN_CPU;
134 	obj->cache_level = I915_CACHE_NONE;
135 
136 	/* Preallocate the "backing storage" */
137 	if (i915_gem_object_pin_pages_unlocked(obj))
138 		goto err_obj;
139 
140 	i915_gem_object_unpin_pages(obj);
141 	return obj;
142 
143 err_obj:
144 	i915_gem_object_put(obj);
145 err:
146 	return ERR_PTR(-ENOMEM);
147 }
148 
149 static int igt_ppgtt_alloc(void *arg)
150 {
151 	struct drm_i915_private *dev_priv = arg;
152 	struct i915_ppgtt *ppgtt;
153 	struct i915_gem_ww_ctx ww;
154 	u64 size, last, limit;
155 	int err = 0;
156 
157 	/* Allocate a ppggt and try to fill the entire range */
158 
159 	if (!HAS_PPGTT(dev_priv))
160 		return 0;
161 
162 	ppgtt = i915_ppgtt_create(to_gt(dev_priv), 0);
163 	if (IS_ERR(ppgtt))
164 		return PTR_ERR(ppgtt);
165 
166 	if (!ppgtt->vm.allocate_va_range)
167 		goto err_ppgtt_cleanup;
168 
169 	/*
170 	 * While we only allocate the page tables here and so we could
171 	 * address a much larger GTT than we could actually fit into
172 	 * RAM, a practical limit is the amount of physical pages in the system.
173 	 * This should ensure that we do not run into the oomkiller during
174 	 * the test and take down the machine wilfully.
175 	 */
176 	limit = totalram_pages() << PAGE_SHIFT;
177 	limit = min(ppgtt->vm.total, limit);
178 
179 	i915_gem_ww_ctx_init(&ww, false);
180 retry:
181 	err = i915_vm_lock_objects(&ppgtt->vm, &ww);
182 	if (err)
183 		goto err_ppgtt_cleanup;
184 
185 	/* Check we can allocate the entire range */
186 	for (size = 4096; size <= limit; size <<= 2) {
187 		struct i915_vm_pt_stash stash = {};
188 
189 		err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, size);
190 		if (err)
191 			goto err_ppgtt_cleanup;
192 
193 		err = i915_vm_map_pt_stash(&ppgtt->vm, &stash);
194 		if (err) {
195 			i915_vm_free_pt_stash(&ppgtt->vm, &stash);
196 			goto err_ppgtt_cleanup;
197 		}
198 
199 		ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash, 0, size);
200 		cond_resched();
201 
202 		ppgtt->vm.clear_range(&ppgtt->vm, 0, size);
203 
204 		i915_vm_free_pt_stash(&ppgtt->vm, &stash);
205 	}
206 
207 	/* Check we can incrementally allocate the entire range */
208 	for (last = 0, size = 4096; size <= limit; last = size, size <<= 2) {
209 		struct i915_vm_pt_stash stash = {};
210 
211 		err = i915_vm_alloc_pt_stash(&ppgtt->vm, &stash, size - last);
212 		if (err)
213 			goto err_ppgtt_cleanup;
214 
215 		err = i915_vm_map_pt_stash(&ppgtt->vm, &stash);
216 		if (err) {
217 			i915_vm_free_pt_stash(&ppgtt->vm, &stash);
218 			goto err_ppgtt_cleanup;
219 		}
220 
221 		ppgtt->vm.allocate_va_range(&ppgtt->vm, &stash,
222 					    last, size - last);
223 		cond_resched();
224 
225 		i915_vm_free_pt_stash(&ppgtt->vm, &stash);
226 	}
227 
228 err_ppgtt_cleanup:
229 	if (err == -EDEADLK) {
230 		err = i915_gem_ww_ctx_backoff(&ww);
231 		if (!err)
232 			goto retry;
233 	}
234 	i915_gem_ww_ctx_fini(&ww);
235 
236 	i915_vm_put(&ppgtt->vm);
237 	return err;
238 }
239 
240 static int lowlevel_hole(struct i915_address_space *vm,
241 			 u64 hole_start, u64 hole_end,
242 			 unsigned long end_time)
243 {
244 	const unsigned int min_alignment =
245 		i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
246 	I915_RND_STATE(seed_prng);
247 	struct i915_vma_resource *mock_vma_res;
248 	unsigned int size;
249 
250 	mock_vma_res = kzalloc(sizeof(*mock_vma_res), GFP_KERNEL);
251 	if (!mock_vma_res)
252 		return -ENOMEM;
253 
254 	/* Keep creating larger objects until one cannot fit into the hole */
255 	for (size = 12; (hole_end - hole_start) >> size; size++) {
256 		I915_RND_SUBSTATE(prng, seed_prng);
257 		struct drm_i915_gem_object *obj;
258 		unsigned int *order, count, n;
259 		u64 hole_size, aligned_size;
260 
261 		aligned_size = max_t(u32, ilog2(min_alignment), size);
262 		hole_size = (hole_end - hole_start) >> aligned_size;
263 		if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
264 			hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
265 		count = hole_size >> 1;
266 		if (!count) {
267 			pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
268 				 __func__, hole_start, hole_end, size, hole_size);
269 			break;
270 		}
271 
272 		do {
273 			order = i915_random_order(count, &prng);
274 			if (order)
275 				break;
276 		} while (count >>= 1);
277 		if (!count) {
278 			kfree(mock_vma_res);
279 			return -ENOMEM;
280 		}
281 		GEM_BUG_ON(!order);
282 
283 		GEM_BUG_ON(count * BIT_ULL(aligned_size) > vm->total);
284 		GEM_BUG_ON(hole_start + count * BIT_ULL(aligned_size) > hole_end);
285 
286 		/* Ignore allocation failures (i.e. don't report them as
287 		 * a test failure) as we are purposefully allocating very
288 		 * large objects without checking that we have sufficient
289 		 * memory. We expect to hit -ENOMEM.
290 		 */
291 
292 		obj = fake_dma_object(vm->i915, BIT_ULL(size));
293 		if (IS_ERR(obj)) {
294 			kfree(order);
295 			break;
296 		}
297 
298 		GEM_BUG_ON(obj->base.size != BIT_ULL(size));
299 
300 		if (i915_gem_object_pin_pages_unlocked(obj)) {
301 			i915_gem_object_put(obj);
302 			kfree(order);
303 			break;
304 		}
305 
306 		for (n = 0; n < count; n++) {
307 			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
308 			intel_wakeref_t wakeref;
309 
310 			GEM_BUG_ON(addr + BIT_ULL(aligned_size) > vm->total);
311 
312 			if (igt_timeout(end_time,
313 					"%s timed out before %d/%d\n",
314 					__func__, n, count)) {
315 				hole_end = hole_start; /* quit */
316 				break;
317 			}
318 
319 			if (vm->allocate_va_range) {
320 				struct i915_vm_pt_stash stash = {};
321 				struct i915_gem_ww_ctx ww;
322 				int err;
323 
324 				i915_gem_ww_ctx_init(&ww, false);
325 retry:
326 				err = i915_vm_lock_objects(vm, &ww);
327 				if (err)
328 					goto alloc_vm_end;
329 
330 				err = -ENOMEM;
331 				if (i915_vm_alloc_pt_stash(vm, &stash,
332 							   BIT_ULL(size)))
333 					goto alloc_vm_end;
334 
335 				err = i915_vm_map_pt_stash(vm, &stash);
336 				if (!err)
337 					vm->allocate_va_range(vm, &stash,
338 							      addr, BIT_ULL(size));
339 				i915_vm_free_pt_stash(vm, &stash);
340 alloc_vm_end:
341 				if (err == -EDEADLK) {
342 					err = i915_gem_ww_ctx_backoff(&ww);
343 					if (!err)
344 						goto retry;
345 				}
346 				i915_gem_ww_ctx_fini(&ww);
347 
348 				if (err)
349 					break;
350 			}
351 
352 			mock_vma_res->bi.pages = obj->mm.pages;
353 			mock_vma_res->node_size = BIT_ULL(aligned_size);
354 			mock_vma_res->start = addr;
355 
356 			with_intel_runtime_pm(vm->gt->uncore->rpm, wakeref)
357 			  vm->insert_entries(vm, mock_vma_res,
358 						   I915_CACHE_NONE, 0);
359 		}
360 		count = n;
361 
362 		i915_random_reorder(order, count, &prng);
363 		for (n = 0; n < count; n++) {
364 			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
365 			intel_wakeref_t wakeref;
366 
367 			GEM_BUG_ON(addr + BIT_ULL(size) > vm->total);
368 			with_intel_runtime_pm(vm->gt->uncore->rpm, wakeref)
369 				vm->clear_range(vm, addr, BIT_ULL(size));
370 		}
371 
372 		i915_gem_object_unpin_pages(obj);
373 		i915_gem_object_put(obj);
374 
375 		kfree(order);
376 
377 		cleanup_freed_objects(vm->i915);
378 	}
379 
380 	kfree(mock_vma_res);
381 	return 0;
382 }
383 
384 static void close_object_list(struct list_head *objects,
385 			      struct i915_address_space *vm)
386 {
387 	struct drm_i915_gem_object *obj, *on;
388 	int ignored;
389 
390 	list_for_each_entry_safe(obj, on, objects, st_link) {
391 		struct i915_vma *vma;
392 
393 		vma = i915_vma_instance(obj, vm, NULL);
394 		if (!IS_ERR(vma))
395 			ignored = i915_vma_unbind_unlocked(vma);
396 
397 		list_del(&obj->st_link);
398 		i915_gem_object_put(obj);
399 	}
400 }
401 
402 static int fill_hole(struct i915_address_space *vm,
403 		     u64 hole_start, u64 hole_end,
404 		     unsigned long end_time)
405 {
406 	const u64 hole_size = hole_end - hole_start;
407 	struct drm_i915_gem_object *obj;
408 	const unsigned int min_alignment =
409 		i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
410 	const unsigned long max_pages =
411 		min_t(u64, ULONG_MAX - 1, (hole_size / 2) >> ilog2(min_alignment));
412 	const unsigned long max_step = max(int_sqrt(max_pages), 2UL);
413 	unsigned long npages, prime, flags;
414 	struct i915_vma *vma;
415 	LIST_HEAD(objects);
416 	int err;
417 
418 	/* Try binding many VMA working inwards from either edge */
419 
420 	flags = PIN_OFFSET_FIXED | PIN_USER;
421 	if (i915_is_ggtt(vm))
422 		flags |= PIN_GLOBAL;
423 
424 	for_each_prime_number_from(prime, 2, max_step) {
425 		for (npages = 1; npages <= max_pages; npages *= prime) {
426 			const u64 full_size = npages << PAGE_SHIFT;
427 			const struct {
428 				const char *name;
429 				u64 offset;
430 				int step;
431 			} phases[] = {
432 				{ "top-down", hole_end, -1, },
433 				{ "bottom-up", hole_start, 1, },
434 				{ }
435 			}, *p;
436 
437 			obj = fake_dma_object(vm->i915, full_size);
438 			if (IS_ERR(obj))
439 				break;
440 
441 			list_add(&obj->st_link, &objects);
442 
443 			/* Align differing sized objects against the edges, and
444 			 * check we don't walk off into the void when binding
445 			 * them into the GTT.
446 			 */
447 			for (p = phases; p->name; p++) {
448 				u64 offset;
449 
450 				offset = p->offset;
451 				list_for_each_entry(obj, &objects, st_link) {
452 					u64 aligned_size = round_up(obj->base.size,
453 								    min_alignment);
454 
455 					vma = i915_vma_instance(obj, vm, NULL);
456 					if (IS_ERR(vma))
457 						continue;
458 
459 					if (p->step < 0) {
460 						if (offset < hole_start + aligned_size)
461 							break;
462 						offset -= aligned_size;
463 					}
464 
465 					err = i915_vma_pin(vma, 0, 0, offset | flags);
466 					if (err) {
467 						pr_err("%s(%s) pin (forward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
468 						       __func__, p->name, err, npages, prime, offset);
469 						goto err;
470 					}
471 
472 					if (!drm_mm_node_allocated(&vma->node) ||
473 					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
474 						pr_err("%s(%s) (forward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
475 						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
476 						       offset);
477 						err = -EINVAL;
478 						goto err;
479 					}
480 
481 					i915_vma_unpin(vma);
482 
483 					if (p->step > 0) {
484 						if (offset + aligned_size > hole_end)
485 							break;
486 						offset += aligned_size;
487 					}
488 				}
489 
490 				offset = p->offset;
491 				list_for_each_entry(obj, &objects, st_link) {
492 					u64 aligned_size = round_up(obj->base.size,
493 								    min_alignment);
494 
495 					vma = i915_vma_instance(obj, vm, NULL);
496 					if (IS_ERR(vma))
497 						continue;
498 
499 					if (p->step < 0) {
500 						if (offset < hole_start + aligned_size)
501 							break;
502 						offset -= aligned_size;
503 					}
504 
505 					if (!drm_mm_node_allocated(&vma->node) ||
506 					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
507 						pr_err("%s(%s) (forward) moved vma.node=%llx + %llx, expected offset %llx\n",
508 						       __func__, p->name, vma->node.start, vma->node.size,
509 						       offset);
510 						err = -EINVAL;
511 						goto err;
512 					}
513 
514 					err = i915_vma_unbind_unlocked(vma);
515 					if (err) {
516 						pr_err("%s(%s) (forward) unbind of vma.node=%llx + %llx failed with err=%d\n",
517 						       __func__, p->name, vma->node.start, vma->node.size,
518 						       err);
519 						goto err;
520 					}
521 
522 					if (p->step > 0) {
523 						if (offset + aligned_size > hole_end)
524 							break;
525 						offset += aligned_size;
526 					}
527 				}
528 
529 				offset = p->offset;
530 				list_for_each_entry_reverse(obj, &objects, st_link) {
531 					u64 aligned_size = round_up(obj->base.size,
532 								    min_alignment);
533 
534 					vma = i915_vma_instance(obj, vm, NULL);
535 					if (IS_ERR(vma))
536 						continue;
537 
538 					if (p->step < 0) {
539 						if (offset < hole_start + aligned_size)
540 							break;
541 						offset -= aligned_size;
542 					}
543 
544 					err = i915_vma_pin(vma, 0, 0, offset | flags);
545 					if (err) {
546 						pr_err("%s(%s) pin (backward) failed with err=%d on size=%lu pages (prime=%lu), offset=%llx\n",
547 						       __func__, p->name, err, npages, prime, offset);
548 						goto err;
549 					}
550 
551 					if (!drm_mm_node_allocated(&vma->node) ||
552 					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
553 						pr_err("%s(%s) (backward) insert failed: vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
554 						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
555 						       offset);
556 						err = -EINVAL;
557 						goto err;
558 					}
559 
560 					i915_vma_unpin(vma);
561 
562 					if (p->step > 0) {
563 						if (offset + aligned_size > hole_end)
564 							break;
565 						offset += aligned_size;
566 					}
567 				}
568 
569 				offset = p->offset;
570 				list_for_each_entry_reverse(obj, &objects, st_link) {
571 					u64 aligned_size = round_up(obj->base.size,
572 								    min_alignment);
573 
574 					vma = i915_vma_instance(obj, vm, NULL);
575 					if (IS_ERR(vma))
576 						continue;
577 
578 					if (p->step < 0) {
579 						if (offset < hole_start + aligned_size)
580 							break;
581 						offset -= aligned_size;
582 					}
583 
584 					if (!drm_mm_node_allocated(&vma->node) ||
585 					    i915_vma_misplaced(vma, 0, 0, offset | flags)) {
586 						pr_err("%s(%s) (backward) moved vma.node=%llx + %llx [allocated? %d], expected offset %llx\n",
587 						       __func__, p->name, vma->node.start, vma->node.size, drm_mm_node_allocated(&vma->node),
588 						       offset);
589 						err = -EINVAL;
590 						goto err;
591 					}
592 
593 					err = i915_vma_unbind_unlocked(vma);
594 					if (err) {
595 						pr_err("%s(%s) (backward) unbind of vma.node=%llx + %llx failed with err=%d\n",
596 						       __func__, p->name, vma->node.start, vma->node.size,
597 						       err);
598 						goto err;
599 					}
600 
601 					if (p->step > 0) {
602 						if (offset + aligned_size > hole_end)
603 							break;
604 						offset += aligned_size;
605 					}
606 				}
607 			}
608 
609 			if (igt_timeout(end_time, "%s timed out (npages=%lu, prime=%lu)\n",
610 					__func__, npages, prime)) {
611 				err = -EINTR;
612 				goto err;
613 			}
614 		}
615 
616 		close_object_list(&objects, vm);
617 		cleanup_freed_objects(vm->i915);
618 	}
619 
620 	return 0;
621 
622 err:
623 	close_object_list(&objects, vm);
624 	return err;
625 }
626 
627 static int walk_hole(struct i915_address_space *vm,
628 		     u64 hole_start, u64 hole_end,
629 		     unsigned long end_time)
630 {
631 	const u64 hole_size = hole_end - hole_start;
632 	const unsigned long max_pages =
633 		min_t(u64, ULONG_MAX - 1, hole_size >> PAGE_SHIFT);
634 	unsigned long min_alignment;
635 	unsigned long flags;
636 	u64 size;
637 
638 	/* Try binding a single VMA in different positions within the hole */
639 
640 	flags = PIN_OFFSET_FIXED | PIN_USER;
641 	if (i915_is_ggtt(vm))
642 		flags |= PIN_GLOBAL;
643 
644 	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
645 
646 	for_each_prime_number_from(size, 1, max_pages) {
647 		struct drm_i915_gem_object *obj;
648 		struct i915_vma *vma;
649 		u64 addr;
650 		int err = 0;
651 
652 		obj = fake_dma_object(vm->i915, size << PAGE_SHIFT);
653 		if (IS_ERR(obj))
654 			break;
655 
656 		vma = i915_vma_instance(obj, vm, NULL);
657 		if (IS_ERR(vma)) {
658 			err = PTR_ERR(vma);
659 			goto err_put;
660 		}
661 
662 		for (addr = hole_start;
663 		     addr + obj->base.size < hole_end;
664 		     addr += round_up(obj->base.size, min_alignment)) {
665 			err = i915_vma_pin(vma, 0, 0, addr | flags);
666 			if (err) {
667 				pr_err("%s bind failed at %llx + %llx [hole %llx- %llx] with err=%d\n",
668 				       __func__, addr, vma->size,
669 				       hole_start, hole_end, err);
670 				goto err_put;
671 			}
672 			i915_vma_unpin(vma);
673 
674 			if (!drm_mm_node_allocated(&vma->node) ||
675 			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
676 				pr_err("%s incorrect at %llx + %llx\n",
677 				       __func__, addr, vma->size);
678 				err = -EINVAL;
679 				goto err_put;
680 			}
681 
682 			err = i915_vma_unbind_unlocked(vma);
683 			if (err) {
684 				pr_err("%s unbind failed at %llx + %llx  with err=%d\n",
685 				       __func__, addr, vma->size, err);
686 				goto err_put;
687 			}
688 
689 			GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
690 
691 			if (igt_timeout(end_time,
692 					"%s timed out at %llx\n",
693 					__func__, addr)) {
694 				err = -EINTR;
695 				goto err_put;
696 			}
697 		}
698 
699 err_put:
700 		i915_gem_object_put(obj);
701 		if (err)
702 			return err;
703 
704 		cleanup_freed_objects(vm->i915);
705 	}
706 
707 	return 0;
708 }
709 
710 static int pot_hole(struct i915_address_space *vm,
711 		    u64 hole_start, u64 hole_end,
712 		    unsigned long end_time)
713 {
714 	struct drm_i915_gem_object *obj;
715 	struct i915_vma *vma;
716 	unsigned int min_alignment;
717 	unsigned long flags;
718 	unsigned int pot;
719 	int err = 0;
720 
721 	flags = PIN_OFFSET_FIXED | PIN_USER;
722 	if (i915_is_ggtt(vm))
723 		flags |= PIN_GLOBAL;
724 
725 	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
726 
727 	obj = i915_gem_object_create_internal(vm->i915, 2 * I915_GTT_PAGE_SIZE);
728 	if (IS_ERR(obj))
729 		return PTR_ERR(obj);
730 
731 	vma = i915_vma_instance(obj, vm, NULL);
732 	if (IS_ERR(vma)) {
733 		err = PTR_ERR(vma);
734 		goto err_obj;
735 	}
736 
737 	/* Insert a pair of pages across every pot boundary within the hole */
738 	for (pot = fls64(hole_end - 1) - 1;
739 	     pot > ilog2(2 * min_alignment);
740 	     pot--) {
741 		u64 step = BIT_ULL(pot);
742 		u64 addr;
743 
744 		for (addr = round_up(hole_start + min_alignment, step) - min_alignment;
745 		     addr <= round_down(hole_end - (2 * min_alignment), step) - min_alignment;
746 		     addr += step) {
747 			err = i915_vma_pin(vma, 0, 0, addr | flags);
748 			if (err) {
749 				pr_err("%s failed to pin object at %llx in hole [%llx - %llx], with err=%d\n",
750 				       __func__,
751 				       addr,
752 				       hole_start, hole_end,
753 				       err);
754 				goto err_obj;
755 			}
756 
757 			if (!drm_mm_node_allocated(&vma->node) ||
758 			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
759 				pr_err("%s incorrect at %llx + %llx\n",
760 				       __func__, addr, vma->size);
761 				i915_vma_unpin(vma);
762 				err = i915_vma_unbind_unlocked(vma);
763 				err = -EINVAL;
764 				goto err_obj;
765 			}
766 
767 			i915_vma_unpin(vma);
768 			err = i915_vma_unbind_unlocked(vma);
769 			GEM_BUG_ON(err);
770 		}
771 
772 		if (igt_timeout(end_time,
773 				"%s timed out after %d/%d\n",
774 				__func__, pot, fls64(hole_end - 1) - 1)) {
775 			err = -EINTR;
776 			goto err_obj;
777 		}
778 	}
779 
780 err_obj:
781 	i915_gem_object_put(obj);
782 	return err;
783 }
784 
785 static int drunk_hole(struct i915_address_space *vm,
786 		      u64 hole_start, u64 hole_end,
787 		      unsigned long end_time)
788 {
789 	I915_RND_STATE(prng);
790 	unsigned int min_alignment;
791 	unsigned int size;
792 	unsigned long flags;
793 
794 	flags = PIN_OFFSET_FIXED | PIN_USER;
795 	if (i915_is_ggtt(vm))
796 		flags |= PIN_GLOBAL;
797 
798 	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
799 
800 	/* Keep creating larger objects until one cannot fit into the hole */
801 	for (size = 12; (hole_end - hole_start) >> size; size++) {
802 		struct drm_i915_gem_object *obj;
803 		unsigned int *order, count, n;
804 		struct i915_vma *vma;
805 		u64 hole_size, aligned_size;
806 		int err = -ENODEV;
807 
808 		aligned_size = max_t(u32, ilog2(min_alignment), size);
809 		hole_size = (hole_end - hole_start) >> aligned_size;
810 		if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
811 			hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
812 		count = hole_size >> 1;
813 		if (!count) {
814 			pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
815 				 __func__, hole_start, hole_end, size, hole_size);
816 			break;
817 		}
818 
819 		do {
820 			order = i915_random_order(count, &prng);
821 			if (order)
822 				break;
823 		} while (count >>= 1);
824 		if (!count)
825 			return -ENOMEM;
826 		GEM_BUG_ON(!order);
827 
828 		/* Ignore allocation failures (i.e. don't report them as
829 		 * a test failure) as we are purposefully allocating very
830 		 * large objects without checking that we have sufficient
831 		 * memory. We expect to hit -ENOMEM.
832 		 */
833 
834 		obj = fake_dma_object(vm->i915, BIT_ULL(size));
835 		if (IS_ERR(obj)) {
836 			kfree(order);
837 			break;
838 		}
839 
840 		vma = i915_vma_instance(obj, vm, NULL);
841 		if (IS_ERR(vma)) {
842 			err = PTR_ERR(vma);
843 			goto err_obj;
844 		}
845 
846 		GEM_BUG_ON(vma->size != BIT_ULL(size));
847 
848 		for (n = 0; n < count; n++) {
849 			u64 addr = hole_start + order[n] * BIT_ULL(aligned_size);
850 
851 			err = i915_vma_pin(vma, 0, 0, addr | flags);
852 			if (err) {
853 				pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
854 				       __func__,
855 				       addr, BIT_ULL(size),
856 				       hole_start, hole_end,
857 				       err);
858 				goto err_obj;
859 			}
860 
861 			if (!drm_mm_node_allocated(&vma->node) ||
862 			    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
863 				pr_err("%s incorrect at %llx + %llx\n",
864 				       __func__, addr, BIT_ULL(size));
865 				i915_vma_unpin(vma);
866 				err = i915_vma_unbind_unlocked(vma);
867 				err = -EINVAL;
868 				goto err_obj;
869 			}
870 
871 			i915_vma_unpin(vma);
872 			err = i915_vma_unbind_unlocked(vma);
873 			GEM_BUG_ON(err);
874 
875 			if (igt_timeout(end_time,
876 					"%s timed out after %d/%d\n",
877 					__func__, n, count)) {
878 				err = -EINTR;
879 				goto err_obj;
880 			}
881 		}
882 
883 err_obj:
884 		i915_gem_object_put(obj);
885 		kfree(order);
886 		if (err)
887 			return err;
888 
889 		cleanup_freed_objects(vm->i915);
890 	}
891 
892 	return 0;
893 }
894 
895 static int __shrink_hole(struct i915_address_space *vm,
896 			 u64 hole_start, u64 hole_end,
897 			 unsigned long end_time)
898 {
899 	struct drm_i915_gem_object *obj;
900 	unsigned long flags = PIN_OFFSET_FIXED | PIN_USER;
901 	unsigned int min_alignment;
902 	unsigned int order = 12;
903 	LIST_HEAD(objects);
904 	int err = 0;
905 	u64 addr;
906 
907 	min_alignment = i915_vm_min_alignment(vm, INTEL_MEMORY_SYSTEM);
908 
909 	/* Keep creating larger objects until one cannot fit into the hole */
910 	for (addr = hole_start; addr < hole_end; ) {
911 		struct i915_vma *vma;
912 		u64 size = BIT_ULL(order++);
913 
914 		size = min(size, hole_end - addr);
915 		obj = fake_dma_object(vm->i915, size);
916 		if (IS_ERR(obj)) {
917 			err = PTR_ERR(obj);
918 			break;
919 		}
920 
921 		list_add(&obj->st_link, &objects);
922 
923 		vma = i915_vma_instance(obj, vm, NULL);
924 		if (IS_ERR(vma)) {
925 			err = PTR_ERR(vma);
926 			break;
927 		}
928 
929 		GEM_BUG_ON(vma->size != size);
930 
931 		err = i915_vma_pin(vma, 0, 0, addr | flags);
932 		if (err) {
933 			pr_err("%s failed to pin object at %llx + %llx in hole [%llx - %llx], with err=%d\n",
934 			       __func__, addr, size, hole_start, hole_end, err);
935 			break;
936 		}
937 
938 		if (!drm_mm_node_allocated(&vma->node) ||
939 		    i915_vma_misplaced(vma, 0, 0, addr | flags)) {
940 			pr_err("%s incorrect at %llx + %llx\n",
941 			       __func__, addr, size);
942 			i915_vma_unpin(vma);
943 			err = i915_vma_unbind_unlocked(vma);
944 			err = -EINVAL;
945 			break;
946 		}
947 
948 		i915_vma_unpin(vma);
949 		addr += round_up(size, min_alignment);
950 
951 		/*
952 		 * Since we are injecting allocation faults at random intervals,
953 		 * wait for this allocation to complete before we change the
954 		 * faultinjection.
955 		 */
956 		err = i915_vma_sync(vma);
957 		if (err)
958 			break;
959 
960 		if (igt_timeout(end_time,
961 				"%s timed out at ofset %llx [%llx - %llx]\n",
962 				__func__, addr, hole_start, hole_end)) {
963 			err = -EINTR;
964 			break;
965 		}
966 	}
967 
968 	close_object_list(&objects, vm);
969 	cleanup_freed_objects(vm->i915);
970 	return err;
971 }
972 
973 static int shrink_hole(struct i915_address_space *vm,
974 		       u64 hole_start, u64 hole_end,
975 		       unsigned long end_time)
976 {
977 	unsigned long prime;
978 	int err;
979 
980 	vm->fault_attr.probability = 999;
981 	atomic_set(&vm->fault_attr.times, -1);
982 
983 	for_each_prime_number_from(prime, 0, ULONG_MAX - 1) {
984 		vm->fault_attr.interval = prime;
985 		err = __shrink_hole(vm, hole_start, hole_end, end_time);
986 		if (err)
987 			break;
988 	}
989 
990 	memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
991 
992 	return err;
993 }
994 
995 static int shrink_boom(struct i915_address_space *vm,
996 		       u64 hole_start, u64 hole_end,
997 		       unsigned long end_time)
998 {
999 	unsigned int sizes[] = { SZ_2M, SZ_1G };
1000 	struct drm_i915_gem_object *purge;
1001 	struct drm_i915_gem_object *explode;
1002 	int err;
1003 	int i;
1004 
1005 	/*
1006 	 * Catch the case which shrink_hole seems to miss. The setup here
1007 	 * requires invoking the shrinker as we do the alloc_pt/alloc_pd, while
1008 	 * ensuring that all vma assiocated with the respective pd/pdp are
1009 	 * unpinned at the time.
1010 	 */
1011 
1012 	for (i = 0; i < ARRAY_SIZE(sizes); ++i) {
1013 		unsigned int flags = PIN_USER | PIN_OFFSET_FIXED;
1014 		unsigned int size = sizes[i];
1015 		struct i915_vma *vma;
1016 
1017 		purge = fake_dma_object(vm->i915, size);
1018 		if (IS_ERR(purge))
1019 			return PTR_ERR(purge);
1020 
1021 		vma = i915_vma_instance(purge, vm, NULL);
1022 		if (IS_ERR(vma)) {
1023 			err = PTR_ERR(vma);
1024 			goto err_purge;
1025 		}
1026 
1027 		err = i915_vma_pin(vma, 0, 0, flags);
1028 		if (err)
1029 			goto err_purge;
1030 
1031 		/* Should now be ripe for purging */
1032 		i915_vma_unpin(vma);
1033 
1034 		explode = fake_dma_object(vm->i915, size);
1035 		if (IS_ERR(explode)) {
1036 			err = PTR_ERR(explode);
1037 			goto err_purge;
1038 		}
1039 
1040 		vm->fault_attr.probability = 100;
1041 		vm->fault_attr.interval = 1;
1042 		atomic_set(&vm->fault_attr.times, -1);
1043 
1044 		vma = i915_vma_instance(explode, vm, NULL);
1045 		if (IS_ERR(vma)) {
1046 			err = PTR_ERR(vma);
1047 			goto err_explode;
1048 		}
1049 
1050 		err = i915_vma_pin(vma, 0, 0, flags | size);
1051 		if (err)
1052 			goto err_explode;
1053 
1054 		i915_vma_unpin(vma);
1055 
1056 		i915_gem_object_put(purge);
1057 		i915_gem_object_put(explode);
1058 
1059 		memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
1060 		cleanup_freed_objects(vm->i915);
1061 	}
1062 
1063 	return 0;
1064 
1065 err_explode:
1066 	i915_gem_object_put(explode);
1067 err_purge:
1068 	i915_gem_object_put(purge);
1069 	memset(&vm->fault_attr, 0, sizeof(vm->fault_attr));
1070 	return err;
1071 }
1072 
1073 static int misaligned_case(struct i915_address_space *vm, struct intel_memory_region *mr,
1074 			   u64 addr, u64 size, unsigned long flags)
1075 {
1076 	struct drm_i915_gem_object *obj;
1077 	struct i915_vma *vma;
1078 	int err = 0;
1079 	u64 expected_vma_size, expected_node_size;
1080 	bool is_stolen = mr->type == INTEL_MEMORY_STOLEN_SYSTEM ||
1081 			 mr->type == INTEL_MEMORY_STOLEN_LOCAL;
1082 
1083 	obj = i915_gem_object_create_region(mr, size, 0, 0);
1084 	if (IS_ERR(obj)) {
1085 		/* if iGVT-g or DMAR is active, stolen mem will be uninitialized */
1086 		if (PTR_ERR(obj) == -ENODEV && is_stolen)
1087 			return 0;
1088 		return PTR_ERR(obj);
1089 	}
1090 
1091 	vma = i915_vma_instance(obj, vm, NULL);
1092 	if (IS_ERR(vma)) {
1093 		err = PTR_ERR(vma);
1094 		goto err_put;
1095 	}
1096 
1097 	err = i915_vma_pin(vma, 0, 0, addr | flags);
1098 	if (err)
1099 		goto err_put;
1100 	i915_vma_unpin(vma);
1101 
1102 	if (!drm_mm_node_allocated(&vma->node)) {
1103 		err = -EINVAL;
1104 		goto err_put;
1105 	}
1106 
1107 	if (i915_vma_misplaced(vma, 0, 0, addr | flags)) {
1108 		err = -EINVAL;
1109 		goto err_put;
1110 	}
1111 
1112 	expected_vma_size = round_up(size, 1 << (ffs(vma->resource->page_sizes_gtt) - 1));
1113 	expected_node_size = expected_vma_size;
1114 
1115 	if (HAS_64K_PAGES(vm->i915) && i915_gem_object_is_lmem(obj)) {
1116 		/*
1117 		 * The compact-pt should expand lmem node to 2MB for the ppGTT,
1118 		 * for all other cases we should only expect 64K.
1119 		 */
1120 		expected_vma_size = round_up(size, I915_GTT_PAGE_SIZE_64K);
1121 		if (NEEDS_COMPACT_PT(vm->i915) && !i915_is_ggtt(vm))
1122 			expected_node_size = round_up(size, I915_GTT_PAGE_SIZE_2M);
1123 		else
1124 			expected_node_size = round_up(size, I915_GTT_PAGE_SIZE_64K);
1125 	}
1126 
1127 	if (vma->size != expected_vma_size || vma->node.size != expected_node_size) {
1128 		err = i915_vma_unbind_unlocked(vma);
1129 		err = -EBADSLT;
1130 		goto err_put;
1131 	}
1132 
1133 	err = i915_vma_unbind_unlocked(vma);
1134 	if (err)
1135 		goto err_put;
1136 
1137 	GEM_BUG_ON(drm_mm_node_allocated(&vma->node));
1138 
1139 err_put:
1140 	i915_gem_object_put(obj);
1141 	cleanup_freed_objects(vm->i915);
1142 	return err;
1143 }
1144 
1145 static int misaligned_pin(struct i915_address_space *vm,
1146 			  u64 hole_start, u64 hole_end,
1147 			  unsigned long end_time)
1148 {
1149 	struct intel_memory_region *mr;
1150 	enum intel_region_id id;
1151 	unsigned long flags = PIN_OFFSET_FIXED | PIN_USER;
1152 	int err = 0;
1153 	u64 hole_size = hole_end - hole_start;
1154 
1155 	if (i915_is_ggtt(vm))
1156 		flags |= PIN_GLOBAL;
1157 
1158 	for_each_memory_region(mr, vm->i915, id) {
1159 		u64 min_alignment = i915_vm_min_alignment(vm, mr->type);
1160 		u64 size = min_alignment;
1161 		u64 addr = round_down(hole_start + (hole_size / 2), min_alignment);
1162 
1163 		/* avoid -ENOSPC on very small hole setups */
1164 		if (hole_size < 3 * min_alignment)
1165 			continue;
1166 
1167 		/* we can't test < 4k alignment due to flags being encoded in lower bits */
1168 		if (min_alignment != I915_GTT_PAGE_SIZE_4K) {
1169 			err = misaligned_case(vm, mr, addr + (min_alignment / 2), size, flags);
1170 			/* misaligned should error with -EINVAL*/
1171 			if (!err)
1172 				err = -EBADSLT;
1173 			if (err != -EINVAL)
1174 				return err;
1175 		}
1176 
1177 		/* test for vma->size expansion to min page size */
1178 		err = misaligned_case(vm, mr, addr, PAGE_SIZE, flags);
1179 		if (err)
1180 			return err;
1181 
1182 		/* test for intermediate size not expanding vma->size for large alignments */
1183 		err = misaligned_case(vm, mr, addr, size / 2, flags);
1184 		if (err)
1185 			return err;
1186 	}
1187 
1188 	return 0;
1189 }
1190 
1191 static int exercise_ppgtt(struct drm_i915_private *dev_priv,
1192 			  int (*func)(struct i915_address_space *vm,
1193 				      u64 hole_start, u64 hole_end,
1194 				      unsigned long end_time))
1195 {
1196 	struct i915_ppgtt *ppgtt;
1197 	IGT_TIMEOUT(end_time);
1198 	struct file *file;
1199 	int err;
1200 
1201 	if (!HAS_FULL_PPGTT(dev_priv))
1202 		return 0;
1203 
1204 	file = mock_file(dev_priv);
1205 	if (IS_ERR(file))
1206 		return PTR_ERR(file);
1207 
1208 	ppgtt = i915_ppgtt_create(to_gt(dev_priv), 0);
1209 	if (IS_ERR(ppgtt)) {
1210 		err = PTR_ERR(ppgtt);
1211 		goto out_free;
1212 	}
1213 	GEM_BUG_ON(offset_in_page(ppgtt->vm.total));
1214 	assert_vm_alive(&ppgtt->vm);
1215 
1216 	err = func(&ppgtt->vm, 0, ppgtt->vm.total, end_time);
1217 
1218 	i915_vm_put(&ppgtt->vm);
1219 
1220 out_free:
1221 	fput(file);
1222 	return err;
1223 }
1224 
1225 static int igt_ppgtt_fill(void *arg)
1226 {
1227 	return exercise_ppgtt(arg, fill_hole);
1228 }
1229 
1230 static int igt_ppgtt_walk(void *arg)
1231 {
1232 	return exercise_ppgtt(arg, walk_hole);
1233 }
1234 
1235 static int igt_ppgtt_pot(void *arg)
1236 {
1237 	return exercise_ppgtt(arg, pot_hole);
1238 }
1239 
1240 static int igt_ppgtt_drunk(void *arg)
1241 {
1242 	return exercise_ppgtt(arg, drunk_hole);
1243 }
1244 
1245 static int igt_ppgtt_lowlevel(void *arg)
1246 {
1247 	return exercise_ppgtt(arg, lowlevel_hole);
1248 }
1249 
1250 static int igt_ppgtt_shrink(void *arg)
1251 {
1252 	return exercise_ppgtt(arg, shrink_hole);
1253 }
1254 
1255 static int igt_ppgtt_shrink_boom(void *arg)
1256 {
1257 	return exercise_ppgtt(arg, shrink_boom);
1258 }
1259 
1260 static int igt_ppgtt_misaligned_pin(void *arg)
1261 {
1262 	return exercise_ppgtt(arg, misaligned_pin);
1263 }
1264 
1265 static int sort_holes(void *priv, const struct list_head *A,
1266 		      const struct list_head *B)
1267 {
1268 	struct drm_mm_node *a = list_entry(A, typeof(*a), hole_stack);
1269 	struct drm_mm_node *b = list_entry(B, typeof(*b), hole_stack);
1270 
1271 	if (a->start < b->start)
1272 		return -1;
1273 	else
1274 		return 1;
1275 }
1276 
1277 static int exercise_ggtt(struct drm_i915_private *i915,
1278 			 int (*func)(struct i915_address_space *vm,
1279 				     u64 hole_start, u64 hole_end,
1280 				     unsigned long end_time))
1281 {
1282 	struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1283 	u64 hole_start, hole_end, last = 0;
1284 	struct drm_mm_node *node;
1285 	IGT_TIMEOUT(end_time);
1286 	int err = 0;
1287 
1288 restart:
1289 	list_sort(NULL, &ggtt->vm.mm.hole_stack, sort_holes);
1290 	drm_mm_for_each_hole(node, &ggtt->vm.mm, hole_start, hole_end) {
1291 		if (hole_start < last)
1292 			continue;
1293 
1294 		if (ggtt->vm.mm.color_adjust)
1295 			ggtt->vm.mm.color_adjust(node, 0,
1296 						 &hole_start, &hole_end);
1297 		if (hole_start >= hole_end)
1298 			continue;
1299 
1300 		err = func(&ggtt->vm, hole_start, hole_end, end_time);
1301 		if (err)
1302 			break;
1303 
1304 		/* As we have manipulated the drm_mm, the list may be corrupt */
1305 		last = hole_end;
1306 		goto restart;
1307 	}
1308 
1309 	return err;
1310 }
1311 
1312 static int igt_ggtt_fill(void *arg)
1313 {
1314 	return exercise_ggtt(arg, fill_hole);
1315 }
1316 
1317 static int igt_ggtt_walk(void *arg)
1318 {
1319 	return exercise_ggtt(arg, walk_hole);
1320 }
1321 
1322 static int igt_ggtt_pot(void *arg)
1323 {
1324 	return exercise_ggtt(arg, pot_hole);
1325 }
1326 
1327 static int igt_ggtt_drunk(void *arg)
1328 {
1329 	return exercise_ggtt(arg, drunk_hole);
1330 }
1331 
1332 static int igt_ggtt_lowlevel(void *arg)
1333 {
1334 	return exercise_ggtt(arg, lowlevel_hole);
1335 }
1336 
1337 static int igt_ggtt_misaligned_pin(void *arg)
1338 {
1339 	return exercise_ggtt(arg, misaligned_pin);
1340 }
1341 
1342 static int igt_ggtt_page(void *arg)
1343 {
1344 	const unsigned int count = PAGE_SIZE/sizeof(u32);
1345 	I915_RND_STATE(prng);
1346 	struct drm_i915_private *i915 = arg;
1347 	struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
1348 	struct drm_i915_gem_object *obj;
1349 	intel_wakeref_t wakeref;
1350 	struct drm_mm_node tmp;
1351 	unsigned int *order, n;
1352 	int err;
1353 
1354 	if (!i915_ggtt_has_aperture(ggtt))
1355 		return 0;
1356 
1357 	obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
1358 	if (IS_ERR(obj))
1359 		return PTR_ERR(obj);
1360 
1361 	err = i915_gem_object_pin_pages_unlocked(obj);
1362 	if (err)
1363 		goto out_free;
1364 
1365 	memset(&tmp, 0, sizeof(tmp));
1366 	mutex_lock(&ggtt->vm.mutex);
1367 	err = drm_mm_insert_node_in_range(&ggtt->vm.mm, &tmp,
1368 					  count * PAGE_SIZE, 0,
1369 					  I915_COLOR_UNEVICTABLE,
1370 					  0, ggtt->mappable_end,
1371 					  DRM_MM_INSERT_LOW);
1372 	mutex_unlock(&ggtt->vm.mutex);
1373 	if (err)
1374 		goto out_unpin;
1375 
1376 	wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1377 
1378 	for (n = 0; n < count; n++) {
1379 		u64 offset = tmp.start + n * PAGE_SIZE;
1380 
1381 		ggtt->vm.insert_page(&ggtt->vm,
1382 				     i915_gem_object_get_dma_address(obj, 0),
1383 				     offset, I915_CACHE_NONE, 0);
1384 	}
1385 
1386 	order = i915_random_order(count, &prng);
1387 	if (!order) {
1388 		err = -ENOMEM;
1389 		goto out_remove;
1390 	}
1391 
1392 	for (n = 0; n < count; n++) {
1393 		u64 offset = tmp.start + order[n] * PAGE_SIZE;
1394 		u32 __iomem *vaddr;
1395 
1396 		vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
1397 		iowrite32(n, vaddr + n);
1398 		io_mapping_unmap_atomic(vaddr);
1399 	}
1400 	intel_gt_flush_ggtt_writes(ggtt->vm.gt);
1401 
1402 	i915_random_reorder(order, count, &prng);
1403 	for (n = 0; n < count; n++) {
1404 		u64 offset = tmp.start + order[n] * PAGE_SIZE;
1405 		u32 __iomem *vaddr;
1406 		u32 val;
1407 
1408 		vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset);
1409 		val = ioread32(vaddr + n);
1410 		io_mapping_unmap_atomic(vaddr);
1411 
1412 		if (val != n) {
1413 			pr_err("insert page failed: found %d, expected %d\n",
1414 			       val, n);
1415 			err = -EINVAL;
1416 			break;
1417 		}
1418 	}
1419 
1420 	kfree(order);
1421 out_remove:
1422 	ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size);
1423 	intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1424 	mutex_lock(&ggtt->vm.mutex);
1425 	drm_mm_remove_node(&tmp);
1426 	mutex_unlock(&ggtt->vm.mutex);
1427 out_unpin:
1428 	i915_gem_object_unpin_pages(obj);
1429 out_free:
1430 	i915_gem_object_put(obj);
1431 	return err;
1432 }
1433 
1434 static void track_vma_bind(struct i915_vma *vma)
1435 {
1436 	struct drm_i915_gem_object *obj = vma->obj;
1437 
1438 	__i915_gem_object_pin_pages(obj);
1439 
1440 	GEM_BUG_ON(atomic_read(&vma->pages_count));
1441 	atomic_set(&vma->pages_count, I915_VMA_PAGES_ACTIVE);
1442 	__i915_gem_object_pin_pages(obj);
1443 	vma->pages = obj->mm.pages;
1444 	vma->resource->bi.pages = vma->pages;
1445 
1446 	mutex_lock(&vma->vm->mutex);
1447 	list_move_tail(&vma->vm_link, &vma->vm->bound_list);
1448 	mutex_unlock(&vma->vm->mutex);
1449 }
1450 
1451 static int exercise_mock(struct drm_i915_private *i915,
1452 			 int (*func)(struct i915_address_space *vm,
1453 				     u64 hole_start, u64 hole_end,
1454 				     unsigned long end_time))
1455 {
1456 	const u64 limit = totalram_pages() << PAGE_SHIFT;
1457 	struct i915_address_space *vm;
1458 	struct i915_gem_context *ctx;
1459 	IGT_TIMEOUT(end_time);
1460 	int err;
1461 
1462 	ctx = mock_context(i915, "mock");
1463 	if (!ctx)
1464 		return -ENOMEM;
1465 
1466 	vm = i915_gem_context_get_eb_vm(ctx);
1467 	err = func(vm, 0, min(vm->total, limit), end_time);
1468 	i915_vm_put(vm);
1469 
1470 	mock_context_close(ctx);
1471 	return err;
1472 }
1473 
1474 static int igt_mock_fill(void *arg)
1475 {
1476 	struct i915_ggtt *ggtt = arg;
1477 
1478 	return exercise_mock(ggtt->vm.i915, fill_hole);
1479 }
1480 
1481 static int igt_mock_walk(void *arg)
1482 {
1483 	struct i915_ggtt *ggtt = arg;
1484 
1485 	return exercise_mock(ggtt->vm.i915, walk_hole);
1486 }
1487 
1488 static int igt_mock_pot(void *arg)
1489 {
1490 	struct i915_ggtt *ggtt = arg;
1491 
1492 	return exercise_mock(ggtt->vm.i915, pot_hole);
1493 }
1494 
1495 static int igt_mock_drunk(void *arg)
1496 {
1497 	struct i915_ggtt *ggtt = arg;
1498 
1499 	return exercise_mock(ggtt->vm.i915, drunk_hole);
1500 }
1501 
1502 static int reserve_gtt_with_resource(struct i915_vma *vma, u64 offset)
1503 {
1504 	struct i915_address_space *vm = vma->vm;
1505 	struct i915_vma_resource *vma_res;
1506 	struct drm_i915_gem_object *obj = vma->obj;
1507 	int err;
1508 
1509 	vma_res = i915_vma_resource_alloc();
1510 	if (IS_ERR(vma_res))
1511 		return PTR_ERR(vma_res);
1512 
1513 	mutex_lock(&vm->mutex);
1514 	err = i915_gem_gtt_reserve(vm, NULL, &vma->node, obj->base.size,
1515 				   offset,
1516 				   obj->cache_level,
1517 				   0);
1518 	if (!err) {
1519 		i915_vma_resource_init_from_vma(vma_res, vma);
1520 		vma->resource = vma_res;
1521 	} else {
1522 		kfree(vma_res);
1523 	}
1524 	mutex_unlock(&vm->mutex);
1525 
1526 	return err;
1527 }
1528 
1529 static int igt_gtt_reserve(void *arg)
1530 {
1531 	struct i915_ggtt *ggtt = arg;
1532 	struct drm_i915_gem_object *obj, *on;
1533 	I915_RND_STATE(prng);
1534 	LIST_HEAD(objects);
1535 	u64 total;
1536 	int err = -ENODEV;
1537 
1538 	/* i915_gem_gtt_reserve() tries to reserve the precise range
1539 	 * for the node, and evicts if it has to. So our test checks that
1540 	 * it can give us the requsted space and prevent overlaps.
1541 	 */
1542 
1543 	/* Start by filling the GGTT */
1544 	for (total = 0;
1545 	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1546 	     total += 2 * I915_GTT_PAGE_SIZE) {
1547 		struct i915_vma *vma;
1548 
1549 		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1550 						      2 * PAGE_SIZE);
1551 		if (IS_ERR(obj)) {
1552 			err = PTR_ERR(obj);
1553 			goto out;
1554 		}
1555 
1556 		err = i915_gem_object_pin_pages_unlocked(obj);
1557 		if (err) {
1558 			i915_gem_object_put(obj);
1559 			goto out;
1560 		}
1561 
1562 		list_add(&obj->st_link, &objects);
1563 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1564 		if (IS_ERR(vma)) {
1565 			err = PTR_ERR(vma);
1566 			goto out;
1567 		}
1568 
1569 		err = reserve_gtt_with_resource(vma, total);
1570 		if (err) {
1571 			pr_err("i915_gem_gtt_reserve (pass 1) failed at %llu/%llu with err=%d\n",
1572 			       total, ggtt->vm.total, err);
1573 			goto out;
1574 		}
1575 		track_vma_bind(vma);
1576 
1577 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1578 		if (vma->node.start != total ||
1579 		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1580 			pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1581 			       vma->node.start, vma->node.size,
1582 			       total, 2*I915_GTT_PAGE_SIZE);
1583 			err = -EINVAL;
1584 			goto out;
1585 		}
1586 	}
1587 
1588 	/* Now we start forcing evictions */
1589 	for (total = I915_GTT_PAGE_SIZE;
1590 	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1591 	     total += 2 * I915_GTT_PAGE_SIZE) {
1592 		struct i915_vma *vma;
1593 
1594 		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1595 						      2 * PAGE_SIZE);
1596 		if (IS_ERR(obj)) {
1597 			err = PTR_ERR(obj);
1598 			goto out;
1599 		}
1600 
1601 		err = i915_gem_object_pin_pages_unlocked(obj);
1602 		if (err) {
1603 			i915_gem_object_put(obj);
1604 			goto out;
1605 		}
1606 
1607 		list_add(&obj->st_link, &objects);
1608 
1609 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1610 		if (IS_ERR(vma)) {
1611 			err = PTR_ERR(vma);
1612 			goto out;
1613 		}
1614 
1615 		err = reserve_gtt_with_resource(vma, total);
1616 		if (err) {
1617 			pr_err("i915_gem_gtt_reserve (pass 2) failed at %llu/%llu with err=%d\n",
1618 			       total, ggtt->vm.total, err);
1619 			goto out;
1620 		}
1621 		track_vma_bind(vma);
1622 
1623 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1624 		if (vma->node.start != total ||
1625 		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1626 			pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1627 			       vma->node.start, vma->node.size,
1628 			       total, 2*I915_GTT_PAGE_SIZE);
1629 			err = -EINVAL;
1630 			goto out;
1631 		}
1632 	}
1633 
1634 	/* And then try at random */
1635 	list_for_each_entry_safe(obj, on, &objects, st_link) {
1636 		struct i915_vma *vma;
1637 		u64 offset;
1638 
1639 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1640 		if (IS_ERR(vma)) {
1641 			err = PTR_ERR(vma);
1642 			goto out;
1643 		}
1644 
1645 		err = i915_vma_unbind_unlocked(vma);
1646 		if (err) {
1647 			pr_err("i915_vma_unbind failed with err=%d!\n", err);
1648 			goto out;
1649 		}
1650 
1651 		offset = igt_random_offset(&prng,
1652 					   0, ggtt->vm.total,
1653 					   2 * I915_GTT_PAGE_SIZE,
1654 					   I915_GTT_MIN_ALIGNMENT);
1655 
1656 		err = reserve_gtt_with_resource(vma, offset);
1657 		if (err) {
1658 			pr_err("i915_gem_gtt_reserve (pass 3) failed at %llu/%llu with err=%d\n",
1659 			       total, ggtt->vm.total, err);
1660 			goto out;
1661 		}
1662 		track_vma_bind(vma);
1663 
1664 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1665 		if (vma->node.start != offset ||
1666 		    vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1667 			pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1668 			       vma->node.start, vma->node.size,
1669 			       offset, 2*I915_GTT_PAGE_SIZE);
1670 			err = -EINVAL;
1671 			goto out;
1672 		}
1673 	}
1674 
1675 out:
1676 	list_for_each_entry_safe(obj, on, &objects, st_link) {
1677 		i915_gem_object_unpin_pages(obj);
1678 		i915_gem_object_put(obj);
1679 	}
1680 	return err;
1681 }
1682 
1683 static int insert_gtt_with_resource(struct i915_vma *vma)
1684 {
1685 	struct i915_address_space *vm = vma->vm;
1686 	struct i915_vma_resource *vma_res;
1687 	struct drm_i915_gem_object *obj = vma->obj;
1688 	int err;
1689 
1690 	vma_res = i915_vma_resource_alloc();
1691 	if (IS_ERR(vma_res))
1692 		return PTR_ERR(vma_res);
1693 
1694 	mutex_lock(&vm->mutex);
1695 	err = i915_gem_gtt_insert(vm, NULL, &vma->node, obj->base.size, 0,
1696 				  obj->cache_level, 0, vm->total, 0);
1697 	if (!err) {
1698 		i915_vma_resource_init_from_vma(vma_res, vma);
1699 		vma->resource = vma_res;
1700 	} else {
1701 		kfree(vma_res);
1702 	}
1703 	mutex_unlock(&vm->mutex);
1704 
1705 	return err;
1706 }
1707 
1708 static int igt_gtt_insert(void *arg)
1709 {
1710 	struct i915_ggtt *ggtt = arg;
1711 	struct drm_i915_gem_object *obj, *on;
1712 	struct drm_mm_node tmp = {};
1713 	const struct invalid_insert {
1714 		u64 size;
1715 		u64 alignment;
1716 		u64 start, end;
1717 	} invalid_insert[] = {
1718 		{
1719 			ggtt->vm.total + I915_GTT_PAGE_SIZE, 0,
1720 			0, ggtt->vm.total,
1721 		},
1722 		{
1723 			2*I915_GTT_PAGE_SIZE, 0,
1724 			0, I915_GTT_PAGE_SIZE,
1725 		},
1726 		{
1727 			-(u64)I915_GTT_PAGE_SIZE, 0,
1728 			0, 4*I915_GTT_PAGE_SIZE,
1729 		},
1730 		{
1731 			-(u64)2*I915_GTT_PAGE_SIZE, 2*I915_GTT_PAGE_SIZE,
1732 			0, 4*I915_GTT_PAGE_SIZE,
1733 		},
1734 		{
1735 			I915_GTT_PAGE_SIZE, I915_GTT_MIN_ALIGNMENT << 1,
1736 			I915_GTT_MIN_ALIGNMENT, I915_GTT_MIN_ALIGNMENT << 1,
1737 		},
1738 		{}
1739 	}, *ii;
1740 	LIST_HEAD(objects);
1741 	u64 total;
1742 	int err = -ENODEV;
1743 
1744 	/* i915_gem_gtt_insert() tries to allocate some free space in the GTT
1745 	 * to the node, evicting if required.
1746 	 */
1747 
1748 	/* Check a couple of obviously invalid requests */
1749 	for (ii = invalid_insert; ii->size; ii++) {
1750 		mutex_lock(&ggtt->vm.mutex);
1751 		err = i915_gem_gtt_insert(&ggtt->vm, NULL, &tmp,
1752 					  ii->size, ii->alignment,
1753 					  I915_COLOR_UNEVICTABLE,
1754 					  ii->start, ii->end,
1755 					  0);
1756 		mutex_unlock(&ggtt->vm.mutex);
1757 		if (err != -ENOSPC) {
1758 			pr_err("Invalid i915_gem_gtt_insert(.size=%llx, .alignment=%llx, .start=%llx, .end=%llx) succeeded (err=%d)\n",
1759 			       ii->size, ii->alignment, ii->start, ii->end,
1760 			       err);
1761 			return -EINVAL;
1762 		}
1763 	}
1764 
1765 	/* Start by filling the GGTT */
1766 	for (total = 0;
1767 	     total + I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1768 	     total += I915_GTT_PAGE_SIZE) {
1769 		struct i915_vma *vma;
1770 
1771 		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1772 						      I915_GTT_PAGE_SIZE);
1773 		if (IS_ERR(obj)) {
1774 			err = PTR_ERR(obj);
1775 			goto out;
1776 		}
1777 
1778 		err = i915_gem_object_pin_pages_unlocked(obj);
1779 		if (err) {
1780 			i915_gem_object_put(obj);
1781 			goto out;
1782 		}
1783 
1784 		list_add(&obj->st_link, &objects);
1785 
1786 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1787 		if (IS_ERR(vma)) {
1788 			err = PTR_ERR(vma);
1789 			goto out;
1790 		}
1791 
1792 		err = insert_gtt_with_resource(vma);
1793 		if (err == -ENOSPC) {
1794 			/* maxed out the GGTT space */
1795 			i915_gem_object_put(obj);
1796 			break;
1797 		}
1798 		if (err) {
1799 			pr_err("i915_gem_gtt_insert (pass 1) failed at %llu/%llu with err=%d\n",
1800 			       total, ggtt->vm.total, err);
1801 			goto out;
1802 		}
1803 		track_vma_bind(vma);
1804 		__i915_vma_pin(vma);
1805 
1806 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1807 	}
1808 
1809 	list_for_each_entry(obj, &objects, st_link) {
1810 		struct i915_vma *vma;
1811 
1812 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1813 		if (IS_ERR(vma)) {
1814 			err = PTR_ERR(vma);
1815 			goto out;
1816 		}
1817 
1818 		if (!drm_mm_node_allocated(&vma->node)) {
1819 			pr_err("VMA was unexpectedly evicted!\n");
1820 			err = -EINVAL;
1821 			goto out;
1822 		}
1823 
1824 		__i915_vma_unpin(vma);
1825 	}
1826 
1827 	/* If we then reinsert, we should find the same hole */
1828 	list_for_each_entry_safe(obj, on, &objects, st_link) {
1829 		struct i915_vma *vma;
1830 		u64 offset;
1831 
1832 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1833 		if (IS_ERR(vma)) {
1834 			err = PTR_ERR(vma);
1835 			goto out;
1836 		}
1837 
1838 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1839 		offset = vma->node.start;
1840 
1841 		err = i915_vma_unbind_unlocked(vma);
1842 		if (err) {
1843 			pr_err("i915_vma_unbind failed with err=%d!\n", err);
1844 			goto out;
1845 		}
1846 
1847 		err = insert_gtt_with_resource(vma);
1848 		if (err) {
1849 			pr_err("i915_gem_gtt_insert (pass 2) failed at %llu/%llu with err=%d\n",
1850 			       total, ggtt->vm.total, err);
1851 			goto out;
1852 		}
1853 		track_vma_bind(vma);
1854 
1855 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1856 		if (vma->node.start != offset) {
1857 			pr_err("i915_gem_gtt_insert did not return node to its previous location (the only hole), expected address %llx, found %llx\n",
1858 			       offset, vma->node.start);
1859 			err = -EINVAL;
1860 			goto out;
1861 		}
1862 	}
1863 
1864 	/* And then force evictions */
1865 	for (total = 0;
1866 	     total + 2 * I915_GTT_PAGE_SIZE <= ggtt->vm.total;
1867 	     total += 2 * I915_GTT_PAGE_SIZE) {
1868 		struct i915_vma *vma;
1869 
1870 		obj = i915_gem_object_create_internal(ggtt->vm.i915,
1871 						      2 * I915_GTT_PAGE_SIZE);
1872 		if (IS_ERR(obj)) {
1873 			err = PTR_ERR(obj);
1874 			goto out;
1875 		}
1876 
1877 		err = i915_gem_object_pin_pages_unlocked(obj);
1878 		if (err) {
1879 			i915_gem_object_put(obj);
1880 			goto out;
1881 		}
1882 
1883 		list_add(&obj->st_link, &objects);
1884 
1885 		vma = i915_vma_instance(obj, &ggtt->vm, NULL);
1886 		if (IS_ERR(vma)) {
1887 			err = PTR_ERR(vma);
1888 			goto out;
1889 		}
1890 
1891 		err = insert_gtt_with_resource(vma);
1892 		if (err) {
1893 			pr_err("i915_gem_gtt_insert (pass 3) failed at %llu/%llu with err=%d\n",
1894 			       total, ggtt->vm.total, err);
1895 			goto out;
1896 		}
1897 		track_vma_bind(vma);
1898 
1899 		GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1900 	}
1901 
1902 out:
1903 	list_for_each_entry_safe(obj, on, &objects, st_link) {
1904 		i915_gem_object_unpin_pages(obj);
1905 		i915_gem_object_put(obj);
1906 	}
1907 	return err;
1908 }
1909 
1910 int i915_gem_gtt_mock_selftests(void)
1911 {
1912 	static const struct i915_subtest tests[] = {
1913 		SUBTEST(igt_mock_drunk),
1914 		SUBTEST(igt_mock_walk),
1915 		SUBTEST(igt_mock_pot),
1916 		SUBTEST(igt_mock_fill),
1917 		SUBTEST(igt_gtt_reserve),
1918 		SUBTEST(igt_gtt_insert),
1919 	};
1920 	struct drm_i915_private *i915;
1921 	struct intel_gt *gt;
1922 	int err;
1923 
1924 	i915 = mock_gem_device();
1925 	if (!i915)
1926 		return -ENOMEM;
1927 
1928 	/* allocate the ggtt */
1929 	err = intel_gt_assign_ggtt(to_gt(i915));
1930 	if (err)
1931 		goto out_put;
1932 
1933 	gt = to_gt(i915);
1934 
1935 	mock_init_ggtt(gt);
1936 
1937 	err = i915_subtests(tests, gt->ggtt);
1938 
1939 	mock_device_flush(i915);
1940 	i915_gem_drain_freed_objects(i915);
1941 	mock_fini_ggtt(gt->ggtt);
1942 
1943 out_put:
1944 	mock_destroy_device(i915);
1945 	return err;
1946 }
1947 
1948 static int context_sync(struct intel_context *ce)
1949 {
1950 	struct i915_request *rq;
1951 	long timeout;
1952 
1953 	rq = intel_context_create_request(ce);
1954 	if (IS_ERR(rq))
1955 		return PTR_ERR(rq);
1956 
1957 	i915_request_get(rq);
1958 	i915_request_add(rq);
1959 
1960 	timeout = i915_request_wait(rq, 0, HZ / 5);
1961 	i915_request_put(rq);
1962 
1963 	return timeout < 0 ? -EIO : 0;
1964 }
1965 
1966 static struct i915_request *
1967 submit_batch(struct intel_context *ce, u64 addr)
1968 {
1969 	struct i915_request *rq;
1970 	int err;
1971 
1972 	rq = intel_context_create_request(ce);
1973 	if (IS_ERR(rq))
1974 		return rq;
1975 
1976 	err = 0;
1977 	if (rq->engine->emit_init_breadcrumb) /* detect a hang */
1978 		err = rq->engine->emit_init_breadcrumb(rq);
1979 	if (err == 0)
1980 		err = rq->engine->emit_bb_start(rq, addr, 0, 0);
1981 
1982 	if (err == 0)
1983 		i915_request_get(rq);
1984 	i915_request_add(rq);
1985 
1986 	return err ? ERR_PTR(err) : rq;
1987 }
1988 
1989 static u32 *spinner(u32 *batch, int i)
1990 {
1991 	return batch + i * 64 / sizeof(*batch) + 4;
1992 }
1993 
1994 static void end_spin(u32 *batch, int i)
1995 {
1996 	*spinner(batch, i) = MI_BATCH_BUFFER_END;
1997 	wmb();
1998 }
1999 
2000 static int igt_cs_tlb(void *arg)
2001 {
2002 	const unsigned int count = PAGE_SIZE / 64;
2003 	const unsigned int chunk_size = count * PAGE_SIZE;
2004 	struct drm_i915_private *i915 = arg;
2005 	struct drm_i915_gem_object *bbe, *act, *out;
2006 	struct i915_gem_engines_iter it;
2007 	struct i915_address_space *vm;
2008 	struct i915_gem_context *ctx;
2009 	struct intel_context *ce;
2010 	struct i915_vma *vma;
2011 	I915_RND_STATE(prng);
2012 	struct file *file;
2013 	unsigned int i;
2014 	u32 *result;
2015 	u32 *batch;
2016 	int err = 0;
2017 
2018 	/*
2019 	 * Our mission here is to fool the hardware to execute something
2020 	 * from scratch as it has not seen the batch move (due to missing
2021 	 * the TLB invalidate).
2022 	 */
2023 
2024 	file = mock_file(i915);
2025 	if (IS_ERR(file))
2026 		return PTR_ERR(file);
2027 
2028 	ctx = live_context(i915, file);
2029 	if (IS_ERR(ctx)) {
2030 		err = PTR_ERR(ctx);
2031 		goto out_unlock;
2032 	}
2033 
2034 	vm = i915_gem_context_get_eb_vm(ctx);
2035 	if (i915_is_ggtt(vm))
2036 		goto out_vm;
2037 
2038 	/* Create two pages; dummy we prefill the TLB, and intended */
2039 	bbe = i915_gem_object_create_internal(i915, PAGE_SIZE);
2040 	if (IS_ERR(bbe)) {
2041 		err = PTR_ERR(bbe);
2042 		goto out_vm;
2043 	}
2044 
2045 	batch = i915_gem_object_pin_map_unlocked(bbe, I915_MAP_WC);
2046 	if (IS_ERR(batch)) {
2047 		err = PTR_ERR(batch);
2048 		goto out_put_bbe;
2049 	}
2050 	memset32(batch, MI_BATCH_BUFFER_END, PAGE_SIZE / sizeof(u32));
2051 	i915_gem_object_flush_map(bbe);
2052 	i915_gem_object_unpin_map(bbe);
2053 
2054 	act = i915_gem_object_create_internal(i915, PAGE_SIZE);
2055 	if (IS_ERR(act)) {
2056 		err = PTR_ERR(act);
2057 		goto out_put_bbe;
2058 	}
2059 
2060 	/* Track the execution of each request by writing into different slot */
2061 	batch = i915_gem_object_pin_map_unlocked(act, I915_MAP_WC);
2062 	if (IS_ERR(batch)) {
2063 		err = PTR_ERR(batch);
2064 		goto out_put_act;
2065 	}
2066 	for (i = 0; i < count; i++) {
2067 		u32 *cs = batch + i * 64 / sizeof(*cs);
2068 		u64 addr = (vm->total - PAGE_SIZE) + i * sizeof(u32);
2069 
2070 		GEM_BUG_ON(GRAPHICS_VER(i915) < 6);
2071 		cs[0] = MI_STORE_DWORD_IMM_GEN4;
2072 		if (GRAPHICS_VER(i915) >= 8) {
2073 			cs[1] = lower_32_bits(addr);
2074 			cs[2] = upper_32_bits(addr);
2075 			cs[3] = i;
2076 			cs[4] = MI_NOOP;
2077 			cs[5] = MI_BATCH_BUFFER_START_GEN8;
2078 		} else {
2079 			cs[1] = 0;
2080 			cs[2] = lower_32_bits(addr);
2081 			cs[3] = i;
2082 			cs[4] = MI_NOOP;
2083 			cs[5] = MI_BATCH_BUFFER_START;
2084 		}
2085 	}
2086 
2087 	out = i915_gem_object_create_internal(i915, PAGE_SIZE);
2088 	if (IS_ERR(out)) {
2089 		err = PTR_ERR(out);
2090 		goto out_put_batch;
2091 	}
2092 	i915_gem_object_set_cache_coherency(out, I915_CACHING_CACHED);
2093 
2094 	vma = i915_vma_instance(out, vm, NULL);
2095 	if (IS_ERR(vma)) {
2096 		err = PTR_ERR(vma);
2097 		goto out_put_out;
2098 	}
2099 
2100 	err = i915_vma_pin(vma, 0, 0,
2101 			   PIN_USER |
2102 			   PIN_OFFSET_FIXED |
2103 			   (vm->total - PAGE_SIZE));
2104 	if (err)
2105 		goto out_put_out;
2106 	GEM_BUG_ON(vma->node.start != vm->total - PAGE_SIZE);
2107 
2108 	result = i915_gem_object_pin_map_unlocked(out, I915_MAP_WB);
2109 	if (IS_ERR(result)) {
2110 		err = PTR_ERR(result);
2111 		goto out_put_out;
2112 	}
2113 
2114 	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
2115 		IGT_TIMEOUT(end_time);
2116 		unsigned long pass = 0;
2117 
2118 		if (!intel_engine_can_store_dword(ce->engine))
2119 			continue;
2120 
2121 		while (!__igt_timeout(end_time, NULL)) {
2122 			struct i915_vm_pt_stash stash = {};
2123 			struct i915_request *rq;
2124 			struct i915_gem_ww_ctx ww;
2125 			struct i915_vma_resource *vma_res;
2126 			u64 offset;
2127 
2128 			offset = igt_random_offset(&prng,
2129 						   0, vm->total - PAGE_SIZE,
2130 						   chunk_size, PAGE_SIZE);
2131 
2132 			memset32(result, STACK_MAGIC, PAGE_SIZE / sizeof(u32));
2133 
2134 			vma = i915_vma_instance(bbe, vm, NULL);
2135 			if (IS_ERR(vma)) {
2136 				err = PTR_ERR(vma);
2137 				goto end;
2138 			}
2139 
2140 			i915_gem_object_lock(bbe, NULL);
2141 			err = i915_vma_get_pages(vma);
2142 			i915_gem_object_unlock(bbe);
2143 			if (err)
2144 				goto end;
2145 
2146 			vma_res = i915_vma_resource_alloc();
2147 			if (IS_ERR(vma_res)) {
2148 				i915_vma_put_pages(vma);
2149 				err = PTR_ERR(vma_res);
2150 				goto end;
2151 			}
2152 
2153 			i915_gem_ww_ctx_init(&ww, false);
2154 retry:
2155 			err = i915_vm_lock_objects(vm, &ww);
2156 			if (err)
2157 				goto end_ww;
2158 
2159 			err = i915_vm_alloc_pt_stash(vm, &stash, chunk_size);
2160 			if (err)
2161 				goto end_ww;
2162 
2163 			err = i915_vm_map_pt_stash(vm, &stash);
2164 			if (!err)
2165 				vm->allocate_va_range(vm, &stash, offset, chunk_size);
2166 			i915_vm_free_pt_stash(vm, &stash);
2167 end_ww:
2168 			if (err == -EDEADLK) {
2169 				err = i915_gem_ww_ctx_backoff(&ww);
2170 				if (!err)
2171 					goto retry;
2172 			}
2173 			i915_gem_ww_ctx_fini(&ww);
2174 			if (err) {
2175 				kfree(vma_res);
2176 				goto end;
2177 			}
2178 
2179 			i915_vma_resource_init_from_vma(vma_res, vma);
2180 			/* Prime the TLB with the dummy pages */
2181 			for (i = 0; i < count; i++) {
2182 				vma_res->start = offset + i * PAGE_SIZE;
2183 				vm->insert_entries(vm, vma_res, I915_CACHE_NONE,
2184 						   0);
2185 
2186 				rq = submit_batch(ce, vma_res->start);
2187 				if (IS_ERR(rq)) {
2188 					err = PTR_ERR(rq);
2189 					i915_vma_resource_fini(vma_res);
2190 					kfree(vma_res);
2191 					goto end;
2192 				}
2193 				i915_request_put(rq);
2194 			}
2195 			i915_vma_resource_fini(vma_res);
2196 			i915_vma_put_pages(vma);
2197 
2198 			err = context_sync(ce);
2199 			if (err) {
2200 				pr_err("%s: dummy setup timed out\n",
2201 				       ce->engine->name);
2202 				kfree(vma_res);
2203 				goto end;
2204 			}
2205 
2206 			vma = i915_vma_instance(act, vm, NULL);
2207 			if (IS_ERR(vma)) {
2208 				kfree(vma_res);
2209 				err = PTR_ERR(vma);
2210 				goto end;
2211 			}
2212 
2213 			i915_gem_object_lock(act, NULL);
2214 			err = i915_vma_get_pages(vma);
2215 			i915_gem_object_unlock(act);
2216 			if (err) {
2217 				kfree(vma_res);
2218 				goto end;
2219 			}
2220 
2221 			i915_vma_resource_init_from_vma(vma_res, vma);
2222 			/* Replace the TLB with target batches */
2223 			for (i = 0; i < count; i++) {
2224 				struct i915_request *rq;
2225 				u32 *cs = batch + i * 64 / sizeof(*cs);
2226 				u64 addr;
2227 
2228 				vma_res->start = offset + i * PAGE_SIZE;
2229 				vm->insert_entries(vm, vma_res, I915_CACHE_NONE, 0);
2230 
2231 				addr = vma_res->start + i * 64;
2232 				cs[4] = MI_NOOP;
2233 				cs[6] = lower_32_bits(addr);
2234 				cs[7] = upper_32_bits(addr);
2235 				wmb();
2236 
2237 				rq = submit_batch(ce, addr);
2238 				if (IS_ERR(rq)) {
2239 					err = PTR_ERR(rq);
2240 					i915_vma_resource_fini(vma_res);
2241 					kfree(vma_res);
2242 					goto end;
2243 				}
2244 
2245 				/* Wait until the context chain has started */
2246 				if (i == 0) {
2247 					while (READ_ONCE(result[i]) &&
2248 					       !i915_request_completed(rq))
2249 						cond_resched();
2250 				} else {
2251 					end_spin(batch, i - 1);
2252 				}
2253 
2254 				i915_request_put(rq);
2255 			}
2256 			end_spin(batch, count - 1);
2257 
2258 			i915_vma_resource_fini(vma_res);
2259 			kfree(vma_res);
2260 			i915_vma_put_pages(vma);
2261 
2262 			err = context_sync(ce);
2263 			if (err) {
2264 				pr_err("%s: writes timed out\n",
2265 				       ce->engine->name);
2266 				goto end;
2267 			}
2268 
2269 			for (i = 0; i < count; i++) {
2270 				if (result[i] != i) {
2271 					pr_err("%s: Write lost on pass %lu, at offset %llx, index %d, found %x, expected %x\n",
2272 					       ce->engine->name, pass,
2273 					       offset, i, result[i], i);
2274 					err = -EINVAL;
2275 					goto end;
2276 				}
2277 			}
2278 
2279 			vm->clear_range(vm, offset, chunk_size);
2280 			pass++;
2281 		}
2282 	}
2283 end:
2284 	if (igt_flush_test(i915))
2285 		err = -EIO;
2286 	i915_gem_context_unlock_engines(ctx);
2287 	i915_gem_object_unpin_map(out);
2288 out_put_out:
2289 	i915_gem_object_put(out);
2290 out_put_batch:
2291 	i915_gem_object_unpin_map(act);
2292 out_put_act:
2293 	i915_gem_object_put(act);
2294 out_put_bbe:
2295 	i915_gem_object_put(bbe);
2296 out_vm:
2297 	i915_vm_put(vm);
2298 out_unlock:
2299 	fput(file);
2300 	return err;
2301 }
2302 
2303 int i915_gem_gtt_live_selftests(struct drm_i915_private *i915)
2304 {
2305 	static const struct i915_subtest tests[] = {
2306 		SUBTEST(igt_ppgtt_alloc),
2307 		SUBTEST(igt_ppgtt_lowlevel),
2308 		SUBTEST(igt_ppgtt_drunk),
2309 		SUBTEST(igt_ppgtt_walk),
2310 		SUBTEST(igt_ppgtt_pot),
2311 		SUBTEST(igt_ppgtt_fill),
2312 		SUBTEST(igt_ppgtt_shrink),
2313 		SUBTEST(igt_ppgtt_shrink_boom),
2314 		SUBTEST(igt_ppgtt_misaligned_pin),
2315 		SUBTEST(igt_ggtt_lowlevel),
2316 		SUBTEST(igt_ggtt_drunk),
2317 		SUBTEST(igt_ggtt_walk),
2318 		SUBTEST(igt_ggtt_pot),
2319 		SUBTEST(igt_ggtt_fill),
2320 		SUBTEST(igt_ggtt_page),
2321 		SUBTEST(igt_ggtt_misaligned_pin),
2322 		SUBTEST(igt_cs_tlb),
2323 	};
2324 
2325 	GEM_BUG_ON(offset_in_page(to_gt(i915)->ggtt->vm.total));
2326 
2327 	return i915_subtests(tests, i915);
2328 }
2329