@@ -2420,6 +2420,7 @@ void i915_gem_reset(struct drm_device *dev)
void
i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
{
+ static bool rc6_enabled = false;
uint32_t seqno;
if (list_empty(&ring->request_list))
@@ -2443,6 +2444,17 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
if (!i915_seqno_passed(seqno, obj->last_read_seqno))
break;
+ /* Wa: can't find the w/a name.
+ * This doesn't actually implement the w/a, but it a workaround
+ * for the workaround. It defers using rc6 until we know valid
+ * state exists.
+ */
+ if (IS_BROADWELL(ring->dev) && intel_enable_rc6(ring->dev) &&
+ !rc6_enabled && ring->id == RCS) {
+ intel_enable_gt_powersave(ring->dev);
+ rc6_enabled = true;
+ }
+
i915_gem_object_move_to_inactive(obj);
}
@@ -10983,6 +10983,11 @@ void intel_modeset_init_hw(struct drm_device *dev)
intel_reset_dpio(dev);
+ if (IS_BROADWELL(dev)) {
+ DRM_DEBUG_DRIVER("Deferring RC6 enabling until first batch is complete\n");
+ return;
+ }
+
mutex_lock(&dev->struct_mutex);
intel_enable_gt_powersave(dev);
mutex_unlock(&dev->struct_mutex);