aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Lisovskiy <[email protected]>2022-09-05 11:57:42 +0300
committerStanislav Lisovskiy <[email protected]>2022-09-06 10:31:21 +0300
commitc6266862de1665b8c8006f58612db2dea66a29f6 (patch)
tree68a2aa1f7eb3fa24e43f9ee4231aa27aacdd6e10
parent797e2c3f2762c356aadcdb53dd6bb8b8d966f7b5 (diff)
drm/i915: Fix intel_dp_mst_compute_link_config
We currently always exit that bpp loop because drm_dp_atomic_find_vcpi_slots doesn't care if we actually can fit those or not. I think that wasn't the initial intention here, especially when we keep trying with lower bpps, we are supposed to keep trying until we actually find some _working_ configuration, which isn't the case here. So added that drm_dp_mst_check here, so that we can make sure that try all the bpps before we fail. Reviewed-by: Vinod Govindapillai <[email protected]> Signed-off-by: Stanislav Lisovskiy <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
-rw-r--r--drivers/gpu/drm/i915/display/intel_dp_mst.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 14d2a64193b2..c61fd8b39c27 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -59,6 +59,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
&crtc_state->hw.adjusted_mode;
bool constant_n = drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_CONSTANT_N);
int bpp, slots = -EINVAL;
+ int ret = 0;
crtc_state->lane_count = limits->max_lane_count;
crtc_state->port_clock = limits->max_rate;
@@ -78,10 +79,21 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
crtc_state->lane_count));
if (slots == -EDEADLK)
return slots;
- if (slots >= 0)
- break;
+ if (slots >= 0) {
+ ret = drm_dp_mst_atomic_check(state);
+ /*
+ * If we got slots >= 0 and we can fit those based on check
+ * then we can exit the loop. Otherwise keep trying.
+ */
+ if (!ret)
+ break;
+ }
}
+ /* Despite slots are non-zero, we still failed the atomic check */
+ if (ret && slots >= 0)
+ slots = ret;
+
if (slots < 0) {
drm_dbg_kms(&i915->drm, "failed finding vcpi slots:%d\n",
slots);