drm/i915: fetch eDP configuration data from the VBT
authorJesse Barnes <jbarnes@virtuousgeek.org>
Thu, 7 Oct 2010 23:01:14 +0000 (16:01 -0700)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 8 Oct 2010 09:28:21 +0000 (10:28 +0100)
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>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_bios.c
include/drm/drm_dp_helper.h

index e4ffcd3a7aefa05841b699b463da57323fa62255..6d49a9f5c2b1ea2cc5ff8c3ce31ceda802b27d03 100644 (file)
@@ -339,16 +339,16 @@ typedef struct drm_i915_private {
        unsigned int int_crt_support:1;
        unsigned int lvds_use_ssc:1;
        int lvds_ssc_freq;
-
        struct {
-               u8 rate:4;
-               u8 lanes:4;
-               u8 preemphasis:4;
-               u8 vswing:4;
-
-               u8 initialized:1;
-               u8 support:1;
-               u8 bpp:6;
+               int rate;
+               int lanes;
+               int preemphasis;
+               int vswing;
+
+               bool initialized;
+               bool support;
+               int bpp;
+               struct edp_power_seq pps;
        } edp;
 
        struct notifier_block lid_notifier;
index b1f73ac0f3fd310c7599383212091fff02c1c093..cc15447eff410ad8712357e69b2dc85f1f8acafb 100644 (file)
@@ -24,6 +24,7 @@
  *    Eric Anholt <eric@anholt.net>
  *
  */
+#include <drm/drm_dp_helper.h>
 #include "drmP.h"
 #include "drm.h"
 #include "i915_drm.h"
@@ -413,6 +414,8 @@ static void
 parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
 {
        struct bdb_edp *edp;
+       struct edp_power_seq *edp_pps;
+       struct edp_link_params *edp_link_params;
 
        edp = find_section(bdb, BDB_EDP);
        if (!edp) {
@@ -437,19 +440,54 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
                break;
        }
 
-       dev_priv->edp.rate = edp->link_params[panel_type].rate;
-       dev_priv->edp.lanes = edp->link_params[panel_type].lanes;
-       dev_priv->edp.preemphasis = edp->link_params[panel_type].preemphasis;
-       dev_priv->edp.vswing = edp->link_params[panel_type].vswing;
+       /* Get the eDP sequencing and link info */
+       edp_pps = &edp->power_seqs[panel_type];
+       edp_link_params = &edp->link_params[panel_type];
 
-       DRM_DEBUG_KMS("eDP vBIOS settings: bpp=%d, rate=%d, lanes=%d, preemphasis=%d, vswing=%d\n",
-                     dev_priv->edp.bpp,
-                     dev_priv->edp.rate,
-                     dev_priv->edp.lanes,
-                     dev_priv->edp.preemphasis,
-                     dev_priv->edp.vswing);
+       dev_priv->edp.pps = *edp_pps;
 
-       dev_priv->edp.initialized = true;
+       dev_priv->edp.rate = edp_link_params->rate ? DP_LINK_BW_2_7 :
+               DP_LINK_BW_1_62;
+       switch (edp_link_params->lanes) {
+       case 0:
+               dev_priv->edp.lanes = 1;
+               break;
+       case 1:
+               dev_priv->edp.lanes = 2;
+               break;
+       case 3:
+       default:
+               dev_priv->edp.lanes = 4;
+               break;
+       }
+       switch (edp_link_params->preemphasis) {
+       case 0:
+               dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_0;
+               break;
+       case 1:
+               dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5;
+               break;
+       case 2:
+               dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_6;
+               break;
+       case 3:
+               dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5;
+               break;
+       }
+       switch (edp_link_params->vswing) {
+       case 0:
+               dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_400;
+               break;
+       case 1:
+               dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_600;
+               break;
+       case 2:
+               dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_800;
+               break;
+       case 3:
+               dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_1200;
+               break;
+       }
 }
 
 static void
index a49e791db0b0308f284a17408a7051559102ca1d..83a389e44543f19911efe7726ad48d4dd602f967 100644 (file)
@@ -23,6 +23,9 @@
 #ifndef _DRM_DP_HELPER_H_
 #define _DRM_DP_HELPER_H_
 
+#include <linux/types.h>
+#include <linux/i2c.h>
+
 /* From the VESA DisplayPort spec */
 
 #define AUX_NATIVE_WRITE       0x8