*
  * Note that the caller is expected to zero out the masks initially.
  */
-static void intel_get_hpd_pins(u32 *pin_mask, u32 *long_mask,
-                            u32 hotplug_trigger, u32 dig_hotplug_reg,
-                            const u32 hpd[HPD_NUM_PINS],
-                            bool long_pulse_detect(enum port port, u32 val))
+static void intel_get_hpd_pins(struct drm_i915_private *dev_priv,
+                              u32 *pin_mask, u32 *long_mask,
+                              u32 hotplug_trigger, u32 dig_hotplug_reg,
+                              const u32 hpd[HPD_NUM_PINS],
+                              bool long_pulse_detect(enum port port, u32 val))
 {
        enum port port;
        int i;
 
                *pin_mask |= BIT(i);
 
-               port = intel_hpd_pin_to_port(i);
+               port = intel_hpd_pin_to_port(dev_priv, i);
                if (port == PORT_NONE)
                        continue;
 
                u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
 
                if (hotplug_trigger) {
-                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
-                                          hotplug_trigger, hpd_status_g4x,
+                       intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
+                                          hotplug_trigger, hotplug_trigger,
+                                          hpd_status_g4x,
                                           i9xx_port_hotplug_long_detect);
 
                        intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
                u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
 
                if (hotplug_trigger) {
-                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
-                                          hotplug_trigger, hpd_status_i915,
+                       intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
+                                          hotplug_trigger, hotplug_trigger,
+                                          hpd_status_i915,
                                           i9xx_port_hotplug_long_detect);
                        intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
                }
        if (!hotplug_trigger)
                return;
 
-       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
+       intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
                           dig_hotplug_reg, hpd,
                           pch_port_hotplug_long_detect);
 
                dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
                I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
 
-               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
-                                  dig_hotplug_reg, hpd_spt,
+               intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
+                                  hotplug_trigger, dig_hotplug_reg, hpd_spt,
                                   spt_port_hotplug_long_detect);
        }
 
                dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2);
                I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
 
-               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug2_trigger,
-                                  dig_hotplug_reg, hpd_spt,
+               intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
+                                  hotplug2_trigger, dig_hotplug_reg, hpd_spt,
                                   spt_port_hotplug2_long_detect);
        }
 
        dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
        I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
 
-       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
+       intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
                           dig_hotplug_reg, hpd,
                           ilk_port_hotplug_long_detect);
 
        dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
        I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
 
-       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
+       intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
                           dig_hotplug_reg, hpd,
                           bxt_port_hotplug_long_detect);
 
 
 
 /**
  * intel_hpd_port - return port hard associated with certain pin.
+ * @dev_priv: private driver data pointer
  * @pin: the hpd pin to get associated port
  *
  * Return port that is associatade with @pin and PORT_NONE if no port is
  * hard associated with that @pin.
  */
-enum port intel_hpd_pin_to_port(enum hpd_pin pin)
+enum port intel_hpd_pin_to_port(struct drm_i915_private *dev_priv,
+                               enum hpd_pin pin)
 {
        switch (pin) {
        case HPD_PORT_A:
        case HPD_PORT_D:
                return PORT_D;
        case HPD_PORT_E:
+               if (IS_CNL_WITH_PORT_F(dev_priv))
+                       return PORT_F;
                return PORT_E;
        default:
                return PORT_NONE; /* no port for this pin */
 }
 
 /**
- * intel_hpd_pin - return pin hard associated with certain port.
+ * intel_hpd_pin_default - return default pin associated with certain port.
+ * @dev_priv: private driver data pointer
  * @port: the hpd port to get associated pin
  *
+ * It is only valid and used by digital port encoder.
+ *
  * Return pin that is associatade with @port and HDP_NONE if no pin is
  * hard associated with that @port.
  */
-enum hpd_pin intel_hpd_pin(enum port port)
+enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
+                                  enum port port)
 {
        switch (port) {
        case PORT_A:
                return HPD_PORT_D;
        case PORT_E:
                return HPD_PORT_E;
+       case PORT_F:
+               if (IS_CNL_WITH_PORT_F(dev_priv))
+                       return HPD_PORT_E;
        default:
                MISSING_CASE(port);
                return HPD_NONE;
                if (!(BIT(i) & pin_mask))
                        continue;
 
-               port = intel_hpd_pin_to_port(i);
+               port = intel_hpd_pin_to_port(dev_priv, i);
                is_dig_port = port != PORT_NONE &&
                        dev_priv->hotplug.irq_port[port];