drm/i915: Populate encoder->devdata for DSI on icl+
authorjsg <jsg@openbsd.org>
Tue, 28 Mar 2023 00:24:29 +0000 (00:24 +0000)
committerjsg <jsg@openbsd.org>
Tue, 28 Mar 2023 00:24:29 +0000 (00:24 +0000)
From Ville Syrjala
783c225e910fa5e0ef7bd9de88d32c0787e04e95 in linux-6.1.y/6.1.20
14e591a1930c2790fe862af5b01ee3ca587f752f in mainline linux

sys/dev/pci/drm/i915/display/icl_dsi.c
sys/dev/pci/drm/i915/display/intel_bios.c

index 34b3ff9..ecd6c5c 100644 (file)
@@ -2053,7 +2053,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
        /* attach connector to encoder */
        intel_connector_attach_encoder(intel_connector, encoder);
 
-       intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL, NULL);
+       encoder->devdata = intel_bios_encoder_data_lookup(dev_priv, port);
+       intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, NULL);
 
        mutex_lock(&dev->mode_config.mutex);
        intel_panel_add_vbt_lfp_fixed_mode(intel_connector);
index 2242eb0..e57e239 100644 (file)
@@ -2593,6 +2593,12 @@ intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata)
                devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR;
 }
 
+static bool
+intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata)
+{
+       return devdata->child.device_type & DEVICE_TYPE_MIPI_OUTPUT;
+}
+
 static int _intel_bios_hdmi_level_shift(const struct intel_bios_encoder_data *devdata)
 {
        if (!devdata || devdata->i915->display.vbt.version < 158)
@@ -2643,7 +2649,7 @@ static void print_ddi_port(const struct intel_bios_encoder_data *devdata,
 {
        struct drm_i915_private *i915 = devdata->i915;
        const struct child_device_config *child = &devdata->child;
-       bool is_dvi, is_hdmi, is_dp, is_edp, is_crt, supports_typec_usb, supports_tbt;
+       bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, supports_typec_usb, supports_tbt;
        int dp_boost_level, dp_max_link_rate, hdmi_boost_level, hdmi_level_shift, max_tmds_clock;
 
        is_dvi = intel_bios_encoder_supports_dvi(devdata);
@@ -2651,13 +2657,14 @@ static void print_ddi_port(const struct intel_bios_encoder_data *devdata,
        is_crt = intel_bios_encoder_supports_crt(devdata);
        is_hdmi = intel_bios_encoder_supports_hdmi(devdata);
        is_edp = intel_bios_encoder_supports_edp(devdata);
+       is_dsi = intel_bios_encoder_supports_dsi(devdata);
 
        supports_typec_usb = intel_bios_encoder_supports_typec_usb(devdata);
        supports_tbt = intel_bios_encoder_supports_tbt(devdata);
 
        drm_dbg_kms(&i915->drm,
-                   "Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d LSPCON:%d USB-Type-C:%d TBT:%d DSC:%d\n",
-                   port_name(port), is_crt, is_dvi, is_hdmi, is_dp, is_edp,
+                   "Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d DSI:%d LSPCON:%d USB-Type-C:%d TBT:%d DSC:%d\n",
+                   port_name(port), is_crt, is_dvi, is_hdmi, is_dp, is_edp, is_dsi,
                    HAS_LSPCON(i915) && child->lspcon,
                    supports_typec_usb, supports_tbt,
                    devdata->dsc != NULL);
@@ -2702,6 +2709,8 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
        enum port port;
 
        port = dvo_port_to_port(i915, child->dvo_port);
+       if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
+               port = dsi_dvo_port_to_port(i915, child->dvo_port);
        if (port == PORT_NONE)
                return;