drm/i915/bios: set default backlight controller index
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_bios.c
index 55544d4..04b8464 100644 (file)
  *
  */
 
-#include <drm/drm_edid.h>
 #include <drm/display/drm_dp_helper.h>
 #include <drm/display/drm_dsc_helper.h>
-
-#include "display/intel_display.h"
-#include "display/intel_display_types.h"
-#include "display/intel_gmbus.h"
+#include <drm/drm_edid.h>
 
 #include "i915_drv.h"
 #include "i915_reg.h"
+#include "intel_display.h"
+#include "intel_display_types.h"
+#include "intel_gmbus.h"
 
 #define _INTEL_BIOS_PRIVATE
 #include "intel_vbt_defs.h"
@@ -620,14 +619,14 @@ static void dump_pnp_id(struct drm_i915_private *i915,
 
 static int opregion_get_panel_type(struct drm_i915_private *i915,
                                   const struct intel_bios_encoder_data *devdata,
-                                  const struct edid *edid, bool use_fallback)
+                                  const struct drm_edid *drm_edid, bool use_fallback)
 {
        return intel_opregion_get_panel_type(i915);
 }
 
 static int vbt_get_panel_type(struct drm_i915_private *i915,
                              const struct intel_bios_encoder_data *devdata,
-                             const struct edid *edid, bool use_fallback)
+                             const struct drm_edid *drm_edid, bool use_fallback)
 {
        const struct bdb_lvds_options *lvds_options;
 
@@ -652,12 +651,13 @@ static int vbt_get_panel_type(struct drm_i915_private *i915,
 
 static int pnpid_get_panel_type(struct drm_i915_private *i915,
                                const struct intel_bios_encoder_data *devdata,
-                               const struct edid *edid, bool use_fallback)
+                               const struct drm_edid *drm_edid, bool use_fallback)
 {
        const struct bdb_lvds_lfp_data *data;
        const struct bdb_lvds_lfp_data_ptrs *ptrs;
        const struct lvds_pnp_id *edid_id;
        struct lvds_pnp_id edid_id_nodate;
+       const struct edid *edid = drm_edid_raw(drm_edid); /* FIXME */
        int i, best = -1;
 
        if (!edid)
@@ -701,7 +701,7 @@ static int pnpid_get_panel_type(struct drm_i915_private *i915,
 
 static int fallback_get_panel_type(struct drm_i915_private *i915,
                                   const struct intel_bios_encoder_data *devdata,
-                                  const struct edid *edid, bool use_fallback)
+                                  const struct drm_edid *drm_edid, bool use_fallback)
 {
        return use_fallback ? 0 : -1;
 }
@@ -715,13 +715,13 @@ enum panel_type {
 
 static int get_panel_type(struct drm_i915_private *i915,
                          const struct intel_bios_encoder_data *devdata,
-                         const struct edid *edid, bool use_fallback)
+                         const struct drm_edid *drm_edid, bool use_fallback)
 {
        struct {
                const char *name;
                int (*get_panel_type)(struct drm_i915_private *i915,
                                      const struct intel_bios_encoder_data *devdata,
-                                     const struct edid *edid, bool use_fallback);
+                                     const struct drm_edid *drm_edid, bool use_fallback);
                int panel_type;
        } panel_types[] = {
                [PANEL_TYPE_OPREGION] = {
@@ -745,7 +745,7 @@ static int get_panel_type(struct drm_i915_private *i915,
 
        for (i = 0; i < ARRAY_SIZE(panel_types); i++) {
                panel_types[i].panel_type = panel_types[i].get_panel_type(i915, devdata,
-                                                                         edid, use_fallback);
+                                                                         drm_edid, use_fallback);
 
                drm_WARN_ON(&i915->drm, panel_types[i].panel_type > 0xf &&
                            panel_types[i].panel_type != 0xff);
@@ -1033,6 +1033,7 @@ parse_lfp_backlight(struct drm_i915_private *i915,
        }
 
        panel->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI;
+       panel->vbt.backlight.controller = 0;
        if (i915->display.vbt.version >= 191) {
                size_t exp_size;
 
@@ -2467,6 +2468,22 @@ static enum port dvo_port_to_port(struct drm_i915_private *i915,
                                          dvo_port);
 }
 
+static enum port
+dsi_dvo_port_to_port(struct drm_i915_private *i915, u8 dvo_port)
+{
+       switch (dvo_port) {
+       case DVO_PORT_MIPIA:
+               return PORT_A;
+       case DVO_PORT_MIPIC:
+               if (DISPLAY_VER(i915) >= 11)
+                       return PORT_B;
+               else
+                       return PORT_C;
+       default:
+               return PORT_NONE;
+       }
+}
+
 static int parse_bdb_230_dp_max_link_rate(const int vbt_max_link_rate)
 {
        switch (vbt_max_link_rate) {
@@ -2577,6 +2594,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)
@@ -2627,7 +2650,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);
@@ -2635,13 +2658,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);
@@ -2694,6 +2718,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;
 
@@ -3187,7 +3213,7 @@ out:
 static void intel_bios_init_panel(struct drm_i915_private *i915,
                                  struct intel_panel *panel,
                                  const struct intel_bios_encoder_data *devdata,
-                                 const struct edid *edid,
+                                 const struct drm_edid *drm_edid,
                                  bool use_fallback)
 {
        /* already have it? */
@@ -3197,7 +3223,7 @@ static void intel_bios_init_panel(struct drm_i915_private *i915,
        }
 
        panel->vbt.panel_type = get_panel_type(i915, devdata,
-                                              edid, use_fallback);
+                                              drm_edid, use_fallback);
        if (panel->vbt.panel_type < 0) {
                drm_WARN_ON(&i915->drm, use_fallback);
                return;
@@ -3228,9 +3254,9 @@ void intel_bios_init_panel_early(struct drm_i915_private *i915,
 void intel_bios_init_panel_late(struct drm_i915_private *i915,
                                struct intel_panel *panel,
                                const struct intel_bios_encoder_data *devdata,
-                               const struct edid *edid)
+                               const struct drm_edid *drm_edid)
 {
-       intel_bios_init_panel(i915, panel, devdata, edid, true);
+       intel_bios_init_panel(i915, panel, devdata, drm_edid, true);
 }
 
 /**
@@ -3442,19 +3468,16 @@ bool intel_bios_is_dsi_present(struct drm_i915_private *i915,
 
                dvo_port = child->dvo_port;
 
-               if (dvo_port == DVO_PORT_MIPIA ||
-                   (dvo_port == DVO_PORT_MIPIB && DISPLAY_VER(i915) >= 11) ||
-                   (dvo_port == DVO_PORT_MIPIC && DISPLAY_VER(i915) < 11)) {
-                       if (port)
-                               *port = dvo_port - DVO_PORT_MIPIA;
-                       return true;
-               } else if (dvo_port == DVO_PORT_MIPIB ||
-                          dvo_port == DVO_PORT_MIPIC ||
-                          dvo_port == DVO_PORT_MIPID) {
+               if (dsi_dvo_port_to_port(i915, dvo_port) == PORT_NONE) {
                        drm_dbg_kms(&i915->drm,
                                    "VBT has unsupported DSI port %c\n",
                                    port_name(dvo_port - DVO_PORT_MIPIA));
+                       continue;
                }
+
+               if (port)
+                       *port = dsi_dvo_port_to_port(i915, dvo_port);
+               return true;
        }
 
        return false;
@@ -3539,7 +3562,7 @@ bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
                if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT))
                        continue;
 
-               if (child->dvo_port - DVO_PORT_MIPIA == encoder->port) {
+               if (dsi_dvo_port_to_port(i915, child->dvo_port) == encoder->port) {
                        if (!devdata->dsc)
                                return false;