All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Widawsky <benjamin.widawsky@intel.com>
To: Intel GFX <intel-gfx@lists.freedesktop.org>
Subject: [PATCH 16/26] drm/i915: Generalize GEN6 mapping
Date: Mon, 17 Mar 2014 22:48:48 -0700	[thread overview]
Message-ID: <1395121738-29126-17-git-send-email-benjamin.widawsky@intel.com> (raw)
In-Reply-To: <1395121738-29126-1-git-send-email-benjamin.widawsky@intel.com>

Having a more general way of doing mappings will allow the ability to
easy map and unmap a specific page table. Specifically in this case, we
pass down the page directory + entry, and the page table to map. This
works similarly to the x86 code.

The same work will need to happen for GEN8. At that point I will try to
combine functionality.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 61 +++++++++++++++++++------------------
 drivers/gpu/drm/i915/i915_gem_gtt.h |  2 ++
 2 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 5c08cf9..35acccb 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -663,18 +663,13 @@ bail:
 
 static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 {
-	struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private;
 	struct i915_address_space *vm = &ppgtt->base;
-	gen6_gtt_pte_t __iomem *pd_addr;
 	gen6_gtt_pte_t scratch_pte;
 	uint32_t pd_entry;
 	int pte, pde;
 
 	scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true);
 
-	pd_addr = (gen6_gtt_pte_t __iomem *)dev_priv->gtt.gsm +
-		ppgtt->pd.pd_offset / sizeof(gen6_gtt_pte_t);
-
 	seq_printf(m, "  VM %p (pd_offset %x-%x):\n", vm,
 		   ppgtt->pd.pd_offset,
 		   ppgtt->pd.pd_offset + ppgtt->num_pd_entries);
@@ -682,7 +677,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 		u32 expected;
 		gen6_gtt_pte_t *pt_vaddr;
 		dma_addr_t pt_addr = ppgtt->pd.page_tables[pde]->daddr;
-		pd_entry = readl(pd_addr + pde);
+		pd_entry = readl(ppgtt->pd_addr + pde);
 		expected = (GEN6_PDE_ADDR_ENCODE(pt_addr) | GEN6_PDE_VALID);
 
 		if (pd_entry != expected)
@@ -718,39 +713,43 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 	}
 }
 
-static void gen6_map_single(struct i915_hw_ppgtt *ppgtt,
-			    const unsigned pde_index,
-			    dma_addr_t daddr)
+/* Map pde (index) from the page directory @pd to the page table @pt */
+static void gen6_map_single(struct i915_pagedir *pd,
+			    const int pde, struct i915_pagetab *pt)
 {
-	struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private;
-	uint32_t pd_entry;
-	gen6_gtt_pte_t __iomem *pd_addr = (gen6_gtt_pte_t __iomem*)dev_priv->gtt.gsm;
-	pd_addr	+= ppgtt->pd.pd_offset / sizeof(gen6_gtt_pte_t);
+	struct i915_hw_ppgtt *ppgtt =
+		container_of(pd, struct i915_hw_ppgtt, pd);
+	u32 pd_entry;
 
-	pd_entry = GEN6_PDE_ADDR_ENCODE(daddr);
+	pd_entry = GEN6_PDE_ADDR_ENCODE(pt->daddr);
 	pd_entry |= GEN6_PDE_VALID;
 
-	writel(pd_entry, pd_addr + pde_index);
+	writel(pd_entry, ppgtt->pd_addr + pde);
+
+	/* XXX: Caller needs to make sure the write completes if necessary */
 }
 
 /* Map all the page tables found in the ppgtt structure to incrementing page
  * directories. */
-static void gen6_map_page_tables(struct i915_hw_ppgtt *ppgtt)
+static void gen6_map_page_range(struct drm_i915_private *dev_priv,
+				struct i915_pagedir *pd, unsigned pde, size_t n)
 {
-	struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private;
-	int i;
+	if (WARN_ON(pde + n > I915_PDES_PER_PD))
+		n = I915_PDES_PER_PD - pde;
 
-	WARN_ON(ppgtt->pd.pd_offset & 0x3f);
-	for (i = 0; i < ppgtt->num_pd_entries; i++)
-		gen6_map_single(ppgtt, i, ppgtt->pd.page_tables[i]->daddr);
+	n += pde;
+
+	for (; pde < n; pde++)
+		gen6_map_single(pd, pde, pd->page_tables[pde]);
 
+	/* Make sure write is complete before other code can use this page
+	 * table. Also require for WC mapped PTEs */
 	readl(dev_priv->gtt.gsm);
 }
 
 static uint32_t get_pd_offset(struct i915_hw_ppgtt *ppgtt)
 {
 	BUG_ON(ppgtt->pd.pd_offset & 0x3f);
-
 	return (ppgtt->pd.pd_offset / 64) << 16;
 }
 
@@ -1184,7 +1183,10 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
 	ppgtt->pd.pd_offset =
 		ppgtt->node.start / PAGE_SIZE * sizeof(gen6_gtt_pte_t);
 
-	gen6_map_page_tables(ppgtt);
+	ppgtt->pd_addr = (gen6_gtt_pte_t __iomem*)dev_priv->gtt.gsm +
+		ppgtt->pd.pd_offset / sizeof(gen6_gtt_pte_t);
+
+	gen6_map_page_range(dev_priv, &ppgtt->pd, 0, ppgtt->num_pd_entries);
 
 	DRM_DEBUG_DRIVER("Allocated pde space (%ldM) at GTT entry: %lx\n",
 			 ppgtt->node.size >> 20,
@@ -1355,13 +1357,14 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
 
 	list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
 		/* TODO: Perhaps it shouldn't be gen6 specific */
-		if (i915_is_ggtt(vm)) {
-			if (dev_priv->mm.aliasing_ppgtt)
-				gen6_map_page_tables(dev_priv->mm.aliasing_ppgtt);
-			continue;
-		}
 
-		gen6_map_page_tables(container_of(vm, struct i915_hw_ppgtt, base));
+		struct i915_hw_ppgtt *ppgtt =
+			container_of(vm, struct i915_hw_ppgtt, base);
+
+		if (i915_is_ggtt(vm))
+			ppgtt = dev_priv->mm.aliasing_ppgtt;
+
+		gen6_map_page_range(dev_priv, &ppgtt->pd, 0, ppgtt->num_pd_entries);
 	}
 
 	i915_gem_chipset_flush(dev);
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 9cec163..fa9249f 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -337,6 +337,8 @@ struct i915_hw_ppgtt {
 		struct i915_pagedir pd;
 	};
 
