i915_gem_gtt.c 94.9 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
#include <linux/seq_file.h>
27
#include <linux/stop_machine.h>
28 29
#include <drm/drmP.h>
#include <drm/i915_drm.h>
30
#include "i915_drv.h"
31
#include "i915_vgpu.h"
32 33 34
#include "i915_trace.h"
#include "intel_drv.h"

35 36
#define I915_GFP_DMA (GFP_KERNEL | __GFP_HIGHMEM)

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/**
 * 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
73 74 75
 * 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.
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
 *
 * 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).
 *
 */

98 99 100 101 102 103 104
static inline struct i915_ggtt *
i915_vm_to_ggtt(struct i915_address_space *vm)
{
	GEM_BUG_ON(!i915_is_ggtt(vm));
	return container_of(vm, struct i915_ggtt, base);
}

105 106 107
static int
i915_get_ggtt_vma_pages(struct i915_vma *vma);

108 109 110
const struct i915_ggtt_view i915_ggtt_view_normal = {
	.type = I915_GGTT_VIEW_NORMAL,
};
111
const struct i915_ggtt_view i915_ggtt_view_rotated = {
112
	.type = I915_GGTT_VIEW_ROTATED,
113
};
114

115 116
int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv,
			       	int enable_ppgtt)
117
{
118 119
	bool has_aliasing_ppgtt;
	bool has_full_ppgtt;
120
	bool has_full_48bit_ppgtt;
121

122 123 124 125
	has_aliasing_ppgtt = INTEL_GEN(dev_priv) >= 6;
	has_full_ppgtt = INTEL_GEN(dev_priv) >= 7;
	has_full_48bit_ppgtt =
	       	IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9;
126

127
	if (intel_vgpu_active(dev_priv))
128 129
		has_full_ppgtt = false; /* emulation is too hard */

130 131 132
	if (!has_aliasing_ppgtt)
		return 0;

133 134 135 136
	/*
	 * We don't allow disabling PPGTT for gen9+ as it's a requirement for
	 * execlists, the sole mechanism available to submit work.
	 */
137
	if (enable_ppgtt == 0 && INTEL_GEN(dev_priv) < 9)
138 139 140 141 142
		return 0;

	if (enable_ppgtt == 1)
		return 1;

143
	if (enable_ppgtt == 2 && has_full_ppgtt)
144 145
		return 2;

146 147 148
	if (enable_ppgtt == 3 && has_full_48bit_ppgtt)
		return 3;

149 150
#ifdef CONFIG_INTEL_IOMMU
	/* Disable ppgtt on SNB if VT-d is on. */
151
	if (IS_GEN6(dev_priv) && intel_iommu_gfx_mapped) {
152
		DRM_INFO("Disabling PPGTT because VT-d is on\n");
153
		return 0;
154 155 156
	}
#endif

157
	/* Early VLV doesn't have this */
158
	if (IS_VALLEYVIEW(dev_priv) && dev_priv->drm.pdev->revision < 0xb) {
159 160 161 162
		DRM_DEBUG_DRIVER("disabling PPGTT on pre-B3 step VLV\n");
		return 0;
	}

163
	if (INTEL_GEN(dev_priv) >= 8 && i915.enable_execlists)
164
		return has_full_48bit_ppgtt ? 3 : 2;
165 166
	else
		return has_aliasing_ppgtt ? 1 : 0;
167 168
}

169 170 171
static int ppgtt_bind_vma(struct i915_vma *vma,
			  enum i915_cache_level cache_level,
			  u32 unused)
172 173 174
{
	u32 pte_flags = 0;

175 176
	vma->pages = vma->obj->pages;

177 178 179 180
	/* Currently applicable only to VLV */
	if (vma->obj->gt_ro)
		pte_flags |= PTE_READ_ONLY;

181
	vma->vm->insert_entries(vma->vm, vma->pages, vma->node.start,
182
				cache_level, pte_flags);
183 184

	return 0;
185 186 187 188 189 190
}

static void ppgtt_unbind_vma(struct i915_vma *vma)
{
	vma->vm->clear_range(vma->vm,
			     vma->node.start,
191
			     vma->size,
192 193
			     true);
}
194

195 196 197
static gen8_pte_t gen8_pte_encode(dma_addr_t addr,
				  enum i915_cache_level level,
				  bool valid)
B
Ben Widawsky 已提交
198
{
199
	gen8_pte_t pte = valid ? _PAGE_PRESENT | _PAGE_RW : 0;
B
Ben Widawsky 已提交
200
	pte |= addr;
201 202 203

	switch (level) {
	case I915_CACHE_NONE:
B
Ben Widawsky 已提交
204
		pte |= PPAT_UNCACHED_INDEX;
205 206 207 208 209 210 211 212 213
		break;
	case I915_CACHE_WT:
		pte |= PPAT_DISPLAY_ELLC_INDEX;
		break;
	default:
		pte |= PPAT_CACHED_INDEX;
		break;
	}

B
Ben Widawsky 已提交
214 215 216
	return pte;
}

217 218
static gen8_pde_t gen8_pde_encode(const dma_addr_t addr,
				  const enum i915_cache_level level)
B
Ben Widawsky 已提交
219
{
220
	gen8_pde_t pde = _PAGE_PRESENT | _PAGE_RW;
B
Ben Widawsky 已提交
221 222 223 224 225 226 227 228
	pde |= addr;
	if (level != I915_CACHE_NONE)
		pde |= PPAT_CACHED_PDE_INDEX;
	else
		pde |= PPAT_UNCACHED_INDEX;
	return pde;
}

229 230 231
#define gen8_pdpe_encode gen8_pde_encode
#define gen8_pml4e_encode gen8_pde_encode

232 233 234
static gen6_pte_t snb_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
				 bool valid, u32 unused)
235
{
236
	gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0;
237
	pte |= GEN6_PTE_ADDR_ENCODE(addr);
238 239

	switch (level) {
240 241 242 243 244 245 246 247
	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:
248
		MISSING_CASE(level);
249 250 251 252 253
	}

	return pte;
}

254 255 256
static gen6_pte_t ivb_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
				 bool valid, u32 unused)
257
{
258
	gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0;
259 260 261 262 263
	pte |= GEN6_PTE_ADDR_ENCODE(addr);

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

275 276 277
	return pte;
}

278 279 280
static gen6_pte_t byt_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
				 bool valid, u32 flags)
281
{
282
	gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0;
283 284
	pte |= GEN6_PTE_ADDR_ENCODE(addr);

285 286
	if (!(flags & PTE_READ_ONLY))
		pte |= BYT_PTE_WRITEABLE;
287 288 289 290 291 292 293

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

	return pte;
}

294 295 296
static gen6_pte_t hsw_pte_encode(dma_addr_t addr,
				 enum i915_cache_level level,
				 bool valid, u32 unused)
297
{
298
	gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0;
299
	pte |= HSW_PTE_ADDR_ENCODE(addr);
300 301

	if (level != I915_CACHE_NONE)
302
		pte |= HSW_WB_LLC_AGE3;
303 304 305 306

	return pte;
}

307 308 309
static gen6_pte_t iris_pte_encode(dma_addr_t addr,
				  enum i915_cache_level level,
				  bool valid, u32 unused)
310
{
311
	gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0;
312 313
	pte |= HSW_PTE_ADDR_ENCODE(addr);

314 315 316 317
	switch (level) {
	case I915_CACHE_NONE:
		break;
	case I915_CACHE_WT:
318
		pte |= HSW_WT_ELLC_LLC_AGE3;
319 320
		break;
	default:
321
		pte |= HSW_WB_ELLC_LLC_AGE3;
322 323
		break;
	}
324 325 326 327

	return pte;
}

328 329
static int __setup_page_dma(struct drm_device *dev,
			    struct i915_page_dma *p, gfp_t flags)
330
{
331
	struct device *kdev = &dev->pdev->dev;
332

333
	p->page = alloc_page(flags);
334 335
	if (!p->page)
		return -ENOMEM;
336

337
	p->daddr = dma_map_page(kdev,
338
				p->page, 0, 4096, PCI_DMA_BIDIRECTIONAL);
339

340
	if (dma_mapping_error(kdev, p->daddr)) {
341 342 343
		__free_page(p->page);
		return -EINVAL;
	}
344 345

	return 0;
346 347
}

348 349
static int setup_page_dma(struct drm_device *dev, struct i915_page_dma *p)
{
350
	return __setup_page_dma(dev, p, I915_GFP_DMA);
351 352
}

353
static void cleanup_page_dma(struct drm_device *dev, struct i915_page_dma *p)
354
{
D
David Weinehall 已提交
355 356
	struct pci_dev *pdev = dev->pdev;

357
	if (WARN_ON(!p->page))
358
		return;
359

D
David Weinehall 已提交
360
	dma_unmap_page(&pdev->dev, p->daddr, 4096, PCI_DMA_BIDIRECTIONAL);
361 362 363 364
	__free_page(p->page);
	memset(p, 0, sizeof(*p));
}

365
static void *kmap_page_dma(struct i915_page_dma *p)
366
{
367 368
	return kmap_atomic(p->page);
}
369

370 371 372 373 374
/* We use the flushing unmap only with ppgtt structures:
 * page directories, page tables and scratch pages.
 */
static void kunmap_page_dma(struct drm_device *dev, void *vaddr)
{
375 376 377 378 379 380 381 382 383
	/* 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) || IS_BROXTON(dev))
		drm_clflush_virt_range(vaddr, PAGE_SIZE);

	kunmap_atomic(vaddr);
}

384
#define kmap_px(px) kmap_page_dma(px_base(px))
385 386
#define kunmap_px(ppgtt, vaddr) kunmap_page_dma((ppgtt)->base.dev, (vaddr))

387 388 389 390 391
#define setup_px(dev, px) setup_page_dma((dev), px_base(px))
#define cleanup_px(dev, px) cleanup_page_dma((dev), px_base(px))
#define fill_px(dev, px, v) fill_page_dma((dev), px_base(px), (v))
#define fill32_px(dev, px, v) fill_page_dma_32((dev), px_base(px), (v))

392 393 394 395 396 397 398 399 400 401 402 403
static void fill_page_dma(struct drm_device *dev, struct i915_page_dma *p,
			  const uint64_t val)
{
	int i;
	uint64_t * const vaddr = kmap_page_dma(p);

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

	kunmap_page_dma(dev, vaddr);
}

404 405 406 407 408 409 410 411 412 413
static void fill_page_dma_32(struct drm_device *dev, struct i915_page_dma *p,
			     const uint32_t val32)
{
	uint64_t v = val32;

	v = v << 32 | val32;

	fill_page_dma(dev, p, v);
}

414
static int
415 416 417
setup_scratch_page(struct drm_device *dev,
		   struct i915_page_dma *scratch,
		   gfp_t gfp)
418
{
419
	return __setup_page_dma(dev, scratch, gfp | __GFP_ZERO);
420 421
}

422 423
static void cleanup_scratch_page(struct drm_device *dev,
				 struct i915_page_dma *scratch)
424
{
425
	cleanup_page_dma(dev, scratch);
426 427
}

428
static struct i915_page_table *alloc_pt(struct drm_device *dev)
429
{
430
	struct i915_page_table *pt;
431 432 433
	const size_t count = INTEL_INFO(dev)->gen >= 8 ?
		GEN8_PTES : GEN6_PTES;
	int ret = -ENOMEM;
434 435 436 437 438

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

439 440 441 442 443 444
	pt->used_ptes = kcalloc(BITS_TO_LONGS(count), sizeof(*pt->used_ptes),
				GFP_KERNEL);

	if (!pt->used_ptes)
		goto fail_bitmap;

445
	ret = setup_px(dev, pt);
446
	if (ret)
447
		goto fail_page_m;
448 449

	return pt;
450

451
fail_page_m:
452 453 454 455 456
	kfree(pt->used_ptes);
fail_bitmap:
	kfree(pt);

	return ERR_PTR(ret);
457 458
}

459
static void free_pt(struct drm_device *dev, struct i915_page_table *pt)
460
{
461 462 463 464 465 466 467 468 469 470
	cleanup_px(dev, pt);
	kfree(pt->used_ptes);
	kfree(pt);
}

static void gen8_initialize_pt(struct i915_address_space *vm,
			       struct i915_page_table *pt)
{
	gen8_pte_t scratch_pte;

471
	scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
472 473 474 475 476 477 478 479 480 481
				      I915_CACHE_LLC, true);

	fill_px(vm->dev, pt, scratch_pte);
}

static void gen6_initialize_pt(struct i915_address_space *vm,
			       struct i915_page_table *pt)
{
	gen6_pte_t scratch_pte;

482
	WARN_ON(vm->scratch_page.daddr == 0);
483

484
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
485 486 487
				     I915_CACHE_LLC, true, 0);

	fill32_px(vm->dev, pt, scratch_pte);
488 489
}

490
static struct i915_page_directory *alloc_pd(struct drm_device *dev)
491
{
492
	struct i915_page_directory *pd;
493
	int ret = -ENOMEM;
494 495 496 497 498

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

499 500 501
	pd->used_pdes = kcalloc(BITS_TO_LONGS(I915_PDES),
				sizeof(*pd->used_pdes), GFP_KERNEL);
	if (!pd->used_pdes)
502
		goto fail_bitmap;
503

504
	ret = setup_px(dev, pd);
505
	if (ret)
506
		goto fail_page_m;
507

508
	return pd;
509

510
fail_page_m:
511
	kfree(pd->used_pdes);
512
fail_bitmap:
513 514 515
	kfree(pd);

	return ERR_PTR(ret);
516 517
}

518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
static void free_pd(struct drm_device *dev, struct i915_page_directory *pd)
{
	if (px_page(pd)) {
		cleanup_px(dev, pd);
		kfree(pd->used_pdes);
		kfree(pd);
	}
}

static void gen8_initialize_pd(struct i915_address_space *vm,
			       struct i915_page_directory *pd)
{
	gen8_pde_t scratch_pde;

	scratch_pde = gen8_pde_encode(px_dma(vm->scratch_pt), I915_CACHE_LLC);

	fill_px(vm->dev, pd, scratch_pde);
}

537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
static int __pdp_init(struct drm_device *dev,
		      struct i915_page_directory_pointer *pdp)
{
	size_t pdpes = I915_PDPES_PER_PDP(dev);

	pdp->used_pdpes = kcalloc(BITS_TO_LONGS(pdpes),
				  sizeof(unsigned long),
				  GFP_KERNEL);
	if (!pdp->used_pdpes)
		return -ENOMEM;

	pdp->page_directory = kcalloc(pdpes, sizeof(*pdp->page_directory),
				      GFP_KERNEL);
	if (!pdp->page_directory) {
		kfree(pdp->used_pdpes);
		/* the PDP might be the statically allocated top level. Keep it
		 * as clean as possible */
		pdp->used_pdpes = NULL;
		return -ENOMEM;
	}

	return 0;
}

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

568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597
static struct
i915_page_directory_pointer *alloc_pdp(struct drm_device *dev)
{
	struct i915_page_directory_pointer *pdp;
	int ret = -ENOMEM;

	WARN_ON(!USES_FULL_48BIT_PPGTT(dev));

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

	ret = __pdp_init(dev, pdp);
	if (ret)
		goto fail_bitmap;

	ret = setup_px(dev, pdp);
	if (ret)
		goto fail_page_m;

	return pdp;

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

	return ERR_PTR(ret);
}

