aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-20 03:26:30 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-20 07:03:33 -0500
commit656bfa3afc14e45e2d9e1624bf60d79b3beb12f2 (patch)
treec71479a78a33330ae9692e4e2504d914405d5030
parent6985b352183fc00df22a769892a24bc438db5357 (diff)
drm/i915: Pin tiled objects for L-shaped configs
Let's just throw in the towel on this one and take the cheap way out. Based on a patch from Chris Wilson, but checking for a different bit. Chris' patch checked for even bank layout, this one here for a magic bit. Given the evidence we've gathered (not much) both work I think, but checking for the magic bit might be more accurate. Anyway, works on my gm45 here. For paranoi restrict to gen4 (and mobile), since we've only ever seen this on gm45 and i965gm. Also add some debugfs output so that we can skip the tiled swapping tests properly in these cases. v2: Clean up the quirk'ed pin count in free_object to avoid upsetting the WARN_ON. Spotted by Chris. Cc: Chris Wilson <chris@chris-wilson.co.uk> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=28813 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45092 Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> 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_debugfs.c6
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c19
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c18
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
5 files changed, 46 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index bb1458381dc4..a27b1e47e89c 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1983,6 +1983,8 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
1983 if (IS_GEN3(dev) || IS_GEN4(dev)) { 1983 if (IS_GEN3(dev) || IS_GEN4(dev)) {
1984 seq_printf(m, "DDC = 0x%08x\n", 1984 seq_printf(m, "DDC = 0x%08x\n",
1985 I915_READ(DCC)); 1985 I915_READ(DCC));
1986 seq_printf(m, "DDC2 = 0x%08x\n",
1987 I915_READ(DCC2));
1986 seq_printf(m, "C0DRB3 = 0x%04x\n", 1988 seq_printf(m, "C0DRB3 = 0x%04x\n",
1987 I915_READ16(C0DRB3)); 1989 I915_READ16(C0DRB3));
1988 seq_printf(m, "C1DRB3 = 0x%04x\n", 1990 seq_printf(m, "C1DRB3 = 0x%04x\n",
@@ -2005,6 +2007,10 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
2005 seq_printf(m, "DISP_ARB_CTL = 0x%08x\n", 2007 seq_printf(m, "DISP_ARB_CTL = 0x%08x\n",
2006 I915_READ(DISP_ARB_CTL)); 2008 I915_READ(DISP_ARB_CTL));
2007 } 2009 }
2010
2011 if (dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2012 seq_puts(m, "L-shaped memory detected\n");
2013
2008 intel_runtime_pm_put(dev_priv); 2014 intel_runtime_pm_put(dev_priv);
2009 mutex_unlock(&dev->struct_mutex); 2015 mutex_unlock(&dev->struct_mutex);
2010 2016
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 02b3cb32c8a6..5448ce9d1490 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -764,6 +764,7 @@ enum intel_sbi_destination {
764#define QUIRK_INVERT_BRIGHTNESS (1<<2) 764#define QUIRK_INVERT_BRIGHTNESS (1<<2)
765#define QUIRK_BACKLIGHT_PRESENT (1<<3) 765#define QUIRK_BACKLIGHT_PRESENT (1<<3)
766#define QUIRK_PIPEB_FORCE (1<<4) 766#define QUIRK_PIPEB_FORCE (1<<4)
767#define QUIRK_PIN_SWIZZLED_PAGES (1<<5)
767 768
768struct intel_fbdev; 769struct intel_fbdev;
769struct intel_fbc_work; 770struct intel_fbc_work;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 480d00e672fa..3c64eb6abf2d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2176,6 +2176,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2176 if (i915_gem_object_needs_bit17_swizzle(obj)) 2176 if (i915_gem_object_needs_bit17_swizzle(obj))
2177 i915_gem_object_do_bit_17_swizzle(obj); 2177 i915_gem_object_do_bit_17_swizzle(obj);
2178 2178
2179 if (obj->tiling_mode != I915_TILING_NONE &&
2180 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2181 i915_gem_object_pin_pages(obj);
2182
2179 return 0; 2183 return 0;
2180 2184
2181err_pages: 2185err_pages:
@@ -4374,6 +4378,7 @@ int
4374i915_gem_madvise_ioctl(struct drm_device *dev, void *data, 4378i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4375 struct drm_file *file_priv) 4379 struct drm_file *file_priv)
4376{ 4380{
4381 struct drm_i915_private *dev_priv = dev->dev_private;
4377 struct drm_i915_gem_madvise *args = data; 4382 struct drm_i915_gem_madvise *args = data;
4378 struct drm_i915_gem_object *obj; 4383 struct drm_i915_gem_object *obj;
4379 int ret; 4384 int ret;
@@ -4401,6 +4406,15 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4401 goto out; 4406 goto out;
4402 } 4407 }
4403 4408
4409 if (obj->pages &&
4410 obj->tiling_mode != I915_TILING_NONE &&
4411 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
4412 if (obj->madv == I915_MADV_WILLNEED)
4413 i915_gem_object_unpin_pages(obj);
4414 if (args->madv == I915_MADV_WILLNEED)
4415 i915_gem_object_pin_pages(obj);
4416 }
4417
4404 if (obj->madv != __I915_MADV_PURGED) 4418 if (obj->madv != __I915_MADV_PURGED)
4405 obj->madv = args->madv; 4419 obj->madv = args->madv;
4406 4420
@@ -4550,6 +4564,11 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
4550 4564
4551 WARN_ON(obj->frontbuffer_bits); 4565 WARN_ON(obj->frontbuffer_bits);
4552 4566
4567 if (obj->pages && obj->madv == I915_MADV_WILLNEED &&
4568 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES &&
4569 obj->tiling_mode != I915_TILING_NONE)
4570 i915_gem_object_unpin_pages(obj);
4571
4553 if (WARN_ON(obj->pages_pin_count)) 4572 if (WARN_ON(obj->pages_pin_count))
4554 obj->pages_pin_count = 0; 4573 obj->pages_pin_count = 0;
4555 if (discard_backing_storage(obj)) 4574 if (discard_backing_storage(obj))
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index cd7f4734c9f8..4727a4e2c87c 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -178,6 +178,15 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
178 } 178 }
179 break; 179 break;
180 } 180 }
181
182 /* check for L-shaped memory aka modified enhanced addressing */
183 if (IS_GEN4(dev)) {
184 uint32_t ddc2 = I915_READ(DCC2);
185
186 if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE))
187 dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES;
188 }
189
181 if (dcc == 0xffffffff) { 190 if (dcc == 0xffffffff) {
182 DRM_ERROR("Couldn't read from MCHBAR. " 191 DRM_ERROR("Couldn't read from MCHBAR. "
183 "Disabling tiling.\n"); 192 "Disabling tiling.\n");
@@ -380,6 +389,15 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
380 ret = i915_gem_object_ggtt_unbind(obj); 389 ret = i915_gem_object_ggtt_unbind(obj);
381 390
382 if (ret == 0) { 391 if (ret == 0) {
392 if (obj->pages &&
393 obj->madv == I915_MADV_WILLNEED &&
394 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
395 if (args->tiling_mode == I915_TILING_NONE)
396 i915_gem_object_unpin_pages(obj);
397 if (obj->tiling_mode == I915_TILING_NONE)
398 i915_gem_object_pin_pages(obj);
399 }
400
383 obj->fence_dirty = 401 obj->fence_dirty =
384 obj->last_fenced_seqno || 402 obj->last_fenced_seqno ||
385 obj->fence_reg != I915_FENCE_REG_NONE; 403 obj->fence_reg != I915_FENCE_REG_NONE;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 3a51c05ca552..3102907a96a7 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2043,6 +2043,8 @@ enum punit_power_well {
2043#define DCC_ADDRESSING_MODE_MASK (3 << 0) 2043#define DCC_ADDRESSING_MODE_MASK (3 << 0)
2044#define DCC_CHANNEL_XOR_DISABLE (1 << 10) 2044#define DCC_CHANNEL_XOR_DISABLE (1 << 10)
2045#define DCC_CHANNEL_XOR_BIT_17 (1 << 9) 2045#define DCC_CHANNEL_XOR_BIT_17 (1 << 9)
2046#define DCC2 0x10204
2047#define DCC2_MODIFIED_ENHANCED_DISABLE (1 << 20)
2046 2048
2047/* Pineview MCH register contains DDR3 setting */ 2049/* Pineview MCH register contains DDR3 setting */
2048#define CSHRDDR3CTL 0x101a8 2050#define CSHRDDR3CTL 0x101a8