On Tue, 2021-02-16 at 18:00 +0200, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Populate conn_state->max_bpc with something sensible from the start. > Otherwise it's possible that we get to compute_sink_pipe_bpp() with > max_bpc==0. > > The specific scenario goes as follows: > 1. Initial connector state allocated with max_bpc==0 > 2. Trigger a modeset on the crtc feeding the connector, without > actually adding the connector to the commit > 3. drm_atomic_connector_check() is skipped because the > connector has not yet been added, hence conn_state->max_bpc > retains its current value > 4. drm_atomic_helper_check_modeset() -> > drm_atomic_add_affected_connectors() -> the connector > is now part of the commit > 5. compute_baseline_pipe_bpp() -> MISSING_CASE(max_bpc==0) > > Note that pipe_bpp itself may not be populated on pre-g4x machines, > in which case we just fall back to max_bpc==8 and let .compute_config() > limit the resulting pipe_bpp further if necessary. Reviewed-by: José Roberto de Souza <jose.souza@xxxxxxxxx> > > Cc: Daniel Vetter <daniel@xxxxxxxx> > Reported-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_display.c | 24 +++++++++++++------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 0dc5cb36667a..4d63e68a5ea2 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -7987,19 +7987,27 @@ static void intel_modeset_update_connector_atomic_state(struct drm_device *dev) > > > > > drm_connector_list_iter_begin(dev, &conn_iter); > for_each_intel_connector_iter(connector, &conn_iter) { > - if (connector->base.state->crtc) > + struct drm_connector_state *conn_state = connector->base.state; > + struct intel_encoder *encoder = > + to_intel_encoder(connector->base.encoder); > + > + if (conn_state->crtc) > drm_connector_put(&connector->base); > > > > > - if (connector->base.encoder) { > - connector->base.state->best_encoder = > - connector->base.encoder; > - connector->base.state->crtc = > - connector->base.encoder->crtc; > + if (encoder) { > + struct intel_crtc *crtc = > + to_intel_crtc(encoder->base.crtc); > + const struct intel_crtc_state *crtc_state = > + to_intel_crtc_state(crtc->base.state); > + > + conn_state->best_encoder = &encoder->base; > + conn_state->crtc = &crtc->base; > + conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3; > > > > > drm_connector_get(&connector->base); > } else { > - connector->base.state->best_encoder = NULL; > - connector->base.state->crtc = NULL; > + conn_state->best_encoder = NULL; > + conn_state->crtc = NULL; > } > } > drm_connector_list_iter_end(&conn_iter); _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx