aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-09 14:53:27 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-09 15:49:30 -0500
commite21af88d39796c907c38648c824be3d646ffbe35 (patch)
tree1c50f1f039ceb52050b21fddeb1216b03a39b907 /drivers
parent3cf17fc522ee081f7cb2ab325e6c697ca12005e4 (diff)
drm/i915: enable ppgtt
We want to unconditionally enable ppgtt for two reasons: - Windows uses this on snb and later. - We need the basic hw support to work before we can think about real per-process address spaces and other cool features we want. But Chris Wilson was complaining all over irc and intel-gfx that this will blow up if we don't have a module option to disable it. Hence add one, to prevent this. ppgtt support seems to slightly change the timings and make crashy things slightly more or less crashy. Now in my testing and the testing this got on troublesome snb machines, it seems to have improved things only. But on ivb it makes quite a few crashes happen much more often, see https://bugs.freedesktop.org/show_bug.cgi?id=41353 Luckily Eugeni Dodonov seems to have a set of workarounds that fix this issue. v2: Don't try to enable ppgtt on pre-snb. v3: Pimp commit message and make Chris Wilson less grumpy by adding a module option. v4: New try at making Chris Wilson happy. Reviewed-by: Ben Widawsky <ben@bwidawsk.net> Acked-by: Chris Wilson <chris@chris-wilson.co.uk> Tested-by: Chris Wilson <chris@chris-wilson.co.uk> Tested-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c7
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c39
4 files changed, 49 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 039fbf4fae10..40bfafa13b72 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1196,7 +1196,7 @@ static int i915_load_gem_init(struct drm_device *dev)
1196 /* Basic memrange allocator for stolen space */ 1196 /* Basic memrange allocator for stolen space */
1197 drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size); 1197 drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size);
1198 1198
1199 if (HAS_ALIASING_PPGTT(dev)) { 1199 if (i915_enable_ppgtt && HAS_ALIASING_PPGTT(dev)) {
1200 /* PPGTT pdes are stolen from global gtt ptes, so shrink the 1200 /* PPGTT pdes are stolen from global gtt ptes, so shrink the
1201 * aperture accordingly when using aliasing ppgtt. */ 1201 * aperture accordingly when using aliasing ppgtt. */
1202 gtt_size -= I915_PPGTT_PD_ENTRIES*PAGE_SIZE; 1202 gtt_size -= I915_PPGTT_PD_ENTRIES*PAGE_SIZE;
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 12ddf47b8187..d92c92dea4ec 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -103,6 +103,11 @@ MODULE_PARM_DESC(enable_hangcheck,
103 "WARNING: Disabling this can cause system wide hangs. " 103 "WARNING: Disabling this can cause system wide hangs. "
104 "(default: true)"); 104 "(default: true)");
105 105
106bool i915_enable_ppgtt __read_mostly = 1;
107module_param_named(i915_enable_ppgtt, i915_enable_ppgtt, bool, 0600);
108MODULE_PARM_DESC(i915_enable_ppgtt,
109 "Enable PPGTT (default: true)");
110
106static struct drm_driver driver; 111static struct drm_driver driver;
107extern int intel_agp_enabled; 112extern int intel_agp_enabled;
108 113
@@ -694,6 +699,8 @@ int i915_reset(struct drm_device *dev, u8 flags)
694 if (HAS_BLT(dev)) 699 if (HAS_BLT(dev))
695 dev_priv->ring[BCS].init(&dev_priv->ring[BCS]); 700 dev_priv->ring[BCS].init(&dev_priv->ring[BCS]);
696 701
702 i915_gem_init_ppgtt(dev);
703
697 mutex_unlock(&dev->struct_mutex); 704 mutex_unlock(&dev->struct_mutex);
698 drm_irq_uninstall(dev); 705 drm_irq_uninstall(dev);
699 drm_mode_config_reset(dev); 706 drm_mode_config_reset(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 35c8b5316396..45b609e6b131 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1032,6 +1032,7 @@ extern int i915_vbt_sdvo_panel_type __read_mostly;
1032extern int i915_enable_rc6 __read_mostly; 1032extern int i915_enable_rc6 __read_mostly;
1033extern int i915_enable_fbc __read_mostly; 1033extern int i915_enable_fbc __read_mostly;
1034extern bool i915_enable_hangcheck __read_mostly; 1034extern bool i915_enable_hangcheck __read_mostly;
1035extern bool i915_enable_ppgtt __read_mostly;
1035 1036
1036extern int i915_suspend(struct drm_device *dev, pm_message_t state); 1037extern int i915_suspend(struct drm_device *dev, pm_message_t state);
1037extern int i915_resume(struct drm_device *dev); 1038extern int i915_resume(struct drm_device *dev);
@@ -1210,6 +1211,7 @@ int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj,
1210int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj); 1211int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj);
1211int __must_check i915_gem_init_hw(struct drm_device *dev); 1212int __must_check i915_gem_init_hw(struct drm_device *dev);
1212void i915_gem_init_swizzling(struct drm_device *dev); 1213void i915_gem_init_swizzling(struct drm_device *dev);
1214void i915_gem_init_ppgtt(struct drm_device *dev);
1213void i915_gem_cleanup_ringbuffer(struct drm_device *dev); 1215void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
1214void i915_gem_do_init(struct drm_device *dev, 1216void i915_gem_do_init(struct drm_device *dev,
1215 unsigned long start, 1217 unsigned long start,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 59092997bcfb..f1193b194331 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3712,6 +3712,43 @@ void i915_gem_init_swizzling(struct drm_device *dev)
3712 else 3712 else
3713 I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB)); 3713 I915_WRITE(ARB_MODE, ARB_MODE_ENABLE(ARB_MODE_SWIZZLE_IVB));
3714} 3714}
3715
3716void i915_gem_init_ppgtt(struct drm_device *dev)
3717{
3718 drm_i915_private_t *dev_priv = dev->dev_private;
3719 uint32_t pd_offset;
3720 struct intel_ring_buffer *ring;
3721 int i;
3722
3723 if (!dev_priv->mm.aliasing_ppgtt)
3724 return;
3725
3726 pd_offset = dev_priv->mm.aliasing_ppgtt->pd_offset;
3727 pd_offset /= 64; /* in cachelines, */
3728 pd_offset <<= 16;
3729
3730 if (INTEL_INFO(dev)->gen == 6) {
3731 uint32_t ecochk = I915_READ(GAM_ECOCHK);
3732 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT |
3733 ECOCHK_PPGTT_CACHE64B);
3734 I915_WRITE(GFX_MODE, GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
3735 } else if (INTEL_INFO(dev)->gen >= 7) {
3736 I915_WRITE(GAM_ECOCHK, ECOCHK_PPGTT_CACHE64B);
3737 /* GFX_MODE is per-ring on gen7+ */
3738 }
3739
3740 for (i = 0; i < I915_NUM_RINGS; i++) {
3741 ring = &dev_priv->ring[i];
3742
3743 if (INTEL_INFO(dev)->gen >= 7)
3744 I915_WRITE(RING_MODE_GEN7(ring),
3745 GFX_MODE_ENABLE(GFX_PPGTT_ENABLE));
3746
3747 I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
3748 I915_WRITE(RING_PP_DIR_BASE(ring), pd_offset);
3749 }
3750}
3751
3715int 3752int
3716i915_gem_init_hw(struct drm_device *dev) 3753i915_gem_init_hw(struct drm_device *dev)
3717{ 3754{
@@ -3738,6 +3775,8 @@ i915_gem_init_hw(struct drm_device *dev)
3738 3775
3739 dev_priv->next_seqno = 1; 3776 dev_priv->next_seqno = 1;
3740 3777
3778 i915_gem_init_ppgtt(dev);
3779
3741 return 0; 3780 return 0;
3742 3781
3743cleanup_bsd_ring: 3782cleanup_bsd_ring: