aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-11-04 12:21:31 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-11 17:51:44 -0500
commit26b1ff35c8c4888fb544f290e0fc64143f7dbe45 (patch)
tree8c49cbe377f5435d6b9cf0d7aa280c838d84c526
parent0f9b91c754b7244d3a7345df88c4384f0eb0dd17 (diff)
drm/i915: Move the remaining gtt code
It's pretty much all consolidated now that we've killed AGP. We can move the one outlier, and defines too. (Kill some unused defines in the process) Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c62
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c76
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h17
3 files changed, 76 insertions, 79 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index c161fdbd830f..cdcf19de220c 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3875,68 +3875,6 @@ void i915_gem_init_swizzling(struct drm_device *dev)
3875 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB)); 3875 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB));
3876} 3876}
3877 3877
3878void i915_gem_init_ppgtt(struct drm_device *dev)
3879{
3880 drm_i915_private_t *dev_priv = dev->dev_private;
3881 uint32_t pd_offset;
3882 struct intel_ring_buffer *ring;
3883 struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
3884 uint32_t __iomem *pd_addr;
3885 uint32_t pd_entry;
3886 int i;
3887
3888 if (!dev_priv->mm.aliasing_ppgtt)
3889 return;
3890
3891
3892 pd_addr = dev_priv->mm.gtt->gtt + ppgtt->pd_offset/sizeof(uint32_t);
3893 for (i = 0; i < ppgtt->num_pd_entries; i++) {
3894 dma_addr_t pt_addr;
3895
3896 if (dev_priv->mm.gtt->needs_dmar)
3897 pt_addr = ppgtt->pt_dma_addr[i];
3898 else
3899 pt_addr = page_to_phys(ppgtt->pt_pages[i]);
3900
3901 pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
3902 pd_entry |= GEN6_PDE_VALID;
3903
3904 writel(pd_entry, pd_addr + i);
3905 }
3906 readl(pd_addr);
3907
3908 pd_offset = ppgtt->pd_offset;
3909 pd_offset /= 64; /* in cachelines, */
3910 pd_offset <<= 16;
3911
3912 if (INTEL_INFO(dev)->gen == 6) {
3913 uint32_t ecochk, gab_ctl, ecobits;
3914
3915 ecobits = I915_READ(GAC_ECO_BITS);
3916 I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_PPGTT_CACHE64B);
3917
3918 gab_ctl = I915_READ(GAB_CTL);
3919 I915_WRITE(GAB_CTL, gab_ctl | GAB_CTL_CONT_AFTER_PAGEFAULT);
3920
3921 ecochk = I915_READ(GAM_ECOCHK);
3922 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
3923 ECOCHK_PPGTT_CACHE64B);
3924 I915_WRITE(GFX_MODE, _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
3925 } else if (INTEL_INFO(dev)->gen >= 7) {
3926 I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
3927 /* GFX_MODE is per-ring on gen7+ */
3928 }
3929
3930 for_each_ring(ring, dev_priv, i) {
3931 if (INTEL_INFO(dev)->gen >= 7)
3932 I915_WRITE(RING_MODE_GEN7(ring),
3933 _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
3934
3935 I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
3936 I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
3937 }
3938}
3939
3940static bool 3878static bool
3941intel_enable_blt(struct drm_device *dev) 3879intel_enable_blt(struct drm_device *dev)
3942{ 3880{
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index a3e509a71655..afa56e978e80 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -30,6 +30,20 @@
30 30
31typedef uint32_t gtt_pte_t; 31typedef uint32_t gtt_pte_t;
32 32
33/* PPGTT stuff */
34#define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0))
35
36#define GEN6_PDE_VALID (1 << 0)
37/* gen6+ has bit 11-4 for physical addr bit 39-32 */
38#define GEN6_PDE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr)
39
40#define GEN6_PTE_VALID (1 << 0)
41#define GEN6_PTE_UNCACHED (1 << 1)
42#define HSW_PTE_UNCACHED (0)
43#define GEN6_PTE_CACHE_LLC (2 << 1)
44#define GEN6_PTE_CACHE_LLC_MLC (3 << 1)
45#define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr)
46
33static inline gtt_pte_t pte_encode(struct drm_device *dev, 47static inline gtt_pte_t pte_encode(struct drm_device *dev,
34 dma_addr_t addr, 48 dma_addr_t addr,
35 enum i915_cache_level level) 49 enum i915_cache_level level)
@@ -262,6 +276,68 @@ void i915_ppgtt_unbind_object(struct i915_hw_ppgtt *ppgtt,
262 obj->base.size >> PAGE_SHIFT); 276 obj->base.size >> PAGE_SHIFT);
263} 277}
264 278
279void i915_gem_init_ppgtt(struct drm_device *dev)
280{
281 drm_i915_private_t *dev_priv = dev->dev_private;
282 uint32_t pd_offset;
283 struct intel_ring_buffer *ring;
284 struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
285 uint32_t __iomem *pd_addr;
286 uint32_t pd_entry;
287 int i;
288
289 if (!dev_priv->mm.aliasing_ppgtt)
290 return;
291
292
293 pd_addr = dev_priv->mm.gtt->gtt + ppgtt->pd_offset/sizeof(uint32_t);
294 for (i = 0; i < ppgtt->num_pd_entries; i++) {
295 dma_addr_t pt_addr;
296
297 if (dev_priv->mm.gtt->needs_dmar)
298 pt_addr = ppgtt->pt_dma_addr[i];
299 else
300 pt_addr = page_to_phys(ppgtt->pt_pages[i]);
301
302 pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
303 pd_entry |= GEN6_PDE_VALID;
304
305 writel(pd_entry, pd_addr + i);
306 }
307 readl(pd_addr);
308
309 pd_offset = ppgtt->pd_offset;
310 pd_offset /= 64; /* in cachelines, */
311 pd_offset <<= 16;
312
313 if (INTEL_INFO(dev)->gen == 6) {
314 uint32_t ecochk, gab_ctl, ecobits;
315
316 ecobits = I915_READ(GAC_ECO_BITS);
317 I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_PPGTT_CACHE64B);
318
319 gab_ctl = I915_READ(GAB_CTL);
320 I915_WRITE(GAB_CTL, gab_ctl | GAB_CTL_CONT_AFTER_PAGEFAULT);
321
322 ecochk = I915_READ(GAM_ECOCHK);
323 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
324 ECOCHK_PPGTT_CACHE64B);
325 I915_WRITE(GFX_MODE, _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
326 } else if (INTEL_INFO(dev)->gen >= 7) {
327 I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
328 /* GFX_MODE is per-ring on gen7+ */
329 }
330
331 for_each_ring(ring, dev_priv, i) {
332 if (INTEL_INFO(dev)->gen >= 7)
333 I915_WRITE(RING_MODE_GEN7(ring),
334 _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
335
336 I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
337 I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
338 }
339}
340
265static bool do_idling(struct drm_i915_private *dev_priv) 341static bool do_idling(struct drm_i915_private *dev_priv)
266{ 342{
267 bool ret = dev_priv->mm.interruptible; 343 bool ret = dev_priv->mm.interruptible;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index d55c49642c68..9118bd112589 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -114,23 +114,6 @@
114#define GEN6_GRDOM_MEDIA (1 << 2) 114#define GEN6_GRDOM_MEDIA (1 << 2)
115#define GEN6_GRDOM_BLT (1 << 3) 115#define GEN6_GRDOM_BLT (1 << 3)
116 116
117/* PPGTT stuff */
118#define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0))
119
120#define GEN6_PDE_VALID (1 << 0)
121#define GEN6_PDE_LARGE_PAGE (2 << 0) /* use 32kb pages */
122/* gen6+ has bit 11-4 for physical addr bit 39-32 */
123#define GEN6_PDE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr)
124
125#define GEN6_PTE_VALID (1 << 0)
126#define GEN6_PTE_UNCACHED (1 << 1)
127#define HSW_PTE_UNCACHED (0)
128#define GEN6_PTE_CACHE_LLC (2 << 1)
129#define GEN6_PTE_CACHE_LLC_MLC (3 << 1)
130#define GEN6_PTE_CACHE_BITS (3 << 1)
131#define GEN6_PTE_GFDT (1 << 3)
132#define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr)
133
134#define RING_PP_DIR_BASE(ring) ((ring)->mmio_base+0x228) 117#define RING_PP_DIR_BASE(ring) ((ring)->mmio_base+0x228)
135#define RING_PP_DIR_BASE_READ(ring) ((ring)->mmio_base+0x518) 118#define RING_PP_DIR_BASE_READ(ring) ((ring)->mmio_base+0x518)
136#define RING_PP_DIR_DCLV(ring) ((ring)->mmio_base+0x220) 119#define RING_PP_DIR_DCLV(ring) ((ring)->mmio_base+0x220)