OSDN Git Service

drm/i915/icl: Map VBT DDC Pin to BSpec DDC Pin
authorRadhakrishna Sripada <radhakrishna.sripada@intel.com>
Tue, 22 May 2018 00:25:42 +0000 (17:25 -0700)
committerPaulo Zanoni <paulo.r.zanoni@intel.com>
Fri, 1 Jun 2018 23:13:54 +0000 (16:13 -0700)
On ICL we need to map VBT DDC Pin to BSpec DDC Pin.
Adding ICL Pin Values.

According to VBT
Block 2 (General Bytes Definition)
DDC Bus

+----------+-----------+--------------------+
| DDI Type | VBT Value | BSpec Mapped Value |
+----------+-----------+--------------------+
| DDI-A    | 0x1       | 0x1                |
| DDI-B    | 0x2       | 0x2                |
| PORT-1   | 0x4       | 0x9                |
| PORT-2   | 0x5       | 0xA                |
| PORT-3   | 0x6       | 0xB                |
| PORT-4   | 0x7       | 0xC                |
+----------+-----------+--------------------+

Cc: James Ausmus <james.ausmus@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Anusha Srivatsa <anusha.srivatsa@intel.com>
Cc: Clinton Taylor <clinton.a.taylor@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: James Ausmus <james.ausmus@intel.com>
Signed-off-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
[Paulo: checkpatch fixes.]
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180522002558.29262-9-paulo.r.zanoni@intel.com
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_vbt_defs.h

index 1cf073b..465dff4 100644 (file)
@@ -1259,18 +1259,37 @@ static const u8 cnp_ddc_pin_map[] = {
        [DDC_BUS_DDI_F] = GMBUS_PIN_3_BXT, /* sic */
 };
 
+static const u8 icp_ddc_pin_map[] = {
+       [ICL_DDC_BUS_DDI_A] = GMBUS_PIN_1_BXT,
+       [ICL_DDC_BUS_DDI_B] = GMBUS_PIN_2_BXT,
+       [ICL_DDC_BUS_PORT_1] = GMBUS_PIN_9_TC1_ICP,
+       [ICL_DDC_BUS_PORT_2] = GMBUS_PIN_10_TC2_ICP,
+       [ICL_DDC_BUS_PORT_3] = GMBUS_PIN_11_TC3_ICP,
+       [ICL_DDC_BUS_PORT_4] = GMBUS_PIN_12_TC4_ICP,
+};
+
 static u8 map_ddc_pin(struct drm_i915_private *dev_priv, u8 vbt_pin)
 {
-       if (HAS_PCH_CNP(dev_priv)) {
-               if (vbt_pin < ARRAY_SIZE(cnp_ddc_pin_map)) {
-                       return cnp_ddc_pin_map[vbt_pin];
-               } else {
-                       DRM_DEBUG_KMS("Ignoring alternate pin: VBT claims DDC pin %d, which is not valid for this platform\n", vbt_pin);
-                       return 0;
-               }
+       const u8 *ddc_pin_map;
+       int n_entries;
+
+       if (HAS_PCH_ICP(dev_priv)) {
+               ddc_pin_map = icp_ddc_pin_map;
+               n_entries = ARRAY_SIZE(icp_ddc_pin_map);
+       } else if (HAS_PCH_CNP(dev_priv)) {
+               ddc_pin_map = cnp_ddc_pin_map;
+               n_entries = ARRAY_SIZE(cnp_ddc_pin_map);
+       } else {
+               /* Assuming direct map */
+               return vbt_pin;
        }
 
-       return vbt_pin;
+       if (vbt_pin < n_entries && ddc_pin_map[vbt_pin] != 0)
+               return ddc_pin_map[vbt_pin];
+
+       DRM_DEBUG_KMS("Ignoring alternate pin: VBT claims DDC pin %d, which is not valid for this platform\n",
+                     vbt_pin);
+       return 0;
 }
 
 static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
index 39c8046..c132d0c 100644 (file)
@@ -318,6 +318,12 @@ enum vbt_gmbus_ddi {
        DDC_BUS_DDI_C,
        DDC_BUS_DDI_D,
        DDC_BUS_DDI_F,
+       ICL_DDC_BUS_DDI_A = 0x1,
+       ICL_DDC_BUS_DDI_B,
+       ICL_DDC_BUS_PORT_1 = 0x4,
+       ICL_DDC_BUS_PORT_2,
+       ICL_DDC_BUS_PORT_3,
+       ICL_DDC_BUS_PORT_4,
 };
 
 #define VBT_DP_MAX_LINK_RATE_HBR3      0