diff options
author | Lyude Paul <lyude@redhat.com> | 2019-01-15 15:08:00 -0500 |
---|---|---|
committer | Lyude Paul <lyude@redhat.com> | 2019-01-15 16:10:43 -0500 |
commit | 96550555a78ca3c9fda4b358549a5622810fe32c (patch) | |
tree | 3eab6ac11b6e0554506588b61b91d506997deb02 /drivers/gpu/drm/i915/intel_dp_mst.c | |
parent | 81c5a2c796493d63693dae9c23aeee451695bae7 (diff) |
drm/i915: Pass down rc in intel_encoder->compute_config()
Something that I completely missed when implementing the new MST VCPI
atomic helpers is that with those helpers, there's technically a chance
of us having to grab additional modeset locks in ->compute_config() and
furthermore, that means we have the potential to hit a normal modeset
deadlock. However, because ->compute_config() only returns a bool this
means we can't return -EDEADLK when we need to drop locks and try again
which means we end up just failing the atomic check permanently. Whoops.
So, fix this by modifying ->compute_config() to pass down an actual
error code instead of a bool so that the atomic check can be restarted
on modeset deadlocks.
Thanks to Ville Syrjälä for pointing this out!
Changes since v1:
* Add some newlines
* Return only -EINVAL from hsw_crt_compute_config()
* Propogate return code from intel_dp_compute_dsc_params()
* Change all of the intel_dp_compute_link_config*() variants
* Don't miss if (hdmi_port_clock_valid()) branch in
intel_hdmi_compute_config()
Signed-off-by: Lyude Paul <lyude@redhat.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: eceae1472467 ("drm/dp_mst: Start tracking per-port VCPI allocations")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109320
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190115200800.3121-1-lyude@redhat.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index c8e2215628e6..5899debe2184 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -30,9 +30,9 @@ | |||
30 | #include <drm/drm_crtc_helper.h> | 30 | #include <drm/drm_crtc_helper.h> |
31 | #include <drm/drm_edid.h> | 31 | #include <drm/drm_edid.h> |
32 | 32 | ||
33 | static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | 33 | static int intel_dp_mst_compute_config(struct intel_encoder *encoder, |
34 | struct intel_crtc_state *pipe_config, | 34 | struct intel_crtc_state *pipe_config, |
35 | struct drm_connector_state *conn_state) | 35 | struct drm_connector_state *conn_state) |
36 | { | 36 | { |
37 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | 37 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
38 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); | 38 | struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base); |
@@ -53,7 +53,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
53 | DP_DPCD_QUIRK_CONSTANT_N); | 53 | DP_DPCD_QUIRK_CONSTANT_N); |
54 | 54 | ||
55 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) | 55 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) |
56 | return false; | 56 | return -EINVAL; |
57 | 57 | ||
58 | pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; | 58 | pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; |
59 | pipe_config->has_pch_encoder = false; | 59 | pipe_config->has_pch_encoder = false; |
@@ -90,7 +90,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
90 | if (slots < 0) { | 90 | if (slots < 0) { |
91 | DRM_DEBUG_KMS("failed finding vcpi slots:%d\n", | 91 | DRM_DEBUG_KMS("failed finding vcpi slots:%d\n", |
92 | slots); | 92 | slots); |
93 | return false; | 93 | return slots; |
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
@@ -108,7 +108,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
108 | 108 | ||
109 | intel_ddi_compute_min_voltage_level(dev_priv, pipe_config); | 109 | intel_ddi_compute_min_voltage_level(dev_priv, pipe_config); |
110 | 110 | ||
111 | return true; | 111 | return 0; |
112 | } | 112 | } |
113 | 113 | ||
114 | static int | 114 | static int |