aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-08-22 03:44:30 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-08-22 07:19:52 -0400
commit8bcdd0f756b7bf13c340a319ad6748ed6386a944 (patch)
treeb305bf9502408f8806e17320f29cb7dfac3f65b8
parent36cdd0138b7f51f204df871c548b65ea2d59522d (diff)
drm/i915: Embed the scratch page struct into each VM
As the scratch page is no longer shared between all VM, and each has their own, forgo the small allocation and simply embed the scratch page struct into the i915_address_space. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Link: http://patchwork.freedesktop.org/patch/msgid/20160822074431.26872-2-chris@chris-wilson.co.uk Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Acked-by: Mika Kuoppala <mika.kuoppala@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c76
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.h6
2 files changed, 32 insertions, 50 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index eba0166c4df5..b947fb9f0d44 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -409,29 +409,16 @@ static void fill_page_dma_32(struct drm_device *dev, struct i915_page_dma *p,
409 fill_page_dma(dev, p, v); 409 fill_page_dma(dev, p, v);
410} 410}
411 411
412static struct i915_page_scratch *alloc_scratch_page(struct drm_device *dev) 412static int
413setup_scratch_page(struct drm_device *dev, struct i915_page_dma *scratch)
413{ 414{
414 struct i915_page_scratch *sp; 415 return __setup_page_dma(dev, scratch, GFP_DMA32 | __GFP_ZERO);
415 int ret;
416
417 sp = kzalloc(sizeof(*sp), GFP_KERNEL);
418 if (sp == NULL)
419 return ERR_PTR(-ENOMEM);
420
421 ret = __setup_page_dma(dev, px_base(sp), GFP_DMA32 | __GFP_ZERO);
422 if (ret) {
423 kfree(sp);
424 return ERR_PTR(ret);
425 }
426
427 return sp;
428} 416}
429 417
430static void free_scratch_page(struct drm_device *dev, 418static void cleanup_scratch_page(struct drm_device *dev,
431 struct i915_page_scratch *sp) 419 struct i915_page_dma *scratch)
432{ 420{
433 cleanup_px(dev, sp); 421 cleanup_page_dma(dev, scratch);
434 kfree(sp);
435} 422}
436 423
437static struct i915_page_table *alloc_pt(struct drm_device *dev) 424static struct i915_page_table *alloc_pt(struct drm_device *dev)
@@ -477,7 +464,7 @@ static void gen8_initialize_pt(struct i915_address_space *vm,
477{ 464{
478 gen8_pte_t scratch_pte; 465 gen8_pte_t scratch_pte;
479 466
480 scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page), 467 scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
481 I915_CACHE_LLC, true); 468 I915_CACHE_LLC, true);
482 469
483 fill_px(vm->dev, pt, scratch_pte); 470 fill_px(vm->dev, pt, scratch_pte);
@@ -488,9 +475,9 @@ static void gen6_initialize_pt(struct i915_address_space *vm,
488{ 475{
489 gen6_pte_t scratch_pte; 476 gen6_pte_t scratch_pte;
490 477
491 WARN_ON(px_dma(vm->scratch_page) == 0); 478 WARN_ON(vm->scratch_page.daddr == 0);
492 479
493 scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), 480 scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
494 I915_CACHE_LLC, true, 0); 481 I915_CACHE_LLC, true, 0);
495 482
496 fill32_px(vm->dev, pt, scratch_pte); 483 fill32_px(vm->dev, pt, scratch_pte);
@@ -774,7 +761,7 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
774 bool use_scratch) 761 bool use_scratch)
775{ 762{
776 struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm); 763 struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
777 gen8_pte_t scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page), 764 gen8_pte_t scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
778 I915_CACHE_LLC, use_scratch); 765 I915_CACHE_LLC, use_scratch);
779 766
780 if (!USES_FULL_48BIT_PPGTT(vm->dev)) { 767 if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
@@ -880,9 +867,9 @@ static int gen8_init_scratch(struct i915_address_space *vm)
880 struct drm_device *dev = vm->dev; 867 struct drm_device *dev = vm->dev;
881 int ret; 868 int ret;
882 869
883 vm->scratch_page = alloc_scratch_page(dev); 870 ret = setup_scratch_page(dev, &vm->scratch_page);
884 if (IS_ERR(vm->scratch_page)) 871 if (ret)
885 return PTR_ERR(vm->scratch_page); 872 return ret;
886 873
887 vm->scratch_pt = alloc_pt(dev); 874 vm->scratch_pt = alloc_pt(dev);
888 if (IS_ERR(vm->scratch_pt)) { 875 if (IS_ERR(vm->scratch_pt)) {
@@ -916,7 +903,7 @@ free_pd:
916free_pt: 903free_pt:
917 free_pt(dev, vm->scratch_pt); 904 free_pt(dev, vm->scratch_pt);
918free_scratch_page: 905free_scratch_page:
919 free_scratch_page(dev, vm->scratch_page); 906 cleanup_scratch_page(dev, &vm->scratch_page);
920 907
921 return ret; 908 return ret;
922} 909}
@@ -960,7 +947,7 @@ static void gen8_free_scratch(struct i915_address_space *vm)
960 free_pdp(dev, vm->scratch_pdp); 947 free_pdp(dev, vm->scratch_pdp);
961 free_pd(dev, vm->scratch_pd); 948 free_pd(dev, vm->scratch_pd);
962 free_pt(dev, vm->scratch_pt); 949 free_pt(dev, vm->scratch_pt);
963 free_scratch_page(dev, vm->scratch_page); 950 cleanup_scratch_page(dev, &vm->scratch_page);
964} 951}
965 952
966static void gen8_ppgtt_cleanup_3lvl(struct drm_device *dev, 953static void gen8_ppgtt_cleanup_3lvl(struct drm_device *dev,
@@ -1457,7 +1444,7 @@ static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
1457 struct i915_address_space *vm = &ppgtt->base; 1444 struct i915_address_space *vm = &ppgtt->base;
1458 uint64_t start = ppgtt->base.start; 1445 uint64_t start = ppgtt->base.start;
1459 uint64_t length = ppgtt->base.total; 1446 uint64_t length = ppgtt->base.total;
1460 gen8_pte_t scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page), 1447 gen8_pte_t scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
1461 I915_CACHE_LLC, true); 1448 I915_CACHE_LLC, true);
1462 1449
1463 if (!USES_FULL_48BIT_PPGTT(vm->dev)) { 1450 if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
@@ -1574,7 +1561,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
1574 uint32_t pte, pde; 1561 uint32_t pte, pde;
1575 uint32_t start = ppgtt->base.start, length = ppgtt->base.total; 1562 uint32_t start = ppgtt->base.start, length = ppgtt->base.total;
1576 1563
1577 scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), 1564 scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1578 I915_CACHE_LLC, true, 0); 1565 I915_CACHE_LLC, true, 0);
1579 1566
1580 gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde) { 1567 gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde) {
@@ -1799,7 +1786,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
1799 unsigned first_pte = first_entry % GEN6_PTES; 1786 unsigned first_pte = first_entry % GEN6_PTES;
1800 unsigned last_pte, i; 1787 unsigned last_pte, i;
1801 1788
1802 scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), 1789 scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1803 I915_CACHE_LLC, true, 0); 1790 I915_CACHE_LLC, true, 0);
1804 1791
1805 while (num_entries) { 1792 while (num_entries) {
@@ -1945,14 +1932,15 @@ unwind_out:
1945static int gen6_init_scratch(struct i915_address_space *vm) 1932static int gen6_init_scratch(struct i915_address_space *vm)
1946{ 1933{
1947 struct drm_device *dev = vm->dev; 1934 struct drm_device *dev = vm->dev;
1935 int ret;
1948 1936
1949 vm->scratch_page = alloc_scratch_page(dev); 1937 ret = setup_scratch_page(dev, &vm->scratch_page);
1950 if (IS_ERR(vm->scratch_page)) 1938 if (ret)
1951 return PTR_ERR(vm->scratch_page); 1939 return ret;
1952 1940
1953 vm->scratch_pt = alloc_pt(dev); 1941 vm->scratch_pt = alloc_pt(dev);
1954 if (IS_ERR(vm->scratch_pt)) { 1942 if (IS_ERR(vm->scratch_pt)) {
1955 free_scratch_page(dev, vm->scratch_page); 1943 cleanup_scratch_page(dev, &vm->scratch_page);
1956 return PTR_ERR(vm->scratch_pt); 1944 return PTR_ERR(vm->scratch_pt);
1957 } 1945 }
1958 1946
@@ -1966,7 +1954,7 @@ static void gen6_free_scratch(struct i915_address_space *vm)
1966 struct drm_device *dev = vm->dev; 1954 struct drm_device *dev = vm->dev;
1967 1955
1968 free_pt(dev, vm->scratch_pt); 1956 free_pt(dev, vm->scratch_pt);
1969 free_scratch_page(dev, vm->scratch_page); 1957 cleanup_scratch_page(dev, &vm->scratch_page);
1970} 1958}
1971 1959
1972static void gen6_ppgtt_cleanup(struct i915_address_space *vm) 1960static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
@@ -2507,7 +2495,7 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2507 first_entry, num_entries, max_entries)) 2495 first_entry, num_entries, max_entries))
2508 num_entries = max_entries; 2496 num_entries = max_entries;
2509 2497
2510 scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page), 2498 scratch_pte = gen8_pte_encode(vm->scratch_page.daddr,
2511 I915_CACHE_LLC, 2499 I915_CACHE_LLC,
2512 use_scratch); 2500 use_scratch);
2513 for (i = 0; i < num_entries; i++) 2501 for (i = 0; i < num_entries; i++)
@@ -2539,7 +2527,7 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2539 first_entry, num_entries, max_entries)) 2527 first_entry, num_entries, max_entries))
2540 num_entries = max_entries; 2528 num_entries = max_entries;
2541 2529
2542 scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), 2530 scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
2543 I915_CACHE_LLC, use_scratch, 0); 2531 I915_CACHE_LLC, use_scratch, 0);
2544 2532
2545 for (i = 0; i < num_entries; i++) 2533 for (i = 0; i < num_entries; i++)
@@ -2892,8 +2880,8 @@ static size_t gen9_get_stolen_size(u16 gen9_gmch_ctl)
2892static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size) 2880static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
2893{ 2881{
2894 struct pci_dev *pdev = ggtt->base.dev->pdev; 2882 struct pci_dev *pdev = ggtt->base.dev->pdev;
2895 struct i915_page_scratch *scratch_page;
2896 phys_addr_t phys_addr; 2883 phys_addr_t phys_addr;
2884 int ret;
2897 2885
2898 /* For Modern GENs the PTEs and register space are split in the BAR */ 2886 /* For Modern GENs the PTEs and register space are split in the BAR */
2899 phys_addr = pci_resource_start(pdev, 0) + pci_resource_len(pdev, 0) / 2; 2887 phys_addr = pci_resource_start(pdev, 0) + pci_resource_len(pdev, 0) / 2;
@@ -2914,16 +2902,14 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
2914 return -ENOMEM; 2902 return -ENOMEM;
2915 } 2903 }
2916 2904
2917 scratch_page = alloc_scratch_page(ggtt->base.dev); 2905 ret = setup_scratch_page(ggtt->base.dev, &ggtt->base.scratch_page);
2918 if (IS_ERR(scratch_page)) { 2906 if (ret) {
2919 DRM_ERROR("Scratch setup failed\n"); 2907 DRM_ERROR("Scratch setup failed\n");
2920 /* iounmap will also get called at remove, but meh */ 2908 /* iounmap will also get called at remove, but meh */
2921 iounmap(ggtt->gsm); 2909 iounmap(ggtt->gsm);
2922 return PTR_ERR(scratch_page); 2910 return ret;
2923 } 2911 }
2924 2912
2925 ggtt->base.scratch_page = scratch_page;
2926
2927 return 0; 2913 return 0;
2928} 2914}
2929 2915
@@ -3005,7 +2991,7 @@ static void gen6_gmch_remove(struct i915_address_space *vm)
3005 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); 2991 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
3006 2992
3007 iounmap(ggtt->gsm); 2993 iounmap(ggtt->gsm);
3008 free_scratch_page(vm->dev, vm->scratch_page); 2994 cleanup_scratch_page(vm->dev, &vm->scratch_page);
3009} 2995}
3010 2996
3011static int gen8_gmch_probe(struct i915_ggtt *ggtt) 2997static int gen8_gmch_probe(struct i915_ggtt *ggtt)
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index a9aec25535ac..ec78be2f8c77 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -312,10 +312,6 @@ struct i915_page_dma {
312#define px_page(px) (px_base(px)->page) 312#define px_page(px) (px_base(px)->page)
313#define px_dma(px) (px_base(px)->daddr) 313#define px_dma(px) (px_base(px)->daddr)
314 314
315struct i915_page_scratch {
316 struct i915_page_dma base;
317};
318
319struct i915_page_table { 315struct i915_page_table {
320 struct i915_page_dma base; 316 struct i915_page_dma base;
321 317
@@ -361,7 +357,7 @@ struct i915_address_space {
361 357
362 bool closed; 358 bool closed;
363 359
364 struct i915_page_scratch *scratch_page; 360 struct i915_page_dma scratch_page;
365 struct i915_page_table *scratch_pt; 361 struct i915_page_table *scratch_pt;
366 struct i915_page_directory *scratch_pd; 362 struct i915_page_directory *scratch_pd;
367 struct i915_page_directory_pointer *scratch_pdp; /* GEN8+ & 48b PPGTT */ 363 struct i915_page_directory_pointer *scratch_pdp; /* GEN8+ & 48b PPGTT */