598 599 600 601
static void free_pdp(struct drm_device *dev,
		     struct i915_page_directory_pointer *pdp)
{
	__pdp_fini(pdp);
602 603 604 605 606 607
	if (USES_FULL_48BIT_PPGTT(dev)) {
		cleanup_px(dev, pdp);
		kfree(pdp);
	}
}

608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
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);

	fill_px(vm->dev, pdp, scratch_pdpe);
}

static void gen8_initialize_pml4(struct i915_address_space *vm,
				 struct i915_pml4 *pml4)
{
	gen8_ppgtt_pml4e_t scratch_pml4e;

	scratch_pml4e = gen8_pml4e_encode(px_dma(vm->scratch_pdp),
					  I915_CACHE_LLC);

	fill_px(vm->dev, pml4, scratch_pml4e);
}

629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
static void
gen8_setup_page_directory(struct i915_hw_ppgtt *ppgtt,
			  struct i915_page_directory_pointer *pdp,
			  struct i915_page_directory *pd,
			  int index)
{
	gen8_ppgtt_pdpe_t *page_directorypo;

	if (!USES_FULL_48BIT_PPGTT(ppgtt->base.dev))
		return;

	page_directorypo = kmap_px(pdp);
	page_directorypo[index] = gen8_pdpe_encode(px_dma(pd), I915_CACHE_LLC);
	kunmap_px(ppgtt, page_directorypo);
}

static void
gen8_setup_page_directory_pointer(struct i915_hw_ppgtt *ppgtt,
				  struct i915_pml4 *pml4,
				  struct i915_page_directory_pointer *pdp,
				  int index)
{
	gen8_ppgtt_pml4e_t *pagemap = kmap_px(pml4);

	WARN_ON(!USES_FULL_48BIT_PPGTT(ppgtt->base.dev));
	pagemap[index] = gen8_pml4e_encode(px_dma(pdp), I915_CACHE_LLC);
	kunmap_px(ppgtt, pagemap);
656 657
}

658
/* Broadwell Page Directory Pointer Descriptors */
659
static int gen8_write_pdp(struct drm_i915_gem_request *req,
660 661
			  unsigned entry,
			  dma_addr_t addr)
662
{
663
	struct intel_ring *ring = req->ring;
664
	struct intel_engine_cs *engine = req->engine;
665 666 667 668
	int ret;

	BUG_ON(entry >= 4);

669
	ret = intel_ring_begin(req, 6);
670 671 672
	if (ret)
		return ret;

673 674 675 676 677 678 679
	intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
	intel_ring_emit_reg(ring, GEN8_RING_PDP_UDW(engine, entry));
	intel_ring_emit(ring, upper_32_bits(addr));
	intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
	intel_ring_emit_reg(ring, GEN8_RING_PDP_LDW(engine, entry));
	intel_ring_emit(ring, lower_32_bits(addr));
	intel_ring_advance(ring);
680 681 682 683

	return 0;
}

684 685
static int gen8_legacy_mm_switch(struct i915_hw_ppgtt *ppgtt,
				 struct drm_i915_gem_request *req)
686
{
687
	int i, ret;
688

689
	for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) {
690 691
		const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);

692
		ret = gen8_write_pdp(req, i, pd_daddr);
693 694
		if (ret)
			return ret;
695
	}
B
Ben Widawsky 已提交
696

697
	return 0;
698 699
}

700 701 702 703 704 705
static int gen8_48b_mm_switch(struct i915_hw_ppgtt *ppgtt,
			      struct drm_i915_gem_request *req)
{
	return gen8_write_pdp(req, 0, px_dma(&ppgtt->pml4));
}

706 707 708 709 710
static void gen8_ppgtt_clear_pte_range(struct i915_address_space *vm,
				       struct i915_page_directory_pointer *pdp,
				       uint64_t start,
				       uint64_t length,
				       gen8_pte_t scratch_pte)
711
{
712
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
713
	gen8_pte_t *pt_vaddr;
714 715 716
	unsigned pdpe = gen8_pdpe_index(start);
	unsigned pde = gen8_pde_index(start);
	unsigned pte = gen8_pte_index(start);
717
	unsigned num_entries = length >> PAGE_SHIFT;
718 719
	unsigned last_pte, i;

720 721
	if (WARN_ON(!pdp))
		return;
722 723

	while (num_entries) {
724 725
		struct i915_page_directory *pd;
		struct i915_page_table *pt;
726

727
		if (WARN_ON(!pdp->page_directory[pdpe]))
728
			break;
729

730
		pd = pdp->page_directory[pdpe];
731 732

		if (WARN_ON(!pd->page_table[pde]))
733
			break;
734 735 736

		pt = pd->page_table[pde];

737
		if (WARN_ON(!px_page(pt)))
738
			break;
739

740
		last_pte = pte + num_entries;
741 742
		if (last_pte > GEN8_PTES)
			last_pte = GEN8_PTES;
743

744
		pt_vaddr = kmap_px(pt);
745

746
		for (i = pte; i < last_pte; i++) {
747
			pt_vaddr[i] = scratch_pte;
748 749
			num_entries--;
		}
750

751
		kunmap_px(ppgtt, pt_vaddr);
752

753
		pte = 0;
754
		if (++pde == I915_PDES) {
755 756
			if (++pdpe == I915_PDPES_PER_PDP(vm->dev))
				break;
757 758
			pde = 0;
		}
759 760 761
	}
}

762 763 764 765
static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
				   uint64_t start,
				   uint64_t length,
				   bool use_scratch)
766
{
767
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
768
	gen8_pte_t scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
769 770
						 I915_CACHE_LLC, use_scratch);

771 772 773 774
	if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
		gen8_ppgtt_clear_pte_range(vm, &ppgtt->pdp, start, length,
					   scratch_pte);
	} else {
775
		uint64_t pml4e;
776 777
		struct i915_page_directory_pointer *pdp;

778
		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, pml4e) {
779 780 781 782
			gen8_ppgtt_clear_pte_range(vm, pdp, start, length,
						   scratch_pte);
		}
	}
783 784 785 786 787
}

static void
gen8_ppgtt_insert_pte_entries(struct i915_address_space *vm,
			      struct i915_page_directory_pointer *pdp,
788
			      struct sg_page_iter *sg_iter,
789 790 791
			      uint64_t start,
			      enum i915_cache_level cache_level)
{
792
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
793
	gen8_pte_t *pt_vaddr;
794 795 796
	unsigned pdpe = gen8_pdpe_index(start);
	unsigned pde = gen8_pde_index(start);
	unsigned pte = gen8_pte_index(start);
797

798
	pt_vaddr = NULL;
799

800
	while (__sg_page_iter_next(sg_iter)) {
B
Ben Widawsky 已提交
801
		if (pt_vaddr == NULL) {
802
			struct i915_page_directory *pd = pdp->page_directory[pdpe];
803
			struct i915_page_table *pt = pd->page_table[pde];
804
			pt_vaddr = kmap_px(pt);
B
Ben Widawsky 已提交
805
		}
806

807
		pt_vaddr[pte] =
808
			gen8_pte_encode(sg_page_iter_dma_address(sg_iter),
809
					cache_level, true);
810
		if (++pte == GEN8_PTES) {
811
			kunmap_px(ppgtt, pt_vaddr);
812
			pt_vaddr = NULL;
813
			if (++pde == I915_PDES) {
814 815
				if (++pdpe == I915_PDPES_PER_PDP(vm->dev))
					break;
816 817 818
				pde = 0;
			}
			pte = 0;
819 820
		}
	}
821 822 823

	if (pt_vaddr)
		kunmap_px(ppgtt, pt_vaddr);
824 825
}

826 827 828 829 830 831
static void gen8_ppgtt_insert_entries(struct i915_address_space *vm,
				      struct sg_table *pages,
				      uint64_t start,
				      enum i915_cache_level cache_level,
				      u32 unused)
{
832
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
833
	struct sg_page_iter sg_iter;
834

835
	__sg_page_iter_start(&sg_iter, pages->sgl, sg_nents(pages->sgl), 0);
836 837 838 839 840 841

	if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
		gen8_ppgtt_insert_pte_entries(vm, &ppgtt->pdp, &sg_iter, start,
					      cache_level);
	} else {
		struct i915_page_directory_pointer *pdp;
842
		uint64_t pml4e;
843 844
		uint64_t length = (uint64_t)pages->orig_nents << PAGE_SHIFT;

845
		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, pml4e) {
846 847 848 849
			gen8_ppgtt_insert_pte_entries(vm, pdp, &sg_iter,
						      start, cache_level);
		}
	}
850 851
}

852 853
static void gen8_free_page_tables(struct drm_device *dev,
				  struct i915_page_directory *pd)
854 855 856
{
	int i;

857
	if (!px_page(pd))
858 859
		return;

860
	for_each_set_bit(i, pd->used_pdes, I915_PDES) {
861 862
		if (WARN_ON(!pd->page_table[i]))
			continue;
863

864
		free_pt(dev, pd->page_table[i]);
865 866
		pd->page_table[i] = NULL;
	}
B
Ben Widawsky 已提交
867 868
}

869 870 871
static int gen8_init_scratch(struct i915_address_space *vm)
{
	struct drm_device *dev = vm->dev;
872
	int ret;
873

874
	ret = setup_scratch_page(dev, &vm->scratch_page, I915_GFP_DMA);
875 876
	if (ret)
		return ret;
877 878 879

	vm->scratch_pt = alloc_pt(dev);
	if (IS_ERR(vm->scratch_pt)) {
880 881
		ret = PTR_ERR(vm->scratch_pt);
		goto free_scratch_page;
882 883 884 885
	}

	vm->scratch_pd = alloc_pd(dev);
	if (IS_ERR(vm->scratch_pd)) {
886 887
		ret = PTR_ERR(vm->scratch_pd);
		goto free_pt;
888 889
	}

890 891 892
	if (USES_FULL_48BIT_PPGTT(dev)) {
		vm->scratch_pdp = alloc_pdp(dev);
		if (IS_ERR(vm->scratch_pdp)) {
893 894
			ret = PTR_ERR(vm->scratch_pdp);
			goto free_pd;
895 896 897
		}
	}

898 899
	gen8_initialize_pt(vm, vm->scratch_pt);
	gen8_initialize_pd(vm, vm->scratch_pd);
900 901
	if (USES_FULL_48BIT_PPGTT(dev))
		gen8_initialize_pdp(vm, vm->scratch_pdp);
902 903

	return 0;
904 905 906 907 908 909

free_pd:
	free_pd(dev, vm->scratch_pd);
free_pt:
	free_pt(dev, vm->scratch_pt);
free_scratch_page:
910
	cleanup_scratch_page(dev, &vm->scratch_page);
911 912

	return ret;
913 914
}

915 916 917
static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
{
	enum vgt_g2v_type msg;
918
	struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
919 920
	int i;

921
	if (USES_FULL_48BIT_PPGTT(dev_priv)) {
922 923
		u64 daddr = px_dma(&ppgtt->pml4);

924 925
		I915_WRITE(vgtif_reg(pdp[0].lo), lower_32_bits(daddr));
		I915_WRITE(vgtif_reg(pdp[0].hi), upper_32_bits(daddr));
926 927 928 929 930 931 932

		msg = (create ? VGT_G2V_PPGTT_L4_PAGE_TABLE_CREATE :
				VGT_G2V_PPGTT_L4_PAGE_TABLE_DESTROY);
	} else {
		for (i = 0; i < GEN8_LEGACY_PDPES; i++) {
			u64 daddr = i915_page_dir_dma_addr(ppgtt, i);

933 934
			I915_WRITE(vgtif_reg(pdp[i].lo), lower_32_bits(daddr));
			I915_WRITE(vgtif_reg(pdp[i].hi), upper_32_bits(daddr));
935 936 937 938 939 940 941 942 943 944 945
		}

		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;
}

946 947 948 949
static void gen8_free_scratch(struct i915_address_space *vm)
{
	struct drm_device *dev = vm->dev;

950 951
	if (USES_FULL_48BIT_PPGTT(dev))
		free_pdp(dev, vm->scratch_pdp);
952 953
	free_pd(dev, vm->scratch_pd);
	free_pt(dev, vm->scratch_pt);
954
	cleanup_scratch_page(dev, &vm->scratch_page);
955 956
}

957 958
static void gen8_ppgtt_cleanup_3lvl(struct drm_device *dev,
				    struct i915_page_directory_pointer *pdp)
959 960 961
{
	int i;

962 963
	for_each_set_bit(i, pdp->used_pdpes, I915_PDPES_PER_PDP(dev)) {
		if (WARN_ON(!pdp->page_directory[i]))
964 965
			continue;

966 967
		gen8_free_page_tables(dev, pdp->page_directory[i]);
		free_pd(dev, pdp->page_directory[i]);
968
	}
969

970
	free_pdp(dev, pdp);
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988
}

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

	for_each_set_bit(i, ppgtt->pml4.used_pml4es, GEN8_PML4ES_PER_PML4) {
		if (WARN_ON(!ppgtt->pml4.pdps[i]))
			continue;

		gen8_ppgtt_cleanup_3lvl(ppgtt->base.dev, ppgtt->pml4.pdps[i]);
	}

	cleanup_px(ppgtt->base.dev, &ppgtt->pml4);
}

static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
{
989
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
990

991
	if (intel_vgpu_active(to_i915(vm->dev)))
992 993
		gen8_ppgtt_notify_vgt(ppgtt, false);

994 995 996 997
	if (!USES_FULL_48BIT_PPGTT(ppgtt->base.dev))
		gen8_ppgtt_cleanup_3lvl(ppgtt->base.dev, &ppgtt->pdp);
	else
		gen8_ppgtt_cleanup_4lvl(ppgtt);
998

999
	gen8_free_scratch(vm);
1000 1001
}

1002 1003
/**
 * gen8_ppgtt_alloc_pagetabs() - Allocate page tables for VA range.
1004 1005
 * @vm:	Master vm structure.
 * @pd:	Page directory for this address range.
1006
 * @start:	Starting virtual address to begin allocations.
1007
 * @length:	Size of the allocations.
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
 * @new_pts:	Bitmap set by function with new allocations. Likely used by the
 *		caller to free on error.
 *
 * Allocate the required number of page tables. Extremely similar to
 * gen8_ppgtt_alloc_page_directories(). The main difference is here we are limited by
 * the page directory boundary (instead of the page directory pointer). That
 * boundary is 1GB virtual. Therefore, unlike gen8_ppgtt_alloc_page_directories(), it is
 * possible, and likely that the caller will need to use multiple calls of this
 * function to achieve the appropriate allocation.
 *
 * Return: 0 if success; negative error code otherwise.
 */
1020
static int gen8_ppgtt_alloc_pagetabs(struct i915_address_space *vm,
1021
				     struct i915_page_directory *pd,
1022
				     uint64_t start,
1023 1024
				     uint64_t length,
				     unsigned long *new_pts)
