i915_gem_gtt.c 92.1 KB
Newer Older
1 2
/*
 * Copyright © 2010 Daniel Vetter
3
 * Copyright © 2011-2014 Intel Corporation
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 *
 * 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.
 *
 */

26 27 28
#include <linux/slab.h> /* fault-inject.h is not standalone! */

#include <linux/fault-inject.h>
29
#include <linux/log2.h>
30
#include <linux/random.h>
31
#include <linux/seq_file.h>
32
#include <linux/stop_machine.h>
33

L
Laura Abbott 已提交
34 35
#include <asm/set_memory.h>

36 37
#include <drm/drmP.h>
#include <drm/i915_drm.h>
38

39
#include "i915_drv.h"
40
#include "i915_vgpu.h"
41 42
#include "i915_trace.h"
#include "intel_drv.h"
43
#include "intel_frontbuffer.h"
44

45 46
#define I915_GFP_DMA (GFP_KERNEL | __GFP_HIGHMEM)

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
/**
 * DOC: Global GTT views
 *
 * Background and previous state
 *
 * Historically objects could exists (be bound) in global GTT space only as
 * singular instances with a view representing all of the object's backing pages
 * in a linear fashion. This view will be called a normal view.
 *
 * To support multiple views of the same object, where the number of mapped
 * pages is not equal to the backing store, or where the layout of the pages
 * is not linear, concept of a GGTT view was added.
 *
 * One example of an alternative view is a stereo display driven by a single
 * image. In this case we would have a framebuffer looking like this
 * (2x2 pages):
 *
 *    12
 *    34
 *
 * Above would represent a normal GGTT view as normally mapped for GPU or CPU
 * rendering. In contrast, fed to the display engine would be an alternative
 * view which could look something like this:
 *
 *   1212
 *   3434
 *
 * In this example both the size and layout of pages in the alternative view is
 * different from the normal view.
 *
 * Implementation and usage
 *
 * GGTT views are implemented using VMAs and are distinguished via enum
 * i915_ggtt_view_type and struct i915_ggtt_view.
 *
 * A new flavour of core GEM functions which work with GGTT bound objects were
83 84 85
 * added with the _ggtt_ infix, and sometimes with _view postfix to avoid
 * renaming  in large amounts of code. They take the struct i915_ggtt_view
 * parameter encapsulating all metadata required to implement a view.
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
 *
 * As a helper for callers which are only interested in the normal view,
 * globally const i915_ggtt_view_normal singleton instance exists. All old core
 * GEM API functions, the ones not taking the view parameter, are operating on,
 * or with the normal GGTT view.
 *
 * Code wanting to add or use a new GGTT view needs to:
 *
 * 1. Add a new enum with a suitable name.
 * 2. Extend the metadata in the i915_ggtt_view structure if required.
 * 3. Add support to i915_get_vma_pages().
 *
 * New views are required to build a scatter-gather table from within the
 * i915_get_vma_pages function. This table is stored in the vma.ggtt_view and
 * exists for the lifetime of an VMA.
 *
 * Core API is designed to have copy semantics which means that passed in
 * struct i915_ggtt_view does not need to be persistent (left around after
 * calling the core API functions).
 *
 */

108 109 110
static int
i915_get_ggtt_vma_pages(struct i915_vma *vma);

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
static void gen6_ggtt_invalidate(struct drm_i915_private *dev_priv)
{
	/* Note that as an uncached mmio write, this should flush the
	 * WCB of the writes into the GGTT before it triggers the invalidate.
	 */
	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
}

static void guc_ggtt_invalidate(struct drm_i915_private *dev_priv)
{
	gen6_ggtt_invalidate(dev_priv);
	I915_WRITE(GEN8_GTCR, GEN8_GTCR_INVALIDATE);
}

static void gmch_ggtt_invalidate(struct drm_i915_private *dev_priv)
{
	intel_gtt_chipset_flush();
}

static inline void i915_ggtt_invalidate(struct drm_i915_private *i915)
{
	i915->ggtt.invalidate(i915);
}

135 136
int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv,
			       	int enable_ppgtt)
137
{
138 139
	bool has_aliasing_ppgtt;
	bool has_full_ppgtt;
140
	bool has_full_48bit_ppgtt;
141

142 143 144
	has_aliasing_ppgtt = dev_priv->info.has_aliasing_ppgtt;
	has_full_ppgtt = dev_priv->info.has_full_ppgtt;
	has_full_48bit_ppgtt = dev_priv->info.has_full_48bit_ppgtt;
145

146 147 148 149 150
	if (intel_vgpu_active(dev_priv)) {
		/* emulation is too hard */
		has_full_ppgtt = false;
		has_full_48bit_ppgtt = false;
	}
151

152 153 154
	if (!has_aliasing_ppgtt)
		return 0;

155 156 157 158
	/*
	 * We don't allow disabling PPGTT for gen9+ as it's a requirement for
	 * execlists, the sole mechanism available to submit work.
	 */
159
	if (enable_ppgtt == 0 && INTEL_GEN(dev_priv) < 9)
160 161 162 163 164
		return 0;

	if (enable_ppgtt == 1)
		return 1;

165
	if (enable_ppgtt == 2 && has_full_ppgtt)
166 167
		return 2;

168 169 170
	if (enable_ppgtt == 3 && has_full_48bit_ppgtt)
		return 3;

171
	/* Disable ppgtt on SNB if VT-d is on. */
172
	if (IS_GEN6(dev_priv) && intel_vtd_active()) {
173
		DRM_INFO("Disabling PPGTT because VT-d is on\n");
174
		return 0;
175 176
	}

177
	/* Early VLV doesn't have this */
178
	if (IS_VALLEYVIEW(dev_priv) && dev_priv->drm.pdev->revision < 0xb) {
179 180 181 182
		DRM_DEBUG_DRIVER("disabling PPGTT on pre-B3 step VLV\n");
		return 0;
	}

183
	if (INTEL_GEN(dev_priv) >= 8 && i915.enable_execlists && has_full_ppgtt)
184
		return has_full_48bit_ppgtt ? 3 : 2;
185 186
	else
		return has_aliasing_ppgtt ? 1 : 0;
187 188
}

189 190 191
static int ppgtt_bind_vma(struct i915_vma *vma,
			  enum i915_cache_level cache_level,
			  u32 unused)
192
{
193 194 195
	u32 pte_flags;
	int ret;

196 197 198 199 200 201
	if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
		ret = vma->vm->allocate_va_range(vma->vm, vma->node.start,
						 vma->size);
		if (ret)
			return ret;
	}
202

C
Chris Wilson 已提交
203
	vma->pages = vma->obj->mm.pages;
204

205
	/* Currently applicable only to VLV */
206
	pte_flags = 0;
207 208 209
	if (vma->obj->gt_ro)
		pte_flags |= PTE_READ_ONLY;

210
	vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
211 212

	return 0;
213 214 215 216
}

static void ppgtt_unbind_vma(struct i915_vma *vma)
{
217
	vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
218
}
219

220
static gen8_pte_t gen8_pte_encode(dma_addr_t addr,
221
				  enum i915_cache_level level)
B
Ben Widawsky 已提交
222
{
223
	gen8_pte_t pte = _PAGE_PRESENT | _PAGE_RW;
B
Ben Widawsky 已提交
224
	pte |= addr;
225 226 227

	switch (level) {
	case I915_CACHE_NONE:
B
Ben Widawsky 已提交
228
		pte |= PPAT_UNCACHED_INDEX;
229 230 231 232 233 234 235 236 237
		break;
	case I915_CACHE_WT:
		pte |= PPAT_DISPLAY_ELLC_INDEX;
		break;
	default:
		pte |= PPAT_CACHED_INDEX;
		break;
	}

B
Ben Widawsky 已提交
238 239 240
	return pte;
}

241 242
static gen8_pde_t gen8_pde_encode(const dma_addr_t addr,
				  const enum i915_cache_level level)
B
Ben Widawsky 已提交
243
{
244
	gen8_pde_t pde = _PAGE_PRESENT | _PAGE_RW;
B
Ben Widawsky 已提交
245 246 247 248 249 250 251 252
	pde |= addr;
	if (level != I915_CACHE_NONE)
		pde |= PPAT_CACHED_PDE_INDEX;
	else
		pde |= PPAT_UNCACHED_INDEX;
	return pde;
}

253 254 255
#define gen8_pdpe_encode gen8_pde_encode
#define gen8_pml4e_encode gen8_pde_encode

256 257
static gen6_pte_t snb_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
258
				 u32 unused)
259
{
260
	gen6_pte_t pte = GEN6_PTE_VALID;
261
	pte |= GEN6_PTE_ADDR_ENCODE(addr);
262 263

	switch (level) {
264 265 266 267 268 269 270 271
	case I915_CACHE_L3_LLC:
	case I915_CACHE_LLC:
		pte |= GEN6_PTE_CACHE_LLC;
		break;
	case I915_CACHE_NONE:
		pte |= GEN6_PTE_UNCACHED;
		break;
	default:
272
		MISSING_CASE(level);
273 274 275 276 277
	}

	return pte;
}

278 279
static gen6_pte_t ivb_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
280
				 u32 unused)
281
{
282
	gen6_pte_t pte = GEN6_PTE_VALID;
283 284 285 286 287
	pte |= GEN6_PTE_ADDR_ENCODE(addr);

	switch (level) {
	case I915_CACHE_L3_LLC:
		pte |= GEN7_PTE_CACHE_L3_LLC;
288 289 290 291 292
		break;
	case I915_CACHE_LLC:
		pte |= GEN6_PTE_CACHE_LLC;
		break;
	case I915_CACHE_NONE:
293
		pte |= GEN6_PTE_UNCACHED;
294 295
		break;
	default:
296
		MISSING_CASE(level);
297 298
	}

299 300 301
	return pte;
}

302 303
static gen6_pte_t byt_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
304
				 u32 flags)
305
{
306
	gen6_pte_t pte = GEN6_PTE_VALID;
307 308
	pte |= GEN6_PTE_ADDR_ENCODE(addr);

309 310
	if (!(flags & PTE_READ_ONLY))
		pte |= BYT_PTE_WRITEABLE;
311 312 313 314 315 316 317

	if (level != I915_CACHE_NONE)
		pte |= BYT_PTE_SNOOPED_BY_CPU_CACHES;

	return pte;
}

318 319
static gen6_pte_t hsw_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
320
				 u32 unused)
321
{
322
	gen6_pte_t pte = GEN6_PTE_VALID;
323
	pte |= HSW_PTE_ADDR_ENCODE(addr);
324 325

	if (level != I915_CACHE_NONE)
326
		pte |= HSW_WB_LLC_AGE3;
327 328 329 330

	return pte;
}

331 332
static gen6_pte_t iris_pte_encode(dma_addr_t addr,
				  enum i915_cache_level level,
333
				  u32 unused)
334
{
335
	gen6_pte_t pte = GEN6_PTE_VALID;
336 337
	pte |= HSW_PTE_ADDR_ENCODE(addr);

338 339 340 341
	switch (level) {
	case I915_CACHE_NONE:
		break;
	case I915_CACHE_WT:
342
		pte |= HSW_WT_ELLC_LLC_AGE3;
343 344
		break;
	default:
345
		pte |= HSW_WB_ELLC_LLC_AGE3;
346 347
		break;
	}
348 349 350 351

	return pte;
}

352
static struct page *vm_alloc_page(struct i915_address_space *vm, gfp_t gfp)
353
{
354
	struct page *page;
355

356 357
	if (I915_SELFTEST_ONLY(should_fail(&vm->fault_attr, 1)))
		i915_gem_shrink_all(vm->i915);
358

359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
	if (vm->free_pages.nr)
		return vm->free_pages.pages[--vm->free_pages.nr];

	page = alloc_page(gfp);
	if (!page)
		return NULL;

	if (vm->pt_kmap_wc)
		set_pages_array_wc(&page, 1);

	return page;
}

static void vm_free_pages_release(struct i915_address_space *vm)
{
	GEM_BUG_ON(!pagevec_count(&vm->free_pages));

	if (vm->pt_kmap_wc)
		set_pages_array_wb(vm->free_pages.pages,
				   pagevec_count(&vm->free_pages));

	__pagevec_release(&vm->free_pages);
}

static void vm_free_page(struct i915_address_space *vm, struct page *page)
{
	if (!pagevec_add(&vm->free_pages, page))
		vm_free_pages_release(vm);
}
388

389 390 391 392 393 394 395
static int __setup_page_dma(struct i915_address_space *vm,
			    struct i915_page_dma *p,
			    gfp_t gfp)
{
	p->page = vm_alloc_page(vm, gfp | __GFP_NOWARN | __GFP_NORETRY);
	if (unlikely(!p->page))
		return -ENOMEM;
396

397 398 399 400 401
	p->daddr = dma_map_page(vm->dma, p->page, 0, PAGE_SIZE,
				PCI_DMA_BIDIRECTIONAL);
	if (unlikely(dma_mapping_error(vm->dma, p->daddr))) {
		vm_free_page(vm, p->page);
		return -ENOMEM;
402
	}
403 404

	return 0;
405 406
}

407
static int setup_page_dma(struct i915_address_space *vm,
408
			  struct i915_page_dma *p)
409
{
410
	return __setup_page_dma(vm, p, I915_GFP_DMA);
411 412
}

413
static void cleanup_page_dma(struct i915_address_space *vm,
414
			     struct i915_page_dma *p)
415
{
416 417
	dma_unmap_page(vm->dma, p->daddr, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
	vm_free_page(vm, p->page);
418 419
}

420
#define kmap_atomic_px(px) kmap_atomic(px_base(px)->page)
421

422 423 424 425
#define setup_px(vm, px) setup_page_dma((vm), px_base(px))
#define cleanup_px(vm, px) cleanup_page_dma((vm), px_base(px))
#define fill_px(ppgtt, px, v) fill_page_dma((vm), px_base(px), (v))
#define fill32_px(ppgtt, px, v) fill_page_dma_32((vm), px_base(px), (v))
426

427 428 429
static void fill_page_dma(struct i915_address_space *vm,
			  struct i915_page_dma *p,
			  const u64 val)
430
{
431
	u64 * const vaddr = kmap_atomic(p->page);
432 433 434 435 436
	int i;

	for (i = 0; i < 512; i++)
		vaddr[i] = val;

437
	kunmap_atomic(vaddr);
438 439
}

440 441 442
static void fill_page_dma_32(struct i915_address_space *vm,
			     struct i915_page_dma *p,
			     const u32 v)
443
{
444
	fill_page_dma(vm, p, (u64)v << 32 | v);
445 446
}

447
static int
448
setup_scratch_page(struct i915_address_space *vm, gfp_t gfp)
449
{
450
	return __setup_page_dma(vm, &vm->scratch_page, gfp | __GFP_ZERO);
451 452
}

453
static void cleanup_scratch_page(struct i915_address_space *vm)
454
{
455
	cleanup_page_dma(vm, &vm->scratch_page);
456 457
}

458
static struct i915_page_table *alloc_pt(struct i915_address_space *vm)
459
{
460
	struct i915_page_table *pt;
461

462 463
	pt = kmalloc(sizeof(*pt), GFP_KERNEL | __GFP_NOWARN);
	if (unlikely(!pt))
464 465
		return ERR_PTR(-ENOMEM);

466 467 468 469
	if (unlikely(setup_px(vm, pt))) {
		kfree(pt);
		return ERR_PTR(-ENOMEM);
	}
470

471
	pt->used_ptes = 0;
472 473 474
	return pt;
}

475
static void free_pt(struct i915_address_space *vm, struct i915_page_table *pt)
476
{
477
	cleanup_px(vm, pt);
478 479 480 481 482 483
	kfree(pt);
}

static void gen8_initialize_pt(struct i915_address_space *vm,
			       struct i915_page_table *pt)
{
484 485
	fill_px(vm, pt,
		gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC));
486 487 488 489 490
}

static void gen6_initialize_pt(struct i915_address_space *vm,
			       struct i915_page_table *pt)
{
491 492
	fill32_px(vm, pt,
		  vm->pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0));
493 494
}

495
static struct i915_page_directory *alloc_pd(struct i915_address_space *vm)
496
{
497
	struct i915_page_directory *pd;
498

499 500
	pd = kzalloc(sizeof(*pd), GFP_KERNEL | __GFP_NOWARN);
	if (unlikely(!pd))
501 502
		return ERR_PTR(-ENOMEM);

503 504 505 506
	if (unlikely(setup_px(vm, pd))) {
		kfree(pd);
		return ERR_PTR(-ENOMEM);
	}
507

508
	pd->used_pdes = 0;
509 510 511
	return pd;
}

512
static void free_pd(struct i915_address_space *vm,
513
		    struct i915_page_directory *pd)
514
{
515 516
	cleanup_px(vm, pd);
	kfree(pd);
517 518 519 520 521
}

static void gen8_initialize_pd(struct i915_address_space *vm,
			       struct i915_page_directory *pd)
{
522
	unsigned int i;
523

524 525 526 527
	fill_px(vm, pd,
		gen8_pde_encode(px_dma(vm->scratch_pt), I915_CACHE_LLC));
	for (i = 0; i < I915_PDES; i++)
		pd->page_table[i] = vm->scratch_pt;
528 529
}

