enum port port)
 {
        struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[port];
+       struct child_device_config *child;
        enum port p;
 
        p = get_port_by_ddc_pin(i915, info->alternate_ddc_pin);
         * port A and port E with the same AUX ch and we must pick port E :(
         */
        info = &i915->vbt.ddi_port_info[p];
+       child = &info->devdata->child;
+
+       child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING;
+       child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT;
 
-       info->supports_dvi = false;
-       info->supports_hdmi = false;
        info->alternate_ddc_pin = 0;
 }
 
                            enum port port)
 {
        struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[port];
+       struct child_device_config *child;
        enum port p;
 
        p = get_port_by_aux_ch(i915, info->alternate_aux_channel);
         * port A and port E with the same AUX ch and we must pick port E :(
         */
        info = &i915->vbt.ddi_port_info[p];
+       child = &info->devdata->child;
 
-       info->supports_dp = false;
+       child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT;
        info->alternate_aux_channel = 0;
 }
 
        return devdata->child.device_type & DEVICE_TYPE_ANALOG_OUTPUT;
 }
 
-static bool
+bool
 intel_bios_encoder_supports_dvi(const struct intel_bios_encoder_data *devdata)
 {
        return devdata->child.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
 }
 
-static bool
+bool
 intel_bios_encoder_supports_hdmi(const struct intel_bios_encoder_data *devdata)
 {
        return intel_bios_encoder_supports_dvi(devdata) &&
                (devdata->child.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
 }
 
-static bool
+bool
 intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdata)
 {
        return devdata->child.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT;
        is_hdmi = intel_bios_encoder_supports_hdmi(devdata);
        is_edp = intel_bios_encoder_supports_edp(devdata);
 
-       info->supports_dvi = is_dvi;
-       info->supports_hdmi = is_hdmi;
-       info->supports_dp = is_dp;
-       info->supports_edp = is_edp;
-
        if (i915->vbt.version >= 195)
                info->supports_typec_usb = child->dp_usb_type_c;
 
                [PORT_F] = DVO_PORT_DPF,
        };
 
-       if (HAS_DDI(i915))
-               return i915->vbt.ddi_port_info[port].supports_edp;
+       if (HAS_DDI(i915)) {
+               const struct intel_bios_encoder_data *devdata;
+
+               devdata = intel_bios_encoder_data_lookup(i915, port);
+
+               return devdata && intel_bios_encoder_supports_edp(devdata);
+       }
 
        list_for_each_entry(devdata, &i915->vbt.display_devices, node) {
                child = &devdata->child;
        return i915->vbt.ddi_port_info[encoder->port].alternate_ddc_pin;
 }
 
-bool intel_bios_port_supports_dvi(struct drm_i915_private *i915, enum port port)
-{
-       return i915->vbt.ddi_port_info[port].supports_dvi;
-}
-
-bool intel_bios_port_supports_hdmi(struct drm_i915_private *i915, enum port port)
-{
-       return i915->vbt.ddi_port_info[port].supports_hdmi;
-}
-
-bool intel_bios_port_supports_dp(struct drm_i915_private *i915, enum port port)
-{
-       return i915->vbt.ddi_port_info[port].supports_dp;
-}
-
 bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915,
                                        enum port port)
 {
 {
        return i915->vbt.ddi_port_info[port].supports_tbt;
 }
+
+const struct intel_bios_encoder_data *
+intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port)
+{
+       return i915->vbt.ddi_port_info[port].devdata;
+}
 
 int intel_bios_hdmi_boost_level(struct intel_encoder *encoder);
 int intel_bios_dp_max_link_rate(struct intel_encoder *encoder);
 int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder);
-bool intel_bios_port_supports_dvi(struct drm_i915_private *i915, enum port port);
-bool intel_bios_port_supports_hdmi(struct drm_i915_private *i915, enum port port);
-bool intel_bios_port_supports_dp(struct drm_i915_private *i915, enum port port);
 bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port);
 bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port);
 
+const struct intel_bios_encoder_data *
+intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port);
+
+bool intel_bios_encoder_supports_dvi(const struct intel_bios_encoder_data *devdata);
+bool intel_bios_encoder_supports_hdmi(const struct intel_bios_encoder_data *devdata);
+bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdata);
+
 #endif /* _INTEL_BIOS_H_ */
 
 {
        struct intel_digital_port *dig_port;
        struct intel_encoder *encoder;
+       const struct intel_bios_encoder_data *devdata;
        bool init_hdmi, init_dp;
        enum phy phy = intel_port_to_phy(dev_priv, port);
 
                return;
        }
 
-       init_hdmi = intel_bios_port_supports_dvi(dev_priv, port) ||
-               intel_bios_port_supports_hdmi(dev_priv, port);
-       init_dp = intel_bios_port_supports_dp(dev_priv, port);
+       devdata = intel_bios_encoder_data_lookup(dev_priv, port);
+       if (!devdata) {
+               drm_dbg_kms(&dev_priv->drm,
+                           "VBT says port %c is not present\n",
+                           port_name(port));
+               return;
+       }
+
+       init_hdmi = intel_bios_encoder_supports_dvi(devdata) ||
+               intel_bios_encoder_supports_hdmi(devdata);
+       init_dp = intel_bios_encoder_supports_dp(devdata);
 
        if (intel_bios_is_lspcon_present(dev_priv, port)) {
                /*