diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 2 |
5 files changed, 42 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6aa34317dcbf..cbfb99dce6aa 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -338,9 +338,18 @@ typedef struct drm_i915_private { | |||
338 | unsigned int lvds_vbt:1; | 338 | unsigned int lvds_vbt:1; |
339 | unsigned int int_crt_support:1; | 339 | unsigned int int_crt_support:1; |
340 | unsigned int lvds_use_ssc:1; | 340 | unsigned int lvds_use_ssc:1; |
341 | unsigned int edp_support:1; | ||
342 | int lvds_ssc_freq; | 341 | int lvds_ssc_freq; |
343 | int edp_bpp; | 342 | |
343 | struct { | ||
344 | u8 rate:4; | ||
345 | u8 lanes:4; | ||
346 | u8 preemphasis:4; | ||
347 | u8 vswing:4; | ||
348 | |||
349 | u8 initialized:1; | ||
350 | u8 support:1; | ||
351 | u8 bpp:6; | ||
352 | } edp; | ||
344 | 353 | ||
345 | struct notifier_block lid_notifier; | 354 | struct notifier_block lid_notifier; |
346 | 355 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 123e31d5a80b..42a7a5b33a0a 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -401,14 +401,11 @@ parse_driver_features(struct drm_i915_private *dev_priv, | |||
401 | if (!driver) | 401 | if (!driver) |
402 | return; | 402 | return; |
403 | 403 | ||
404 | if (driver && SUPPORTS_EDP(dev) && | 404 | if (SUPPORTS_EDP(dev) && |
405 | driver->lvds_config == BDB_DRIVER_FEATURE_EDP) { | 405 | driver->lvds_config == BDB_DRIVER_FEATURE_EDP) |
406 | dev_priv->edp_support = 1; | 406 | dev_priv->edp.support = 1; |
407 | } else { | ||
408 | dev_priv->edp_support = 0; | ||
409 | } | ||
410 | 407 | ||
411 | if (driver && driver->dual_frequency) | 408 | if (driver->dual_frequency) |
412 | dev_priv->render_reclock_avail = true; | 409 | dev_priv->render_reclock_avail = true; |
413 | } | 410 | } |
414 | 411 | ||
@@ -417,28 +414,44 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) | |||
417 | { | 414 | { |
418 | struct bdb_edp *edp; | 415 | struct bdb_edp *edp; |
419 | 416 | ||
417 | dev_priv->edp.bpp = 18; | ||
418 | |||
420 | edp = find_section(bdb, BDB_EDP); | 419 | edp = find_section(bdb, BDB_EDP); |
421 | if (!edp) { | 420 | if (!edp) { |
422 | if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp_support) { | 421 | if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { |
423 | DRM_DEBUG_KMS("No eDP BDB found but eDP panel " | 422 | DRM_DEBUG_KMS("No eDP BDB found but eDP panel " |
424 | "supported, assume 18bpp panel color " | 423 | "supported, assume %dbpp panel color " |
425 | "depth.\n"); | 424 | "depth.\n", |
426 | dev_priv->edp_bpp = 18; | 425 | dev_priv->edp.bpp); |
427 | } | 426 | } |
428 | return; | 427 | return; |
429 | } | 428 | } |
430 | 429 | ||
431 | switch ((edp->color_depth >> (panel_type * 2)) & 3) { | 430 | switch ((edp->color_depth >> (panel_type * 2)) & 3) { |
432 | case EDP_18BPP: | 431 | case EDP_18BPP: |
433 | dev_priv->edp_bpp = 18; | 432 | dev_priv->edp.bpp = 18; |
434 | break; | 433 | break; |
435 | case EDP_24BPP: | 434 | case EDP_24BPP: |
436 | dev_priv->edp_bpp = 24; | 435 | dev_priv->edp.bpp = 24; |
437 | break; | 436 | break; |
438 | case EDP_30BPP: | 437 | case EDP_30BPP: |
439 | dev_priv->edp_bpp = 30; | 438 | dev_priv->edp.bpp = 30; |
440 | break; | 439 | break; |
441 | } | 440 | } |
441 | |||
442 | dev_priv->edp.rate = edp->link_params[panel_type].rate; | ||
443 | dev_priv->edp.lanes = edp->link_params[panel_type].lanes; | ||
444 | dev_priv->edp.preemphasis = edp->link_params[panel_type].preemphasis; | ||
445 | dev_priv->edp.vswing = edp->link_params[panel_type].vswing; | ||
446 | |||
447 | DRM_DEBUG_KMS("eDP vBIOS settings: bpp=%d, rate=%d, lanes=%d, preemphasis=%d, vswing=%d\n", | ||
448 | dev_priv->edp.bpp, | ||
449 | dev_priv->edp.rate, | ||
450 | dev_priv->edp.lanes, | ||
451 | dev_priv->edp.preemphasis, | ||
452 | dev_priv->edp.vswing); | ||
453 | |||
454 | dev_priv->edp.initialized = true; | ||
442 | } | 455 | } |
443 | 456 | ||
444 | static void | 457 | static void |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 6fbaa633d946..4843d027aaad 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -3705,7 +3705,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
3705 | else | 3705 | else |
3706 | temp |= PIPE_6BPC; | 3706 | temp |= PIPE_6BPC; |
3707 | } else if (has_edp_encoder || (is_dp && intel_pch_has_edp(crtc))) { | 3707 | } else if (has_edp_encoder || (is_dp && intel_pch_has_edp(crtc))) { |
3708 | switch (dev_priv->edp_bpp/3) { | 3708 | switch (dev_priv->edp.bpp/3) { |
3709 | case 8: | 3709 | case 8: |
3710 | temp |= PIPE_8BPC; | 3710 | temp |= PIPE_8BPC; |
3711 | break; | 3711 | break; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index ec26ee7ca992..117eb9988250 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -139,7 +139,7 @@ intel_dp_link_required(struct drm_device *dev, struct intel_dp *intel_dp, int pi | |||
139 | struct drm_i915_private *dev_priv = dev->dev_private; | 139 | struct drm_i915_private *dev_priv = dev->dev_private; |
140 | 140 | ||
141 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) | 141 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) |
142 | return (pixel_clock * dev_priv->edp_bpp) / 8; | 142 | return (pixel_clock * dev_priv->edp.bpp + 7) / 8; |
143 | else | 143 | else |
144 | return pixel_clock * 3; | 144 | return pixel_clock * 3; |
145 | } | 145 | } |
@@ -653,7 +653,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
653 | if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT) { | 653 | if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT) { |
654 | lane_count = intel_dp->lane_count; | 654 | lane_count = intel_dp->lane_count; |
655 | if (IS_PCH_eDP(intel_dp)) | 655 | if (IS_PCH_eDP(intel_dp)) |
656 | bpp = dev_priv->edp_bpp; | 656 | bpp = dev_priv->edp.bpp; |
657 | break; | 657 | break; |
658 | } | 658 | } |
659 | } | 659 | } |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 95e035a6009e..98172bcf485f 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -864,7 +864,7 @@ void intel_lvds_init(struct drm_device *dev) | |||
864 | if (HAS_PCH_SPLIT(dev)) { | 864 | if (HAS_PCH_SPLIT(dev)) { |
865 | if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) | 865 | if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) |
866 | return; | 866 | return; |
867 | if (dev_priv->edp_support) { | 867 | if (dev_priv->edp.support) { |
868 | DRM_DEBUG_KMS("disable LVDS for eDP support\n"); | 868 | DRM_DEBUG_KMS("disable LVDS for eDP support\n"); |
869 | return; | 869 | return; |
870 | } | 870 | } |