530
static int __pdp_init(struct i915_address_space *vm,
531 532
		      struct i915_page_directory_pointer *pdp)
{
533
	const unsigned int pdpes = i915_pdpes_per_pdp(vm);
534
	unsigned int i;
535

536
	pdp->page_directory = kmalloc_array(pdpes, sizeof(*pdp->page_directory),
537 538
					    GFP_KERNEL | __GFP_NOWARN);
	if (unlikely(!pdp->page_directory))
539 540
		return -ENOMEM;

541 542 543
	for (i = 0; i < pdpes; i++)
		pdp->page_directory[i] = vm->scratch_pd;

544 545 546 547 548 549 550 551 552
	return 0;
}

static void __pdp_fini(struct i915_page_directory_pointer *pdp)
{
	kfree(pdp->page_directory);
	pdp->page_directory = NULL;
}

553 554 555 556 557
static inline bool use_4lvl(const struct i915_address_space *vm)
{
	return i915_vm_is_48bit(vm);
}

558 559
static struct i915_page_directory_pointer *
alloc_pdp(struct i915_address_space *vm)
560 561 562 563
{
	struct i915_page_directory_pointer *pdp;
	int ret = -ENOMEM;

564
	WARN_ON(!use_4lvl(vm));
565 566 567 568 569

	pdp = kzalloc(sizeof(*pdp), GFP_KERNEL);
	if (!pdp)
		return ERR_PTR(-ENOMEM);

570
	ret = __pdp_init(vm, pdp);
571 572 573
	if (ret)
		goto fail_bitmap;

574
	ret = setup_px(vm, pdp);
575 576 577 578 579 580 581 582 583 584 585 586 587
	if (ret)
		goto fail_page_m;

	return pdp;

fail_page_m:
	__pdp_fini(pdp);
fail_bitmap:
	kfree(pdp);

	return ERR_PTR(ret);
}

588
static void free_pdp(struct i915_address_space *vm,
589 590 591
		     struct i915_page_directory_pointer *pdp)
{
	__pdp_fini(pdp);
592 593 594 595 596 597

	if (!use_4lvl(vm))
		return;

	cleanup_px(vm, pdp);
	kfree(pdp);
598 599
}

600 601 602 603 604 605 606
static void gen8_initialize_pdp(struct i915_address_space *vm,
				struct i915_page_directory_pointer *pdp)
{
	gen8_ppgtt_pdpe_t scratch_pdpe;

	scratch_pdpe = gen8_pdpe_encode(px_dma(vm->scratch_pd), I915_CACHE_LLC);

607
	fill_px(vm, pdp, scratch_pdpe);
608 609 610 611 612
}

static void gen8_initialize_pml4(struct i915_address_space *vm,
				 struct i915_pml4 *pml4)
{
613
	unsigned int i;
614

615 616 617 618
	fill_px(vm, pml4,
		gen8_pml4e_encode(px_dma(vm->scratch_pdp), I915_CACHE_LLC));
	for (i = 0; i < GEN8_PML4ES_PER_PML4; i++)
		pml4->pdps[i] = vm->scratch_pdp;
619 620
}

621
/* Broadwell Page Directory Pointer Descriptors */
622
static int gen8_write_pdp(struct drm_i915_gem_request *req,
623 624
			  unsigned entry,
			  dma_addr_t addr)
625
{
626
	struct intel_engine_cs *engine = req->engine;
627
	u32 *cs;
628 629 630

	BUG_ON(entry >= 4);

631 632 633
	cs = intel_ring_begin(req, 6);
	if (IS_ERR(cs))
		return PTR_ERR(cs);
634

635 636 637 638 639 640 641
	*cs++ = MI_LOAD_REGISTER_IMM(1);
	*cs++ = i915_mmio_reg_offset(GEN8_RING_PDP_UDW(engine, entry));
	*cs++ = upper_32_bits(addr);
	*cs++ = MI_LOAD_REGISTER_IMM(1);
	*cs++ = i915_mmio_reg_offset(GEN8_RING_PDP_LDW(engine, entry));
	*cs++ = lower_32_bits(addr);
	intel_ring_advance(req, cs);
642 643 644 645

	return 0;
}

646 647
static int gen8_mm_switch_3lvl(struct i915_hw_ppgtt *ppgtt,
			       struct drm_i915_gem_request *req)
648
{
649
	int i, ret;
650

651
	for (i = GEN8_3LVL_PDPES - 1; i >= 0; i--) {
652 653
		const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);

654
		ret = gen8_write_pdp(req, i, pd_daddr);
655 656
		if (ret)
			return ret;
657
	}
B
Ben Widawsky 已提交
658

659
	return 0;
660 661
}

662 663
static int gen8_mm_switch_4lvl(struct i915_hw_ppgtt *ppgtt,
			       struct drm_i915_gem_request *req)
664 665 666 667
{
	return gen8_write_pdp(req, 0, px_dma(&ppgtt->pml4));
}

668 669 670 671 672 673 674
/* PDE TLBs are a pain to invalidate on GEN8+. When we modify
 * the page table structures, we mark them dirty so that
 * context switching/execlist queuing code takes extra steps
 * to ensure that tlbs are flushed.
 */
static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
{
675
	ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.i915)->ring_mask;
676 677
}

678 679 680 681
/* Removes entries from a single page table, releasing it if it's empty.
 * Caller can use the return value to update higher-level entries.
 */
static bool gen8_ppgtt_clear_pt(struct i915_address_space *vm,
682
				struct i915_page_table *pt,
683
				u64 start, u64 length)
684
{
685
	unsigned int num_entries = gen8_pte_count(start, length);
M
Mika Kuoppala 已提交
686 687
	unsigned int pte = gen8_pte_index(start);
	unsigned int pte_end = pte + num_entries;
688 689 690
	const gen8_pte_t scratch_pte =
		gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC);
	gen8_pte_t *vaddr;
691

692
	GEM_BUG_ON(num_entries > pt->used_ptes);
M
Mika Kuoppala 已提交
693

694 695 696
	pt->used_ptes -= num_entries;
	if (!pt->used_ptes)
		return true;
697

698
	vaddr = kmap_atomic_px(pt);
M
Mika Kuoppala 已提交
699
	while (pte < pte_end)
700
		vaddr[pte++] = scratch_pte;
701
	kunmap_atomic(vaddr);
702 703

	return false;
704
}
705

706 707 708 709 710 711 712 713 714 715 716 717 718 719
static void gen8_ppgtt_set_pde(struct i915_address_space *vm,
			       struct i915_page_directory *pd,
			       struct i915_page_table *pt,
			       unsigned int pde)
{
	gen8_pde_t *vaddr;

	pd->page_table[pde] = pt;

	vaddr = kmap_atomic_px(pd);
	vaddr[pde] = gen8_pde_encode(px_dma(pt), I915_CACHE_LLC);
	kunmap_atomic(vaddr);
}

720
static bool gen8_ppgtt_clear_pd(struct i915_address_space *vm,
721
				struct i915_page_directory *pd,
722
				u64 start, u64 length)
723 724
{
	struct i915_page_table *pt;
725
	u32 pde;
726 727

	gen8_for_each_pde(pt, pd, start, length, pde) {
728 729
		GEM_BUG_ON(pt == vm->scratch_pt);

730 731
		if (!gen8_ppgtt_clear_pt(vm, pt, start, length))
			continue;
732

733
		gen8_ppgtt_set_pde(vm, pd, vm->scratch_pt, pde);
734
		GEM_BUG_ON(!pd->used_pdes);
735
		pd->used_pdes--;
736 737

		free_pt(vm, pt);
738 739
	}

740 741
	return !pd->used_pdes;
}
742

743 744 745 746 747 748 749 750
static void gen8_ppgtt_set_pdpe(struct i915_address_space *vm,
				struct i915_page_directory_pointer *pdp,
				struct i915_page_directory *pd,
				unsigned int pdpe)
{
	gen8_ppgtt_pdpe_t *vaddr;

	pdp->page_directory[pdpe] = pd;
751
	if (!use_4lvl(vm))
752 753 754 755 756
		return;

	vaddr = kmap_atomic_px(pdp);
	vaddr[pdpe] = gen8_pdpe_encode(px_dma(pd), I915_CACHE_LLC);
	kunmap_atomic(vaddr);
757
}
758

759 760 761 762
/* Removes entries from a single page dir pointer, releasing it if it's empty.
 * Caller can use the return value to update higher-level entries
 */
static bool gen8_ppgtt_clear_pdp(struct i915_address_space *vm,
763
				 struct i915_page_directory_pointer *pdp,
764
				 u64 start, u64 length)
765 766
{
	struct i915_page_directory *pd;
767
	unsigned int pdpe;
768

769
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
770 771
		GEM_BUG_ON(pd == vm->scratch_pd);

772 773
		if (!gen8_ppgtt_clear_pd(vm, pd, start, length))
			continue;
774

775
		gen8_ppgtt_set_pdpe(vm, pdp, vm->scratch_pd, pdpe);
776
		GEM_BUG_ON(!pdp->used_pdpes);
777
		pdp->used_pdpes--;
778

779 780
		free_pd(vm, pd);
	}
781

782
	return !pdp->used_pdpes;
783
}
784

785 786 787 788 789 790
static void gen8_ppgtt_clear_3lvl(struct i915_address_space *vm,
				  u64 start, u64 length)
{
	gen8_ppgtt_clear_pdp(vm, &i915_vm_to_ppgtt(vm)->pdp, start, length);
}

791 792 793 794 795 796 797 798 799 800 801 802 803
static void gen8_ppgtt_set_pml4e(struct i915_pml4 *pml4,
				 struct i915_page_directory_pointer *pdp,
				 unsigned int pml4e)
{
	gen8_ppgtt_pml4e_t *vaddr;

	pml4->pdps[pml4e] = pdp;

	vaddr = kmap_atomic_px(pml4);
	vaddr[pml4e] = gen8_pml4e_encode(px_dma(pdp), I915_CACHE_LLC);
	kunmap_atomic(vaddr);
}

804 805 806 807
/* Removes entries from a single pml4.
 * This is the top-level structure in 4-level page tables used on gen8+.
 * Empty entries are always scratch pml4e.
 */
808 809
static void gen8_ppgtt_clear_4lvl(struct i915_address_space *vm,
				  u64 start, u64 length)
810
{
811 812
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
	struct i915_pml4 *pml4 = &ppgtt->pml4;
813
	struct i915_page_directory_pointer *pdp;
814
	unsigned int pml4e;
815

816
	GEM_BUG_ON(!use_4lvl(vm));
817

818
	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
819 820
		GEM_BUG_ON(pdp == vm->scratch_pdp);

821 822
		if (!gen8_ppgtt_clear_pdp(vm, pdp, start, length))
			continue;
823

824 825 826
		gen8_ppgtt_set_pml4e(pml4, vm->scratch_pdp, pml4e);

		free_pdp(vm, pdp);
827 828 829
	}
}

830 831 832 833 834
struct sgt_dma {
	struct scatterlist *sg;
	dma_addr_t dma, max;
};

835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
struct gen8_insert_pte {
	u16 pml4e;
	u16 pdpe;
	u16 pde;
	u16 pte;
};

static __always_inline struct gen8_insert_pte gen8_insert_pte(u64 start)
{
	return (struct gen8_insert_pte) {
		 gen8_pml4e_index(start),
		 gen8_pdpe_index(start),
		 gen8_pde_index(start),
		 gen8_pte_index(start),
	};
}

852 853
static __always_inline bool
gen8_ppgtt_insert_pte_entries(struct i915_hw_ppgtt *ppgtt,
854
			      struct i915_page_directory_pointer *pdp,
855
			      struct sgt_dma *iter,
856
			      struct gen8_insert_pte *idx,
857 858
			      enum i915_cache_level cache_level)
{
859 860 861 862
	struct i915_page_directory *pd;
	const gen8_pte_t pte_encode = gen8_pte_encode(0, cache_level);
	gen8_pte_t *vaddr;
	bool ret;
863

864
	GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->base));
865 866
	pd = pdp->page_directory[idx->pdpe];
	vaddr = kmap_atomic_px(pd->page_table[idx->pde]);
867
	do {
868 869
		vaddr[idx->pte] = pte_encode | iter->dma;

870 871 872 873 874 875 876
		iter->dma += PAGE_SIZE;
		if (iter->dma >= iter->max) {
			iter->sg = __sg_next(iter->sg);
			if (!iter->sg) {
				ret = false;
				break;
			}
877

878 879
			iter->dma = sg_dma_address(iter->sg);
			iter->max = iter->dma + iter->sg->length;
B
Ben Widawsky 已提交
880
		}
881

882 883 884 885 886 887
		if (++idx->pte == GEN8_PTES) {
			idx->pte = 0;

			if (++idx->pde == I915_PDES) {
				idx->pde = 0;

888
				/* Limited by sg length for 3lvl */
889 890
				if (++idx->pdpe == GEN8_PML4ES_PER_PML4) {
					idx->pdpe = 0;
891
					ret = true;
892
					break;
893 894
				}

895
				GEM_BUG_ON(idx->pdpe >= i915_pdpes_per_pdp(&ppgtt->base));
896
				pd = pdp->page_directory[idx->pdpe];
897
			}
898

899
			kunmap_atomic(vaddr);
900
			vaddr = kmap_atomic_px(pd->page_table[idx->pde]);
901
		}
902
	} while (1);
903
	kunmap_atomic(vaddr);
904

905
	return ret;
906 907
}

908
static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
909
				   struct i915_vma *vma,
910 911
				   enum i915_cache_level cache_level,
				   u32 unused)
912
{
913
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vma->vm);
914
	struct sgt_dma iter = {
915
		.sg = vma->pages->sgl,
916 917 918
		.dma = sg_dma_address(iter.sg),
		.max = iter.dma + iter.sg->length,
	};
919
	struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
920

921 922
	gen8_ppgtt_insert_pte_entries(ppgtt, &ppgtt->pdp, &iter, &idx,
				      cache_level);
923
}
924

925
static void gen8_ppgtt_insert_4lvl(struct i915_address_space *vm,
926
				   struct i915_vma *vma,
927 928 929 930 931
				   enum i915_cache_level cache_level,
				   u32 unused)
{
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
	struct sgt_dma iter = {
932
		.sg = vma->pages->sgl,
933 934 935 936
		.dma = sg_dma_address(iter.sg),
		.max = iter.dma + iter.sg->length,
	};
	struct i915_page_directory_pointer **pdps = ppgtt->pml4.pdps;
937
	struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
938

939 940 941
	while (gen8_ppgtt_insert_pte_entries(ppgtt, pdps[idx.pml4e++], &iter,
					     &idx, cache_level))
		GEM_BUG_ON(idx.pml4e >= GEN8_PML4ES_PER_PML4);
942 943
}

944
static void gen8_free_page_tables(struct i915_address_space *vm,
945
				  struct i915_page_directory *pd)
946 947 948
{
	int i;

949
	if (!px_page(pd))
950 951
		return;

952 953 954
	for (i = 0; i < I915_PDES; i++) {
		if (pd->page_table[i] != vm->scratch_pt)
			free_pt(vm, pd->page_table[i]);
955
	}
B
Ben Widawsky 已提交
956 957
}

958 959
static int gen8_init_scratch(struct i915_address_space *vm)
{
960
	int ret;
961

962
	ret = setup_scratch_page(vm, I915_GFP_DMA);
963 964
	if (ret)
		return ret;
965

966
	vm->scratch_pt = alloc_pt(vm);
967
	if (IS_ERR(vm->scratch_pt)) {
968 969
		ret = PTR_ERR(vm->scratch_pt);
		goto free_scratch_page;
970 971
	}

972
	vm->scratch_pd = alloc_pd(vm);
973
	if (IS_ERR(vm->scratch_pd)) {
974 975
		ret = PTR_ERR(vm->scratch_pd);
		goto free_pt;
976 977
	}

978
	if (use_4lvl(vm)) {
979
		vm->scratch_pdp = alloc_pdp(vm);
980
		if (IS_ERR(vm->scratch_pdp)) {
981 982
			ret = PTR_ERR(vm->scratch_pdp);
			goto free_pd;
983 984 985
		}
	}

986 987
	gen8_initialize_pt(vm, vm->scratch_pt);
	gen8_initialize_pd(vm, vm->scratch_pd);
988
	if (use_4lvl(vm))
989
		gen8_initialize_pdp(vm, vm->scratch_pdp);
990 991

	return 0;
992 993

free_pd:
994
	free_pd(vm, vm->scratch_pd);
995
free_pt:
996
	free_pt(vm, vm->scratch_pt);
997
free_scratch_page:
998
	cleanup_scratch_page(vm);
999 1000

	return ret;
1001 1002
}

1003 1004
static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
{
1005 1006
	struct i915_address_space *vm = &ppgtt->base;
	struct drm_i915_private *dev_priv = vm->i915;
1007 1008 1009
	enum vgt_g2v_type msg;
	int i;

1010 1011
	if (use_4lvl(vm)) {
		const u64 daddr = px_dma(&ppgtt->pml4);
1012

1013 1014
		I915_WRITE(vgtif_reg(pdp[0].lo), lower_32_bits(daddr));
		I915_WRITE(vgtif_reg(pdp[0].hi), upper_32_bits(daddr));
1015 1016 1017 1018

		msg = (create ? VGT_G2V_PPGTT_L4_PAGE_TABLE_CREATE :
				VGT_G2V_PPGTT_L4_PAGE_TABLE_DESTROY);
	} else {
1019
		for (i = 0; i < GEN8_3LVL_PDPES; i++) {
1020
			const u64 daddr = i915_page_dir_dma_addr(ppgtt, i);
1021

1022 1023
			I915_WRITE(vgtif_reg(pdp[i].lo), lower_32_bits(daddr));
			I915_WRITE(vgtif_reg(pdp[i].hi), upper_32_bits(daddr));
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
		}

		msg = (create ? VGT_G2V_PPGTT_L3_PAGE_TABLE_CREATE :
				VGT_G2V_PPGTT_L3_PAGE_TABLE_DESTROY);
	}

	I915_WRITE(vgtif_reg(g2v_notify), msg);

	return 0;
}

