diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 60 | ||||
-rw-r--r-- | include/drm/drm_dp_helper.h | 3 |
3 files changed, 61 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index e4ffcd3a7aef..6d49a9f5c2b1 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -339,16 +339,16 @@ typedef struct drm_i915_private { | |||
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 | int lvds_ssc_freq; | 341 | int lvds_ssc_freq; |
342 | |||
343 | struct { | 342 | struct { |
344 | u8 rate:4; | 343 | int rate; |
345 | u8 lanes:4; | 344 | int lanes; |
346 | u8 preemphasis:4; | 345 | int preemphasis; |
347 | u8 vswing:4; | 346 | int vswing; |
348 | 347 | ||
349 | u8 initialized:1; | 348 | bool initialized; |
350 | u8 support:1; | 349 | bool support; |
351 | u8 bpp:6; | 350 | int bpp; |
351 | struct edp_power_seq pps; | ||
352 | } edp; | 352 | } edp; |
353 | 353 | ||
354 | struct notifier_block lid_notifier; | 354 | struct notifier_block lid_notifier; |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index b1f73ac0f3fd..cc15447eff41 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -24,6 +24,7 @@ | |||
24 | * Eric Anholt <eric@anholt.net> | 24 | * Eric Anholt <eric@anholt.net> |
25 | * | 25 | * |
26 | */ | 26 | */ |
27 | #include <drm/drm_dp_helper.h> | ||
27 | #include "drmP.h" | 28 | #include "drmP.h" |
28 | #include "drm.h" | 29 | #include "drm.h" |
29 | #include "i915_drm.h" | 30 | #include "i915_drm.h" |
@@ -413,6 +414,8 @@ static void | |||
413 | parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) | 414 | parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) |
414 | { | 415 | { |
415 | struct bdb_edp *edp; | 416 | struct bdb_edp *edp; |
417 | struct edp_power_seq *edp_pps; | ||
418 | struct edp_link_params *edp_link_params; | ||
416 | 419 | ||
417 | edp = find_section(bdb, BDB_EDP); | 420 | edp = find_section(bdb, BDB_EDP); |
418 | if (!edp) { | 421 | if (!edp) { |
@@ -437,19 +440,54 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) | |||
437 | break; | 440 | break; |
438 | } | 441 | } |
439 | 442 | ||
440 | dev_priv->edp.rate = edp->link_params[panel_type].rate; | 443 | /* Get the eDP sequencing and link info */ |
441 | dev_priv->edp.lanes = edp->link_params[panel_type].lanes; | 444 | edp_pps = &edp->power_seqs[panel_type]; |
442 | dev_priv->edp.preemphasis = edp->link_params[panel_type].preemphasis; | 445 | edp_link_params = &edp->link_params[panel_type]; |
443 | dev_priv->edp.vswing = edp->link_params[panel_type].vswing; | ||
444 | 446 | ||
445 | DRM_DEBUG_KMS("eDP vBIOS settings: bpp=%d, rate=%d, lanes=%d, preemphasis=%d, vswing=%d\n", | 447 | dev_priv->edp.pps = *edp_pps; |
446 | dev_priv->edp.bpp, | ||
447 | dev_priv->edp.rate, | ||
448 | dev_priv->edp.lanes, | ||
449 | dev_priv->edp.preemphasis, | ||
450 | dev_priv->edp.vswing); | ||
451 | 448 | ||
452 | dev_priv->edp.initialized = true; | 449 | dev_priv->edp.rate = edp_link_params->rate ? DP_LINK_BW_2_7 : |
450 | DP_LINK_BW_1_62; | ||
451 | switch (edp_link_params->lanes) { | ||
452 | case 0: | ||
453 | dev_priv->edp.lanes = 1; | ||
454 | break; | ||
455 | case 1: | ||
456 | dev_priv->edp.lanes = 2; | ||
457 | break; | ||
458 | case 3: | ||
459 | default: | ||
460 | dev_priv->edp.lanes = 4; | ||
461 | break; | ||
462 | } | ||
463 | switch (edp_link_params->preemphasis) { | ||
464 | case 0: | ||
465 | dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_0; | ||
466 | break; | ||
467 | case 1: | ||
468 | dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5; | ||
469 | break; | ||
470 | case 2: | ||
471 | dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_6; | ||
472 | break; | ||
473 | case 3: | ||
474 | dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5; | ||
475 | break; | ||
476 | } | ||
477 | switch (edp_link_params->vswing) { | ||
478 | case 0: | ||
479 | dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_400; | ||
480 | break; | ||
481 | case 1: | ||
482 | dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_600; | ||
483 | break; | ||
484 | case 2: | ||
485 | dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_800; | ||
486 | break; | ||
487 | case 3: | ||
488 | dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_1200; | ||
489 | break; | ||
490 | } | ||
453 | } | 491 | } |
454 | 492 | ||
455 | static void | 493 | static void |
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index a49e791db0b0..83a389e44543 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h | |||
@@ -23,6 +23,9 @@ | |||
23 | #ifndef _DRM_DP_HELPER_H_ | 23 | #ifndef _DRM_DP_HELPER_H_ |
24 | #define _DRM_DP_HELPER_H_ | 24 | #define _DRM_DP_HELPER_H_ |
25 | 25 | ||
26 | #include <linux/types.h> | ||
27 | #include <linux/i2c.h> | ||
28 | |||
26 | /* From the VESA DisplayPort spec */ | 29 | /* From the VESA DisplayPort spec */ |
27 | 30 | ||
28 | #define AUX_NATIVE_WRITE 0x8 | 31 | #define AUX_NATIVE_WRITE 0x8 |