1025
{
1026
	struct drm_device *dev = vm->dev;
1027
	struct i915_page_table *pt;
1028
	uint32_t pde;
1029

1030
	gen8_for_each_pde(pt, pd, start, length, pde) {
1031
		/* Don't reallocate page tables */
1032
		if (test_bit(pde, pd->used_pdes)) {
1033
			/* Scratch is never allocated this way */
1034
			WARN_ON(pt == vm->scratch_pt);
1035 1036 1037
			continue;
		}

1038
		pt = alloc_pt(dev);
1039
		if (IS_ERR(pt))
1040 1041
			goto unwind_out;

1042
		gen8_initialize_pt(vm, pt);
1043
		pd->page_table[pde] = pt;
1044
		__set_bit(pde, new_pts);
1045
		trace_i915_page_table_entry_alloc(vm, pde, start, GEN8_PDE_SHIFT);
1046 1047
	}

1048
	return 0;
1049 1050

unwind_out:
1051
	for_each_set_bit(pde, new_pts, I915_PDES)
1052
		free_pt(dev, pd->page_table[pde]);
1053

B
Ben Widawsky 已提交
1054
	return -ENOMEM;
1055 1056
}

1057 1058
/**
 * gen8_ppgtt_alloc_page_directories() - Allocate page directories for VA range.
1059
 * @vm:	Master vm structure.
1060 1061
 * @pdp:	Page directory pointer for this address range.
 * @start:	Starting virtual address to begin allocations.
1062 1063
 * @length:	Size of the allocations.
 * @new_pds:	Bitmap set by function with new allocations. Likely used by the
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
 *		caller to free on error.
 *
 * Allocate the required number of page directories starting at the pde index of
 * @start, and ending at the pde index @start + @length. This function will skip
 * over already allocated page directories within the range, and only allocate
 * new ones, setting the appropriate pointer within the pdp as well as the
 * correct position in the bitmap @new_pds.
 *
 * The function will only allocate the pages within the range for a give page
 * directory pointer. In other words, if @start + @length straddles a virtually
 * addressed PDP boundary (512GB for 4k pages), there will be more allocations
 * required by the caller, This is not currently possible, and the BUG in the
 * code will prevent it.
 *
 * Return: 0 if success; negative error code otherwise.
 */
1080 1081 1082 1083 1084 1085
static int
gen8_ppgtt_alloc_page_directories(struct i915_address_space *vm,
				  struct i915_page_directory_pointer *pdp,
				  uint64_t start,
				  uint64_t length,
				  unsigned long *new_pds)
1086
{
1087
	struct drm_device *dev = vm->dev;
1088
	struct i915_page_directory *pd;
1089
	uint32_t pdpe;
1090
	uint32_t pdpes = I915_PDPES_PER_PDP(dev);
1091

1092
	WARN_ON(!bitmap_empty(new_pds, pdpes));
1093

1094
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1095
		if (test_bit(pdpe, pdp->used_pdpes))
1096
			continue;
1097

1098
		pd = alloc_pd(dev);
1099
		if (IS_ERR(pd))
B
Ben Widawsky 已提交
1100
			goto unwind_out;
1101

1102
		gen8_initialize_pd(vm, pd);
1103
		pdp->page_directory[pdpe] = pd;
1104
		__set_bit(pdpe, new_pds);
1105
		trace_i915_page_directory_entry_alloc(vm, pdpe, start, GEN8_PDPE_SHIFT);
B
Ben Widawsky 已提交
1106 1107
	}

1108
	return 0;
B
Ben Widawsky 已提交
1109 1110

unwind_out:
1111
	for_each_set_bit(pdpe, new_pds, pdpes)
1112
		free_pd(dev, pdp->page_directory[pdpe]);
B
Ben Widawsky 已提交
1113 1114

	return -ENOMEM;
1115 1116
}

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
/**
 * gen8_ppgtt_alloc_page_dirpointers() - Allocate pdps for VA range.
 * @vm:	Master vm structure.
 * @pml4:	Page map level 4 for this address range.
 * @start:	Starting virtual address to begin allocations.
 * @length:	Size of the allocations.
 * @new_pdps:	Bitmap set by function with new allocations. Likely used by the
 *		caller to free on error.
 *
 * Allocate the required number of page directory pointers. Extremely similar to
 * gen8_ppgtt_alloc_page_directories() and gen8_ppgtt_alloc_pagetabs().
 * The main difference is here we are limited by the pml4 boundary (instead of
 * the page directory pointer).
 *
 * Return: 0 if success; negative error code otherwise.
 */
static int
gen8_ppgtt_alloc_page_dirpointers(struct i915_address_space *vm,
				  struct i915_pml4 *pml4,
				  uint64_t start,
				  uint64_t length,
				  unsigned long *new_pdps)
{
	struct drm_device *dev = vm->dev;
	struct i915_page_directory_pointer *pdp;
	uint32_t pml4e;

	WARN_ON(!bitmap_empty(new_pdps, GEN8_PML4ES_PER_PML4));

1146
	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
1147 1148 1149 1150 1151
		if (!test_bit(pml4e, pml4->used_pml4es)) {
			pdp = alloc_pdp(dev);
			if (IS_ERR(pdp))
				goto unwind_out;

1152
			gen8_initialize_pdp(vm, pdp);
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
			pml4->pdps[pml4e] = pdp;
			__set_bit(pml4e, new_pdps);
			trace_i915_page_directory_pointer_entry_alloc(vm,
								      pml4e,
								      start,
								      GEN8_PML4E_SHIFT);
		}
	}

	return 0;

unwind_out:
	for_each_set_bit(pml4e, new_pdps, GEN8_PML4ES_PER_PML4)
		free_pdp(dev, pml4->pdps[pml4e]);

	return -ENOMEM;
}

1171
static void
1172
free_gen8_temp_bitmaps(unsigned long *new_pds, unsigned long *new_pts)
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
{
	kfree(new_pts);
	kfree(new_pds);
}

/* Fills in the page directory bitmap, and the array of page tables bitmap. Both
 * of these are based on the number of PDPEs in the system.
 */
static
int __must_check alloc_gen8_temp_bitmaps(unsigned long **new_pds,
1183
					 unsigned long **new_pts,
1184
					 uint32_t pdpes)
1185 1186
{
	unsigned long *pds;
1187
	unsigned long *pts;
1188

1189
	pds = kcalloc(BITS_TO_LONGS(pdpes), sizeof(unsigned long), GFP_TEMPORARY);
1190 1191 1192
	if (!pds)
		return -ENOMEM;

1193 1194 1195 1196
	pts = kcalloc(pdpes, BITS_TO_LONGS(I915_PDES) * sizeof(unsigned long),
		      GFP_TEMPORARY);
	if (!pts)
		goto err_out;
1197 1198 1199 1200 1201 1202 1203

	*new_pds = pds;
	*new_pts = pts;

	return 0;

err_out:
1204
	free_gen8_temp_bitmaps(pds, pts);
1205 1206 1207
	return -ENOMEM;
}

1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
/* 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)
{
	ppgtt->pd_dirty_rings = INTEL_INFO(ppgtt->base.dev)->ring_mask;
}

1218 1219 1220 1221
static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
				    struct i915_page_directory_pointer *pdp,
				    uint64_t start,
				    uint64_t length)
1222
{
1223
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1224
	unsigned long *new_page_dirs, *new_page_tables;
1225
	struct drm_device *dev = vm->dev;
1226
	struct i915_page_directory *pd;
1227 1228
	const uint64_t orig_start = start;
	const uint64_t orig_length = length;
1229
	uint32_t pdpe;
1230
	uint32_t pdpes = I915_PDPES_PER_PDP(dev);
1231 1232
	int ret;

1233 1234 1235 1236
	/* Wrap is never okay since we can only represent 48b, and we don't
	 * actually use the other side of the canonical address space.
	 */
	if (WARN_ON(start + length < start))
1237 1238
		return -ENODEV;

1239
	if (WARN_ON(start + length > vm->total))
1240
		return -ENODEV;
1241

1242
	ret = alloc_gen8_temp_bitmaps(&new_page_dirs, &new_page_tables, pdpes);
1243 1244 1245
	if (ret)
		return ret;

1246
	/* Do the allocations first so we can easily bail out */
1247 1248
	ret = gen8_ppgtt_alloc_page_directories(vm, pdp, start, length,
						new_page_dirs);
1249
	if (ret) {
1250
		free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
1251 1252 1253 1254
		return ret;
	}

	/* For every page directory referenced, allocate page tables */
1255
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1256
		ret = gen8_ppgtt_alloc_pagetabs(vm, pd, start, length,
1257
						new_page_tables + pdpe * BITS_TO_LONGS(I915_PDES));
1258 1259 1260 1261
		if (ret)
			goto err_out;
	}

1262 1263 1264
	start = orig_start;
	length = orig_length;

1265 1266
	/* Allocations have completed successfully, so set the bitmaps, and do
	 * the mappings. */
1267
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1268
		gen8_pde_t *const page_directory = kmap_px(pd);
1269
		struct i915_page_table *pt;
1270
		uint64_t pd_len = length;
1271 1272 1273
		uint64_t pd_start = start;
		uint32_t pde;

1274 1275 1276
		/* Every pd should be allocated, we just did that above. */
		WARN_ON(!pd);

1277
		gen8_for_each_pde(pt, pd, pd_start, pd_len, pde) {
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
			/* Same reasoning as pd */
			WARN_ON(!pt);
			WARN_ON(!pd_len);
			WARN_ON(!gen8_pte_count(pd_start, pd_len));

			/* Set our used ptes within the page table */
			bitmap_set(pt->used_ptes,
				   gen8_pte_index(pd_start),
				   gen8_pte_count(pd_start, pd_len));

			/* Our pde is now pointing to the pagetable, pt */
1289
			__set_bit(pde, pd->used_pdes);
1290 1291

			/* Map the PDE to the page table */
1292 1293
			page_directory[pde] = gen8_pde_encode(px_dma(pt),
							      I915_CACHE_LLC);
1294 1295 1296 1297
			trace_i915_page_table_entry_map(&ppgtt->base, pde, pt,
							gen8_pte_index(start),
							gen8_pte_count(start, length),
							GEN8_PTES);
1298 1299 1300

			/* NB: We haven't yet mapped ptes to pages. At this
			 * point we're still relying on insert_entries() */
1301
		}
1302

1303
		kunmap_px(ppgtt, page_directory);
1304
		__set_bit(pdpe, pdp->used_pdpes);
1305
		gen8_setup_page_directory(ppgtt, pdp, pd, pdpe);
1306 1307
	}

1308
	free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
1309
	mark_tlbs_dirty(ppgtt);
B
Ben Widawsky 已提交
1310
	return 0;
1311

B
Ben Widawsky 已提交
1312
err_out:
1313
	while (pdpe--) {
1314 1315
		unsigned long temp;

1316 1317
		for_each_set_bit(temp, new_page_tables + pdpe *
				BITS_TO_LONGS(I915_PDES), I915_PDES)
1318
			free_pt(dev, pdp->page_directory[pdpe]->page_table[temp]);
1319 1320
	}

1321
	for_each_set_bit(pdpe, new_page_dirs, pdpes)
1322
		free_pd(dev, pdp->page_directory[pdpe]);
1323

1324
	free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
1325
	mark_tlbs_dirty(ppgtt);
1326 1327 1328
	return ret;
}

1329 1330 1331 1332 1333 1334
static int gen8_alloc_va_range_4lvl(struct i915_address_space *vm,
				    struct i915_pml4 *pml4,
				    uint64_t start,
				    uint64_t length)
{
	DECLARE_BITMAP(new_pdps, GEN8_PML4ES_PER_PML4);
1335
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1336
	struct i915_page_directory_pointer *pdp;
1337
	uint64_t pml4e;
1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
	int ret = 0;

	/* Do the pml4 allocations first, so we don't need to track the newly
	 * allocated tables below the pdp */
	bitmap_zero(new_pdps, GEN8_PML4ES_PER_PML4);

	/* The pagedirectory and pagetable allocations are done in the shared 3
	 * and 4 level code. Just allocate the pdps.
	 */
	ret = gen8_ppgtt_alloc_page_dirpointers(vm, pml4, start, length,
						new_pdps);
	if (ret)
		return ret;

	WARN(bitmap_weight(new_pdps, GEN8_PML4ES_PER_PML4) > 2,
	     "The allocation has spanned more than 512GB. "
	     "It is highly likely this is incorrect.");

1356
	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
		WARN_ON(!pdp);

		ret = gen8_alloc_va_range_3lvl(vm, pdp, start, length);
		if (ret)
			goto err_out;

		gen8_setup_page_directory_pointer(ppgtt, pml4, pdp, pml4e);
	}

	bitmap_or(pml4->used_pml4es, new_pdps, pml4->used_pml4es,
		  GEN8_PML4ES_PER_PML4);

	return 0;

err_out:
	for_each_set_bit(pml4e, new_pdps, GEN8_PML4ES_PER_PML4)
		gen8_ppgtt_cleanup_3lvl(vm->dev, pml4->pdps[pml4e]);

	return ret;
}

static int gen8_alloc_va_range(struct i915_address_space *vm,
			       uint64_t start, uint64_t length)
{
1381
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1382 1383 1384 1385 1386 1387 1388

	if (USES_FULL_48BIT_PPGTT(vm->dev))
		return gen8_alloc_va_range_4lvl(vm, &ppgtt->pml4, start, length);
	else
		return gen8_alloc_va_range_3lvl(vm, &ppgtt->pdp, start, length);
}

1389 1390 1391 1392 1393 1394 1395 1396
static void gen8_dump_pdp(struct i915_page_directory_pointer *pdp,
			  uint64_t start, uint64_t length,
			  gen8_pte_t scratch_pte,
			  struct seq_file *m)
{
	struct i915_page_directory *pd;
	uint32_t pdpe;

1397
	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
1398 1399 1400 1401 1402 1403 1404 1405 1406
		struct i915_page_table *pt;
		uint64_t pd_len = length;
		uint64_t pd_start = start;
		uint32_t pde;

		if (!test_bit(pdpe, pdp->used_pdpes))
			continue;

		seq_printf(m, "\tPDPE #%d\n", pdpe);
1407
		gen8_for_each_pde(pt, pd, pd_start, pd_len, pde) {
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
			uint32_t  pte;
			gen8_pte_t *pt_vaddr;

			if (!test_bit(pde, pd->used_pdes))
				continue;

			pt_vaddr = kmap_px(pt);
			for (pte = 0; pte < GEN8_PTES; pte += 4) {
				uint64_t va =
					(pdpe << GEN8_PDPE_SHIFT) |
					(pde << GEN8_PDE_SHIFT) |
					(pte << GEN8_PTE_SHIFT);
				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");
			}
			/* don't use kunmap_px, it could trigger
			 * an unnecessary flush.
			 */
			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;
	uint64_t start = ppgtt->base.start;
	uint64_t length = ppgtt->base.total;
1451
	gen8_pte_t scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
1452 1453 1454 1455 1456
						 I915_CACHE_LLC, true);

	if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
		gen8_dump_pdp(&ppgtt->pdp, start, length, scratch_pte, m);
	} else {
1457
		uint64_t pml4e;
1458 1459 1460
		struct i915_pml4 *pml4 = &ppgtt->pml4;
		struct i915_page_directory_pointer *pdp;

1461
		gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
1462 1463 1464 1465 1466 1467 1468 1469 1470
			if (!test_bit(pml4e, pml4->used_pml4es))
				continue;

			seq_printf(m, "    PML4E #%llu\n", pml4e);
			gen8_dump_pdp(pdp, start, length, scratch_pte, m);
		}
	}
}

