diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-10-07 19:01:14 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-08 05:28:21 -0400 |
commit | 9f0e7ff4b366d27570cbe0ffa137ed1018009114 (patch) | |
tree | 47c12c05cb5089ea00bbdad7715a2acaa8890ad0 | |
parent | 723bfd707a97fee06eb3ba4d3e8b4714c29a1064 (diff) |
drm/i915: fetch eDP configuration data from the VBT
We need to use some of these values in eDP configurations, so be sure to
fetch them and store them in the i915 private structure.
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-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 |