1035 1036
static void gen8_free_scratch(struct i915_address_space *vm)
{
1037
	if (use_4lvl(vm))
1038 1039 1040 1041
		free_pdp(vm, vm->scratch_pdp);
	free_pd(vm, vm->scratch_pd);
	free_pt(vm, vm->scratch_pt);
	cleanup_scratch_page(vm);
1042 1043
}

1044
static void gen8_ppgtt_cleanup_3lvl(struct i915_address_space *vm,
1045
				    struct i915_page_directory_pointer *pdp)
1046
{
1047
	const unsigned int pdpes = i915_pdpes_per_pdp(vm);
1048 1049
	int i;

1050
	for (i = 0; i < pdpes; i++) {
1051
		if (pdp->page_directory[i] == vm->scratch_pd)
1052 1053
			continue;

1054 1055
		gen8_free_page_tables(vm, pdp->page_directory[i]);
		free_pd(vm, pdp->page_directory[i]);
1056
	}
1057

1058
	free_pdp(vm, pdp);
1059 1060 1061 1062 1063 1064
}

static void gen8_ppgtt_cleanup_4lvl(struct i915_hw_ppgtt *ppgtt)
{
	int i;

1065 1066
	for (i = 0; i < GEN8_PML4ES_PER_PML4; i++) {
		if (ppgtt->pml4.pdps[i] == ppgtt->base.scratch_pdp)
1067 1068
			continue;

1069
		gen8_ppgtt_cleanup_3lvl(&ppgtt->base, ppgtt->pml4.pdps[i]);
1070 1071
	}

1072
	cleanup_px(&ppgtt->base, &ppgtt->pml4);
1073 1074 1075 1076
}

static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
{
1077
	struct drm_i915_private *dev_priv = vm->i915;
1078
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1079

1080
	if (intel_vgpu_active(dev_priv))
1081 1082
		gen8_ppgtt_notify_vgt(ppgtt, false);

1083
	if (use_4lvl(vm))
1084
		gen8_ppgtt_cleanup_4lvl(ppgtt);
1085 1086
	else
		gen8_ppgtt_cleanup_3lvl(&ppgtt->base, &ppgtt->pdp);
1087

1088
	gen8_free_scratch(vm);
1089 1090
}

1091 1092 1093
static int gen8_ppgtt_alloc_pd(struct i915_address_space *vm,
			       struct i915_page_directory *pd,
			       u64 start, u64 length)
1094
{
1095
	struct i915_page_table *pt;
1096
	u64 from = start;
1097
	unsigned int pde;
1098

1099
	gen8_for_each_pde(pt, pd, start, length, pde) {
1100
		if (pt == vm->scratch_pt) {
1101 1102 1103
			pt = alloc_pt(vm);
			if (IS_ERR(pt))
				goto unwind;
1104

1105
			gen8_initialize_pt(vm, pt);
1106 1107 1108

			gen8_ppgtt_set_pde(vm, pd, pt, pde);
			pd->used_pdes++;
1109
			GEM_BUG_ON(pd->used_pdes > I915_PDES);
1110
		}
1111

1112
		pt->used_ptes += gen8_pte_count(start, length);
1113
	}
1114
	return 0;
1115

1116 1117
unwind:
	gen8_ppgtt_clear_pd(vm, pd, from, start - from);
B
Ben Widawsky 已提交
1118
	return -ENOMEM;
1119 1120
}

1121 1122 1123
static int gen8_ppgtt_alloc_pdp(struct i915_address_space *vm,
				struct i915_page_directory_pointer *pdp,
				u64 start, u64 length)
1124
{
1125
	struct i915_page_directory *pd;
1126 1127
	u64 from = start;
	unsigned int pdpe;
1128 1129
	int ret;

1130
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1131 1132 1133 1134
		if (pd == vm->scratch_pd) {
			pd = alloc_pd(vm);
			if (IS_ERR(pd))
				goto unwind;
1135

1136
			gen8_initialize_pd(vm, pd);
1137
			gen8_ppgtt_set_pdpe(vm, pdp, pd, pdpe);
1138
			pdp->used_pdpes++;
1139
			GEM_BUG_ON(pdp->used_pdpes > i915_pdpes_per_pdp(vm));
1140 1141

			mark_tlbs_dirty(i915_vm_to_ppgtt(vm));
1142 1143 1144
		}

		ret = gen8_ppgtt_alloc_pd(vm, pd, start, length);
1145 1146
		if (unlikely(ret))
			goto unwind_pd;
1147
	}
1148

B
Ben Widawsky 已提交
1149
	return 0;
1150

1151 1152 1153 1154 1155 1156 1157
unwind_pd:
	if (!pd->used_pdes) {
		gen8_ppgtt_set_pdpe(vm, pdp, vm->scratch_pd, pdpe);
		GEM_BUG_ON(!pdp->used_pdpes);
		pdp->used_pdpes--;
		free_pd(vm, pd);
	}
1158 1159 1160
unwind:
	gen8_ppgtt_clear_pdp(vm, pdp, from, start - from);
	return -ENOMEM;
1161 1162
}

1163 1164
static int gen8_ppgtt_alloc_3lvl(struct i915_address_space *vm,
				 u64 start, u64 length)
1165
{
1166 1167 1168
	return gen8_ppgtt_alloc_pdp(vm,
				    &i915_vm_to_ppgtt(vm)->pdp, start, length);
}
1169

1170 1171 1172 1173 1174 1175 1176 1177 1178
static int gen8_ppgtt_alloc_4lvl(struct i915_address_space *vm,
				 u64 start, u64 length)
{
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
	struct i915_pml4 *pml4 = &ppgtt->pml4;
	struct i915_page_directory_pointer *pdp;
	u64 from = start;
	u32 pml4e;
	int ret;
1179

1180
	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
1181 1182 1183 1184
		if (pml4->pdps[pml4e] == vm->scratch_pdp) {
			pdp = alloc_pdp(vm);
			if (IS_ERR(pdp))
				goto unwind;
1185

1186 1187 1188
			gen8_initialize_pdp(vm, pdp);
			gen8_ppgtt_set_pml4e(pml4, pdp, pml4e);
		}
1189

1190
		ret = gen8_ppgtt_alloc_pdp(vm, pdp, start, length);
1191 1192
		if (unlikely(ret))
			goto unwind_pdp;
1193 1194 1195 1196
	}

	return 0;

1197 1198 1199 1200 1201
unwind_pdp:
	if (!pdp->used_pdpes) {
		gen8_ppgtt_set_pml4e(pml4, vm->scratch_pdp, pml4e);
		free_pdp(vm, pdp);
	}
1202 1203 1204
unwind:
	gen8_ppgtt_clear_4lvl(vm, from, start - from);
	return -ENOMEM;
1205 1206
}

1207 1208
static void gen8_dump_pdp(struct i915_hw_ppgtt *ppgtt,
			  struct i915_page_directory_pointer *pdp,
1209
			  u64 start, u64 length,
1210 1211 1212
			  gen8_pte_t scratch_pte,
			  struct seq_file *m)
{
1213
	struct i915_address_space *vm = &ppgtt->base;
1214
	struct i915_page_directory *pd;
1215
	u32 pdpe;
1216

1217
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1218
		struct i915_page_table *pt;
1219 1220 1221
		u64 pd_len = length;
		u64 pd_start = start;
		u32 pde;
1222

1223
		if (pdp->page_directory[pdpe] == ppgtt->base.scratch_pd)
1224 1225 1226
			continue;

		seq_printf(m, "\tPDPE #%d\n", pdpe);
1227
		gen8_for_each_pde(pt, pd, pd_start, pd_len, pde) {
1228
			u32 pte;
1229 1230
			gen8_pte_t *pt_vaddr;

1231
			if (pd->page_table[pde] == ppgtt->base.scratch_pt)
1232 1233
				continue;

1234
			pt_vaddr = kmap_atomic_px(pt);
1235
			for (pte = 0; pte < GEN8_PTES; pte += 4) {
1236 1237 1238
				u64 va = (pdpe << GEN8_PDPE_SHIFT |
					  pde << GEN8_PDE_SHIFT |
					  pte << GEN8_PTE_SHIFT);
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264
				int i;
				bool found = false;

				for (i = 0; i < 4; i++)
					if (pt_vaddr[pte + i] != scratch_pte)
						found = true;
				if (!found)
					continue;

				seq_printf(m, "\t\t0x%llx [%03d,%03d,%04d]: =", va, pdpe, pde, pte);
				for (i = 0; i < 4; i++) {
					if (pt_vaddr[pte + i] != scratch_pte)
						seq_printf(m, " %llx", pt_vaddr[pte + i]);
					else
						seq_puts(m, "  SCRATCH ");
				}
				seq_puts(m, "\n");
			}
			kunmap_atomic(pt_vaddr);
		}
	}
}

static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
{
	struct i915_address_space *vm = &ppgtt->base;
1265 1266
	const gen8_pte_t scratch_pte =
		gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC);
1267
	u64 start = 0, length = ppgtt->base.total;
1268

1269
	if (use_4lvl(vm)) {
1270
		u64 pml4e;
1271 1272 1273
		struct i915_pml4 *pml4 = &ppgtt->pml4;
		struct i915_page_directory_pointer *pdp;

1274
		gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
1275
			if (pml4->pdps[pml4e] == ppgtt->base.scratch_pdp)
1276 1277 1278
				continue;

			seq_printf(m, "    PML4E #%llu\n", pml4e);
1279
			gen8_dump_pdp(ppgtt, pdp, start, length, scratch_pte, m);
1280
		}
1281 1282
	} else {
		gen8_dump_pdp(ppgtt, &ppgtt->pdp, start, length, scratch_pte, m);
1283 1284 1285
	}
}

1286
static int gen8_preallocate_top_level_pdp(struct i915_hw_ppgtt *ppgtt)
1287
{
1288 1289 1290 1291 1292 1293
	struct i915_address_space *vm = &ppgtt->base;
	struct i915_page_directory_pointer *pdp = &ppgtt->pdp;
	struct i915_page_directory *pd;
	u64 start = 0, length = ppgtt->base.total;
	u64 from = start;
	unsigned int pdpe;
1294

1295 1296 1297 1298
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
		pd = alloc_pd(vm);
		if (IS_ERR(pd))
			goto unwind;
1299

1300 1301 1302 1303
		gen8_initialize_pd(vm, pd);
		gen8_ppgtt_set_pdpe(vm, pdp, pd, pdpe);
		pdp->used_pdpes++;
	}
1304

1305 1306
	pdp->used_pdpes++; /* never remove */
	return 0;
1307

1308 1309 1310 1311 1312 1313 1314 1315
unwind:
	start -= from;
	gen8_for_each_pdpe(pd, pdp, from, start, pdpe) {
		gen8_ppgtt_set_pdpe(vm, pdp, vm->scratch_pd, pdpe);
		free_pd(vm, pd);
	}
	pdp->used_pdpes = 0;
	return -ENOMEM;
1316 1317
}

1318
/*
1319 1320 1321 1322
 * GEN8 legacy ppgtt programming is accomplished through a max 4 PDP registers
 * with a net effect resembling a 2-level page table in normal x86 terms. Each
 * PDP represents 1GB of memory 4 * 512 * 512 * 4096 = 4GB legacy 32b address
 * space.
B
Ben Widawsky 已提交
1323
 *
1324
 */
1325
static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
B
Ben Widawsky 已提交
1326
{
1327 1328
	struct i915_address_space *vm = &ppgtt->base;
	struct drm_i915_private *dev_priv = vm->i915;
1329
	int ret;
1330

1331 1332 1333 1334
	ppgtt->base.total = USES_FULL_48BIT_PPGTT(dev_priv) ?
		1ULL << 48 :
		1ULL << 32;

1335
	ret = gen8_init_scratch(&ppgtt->base);
1336 1337
	if (ret) {
		ppgtt->base.total = 0;
1338
		return ret;
1339
	}
1340

1341 1342 1343 1344 1345 1346
	/* There are only few exceptions for gen >=6. chv and bxt.
	 * And we are not sure about the latter so play safe for now.
	 */
	if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
		ppgtt->base.pt_kmap_wc = true;

1347
	if (use_4lvl(vm)) {
1348
		ret = setup_px(&ppgtt->base, &ppgtt->pml4);
1349 1350
		if (ret)
			goto free_scratch;
1351

1352 1353
		gen8_initialize_pml4(&ppgtt->base, &ppgtt->pml4);

1354
		ppgtt->switch_mm = gen8_mm_switch_4lvl;
1355
		ppgtt->base.allocate_va_range = gen8_ppgtt_alloc_4lvl;
1356
		ppgtt->base.insert_entries = gen8_ppgtt_insert_4lvl;
1357
		ppgtt->base.clear_range = gen8_ppgtt_clear_4lvl;
1358
	} else {
1359
		ret = __pdp_init(&ppgtt->base, &ppgtt->pdp);
1360 1361 1362
		if (ret)
			goto free_scratch;

1363
		if (intel_vgpu_active(dev_priv)) {
1364 1365 1366
			ret = gen8_preallocate_top_level_pdp(ppgtt);
			if (ret) {
				__pdp_fini(&ppgtt->pdp);
1367
				goto free_scratch;
1368
			}
1369
		}
1370

1371
		ppgtt->switch_mm = gen8_mm_switch_3lvl;
1372
		ppgtt->base.allocate_va_range = gen8_ppgtt_alloc_3lvl;
1373
		ppgtt->base.insert_entries = gen8_ppgtt_insert_3lvl;
1374
		ppgtt->base.clear_range = gen8_ppgtt_clear_3lvl;
1375
	}
1376

1377
	if (intel_vgpu_active(dev_priv))
1378 1379
		gen8_ppgtt_notify_vgt(ppgtt, true);

1380 1381 1382 1383 1384
	ppgtt->base.cleanup = gen8_ppgtt_cleanup;
	ppgtt->base.unbind_vma = ppgtt_unbind_vma;
	ppgtt->base.bind_vma = ppgtt_bind_vma;
	ppgtt->debug_dump = gen8_dump_ppgtt;

1385
	return 0;
1386 1387 1388 1389

free_scratch:
	gen8_free_scratch(&ppgtt->base);
	return ret;
1390 1391
}

B
Ben Widawsky 已提交
1392 1393 1394
static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
{
	struct i915_address_space *vm = &ppgtt->base;
1395
	struct i915_page_table *unused;
1396
	gen6_pte_t scratch_pte;
1397 1398
	u32 pd_entry, pte, pde;
	u32 start = 0, length = ppgtt->base.total;
B
Ben Widawsky 已提交
1399

1400
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1401
				     I915_CACHE_LLC, 0);
B
Ben Widawsky 已提交
1402

1403
	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde) {
B
Ben Widawsky 已提交
1404
		u32 expected;
1405
		gen6_pte_t *pt_vaddr;
1406
		const dma_addr_t pt_addr = px_dma(ppgtt->pd.page_table[pde]);
1407
		pd_entry = readl(ppgtt->pd_addr + pde);
B
Ben Widawsky 已提交
1408 1409 1410 1411 1412 1413 1414 1415 1416
		expected = (GEN6_PDE_ADDR_ENCODE(pt_addr) | GEN6_PDE_VALID);

		if (pd_entry != expected)
			seq_printf(m, "\tPDE #%d mismatch: Actual PDE: %x Expected PDE: %x\n",
				   pde,
				   pd_entry,
				   expected);
		seq_printf(m, "\tPDE: %x\n", pd_entry);

1417
		pt_vaddr = kmap_atomic_px(ppgtt->pd.page_table[pde]);
1418

1419
		for (pte = 0; pte < GEN6_PTES; pte+=4) {
B
Ben Widawsky 已提交
1420
			unsigned long va =
1421
				(pde * PAGE_SIZE * GEN6_PTES) +
B
Ben Widawsky 已提交
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
				(pte * PAGE_SIZE);
			int i;
			bool found = false;
			for (i = 0; i < 4; i++)
				if (pt_vaddr[pte + i] != scratch_pte)
					found = true;
			if (!found)
				continue;

			seq_printf(m, "\t\t0x%lx [%03d,%04d]: =", va, pde, pte);
			for (i = 0; i < 4; i++) {
				if (pt_vaddr[pte + i] != scratch_pte)
					seq_printf(m, " %08x", pt_vaddr[pte + i]);
				else
					seq_puts(m, "  SCRATCH ");
			}
			seq_puts(m, "\n");
		}
1440
		kunmap_atomic(pt_vaddr);
B
Ben Widawsky 已提交
1441 1442 1443
	}
}

1444
/* Write pde (index) from the page directory @pd to the page table @pt */
C
Chris Wilson 已提交
1445 1446 1447
static inline void gen6_write_pde(const struct i915_hw_ppgtt *ppgtt,
				  const unsigned int pde,
				  const struct i915_page_table *pt)