1471 1472
static int gen8_preallocate_top_level_pdps(struct i915_hw_ppgtt *ppgtt)
{
1473
	unsigned long *new_page_dirs, *new_page_tables;
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492
	uint32_t pdpes = I915_PDPES_PER_PDP(dev);
	int ret;

	/* We allocate temp bitmap for page tables for no gain
	 * but as this is for init only, lets keep the things simple
	 */
	ret = alloc_gen8_temp_bitmaps(&new_page_dirs, &new_page_tables, pdpes);
	if (ret)
		return ret;

	/* Allocate for all pdps regardless of how the ppgtt
	 * was defined.
	 */
	ret = gen8_ppgtt_alloc_page_directories(&ppgtt->base, &ppgtt->pdp,
						0, 1ULL << 32,
						new_page_dirs);
	if (!ret)
		*ppgtt->pdp.used_pdpes = *new_page_dirs;

1493
	free_gen8_temp_bitmaps(new_page_dirs, new_page_tables);
1494 1495 1496 1497

	return ret;
}

1498
/*
1499 1500 1501 1502
 * 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 已提交
1503
 *
1504
 */
1505
static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
B
Ben Widawsky 已提交
1506
{
1507
	int ret;
1508

1509 1510 1511
	ret = gen8_init_scratch(&ppgtt->base);
	if (ret)
		return ret;
1512

1513 1514
	ppgtt->base.start = 0;
	ppgtt->base.cleanup = gen8_ppgtt_cleanup;
1515
	ppgtt->base.allocate_va_range = gen8_alloc_va_range;
1516
	ppgtt->base.insert_entries = gen8_ppgtt_insert_entries;
1517
	ppgtt->base.clear_range = gen8_ppgtt_clear_range;
1518 1519
	ppgtt->base.unbind_vma = ppgtt_unbind_vma;
	ppgtt->base.bind_vma = ppgtt_bind_vma;
1520
	ppgtt->debug_dump = gen8_dump_ppgtt;
1521

1522 1523 1524 1525
	if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
		ret = setup_px(ppgtt->base.dev, &ppgtt->pml4);
		if (ret)
			goto free_scratch;
1526

1527 1528
		gen8_initialize_pml4(&ppgtt->base, &ppgtt->pml4);

1529
		ppgtt->base.total = 1ULL << 48;
1530
		ppgtt->switch_mm = gen8_48b_mm_switch;
1531
	} else {
1532
		ret = __pdp_init(ppgtt->base.dev, &ppgtt->pdp);
1533 1534 1535 1536
		if (ret)
			goto free_scratch;

		ppgtt->base.total = 1ULL << 32;
1537
		ppgtt->switch_mm = gen8_legacy_mm_switch;
1538 1539 1540
		trace_i915_page_directory_pointer_entry_alloc(&ppgtt->base,
							      0, 0,
							      GEN8_PML4E_SHIFT);
1541

1542
		if (intel_vgpu_active(to_i915(ppgtt->base.dev))) {
1543 1544 1545 1546
			ret = gen8_preallocate_top_level_pdps(ppgtt);
			if (ret)
				goto free_scratch;
		}
1547
	}
1548

1549
	if (intel_vgpu_active(to_i915(ppgtt->base.dev)))
1550 1551
		gen8_ppgtt_notify_vgt(ppgtt, true);

1552
	return 0;
1553 1554 1555 1556

free_scratch:
	gen8_free_scratch(&ppgtt->base);
	return ret;
1557 1558
}

B
Ben Widawsky 已提交
1559 1560 1561
static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
{
	struct i915_address_space *vm = &ppgtt->base;
1562
	struct i915_page_table *unused;
1563
	gen6_pte_t scratch_pte;
B
Ben Widawsky 已提交
1564
	uint32_t pd_entry;
1565
	uint32_t  pte, pde;
1566
	uint32_t start = ppgtt->base.start, length = ppgtt->base.total;
B
Ben Widawsky 已提交
1567

1568
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1569
				     I915_CACHE_LLC, true, 0);
B
Ben Widawsky 已提交
1570

1571
	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde) {
B
Ben Widawsky 已提交
1572
		u32 expected;
1573
		gen6_pte_t *pt_vaddr;
1574
		const dma_addr_t pt_addr = px_dma(ppgtt->pd.page_table[pde]);
1575
		pd_entry = readl(ppgtt->pd_addr + pde);
B
Ben Widawsky 已提交
1576 1577 1578 1579 1580 1581 1582 1583 1584
		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);

1585 1586
		pt_vaddr = kmap_px(ppgtt->pd.page_table[pde]);

1587
		for (pte = 0; pte < GEN6_PTES; pte+=4) {
B
Ben Widawsky 已提交
1588
			unsigned long va =
1589
				(pde * PAGE_SIZE * GEN6_PTES) +
B
Ben Widawsky 已提交
1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607
				(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");
		}
1608
		kunmap_px(ppgtt, pt_vaddr);
B
Ben Widawsky 已提交
1609 1610 1611
	}
}

1612
/* Write pde (index) from the page directory @pd to the page table @pt */
1613 1614
static void gen6_write_pde(struct i915_page_directory *pd,
			    const int pde, struct i915_page_table *pt)
B
Ben Widawsky 已提交
1615
{
1616 1617 1618 1619
	/* Caller needs to make sure the write completes if necessary */
	struct i915_hw_ppgtt *ppgtt =
		container_of(pd, struct i915_hw_ppgtt, pd);
	u32 pd_entry;
B
Ben Widawsky 已提交
1620

1621
	pd_entry = GEN6_PDE_ADDR_ENCODE(px_dma(pt));
1622
	pd_entry |= GEN6_PDE_VALID;
B
Ben Widawsky 已提交
1623

1624 1625
	writel(pd_entry, ppgtt->pd_addr + pde);
}
B
Ben Widawsky 已提交
1626

1627 1628 1629
/* Write all the page tables found in the ppgtt structure to incrementing page
 * directories. */
static void gen6_write_page_range(struct drm_i915_private *dev_priv,
1630
				  struct i915_page_directory *pd,
1631 1632
				  uint32_t start, uint32_t length)
{
1633
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
1634
	struct i915_page_table *pt;
1635
	uint32_t pde;
1636

1637
	gen6_for_each_pde(pt, pd, start, length, pde)
1638 1639 1640 1641
		gen6_write_pde(pd, pde, pt);

	/* Make sure write is complete before other code can use this page
	 * table. Also require for WC mapped PTEs */
1642
	readl(ggtt->gsm);
B
Ben Widawsky 已提交
1643 1644
}

1645
static uint32_t get_pd_offset(struct i915_hw_ppgtt *ppgtt)
B
Ben Widawsky 已提交
1646
{
1647
	BUG_ON(ppgtt->pd.base.ggtt_offset & 0x3f);
1648

1649
	return (ppgtt->pd.base.ggtt_offset / 64) << 16;
1650 1651
}

1652
static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
1653
			 struct drm_i915_gem_request *req)
1654
{
1655
	struct intel_ring *ring = req->ring;
1656
	struct intel_engine_cs *engine = req->engine;
1657 1658 1659
	int ret;

	/* NB: TLBs must be flushed and invalidated before a switch */
1660
	ret = engine->emit_flush(req, EMIT_INVALIDATE | EMIT_FLUSH);
1661 1662 1663
	if (ret)
		return ret;

1664
	ret = intel_ring_begin(req, 6);
1665 1666 1667
	if (ret)
		return ret;

1668 1669 1670 1671 1672 1673 1674
	intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
	intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(engine));
	intel_ring_emit(ring, PP_DIR_DCLV_2G);
	intel_ring_emit_reg(ring, RING_PP_DIR_BASE(engine));
	intel_ring_emit(ring, get_pd_offset(ppgtt));
	intel_ring_emit(ring, MI_NOOP);
	intel_ring_advance(ring);
1675 1676 1677 1678

	return 0;
}

1679
static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
1680
			  struct drm_i915_gem_request *req)
1681
{
1682
	struct intel_ring *ring = req->ring;
1683
	struct intel_engine_cs *engine = req->engine;
1684 1685 1686
	int ret;

	/* NB: TLBs must be flushed and invalidated before a switch */
1687
	ret = engine->emit_flush(req, EMIT_INVALIDATE | EMIT_FLUSH);
1688 1689 1690
	if (ret)
		return ret;

1691
	ret = intel_ring_begin(req, 6);
1692 1693 1694
	if (ret)
		return ret;

1695 1696 1697 1698 1699 1700 1701
	intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
	intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(engine));
	intel_ring_emit(ring, PP_DIR_DCLV_2G);
	intel_ring_emit_reg(ring, RING_PP_DIR_BASE(engine));
	intel_ring_emit(ring, get_pd_offset(ppgtt));
	intel_ring_emit(ring, MI_NOOP);
	intel_ring_advance(ring);
1702

1703
	/* XXX: RCS is the only one to auto invalidate the TLBs? */
1704
	if (engine->id != RCS) {
1705
		ret = engine->emit_flush(req, EMIT_INVALIDATE | EMIT_FLUSH);
1706 1707 1708 1709
		if (ret)
			return ret;
	}

1710 1711 1712
	return 0;
}

1713
static int gen6_mm_switch(struct i915_hw_ppgtt *ppgtt,
1714
			  struct drm_i915_gem_request *req)
1715
{
1716
	struct intel_engine_cs *engine = req->engine;
1717
	struct drm_i915_private *dev_priv = req->i915;
1718

1719 1720
	I915_WRITE(RING_PP_DIR_DCLV(engine), PP_DIR_DCLV_2G);
	I915_WRITE(RING_PP_DIR_BASE(engine), get_pd_offset(ppgtt));
1721 1722 1723
	return 0;
}

1724
static void gen8_ppgtt_enable(struct drm_device *dev)
1725
{
1726
	struct drm_i915_private *dev_priv = to_i915(dev);
1727
	struct intel_engine_cs *engine;
B
Ben Widawsky 已提交
1728

1729
	for_each_engine(engine, dev_priv) {
1730
		u32 four_level = USES_FULL_48BIT_PPGTT(dev) ? GEN8_GFX_PPGTT_48B : 0;
1731
		I915_WRITE(RING_MODE_GEN7(engine),
1732
			   _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE | four_level));
1733 1734
	}
}
B
Ben Widawsky 已提交
1735

1736
static void gen7_ppgtt_enable(struct drm_device *dev)
B
Ben Widawsky 已提交
1737
{
1738
	struct drm_i915_private *dev_priv = to_i915(dev);
1739
	struct intel_engine_cs *engine;
1740
	uint32_t ecochk, ecobits;
B
Ben Widawsky 已提交
1741

1742 1743
	ecobits = I915_READ(GAC_ECO_BITS);
	I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_PPGTT_CACHE64B);
1744

1745 1746 1747 1748 1749 1750 1751 1752
	ecochk = I915_READ(GAM_ECOCHK);
	if (IS_HASWELL(dev)) {
		ecochk |= ECOCHK_PPGTT_WB_HSW;
	} else {
		ecochk |= ECOCHK_PPGTT_LLC_IVB;
		ecochk &= ~ECOCHK_PPGTT_GFDT_IVB;
	}
	I915_WRITE(GAM_ECOCHK, ecochk);
1753

1754
	for_each_engine(engine, dev_priv) {
B
Ben Widawsky 已提交
1755
		/* GFX_MODE is per-ring on gen7+ */
1756
		I915_WRITE(RING_MODE_GEN7(engine),
1757
			   _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
B
Ben Widawsky 已提交
1758
	}
1759
}
B
Ben Widawsky 已提交
1760

1761
static void gen6_ppgtt_enable(struct drm_device *dev)
1762
{
1763
	struct drm_i915_private *dev_priv = to_i915(dev);
1764
	uint32_t ecochk, gab_ctl, ecobits;
1765

1766 1767 1768
	ecobits = I915_READ(GAC_ECO_BITS);
	I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_SNB_BIT |
		   ECOBITS_PPGTT_CACHE64B);
B
Ben Widawsky 已提交
1769

1770 1771 1772 1773 1774 1775 1776
	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 已提交
1777 1778
}

1779
/* PPGTT support for Sandybdrige/Gen6 and later */
1780
static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
1781 1782
				   uint64_t start,
				   uint64_t length,
1783
				   bool use_scratch)
1784
{
1785
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1786
	gen6_pte_t *pt_vaddr, scratch_pte;
1787 1788
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
1789 1790
	unsigned act_pt = first_entry / GEN6_PTES;
	unsigned first_pte = first_entry % GEN6_PTES;
1791
	unsigned last_pte, i;
1792

1793
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1794
				     I915_CACHE_LLC, true, 0);
1795

1796 1797
	while (num_entries) {
		last_pte = first_pte + num_entries;
1798 1799
		if (last_pte > GEN6_PTES)
			last_pte = GEN6_PTES;
1800

1801
		pt_vaddr = kmap_px(ppgtt->pd.page_table[act_pt]);
1802

1803 1804
		for (i = first_pte; i < last_pte; i++)
			pt_vaddr[i] = scratch_pte;
1805

1806
		kunmap_px(ppgtt, pt_vaddr);
1807

1808 1809
		num_entries -= last_pte - first_pte;
		first_pte = 0;
1810
		act_pt++;
1811
	}
1812 1813
}

1814
static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
D
Daniel Vetter 已提交
1815
				      struct sg_table *pages,
1816
				      uint64_t start,
1817
				      enum i915_cache_level cache_level, u32 flags)
D
Daniel Vetter 已提交
1818
{
1819
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1820
	unsigned first_entry = start >> PAGE_SHIFT;
1821 1822
	unsigned act_pt = first_entry / GEN6_PTES;
	unsigned act_pte = first_entry % GEN6_PTES;
1823 1824 1825
	gen6_pte_t *pt_vaddr = NULL;
	struct sgt_iter sgt_iter;
	dma_addr_t addr;
1826

1827
	for_each_sgt_dma(addr, sgt_iter, pages) {
1828
		if (pt_vaddr == NULL)
1829
			pt_vaddr = kmap_px(ppgtt->pd.page_table[act_pt]);
1830

1831
		pt_vaddr[act_pte] =
1832
			vm->pte_encode(addr, cache_level, true, flags);
1833

1834
		if (++act_pte == GEN6_PTES) {
1835
			kunmap_px(ppgtt, pt_vaddr);
1836
			pt_vaddr = NULL;
1837
			act_pt++;
1838
			act_pte = 0;
D
Daniel Vetter 已提交
1839 1840
		}
	}
1841

1842
	if (pt_vaddr)
1843
		kunmap_px(ppgtt, pt_vaddr);
D
Daniel Vetter 已提交
1844 1845
}

1846
static int gen6_alloc_va_range(struct i915_address_space *vm,
1847
			       uint64_t start_in, uint64_t length_in)
