diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 15 |
7 files changed, 43 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 9cf7dfe022b9..914c0dfabe60 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1587,6 +1587,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1587 | spin_lock_init(&dev_priv->irq_lock); | 1587 | spin_lock_init(&dev_priv->irq_lock); |
| 1588 | spin_lock_init(&dev_priv->error_lock); | 1588 | spin_lock_init(&dev_priv->error_lock); |
| 1589 | spin_lock_init(&dev_priv->rps_lock); | 1589 | spin_lock_init(&dev_priv->rps_lock); |
| 1590 | spin_lock_init(&dev_priv->dpio_lock); | ||
| 1590 | 1591 | ||
| 1591 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | 1592 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
| 1592 | dev_priv->num_pipe = 3; | 1593 | dev_priv->num_pipe = 3; |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8a3828528b9d..5249640cce13 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2700,9 +2700,6 @@ void intel_irq_init(struct drm_device *dev) | |||
| 2700 | dev->driver->irq_handler = i8xx_irq_handler; | 2700 | dev->driver->irq_handler = i8xx_irq_handler; |
| 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; | 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; |
| 2702 | } else if (INTEL_INFO(dev)->gen == 3) { | 2702 | } else if (INTEL_INFO(dev)->gen == 3) { |
| 2703 | /* IIR "flip pending" means done if this bit is set */ | ||
| 2704 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 2705 | |||
| 2706 | dev->driver->irq_preinstall = i915_irq_preinstall; | 2703 | dev->driver->irq_preinstall = i915_irq_preinstall; |
| 2707 | dev->driver->irq_postinstall = i915_irq_postinstall; | 2704 | dev->driver->irq_postinstall = i915_irq_postinstall; |
| 2708 | dev->driver->irq_uninstall = i915_irq_uninstall; | 2705 | dev->driver->irq_uninstall = i915_irq_uninstall; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 2dfa6cf4886b..bc2ad348e5d8 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1376,7 +1376,8 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, | |||
| 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1377 | reg, pipe_name(pipe)); | 1377 | reg, pipe_name(pipe)); |
| 1378 | 1378 | ||
| 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0 |
| 1380 | && (val & DP_PIPEB_SELECT), | ||
| 1380 | "IBX PCH dp port still using transcoder B\n"); | 1381 | "IBX PCH dp port still using transcoder B\n"); |
| 1381 | } | 1382 | } |
| 1382 | 1383 | ||
| @@ -1388,7 +1389,8 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, | |||
| 1388 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", | 1389 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1389 | reg, pipe_name(pipe)); | 1390 | reg, pipe_name(pipe)); |
| 1390 | 1391 | ||
| 1391 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1392 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & PORT_ENABLE) == 0 |
| 1393 | && (val & SDVO_PIPE_B_SELECT), | ||
| 1392 | "IBX PCH hdmi port still using transcoder B\n"); | 1394 | "IBX PCH hdmi port still using transcoder B\n"); |
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a6c426afaa7a..ace757af9133 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -2533,14 +2533,10 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2533 | break; | 2533 | break; |
| 2534 | } | 2534 | } |
| 2535 | 2535 | ||
| 2536 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2537 | |||
| 2538 | /* Cache some DPCD data in the eDP case */ | 2536 | /* Cache some DPCD data in the eDP case */ |
| 2539 | if (is_edp(intel_dp)) { | 2537 | if (is_edp(intel_dp)) { |
| 2540 | bool ret; | ||
| 2541 | struct edp_power_seq cur, vbt; | 2538 | struct edp_power_seq cur, vbt; |
| 2542 | u32 pp_on, pp_off, pp_div; | 2539 | u32 pp_on, pp_off, pp_div; |
| 2543 | struct edid *edid; | ||
| 2544 | 2540 | ||
| 2545 | pp_on = I915_READ(PCH_PP_ON_DELAYS); | 2541 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
| 2546 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); | 2542 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); |
| @@ -2591,6 +2587,13 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2591 | 2587 | ||
| 2592 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", | 2588 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", |
| 2593 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); | 2589 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); |
| 2590 | } | ||
| 2591 | |||
| 2592 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2593 | |||
| 2594 | if (is_edp(intel_dp)) { | ||
| 2595 | bool ret; | ||
| 2596 | struct edid *edid; | ||
| 2594 | 2597 | ||
| 2595 | ironlake_edp_panel_vdd_on(intel_dp); | 2598 | ironlake_edp_panel_vdd_on(intel_dp); |
| 2596 | ret = intel_dp_get_dpcd(intel_dp); | 2599 | ret = intel_dp_get_dpcd(intel_dp); |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 3df4f5fa892a..e019b2369861 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -162,19 +162,12 @@ static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) | |||
| 162 | return val; | 162 | return val; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | 165 | static u32 _intel_panel_get_max_backlight(struct drm_device *dev) |
| 166 | { | 166 | { |
| 167 | struct drm_i915_private *dev_priv = dev->dev_private; | 167 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 168 | u32 max; | 168 | u32 max; |
| 169 | 169 | ||
| 170 | max = i915_read_blc_pwm_ctl(dev_priv); | 170 | max = i915_read_blc_pwm_ctl(dev_priv); |
| 171 | if (max == 0) { | ||
| 172 | /* XXX add code here to query mode clock or hardware clock | ||
| 173 | * and program max PWM appropriately. | ||
| 174 | */ | ||
| 175 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 176 | return 1; | ||
| 177 | } | ||
| 178 | 171 | ||
| 179 | if (HAS_PCH_SPLIT(dev)) { | 172 | if (HAS_PCH_SPLIT(dev)) { |
| 180 | max >>= 16; | 173 | max >>= 16; |
| @@ -188,6 +181,22 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
| 188 | max *= 0xff; | 181 | max *= 0xff; |
| 189 | } | 182 | } |
| 190 | 183 | ||
| 184 | return max; | ||
| 185 | } | ||
| 186 | |||
| 187 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | ||
| 188 | { | ||
| 189 | u32 max; | ||
| 190 | |||
| 191 | max = _intel_panel_get_max_backlight(dev); | ||
| 192 | if (max == 0) { | ||
| 193 | /* XXX add code here to query mode clock or hardware clock | ||
| 194 | * and program max PWM appropriately. | ||
| 195 | */ | ||
| 196 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 197 | return 1; | ||
| 198 | } | ||
| 199 | |||
| 191 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); | 200 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); |
| 192 | return max; | 201 | return max; |
| 193 | } | 202 | } |
| @@ -424,7 +433,11 @@ int intel_panel_setup_backlight(struct drm_device *dev) | |||
| 424 | 433 | ||
| 425 | memset(&props, 0, sizeof(props)); | 434 | memset(&props, 0, sizeof(props)); |
| 426 | props.type = BACKLIGHT_RAW; | 435 | props.type = BACKLIGHT_RAW; |
| 427 | props.max_brightness = intel_panel_get_max_backlight(dev); | 436 | props.max_brightness = _intel_panel_get_max_backlight(dev); |
| 437 | if (props.max_brightness == 0) { | ||
| 438 | DRM_ERROR("Failed to get maximum backlight value\n"); | ||
| 439 | return -ENODEV; | ||
| 440 | } | ||
| 428 | dev_priv->backlight = | 441 | dev_priv->backlight = |
| 429 | backlight_device_register("intel_backlight", | 442 | backlight_device_register("intel_backlight", |
| 430 | &connector->kdev, dev, | 443 | &connector->kdev, dev, |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1881c8c83f0e..ba8a27b1757a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -3672,6 +3672,9 @@ static void gen3_init_clock_gating(struct drm_device *dev) | |||
| 3672 | 3672 | ||
| 3673 | if (IS_PINEVIEW(dev)) | 3673 | if (IS_PINEVIEW(dev)) |
| 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); | 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); |
| 3675 | |||
| 3676 | /* IIR "flip pending" means done if this bit is set */ | ||
| 3677 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 3675 | } | 3678 | } |
| 3676 | 3679 | ||
| 3677 | static void i85x_init_clock_gating(struct drm_device *dev) | 3680 | static void i85x_init_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d81bb0bf2885..123afd357611 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2573,7 +2573,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2573 | hotplug_mask = intel_sdvo->is_sdvob ? | 2573 | hotplug_mask = intel_sdvo->is_sdvob ? |
| 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; | 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; |
| 2575 | } | 2575 | } |
| 2576 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2577 | 2576 | ||
| 2578 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); | 2577 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); |
| 2579 | 2578 | ||
| @@ -2581,14 +2580,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2581 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) | 2580 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) |
| 2582 | goto err; | 2581 | goto err; |
| 2583 | 2582 | ||
| 2584 | /* Set up hotplug command - note paranoia about contents of reply. | ||
| 2585 | * We assume that the hardware is in a sane state, and only touch | ||
| 2586 | * the bits we think we understand. | ||
| 2587 | */ | ||
| 2588 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, | ||
| 2589 | &intel_sdvo->hotplug_active, 2); | ||
| 2590 | intel_sdvo->hotplug_active[0] &= ~0x3; | ||
| 2591 | |||
| 2592 | if (intel_sdvo_output_setup(intel_sdvo, | 2583 | if (intel_sdvo_output_setup(intel_sdvo, |
| 2593 | intel_sdvo->caps.output_flags) != true) { | 2584 | intel_sdvo->caps.output_flags) != true) { |
| 2594 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", | 2585 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", |
| @@ -2596,6 +2587,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2596 | goto err; | 2587 | goto err; |
| 2597 | } | 2588 | } |
| 2598 | 2589 | ||
| 2590 | /* Only enable the hotplug irq if we need it, to work around noisy | ||
| 2591 | * hotplug lines. | ||
| 2592 | */ | ||
| 2593 | if (intel_sdvo->hotplug_active[0]) | ||
| 2594 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2595 | |||
| 2599 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); | 2596 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); |
| 2600 | 2597 | ||
| 2601 | /* Set the input timing to the screen. Assume always input 0. */ | 2598 | /* Set the input timing to the screen. Assume always input 0. */ |
