child->aux_channel = 0;
 }
 
+static u8 dvo_port_type(u8 dvo_port)
+{
+       switch (dvo_port) {
+       case DVO_PORT_HDMIA:
+       case DVO_PORT_HDMIB:
+       case DVO_PORT_HDMIC:
+       case DVO_PORT_HDMID:
+       case DVO_PORT_HDMIE:
+       case DVO_PORT_HDMIF:
+       case DVO_PORT_HDMIG:
+       case DVO_PORT_HDMIH:
+       case DVO_PORT_HDMII:
+               return DVO_PORT_HDMIA;
+       case DVO_PORT_DPA:
+       case DVO_PORT_DPB:
+       case DVO_PORT_DPC:
+       case DVO_PORT_DPD:
+       case DVO_PORT_DPE:
+       case DVO_PORT_DPF:
+       case DVO_PORT_DPG:
+       case DVO_PORT_DPH:
+       case DVO_PORT_DPI:
+               return DVO_PORT_DPA;
+       case DVO_PORT_MIPIA:
+       case DVO_PORT_MIPIB:
+       case DVO_PORT_MIPIC:
+       case DVO_PORT_MIPID:
+               return DVO_PORT_MIPIA;
+       default:
+               return dvo_port;
+       }
+}
+
 static enum port __dvo_port_to_port(int n_ports, int n_dvo,
                                    const int port_mapping[][3], u8 dvo_port)
 {
        return false;
 }
 
-static bool child_dev_is_dp_dual_mode(const struct child_device_config *child,
-                                     enum port port)
+static bool child_dev_is_dp_dual_mode(const struct child_device_config *child)
 {
-       static const struct {
-               u16 dp, hdmi;
-       } port_mapping[] = {
-               /*
-                * Buggy VBTs may declare DP ports as having
-                * HDMI type dvo_port :( So let's check both.
-                */
-               [PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, },
-               [PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, },
-               [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
-               [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
-               [PORT_F] = { DVO_PORT_DPF, DVO_PORT_HDMIF, },
-       };
-
-       if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
-               return false;
-
        if ((child->device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
            (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
                return false;
 
-       if (child->dvo_port == port_mapping[port].dp)
+       if (dvo_port_type(child->dvo_port) == DVO_PORT_DPA)
                return true;
 
        /* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */
-       if (child->dvo_port == port_mapping[port].hdmi &&
+       if (dvo_port_type(child->dvo_port) == DVO_PORT_HDMIA &&
            child->aux_channel != 0)
                return true;
 
 bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *i915,
                                     enum port port)
 {
+       static const struct {
+               u16 dp, hdmi;
+       } port_mapping[] = {
+               /*
+                * Buggy VBTs may declare DP ports as having
+                * HDMI type dvo_port :( So let's check both.
+                */
+               [PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, },
+               [PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, },
+               [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
+               [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
+               [PORT_F] = { DVO_PORT_DPF, DVO_PORT_HDMIF, },
+       };
        const struct intel_bios_encoder_data *devdata;
 
+       if (HAS_DDI(i915)) {
+               const struct intel_bios_encoder_data *devdata;
+
+               devdata = intel_bios_encoder_data_lookup(i915, port);
+
+               return devdata && child_dev_is_dp_dual_mode(&devdata->child);
+       }
+
+       if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
+               return false;
+
        list_for_each_entry(devdata, &i915->vbt.display_devices, node) {
-               if (child_dev_is_dp_dual_mode(&devdata->child, port))
+               if ((devdata->child.dvo_port == port_mapping[port].dp ||
+                    devdata->child.dvo_port == port_mapping[port].hdmi) &&
+                   child_dev_is_dp_dual_mode(&devdata->child))
                        return true;
        }