B
Ben Widawsky 已提交
1448
{
1449
	/* Caller needs to make sure the write completes if necessary */
C
Chris Wilson 已提交
1450 1451
	writel_relaxed(GEN6_PDE_ADDR_ENCODE(px_dma(pt)) | GEN6_PDE_VALID,
		       ppgtt->pd_addr + pde);
1452
}
B
Ben Widawsky 已提交
1453

1454 1455
/* Write all the page tables found in the ppgtt structure to incrementing page
 * directories. */
C
Chris Wilson 已提交
1456
static void gen6_write_page_range(struct i915_hw_ppgtt *ppgtt,
1457
				  u32 start, u32 length)
1458
{
1459
	struct i915_page_table *pt;
C
Chris Wilson 已提交
1460
	unsigned int pde;
1461

C
Chris Wilson 已提交
1462 1463
	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde)
		gen6_write_pde(ppgtt, pde, pt);
1464

C
Chris Wilson 已提交
1465
	mark_tlbs_dirty(ppgtt);
1466
	wmb();
B
Ben Widawsky 已提交
1467 1468
}

1469
static inline u32 get_pd_offset(struct i915_hw_ppgtt *ppgtt)
B
Ben Widawsky 已提交
1470
{
1471 1472
	GEM_BUG_ON(ppgtt->pd.base.ggtt_offset & 0x3f);
	return ppgtt->pd.base.ggtt_offset << 10;
1473 1474
}

1475
static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
1476
			 struct drm_i915_gem_request *req)
1477
{
1478
	struct intel_engine_cs *engine = req->engine;
1479
	u32 *cs;
1480 1481

	/* NB: TLBs must be flushed and invalidated before a switch */
1482 1483 1484
	cs = intel_ring_begin(req, 6);
	if (IS_ERR(cs))
		return PTR_ERR(cs);
1485

1486 1487 1488 1489 1490 1491 1492
	*cs++ = MI_LOAD_REGISTER_IMM(2);
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_DCLV(engine));
	*cs++ = PP_DIR_DCLV_2G;
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine));
	*cs++ = get_pd_offset(ppgtt);
	*cs++ = MI_NOOP;
	intel_ring_advance(req, cs);
1493 1494 1495 1496

	return 0;
}

1497
static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
1498
			  struct drm_i915_gem_request *req)
1499
{
1500
	struct intel_engine_cs *engine = req->engine;
1501
	u32 *cs;
1502 1503

	/* NB: TLBs must be flushed and invalidated before a switch */
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514
	cs = intel_ring_begin(req, 6);
	if (IS_ERR(cs))
		return PTR_ERR(cs);

	*cs++ = MI_LOAD_REGISTER_IMM(2);
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_DCLV(engine));
	*cs++ = PP_DIR_DCLV_2G;
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine));
	*cs++ = get_pd_offset(ppgtt);
	*cs++ = MI_NOOP;
	intel_ring_advance(req, cs);
1515 1516 1517 1518

	return 0;
}

1519
static int gen6_mm_switch(struct i915_hw_ppgtt *ppgtt,
1520
			  struct drm_i915_gem_request *req)
1521
{
1522
	struct intel_engine_cs *engine = req->engine;
1523
	struct drm_i915_private *dev_priv = req->i915;
1524

1525 1526
	I915_WRITE(RING_PP_DIR_DCLV(engine), PP_DIR_DCLV_2G);
	I915_WRITE(RING_PP_DIR_BASE(engine), get_pd_offset(ppgtt));
1527 1528 1529
	return 0;
}

1530
static void gen8_ppgtt_enable(struct drm_i915_private *dev_priv)
1531
{
1532
	struct intel_engine_cs *engine;
1533
	enum intel_engine_id id;
B
Ben Widawsky 已提交
1534

1535
	for_each_engine(engine, dev_priv, id) {
1536 1537
		u32 four_level = USES_FULL_48BIT_PPGTT(dev_priv) ?
				 GEN8_GFX_PPGTT_48B : 0;
1538
		I915_WRITE(RING_MODE_GEN7(engine),
1539
			   _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE | four_level));
1540 1541
	}
}
B
Ben Widawsky 已提交
1542

1543
static void gen7_ppgtt_enable(struct drm_i915_private *dev_priv)
B
Ben Widawsky 已提交
1544
{
1545
	struct intel_engine_cs *engine;
1546
	u32 ecochk, ecobits;
1547
	enum intel_engine_id id;
B
Ben Widawsky 已提交
1548

1549 1550
	ecobits = I915_READ(GAC_ECO_BITS);
	I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_PPGTT_CACHE64B);
1551

1552
	ecochk = I915_READ(GAM_ECOCHK);
1553
	if (IS_HASWELL(dev_priv)) {
1554 1555 1556 1557 1558 1559
		ecochk |= ECOCHK_PPGTT_WB_HSW;
	} else {
		ecochk |= ECOCHK_PPGTT_LLC_IVB;
		ecochk &= ~ECOCHK_PPGTT_GFDT_IVB;
	}
	I915_WRITE(GAM_ECOCHK, ecochk);
1560

1561
	for_each_engine(engine, dev_priv, id) {
B
Ben Widawsky 已提交
1562
		/* GFX_MODE is per-ring on gen7+ */
1563
		I915_WRITE(RING_MODE_GEN7(engine),
1564
			   _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
B
Ben Widawsky 已提交
1565
	}
1566
}
B
Ben Widawsky 已提交
1567

1568
static void gen6_ppgtt_enable(struct drm_i915_private *dev_priv)
1569
{
1570
	u32 ecochk, gab_ctl, ecobits;
1571

1572 1573 1574
	ecobits = I915_READ(GAC_ECO_BITS);
	I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_SNB_BIT |
		   ECOBITS_PPGTT_CACHE64B);
B
Ben Widawsky 已提交
1575

1576 1577 1578 1579 1580 1581 1582
	gab_ctl = I915_READ(GAB_CTL);
	I915_WRITE(GAB_CTL, gab_ctl | GAB_CTL_CONT_AFTER_PAGEFAULT);

	ecochk = I915_READ(GAM_ECOCHK);
	I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT | ECOCHK_PPGTT_CACHE64B);

	I915_WRITE(GFX_MODE, _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
B
Ben Widawsky 已提交
1583 1584
}

1585
/* PPGTT support for Sandybdrige/Gen6 and later */
1586
static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
1587
				   u64 start, u64 length)
1588
{
1589
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1590 1591 1592 1593 1594 1595
	unsigned int first_entry = start >> PAGE_SHIFT;
	unsigned int pde = first_entry / GEN6_PTES;
	unsigned int pte = first_entry % GEN6_PTES;
	unsigned int num_entries = length >> PAGE_SHIFT;
	gen6_pte_t scratch_pte =
		vm->pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0);
1596

1597
	while (num_entries) {
1598 1599 1600
		struct i915_page_table *pt = ppgtt->pd.page_table[pde++];
		unsigned int end = min(pte + num_entries, GEN6_PTES);
		gen6_pte_t *vaddr;
1601

1602
		num_entries -= end - pte;
1603

1604 1605 1606 1607 1608
		/* Note that the hw doesn't support removing PDE on the fly
		 * (they are cached inside the context with no means to
		 * invalidate the cache), so we can only reset the PTE
		 * entries back to scratch.
		 */
1609

1610 1611 1612 1613 1614
		vaddr = kmap_atomic_px(pt);
		do {
			vaddr[pte++] = scratch_pte;
		} while (pte < end);
		kunmap_atomic(vaddr);
1615

1616
		pte = 0;
1617
	}
1618 1619
}

1620
static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
1621
				      struct i915_vma *vma,
1622 1623
				      enum i915_cache_level cache_level,
				      u32 flags)
D
Daniel Vetter 已提交
1624
{
1625
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1626
	unsigned first_entry = vma->node.start >> PAGE_SHIFT;
1627 1628
	unsigned act_pt = first_entry / GEN6_PTES;
	unsigned act_pte = first_entry % GEN6_PTES;
1629 1630 1631 1632
	const u32 pte_encode = vm->pte_encode(0, cache_level, flags);
	struct sgt_dma iter;
	gen6_pte_t *vaddr;

1633
	vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
1634
	iter.sg = vma->pages->sgl;
1635 1636 1637 1638
	iter.dma = sg_dma_address(iter.sg);
	iter.max = iter.dma + iter.sg->length;
	do {
		vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
1639

1640 1641 1642 1643 1644
		iter.dma += PAGE_SIZE;
		if (iter.dma == iter.max) {
			iter.sg = __sg_next(iter.sg);
			if (!iter.sg)
				break;
1645

1646 1647 1648
			iter.dma = sg_dma_address(iter.sg);
			iter.max = iter.dma + iter.sg->length;
		}
1649

1650
		if (++act_pte == GEN6_PTES) {
1651 1652
			kunmap_atomic(vaddr);
			vaddr = kmap_atomic_px(ppgtt->pd.page_table[++act_pt]);
1653
			act_pte = 0;
D
Daniel Vetter 已提交
1654
		}
1655
	} while (1);
1656
	kunmap_atomic(vaddr);
D
Daniel Vetter 已提交
1657 1658
}

1659
static int gen6_alloc_va_range(struct i915_address_space *vm,
1660
			       u64 start, u64 length)
1661
{
1662
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1663
	struct i915_page_table *pt;
1664 1665 1666
	u64 from = start;
	unsigned int pde;
	bool flush = false;
1667

1668
	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde) {
1669 1670 1671 1672
		if (pt == vm->scratch_pt) {
			pt = alloc_pt(vm);
			if (IS_ERR(pt))
				goto unwind_out;
1673

1674 1675 1676 1677
			gen6_initialize_pt(vm, pt);
			ppgtt->pd.page_table[pde] = pt;
			gen6_write_pde(ppgtt, pde, pt);
			flush = true;
1678 1679 1680
		}
	}

1681 1682 1683
	if (flush) {
		mark_tlbs_dirty(ppgtt);
		wmb();
1684 1685 1686
	}

	return 0;
1687 1688

unwind_out:
1689 1690
	gen6_ppgtt_clear_range(vm, from, start);
	return -ENOMEM;
1691 1692
}

1693 1694
static int gen6_init_scratch(struct i915_address_space *vm)
{
1695
	int ret;
1696

1697
	ret = setup_scratch_page(vm, I915_GFP_DMA);
1698 1699
	if (ret)
		return ret;
1700

1701
	vm->scratch_pt = alloc_pt(vm);
1702
	if (IS_ERR(vm->scratch_pt)) {
1703
		cleanup_scratch_page(vm);
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713
		return PTR_ERR(vm->scratch_pt);
	}

	gen6_initialize_pt(vm, vm->scratch_pt);

	return 0;
}

static void gen6_free_scratch(struct i915_address_space *vm)
{
1714 1715
	free_pt(vm, vm->scratch_pt);
	cleanup_scratch_page(vm);
1716 1717
}

1718
static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
1719
{
1720
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1721
	struct i915_page_directory *pd = &ppgtt->pd;
1722
	struct i915_page_table *pt;
1723
	u32 pde;
1724

1725 1726
	drm_mm_remove_node(&ppgtt->node);

1727
	gen6_for_all_pdes(pt, pd, pde)
1728
		if (pt != vm->scratch_pt)
1729
			free_pt(vm, pt);
1730

1731
	gen6_free_scratch(vm);
1732 1733
}

1734
static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
1735
{
1736
	struct i915_address_space *vm = &ppgtt->base;
1737
	struct drm_i915_private *dev_priv = ppgtt->base.i915;
1738
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
1739
	int ret;
1740

B
Ben Widawsky 已提交
1741 1742 1743 1744
	/* PPGTT PDEs reside in the GGTT and consists of 512 entries. The
	 * allocator works in address space sizes, so it's multiplied by page
	 * size. We allocate at the top of the GTT to avoid fragmentation.
	 */
1745
	BUG_ON(!drm_mm_initialized(&ggtt->base.mm));
1746

1747 1748 1749
	ret = gen6_init_scratch(vm);
	if (ret)
		return ret;
1750

1751 1752 1753 1754 1755
	ret = i915_gem_gtt_insert(&ggtt->base, &ppgtt->node,
				  GEN6_PD_SIZE, GEN6_PD_ALIGN,
				  I915_COLOR_UNEVICTABLE,
				  0, ggtt->base.total,
				  PIN_HIGH);
1756
	if (ret)
1757 1758
		goto err_out;

1759
	if (ppgtt->node.start < ggtt->mappable_end)
B
Ben Widawsky 已提交
1760
		DRM_DEBUG("Forced to use aperture for PDEs\n");
1761

1762 1763 1764 1765 1766 1767
	ppgtt->pd.base.ggtt_offset =
		ppgtt->node.start / PAGE_SIZE * sizeof(gen6_pte_t);

	ppgtt->pd_addr = (gen6_pte_t __iomem *)ggtt->gsm +
		ppgtt->pd.base.ggtt_offset / sizeof(gen6_pte_t);

1768
	return 0;
1769 1770

err_out:
1771
	gen6_free_scratch(vm);
1772
	return ret;
1773 1774 1775 1776
}

static int gen6_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt)
{
1777
	return gen6_ppgtt_allocate_page_directories(ppgtt);
1778
}
1779

1780
static void gen6_scratch_va_range(struct i915_hw_ppgtt *ppgtt,
1781
				  u64 start, u64 length)
1782
{
1783
	struct i915_page_table *unused;
1784
	u32 pde;
1785

1786
	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde)
1787
		ppgtt->pd.page_table[pde] = ppgtt->base.scratch_pt;
1788 1789
}

1790
static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
1791
{
1792
	struct drm_i915_private *dev_priv = ppgtt->base.i915;
1793
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
1794 1795
	int ret;

1796
	ppgtt->base.pte_encode = ggtt->base.pte_encode;
1797
	if (intel_vgpu_active(dev_priv) || IS_GEN6(dev_priv))
1798
		ppgtt->switch_mm = gen6_mm_switch;
1799
	else if (IS_HASWELL(dev_priv))
1800
		ppgtt->switch_mm = hsw_mm_switch;
1801
	else if (IS_GEN7(dev_priv))
1802
		ppgtt->switch_mm = gen7_mm_switch;
1803
	else
1804 1805 1806 1807 1808 1809
		BUG();

	ret = gen6_ppgtt_alloc(ppgtt);
	if (ret)
		return ret;

1810
	ppgtt->base.total = I915_PDES * GEN6_PTES * PAGE_SIZE;
1811

1812
	gen6_scratch_va_range(ppgtt, 0, ppgtt->base.total);
C
Chris Wilson 已提交
1813
	gen6_write_page_range(ppgtt, 0, ppgtt->base.total);
1814

1815 1816 1817 1818 1819 1820
	ret = gen6_alloc_va_range(&ppgtt->base, 0, ppgtt->base.total);
	if (ret) {
		gen6_ppgtt_cleanup(&ppgtt->base);
		return ret;
	}

1821 1822 1823 1824 1825 1826 1827
	ppgtt->base.clear_range = gen6_ppgtt_clear_range;
	ppgtt->base.insert_entries = gen6_ppgtt_insert_entries;
	ppgtt->base.unbind_vma = ppgtt_unbind_vma;
	ppgtt->base.bind_vma = ppgtt_bind_vma;
	ppgtt->base.cleanup = gen6_ppgtt_cleanup;
	ppgtt->debug_dump = gen6_dump_ppgtt;

1828
	DRM_DEBUG_DRIVER("Allocated pde space (%lldM) at GTT entry: %llx\n",
1829 1830
			 ppgtt->node.size >> 20,
			 ppgtt->node.start / PAGE_SIZE);
1831

1832 1833
	DRM_DEBUG_DRIVER("Adding PPGTT at offset %x\n",
			 ppgtt->pd.base.ggtt_offset << 10);
1834

1835
	return 0;
1836 1837
}

1838 1839
static int __hw_ppgtt_init(struct i915_hw_ppgtt *ppgtt,
			   struct drm_i915_private *dev_priv)
1840
{
1841
	ppgtt->base.i915 = dev_priv;
1842
	ppgtt->base.dma = &dev_priv->drm.pdev->dev;
1843

1844
	if (INTEL_INFO(dev_priv)->gen < 8)
1845
		return gen6_ppgtt_init(ppgtt);
B
Ben Widawsky 已提交
1846
	else
1847
		return gen8_ppgtt_init(ppgtt);
1848
}
1849

1850
static void i915_address_space_init(struct i915_address_space *vm,
C
Chris Wilson 已提交
1851 1852
				    struct drm_i915_private *dev_priv,
				    const char *name)
1853
{
C
Chris Wilson 已提交
1854
	i915_gem_timeline_init(dev_priv, &vm->timeline, name);
1855

1856
	drm_mm_init(&vm->mm, 0, vm->total);
1857 1858
	vm->mm.head_node.color = I915_COLOR_UNEVICTABLE;

1859 1860
	INIT_LIST_HEAD(&vm->active_list);
	INIT_LIST_HEAD(&vm->inactive_list);
1861
	INIT_LIST_HEAD(&vm->unbound_list);
1862

1863
	list_add_tail(&vm->global_link, &dev_priv->vm_list);
1864
	pagevec_init(&vm->free_pages, false);
1865 1866
}

1867 1868
static void i915_address_space_fini(struct i915_address_space *vm)
{
1869 1870 1871
	if (pagevec_count(&vm->free_pages))
		vm_free_pages_release(vm);

1872 1873 1874 1875 1876
	i915_gem_timeline_fini(&vm->timeline);
	drm_mm_takedown(&vm->mm);
	list_del(&vm->global_link);
}

1877
static void gtt_write_workarounds(struct drm_i915_private *dev_priv)
1878 1879 1880 1881 1882
{
	/* This function is for gtt related workarounds. This function is
	 * called on driver load and after a GPU reset, so you can place
	 * workarounds here even if they get overwritten by GPU reset.
	 */
1883
	/* WaIncreaseDefaultTLBEntries:chv,bdw,skl,bxt,kbl,glk,cfl */
1884
	if (IS_BROADWELL(dev_priv))
1885
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_BDW);
1886
	else if (IS_CHERRYVIEW(dev_priv))
1887
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_CHV);
1888
	else if (IS_GEN9_BC(dev_priv))
1889
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN9_L3_LRA_1_GPGPU_DEFAULT_VALUE_SKL);
1890
	else if (IS_GEN9_LP(dev_priv))
1891 1892 1893
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN9_L3_LRA_1_GPGPU_DEFAULT_VALUE_BXT);
}

1894
int i915_ppgtt_init_hw(struct drm_i915_private *dev_priv)
1895
{
1896
	gtt_write_workarounds(dev_priv);
1897

1898 1899 1900 1901 1902 1903
	/* In the case of execlists, PPGTT is enabled by the context descriptor
	 * and the PDPs are contained within the context itself.  We don't
	 * need to do anything here. */
	if (i915.enable_execlists)
		return 0;

1904
	if (!USES_PPGTT(dev_priv))
1905 1906
		return 0;

1907
	if (IS_GEN6(dev_priv))
1908
		gen6_ppgtt_enable(dev_priv);
1909
	else if (IS_GEN7(dev_priv))
1910 1911 1912
		gen7_ppgtt_enable(dev_priv);
	else if (INTEL_GEN(dev_priv) >= 8)
		gen8_ppgtt_enable(dev_priv);
1913
	else
1914
		MISSING_CASE(INTEL_GEN(dev_priv));
1915

1916 1917
	return 0;
}
1918

1919
struct i915_hw_ppgtt *
1920
i915_ppgtt_create(struct drm_i915_private *dev_priv,
C
Chris Wilson 已提交
1921 1922
		  struct drm_i915_file_private *fpriv,
		  const char *name)
1923 1924 1925 1926 1927 1928 1929 1930
{
	struct i915_hw_ppgtt *ppgtt;
	int ret;

	ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
	if (!ppgtt)
		return ERR_PTR(-ENOMEM);

1931
	ret = __hw_ppgtt_init(ppgtt, dev_priv);
1932 1933 1934 1935 1936
	if (ret) {
		kfree(ppgtt);
		return ERR_PTR(ret);
	}

1937 1938 1939 1940
	kref_init(&ppgtt->ref);
	i915_address_space_init(&ppgtt->base, dev_priv, name);
	ppgtt->base.file = fpriv;

1941 1942
	trace_i915_ppgtt_create(&ppgtt->base);

1943 1944 1945
	return ppgtt;
}

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966
void i915_ppgtt_close(struct i915_address_space *vm)
{
	struct list_head *phases[] = {
		&vm->active_list,
		&vm->inactive_list,
		&vm->unbound_list,
		NULL,
	}, **phase;

	GEM_BUG_ON(vm->closed);
	vm->closed = true;

	for (phase = phases; *phase; phase++) {
		struct i915_vma *vma, *vn;

		list_for_each_entry_safe(vma, vn, *phase, vm_link)
			if (!i915_vma_is_closed(vma))
				i915_vma_close(vma);
	}
}

1967
void i915_ppgtt_release(struct kref *kref)
1968 1969 1970 1971
{
	struct i915_hw_ppgtt *ppgtt =
		container_of(kref, struct i915_hw_ppgtt, ref);

1972 1973
	trace_i915_ppgtt_release(&ppgtt->base);

1974
	/* vmas should already be unbound and destroyed */
1975 1976
	WARN_ON(!list_empty(&ppgtt->base.active_list));
	WARN_ON(!list_empty(&ppgtt->base.inactive_list));
1977
	WARN_ON(!list_empty(&ppgtt->base.unbound_list));
1978 1979

	ppgtt->base.cleanup(&ppgtt->base);
1980
	i915_address_space_fini(&ppgtt->base);
1981 1982
	kfree(ppgtt);
}
1983

1984 1985 1986
/* Certain Gen5 chipsets require require idling the GPU before
 * unmapping anything from the GTT when VT-d is enabled.
 */
1987
static bool needs_idle_maps(struct drm_i915_private *dev_priv)
1988 1989 1990 1991
{
	/* Query intel_iommu to see if we need the workaround. Presumably that
	 * was loaded first.
	 */
1992
	return IS_GEN5(dev_priv) && IS_MOBILE(dev_priv) && intel_vtd_active();
1993 1994
}

1995
void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
1996
{
1997
	struct intel_engine_cs *engine;
1998
	enum intel_engine_id id;
1999

2000
	if (INTEL_INFO(dev_priv)->gen < 6)
2001 2002
		return;

2003
	for_each_engine(engine, dev_priv, id) {
2004
		u32 fault_reg;
2005
		fault_reg = I915_READ(RING_FAULT_REG(engine));
2006 2007
		if (fault_reg & RING_FAULT_VALID) {
			DRM_DEBUG_DRIVER("Unexpected fault\n"
2008
					 "\tAddr: 0x%08lx\n"
2009 2010 2011 2012 2013 2014 2015
					 "\tAddress space: %s\n"
					 "\tSource ID: %d\n"
					 "\tType: %d\n",
					 fault_reg & PAGE_MASK,
					 fault_reg & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",
					 RING_FAULT_SRCID(fault_reg),
					 RING_FAULT_FAULT_TYPE(fault_reg));
2016
			I915_WRITE(RING_FAULT_REG(engine),
2017 2018 2019
				   fault_reg & ~RING_FAULT_VALID);
		}
	}
2020 2021 2022 2023

	/* Engine specific init may not have been done till this point. */
	if (dev_priv->engine[RCS])
		POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
2024 2025
}

2026
void i915_gem_suspend_gtt_mappings(struct drm_i915_private *dev_priv)
2027
{
2028
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2029 2030 2031 2032

	/* Don't bother messing with faults pre GEN6 as we have little
	 * documentation supporting that it's a good idea.
	 */
2033
	if (INTEL_GEN(dev_priv) < 6)
2034 2035
		return;

2036
	i915_check_and_clear_faults(dev_priv);
2037

2038
	ggtt->base.clear_range(&ggtt->base, 0, ggtt->base.total);
2039

2040
	i915_ggtt_invalidate(dev_priv);
2041 2042
}

2043 2044
int i915_gem_gtt_prepare_pages(struct drm_i915_gem_object *obj,
			       struct sg_table *pages)
2045
{
2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063
	do {
		if (dma_map_sg(&obj->base.dev->pdev->dev,
			       pages->sgl, pages->nents,
			       PCI_DMA_BIDIRECTIONAL))
			return 0;

		/* If the DMA remap fails, one cause can be that we have
		 * too many objects pinned in a small remapping table,
		 * such as swiotlb. Incrementally purge all other objects and
		 * try again - if there are no more pages to remove from
		 * the DMA remapper, i915_gem_shrink will return 0.
		 */
		GEM_BUG_ON(obj->mm.pages == pages);
	} while (i915_gem_shrink(to_i915(obj->base.dev),
				 obj->base.size >> PAGE_SHIFT,
				 I915_SHRINK_BOUND |
				 I915_SHRINK_UNBOUND |
				 I915_SHRINK_ACTIVE));
2064

2065
	return -ENOSPC;
2066 2067
}

2068
static void gen8_set_pte(void __iomem *addr, gen8_pte_t pte)
B
Ben Widawsky 已提交
2069 2070 2071 2072
{
	writeq(pte, addr);
}

2073 2074
static void gen8_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
2075
				  u64 offset,
2076 2077 2078
				  enum i915_cache_level level,
				  u32 unused)
{
2079
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2080
	gen8_pte_t __iomem *pte =
2081
		(gen8_pte_t __iomem *)ggtt->gsm + (offset >> PAGE_SHIFT);
2082

2083
	gen8_set_pte(pte, gen8_pte_encode(addr, level));
2084

2085
	ggtt->invalidate(vm->i915);
2086 2087
}

B
Ben Widawsky 已提交
2088
static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
2089
				     struct i915_vma *vma,
2090 2091
				     enum i915_cache_level level,
				     u32 unused)
B
Ben Widawsky 已提交
2092
{
2093
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2094 2095
	struct sgt_iter sgt_iter;
	gen8_pte_t __iomem *gtt_entries;
2096
	const gen8_pte_t pte_encode = gen8_pte_encode(0, level);
2097
	dma_addr_t addr;
2098

2099
	gtt_entries = (gen8_pte_t __iomem *)ggtt->gsm;
2100 2101
	gtt_entries += vma->node.start >> PAGE_SHIFT;
	for_each_sgt_dma(addr, sgt_iter, vma->pages)
2102
		gen8_set_pte(gtt_entries++, pte_encode | addr);
2103

2104
	wmb();
B
Ben Widawsky 已提交
2105 2106 2107 2108 2109

	/* This next bit makes the above posting read even more important. We
	 * want to flush the TLBs only after we're certain all the PTE updates
	 * have finished.
	 */
2110
	ggtt->invalidate(vm->i915);
B
Ben Widawsky 已提交
2111 2112
}

2113 2114
static void gen6_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
2115
				  u64 offset,
2116 2117 2118
				  enum i915_cache_level level,
				  u32 flags)
{
2119
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2120
	gen6_pte_t __iomem *pte =
2121
		(gen6_pte_t __iomem *)ggtt->gsm + (offset >> PAGE_SHIFT);
2122

2123
	iowrite32(vm->pte_encode(addr, level, flags), pte);
2124

2125
	ggtt->invalidate(vm->i915);
2126 2127
}

2128 2129 2130 2131 2132 2133
/*
 * Binds an object into the global gtt with the specified cache level. The object
 * will be accessible to the GPU via commands whose operands reference offsets
 * within the global GTT as well as accessible by the GPU through the GMADR
 * mapped BAR (dev_priv->mm.gtt->gtt).
 */
2134
static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
2135
				     struct i915_vma *vma,
2136 2137
				     enum i915_cache_level level,
				     u32 flags)
2138
{
2139
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2140
	gen6_pte_t __iomem *entries = (gen6_pte_t __iomem *)ggtt->gsm;
2141
	unsigned int i = vma->node.start >> PAGE_SHIFT;
2142
	struct sgt_iter iter;
2143
	dma_addr_t addr;
2144
	for_each_sgt_dma(addr, iter, vma->pages)
2145 2146
		iowrite32(vm->pte_encode(addr, level, flags), &entries[i++]);
	wmb();
2147 2148 2149 2150 2151

	/* This next bit makes the above posting read even more important. We
	 * want to flush the TLBs only after we're certain all the PTE updates
	 * have finished.
	 */
2152
	ggtt->invalidate(vm->i915);
2153 2154
}

2155
static void nop_clear_range(struct i915_address_space *vm,
2156
			    u64 start, u64 length)
2157 2158 2159
{
}

B
Ben Widawsky 已提交
2160
static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2161
				  u64 start, u64 length)
B
Ben Widawsky 已提交
2162
{
2163
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2164 2165
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
2166 2167 2168
	const gen8_pte_t scratch_pte =
		gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC);
	gen8_pte_t __iomem *gtt_base =
2169 2170
		(gen8_pte_t __iomem *)ggtt->gsm + first_entry;
	const int max_entries = ggtt_total_entries(ggtt) - first_entry;
B
Ben Widawsky 已提交
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181
	int i;

	if (WARN(num_entries > max_entries,
		 "First entry = %d; Num entries = %d (max=%d)\n",
		 first_entry, num_entries, max_entries))
		num_entries = max_entries;

	for (i = 0; i < num_entries; i++)
		gen8_set_pte(&gtt_base[i], scratch_pte);
}

2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225
static void bxt_vtd_ggtt_wa(struct i915_address_space *vm)
{
	struct drm_i915_private *dev_priv = vm->i915;

	/*
	 * Make sure the internal GAM fifo has been cleared of all GTT
	 * writes before exiting stop_machine(). This guarantees that
	 * any aperture accesses waiting to start in another process
	 * cannot back up behind the GTT writes causing a hang.
	 * The register can be any arbitrary GAM register.
	 */
	POSTING_READ(GFX_FLSH_CNTL_GEN6);
}

struct insert_page {
	struct i915_address_space *vm;
	dma_addr_t addr;
	u64 offset;
	enum i915_cache_level level;
};

static int bxt_vtd_ggtt_insert_page__cb(void *_arg)
{
	struct insert_page *arg = _arg;

	gen8_ggtt_insert_page(arg->vm, arg->addr, arg->offset, arg->level, 0);
	bxt_vtd_ggtt_wa(arg->vm);

	return 0;
}

static void bxt_vtd_ggtt_insert_page__BKL(struct i915_address_space *vm,
					  dma_addr_t addr,
					  u64 offset,
					  enum i915_cache_level level,
					  u32 unused)
{
	struct insert_page arg = { vm, addr, offset, level };

	stop_machine(bxt_vtd_ggtt_insert_page__cb, &arg, NULL);
}

struct insert_entries {
	struct i915_address_space *vm;
2226
	struct i915_vma *vma;
2227 2228 2229 2230 2231 2232 2233
	enum i915_cache_level level;
};

static int bxt_vtd_ggtt_insert_entries__cb(void *_arg)
{
	struct insert_entries *arg = _arg;

2234
	gen8_ggtt_insert_entries(arg->vm, arg->vma, arg->level, 0);
2235 2236 2237 2238 2239 2240
	bxt_vtd_ggtt_wa(arg->vm);

	return 0;
}

static void bxt_vtd_ggtt_insert_entries__BKL(struct i915_address_space *vm,
2241
					     struct i915_vma *vma,
2242 2243 2244
					     enum i915_cache_level level,
					     u32 unused)
{
2245
	struct insert_entries arg = { vma->vm, vma, level };
2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274

	stop_machine(bxt_vtd_ggtt_insert_entries__cb, &arg, NULL);
}

struct clear_range {
	struct i915_address_space *vm;
	u64 start;
	u64 length;
};

static int bxt_vtd_ggtt_clear_range__cb(void *_arg)
{
	struct clear_range *arg = _arg;

	gen8_ggtt_clear_range(arg->vm, arg->start, arg->length);
	bxt_vtd_ggtt_wa(arg->vm);

	return 0;
}

static void bxt_vtd_ggtt_clear_range__BKL(struct i915_address_space *vm,
					  u64 start,
					  u64 length)
{
	struct clear_range arg = { vm, start, length };

	stop_machine(bxt_vtd_ggtt_clear_range__cb, &arg, NULL);
}

2275
static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2276
				  u64 start, u64 length)
2277
{
2278
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2279 2280
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
2281
	gen6_pte_t scratch_pte, __iomem *gtt_base =
2282 2283
		(gen6_pte_t __iomem *)ggtt->gsm + first_entry;
	const int max_entries = ggtt_total_entries(ggtt) - first_entry;
2284 2285 2286 2287 2288 2289 2290
	int i;

	if (WARN(num_entries > max_entries,
		 "First entry = %d; Num entries = %d (max=%d)\n",
		 first_entry, num_entries, max_entries))
		num_entries = max_entries;

2291
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
2292
				     I915_CACHE_LLC, 0);
2293

2294 2295 2296 2297
	for (i = 0; i < num_entries; i++)
		iowrite32(scratch_pte, &gtt_base[i]);
}

2298 2299
static void i915_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
2300
				  u64 offset,
2301 2302 2303 2304 2305 2306 2307 2308 2309
				  enum i915_cache_level cache_level,
				  u32 unused)
{
	unsigned int flags = (cache_level == I915_CACHE_NONE) ?
		AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY;

	intel_gtt_insert_page(addr, offset >> PAGE_SHIFT, flags);
}

2310
static void i915_ggtt_insert_entries(struct i915_address_space *vm,
2311
				     struct i915_vma *vma,
2312 2313
				     enum i915_cache_level cache_level,
				     u32 unused)
2314 2315 2316 2317
{
	unsigned int flags = (cache_level == I915_CACHE_NONE) ?
		AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY;

2318 2319
	intel_gtt_insert_sg_entries(vma->pages, vma->node.start >> PAGE_SHIFT,
				    flags);
2320 2321
}

2322
static void i915_ggtt_clear_range(struct i915_address_space *vm,
2323
				  u64 start, u64 length)
2324
{
2325
	intel_gtt_clear_range(start >> PAGE_SHIFT, length >> PAGE_SHIFT);
2326 2327
}

2328 2329 2330
static int ggtt_bind_vma(struct i915_vma *vma,
			 enum i915_cache_level cache_level,
			 u32 flags)
2331
{
2332
	struct drm_i915_private *i915 = vma->vm->i915;
2333
	struct drm_i915_gem_object *obj = vma->obj;
2334
	u32 pte_flags;
2335

2336 2337 2338 2339 2340
	if (unlikely(!vma->pages)) {
		int ret = i915_get_ggtt_vma_pages(vma);
		if (ret)
			return ret;
	}
2341 2342

	/* Currently applicable only to VLV */
2343
	pte_flags = 0;
2344 2345 2346
	if (obj->gt_ro)
		pte_flags |= PTE_READ_ONLY;

2347
	intel_runtime_pm_get(i915);
2348
	vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
2349
	intel_runtime_pm_put(i915);
2350 2351 2352 2353 2354 2355

	/*
	 * Without aliasing PPGTT there's no difference between
	 * GLOBAL/LOCAL_BIND, it's all the same ptes. Hence unconditionally
	 * upgrade to both bound if we bind either to avoid double-binding.
	 */
2356
	vma->flags |= I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
2357 2358 2359 2360

	return 0;
}

2361 2362 2363 2364 2365 2366 2367 2368 2369
static void ggtt_unbind_vma(struct i915_vma *vma)
{
	struct drm_i915_private *i915 = vma->vm->i915;

	intel_runtime_pm_get(i915);
	vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
	intel_runtime_pm_put(i915);
}

2370 2371 2372
static int aliasing_gtt_bind_vma(struct i915_vma *vma,
				 enum i915_cache_level cache_level,
				 u32 flags)
2373
{
2374
	struct drm_i915_private *i915 = vma->vm->i915;
2375
	u32 pte_flags;
2376
	int ret;
2377

2378
	if (unlikely(!vma->pages)) {
2379
		ret = i915_get_ggtt_vma_pages(vma);
2380 2381 2382
		if (ret)
			return ret;
	}
2383

2384
	/* Currently applicable only to VLV */
2385 2386
	pte_flags = 0;
	if (vma->obj->gt_ro)
2387
		pte_flags |= PTE_READ_ONLY;
2388

2389 2390 2391
	if (flags & I915_VMA_LOCAL_BIND) {
		struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;

2392 2393
		if (!(vma->flags & I915_VMA_LOCAL_BIND) &&
		    appgtt->base.allocate_va_range) {
2394 2395
			ret = appgtt->base.allocate_va_range(&appgtt->base,
							     vma->node.start,
2396
							     vma->size);
2397
			if (ret)
2398
				goto err_pages;
2399 2400
		}

2401 2402
		appgtt->base.insert_entries(&appgtt->base, vma, cache_level,
					    pte_flags);
2403 2404
	}

2405
	if (flags & I915_VMA_GLOBAL_BIND) {
2406
		intel_runtime_pm_get(i915);
2407
		vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
2408
		intel_runtime_pm_put(i915);
2409
	}
2410

2411
	return 0;
2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422

err_pages:
	if (!(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND))) {
		if (vma->pages != vma->obj->mm.pages) {
			GEM_BUG_ON(!vma->pages);
			sg_free_table(vma->pages);
			kfree(vma->pages);
		}
		vma->pages = NULL;
	}
	return ret;
2423 2424
}

2425
static void aliasing_gtt_unbind_vma(struct i915_vma *vma)
2426
{
2427
	struct drm_i915_private *i915 = vma->vm->i915;
2428

2429 2430
	if (vma->flags & I915_VMA_GLOBAL_BIND) {
		intel_runtime_pm_get(i915);
2431
		vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
2432 2433
		intel_runtime_pm_put(i915);
	}
2434

2435 2436 2437 2438 2439
	if (vma->flags & I915_VMA_LOCAL_BIND) {
		struct i915_address_space *vm = &i915->mm.aliasing_ppgtt->base;

		vm->clear_range(vm, vma->node.start, vma->size);
	}
2440 2441
}

2442 2443
void i915_gem_gtt_finish_pages(struct drm_i915_gem_object *obj,
			       struct sg_table *pages)
2444
{
D
David Weinehall 已提交
2445 2446
	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
	struct device *kdev = &dev_priv->drm.pdev->dev;
2447
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
B
Ben Widawsky 已提交
2448

2449
	if (unlikely(ggtt->do_idle_maps)) {
2450
		if (i915_gem_wait_for_idle(dev_priv, 0)) {
2451 2452 2453 2454 2455
			DRM_ERROR("Failed to wait for idle; VT'd may hang.\n");
			/* Wait a bit, in hopes it avoids the hang */
			udelay(10);
		}
	}
B
Ben Widawsky 已提交
2456

2457
	dma_unmap_sg(kdev, pages->sgl, pages->nents, PCI_DMA_BIDIRECTIONAL);
2458
}
2459

C
Chris Wilson 已提交
2460
static void i915_gtt_color_adjust(const struct drm_mm_node *node,
2461
				  unsigned long color,
2462 2463
				  u64 *start,
				  u64 *end)
2464
{
2465
	if (node->allocated && node->color != color)
2466
		*start += I915_GTT_PAGE_SIZE;
2467

2468 2469 2470 2471 2472
	/* Also leave a space between the unallocated reserved node after the
	 * GTT and any objects within the GTT, i.e. we use the color adjustment
	 * to insert a guard page to prevent prefetches crossing over the
	 * GTT boundary.
	 */
2473
	node = list_next_entry(node, node_list);
2474
	if (node->color != color)
2475
		*end -= I915_GTT_PAGE_SIZE;
2476
}
B
Ben Widawsky 已提交
2477

2478 2479 2480 2481 2482 2483
int i915_gem_init_aliasing_ppgtt(struct drm_i915_private *i915)
{
	struct i915_ggtt *ggtt = &i915->ggtt;
	struct i915_hw_ppgtt *ppgtt;
	int err;

2484
	ppgtt = i915_ppgtt_create(i915, ERR_PTR(-EPERM), "[alias]");
2485 2486
	if (IS_ERR(ppgtt))
		return PTR_ERR(ppgtt);
2487

2488 2489 2490 2491 2492
	if (WARN_ON(ppgtt->base.total < ggtt->base.total)) {
		err = -ENODEV;
		goto err_ppgtt;
	}

2493
	if (ppgtt->base.allocate_va_range) {
2494 2495 2496 2497 2498
		/* Note we only pre-allocate as far as the end of the global
		 * GTT. On 48b / 4-level page-tables, the difference is very,
		 * very significant! We have to preallocate as GVT/vgpu does
		 * not like the page directory disappearing.
		 */
2499
		err = ppgtt->base.allocate_va_range(&ppgtt->base,
2500
						    0, ggtt->base.total);
2501
		if (err)
2502
			goto err_ppgtt;
2503 2504 2505
	}

	i915->mm.aliasing_ppgtt = ppgtt;
2506

2507 2508 2509
	WARN_ON(ggtt->base.bind_vma != ggtt_bind_vma);
	ggtt->base.bind_vma = aliasing_gtt_bind_vma;

2510 2511 2512
	WARN_ON(ggtt->base.unbind_vma != ggtt_unbind_vma);
	ggtt->base.unbind_vma = aliasing_gtt_unbind_vma;

2513 2514 2515
	return 0;

err_ppgtt:
2516
	i915_ppgtt_put(ppgtt);
2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528
	return err;
}

void i915_gem_fini_aliasing_ppgtt(struct drm_i915_private *i915)
{
	struct i915_ggtt *ggtt = &i915->ggtt;
	struct i915_hw_ppgtt *ppgtt;

	ppgtt = fetch_and_zero(&i915->mm.aliasing_ppgtt);
	if (!ppgtt)
		return;

2529
	i915_ppgtt_put(ppgtt);
2530 2531

	ggtt->base.bind_vma = ggtt_bind_vma;
2532
	ggtt->base.unbind_vma = ggtt_unbind_vma;
2533 2534
}

2535
int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
2536
{
2537 2538 2539 2540 2541 2542 2543 2544 2545
	/* Let GEM Manage all of the aperture.
	 *
	 * However, leave one page at the end still bound to the scratch page.
	 * There are a number of places where the hardware apparently prefetches
	 * past the end of the object, and we've seen multiple hangs with the
	 * GPU head pointer stuck in a batchbuffer bound at the last page of the
	 * aperture.  One page should be enough to keep any prefetching inside
	 * of the aperture.
	 */
2546
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2547
	unsigned long hole_start, hole_end;
2548
	struct drm_mm_node *entry;
2549
	int ret;
2550

2551 2552 2553
	ret = intel_vgt_balloon(dev_priv);
	if (ret)
		return ret;
2554

2555
	/* Reserve a mappable slot for our lockless error capture */
2556 2557 2558 2559
	ret = drm_mm_insert_node_in_range(&ggtt->base.mm, &ggtt->error_capture,
					  PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
					  0, ggtt->mappable_end,
					  DRM_MM_INSERT_LOW);
2560 2561 2562
	if (ret)
		return ret;

2563
	/* Clear any non-preallocated blocks */
2564
	drm_mm_for_each_hole(entry, &ggtt->base.mm, hole_start, hole_end) {
2565 2566
		DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n",
			      hole_start, hole_end);
2567
		ggtt->base.clear_range(&ggtt->base, hole_start,
2568
				       hole_end - hole_start);
2569 2570 2571
	}

	/* And finally clear the reserved guard page */
2572
	ggtt->base.clear_range(&ggtt->base,
2573
			       ggtt->base.total - PAGE_SIZE, PAGE_SIZE);
2574

2575
	if (USES_PPGTT(dev_priv) && !USES_FULL_PPGTT(dev_priv)) {
2576
		ret = i915_gem_init_aliasing_ppgtt(dev_priv);
2577
		if (ret)
2578
			goto err;
2579 2580
	}

2581
	return 0;
2582 2583 2584 2585

err:
	drm_mm_remove_node(&ggtt->error_capture);
	return ret;
2586 2587
}

2588 2589
/**
 * i915_ggtt_cleanup_hw - Clean up GGTT hardware initialization
2590
 * @dev_priv: i915 device
2591
 */
2592
void i915_ggtt_cleanup_hw(struct drm_i915_private *dev_priv)
2593
{
2594
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2595 2596 2597 2598 2599 2600 2601 2602 2603
	struct i915_vma *vma, *vn;

	ggtt->base.closed = true;

	mutex_lock(&dev_priv->drm.struct_mutex);
	WARN_ON(!list_empty(&ggtt->base.active_list));
	list_for_each_entry_safe(vma, vn, &ggtt->base.inactive_list, vm_link)
		WARN_ON(i915_vma_unbind(vma));
	mutex_unlock(&dev_priv->drm.struct_mutex);
2604

2605
	i915_gem_cleanup_stolen(&dev_priv->drm);
2606

2607 2608 2609
	mutex_lock(&dev_priv->drm.struct_mutex);
	i915_gem_fini_aliasing_ppgtt(dev_priv);

2610 2611 2612
	if (drm_mm_node_allocated(&ggtt->error_capture))
		drm_mm_remove_node(&ggtt->error_capture);

2613
	if (drm_mm_initialized(&ggtt->base.mm)) {
2614
		intel_vgt_deballoon(dev_priv);
2615
		i915_address_space_fini(&ggtt->base);
2616 2617
	}

2618
	ggtt->base.cleanup(&ggtt->base);
2619
	mutex_unlock(&dev_priv->drm.struct_mutex);
2620 2621

	arch_phys_wc_del(ggtt->mtrr);
2622
	io_mapping_fini(&ggtt->mappable);
2623
}
2624

2625
static unsigned int gen6_get_total_gtt_size(u16 snb_gmch_ctl)
2626 2627 2628 2629 2630 2631
{
	snb_gmch_ctl >>= SNB_GMCH_GGMS_SHIFT;
	snb_gmch_ctl &= SNB_GMCH_GGMS_MASK;
	return snb_gmch_ctl << 20;
}

2632
static unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl)
2633 2634 2635 2636 2637
{
	bdw_gmch_ctl >>= BDW_GMCH_GGMS_SHIFT;
	bdw_gmch_ctl &= BDW_GMCH_GGMS_MASK;
	if (bdw_gmch_ctl)
		bdw_gmch_ctl = 1 << bdw_gmch_ctl;
2638 2639 2640 2641 2642 2643 2644

#ifdef CONFIG_X86_32
	/* Limit 32b platforms to a 2GB GGTT: 4 << 20 / pte size * PAGE_SIZE */
	if (bdw_gmch_ctl > 4)
		bdw_gmch_ctl = 4;
#endif

2645 2646 2647
	return bdw_gmch_ctl << 20;
}

2648
static unsigned int chv_get_total_gtt_size(u16 gmch_ctrl)
2649 2650 2651 2652 2653 2654 2655 2656 2657 2658
{
	gmch_ctrl >>= SNB_GMCH_GGMS_SHIFT;
	gmch_ctrl &= SNB_GMCH_GGMS_MASK;

	if (gmch_ctrl)
		return 1 << (20 + gmch_ctrl);

	return 0;
}

2659
static size_t gen6_get_stolen_size(u16 snb_gmch_ctl)
2660 2661 2662
{
	snb_gmch_ctl >>= SNB_GMCH_GMS_SHIFT;
	snb_gmch_ctl &= SNB_GMCH_GMS_MASK;
2663
	return (size_t)snb_gmch_ctl << 25; /* 32 MB units */
2664 2665
}

2666
static size_t gen8_get_stolen_size(u16 bdw_gmch_ctl)
2667 2668 2669
{
	bdw_gmch_ctl >>= BDW_GMCH_GMS_SHIFT;
	bdw_gmch_ctl &= BDW_GMCH_GMS_MASK;
2670
	return (size_t)bdw_gmch_ctl << 25; /* 32 MB units */
2671 2672
}

2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
static size_t chv_get_stolen_size(u16 gmch_ctrl)
{
	gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
	gmch_ctrl &= SNB_GMCH_GMS_MASK;

	/*
	 * 0x0  to 0x10: 32MB increments starting at 0MB
	 * 0x11 to 0x16: 4MB increments starting at 8MB
	 * 0x17 to 0x1d: 4MB increments start at 36MB
	 */
	if (gmch_ctrl < 0x11)
2684
		return (size_t)gmch_ctrl << 25;
2685
	else if (gmch_ctrl < 0x17)
2686
		return (size_t)(gmch_ctrl - 0x11 + 2) << 22;
2687
	else
2688
		return (size_t)(gmch_ctrl - 0x17 + 9) << 22;
2689 2690
}

2691 2692 2693 2694 2695 2696
static size_t gen9_get_stolen_size(u16 gen9_gmch_ctl)
{
	gen9_gmch_ctl >>= BDW_GMCH_GMS_SHIFT;
	gen9_gmch_ctl &= BDW_GMCH_GMS_MASK;

	if (gen9_gmch_ctl < 0xf0)
2697
		return (size_t)gen9_gmch_ctl << 25; /* 32 MB units */
2698 2699
	else
		/* 4MB increments starting at 0xf0 for 4MB */
2700
		return (size_t)(gen9_gmch_ctl - 0xf0 + 1) << 22;
2701 2702
}

2703
static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
B
Ben Widawsky 已提交
2704
{
2705 2706
	struct drm_i915_private *dev_priv = ggtt->base.i915;
	struct pci_dev *pdev = dev_priv->drm.pdev;
2707
	phys_addr_t phys_addr;
2708
	int ret;
B
Ben Widawsky 已提交
2709 2710

	/* For Modern GENs the PTEs and register space are split in the BAR */
2711
	phys_addr = pci_resource_start(pdev, 0) + pci_resource_len(pdev, 0) / 2;
B
Ben Widawsky 已提交
2712

I
Imre Deak 已提交
2713 2714 2715 2716 2717 2718 2719
	/*
	 * On BXT writes larger than 64 bit to the GTT pagetable range will be
	 * dropped. For WC mappings in general we have 64 byte burst writes
	 * when the WC buffer is flushed, so we can't use it, but have to
	 * resort to an uncached mapping. The WC issue is easily caught by the
	 * readback check when writing GTT PTE entries.
	 */
2720
	if (IS_GEN9_LP(dev_priv))
2721
		ggtt->gsm = ioremap_nocache(phys_addr, size);
I
Imre Deak 已提交
2722
	else
2723
		ggtt->gsm = ioremap_wc(phys_addr, size);
2724
	if (!ggtt->gsm) {
2725
		DRM_ERROR("Failed to map the ggtt page table\n");
B
Ben Widawsky 已提交
2726 2727 2728
		return -ENOMEM;
	}

2729
	ret = setup_scratch_page(&ggtt->base, GFP_DMA32);
2730
	if (ret) {
B
Ben Widawsky 已提交
2731 2732
		DRM_ERROR("Scratch setup failed\n");
		/* iounmap will also get called at remove, but meh */
2733
		iounmap(ggtt->gsm);
2734
		return ret;
B
Ben Widawsky 已提交
2735 2736
	}

2737
	return 0;
B
Ben Widawsky 已提交
2738 2739
}

B
Ben Widawsky 已提交
2740 2741 2742
/* The GGTT and PPGTT need a private PPAT setup in order to handle cacheability
 * bits. When using advanced contexts each context stores its own PAT, but
 * writing this data shouldn't be harmful even in those cases. */
