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 f4053dd6bde9028e7d4fd4297e913b167e5b626c..520715b7d5b5545ebd7d13f97efe2f65f6392d17 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 5b4510ce569352ee878bcbb121dc4cd362d0e357..4934edd51cb0b6000ac293c6dd85c70be51abe35 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 bacaf713eed4a2e6b0335543d0669247f5a3e306..5611a3d9559409c731e8fb6492c2bb413454ec73 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 8a673d0d70515e82890ddd320c9f478a010b7f8a..1a8185f8fb8ea1b00ad6361116eb3f5c4f5dabaa 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 b6424bf5d544df68e02f2a4b39c311be7a502873..64d885539e94ad4d11dc70df56cb1475d3998ae0 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 307ed8ae9a19f024ce5abcd1f461b185a2f327d2..237dbb1ba0eeb6c38c95e81e4902ede184b318ab 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 0978b0d8f4c67fb7d38e5614556bd70454c30fbe..04f59516d5f315b727ba623acd969c16e4f3ec01 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 1888611244db7c000c94bbc36101361a82024f22..e65c2de522c3c4d6542bac9cf038ff53800acf8f 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 2eb1a3a93df19d61bc184db530332974e4216a7a..9f23bac0d7924d3857e1e0e8fdc202f1341dc5b5 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 968b95281cb415845a6100e42d3f37041882da9d..5b813fe90557c17210261722a441d6fb40c88647 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 5e9fb349c829266b662516d3371b47f1653f294b..4eaa4aa86ecdf68518e688928d3ac3b44904dfc9 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 777032d9697b578c2c5e18aa0e19d6950f8719fd..7a7b99b015a50c86ebe2b306ffd4400990abfc3f 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 052e0b31a2dadf6296a3ea25291a1fd21f5597e3..5e5522923b1e46c6d795a82eab3555abdabd04da 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,