+	gen6_gtt_pte_t __iomem *pd_addr;
+
 	int (*enable)(struct i915_hw_ppgtt *ppgtt);
 	int (*switch_mm)(struct i915_hw_ppgtt *ppgtt,
 			 struct intel_ring_buffer *ring,
-- 
1.9.0

  parent reply	other threads:[~2014-03-18  5:49 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-18  5:48 [PATCH 00/26] [RFCish] GEN7 dynamic page tables Ben Widawsky
2014-03-18  5:48 ` [PATCH 01/26] drm/i915: Split out verbose PPGTT dumping Ben Widawsky
2014-03-20 11:57   ` Chris Wilson
2014-03-20 12:08     ` Chris Wilson
2014-03-22 18:13       ` Ben Widawsky
2014-03-22 20:59         ` Chris Wilson
2014-03-18  5:48 ` [PATCH 02/26] drm/i915: Extract switch to default context Ben Widawsky
2014-03-18  8:38   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 03/26] drm/i915: s/pd/pdpe, s/pt/pde Ben Widawsky
2014-03-18  5:48 ` [PATCH 04/26] drm/i915: rename map/unmap to dma_map/unmap Ben Widawsky
2014-03-18  8:40   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 05/26] drm/i915: Setup less PPGTT on failed pagedir Ben Widawsky
2014-03-18  5:48 ` [PATCH 06/26] drm/i915: Wrap VMA binding Ben Widawsky
2014-03-18  8:42   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 07/26] drm/i915: clean up PPGTT init error path Ben Widawsky
2014-03-18  8:44   ` Chris Wilson
2014-03-22 19:43     ` Ben Widawsky
2014-03-22 20:58       ` Chris Wilson
2014-03-23 17:27         ` Ben Widawsky
2014-03-18  5:48 ` [PATCH 08/26] drm/i915: Un-hardcode number of page directories Ben Widawsky
2014-03-18  5:48 ` [PATCH 09/26] drm/i915: Split out gtt specific header file Ben Widawsky
2014-03-18  8:46   ` Chris Wilson
2014-03-18  9:15   ` Daniel Vetter
2014-03-22 19:44     ` Ben Widawsky
2014-03-23  0:46       ` Daniel Vetter
2014-03-18  5:48 ` [PATCH 10/26] drm/i915: Make gen6_write_pdes gen6_map_page_tables Ben Widawsky
2014-03-18  8:48   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 11/26] drm/i915: Range clearing is PPGTT agnostic Ben Widawsky
2014-03-18  8:50   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 12/26] drm/i915: Page table helpers, and define renames Ben Widawsky
2014-03-18  9:05   ` Chris Wilson
2014-03-18 18:29     ` Jesse Barnes
2014-03-19  0:58       ` Ben Widawsky
2014-03-18  5:48 ` [PATCH 13/26] drm/i915: construct page table abstractions Ben Widawsky
2014-03-18  5:48 ` [PATCH 14/26] drm/i915: Complete page table structures Ben Widawsky
2014-03-18  9:09   ` Chris Wilson
2014-03-22 20:10     ` Ben Widawsky
2014-03-22 21:14       ` Chris Wilson
2014-03-18  5:48 ` [PATCH 15/26] drm/i915: Create page table allocators Ben Widawsky
2014-03-18  9:14   ` Chris Wilson
2014-03-22 20:21     ` Ben Widawsky
2014-03-22 21:10       ` Chris Wilson
2014-03-18  5:48 ` Ben Widawsky [this message]
2014-03-18  9:22   ` [PATCH 16/26] drm/i915: Generalize GEN6 mapping Chris Wilson
2014-03-18  5:48 ` [PATCH 17/26] drm/i915: Clean up pagetable DMA map & unmap Ben Widawsky
2014-03-18  9:24   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 18/26] drm/i915: Always dma map page table allocations Ben Widawsky
2014-03-18  9:25   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 19/26] drm/i915: Consolidate dma mappings Ben Widawsky
2014-03-18  9:28   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 20/26] drm/i915: Always dma map page directory allocations Ben Widawsky
2014-03-18  9:29   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 21/26] drm/i915: Track GEN6 page table usage Ben Widawsky
2014-03-18  5:48 ` [PATCH 22/26] drm/i915: Extract context switch skip logic Ben Widawsky
2014-03-18  5:48 ` [PATCH 23/26] drm/i915: Force pd restore when PDEs change, gen6-7 Ben Widawsky
2014-03-18  5:48 ` [PATCH 24/26] drm/i915: Finish gen6/7 dynamic page table allocation Ben Widawsky
2014-03-20 12:15   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 25/26] drm/i915: Print used ppgtt pages for gen6 in debugfs Ben Widawsky
2014-03-20 10:09   ` Chris Wilson
2014-03-20 10:17   ` Chris Wilson
2014-03-18  5:48 ` [PATCH 26/26] FOR REFERENCE ONLY Ben Widawsky
2014-03-20 12:17 ` [PATCH 00/26] [RFCish] GEN7 dynamic page tables Chris Wilson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1395121738-29126-17-git-send-email-benjamin.widawsky@intel.com \
    --to=benjamin.widawsky@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.