1848
{
1849 1850
	DECLARE_BITMAP(new_page_tables, I915_PDES);
	struct drm_device *dev = vm->dev;
1851 1852
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
1853
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1854
	struct i915_page_table *pt;
1855
	uint32_t start, length, start_save, length_save;
1856
	uint32_t pde;
1857 1858
	int ret;

1859 1860 1861 1862 1863
	if (WARN_ON(start_in + length_in > ppgtt->base.total))
		return -ENODEV;

	start = start_save = start_in;
	length = length_save = length_in;
1864 1865 1866 1867 1868 1869 1870 1871

	bitmap_zero(new_page_tables, I915_PDES);

	/* The allocation is done in two stages so that we can bail out with
	 * minimal amount of pain. The first stage finds new page tables that
	 * need allocation. The second stage marks use ptes within the page
	 * tables.
	 */
1872
	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde) {
1873
		if (pt != vm->scratch_pt) {
1874 1875 1876 1877 1878 1879 1880
			WARN_ON(bitmap_empty(pt->used_ptes, GEN6_PTES));
			continue;
		}

		/* We've already allocated a page table */
		WARN_ON(!bitmap_empty(pt->used_ptes, GEN6_PTES));

1881
		pt = alloc_pt(dev);
1882 1883 1884 1885 1886 1887 1888 1889
		if (IS_ERR(pt)) {
			ret = PTR_ERR(pt);
			goto unwind_out;
		}

		gen6_initialize_pt(vm, pt);

		ppgtt->pd.page_table[pde] = pt;
1890
		__set_bit(pde, new_page_tables);
1891
		trace_i915_page_table_entry_alloc(vm, pde, start, GEN6_PDE_SHIFT);
1892 1893 1894 1895
	}

	start = start_save;
	length = length_save;
1896

1897
	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde) {
1898 1899 1900 1901 1902 1903
		DECLARE_BITMAP(tmp_bitmap, GEN6_PTES);

		bitmap_zero(tmp_bitmap, GEN6_PTES);
		bitmap_set(tmp_bitmap, gen6_pte_index(start),
			   gen6_pte_count(start, length));

1904
		if (__test_and_clear_bit(pde, new_page_tables))
1905 1906
			gen6_write_pde(&ppgtt->pd, pde, pt);

1907 1908 1909 1910
		trace_i915_page_table_entry_map(vm, pde, pt,
					 gen6_pte_index(start),
					 gen6_pte_count(start, length),
					 GEN6_PTES);
1911
		bitmap_or(pt->used_ptes, tmp_bitmap, pt->used_ptes,
1912 1913 1914
				GEN6_PTES);
	}

1915 1916 1917 1918
	WARN_ON(!bitmap_empty(new_page_tables, I915_PDES));

	/* Make sure write is complete before other code can use this page
	 * table. Also require for WC mapped PTEs */
1919
	readl(ggtt->gsm);
1920

1921
	mark_tlbs_dirty(ppgtt);
1922
	return 0;
1923 1924 1925

unwind_out:
	for_each_set_bit(pde, new_page_tables, I915_PDES) {
1926
		struct i915_page_table *pt = ppgtt->pd.page_table[pde];
1927

1928
		ppgtt->pd.page_table[pde] = vm->scratch_pt;
1929
		free_pt(vm->dev, pt);
1930 1931 1932 1933
	}

	mark_tlbs_dirty(ppgtt);
	return ret;
1934 1935
}

1936 1937 1938
static int gen6_init_scratch(struct i915_address_space *vm)
{
	struct drm_device *dev = vm->dev;
1939
	int ret;
1940

1941
	ret = setup_scratch_page(dev, &vm->scratch_page, I915_GFP_DMA);
1942 1943
	if (ret)
		return ret;
1944 1945 1946

	vm->scratch_pt = alloc_pt(dev);
	if (IS_ERR(vm->scratch_pt)) {
1947
		cleanup_scratch_page(dev, &vm->scratch_page);
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
		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)
{
	struct drm_device *dev = vm->dev;

	free_pt(dev, vm->scratch_pt);
1961
	cleanup_scratch_page(dev, &vm->scratch_page);
1962 1963
}

1964
static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
1965
{
1966
	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
1967 1968
	struct i915_page_directory *pd = &ppgtt->pd;
	struct drm_device *dev = vm->dev;
1969 1970
	struct i915_page_table *pt;
	uint32_t pde;
1971

1972 1973
	drm_mm_remove_node(&ppgtt->node);

1974
	gen6_for_all_pdes(pt, pd, pde)
1975
		if (pt != vm->scratch_pt)
1976
			free_pt(dev, pt);
1977

1978
	gen6_free_scratch(vm);
1979 1980
}

1981
static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
1982
{
1983
	struct i915_address_space *vm = &ppgtt->base;
1984
	struct drm_device *dev = ppgtt->base.dev;
1985 1986
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
1987
	bool retried = false;
1988
	int ret;
1989

B
Ben Widawsky 已提交
1990 1991 1992 1993
	/* 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.
	 */
1994
	BUG_ON(!drm_mm_initialized(&ggtt->base.mm));
1995

1996 1997 1998
	ret = gen6_init_scratch(vm);
	if (ret)
		return ret;
1999

2000
alloc:
2001
	ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
B
Ben Widawsky 已提交
2002 2003
						  &ppgtt->node, GEN6_PD_SIZE,
						  GEN6_PD_ALIGN, 0,
2004
						  0, ggtt->base.total,
2005
						  DRM_MM_TOPDOWN);
2006
	if (ret == -ENOSPC && !retried) {
2007
		ret = i915_gem_evict_something(&ggtt->base,
2008
					       GEN6_PD_SIZE, GEN6_PD_ALIGN,
2009
					       I915_CACHE_NONE,
2010
					       0, ggtt->base.total,
2011
					       0);
2012
		if (ret)
2013
			goto err_out;
2014 2015 2016 2017

		retried = true;
		goto alloc;
	}
B
Ben Widawsky 已提交
2018

2019
	if (ret)
2020 2021
		goto err_out;

2022

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

2026
	return 0;
2027 2028

err_out:
2029
	gen6_free_scratch(vm);
2030
	return ret;
2031 2032 2033 2034
}

static int gen6_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt)
{
2035
	return gen6_ppgtt_allocate_page_directories(ppgtt);
2036
}
2037

2038 2039 2040
static void gen6_scratch_va_range(struct i915_hw_ppgtt *ppgtt,
				  uint64_t start, uint64_t length)
{
2041
	struct i915_page_table *unused;
2042
	uint32_t pde;
2043

2044
	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde)
2045
		ppgtt->pd.page_table[pde] = ppgtt->base.scratch_pt;
2046 2047
}

2048
static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
2049 2050
{
	struct drm_device *dev = ppgtt->base.dev;
2051 2052
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2053 2054
	int ret;

2055
	ppgtt->base.pte_encode = ggtt->base.pte_encode;
2056
	if (intel_vgpu_active(dev_priv) || IS_GEN6(dev))
2057
		ppgtt->switch_mm = gen6_mm_switch;
2058
	else if (IS_HASWELL(dev))
2059
		ppgtt->switch_mm = hsw_mm_switch;
2060
	else if (IS_GEN7(dev))
2061
		ppgtt->switch_mm = gen7_mm_switch;
2062
	else
2063 2064 2065 2066 2067 2068
		BUG();

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

2069
	ppgtt->base.allocate_va_range = gen6_alloc_va_range;
2070 2071
	ppgtt->base.clear_range = gen6_ppgtt_clear_range;
	ppgtt->base.insert_entries = gen6_ppgtt_insert_entries;
2072 2073
	ppgtt->base.unbind_vma = ppgtt_unbind_vma;
	ppgtt->base.bind_vma = ppgtt_bind_vma;
2074 2075
	ppgtt->base.cleanup = gen6_ppgtt_cleanup;
	ppgtt->base.start = 0;
2076
	ppgtt->base.total = I915_PDES * GEN6_PTES * PAGE_SIZE;
B
Ben Widawsky 已提交
2077
	ppgtt->debug_dump = gen6_dump_ppgtt;
2078

2079
	ppgtt->pd.base.ggtt_offset =
2080
		ppgtt->node.start / PAGE_SIZE * sizeof(gen6_pte_t);
2081

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

2085
	gen6_scratch_va_range(ppgtt, 0, ppgtt->base.total);
2086

2087 2088
	gen6_write_page_range(dev_priv, &ppgtt->pd, 0, ppgtt->base.total);

2089
	DRM_DEBUG_DRIVER("Allocated pde space (%lldM) at GTT entry: %llx\n",
2090 2091
			 ppgtt->node.size >> 20,
			 ppgtt->node.start / PAGE_SIZE);
2092

2093
	DRM_DEBUG("Adding PPGTT at offset %x\n",
2094
		  ppgtt->pd.base.ggtt_offset << 10);
2095

2096
	return 0;
2097 2098
}

2099 2100
static int __hw_ppgtt_init(struct i915_hw_ppgtt *ppgtt,
			   struct drm_i915_private *dev_priv)
2101
{
2102
	ppgtt->base.dev = &dev_priv->drm;
2103

2104
	if (INTEL_INFO(dev_priv)->gen < 8)
2105
		return gen6_ppgtt_init(ppgtt);
B
Ben Widawsky 已提交
2106
	else
2107
		return gen8_ppgtt_init(ppgtt);
2108
}
2109

2110 2111 2112 2113 2114 2115
static void i915_address_space_init(struct i915_address_space *vm,
				    struct drm_i915_private *dev_priv)
{
	drm_mm_init(&vm->mm, vm->start, vm->total);
	INIT_LIST_HEAD(&vm->active_list);
	INIT_LIST_HEAD(&vm->inactive_list);
2116
	INIT_LIST_HEAD(&vm->unbound_list);
2117 2118 2119
	list_add_tail(&vm->global_link, &dev_priv->vm_list);
}

2120 2121
static void gtt_write_workarounds(struct drm_device *dev)
{
2122
	struct drm_i915_private *dev_priv = to_i915(dev);
2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138

	/* 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.
	 */
	/* WaIncreaseDefaultTLBEntries:chv,bdw,skl,bxt */
	if (IS_BROADWELL(dev))
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_BDW);
	else if (IS_CHERRYVIEW(dev))
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN8_L3_LRA_1_GPGPU_DEFAULT_VALUE_CHV);
	else if (IS_SKYLAKE(dev))
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN9_L3_LRA_1_GPGPU_DEFAULT_VALUE_SKL);
	else if (IS_BROXTON(dev))
		I915_WRITE(GEN8_L3_LRA_1_GPGPU, GEN9_L3_LRA_1_GPGPU_DEFAULT_VALUE_BXT);
}

2139 2140 2141
static int i915_ppgtt_init(struct i915_hw_ppgtt *ppgtt,
			   struct drm_i915_private *dev_priv,
			   struct drm_i915_file_private *file_priv)
2142
{
2143
	int ret;
B
Ben Widawsky 已提交
2144

2145
	ret = __hw_ppgtt_init(ppgtt, dev_priv);
2146
	if (ret == 0) {
B
Ben Widawsky 已提交
2147
		kref_init(&ppgtt->ref);
2148
		i915_address_space_init(&ppgtt->base, dev_priv);
2149
		ppgtt->base.file = file_priv;
2150
	}
2151 2152 2153 2154

	return ret;
}

2155 2156
int i915_ppgtt_init_hw(struct drm_device *dev)
{
2157 2158
	gtt_write_workarounds(dev);

2159 2160 2161 2162 2163 2164
	/* 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;

2165 2166 2167 2168 2169 2170 2171 2172 2173 2174
	if (!USES_PPGTT(dev))
		return 0;

	if (IS_GEN6(dev))
		gen6_ppgtt_enable(dev);
	else if (IS_GEN7(dev))
		gen7_ppgtt_enable(dev);
	else if (INTEL_INFO(dev)->gen >= 8)
		gen8_ppgtt_enable(dev);
	else
2175
		MISSING_CASE(INTEL_INFO(dev)->gen);
2176

2177 2178
	return 0;
}
2179

2180
struct i915_hw_ppgtt *
2181 2182
i915_ppgtt_create(struct drm_i915_private *dev_priv,
		  struct drm_i915_file_private *fpriv)
2183 2184 2185 2186 2187 2188 2189 2190
{
	struct i915_hw_ppgtt *ppgtt;
	int ret;

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

2191
	ret = i915_ppgtt_init(ppgtt, dev_priv, fpriv);
2192 2193 2194 2195 2196
	if (ret) {
		kfree(ppgtt);
		return ERR_PTR(ret);
	}

2197 2198
	trace_i915_ppgtt_create(&ppgtt->base);

2199 2200 2201
	return ppgtt;
}

2202 2203 2204 2205 2206
void  i915_ppgtt_release(struct kref *kref)
{
	struct i915_hw_ppgtt *ppgtt =
		container_of(kref, struct i915_hw_ppgtt, ref);

2207 2208
	trace_i915_ppgtt_release(&ppgtt->base);

2209
	/* vmas should already be unbound and destroyed */
2210 2211
	WARN_ON(!list_empty(&ppgtt->base.active_list));
	WARN_ON(!list_empty(&ppgtt->base.inactive_list));
2212
	WARN_ON(!list_empty(&ppgtt->base.unbound_list));
2213

2214 2215 2216
	list_del(&ppgtt->base.global_link);
	drm_mm_takedown(&ppgtt->base.mm);

2217 2218 2219
	ppgtt->base.cleanup(&ppgtt->base);
	kfree(ppgtt);
}
2220

2221 2222 2223
/* Certain Gen5 chipsets require require idling the GPU before
 * unmapping anything from the GTT when VT-d is enabled.
 */
2224
static bool needs_idle_maps(struct drm_i915_private *dev_priv)
2225 2226 2227 2228 2229
{
#ifdef CONFIG_INTEL_IOMMU
	/* Query intel_iommu to see if we need the workaround. Presumably that
	 * was loaded first.
	 */
2230
	if (IS_GEN5(dev_priv) && IS_MOBILE(dev_priv) && intel_iommu_gfx_mapped)
2231 2232 2233 2234 2235
		return true;
#endif
	return false;
}

