drm/i915: Assert that the port being initialized is valid
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 16 Jun 2023 14:08:17 +0000 (17:08 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 20 Jun 2023 16:07:45 +0000 (19:07 +0300)
Sprinkle some asserts to catch any mishaps in the port_mask
vs. output init.

For DDI/DP/HDMI/SDVO I decided that we want to bail out for
an invalid port since those are the encoder types where
we might want consider driving the whole thing from the VBT
child device list, and bogus VBTs could be a real issue
(if for no other reason than the i915.vbt_firmware).

For DVO and HSW/BDW CRT port I just threw the assert in
there for good measure.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230616140820.11726-5-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/g4x_dp.c
drivers/gpu/drm/i915/display/g4x_hdmi.c
drivers/gpu/drm/i915/display/intel_crt.c
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display.h
drivers/gpu/drm/i915/display/intel_dvo.c
drivers/gpu/drm/i915/display/intel_sdvo.c

index 112d91d81fdc4c3585d9472a9c02f97a0bfb172f..c58a3f249a01168974d6a534f3ee15a08ab12f57 100644 (file)
@@ -1259,6 +1259,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
        struct drm_encoder *encoder;
        struct intel_connector *intel_connector;
 
+       if (!assert_port_valid(dev_priv, port))
+               return false;
+
        devdata = intel_bios_encoder_data_lookup(dev_priv, port);
 
        /* FIXME bail? */
index 5c187e6e0472ae4584649acb6b0ef33c772fc1df..59704939c11170718584bbf905b29496d2696acf 100644 (file)
@@ -667,6 +667,9 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
        struct intel_encoder *intel_encoder;
        struct intel_connector *intel_connector;
 
+       if (!assert_port_valid(dev_priv, port))
+               return;
+
        devdata = intel_bios_encoder_data_lookup(dev_priv, port);
 
        /* FIXME bail? */
index ab7cd5e60a0a403f19e02a2f90f3d51990b03b94..8090747586877e0b653302e292bba57c0470e38f 100644 (file)
@@ -1064,6 +1064,8 @@ void intel_crt_init(struct drm_i915_private *dev_priv)
        }
 
        if (HAS_DDI(dev_priv)) {
+               assert_port_valid(dev_priv, PORT_E);
+
                crt->base.port = PORT_E;
                crt->base.get_config = hsw_crt_get_config;
                crt->base.get_hw_state = intel_ddi_get_hw_state;
index 090f242e610c54c257e74d0715c7796680314d24..62bf6cc136ad9727177bb3d44d4324c041f693c5 100644 (file)
@@ -4661,6 +4661,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
        bool init_hdmi, init_dp;
        enum phy phy = intel_port_to_phy(dev_priv, port);
 
+       if (!assert_port_valid(dev_priv, port))
+               return;
+
        /*
         * On platforms with HTI (aka HDPORT), if it's enabled at boot it may
         * have taken over some of the PHYs and made them unavailable to the
index 395a0df003aa830b6830daa4f815d9997106ace7..d45403298a7b16013b5fa0c2328d2097cd9fa125 100644 (file)
@@ -7392,6 +7392,12 @@ static bool intel_ddi_crt_present(struct drm_i915_private *dev_priv)
        return true;
 }
 
+bool assert_port_valid(struct drm_i915_private *i915, enum port port)
+{
+       return !drm_WARN(&i915->drm, !(DISPLAY_RUNTIME_INFO(i915)->port_mask & BIT(port)),
+                        "Platform does not support port %c\n", port_name(port));
+}
+
 void intel_setup_outputs(struct drm_i915_private *dev_priv)
 {
        struct intel_encoder *encoder;
index c744c021af23689926d949faac7f9c8026b42a05..53ca0e4e23570211a471d4fb79969c60eef33cd9 100644 (file)
@@ -539,6 +539,8 @@ void assert_transcoder(struct drm_i915_private *dev_priv,
 #define assert_transcoder_enabled(d, t) assert_transcoder(d, t, true)
 #define assert_transcoder_disabled(d, t) assert_transcoder(d, t, false)
 
+bool assert_port_valid(struct drm_i915_private *i915, enum port port);
+
 /*
  * Use I915_STATE_WARN(x) (rather than WARN() and WARN_ON()) for hw state sanity
  * checks to check for unexpected conditions which may not necessarily be a user
index 9884678743b66589ba1d3e7f503bbd2a18e1a8bb..b386894c3a6db2f25119ea726826f6300c69facc 100644 (file)
@@ -509,6 +509,8 @@ void intel_dvo_init(struct drm_i915_private *i915)
                return;
        }
 
+       assert_port_valid(i915, intel_dvo->dev.port);
+
        encoder->type = INTEL_OUTPUT_DVO;
        encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
        encoder->port = intel_dvo->dev.port;
index 21f92123c844645069311deb630650cccc04b6e0..d269726a832e053a64603d9a05d2214e8726a44f 100644 (file)
@@ -3329,6 +3329,9 @@ bool intel_sdvo_init(struct drm_i915_private *dev_priv,
        struct intel_sdvo *intel_sdvo;
        int i;
 
+       if (!assert_port_valid(dev_priv, port))
+               return false;
+
        assert_sdvo_port_valid(dev_priv, port);
 
        intel_sdvo = kzalloc(sizeof(*intel_sdvo), GFP_KERNEL);