|
@@ -3527,6 +3527,38 @@ i915_gem_idle(struct drm_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+void i915_gem_l3_remap(struct drm_device *dev)
|
|
|
+{
|
|
|
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
|
|
+ u32 misccpctl;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (!IS_IVYBRIDGE(dev))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (!dev_priv->mm.l3_remap_info)
|
|
|
+ return;
|
|
|
+
|
|
|
+ misccpctl = I915_READ(GEN7_MISCCPCTL);
|
|
|
+ I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
|
|
|
+ POSTING_READ(GEN7_MISCCPCTL);
|
|
|
+
|
|
|
+ for (i = 0; i < GEN7_L3LOG_SIZE; i += 4) {
|
|
|
+ u32 remap = I915_READ(GEN7_L3LOG_BASE + i);
|
|
|
+ if (remap && remap != dev_priv->mm.l3_remap_info[i/4])
|
|
|
+ DRM_DEBUG("0x%x was already programmed to %x\n",
|
|
|
+ GEN7_L3LOG_BASE + i, remap);
|
|
|
+ if (remap && !dev_priv->mm.l3_remap_info[i/4])
|
|
|
+ DRM_DEBUG_DRIVER("Clearing remapped register\n");
|
|
|
+ I915_WRITE(GEN7_L3LOG_BASE + i, dev_priv->mm.l3_remap_info[i/4]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Make sure all the writes land before disabling dop clock gating */
|
|
|
+ POSTING_READ(GEN7_L3LOG_BASE);
|
|
|
+
|
|
|
+ I915_WRITE(GEN7_MISCCPCTL, misccpctl);
|
|
|
+}
|
|
|
+
|
|
|
void i915_gem_init_swizzling(struct drm_device *dev)
|
|
|
{
|
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
@@ -3616,6 +3648,8 @@ i915_gem_init_hw(struct drm_device *dev)
|
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
|
int ret;
|
|
|
|
|
|
+ i915_gem_l3_remap(dev);
|
|
|
+
|
|
|
i915_gem_init_swizzling(dev);
|
|
|
|
|
|
ret = intel_init_render_ring_buffer(dev);
|