2236
void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
2237
{
2238
	struct intel_engine_cs *engine;
2239

2240
	if (INTEL_INFO(dev_priv)->gen < 6)
2241 2242
		return;

2243
	for_each_engine(engine, dev_priv) {
2244
		u32 fault_reg;
2245
		fault_reg = I915_READ(RING_FAULT_REG(engine));
2246 2247
		if (fault_reg & RING_FAULT_VALID) {
			DRM_DEBUG_DRIVER("Unexpected fault\n"
2248
					 "\tAddr: 0x%08lx\n"
2249 2250 2251 2252 2253 2254 2255
					 "\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));
2256
			I915_WRITE(RING_FAULT_REG(engine),
2257 2258 2259
				   fault_reg & ~RING_FAULT_VALID);
		}
	}
2260
	POSTING_READ(RING_FAULT_REG(&dev_priv->engine[RCS]));
2261 2262
}

2263 2264
static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
{
2265
	if (INTEL_INFO(dev_priv)->gen < 6) {
2266 2267 2268 2269 2270 2271 2272
		intel_gtt_chipset_flush();
	} else {
		I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
		POSTING_READ(GFX_FLSH_CNTL_GEN6);
	}
}

2273 2274
void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
{
2275 2276
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2277 2278 2279 2280 2281 2282 2283

	/* Don't bother messing with faults pre GEN6 as we have little
	 * documentation supporting that it's a good idea.
	 */
	if (INTEL_INFO(dev)->gen < 6)
		return;

2284
	i915_check_and_clear_faults(dev_priv);
2285

2286 2287
	ggtt->base.clear_range(&ggtt->base, ggtt->base.start, ggtt->base.total,
			     true);
2288 2289

	i915_ggtt_flush(dev_priv);
2290 2291
}

2292
int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
2293
{
2294 2295 2296 2297 2298 2299
	if (!dma_map_sg(&obj->base.dev->pdev->dev,
			obj->pages->sgl, obj->pages->nents,
			PCI_DMA_BIDIRECTIONAL))
		return -ENOSPC;

	return 0;
2300 2301
}

2302
static void gen8_set_pte(void __iomem *addr, gen8_pte_t pte)
B
Ben Widawsky 已提交
2303 2304 2305 2306 2307 2308 2309 2310 2311
{
#ifdef writeq
	writeq(pte, addr);
#else
	iowrite32((u32)pte, addr);
	iowrite32(pte >> 32, addr + 4);
#endif
}

2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333
static void gen8_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
				  uint64_t offset,
				  enum i915_cache_level level,
				  u32 unused)
{
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
	gen8_pte_t __iomem *pte =
		(gen8_pte_t __iomem *)dev_priv->ggtt.gsm +
		(offset >> PAGE_SHIFT);
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);

	gen8_set_pte(pte, gen8_pte_encode(addr, level, true));

	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
	POSTING_READ(GFX_FLSH_CNTL_GEN6);

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
}

B
Ben Widawsky 已提交
2334 2335
static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
				     struct sg_table *st,
2336
				     uint64_t start,
2337
				     enum i915_cache_level level, u32 unused)
B
Ben Widawsky 已提交
2338
{
2339
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2340
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2341 2342 2343 2344
	struct sgt_iter sgt_iter;
	gen8_pte_t __iomem *gtt_entries;
	gen8_pte_t gtt_entry;
	dma_addr_t addr;
2345
	int rpm_atomic_seq;
2346
	int i = 0;
2347 2348

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
B
Ben Widawsky 已提交
2349

2350 2351 2352 2353 2354
	gtt_entries = (gen8_pte_t __iomem *)ggtt->gsm + (start >> PAGE_SHIFT);

	for_each_sgt_dma(addr, sgt_iter, st) {
		gtt_entry = gen8_pte_encode(addr, level, true);
		gen8_set_pte(&gtt_entries[i++], gtt_entry);
B
Ben Widawsky 已提交
2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
	}

	/*
	 * XXX: This serves as a posting read to make sure that the PTE has
	 * actually been updated. There is some concern that even though
	 * registers and PTEs are within the same BAR that they are potentially
	 * of NUMA access patterns. Therefore, even with the way we assume
	 * hardware should work, we must keep this posting read for paranoia.
	 */
	if (i != 0)
2365
		WARN_ON(readq(&gtt_entries[i-1]) != gtt_entry);
B
Ben Widawsky 已提交
2366 2367 2368 2369 2370 2371 2372

	/* 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.
	 */
	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
	POSTING_READ(GFX_FLSH_CNTL_GEN6);
2373 2374

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
B
Ben Widawsky 已提交
2375 2376
}

2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402
struct insert_entries {
	struct i915_address_space *vm;
	struct sg_table *st;
	uint64_t start;
	enum i915_cache_level level;
	u32 flags;
};

static int gen8_ggtt_insert_entries__cb(void *_arg)
{
	struct insert_entries *arg = _arg;
	gen8_ggtt_insert_entries(arg->vm, arg->st,
				 arg->start, arg->level, arg->flags);
	return 0;
}

static void gen8_ggtt_insert_entries__BKL(struct i915_address_space *vm,
					  struct sg_table *st,
					  uint64_t start,
					  enum i915_cache_level level,
					  u32 flags)
{
	struct insert_entries arg = { vm, st, start, level, flags };
	stop_machine(gen8_ggtt_insert_entries__cb, &arg, NULL);
}

2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424
static void gen6_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
				  uint64_t offset,
				  enum i915_cache_level level,
				  u32 flags)
{
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
	gen6_pte_t __iomem *pte =
		(gen6_pte_t __iomem *)dev_priv->ggtt.gsm +
		(offset >> PAGE_SHIFT);
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);

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

	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
	POSTING_READ(GFX_FLSH_CNTL_GEN6);

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
}

2425 2426 2427 2428 2429 2430
/*
 * 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).
 */
2431
static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
2432
				     struct sg_table *st,
2433
				     uint64_t start,
2434
				     enum i915_cache_level level, u32 flags)
2435
{
2436
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2437
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2438 2439 2440 2441
	struct sgt_iter sgt_iter;
	gen6_pte_t __iomem *gtt_entries;
	gen6_pte_t gtt_entry;
	dma_addr_t addr;
2442
	int rpm_atomic_seq;
2443
	int i = 0;
2444 2445

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2446

2447 2448 2449 2450 2451
	gtt_entries = (gen6_pte_t __iomem *)ggtt->gsm + (start >> PAGE_SHIFT);

	for_each_sgt_dma(addr, sgt_iter, st) {
		gtt_entry = vm->pte_encode(addr, level, true, flags);
		iowrite32(gtt_entry, &gtt_entries[i++]);
2452 2453 2454 2455 2456 2457 2458 2459
	}

	/* XXX: This serves as a posting read to make sure that the PTE has
	 * actually been updated. There is some concern that even though
	 * registers and PTEs are within the same BAR that they are potentially
	 * of NUMA access patterns. Therefore, even with the way we assume
	 * hardware should work, we must keep this posting read for paranoia.
	 */
2460 2461
	if (i != 0)
		WARN_ON(readl(&gtt_entries[i-1]) != gtt_entry);
2462 2463 2464 2465 2466 2467 2468

	/* 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.
	 */
	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
	POSTING_READ(GFX_FLSH_CNTL_GEN6);
2469 2470

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2471 2472
}

2473 2474 2475 2476 2477 2478 2479
static void nop_clear_range(struct i915_address_space *vm,
			    uint64_t start,
			    uint64_t length,
			    bool use_scratch)
{
}

B
Ben Widawsky 已提交
2480
static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2481 2482
				  uint64_t start,
				  uint64_t length,
B
Ben Widawsky 已提交
2483 2484
				  bool use_scratch)
{
2485
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2486
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2487 2488
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
2489
	gen8_pte_t scratch_pte, __iomem *gtt_base =
2490 2491
		(gen8_pte_t __iomem *)ggtt->gsm + first_entry;
	const int max_entries = ggtt_total_entries(ggtt) - first_entry;
B
Ben Widawsky 已提交
2492
	int i;
2493 2494 2495
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
B
Ben Widawsky 已提交
2496 2497 2498 2499 2500 2501

	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;

2502
	scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
B
Ben Widawsky 已提交
2503 2504 2505 2506 2507
				      I915_CACHE_LLC,
				      use_scratch);
	for (i = 0; i < num_entries; i++)
		gen8_set_pte(&gtt_base[i], scratch_pte);
	readl(gtt_base);
2508 2509

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
B
Ben Widawsky 已提交
2510 2511
}

2512
static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2513 2514
				  uint64_t start,
				  uint64_t length,
2515
				  bool use_scratch)
2516
{
2517
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2518
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2519 2520
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
2521
	gen6_pte_t scratch_pte, __iomem *gtt_base =
2522 2523
		(gen6_pte_t __iomem *)ggtt->gsm + first_entry;
	const int max_entries = ggtt_total_entries(ggtt) - first_entry;
2524
	int i;
2525 2526 2527
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2528 2529 2530 2531 2532 2533

	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;

2534
	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
2535
				     I915_CACHE_LLC, use_scratch, 0);
2536

2537 2538 2539
	for (i = 0; i < num_entries; i++)
		iowrite32(scratch_pte, &gtt_base[i]);
	readl(gtt_base);
2540 2541

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2542 2543
}

2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561
static void i915_ggtt_insert_page(struct i915_address_space *vm,
				  dma_addr_t addr,
				  uint64_t offset,
				  enum i915_cache_level cache_level,
				  u32 unused)
{
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
	unsigned int flags = (cache_level == I915_CACHE_NONE) ?
		AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY;
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);

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

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
}

2562 2563 2564 2565
static void i915_ggtt_insert_entries(struct i915_address_space *vm,
				     struct sg_table *pages,
				     uint64_t start,
				     enum i915_cache_level cache_level, u32 unused)
2566
{
2567
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2568 2569
	unsigned int flags = (cache_level == I915_CACHE_NONE) ?
		AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY;
2570 2571 2572
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2573

2574
	intel_gtt_insert_sg_entries(pages, start >> PAGE_SHIFT, flags);
2575

2576 2577
	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);

2578 2579
}

2580
static void i915_ggtt_clear_range(struct i915_address_space *vm,
2581 2582
				  uint64_t start,
				  uint64_t length,
2583
				  bool unused)
2584
{
2585
	struct drm_i915_private *dev_priv = to_i915(vm->dev);
2586 2587
	unsigned first_entry = start >> PAGE_SHIFT;
	unsigned num_entries = length >> PAGE_SHIFT;
2588 2589 2590 2591
	int rpm_atomic_seq;

	rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);

2592
	intel_gtt_clear_range(first_entry, num_entries);
2593 2594

	assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2595 2596
}

2597 2598 2599
static int ggtt_bind_vma(struct i915_vma *vma,
			 enum i915_cache_level cache_level,
			 u32 flags)
2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612
{
	struct drm_i915_gem_object *obj = vma->obj;
	u32 pte_flags = 0;
	int ret;

	ret = i915_get_ggtt_vma_pages(vma);
	if (ret)
		return ret;

	/* Currently applicable only to VLV */
	if (obj->gt_ro)
		pte_flags |= PTE_READ_ONLY;

2613
	vma->vm->insert_entries(vma->vm, vma->pages, vma->node.start,
2614 2615 2616 2617 2618 2619 2620
				cache_level, pte_flags);

	/*
	 * 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.
	 */
2621
	vma->flags |= I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
2622 2623 2624 2625 2626 2627 2628

	return 0;
}

static int aliasing_gtt_bind_vma(struct i915_vma *vma,
				 enum i915_cache_level cache_level,
				 u32 flags)
2629
{
2630
	u32 pte_flags;
2631 2632 2633 2634 2635
	int ret;

	ret = i915_get_ggtt_vma_pages(vma);
	if (ret)
		return ret;
2636

2637
	/* Currently applicable only to VLV */
2638 2639
	pte_flags = 0;
	if (vma->obj->gt_ro)
2640
		pte_flags |= PTE_READ_ONLY;
2641

2642

2643
	if (flags & I915_VMA_GLOBAL_BIND) {
2644
		vma->vm->insert_entries(vma->vm,
2645
					vma->pages, vma->node.start,
2646
					cache_level, pte_flags);
2647
	}
2648

2649
	if (flags & I915_VMA_LOCAL_BIND) {
2650 2651 2652
		struct i915_hw_ppgtt *appgtt =
			to_i915(vma->vm->dev)->mm.aliasing_ppgtt;
		appgtt->base.insert_entries(&appgtt->base,
2653
					    vma->pages, vma->node.start,
2654
					    cache_level, pte_flags);
2655
	}
2656 2657

	return 0;
2658 2659
}

2660
static void ggtt_unbind_vma(struct i915_vma *vma)
2661
{
2662 2663
	struct i915_hw_ppgtt *appgtt = to_i915(vma->vm->dev)->mm.aliasing_ppgtt;
	const u64 size = min(vma->size, vma->node.size);
2664

2665
	if (vma->flags & I915_VMA_GLOBAL_BIND)
2666
		vma->vm->clear_range(vma->vm,
2667
				     vma->node.start, size,
2668
				     true);
2669

2670
	if (vma->flags & I915_VMA_LOCAL_BIND && appgtt)
2671
		appgtt->base.clear_range(&appgtt->base,
2672
					 vma->node.start, size,
2673
					 true);
2674 2675 2676
}

void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj)
2677
{
D
David Weinehall 已提交
2678 2679
	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
	struct device *kdev = &dev_priv->drm.pdev->dev;
2680
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
B
Ben Widawsky 已提交
2681

2682 2683 2684 2685 2686 2687 2688
	if (unlikely(ggtt->do_idle_maps)) {
		if (i915_gem_wait_for_idle(dev_priv, false)) {
			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 已提交
2689

D
David Weinehall 已提交
2690
	dma_unmap_sg(kdev, obj->pages->sgl, obj->pages->nents,
2691
		     PCI_DMA_BIDIRECTIONAL);
2692
}
2693

2694 2695
static void i915_gtt_color_adjust(struct drm_mm_node *node,
				  unsigned long color,
2696 2697
				  u64 *start,
				  u64 *end)
2698 2699 2700 2701
{
	if (node->color != color)
		*start += 4096;

2702 2703 2704 2705 2706
	node = list_first_entry_or_null(&node->node_list,
					struct drm_mm_node,
					node_list);
	if (node && node->allocated && node->color != color)
		*end -= 4096;
2707
}
B
Ben Widawsky 已提交
2708

2709
int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
2710
{
2711 2712 2713 2714 2715 2716 2717 2718 2719
	/* 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.
	 */
2720
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2721
	unsigned long hole_start, hole_end;
2722
	struct drm_mm_node *entry;
2723
	int ret;
2724

2725 2726 2727
	ret = intel_vgt_balloon(dev_priv);
	if (ret)
		return ret;
2728

2729
	/* Clear any non-preallocated blocks */
2730
	drm_mm_for_each_hole(entry, &ggtt->base.mm, hole_start, hole_end) {
2731 2732
		DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n",
			      hole_start, hole_end);
2733
		ggtt->base.clear_range(&ggtt->base, hole_start,
2734
				     hole_end - hole_start, true);
2735 2736 2737
	}

	/* And finally clear the reserved guard page */
2738 2739 2740
	ggtt->base.clear_range(&ggtt->base,
			       ggtt->base.total - PAGE_SIZE, PAGE_SIZE,
			       true);
2741

2742
	if (USES_PPGTT(dev_priv) && !USES_FULL_PPGTT(dev_priv)) {
2743 2744 2745 2746 2747 2748
		struct i915_hw_ppgtt *ppgtt;

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

2749
		ret = __hw_ppgtt_init(ppgtt, dev_priv);
2750 2751 2752 2753 2754 2755 2756 2757
		if (ret) {
			kfree(ppgtt);
			return ret;
		}

		if (ppgtt->base.allocate_va_range)
			ret = ppgtt->base.allocate_va_range(&ppgtt->base, 0,
							    ppgtt->base.total);
2758
		if (ret) {
2759
			ppgtt->base.cleanup(&ppgtt->base);
2760
			kfree(ppgtt);
2761
			return ret;
2762
		}
2763

2764 2765 2766 2767 2768
		ppgtt->base.clear_range(&ppgtt->base,
					ppgtt->base.start,
					ppgtt->base.total,
					true);

2769
		dev_priv->mm.aliasing_ppgtt = ppgtt;
2770 2771
		WARN_ON(ggtt->base.bind_vma != ggtt_bind_vma);
		ggtt->base.bind_vma = aliasing_gtt_bind_vma;
2772 2773
	}

2774
	return 0;
2775 2776
}

2777 2778
/**
 * i915_ggtt_cleanup_hw - Clean up GGTT hardware initialization
2779
 * @dev_priv: i915 device
2780
 */
2781
void i915_ggtt_cleanup_hw(struct drm_i915_private *dev_priv)
2782
{
2783
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
2784

2785 2786 2787
	if (dev_priv->mm.aliasing_ppgtt) {
		struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
		ppgtt->base.cleanup(&ppgtt->base);
M
Matthew Auld 已提交
2788
		kfree(ppgtt);
2789 2790
	}

2791
	i915_gem_cleanup_stolen(&dev_priv->drm);
2792

2793
	if (drm_mm_initialized(&ggtt->base.mm)) {
2794
		intel_vgt_deballoon(dev_priv);
2795

2796 2797
		drm_mm_takedown(&ggtt->base.mm);
		list_del(&ggtt->base.global_link);
2798 2799
	}

2800
	ggtt->base.cleanup(&ggtt->base);
2801 2802

	arch_phys_wc_del(ggtt->mtrr);
2803
	io_mapping_fini(&ggtt->mappable);
2804
}
2805

2806
static unsigned int gen6_get_total_gtt_size(u16 snb_gmch_ctl)
2807 2808 2809 2810 2811 2812
{
	snb_gmch_ctl >>= SNB_GMCH_GGMS_SHIFT;
	snb_gmch_ctl &= SNB_GMCH_GGMS_MASK;
	return snb_gmch_ctl << 20;
}

2813
static unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl)
2814 2815 2816 2817 2818
{
	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;
2819 2820 2821 2822 2823 2824 2825

#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

2826 2827 2828
	return bdw_gmch_ctl << 20;
}

