|
@@ -38,8 +38,8 @@
|
|
|
#include "i915_drv.h"
|
|
|
#include "i915_trace.h"
|
|
|
#include "drm_dp_helper.h"
|
|
|
-
|
|
|
#include "drm_crtc_helper.h"
|
|
|
+#include <linux/dma_remapping.h>
|
|
|
|
|
|
#define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
|
|
|
|
|
@@ -7887,6 +7887,33 @@ void intel_init_emon(struct drm_device *dev)
|
|
|
dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
|
|
|
}
|
|
|
|
|
|
+static bool intel_enable_rc6(struct drm_device *dev)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Respect the kernel parameter if it is set
|
|
|
+ */
|
|
|
+ if (i915_enable_rc6 >= 0)
|
|
|
+ return i915_enable_rc6;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Disable RC6 on Ironlake
|
|
|
+ */
|
|
|
+ if (INTEL_INFO(dev)->gen == 5)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Enable rc6 on Sandybridge if DMA remapping is disabled
|
|
|
+ */
|
|
|
+ if (INTEL_INFO(dev)->gen == 6) {
|
|
|
+ DRM_DEBUG_DRIVER("Sandybridge: intel_iommu_enabled %s -- RC6 %sabled\n",
|
|
|
+ intel_iommu_enabled ? "true" : "false",
|
|
|
+ !intel_iommu_enabled ? "en" : "dis");
|
|
|
+ return !intel_iommu_enabled;
|
|
|
+ }
|
|
|
+ DRM_DEBUG_DRIVER("RC6 enabled\n");
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
|
|
@@ -7923,7 +7950,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
|
|
I915_WRITE(GEN6_RC6p_THRESHOLD, 100000);
|
|
|
I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */
|
|
|
|
|
|
- if (i915_enable_rc6)
|
|
|
+ if (intel_enable_rc6(dev_priv->dev))
|
|
|
rc6_mask = GEN6_RC_CTL_RC6p_ENABLE |
|
|
|
GEN6_RC_CTL_RC6_ENABLE;
|
|
|
|
|
@@ -8372,7 +8399,7 @@ void ironlake_enable_rc6(struct drm_device *dev)
|
|
|
/* rc6 disabled by default due to repeated reports of hanging during
|
|
|
* boot and resume.
|
|
|
*/
|
|
|
- if (!i915_enable_rc6)
|
|
|
+ if (!intel_enable_rc6(dev))
|
|
|
return;
|
|
|
|
|
|
mutex_lock(&dev->struct_mutex);
|