2743
static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv)
B
Ben Widawsky 已提交
2744
{
2745
	u64 pat;
B
Ben Widawsky 已提交
2746 2747 2748 2749 2750 2751 2752 2753 2754 2755

	pat = GEN8_PPAT(0, GEN8_PPAT_WB | GEN8_PPAT_LLC)     | /* for normal objects, no eLLC */
	      GEN8_PPAT(1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC) | /* for something pointing to ptes? */
	      GEN8_PPAT(2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC) | /* for scanout with eLLC */
	      GEN8_PPAT(3, GEN8_PPAT_UC)                     | /* Uncached objects, mostly for scanout */
	      GEN8_PPAT(4, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0)) |
	      GEN8_PPAT(5, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1)) |
	      GEN8_PPAT(6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2)) |
	      GEN8_PPAT(7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));

2756
	if (!USES_PPGTT(dev_priv))
2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771
		/* Spec: "For GGTT, there is NO pat_sel[2:0] from the entry,
		 * so RTL will always use the value corresponding to
		 * pat_sel = 000".
		 * So let's disable cache for GGTT to avoid screen corruptions.
		 * MOCS still can be used though.
		 * - System agent ggtt writes (i.e. cpu gtt mmaps) already work
		 * before this patch, i.e. the same uncached + snooping access
		 * like on gen6/7 seems to be in effect.
		 * - So this just fixes blitter/render access. Again it looks
		 * like it's not just uncached access, but uncached + snooping.
		 * So we can still hold onto all our assumptions wrt cpu
		 * clflushing on LLC machines.
		 */
		pat = GEN8_PPAT(0, GEN8_PPAT_UC);

B
Ben Widawsky 已提交
2772 2773
	/* XXX: spec defines this as 2 distinct registers. It's unclear if a 64b
	 * write would work. */
2774 2775
	I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
	I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
B
Ben Widawsky 已提交
2776 2777
}

2778 2779
static void chv_setup_private_ppat(struct drm_i915_private *dev_priv)
{
2780
	u64 pat;
2781 2782 2783 2784 2785 2786 2787

	/*
	 * Map WB on BDW to snooped on CHV.
	 *
	 * Only the snoop bit has meaning for CHV, the rest is
	 * ignored.
	 *
2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798
	 * The hardware will never snoop for certain types of accesses:
	 * - CPU GTT (GMADR->GGTT->no snoop->memory)
	 * - PPGTT page tables
	 * - some other special cycles
	 *
	 * As with BDW, we also need to consider the following for GT accesses:
	 * "For GGTT, there is NO pat_sel[2:0] from the entry,
	 * so RTL will always use the value corresponding to
	 * pat_sel = 000".
	 * Which means we must set the snoop bit in PAT entry 0
	 * in order to keep the global status page working.
2799 2800 2801 2802 2803 2804 2805 2806 2807 2808
	 */
	pat = GEN8_PPAT(0, CHV_PPAT_SNOOP) |
	      GEN8_PPAT(1, 0) |
	      GEN8_PPAT(2, 0) |
	      GEN8_PPAT(3, 0) |
	      GEN8_PPAT(4, CHV_PPAT_SNOOP) |
	      GEN8_PPAT(5, CHV_PPAT_SNOOP) |
	      GEN8_PPAT(6, CHV_PPAT_SNOOP) |
	      GEN8_PPAT(7, CHV_PPAT_SNOOP);

2809 2810
	I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
	I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
2811 2812
}

2813 2814 2815 2816 2817
static void gen6_gmch_remove(struct i915_address_space *vm)
{
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);

	iounmap(ggtt->gsm);
2818
	cleanup_scratch_page(vm);
2819 2820
}

2821
static int gen8_gmch_probe(struct i915_ggtt *ggtt)
B
Ben Widawsky 已提交
2822
{
2823
	struct drm_i915_private *dev_priv = ggtt->base.i915;
2824
	struct pci_dev *pdev = dev_priv->drm.pdev;
2825
	unsigned int size;
B
Ben Widawsky 已提交
2826
	u16 snb_gmch_ctl;
2827
	int err;
B
Ben Widawsky 已提交
2828 2829

	/* TODO: We're not aware of mappable constraints on gen8 yet */
2830 2831
	ggtt->mappable_base = pci_resource_start(pdev, 2);
	ggtt->mappable_end = pci_resource_len(pdev, 2);
B
Ben Widawsky 已提交
2832

2833 2834 2835 2836 2837
	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(39));
	if (!err)
		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(39));
	if (err)
		DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err);
B
Ben Widawsky 已提交
2838

2839
	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
B
Ben Widawsky 已提交
2840

2841
	if (INTEL_GEN(dev_priv) >= 9) {
2842
		ggtt->stolen_size = gen9_get_stolen_size(snb_gmch_ctl);
2843
		size = gen8_get_total_gtt_size(snb_gmch_ctl);
2844
	} else if (IS_CHERRYVIEW(dev_priv)) {
2845
		ggtt->stolen_size = chv_get_stolen_size(snb_gmch_ctl);
2846
		size = chv_get_total_gtt_size(snb_gmch_ctl);
2847
	} else {
2848
		ggtt->stolen_size = gen8_get_stolen_size(snb_gmch_ctl);
2849
		size = gen8_get_total_gtt_size(snb_gmch_ctl);
2850
	}
B
Ben Widawsky 已提交
2851

2852
	ggtt->base.total = (size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
B
Ben Widawsky 已提交
2853

2854
	if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
2855 2856 2857
		chv_setup_private_ppat(dev_priv);
	else
		bdw_setup_private_ppat(dev_priv);
B
Ben Widawsky 已提交
2858

2859
	ggtt->base.cleanup = gen6_gmch_remove;
2860 2861
	ggtt->base.bind_vma = ggtt_bind_vma;
	ggtt->base.unbind_vma = ggtt_unbind_vma;
2862
	ggtt->base.insert_page = gen8_ggtt_insert_page;
2863
	ggtt->base.clear_range = nop_clear_range;
2864
	if (!USES_FULL_PPGTT(dev_priv) || intel_scanout_needs_vtd_wa(dev_priv))
2865 2866 2867 2868
		ggtt->base.clear_range = gen8_ggtt_clear_range;

	ggtt->base.insert_entries = gen8_ggtt_insert_entries;

2869 2870 2871 2872 2873 2874 2875 2876
	/* Serialize GTT updates with aperture access on BXT if VT-d is on. */
	if (intel_ggtt_update_needs_vtd_wa(dev_priv)) {
		ggtt->base.insert_entries = bxt_vtd_ggtt_insert_entries__BKL;
		ggtt->base.insert_page    = bxt_vtd_ggtt_insert_page__BKL;
		if (ggtt->base.clear_range != nop_clear_range)
			ggtt->base.clear_range = bxt_vtd_ggtt_clear_range__BKL;
	}

2877 2878
	ggtt->invalidate = gen6_ggtt_invalidate;

2879
	return ggtt_probe_common(ggtt, size);
B
Ben Widawsky 已提交
2880 2881
}

2882
static int gen6_gmch_probe(struct i915_ggtt *ggtt)
2883
{
2884
	struct drm_i915_private *dev_priv = ggtt->base.i915;
2885
	struct pci_dev *pdev = dev_priv->drm.pdev;
2886
	unsigned int size;
2887
	u16 snb_gmch_ctl;
2888
	int err;
2889

2890 2891
	ggtt->mappable_base = pci_resource_start(pdev, 2);
	ggtt->mappable_end = pci_resource_len(pdev, 2);
2892

2893 2894
	/* 64/512MB is the current min/max we actually know of, but this is just
	 * a coarse sanity check.
2895
	 */
2896
	if (ggtt->mappable_end < (64<<20) || ggtt->mappable_end > (512<<20)) {
2897
		DRM_ERROR("Unknown GMADR size (%llx)\n", ggtt->mappable_end);
2898
		return -ENXIO;
2899 2900
	}

2901 2902 2903 2904 2905
	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
	if (!err)
		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40));
	if (err)
		DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err);
2906
	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
2907

2908
	ggtt->stolen_size = gen6_get_stolen_size(snb_gmch_ctl);
2909

2910 2911
	size = gen6_get_total_gtt_size(snb_gmch_ctl);
	ggtt->base.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
2912

2913
	ggtt->base.clear_range = gen6_ggtt_clear_range;
2914
	ggtt->base.insert_page = gen6_ggtt_insert_page;
2915 2916 2917
	ggtt->base.insert_entries = gen6_ggtt_insert_entries;
	ggtt->base.bind_vma = ggtt_bind_vma;
	ggtt->base.unbind_vma = ggtt_unbind_vma;
2918 2919
	ggtt->base.cleanup = gen6_gmch_remove;

2920 2921
	ggtt->invalidate = gen6_ggtt_invalidate;

2922 2923 2924 2925 2926 2927 2928 2929 2930 2931
	if (HAS_EDRAM(dev_priv))
		ggtt->base.pte_encode = iris_pte_encode;
	else if (IS_HASWELL(dev_priv))
		ggtt->base.pte_encode = hsw_pte_encode;
	else if (IS_VALLEYVIEW(dev_priv))
		ggtt->base.pte_encode = byt_pte_encode;
	else if (INTEL_GEN(dev_priv) >= 7)
		ggtt->base.pte_encode = ivb_pte_encode;
	else
		ggtt->base.pte_encode = snb_pte_encode;
2932

2933
	return ggtt_probe_common(ggtt, size);
2934 2935
}

2936
static void i915_gmch_remove(struct i915_address_space *vm)
2937
{
2938
	intel_gmch_remove();
2939
}
2940

2941
static int i915_gmch_probe(struct i915_ggtt *ggtt)
2942
{
2943
	struct drm_i915_private *dev_priv = ggtt->base.i915;
2944 2945
	int ret;

2946
	ret = intel_gmch_probe(dev_priv->bridge_dev, dev_priv->drm.pdev, NULL);
2947 2948 2949 2950 2951
	if (!ret) {
		DRM_ERROR("failed to set up gmch\n");
		return -EIO;
	}

2952 2953 2954 2955
	intel_gtt_get(&ggtt->base.total,
		      &ggtt->stolen_size,
		      &ggtt->mappable_base,
		      &ggtt->mappable_end);
2956

2957
	ggtt->do_idle_maps = needs_idle_maps(dev_priv);
2958
	ggtt->base.insert_page = i915_ggtt_insert_page;
2959 2960 2961 2962
	ggtt->base.insert_entries = i915_ggtt_insert_entries;
	ggtt->base.clear_range = i915_ggtt_clear_range;
	ggtt->base.bind_vma = ggtt_bind_vma;
	ggtt->base.unbind_vma = ggtt_unbind_vma;
2963
	ggtt->base.cleanup = i915_gmch_remove;
2964

2965 2966
	ggtt->invalidate = gmch_ggtt_invalidate;

2967
	if (unlikely(ggtt->do_idle_maps))
2968 2969
		DRM_INFO("applying Ironlake quirks for intel_iommu\n");

2970 2971 2972
	return 0;
}

2973
/**
2974
 * i915_ggtt_probe_hw - Probe GGTT hardware location
2975
 * @dev_priv: i915 device
2976
 */
2977
int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv)
2978
{
2979
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2980 2981
	int ret;

2982
	ggtt->base.i915 = dev_priv;
2983
	ggtt->base.dma = &dev_priv->drm.pdev->dev;
2984

2985 2986 2987 2988 2989 2990
	if (INTEL_GEN(dev_priv) <= 5)
		ret = i915_gmch_probe(ggtt);
	else if (INTEL_GEN(dev_priv) < 8)
		ret = gen6_gmch_probe(ggtt);
	else
		ret = gen8_gmch_probe(ggtt);
2991
	if (ret)
2992 2993
		return ret;

2994 2995 2996 2997 2998 2999 3000 3001 3002 3003
	/* Trim the GGTT to fit the GuC mappable upper range (when enabled).
	 * This is easier than doing range restriction on the fly, as we
	 * currently don't have any bits spare to pass in this upper
	 * restriction!
	 */
	if (HAS_GUC(dev_priv) && i915.enable_guc_loading) {
		ggtt->base.total = min_t(u64, ggtt->base.total, GUC_GGTT_TOP);
		ggtt->mappable_end = min(ggtt->mappable_end, ggtt->base.total);
	}

3004 3005
	if ((ggtt->base.total - 1) >> 32) {
		DRM_ERROR("We never expected a Global GTT with more than 32bits"
3006
			  " of address space! Found %lldM!\n",
3007 3008 3009 3010 3011
			  ggtt->base.total >> 20);
		ggtt->base.total = 1ULL << 32;
		ggtt->mappable_end = min(ggtt->mappable_end, ggtt->base.total);
	}

3012 3013 3014 3015 3016 3017 3018
	if (ggtt->mappable_end > ggtt->base.total) {
		DRM_ERROR("mappable aperture extends past end of GGTT,"
			  " aperture=%llx, total=%llx\n",
			  ggtt->mappable_end, ggtt->base.total);
		ggtt->mappable_end = ggtt->base.total;
	}

3019
	/* GMADR is the PCI mmio aperture into the global GTT. */
3020
	DRM_INFO("Memory usable by graphics device = %lluM\n",
3021 3022
		 ggtt->base.total >> 20);
	DRM_DEBUG_DRIVER("GMADR size = %lldM\n", ggtt->mappable_end >> 20);
3023
	DRM_DEBUG_DRIVER("GTT stolen size = %uM\n", ggtt->stolen_size >> 20);
3024
	if (intel_vtd_active())
3025
		DRM_INFO("VT-d active for gfx access\n");
3026 3027

	return 0;
3028 3029 3030 3031
}

/**
 * i915_ggtt_init_hw - Initialize GGTT hardware
3032
 * @dev_priv: i915 device
3033
 */
3034
int i915_ggtt_init_hw(struct drm_i915_private *dev_priv)
3035 3036 3037 3038
{
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
	int ret;

3039 3040
	INIT_LIST_HEAD(&dev_priv->vm_list);

3041 3042 3043 3044
	/* Note that we use page colouring to enforce a guard page at the
	 * end of the address space. This is required as the CS may prefetch
	 * beyond the end of the batch buffer, across the page boundary,
	 * and beyond the end of the GTT if we do not provide a guard.
3045
	 */
C
Chris Wilson 已提交
3046 3047
	mutex_lock(&dev_priv->drm.struct_mutex);
	i915_address_space_init(&ggtt->base, dev_priv, "[global]");
3048
	if (!HAS_LLC(dev_priv) && !USES_PPGTT(dev_priv))
3049
		ggtt->base.mm.color_adjust = i915_gtt_color_adjust;
C
Chris Wilson 已提交
3050
	mutex_unlock(&dev_priv->drm.struct_mutex);
3051

3052 3053 3054
	if (!io_mapping_init_wc(&dev_priv->ggtt.mappable,
				dev_priv->ggtt.mappable_base,
				dev_priv->ggtt.mappable_end)) {
3055 3056 3057 3058 3059 3060
		ret = -EIO;
		goto out_gtt_cleanup;
	}

	ggtt->mtrr = arch_phys_wc_add(ggtt->mappable_base, ggtt->mappable_end);

3061 3062 3063 3064
	/*
	 * Initialise stolen early so that we may reserve preallocated
	 * objects for the BIOS to KMS transition.
	 */
3065
	ret = i915_gem_init_stolen(dev_priv);
3066 3067 3068 3069
	if (ret)
		goto out_gtt_cleanup;

	return 0;
3070 3071

out_gtt_cleanup:
3072
	ggtt->base.cleanup(&ggtt->base);
3073
	return ret;
3074
}
3075

3076
int i915_ggtt_enable_hw(struct drm_i915_private *dev_priv)
3077
{
3078
	if (INTEL_GEN(dev_priv) < 6 && !intel_enable_gtt())
3079 3080 3081 3082 3083
		return -EIO;

	return 0;
}

3084 3085
void i915_ggtt_enable_guc(struct drm_i915_private *i915)
{
3086 3087
	GEM_BUG_ON(i915->ggtt.invalidate != gen6_ggtt_invalidate);

3088 3089 3090 3091 3092
	i915->ggtt.invalidate = guc_ggtt_invalidate;
}

void i915_ggtt_disable_guc(struct drm_i915_private *i915)
{
3093 3094 3095 3096
	/* We should only be called after i915_ggtt_enable_guc() */
	GEM_BUG_ON(i915->ggtt.invalidate != guc_ggtt_invalidate);

	i915->ggtt.invalidate = gen6_ggtt_invalidate;
3097 3098
}

3099
void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
3100
{
3101
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
3102
	struct drm_i915_gem_object *obj, *on;
3103

3104
	i915_check_and_clear_faults(dev_priv);
3105 3106

	/* First fill our portion of the GTT with scratch pages */
3107
	ggtt->base.clear_range(&ggtt->base, 0, ggtt->base.total);
3108

3109 3110 3111 3112
	ggtt->base.closed = true; /* skip rewriting PTE on VMA unbind */

	/* clflush objects bound into the GGTT and rebind them. */
	list_for_each_entry_safe(obj, on,
3113
				 &dev_priv->mm.bound_list, global_link) {
3114 3115 3116
		bool ggtt_bound = false;
		struct i915_vma *vma;

3117
		list_for_each_entry(vma, &obj->vma_list, obj_link) {
3118
			if (vma->vm != &ggtt->base)
3119
				continue;
3120

3121 3122 3123
			if (!i915_vma_unbind(vma))
				continue;

3124 3125
			WARN_ON(i915_vma_bind(vma, obj->cache_level,
					      PIN_UPDATE));
3126
			ggtt_bound = true;
3127 3128
		}

3129
		if (ggtt_bound)
3130
			WARN_ON(i915_gem_object_set_to_gtt_domain(obj, false));
3131
	}
3132

3133 3134
	ggtt->base.closed = false;

3135
	if (INTEL_GEN(dev_priv) >= 8) {
3136
		if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
3137 3138 3139 3140 3141 3142 3143
			chv_setup_private_ppat(dev_priv);
		else
			bdw_setup_private_ppat(dev_priv);

		return;
	}

3144
	if (USES_PPGTT(dev_priv)) {
3145 3146
		struct i915_address_space *vm;

3147
		list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
3148
			struct i915_hw_ppgtt *ppgtt;
3149

3150
			if (i915_is_ggtt(vm))
3151
				ppgtt = dev_priv->mm.aliasing_ppgtt;
3152 3153
			else
				ppgtt = i915_vm_to_ppgtt(vm);
3154

C
Chris Wilson 已提交
3155
			gen6_write_page_range(ppgtt, 0, ppgtt->base.total);
3156 3157 3158
		}
	}

