aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h13
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c41
-rw-r--r--drivers/gpu/drm/i915/intel_display.c2
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c4
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c2
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
444static void 457static 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 }