[PATCH 2/2] drm/i915: ppgtt create consolidation.
Bob Paauwe
bob.j.paauwe at intel.com
Tue Oct 2 23:22:07 UTC 2018
Consolidate common parts of the gen6 and gen8 ppgtt create code paths.
Signed-off-by: Bob Paauwe <bob.j.paauwe at intel.com>
---
drivers/gpu/drm/i915/i915_gem_gtt.c | 144 ++++++++++++++++++------------------
1 file changed, 71 insertions(+), 73 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 06a91f67bc14..d919f7cd69a8 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -1584,40 +1584,14 @@ static int gen8_preallocate_top_level_pdp(struct i915_hw_ppgtt *ppgtt)
* space.
*
*/
-static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
+static int gen8_ppgtt_create(struct i915_hw_ppgtt *ppgtt)
{
- struct i915_hw_ppgtt *ppgtt;
+ struct drm_i915_private *i915 = ppgtt->vm.i915;
int err;
- ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
- if (!ppgtt)
- return ERR_PTR(-ENOMEM);
-
- kref_init(&ppgtt->ref);
-
- ppgtt->vm.i915 = i915;
- ppgtt->vm.dma = &i915->drm.pdev->dev;
-
- ppgtt->vm.total = BIT_ULL(i915->info.ppgtt_bits);
-
- /*
- * From bdw, there is support for read-only pages in the PPGTT.
- *
- * XXX GVT is not honouring the lack of RW in the PTE bits.
- */
- ppgtt->vm.has_read_only = !intel_vgpu_active(i915);
-
- i915_address_space_init(&ppgtt->vm, i915);
-
- /* 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(i915) || IS_BROXTON(i915))
- ppgtt->vm.pt_kmap_wc = true;
-
err = gen8_init_scratch(&ppgtt->vm);
if (err)
- goto err_free;
+ return err;
if (use_4lvl(&ppgtt->vm)) {
err = setup_px(&ppgtt->vm, &ppgtt->pml4);
@@ -1641,7 +1615,6 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
goto err_scratch;
}
}
-
ppgtt->vm.allocate_va_range = gen8_ppgtt_alloc_3lvl;
ppgtt->vm.insert_entries = gen8_ppgtt_insert_3lvl;
ppgtt->vm.clear_range = gen8_ppgtt_clear_3lvl;
@@ -1653,18 +1626,11 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
ppgtt->vm.cleanup = gen8_ppgtt_cleanup;
ppgtt->debug_dump = gen8_dump_ppgtt;
- ppgtt->vm.vma_ops.bind_vma = ppgtt_bind_vma;
- ppgtt->vm.vma_ops.unbind_vma = ppgtt_unbind_vma;
- ppgtt->vm.vma_ops.set_pages = ppgtt_set_pages;
- ppgtt->vm.vma_ops.clear_pages = clear_pages;
-
- return ppgtt;
+ return 0;
err_scratch:
gen8_free_scratch(&ppgtt->vm);
-err_free:
- kfree(ppgtt);
- return ERR_PTR(err);
+ return err;
}
static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m)
@@ -2085,55 +2051,31 @@ void gen6_ppgtt_unpin(struct i915_hw_ppgtt *base)
i915_vma_unpin(ppgtt->vma);
}
-static struct i915_hw_ppgtt *gen6_ppgtt_create(struct drm_i915_private *i915)
+static int gen6_ppgtt_create(struct gen6_hw_ppgtt *ppgtt,
+ struct i915_ggtt * const ggtt)
{
- struct i915_ggtt * const ggtt = &i915->ggtt;
- struct gen6_hw_ppgtt *ppgtt;
int err;
- ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
- if (!ppgtt)
- return ERR_PTR(-ENOMEM);
-
- kref_init(&ppgtt->base.ref);
-
- ppgtt->base.vm.i915 = i915;
- ppgtt->base.vm.dma = &i915->drm.pdev->dev;
-
- ppgtt->base.vm.total = I915_PDES * GEN6_PTES * I915_GTT_PAGE_SIZE;
-
- i915_address_space_init(&ppgtt->base.vm, i915);
-
ppgtt->base.vm.allocate_va_range = gen6_alloc_va_range;
ppgtt->base.vm.clear_range = gen6_ppgtt_clear_range;
ppgtt->base.vm.insert_entries = gen6_ppgtt_insert_entries;
ppgtt->base.vm.cleanup = gen6_ppgtt_cleanup;
ppgtt->base.debug_dump = gen6_dump_ppgtt;
- ppgtt->base.vm.vma_ops.bind_vma = ppgtt_bind_vma;
- ppgtt->base.vm.vma_ops.unbind_vma = ppgtt_unbind_vma;
- ppgtt->base.vm.vma_ops.set_pages = ppgtt_set_pages;
- ppgtt->base.vm.vma_ops.clear_pages = clear_pages;
-
ppgtt->base.vm.pte_encode = ggtt->vm.pte_encode;
err = gen6_ppgtt_init_scratch(ppgtt);
if (err)
- goto err_free;
+ return err;
ppgtt->vma = pd_vma_create(ppgtt, GEN6_PD_SIZE);
if (IS_ERR(ppgtt->vma)) {
err = PTR_ERR(ppgtt->vma);
- goto err_scratch;
+ gen6_ppgtt_free_scratch(&ppgtt->base.vm);
+ return err;
}
- return &ppgtt->base;
-
-err_scratch:
- gen6_ppgtt_free_scratch(&ppgtt->base.vm);
-err_free:
- kfree(ppgtt);
- return ERR_PTR(err);
+ return 0;
}
static void gtt_write_workarounds(struct drm_i915_private *dev_priv)
@@ -2185,10 +2127,66 @@ int i915_ppgtt_init_hw(struct drm_i915_private *dev_priv)
static struct i915_hw_ppgtt *
__hw_ppgtt_create(struct drm_i915_private *i915)
{
- if (INTEL_GEN(i915) < 8)
- return gen6_ppgtt_create(i915);
- else
- return gen8_ppgtt_create(i915);
+ struct gen6_hw_ppgtt *gen6_ppgtt = NULL;
+ struct i915_hw_ppgtt *ppgtt;
+ int err;
+
+ if (INTEL_GEN(i915) < 8) {
+ gen6_ppgtt = kzalloc(sizeof(*gen6_ppgtt), GFP_KERNEL);
+ if (!gen6_ppgtt)
+ return ERR_PTR(-ENOMEM);
+ ppgtt = &gen6_ppgtt->base;
+ } else {
+ ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
+ if (!ppgtt)
+ return ERR_PTR(-ENOMEM);
+ }
+
+ kref_init(&ppgtt->ref);
+
+ ppgtt->vm.i915 = i915;
+ ppgtt->vm.dma = &i915->drm.pdev->dev;
+
+ ppgtt->vm.total = BIT_ULL(i915->info.ppgtt_bits);
+ DRM_DEBUG_DRIVER("vm.total = 0x%llx vs. 0x%llx\n", ppgtt->vm.total,
+ (unsigned long long)(I915_PDES * GEN6_PTES * I915_GTT_PAGE_SIZE));
+
+ /*
+ * From bdw, there is support for read-only pages in the PPGTT.
+ *
+ * XXX GVT is not honoring the lack of RW in the PTE bits.
+ */
+ ppgtt->vm.has_read_only =
+ (INTEL_GEN(i915) < 8) ? false :!intel_vgpu_active(i915);
+
+ i915_address_space_init(&ppgtt->vm, i915);
+
+ /* There are only few exceptions for gen >= 6. chv and bxt.
+ * And we are not sure abou the latter so play safe for now.
+ */
+ if (IS_CHERRYVIEW(i915) || IS_BROXTON(i915))
+ ppgtt->vm.pt_kmap_wc = true;
+
+ if (INTEL_GEN(i915) < 8) {
+ err = gen6_ppgtt_create(gen6_ppgtt, &i915->ggtt);
+ if (err) {
+ kfree(gen6_ppgtt);
+ return ERR_PTR(err);
+ }
+ } else {
+ err = gen8_ppgtt_create(ppgtt);
+ if (err) {
+ kfree(ppgtt);
+ return ERR_PTR(err);
+ }
+ }
+
+ ppgtt->vm.vma_ops.bind_vma = ppgtt_bind_vma;
+ ppgtt->vm.vma_ops.unbind_vma = ppgtt_unbind_vma;
+ ppgtt->vm.vma_ops.set_pages = ppgtt_set_pages;
+ ppgtt->vm.vma_ops.clear_pages = clear_pages;
+
+ return ppgtt;
}
struct i915_hw_ppgtt *
--
2.14.4
More information about the Intel-gfx-trybot
mailing list