3159
	i915_ggtt_invalidate(dev_priv);
3160 3161
}

3162
static struct scatterlist *
3163
rotate_pages(const dma_addr_t *in, unsigned int offset,
3164
	     unsigned int width, unsigned int height,
3165
	     unsigned int stride,
3166
	     struct sg_table *st, struct scatterlist *sg)
3167 3168 3169 3170 3171
{
	unsigned int column, row;
	unsigned int src_idx;

	for (column = 0; column < width; column++) {
3172
		src_idx = stride * (height - 1) + column;
3173 3174 3175 3176 3177 3178 3179
		for (row = 0; row < height; row++) {
			st->nents++;
			/* We don't need the pages, but need to initialize
			 * the entries so the sg list can be happily traversed.
			 * The only thing we need are DMA addresses.
			 */
			sg_set_page(sg, NULL, PAGE_SIZE, 0);
3180
			sg_dma_address(sg) = in[offset + src_idx];
3181 3182
			sg_dma_len(sg) = PAGE_SIZE;
			sg = sg_next(sg);
3183
			src_idx -= stride;
3184 3185
		}
	}
3186 3187

	return sg;
3188 3189
}

3190 3191 3192
static noinline struct sg_table *
intel_rotate_pages(struct intel_rotation_info *rot_info,
		   struct drm_i915_gem_object *obj)
3193
{
3194
	const unsigned long n_pages = obj->base.size / PAGE_SIZE;
3195
	unsigned int size = intel_rotation_info_size(rot_info);
3196 3197
	struct sgt_iter sgt_iter;
	dma_addr_t dma_addr;
3198 3199 3200
	unsigned long i;
	dma_addr_t *page_addr_list;
	struct sg_table *st;
3201
	struct scatterlist *sg;
3202
	int ret = -ENOMEM;
3203 3204

	/* Allocate a temporary list of source pages for random access. */
M
Michal Hocko 已提交
3205
	page_addr_list = kvmalloc_array(n_pages,
3206 3207
					sizeof(dma_addr_t),
					GFP_TEMPORARY);
3208 3209 3210 3211 3212 3213 3214 3215
	if (!page_addr_list)
		return ERR_PTR(ret);

	/* Allocate target SG list. */
	st = kmalloc(sizeof(*st), GFP_KERNEL);
	if (!st)
		goto err_st_alloc;

3216
	ret = sg_alloc_table(st, size, GFP_KERNEL);
3217 3218 3219 3220 3221
	if (ret)
		goto err_sg_alloc;

	/* Populate source page list from the object. */
	i = 0;
C
Chris Wilson 已提交
3222
	for_each_sgt_dma(dma_addr, sgt_iter, obj->mm.pages)
3223
		page_addr_list[i++] = dma_addr;
3224

3225
	GEM_BUG_ON(i != n_pages);
3226 3227 3228
	st->nents = 0;
	sg = st->sgl;

3229 3230 3231 3232
	for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++) {
		sg = rotate_pages(page_addr_list, rot_info->plane[i].offset,
				  rot_info->plane[i].width, rot_info->plane[i].height,
				  rot_info->plane[i].stride, st, sg);
3233 3234
	}

3235 3236
	DRM_DEBUG_KMS("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages)\n",
		      obj->base.size, rot_info->plane[0].width, rot_info->plane[0].height, size);
3237

M
Michal Hocko 已提交
3238
	kvfree(page_addr_list);
3239 3240 3241 3242 3243 3244

	return st;

err_sg_alloc:
	kfree(st);
err_st_alloc:
M
Michal Hocko 已提交
3245
	kvfree(page_addr_list);
3246

3247 3248 3249
	DRM_DEBUG_KMS("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n",
		      obj->base.size, rot_info->plane[0].width, rot_info->plane[0].height, size);

3250 3251
	return ERR_PTR(ret);
}
3252

3253
static noinline struct sg_table *
3254 3255 3256 3257
intel_partial_pages(const struct i915_ggtt_view *view,
		    struct drm_i915_gem_object *obj)
{
	struct sg_table *st;
3258
	struct scatterlist *sg, *iter;
3259
	unsigned int count = view->partial.size;
3260
	unsigned int offset;
3261 3262 3263 3264 3265 3266
	int ret = -ENOMEM;

	st = kmalloc(sizeof(*st), GFP_KERNEL);
	if (!st)
		goto err_st_alloc;

3267
	ret = sg_alloc_table(st, count, GFP_KERNEL);
3268 3269 3270
	if (ret)
		goto err_sg_alloc;

3271
	iter = i915_gem_object_get_sg(obj, view->partial.offset, &offset);
3272 3273
	GEM_BUG_ON(!iter);

3274 3275
	sg = st->sgl;
	st->nents = 0;
3276 3277
	do {
		unsigned int len;
3278

3279 3280 3281 3282 3283 3284
		len = min(iter->length - (offset << PAGE_SHIFT),
			  count << PAGE_SHIFT);
		sg_set_page(sg, NULL, len, 0);
		sg_dma_address(sg) =
			sg_dma_address(iter) + (offset << PAGE_SHIFT);
		sg_dma_len(sg) = len;
3285 3286

		st->nents++;
3287 3288 3289 3290 3291
		count -= len >> PAGE_SHIFT;
		if (count == 0) {
			sg_mark_end(sg);
			return st;
		}
3292

3293 3294 3295 3296
		sg = __sg_next(sg);
		iter = __sg_next(iter);
		offset = 0;
	} while (1);
3297 3298 3299 3300 3301 3302 3303

err_sg_alloc:
	kfree(st);
err_st_alloc:
	return ERR_PTR(ret);
}

3304
static int
3305
i915_get_ggtt_vma_pages(struct i915_vma *vma)
3306
{
3307
	int ret;
3308

3309 3310 3311 3312 3313 3314 3315
	/* The vma->pages are only valid within the lifespan of the borrowed
	 * obj->mm.pages. When the obj->mm.pages sg_table is regenerated, so
	 * must be the vma->pages. A simple rule is that vma->pages must only
	 * be accessed when the obj->mm.pages are pinned.
	 */
	GEM_BUG_ON(!i915_gem_object_has_pinned_pages(vma->obj));

3316 3317 3318
	switch (vma->ggtt_view.type) {
	case I915_GGTT_VIEW_NORMAL:
		vma->pages = vma->obj->mm.pages;
3319 3320
		return 0;

3321
	case I915_GGTT_VIEW_ROTATED:
3322
		vma->pages =
3323 3324 3325 3326
			intel_rotate_pages(&vma->ggtt_view.rotated, vma->obj);
		break;

	case I915_GGTT_VIEW_PARTIAL:
3327
		vma->pages = intel_partial_pages(&vma->ggtt_view, vma->obj);
3328 3329 3330
		break;

	default:
3331 3332
		WARN_ONCE(1, "GGTT view %u not implemented!\n",
			  vma->ggtt_view.type);
3333 3334
		return -EINVAL;
	}
3335

3336 3337
	ret = 0;
	if (unlikely(IS_ERR(vma->pages))) {
3338 3339
		ret = PTR_ERR(vma->pages);
		vma->pages = NULL;
3340 3341
		DRM_ERROR("Failed to get pages for VMA view type %u (%d)!\n",
			  vma->ggtt_view.type, ret);
3342
	}
3343
	return ret;
3344 3345
}

3346 3347
/**
 * i915_gem_gtt_reserve - reserve a node in an address_space (GTT)
3348 3349 3350 3351 3352 3353 3354 3355 3356 3357
 * @vm: the &struct i915_address_space
 * @node: the &struct drm_mm_node (typically i915_vma.mode)
 * @size: how much space to allocate inside the GTT,
 *        must be #I915_GTT_PAGE_SIZE aligned
 * @offset: where to insert inside the GTT,
 *          must be #I915_GTT_MIN_ALIGNMENT aligned, and the node
 *          (@offset + @size) must fit within the address space
 * @color: color to apply to node, if this node is not from a VMA,
 *         color must be #I915_COLOR_UNEVICTABLE
 * @flags: control search and eviction behaviour
3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381
 *
 * i915_gem_gtt_reserve() tries to insert the @node at the exact @offset inside
 * the address space (using @size and @color). If the @node does not fit, it
 * tries to evict any overlapping nodes from the GTT, including any
 * neighbouring nodes if the colors do not match (to ensure guard pages between
 * differing domains). See i915_gem_evict_for_node() for the gory details
 * on the eviction algorithm. #PIN_NONBLOCK may used to prevent waiting on
 * evicting active overlapping objects, and any overlapping node that is pinned
 * or marked as unevictable will also result in failure.
 *
 * Returns: 0 on success, -ENOSPC if no suitable hole is found, -EINTR if
 * asked to wait for eviction and interrupted.
 */
int i915_gem_gtt_reserve(struct i915_address_space *vm,
			 struct drm_mm_node *node,
			 u64 size, u64 offset, unsigned long color,
			 unsigned int flags)
{
	int err;

	GEM_BUG_ON(!size);
	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
	GEM_BUG_ON(!IS_ALIGNED(offset, I915_GTT_MIN_ALIGNMENT));
	GEM_BUG_ON(range_overflows(offset, size, vm->total));
3382
	GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->base);
3383
	GEM_BUG_ON(drm_mm_node_allocated(node));
3384 3385 3386 3387 3388 3389 3390 3391 3392

	node->size = size;
	node->start = offset;
	node->color = color;

	err = drm_mm_reserve_node(&vm->mm, node);
	if (err != -ENOSPC)
		return err;

3393 3394 3395
	if (flags & PIN_NOEVICT)
		return -ENOSPC;

3396 3397 3398 3399 3400 3401 3402
	err = i915_gem_evict_for_node(vm, node, flags);
	if (err == 0)
		err = drm_mm_reserve_node(&vm->mm, node);

	return err;
}

3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427
static u64 random_offset(u64 start, u64 end, u64 len, u64 align)
{
	u64 range, addr;

	GEM_BUG_ON(range_overflows(start, len, end));
	GEM_BUG_ON(round_up(start, align) > round_down(end - len, align));

	range = round_down(end - len, align) - round_up(start, align);
	if (range) {
		if (sizeof(unsigned long) == sizeof(u64)) {
			addr = get_random_long();
		} else {
			addr = get_random_int();
			if (range > U32_MAX) {
				addr <<= 32;
				addr |= get_random_int();
			}
		}
		div64_u64_rem(addr, range, &addr);
		start += addr;
	}

	return round_up(start, align);
}

3428 3429
/**
 * i915_gem_gtt_insert - insert a node into an address_space (GTT)
3430 3431 3432 3433 3434 3435 3436 3437 3438
 * @vm: the &struct i915_address_space
 * @node: the &struct drm_mm_node (typically i915_vma.node)
 * @size: how much space to allocate inside the GTT,
 *        must be #I915_GTT_PAGE_SIZE aligned
 * @alignment: required alignment of starting offset, may be 0 but
 *             if specified, this must be a power-of-two and at least
 *             #I915_GTT_MIN_ALIGNMENT
 * @color: color to apply to node
 * @start: start of any range restriction inside GTT (0 for all),
3439
 *         must be #I915_GTT_PAGE_SIZE aligned
3440 3441 3442
 * @end: end of any range restriction inside GTT (U64_MAX for all),
 *       must be #I915_GTT_PAGE_SIZE aligned if not U64_MAX
 * @flags: control search and eviction behaviour
3443 3444 3445 3446 3447 3448
 *
 * i915_gem_gtt_insert() first searches for an available hole into which
 * is can insert the node. The hole address is aligned to @alignment and
 * its @size must then fit entirely within the [@start, @end] bounds. The
 * nodes on either side of the hole must match @color, or else a guard page
 * will be inserted between the two nodes (or the node evicted). If no
3449 3450
 * suitable hole is found, first a victim is randomly selected and tested
 * for eviction, otherwise then the LRU list of objects within the GTT
3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466
 * is scanned to find the first set of replacement nodes to create the hole.
 * Those old overlapping nodes are evicted from the GTT (and so must be
 * rebound before any future use). Any node that is currently pinned cannot
 * be evicted (see i915_vma_pin()). Similar if the node's VMA is currently
 * active and #PIN_NONBLOCK is specified, that node is also skipped when
 * searching for an eviction candidate. See i915_gem_evict_something() for
 * the gory details on the eviction algorithm.
 *
 * Returns: 0 on success, -ENOSPC if no suitable hole is found, -EINTR if
 * asked to wait for eviction and interrupted.
 */
int i915_gem_gtt_insert(struct i915_address_space *vm,
			struct drm_mm_node *node,
			u64 size, u64 alignment, unsigned long color,
			u64 start, u64 end, unsigned int flags)
{
3467
	enum drm_mm_insert_mode mode;
3468
	u64 offset;
3469 3470 3471 3472 3473 3474 3475 3476 3477 3478
	int err;

	lockdep_assert_held(&vm->i915->drm.struct_mutex);
	GEM_BUG_ON(!size);
	GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE));
	GEM_BUG_ON(alignment && !is_power_of_2(alignment));
	GEM_BUG_ON(alignment && !IS_ALIGNED(alignment, I915_GTT_MIN_ALIGNMENT));
	GEM_BUG_ON(start >= end);
	GEM_BUG_ON(start > 0  && !IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
	GEM_BUG_ON(end < U64_MAX && !IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
3479
	GEM_BUG_ON(vm == &vm->i915->mm.aliasing_ppgtt->base);
3480
	GEM_BUG_ON(drm_mm_node_allocated(node));
3481 3482 3483 3484 3485 3486 3487

	if (unlikely(range_overflows(start, size, end)))
		return -ENOSPC;

	if (unlikely(round_up(start, alignment) > round_down(end - size, alignment)))
		return -ENOSPC;

3488 3489 3490 3491 3492
	mode = DRM_MM_INSERT_BEST;
	if (flags & PIN_HIGH)
		mode = DRM_MM_INSERT_HIGH;
	if (flags & PIN_MAPPABLE)
		mode = DRM_MM_INSERT_LOW;
3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503

	/* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
	 * so we know that we always have a minimum alignment of 4096.
	 * The drm_mm range manager is optimised to return results
	 * with zero alignment, so where possible use the optimal
	 * path.
	 */
	BUILD_BUG_ON(I915_GTT_MIN_ALIGNMENT > I915_GTT_PAGE_SIZE);
	if (alignment <= I915_GTT_MIN_ALIGNMENT)
		alignment = 0;

3504 3505 3506
	err = drm_mm_insert_node_in_range(&vm->mm, node,
					  size, alignment, color,
					  start, end, mode);
3507 3508 3509
	if (err != -ENOSPC)
		return err;

3510 3511 3512
	if (flags & PIN_NOEVICT)
		return -ENOSPC;

3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541
	/* No free space, pick a slot at random.
	 *
	 * There is a pathological case here using a GTT shared between
	 * mmap and GPU (i.e. ggtt/aliasing_ppgtt but not full-ppgtt):
	 *
	 *    |<-- 256 MiB aperture -->||<-- 1792 MiB unmappable -->|
	 *         (64k objects)             (448k objects)
	 *
	 * Now imagine that the eviction LRU is ordered top-down (just because
	 * pathology meets real life), and that we need to evict an object to
	 * make room inside the aperture. The eviction scan then has to walk
	 * the 448k list before it finds one within range. And now imagine that
	 * it has to search for a new hole between every byte inside the memcpy,
	 * for several simultaneous clients.
	 *
	 * On a full-ppgtt system, if we have run out of available space, there
	 * will be lots and lots of objects in the eviction list! Again,
	 * searching that LRU list may be slow if we are also applying any
	 * range restrictions (e.g. restriction to low 4GiB) and so, for
	 * simplicity and similarilty between different GTT, try the single
	 * random replacement first.
	 */
	offset = random_offset(start, end,
			       size, alignment ?: I915_GTT_MIN_ALIGNMENT);
	err = i915_gem_gtt_reserve(vm, node, size, offset, color, flags);
	if (err != -ENOSPC)
		return err;

	/* Randomly selected placement is pinned, do a search */
3542 3543 3544 3545 3546
	err = i915_gem_evict_something(vm, size, alignment, color,
				       start, end, flags);
	if (err)
		return err;

3547 3548 3549
	return drm_mm_insert_node_in_range(&vm->mm, node,
					   size, alignment, color,
					   start, end, DRM_MM_INSERT_EVICT);
3550
}
3551 3552 3553

#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/mock_gtt.c"
3554
#include "selftests/i915_gem_gtt.c"
3555
#endif