2829
static unsigned int chv_get_total_gtt_size(u16 gmch_ctrl)
2830 2831 2832 2833 2834 2835 2836 2837 2838 2839
{
	gmch_ctrl >>= SNB_GMCH_GGMS_SHIFT;
	gmch_ctrl &= SNB_GMCH_GGMS_MASK;

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

	return 0;
}

2840
static size_t gen6_get_stolen_size(u16 snb_gmch_ctl)
2841 2842 2843 2844 2845 2846
{
	snb_gmch_ctl >>= SNB_GMCH_GMS_SHIFT;
	snb_gmch_ctl &= SNB_GMCH_GMS_MASK;
	return snb_gmch_ctl << 25; /* 32 MB units */
}

2847
static size_t gen8_get_stolen_size(u16 bdw_gmch_ctl)
2848 2849 2850 2851 2852 2853
{
	bdw_gmch_ctl >>= BDW_GMCH_GMS_SHIFT;
	bdw_gmch_ctl &= BDW_GMCH_GMS_MASK;
	return bdw_gmch_ctl << 25; /* 32 MB units */
}

2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871
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)
		return gmch_ctrl << 25;
	else if (gmch_ctrl < 0x17)
		return (gmch_ctrl - 0x11 + 2) << 22;
	else
		return (gmch_ctrl - 0x17 + 9) << 22;
}

2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883
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)
		return gen9_gmch_ctl << 25; /* 32 MB units */
	else
		/* 4MB increments starting at 0xf0 for 4MB */
		return (gen9_gmch_ctl - 0xf0 + 1) << 22;
}

2884
static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
B
Ben Widawsky 已提交
2885
{
2886 2887
	struct pci_dev *pdev = ggtt->base.dev->pdev;
	phys_addr_t phys_addr;
2888
	int ret;
B
Ben Widawsky 已提交
2889 2890

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

I
Imre Deak 已提交
2893 2894 2895 2896 2897 2898 2899
	/*
	 * 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.
	 */
2900 2901
	if (IS_BROXTON(ggtt->base.dev))
		ggtt->gsm = ioremap_nocache(phys_addr, size);
I
Imre Deak 已提交
2902
	else
2903
		ggtt->gsm = ioremap_wc(phys_addr, size);
2904
	if (!ggtt->gsm) {
2905
		DRM_ERROR("Failed to map the ggtt page table\n");
B
Ben Widawsky 已提交
2906 2907 2908
		return -ENOMEM;
	}

2909 2910 2911
	ret = setup_scratch_page(ggtt->base.dev,
				 &ggtt->base.scratch_page,
				 GFP_DMA32);
2912
	if (ret) {
B
Ben Widawsky 已提交
2913 2914
		DRM_ERROR("Scratch setup failed\n");
		/* iounmap will also get called at remove, but meh */
2915
		iounmap(ggtt->gsm);
2916
		return ret;
B
Ben Widawsky 已提交
2917 2918
	}

2919
	return 0;
B
Ben Widawsky 已提交
2920 2921
}

B
Ben Widawsky 已提交
2922 2923 2924
/* 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. */
2925
static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv)
B
Ben Widawsky 已提交
2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937
{
	uint64_t pat;

	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));

2938
	if (!USES_PPGTT(dev_priv))
2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953
		/* 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 已提交
2954 2955
	/* XXX: spec defines this as 2 distinct registers. It's unclear if a 64b
	 * write would work. */
2956 2957
	I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
	I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
B
Ben Widawsky 已提交
2958 2959
}

2960 2961 2962 2963 2964 2965 2966 2967 2968 2969
static void chv_setup_private_ppat(struct drm_i915_private *dev_priv)
{
	uint64_t pat;

	/*
	 * Map WB on BDW to snooped on CHV.
	 *
	 * Only the snoop bit has meaning for CHV, the rest is
	 * ignored.
	 *
2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980
	 * 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.
2981 2982 2983 2984 2985 2986 2987 2988 2989 2990
	 */
	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);

2991 2992
	I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
	I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
2993 2994
}

2995 2996 2997 2998 2999
static void gen6_gmch_remove(struct i915_address_space *vm)
{
	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);

	iounmap(ggtt->gsm);
3000
	cleanup_scratch_page(vm->dev, &vm->scratch_page);
3001 3002
}

3003
static int gen8_gmch_probe(struct i915_ggtt *ggtt)
B
Ben Widawsky 已提交
3004
{
3005 3006
	struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
	struct pci_dev *pdev = dev_priv->drm.pdev;
3007
	unsigned int size;
B
Ben Widawsky 已提交
3008 3009 3010
	u16 snb_gmch_ctl;

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

3014 3015
	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(39)))
		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(39));
B
Ben Widawsky 已提交
3016

3017
	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
B
Ben Widawsky 已提交
3018

3019
	if (INTEL_GEN(dev_priv) >= 9) {
3020
		ggtt->stolen_size = gen9_get_stolen_size(snb_gmch_ctl);
3021
		size = gen8_get_total_gtt_size(snb_gmch_ctl);
3022
	} else if (IS_CHERRYVIEW(dev_priv)) {
3023
		ggtt->stolen_size = chv_get_stolen_size(snb_gmch_ctl);
3024
		size = chv_get_total_gtt_size(snb_gmch_ctl);
3025
	} else {
3026
		ggtt->stolen_size = gen8_get_stolen_size(snb_gmch_ctl);
3027
		size = gen8_get_total_gtt_size(snb_gmch_ctl);
3028
	}
B
Ben Widawsky 已提交
3029

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

3032
	if (IS_CHERRYVIEW(dev_priv) || IS_BROXTON(dev_priv))
3033 3034 3035
		chv_setup_private_ppat(dev_priv);
	else
		bdw_setup_private_ppat(dev_priv);
B
Ben Widawsky 已提交
3036

3037
	ggtt->base.cleanup = gen6_gmch_remove;
3038 3039
	ggtt->base.bind_vma = ggtt_bind_vma;
	ggtt->base.unbind_vma = ggtt_unbind_vma;
3040
	ggtt->base.insert_page = gen8_ggtt_insert_page;
3041
	ggtt->base.clear_range = nop_clear_range;
3042
	if (!USES_FULL_PPGTT(dev_priv) || intel_scanout_needs_vtd_wa(dev_priv))
3043 3044 3045 3046 3047 3048
		ggtt->base.clear_range = gen8_ggtt_clear_range;

	ggtt->base.insert_entries = gen8_ggtt_insert_entries;
	if (IS_CHERRYVIEW(dev_priv))
		ggtt->base.insert_entries = gen8_ggtt_insert_entries__BKL;

3049
	return ggtt_probe_common(ggtt, size);
B
Ben Widawsky 已提交
3050 3051
}

3052
static int gen6_gmch_probe(struct i915_ggtt *ggtt)
3053
{
3054 3055
	struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
	struct pci_dev *pdev = dev_priv->drm.pdev;
3056
	unsigned int size;
3057 3058
	u16 snb_gmch_ctl;

3059 3060
	ggtt->mappable_base = pci_resource_start(pdev, 2);
	ggtt->mappable_end = pci_resource_len(pdev, 2);
3061

3062 3063
	/* 64/512MB is the current min/max we actually know of, but this is just
	 * a coarse sanity check.
3064
	 */
3065
	if (ggtt->mappable_end < (64<<20) || ggtt->mappable_end > (512<<20)) {
3066
		DRM_ERROR("Unknown GMADR size (%llx)\n", ggtt->mappable_end);
3067
		return -ENXIO;
3068 3069
	}

3070 3071 3072
	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(40)))
		pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40));
	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
3073

3074
	ggtt->stolen_size = gen6_get_stolen_size(snb_gmch_ctl);
3075

3076 3077
	size = gen6_get_total_gtt_size(snb_gmch_ctl);
	ggtt->base.total = (size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
3078

3079
	ggtt->base.clear_range = gen6_ggtt_clear_range;
3080
	ggtt->base.insert_page = gen6_ggtt_insert_page;
3081 3082 3083
	ggtt->base.insert_entries = gen6_ggtt_insert_entries;
	ggtt->base.bind_vma = ggtt_bind_vma;
	ggtt->base.unbind_vma = ggtt_unbind_vma;
3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095
	ggtt->base.cleanup = gen6_gmch_remove;

	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;
3096

3097
	return ggtt_probe_common(ggtt, size);
3098 3099
}

3100
static void i915_gmch_remove(struct i915_address_space *vm)
3101
{
3102
	intel_gmch_remove();
3103
}
3104

3105
static int i915_gmch_probe(struct i915_ggtt *ggtt)
3106
{
3107
	struct drm_i915_private *dev_priv = to_i915(ggtt->base.dev);
3108 3109
	int ret;

3110
	ret = intel_gmch_probe(dev_priv->bridge_dev, dev_priv->drm.pdev, NULL);
3111 3112 3113 3114 3115
	if (!ret) {
		DRM_ERROR("failed to set up gmch\n");
		return -EIO;
	}

3116 3117
	intel_gtt_get(&ggtt->base.total, &ggtt->stolen_size,
		      &ggtt->mappable_base, &ggtt->mappable_end);
3118

3119
	ggtt->do_idle_maps = needs_idle_maps(dev_priv);
3120
	ggtt->base.insert_page = i915_ggtt_insert_page;
3121 3122 3123 3124
	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;
3125
	ggtt->base.cleanup = i915_gmch_remove;
3126

3127
	if (unlikely(ggtt->do_idle_maps))
3128 3129
		DRM_INFO("applying Ironlake quirks for intel_iommu\n");

3130 3131 3132
	return 0;
}

3133
/**
3134
 * i915_ggtt_probe_hw - Probe GGTT hardware location
3135
 * @dev_priv: i915 device
3136
 */
3137
int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv)
3138
{
3139
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
3140 3141
	int ret;

3142
	ggtt->base.dev = &dev_priv->drm;
3143

3144 3145 3146 3147 3148 3149
	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);
3150
	if (ret)
3151 3152
		return ret;

3153 3154
	if ((ggtt->base.total - 1) >> 32) {
		DRM_ERROR("We never expected a Global GTT with more than 32bits"
3155
			  " of address space! Found %lldM!\n",
3156 3157 3158 3159 3160
			  ggtt->base.total >> 20);
		ggtt->base.total = 1ULL << 32;
		ggtt->mappable_end = min(ggtt->mappable_end, ggtt->base.total);
	}

3161 3162 3163 3164 3165 3166 3167
	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;
	}

3168
	/* GMADR is the PCI mmio aperture into the global GTT. */
3169
	DRM_INFO("Memory usable by graphics device = %lluM\n",
3170 3171 3172
		 ggtt->base.total >> 20);
	DRM_DEBUG_DRIVER("GMADR size = %lldM\n", ggtt->mappable_end >> 20);
	DRM_DEBUG_DRIVER("GTT stolen size = %zdM\n", ggtt->stolen_size >> 20);
3173 3174 3175 3176
#ifdef CONFIG_INTEL_IOMMU
	if (intel_iommu_gfx_mapped)
		DRM_INFO("VT-d active for gfx access\n");
#endif
3177 3178

	return 0;
3179 3180 3181 3182
}

/**
 * i915_ggtt_init_hw - Initialize GGTT hardware
3183
 * @dev_priv: i915 device
3184
 */
3185
int i915_ggtt_init_hw(struct drm_i915_private *dev_priv)
3186 3187 3188 3189
{
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
	int ret;

3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200
	INIT_LIST_HEAD(&dev_priv->vm_list);

	/* Subtract the guard page before address space initialization to
	 * shrink the range used by drm_mm.
	 */
	ggtt->base.total -= PAGE_SIZE;
	i915_address_space_init(&ggtt->base, dev_priv);
	ggtt->base.total += PAGE_SIZE;
	if (!HAS_LLC(dev_priv))
		ggtt->base.mm.color_adjust = i915_gtt_color_adjust;

3201 3202 3203
	if (!io_mapping_init_wc(&dev_priv->ggtt.mappable,
				dev_priv->ggtt.mappable_base,
				dev_priv->ggtt.mappable_end)) {
3204 3205 3206 3207 3208 3209
		ret = -EIO;
		goto out_gtt_cleanup;
	}

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

3210 3211 3212 3213
	/*
	 * Initialise stolen early so that we may reserve preallocated
	 * objects for the BIOS to KMS transition.
	 */
3214
	ret = i915_gem_init_stolen(&dev_priv->drm);
3215 3216 3217 3218
	if (ret)
		goto out_gtt_cleanup;

	return 0;
3219 3220

out_gtt_cleanup:
3221
	ggtt->base.cleanup(&ggtt->base);
3222
	return ret;
3223
}
3224

3225
int i915_ggtt_enable_hw(struct drm_i915_private *dev_priv)
3226
{
3227
	if (INTEL_GEN(dev_priv) < 6 && !intel_enable_gtt())
3228 3229 3230 3231 3232
		return -EIO;

	return 0;
}

3233 3234
void i915_gem_restore_gtt_mappings(struct drm_device *dev)
{
3235 3236
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
3237
	struct drm_i915_gem_object *obj;
3238
	struct i915_vma *vma;
3239

3240
	i915_check_and_clear_faults(dev_priv);
3241 3242

	/* First fill our portion of the GTT with scratch pages */
3243 3244
	ggtt->base.clear_range(&ggtt->base, ggtt->base.start, ggtt->base.total,
			       true);
3245

3246
	/* Cache flush objects bound into GGTT and rebind them. */
3247
	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
3248
		list_for_each_entry(vma, &obj->vma_list, obj_link) {
3249
			if (vma->vm != &ggtt->base)
3250
				continue;
3251

3252 3253 3254 3255
			WARN_ON(i915_vma_bind(vma, obj->cache_level,
					      PIN_UPDATE));
		}

3256 3257
		if (obj->pin_display)
			WARN_ON(i915_gem_object_set_to_gtt_domain(obj, false));
3258
	}
