diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index b8b4a2e4bbb0..5ec74df2627e 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7232,13 +7232,6 @@ static void ironlake_init_clock_gating(struct drm_device *dev) | |||
7232 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); | 7232 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); |
7233 | 7233 | ||
7234 | /* | 7234 | /* |
7235 | * On Ibex Peak and Cougar Point, we need to disable clock | ||
7236 | * gating for the panel power sequencer or it will fail to | ||
7237 | * start up when no ports are active. | ||
7238 | */ | ||
7239 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | ||
7240 | |||
7241 | /* | ||
7242 | * According to the spec the following bits should be set in | 7235 | * According to the spec the following bits should be set in |
7243 | * order to enable memory self-refresh | 7236 | * order to enable memory self-refresh |
7244 | * The bit 22/21 of 0x42004 | 7237 | * The bit 22/21 of 0x42004 |
@@ -7295,13 +7288,6 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
7295 | 7288 | ||
7296 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); | 7289 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); |
7297 | 7290 | ||
7298 | /* | ||
7299 | * On Ibex Peak and Cougar Point, we need to disable clock | ||
7300 | * gating for the panel power sequencer or it will fail to | ||
7301 | * start up when no ports are active. | ||
7302 | */ | ||
7303 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | ||
7304 | |||
7305 | I915_WRITE(ILK_DISPLAY_CHICKEN2, | 7291 | I915_WRITE(ILK_DISPLAY_CHICKEN2, |
7306 | I915_READ(ILK_DISPLAY_CHICKEN2) | | 7292 | I915_READ(ILK_DISPLAY_CHICKEN2) | |
7307 | ILK_ELPIN_409_SELECT); | 7293 | ILK_ELPIN_409_SELECT); |
@@ -7344,13 +7330,6 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
7344 | 7330 | ||
7345 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); | 7331 | I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); |
7346 | 7332 | ||
7347 | /* | ||
7348 | * On Ibex Peak and Cougar Point, we need to disable clock | ||
7349 | * gating for the panel power sequencer or it will fail to | ||
7350 | * start up when no ports are active. | ||
7351 | */ | ||
7352 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | ||
7353 | |||
7354 | I915_WRITE(WM3_LP_ILK, 0); | 7333 | I915_WRITE(WM3_LP_ILK, 0); |
7355 | I915_WRITE(WM2_LP_ILK, 0); | 7334 | I915_WRITE(WM2_LP_ILK, 0); |
7356 | I915_WRITE(WM1_LP_ILK, 0); | 7335 | I915_WRITE(WM1_LP_ILK, 0); |
@@ -7428,6 +7407,32 @@ static void i830_init_clock_gating(struct drm_device *dev) | |||
7428 | I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE); | 7407 | I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE); |
7429 | } | 7408 | } |
7430 | 7409 | ||
7410 | static void ibx_init_clock_gating(struct drm_device *dev) | ||
7411 | { | ||
7412 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
7413 | |||
7414 | /* | ||
7415 | * On Ibex Peak and Cougar Point, we need to disable clock | ||
7416 | * gating for the panel power sequencer or it will fail to | ||
7417 | * start up when no ports are active. | ||
7418 | */ | ||
7419 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | ||
7420 | } | ||
7421 | |||
7422 | static void cpt_init_clock_gating(struct drm_device *dev) | ||
7423 | { | ||
7424 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
7425 | |||
7426 | /* | ||
7427 | * On Ibex Peak and Cougar Point, we need to disable clock | ||
7428 | * gating for the panel power sequencer or it will fail to | ||
7429 | * start up when no ports are active. | ||
7430 | */ | ||
7431 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | ||
7432 | I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | | ||
7433 | DPLS_EDP_PPS_FIX_DIS); | ||
7434 | } | ||
7435 | |||
7431 | static void ironlake_teardown_rc6(struct drm_device *dev) | 7436 | static void ironlake_teardown_rc6(struct drm_device *dev) |
7432 | { | 7437 | { |
7433 | struct drm_i915_private *dev_priv = dev->dev_private; | 7438 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -7543,6 +7548,15 @@ void ironlake_enable_rc6(struct drm_device *dev) | |||
7543 | mutex_unlock(&dev->struct_mutex); | 7548 | mutex_unlock(&dev->struct_mutex); |
7544 | } | 7549 | } |
7545 | 7550 | ||
7551 | void intel_init_clock_gating(struct drm_device *dev) | ||
7552 | { | ||
7553 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
7554 | |||
7555 | dev_priv->display.init_clock_gating(dev); | ||
7556 | |||
7557 | if (dev_priv->display.init_pch_clock_gating) | ||
7558 | dev_priv->display.init_pch_clock_gating(dev); | ||
7559 | } | ||
7546 | 7560 | ||
7547 | /* Set up chip specific display functions */ | 7561 | /* Set up chip specific display functions */ |
7548 | static void intel_init_display(struct drm_device *dev) | 7562 | static void intel_init_display(struct drm_device *dev) |
@@ -7600,6 +7614,11 @@ static void intel_init_display(struct drm_device *dev) | |||
7600 | 7614 | ||
7601 | /* For FIFO watermark updates */ | 7615 | /* For FIFO watermark updates */ |
7602 | if (HAS_PCH_SPLIT(dev)) { | 7616 | if (HAS_PCH_SPLIT(dev)) { |
7617 | if (HAS_PCH_IBX(dev)) | ||
7618 | dev_priv->display.init_pch_clock_gating = ibx_init_clock_gating; | ||
7619 | else if (HAS_PCH_CPT(dev)) | ||
7620 | dev_priv->display.init_pch_clock_gating = cpt_init_clock_gating; | ||
7621 | |||
7603 | if (IS_GEN5(dev)) { | 7622 | if (IS_GEN5(dev)) { |
7604 | if (I915_READ(MLTR_ILK) & ILK_SRLT_MASK) | 7623 | if (I915_READ(MLTR_ILK) & ILK_SRLT_MASK) |
7605 | dev_priv->display.update_wm = ironlake_update_wm; | 7624 | dev_priv->display.update_wm = ironlake_update_wm; |
@@ -7802,7 +7821,7 @@ void intel_modeset_init(struct drm_device *dev) | |||
7802 | i915_disable_vga(dev); | 7821 | i915_disable_vga(dev); |
7803 | intel_setup_outputs(dev); | 7822 | intel_setup_outputs(dev); |
7804 | 7823 | ||
7805 | dev_priv->display.init_clock_gating(dev); | 7824 | intel_init_clock_gating(dev); |
7806 | 7825 | ||
7807 | if (IS_IRONLAKE_M(dev)) { | 7826 | if (IS_IRONLAKE_M(dev)) { |
7808 | ironlake_enable_drps(dev); | 7827 | ironlake_enable_drps(dev); |