drm/i915: Reduce INTEL_DISPLAY_ENABLED to just treat outputs as disconnected
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 10 Sep 2020 16:42:56 +0000 (19:42 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 15 Sep 2020 12:28:21 +0000 (15:28 +0300)
Since the display hardware is all there even when INTEL_DISPLAY_ENABLED
return false we have to be capable of shutting it down cleanly so
as to not anger the hw. To that end let's reduce the effect of
!INTEL_DISPLAY_ENABLE to just treating all outputs as disconnected.
Should prevent anyone from automagically enabling any of them, while
still allowing us to cleanly shut them down.

v2: Put the check into the right place for CRT

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200910164256.25983-1-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
13 files changed:
drivers/gpu/drm/i915/display/icl_dsi.c
drivers/gpu/drm/i915/display/intel_crt.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/display/intel_dvo.c
drivers/gpu/drm/i915/display/intel_hdmi.c
drivers/gpu/drm/i915/display/intel_lvds.c
drivers/gpu/drm/i915/display/intel_panel.c
drivers/gpu/drm/i915/display/intel_panel.h
drivers/gpu/drm/i915/display/intel_sdvo.c
drivers/gpu/drm/i915/display/intel_tv.c
drivers/gpu/drm/i915/display/vlv_dsi.c

index f4053dd..520715b 100644 (file)
@@ -1646,6 +1646,7 @@ static const struct drm_encoder_funcs gen11_dsi_encoder_funcs = {
 };
 
 static const struct drm_connector_funcs gen11_dsi_connector_funcs = {
+       .detect = intel_panel_detect,
        .late_register = intel_connector_register,
        .early_unregister = intel_connector_unregister,
        .destroy = intel_connector_destroy,
index 5b4510c..4934edd 100644 (file)
@@ -833,6 +833,9 @@ intel_crt_detect(struct drm_connector *connector,
                    connector->base.id, connector->name,
                    force);
 
+       if (!INTEL_DISPLAY_ENABLED(dev_priv))
+               return connector_status_disconnected;
+
        if (dev_priv->params.load_detect_test) {
                wakeref = intel_display_power_get(dev_priv,
                                                  intel_encoder->power_domain);
index bacaf71..5611a3d 100644 (file)
@@ -16893,7 +16893,7 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 
        intel_pps_init(dev_priv);
 
-       if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv))
+       if (!HAS_DISPLAY(dev_priv))
                return;
 
        if (IS_ROCKETLAKE(dev_priv)) {
index 8a673d0..1a8185f 100644 (file)
@@ -6103,6 +6103,9 @@ intel_dp_detect(struct drm_connector *connector,
        drm_WARN_ON(&dev_priv->drm,
                    !drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
 
+       if (!INTEL_DISPLAY_ENABLED(dev_priv))
+               return connector_status_disconnected;
+
        /* Can't disconnect eDP */
        if (intel_dp_is_edp(intel_dp))
                status = edp_detect(intel_dp);
index b6424bf..64d8855 100644 (file)
@@ -719,9 +719,13 @@ static int
 intel_dp_mst_detect(struct drm_connector *connector,
                    struct drm_modeset_acquire_ctx *ctx, bool force)
 {
+       struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct intel_dp *intel_dp = intel_connector->mst_port;
 
+       if (!INTEL_DISPLAY_ENABLED(i915))
+               return connector_status_disconnected;
+
        if (drm_connector_is_unregistered(connector))
                return connector_status_disconnected;
 
index 307ed8a..237dbb1 100644 (file)
@@ -313,9 +313,15 @@ static void intel_dvo_pre_enable(struct intel_atomic_state *state,
 static enum drm_connector_status
 intel_dvo_detect(struct drm_connector *connector, bool force)
 {
+       struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_dvo *intel_dvo = intel_attached_dvo(to_intel_connector(connector));
+
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
                      connector->base.id, connector->name);
+
+       if (!INTEL_DISPLAY_ENABLED(i915))
+               return connector_status_disconnected;
+
        return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev);
 }
 
index 0978b0d..04f5951 100644 (file)
@@ -2673,6 +2673,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
        drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
                    connector->base.id, connector->name);
 
+       if (!INTEL_DISPLAY_ENABLED(dev_priv))
+               return connector_status_disconnected;
+
        wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
 
        if (INTEL_GEN(dev_priv) >= 11 &&
index 1888611..e65c2de 100644 (file)
@@ -456,12 +456,6 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
        return 0;
 }
 
-static enum drm_connector_status
-intel_lvds_detect(struct drm_connector *connector, bool force)
-{
-       return connector_status_connected;
-}
-
 /*
  * Return the list of DDC modes if available, or the BIOS fixed mode otherwise.
  */
@@ -490,7 +484,7 @@ static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs
 };
 
 static const struct drm_connector_funcs intel_lvds_connector_funcs = {
-       .detect = intel_lvds_detect,
+       .detect = intel_panel_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .atomic_get_property = intel_digital_connector_atomic_get_property,
        .atomic_set_property = intel_digital_connector_atomic_set_property,
index 2eb1a3a..9f23bac 100644 (file)
@@ -2095,6 +2095,17 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
        }
 }
 
+enum drm_connector_status
+intel_panel_detect(struct drm_connector *connector, bool force)
+{
+       struct drm_i915_private *i915 = to_i915(connector->dev);
+
+       if (!INTEL_DISPLAY_ENABLED(i915))
+               return connector_status_disconnected;
+
+       return connector_status_connected;
+}
+
 int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
                     struct drm_display_mode *downclock_mode)
index 968b952..5b813fe 100644 (file)
@@ -23,6 +23,8 @@ int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
                     struct drm_display_mode *downclock_mode);
 void intel_panel_fini(struct intel_panel *panel);
+enum drm_connector_status
+intel_panel_detect(struct drm_connector *connector, bool force);
 void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
                            struct drm_display_mode *adjusted_mode);
 int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state,
index 5e9fb34..4eaa4aa 100644 (file)
@@ -2084,14 +2084,18 @@ intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo,
 static enum drm_connector_status
 intel_sdvo_detect(struct drm_connector *connector, bool force)
 {
-       u16 response;
+       struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
        struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
        enum drm_connector_status ret;
+       u16 response;
 
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
                      connector->base.id, connector->name);
 
+       if (!INTEL_DISPLAY_ENABLED(i915))
+               return connector_status_disconnected;
+
        if (!intel_sdvo_get_value(intel_sdvo,
                                  SDVO_CMD_GET_ATTACHED_DISPLAYS,
                                  &response, 2))
index 777032d..7a7b99b 100644 (file)
@@ -1706,6 +1706,9 @@ intel_tv_detect(struct drm_connector *connector,
        drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] force=%d\n",
                    connector->base.id, connector->name, force);
 
+       if (!INTEL_DISPLAY_ENABLED(i915))
+               return connector_status_disconnected;
+
        if (force) {
                struct intel_load_detect_pipe tmp;
                int ret;
index 052e0b3..5e55229 100644 (file)
@@ -1585,6 +1585,7 @@ static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs
 };
 
 static const struct drm_connector_funcs intel_dsi_connector_funcs = {
+       .detect = intel_panel_detect,
        .late_register = intel_connector_register,
        .early_unregister = intel_connector_unregister,
        .destroy = intel_connector_destroy,