@@ -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(dev) && intel_enable_rc6(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);
@@ -4513,7 +4513,7 @@ void intel_enable_gt_powersave(struct drm_device *dev)
ironlake_enable_drps(dev);
ironlake_enable_rc6(dev);
intel_init_emon(dev);
- } else if (IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)) {
+ } else if (IS_GEN6(dev) || IS_GEN7(dev)) {
/*
* PCU communication is slow and this doesn't need to be
* done at any specific time, so do this out of our fast path