3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269

	if (INTEL_INFO(dev)->gen >= 8) {
		if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev))
			chv_setup_private_ppat(dev_priv);
		else
			bdw_setup_private_ppat(dev_priv);

		return;
	}

	if (USES_PPGTT(dev)) {
3270 3271
		struct i915_address_space *vm;

3272 3273 3274
		list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
			/* TODO: Perhaps it shouldn't be gen6 specific */

3275
			struct i915_hw_ppgtt *ppgtt;
3276

3277
			if (i915_is_ggtt(vm))
3278
				ppgtt = dev_priv->mm.aliasing_ppgtt;
3279 3280
			else
				ppgtt = i915_vm_to_ppgtt(vm);
3281 3282 3283 3284 3285 3286 3287 3288 3289

			gen6_write_page_range(dev_priv, &ppgtt->pd,
					      0, ppgtt->base.total);
		}
	}

	i915_ggtt_flush(dev_priv);
}

3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304
static void
i915_vma_retire(struct i915_gem_active *active,
		struct drm_i915_gem_request *rq)
{
	const unsigned int idx = rq->engine->id;
	struct i915_vma *vma =
		container_of(active, struct i915_vma, last_read[idx]);

	GEM_BUG_ON(!i915_vma_has_active_engine(vma, idx));

	i915_vma_clear_active(vma, idx);
	if (i915_vma_is_active(vma))
		return;

	list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
3305
	if (unlikely(i915_vma_is_closed(vma) && !i915_vma_is_pinned(vma)))
3306 3307 3308 3309 3310 3311 3312
		WARN_ON(i915_vma_unbind(vma));
}

void i915_vma_destroy(struct i915_vma *vma)
{
	GEM_BUG_ON(vma->node.allocated);
	GEM_BUG_ON(i915_vma_is_active(vma));
3313
	GEM_BUG_ON(!i915_vma_is_closed(vma));
3314
	GEM_BUG_ON(vma->fence);
3315 3316

	list_del(&vma->vm_link);
3317
	if (!i915_vma_is_ggtt(vma))
3318 3319 3320 3321 3322 3323 3324
		i915_ppgtt_put(i915_vm_to_ppgtt(vma->vm));

	kmem_cache_free(to_i915(vma->obj->base.dev)->vmas, vma);
}

void i915_vma_close(struct i915_vma *vma)
{
3325 3326
	GEM_BUG_ON(i915_vma_is_closed(vma));
	vma->flags |= I915_VMA_CLOSED;
3327 3328

	list_del_init(&vma->obj_link);
3329
	if (!i915_vma_is_active(vma) && !i915_vma_is_pinned(vma))
3330
		WARN_ON(i915_vma_unbind(vma));
3331 3332
}

3333
static struct i915_vma *
C
Chris Wilson 已提交
3334 3335 3336
__i915_vma_create(struct drm_i915_gem_object *obj,
		  struct i915_address_space *vm,
		  const struct i915_ggtt_view *view)
3337
{
3338
	struct i915_vma *vma;
3339
	int i;
3340

3341 3342
	GEM_BUG_ON(vm->closed);

3343
	vma = kmem_cache_zalloc(to_i915(obj->base.dev)->vmas, GFP_KERNEL);
3344 3345
	if (vma == NULL)
		return ERR_PTR(-ENOMEM);
3346

3347
	INIT_LIST_HEAD(&vma->exec_list);
3348 3349
	for (i = 0; i < ARRAY_SIZE(vma->last_read); i++)
		init_request_active(&vma->last_read[i], i915_vma_retire);
3350
	init_request_active(&vma->last_fence, NULL);
3351
	list_add(&vma->vm_link, &vm->unbound_list);
3352 3353
	vma->vm = vm;
	vma->obj = obj;
3354
	vma->size = obj->base.size;
3355

C
Chris Wilson 已提交
3356
	if (view) {
3357 3358 3359 3360 3361 3362 3363 3364 3365
		vma->ggtt_view = *view;
		if (view->type == I915_GGTT_VIEW_PARTIAL) {
			vma->size = view->params.partial.size;
			vma->size <<= PAGE_SHIFT;
		} else if (view->type == I915_GGTT_VIEW_ROTATED) {
			vma->size =
				intel_rotation_info_size(&view->params.rotated);
			vma->size <<= PAGE_SHIFT;
		}
C
Chris Wilson 已提交
3366 3367 3368 3369
	}

	if (i915_is_ggtt(vm)) {
		vma->flags |= I915_VMA_GGTT;
3370
	} else {
3371
		i915_ppgtt_get(i915_vm_to_ppgtt(vm));
3372
	}
3373

3374
	list_add_tail(&vma->obj_link, &obj->vma_list);
3375 3376 3377
	return vma;
}

C
Chris Wilson 已提交
3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398
static inline bool vma_matches(struct i915_vma *vma,
			       struct i915_address_space *vm,
			       const struct i915_ggtt_view *view)
{
	if (vma->vm != vm)
		return false;

	if (!i915_vma_is_ggtt(vma))
		return true;

	if (!view)
		return vma->ggtt_view.type == 0;

	if (vma->ggtt_view.type != view->type)
		return false;

	return memcmp(&vma->ggtt_view.params,
		      &view->params,
		      sizeof(view->params)) == 0;
}

3399 3400 3401 3402 3403 3404
struct i915_vma *
i915_vma_create(struct drm_i915_gem_object *obj,
		struct i915_address_space *vm,
		const struct i915_ggtt_view *view)
{
	GEM_BUG_ON(view && !i915_is_ggtt(vm));
C
Chris Wilson 已提交
3405
	GEM_BUG_ON(i915_gem_obj_to_vma(obj, vm, view));
3406

C
Chris Wilson 已提交
3407
	return __i915_vma_create(obj, vm, view);
3408 3409
}

3410
struct i915_vma *
C
Chris Wilson 已提交
3411 3412 3413
i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
		    struct i915_address_space *vm,
		    const struct i915_ggtt_view *view)
3414 3415 3416
{
	struct i915_vma *vma;

C
Chris Wilson 已提交
3417 3418 3419
	list_for_each_entry_reverse(vma, &obj->vma_list, obj_link)
		if (vma_matches(vma, vm, view))
			return vma;
3420

C
Chris Wilson 已提交
3421
	return NULL;
3422 3423 3424
}

struct i915_vma *
C
Chris Wilson 已提交
3425 3426 3427
i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
				  struct i915_address_space *vm,
				  const struct i915_ggtt_view *view)
3428
{
C
Chris Wilson 已提交
3429
	struct i915_vma *vma;
3430

C
Chris Wilson 已提交
3431
	GEM_BUG_ON(view && !i915_is_ggtt(vm));
3432

C
Chris Wilson 已提交
3433
	vma = i915_gem_obj_to_vma(obj, vm, view);
3434
	if (!vma)
C
Chris Wilson 已提交
3435
		vma = __i915_vma_create(obj, vm, view);
3436

3437
	GEM_BUG_ON(i915_vma_is_closed(vma));
3438 3439
	return vma;
}
3440

3441
static struct scatterlist *
3442
rotate_pages(const dma_addr_t *in, unsigned int offset,
3443
	     unsigned int width, unsigned int height,
3444
	     unsigned int stride,
3445
	     struct sg_table *st, struct scatterlist *sg)
3446 3447 3448 3449 3450
{
	unsigned int column, row;
	unsigned int src_idx;

	for (column = 0; column < width; column++) {
3451
		src_idx = stride * (height - 1) + column;
3452 3453 3454 3455 3456 3457 3458
		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);
3459
			sg_dma_address(sg) = in[offset + src_idx];
3460 3461
			sg_dma_len(sg) = PAGE_SIZE;
			sg = sg_next(sg);
3462
			src_idx -= stride;
3463 3464
		}
	}
3465 3466

	return sg;
3467 3468 3469
}

static struct sg_table *
3470
intel_rotate_fb_obj_pages(const struct intel_rotation_info *rot_info,
3471 3472
			  struct drm_i915_gem_object *obj)
{
3473
	const size_t n_pages = obj->base.size / PAGE_SIZE;
3474
	unsigned int size = intel_rotation_info_size(rot_info);
3475 3476
	struct sgt_iter sgt_iter;
	dma_addr_t dma_addr;
3477 3478 3479
	unsigned long i;
	dma_addr_t *page_addr_list;
	struct sg_table *st;
3480
	struct scatterlist *sg;
3481
	int ret = -ENOMEM;
3482 3483

	/* Allocate a temporary list of source pages for random access. */
3484
	page_addr_list = drm_malloc_gfp(n_pages,
3485 3486
					sizeof(dma_addr_t),
					GFP_TEMPORARY);
3487 3488 3489 3490 3491 3492 3493 3494
	if (!page_addr_list)
		return ERR_PTR(ret);

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

3495
	ret = sg_alloc_table(st, size, GFP_KERNEL);
3496 3497 3498 3499 3500
	if (ret)
		goto err_sg_alloc;

	/* Populate source page list from the object. */
	i = 0;
3501 3502
	for_each_sgt_dma(dma_addr, sgt_iter, obj->pages)
		page_addr_list[i++] = dma_addr;
3503

3504
	GEM_BUG_ON(i != n_pages);
3505 3506 3507
	st->nents = 0;
	sg = st->sgl;

3508 3509 3510 3511
	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);
3512 3513
	}

3514 3515
	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);
3516 3517 3518 3519 3520 3521 3522 3523 3524 3525

	drm_free_large(page_addr_list);

	return st;

err_sg_alloc:
	kfree(st);
err_st_alloc:
	drm_free_large(page_addr_list);

3526 3527 3528
	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);

3529 3530
	return ERR_PTR(ret);
}
3531

3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572
static struct sg_table *
intel_partial_pages(const struct i915_ggtt_view *view,
		    struct drm_i915_gem_object *obj)
{
	struct sg_table *st;
	struct scatterlist *sg;
	struct sg_page_iter obj_sg_iter;
	int ret = -ENOMEM;

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

	ret = sg_alloc_table(st, view->params.partial.size, GFP_KERNEL);
	if (ret)
		goto err_sg_alloc;

	sg = st->sgl;
	st->nents = 0;
	for_each_sg_page(obj->pages->sgl, &obj_sg_iter, obj->pages->nents,
		view->params.partial.offset)
	{
		if (st->nents >= view->params.partial.size)
			break;

		sg_set_page(sg, NULL, PAGE_SIZE, 0);
		sg_dma_address(sg) = sg_page_iter_dma_address(&obj_sg_iter);
		sg_dma_len(sg) = PAGE_SIZE;

		sg = sg_next(sg);
		st->nents++;
	}

	return st;

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

3573
static int
3574
i915_get_ggtt_vma_pages(struct i915_vma *vma)
3575
{
3576 3577
	int ret = 0;

3578
	if (vma->pages)
3579 3580 3581
		return 0;

	if (vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL)
3582
		vma->pages = vma->obj->pages;
3583
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_ROTATED)
3584
		vma->pages =
3585
			intel_rotate_fb_obj_pages(&vma->ggtt_view.params.rotated, vma->obj);
3586
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_PARTIAL)
3587
		vma->pages = intel_partial_pages(&vma->ggtt_view, vma->obj);
3588 3589 3590 3591
	else
		WARN_ONCE(1, "GGTT view %u not implemented!\n",
			  vma->ggtt_view.type);

3592
	if (!vma->pages) {
3593
		DRM_ERROR("Failed to get pages for GGTT view type %u!\n",
3594
			  vma->ggtt_view.type);
3595
		ret = -EINVAL;
3596 3597 3598
	} else if (IS_ERR(vma->pages)) {
		ret = PTR_ERR(vma->pages);
		vma->pages = NULL;
3599 3600
		DRM_ERROR("Failed to get pages for VMA view type %u (%d)!\n",
			  vma->ggtt_view.type, ret);
3601 3602
	}

3603
	return ret;
3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618
}

/**
 * i915_vma_bind - Sets up PTEs for an VMA in it's corresponding address space.
 * @vma: VMA to map
 * @cache_level: mapping cache level
 * @flags: flags like global or local mapping
 *
 * DMA addresses are taken from the scatter-gather table of this object (or of
 * this VMA in case of non-default GGTT views) and PTE entries set up.
 * Note that DMA addresses are also the only part of the SG table we care about.
 */
int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
		  u32 flags)
{
3619
	u32 bind_flags;
3620 3621
	u32 vma_flags;
	int ret;
3622

3623 3624
	if (WARN_ON(flags == 0))
		return -EINVAL;
3625

3626
	bind_flags = 0;
3627
	if (flags & PIN_GLOBAL)
3628
		bind_flags |= I915_VMA_GLOBAL_BIND;
3629
	if (flags & PIN_USER)
3630
		bind_flags |= I915_VMA_LOCAL_BIND;
3631

3632
	vma_flags = vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND);
3633
	if (flags & PIN_UPDATE)
3634
		bind_flags |= vma_flags;
3635
	else
3636
		bind_flags &= ~vma_flags;
3637 3638 3639
	if (bind_flags == 0)
		return 0;

3640
	if (vma_flags == 0 && vma->vm->allocate_va_range) {
3641
		trace_i915_va_alloc(vma);
3642 3643 3644 3645 3646 3647 3648 3649
		ret = vma->vm->allocate_va_range(vma->vm,
						 vma->node.start,
						 vma->node.size);
		if (ret)
			return ret;
	}

	ret = vma->vm->bind_vma(vma, cache_level, bind_flags);
3650 3651
	if (ret)
		return ret;
3652

3653
	vma->flags |= bind_flags;
3654 3655
	return 0;
}
3656

3657 3658 3659 3660
void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
{
	void __iomem *ptr;

3661 3662 3663
	/* Access through the GTT requires the device to be awake. */
	assert_rpm_wakelock_held(to_i915(vma->vm->dev));

3664
	lockdep_assert_held(&vma->vm->dev->struct_mutex);
3665
	if (WARN_ON(!i915_vma_is_map_and_fenceable(vma)))
3666
		return IO_ERR_PTR(-ENODEV);
3667

3668 3669
	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
	GEM_BUG_ON((vma->flags & I915_VMA_GLOBAL_BIND) == 0);
3670 3671 3672

	ptr = vma->iomap;
	if (ptr == NULL) {
3673
		ptr = io_mapping_map_wc(&i915_vm_to_ggtt(vma->vm)->mappable,
3674 3675 3676
					vma->node.start,
					vma->node.size);
		if (ptr == NULL)
3677
			return IO_ERR_PTR(-ENOMEM);
3678 3679 3680 3681

		vma->iomap = ptr;
	}

3682
	__i915_vma_pin(vma);
3683 3684
	return ptr;
}
3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696

void i915_vma_unpin_and_release(struct i915_vma **p_vma)
{
	struct i915_vma *vma;

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

	i915_vma_unpin(vma);
	i915_vma_put(vma);
}