aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2013-09-18 00:12:44 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-09-19 14:38:00 -0400
commitc3787e2eac816a597a7f92daa5d0629a85e77d56 (patch)
tree7d9231ee10caed1a7d07c7fff04c03d8855bd033 /drivers/gpu/drm/i915
parent35a85ac60618521d41cfdb14f3fbfc8ad7329e9e (diff)
drm/i915: Make l3 remapping use the ring
Using LRI for setting the remapping registers allows us to stream l3 remapping information. This is necessary to handle per context remaps as we'll see implemented in an upcoming patch. Using the ring also means we don't need to frob the DOP clock gating bits. v2: Add comment about lack of worry for concurrent register access (Daniel) Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> [danvet: Bikeshed the comment a bit by doing a s/XXX/Note - there's nothing to fix.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c40
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c3
3 files changed, 23 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c6e8df737566..0c39805b881e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1949,7 +1949,7 @@ bool i915_gem_clflush_object(struct drm_i915_gem_object *obj, bool force);
1949int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj); 1949int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj);
1950int __must_check i915_gem_init(struct drm_device *dev); 1950int __must_check i915_gem_init(struct drm_device *dev);
1951int __must_check i915_gem_init_hw(struct drm_device *dev); 1951int __must_check i915_gem_init_hw(struct drm_device *dev);
1952void i915_gem_l3_remap(struct drm_device *dev, int slice); 1952int i915_gem_l3_remap(struct intel_ring_buffer *ring, int slice);
1953void i915_gem_init_swizzling(struct drm_device *dev); 1953void i915_gem_init_swizzling(struct drm_device *dev);
1954void i915_gem_cleanup_ringbuffer(struct drm_device *dev); 1954void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
1955int __must_check i915_gpu_idle(struct drm_device *dev); 1955int __must_check i915_gpu_idle(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 21a3d69679ee..e4f17e594703 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4222,35 +4222,35 @@ i915_gem_idle(struct drm_device *dev)
4222 return 0; 4222 return 0;
4223} 4223}
4224 4224
4225void i915_gem_l3_remap(struct drm_device *dev, int slice) 4225int i915_gem_l3_remap(struct intel_ring_buffer *ring, int slice)
4226{ 4226{
4227 struct drm_device *dev = ring->dev;
4227 drm_i915_private_t *dev_priv = dev->dev_private; 4228 drm_i915_private_t *dev_priv = dev->dev_private;
4228 u32 reg_base = GEN7_L3LOG_BASE + (slice * 0x200); 4229 u32 reg_base = GEN7_L3LOG_BASE + (slice * 0x200);
4229 u32 *remap_info = dev_priv->l3_parity.remap_info[slice]; 4230 u32 *remap_info = dev_priv->l3_parity.remap_info[slice];
4230 u32 misccpctl; 4231 int i, ret;
4231 int i;
4232 4232
4233 if (!HAS_L3_GPU_CACHE(dev) || !remap_info) 4233 if (!HAS_L3_GPU_CACHE(dev) || !remap_info)
4234 return; 4234 return 0;
4235 4235
4236 misccpctl = I915_READ(GEN7_MISCCPCTL); 4236 ret = intel_ring_begin(ring, GEN7_L3LOG_SIZE / 4 * 3);
4237 I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); 4237 if (ret)
4238 POSTING_READ(GEN7_MISCCPCTL); 4238 return ret;
4239 4239
4240 /*
4241 * Note: We do not worry about the concurrent register cacheline hang
4242 * here because no other code should access these registers other than
4243 * at initialization time.
4244 */
4240 for (i = 0; i < GEN7_L3LOG_SIZE; i += 4) { 4245 for (i = 0; i < GEN7_L3LOG_SIZE; i += 4) {
4241 u32 remap = I915_READ(reg_base + i); 4246 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
4242 if (remap && remap != remap_info[i/4]) 4247 intel_ring_emit(ring, reg_base + i);
4243 DRM_DEBUG("0x%x was already programmed to %x\n", 4248 intel_ring_emit(ring, remap_info[i/4]);
4244 reg_base + i, remap);
4245 if (remap && !remap_info[i/4])
4246 DRM_DEBUG_DRIVER("Clearing remapped register\n");
4247 I915_WRITE(reg_base + i, remap_info[i/4]);
4248 } 4249 }
4249 4250
4250 /* Make sure all the writes land before disabling dop clock gating */ 4251 intel_ring_advance(ring);
4251 POSTING_READ(reg_base);
4252 4252
4253 I915_WRITE(GEN7_MISCCPCTL, misccpctl); 4253 return ret;
4254} 4254}
4255 4255
4256void i915_gem_init_swizzling(struct drm_device *dev) 4256void i915_gem_init_swizzling(struct drm_device *dev)
@@ -4361,15 +4361,15 @@ i915_gem_init_hw(struct drm_device *dev)
4361 I915_WRITE(GEN7_MSG_CTL, temp); 4361 I915_WRITE(GEN7_MSG_CTL, temp);
4362 } 4362 }
4363 4363
4364 for (i = 0; i < NUM_L3_SLICES(dev); i++)
4365 i915_gem_l3_remap(dev, i);
4366
4367 i915_gem_init_swizzling(dev); 4364 i915_gem_init_swizzling(dev);
4368 4365
4369 ret = i915_gem_init_rings(dev); 4366 ret = i915_gem_init_rings(dev);
4370 if (ret) 4367 if (ret)
4371 return ret; 4368 return ret;
4372 4369
4370 for (i = 0; i < NUM_L3_SLICES(dev); i++)
4371 i915_gem_l3_remap(&dev_priv->ring[RCS], i);
4372
4373 /* 4373 /*
4374 * XXX: There was some w/a described somewhere suggesting loading 4374 * XXX: There was some w/a described somewhere suggesting loading
4375 * contexts before PPGTT. 4375 * contexts before PPGTT.
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index 3a8bf0c9b5ce..b07bdfb8892d 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -204,7 +204,8 @@ i915_l3_write(struct file *filp, struct kobject *kobj,
204 204
205 memcpy(dev_priv->l3_parity.remap_info[slice] + (offset/4), buf, count); 205 memcpy(dev_priv->l3_parity.remap_info[slice] + (offset/4), buf, count);
206 206
207 i915_gem_l3_remap(drm_dev, slice); 207 if (i915_gem_l3_remap(&dev_priv->ring[RCS], slice))
208 count = 0;
208 209
209 mutex_unlock(&drm_dev->struct_mutex); 210 mutex_unlock(&drm_dev->struct_mutex);
210 211