mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 21:45:08 -04:00
drm/i915: Assert that the port being initialized is valid
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
This commit is contained in:
@@ -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? */
|
||||
|
||||
@@ -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? */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user