On Mon, Sep 18, 2023 at 09:25:03PM +0300, Imre Deak wrote: > Add intel_modeset_pipes_in_mask_early() to modeset a provided set of > pipes, used in a follow-up patch. > > As opposed intel_modeset_all_pipes() which modesets only the active > pipes - others don't requiring programming the HW - modeset all enabled > pipes in intel_modeset_pipes_in_mask_early() which may need to recompute > their state even if they are not active (that is in the DPMS off state). > > While at it add DocBook descriptions for the two exported functions. > > v2: > - Add a flag controlling if active planes are force updated as well. > - Add DockBook descriptions. > v3: > - For clarity use _early/_late suffixes for the exported functions > instead of the update_active_planes parameter. (Ville) > v4: > - In intel_modeset_pipes_in_mask_early() update only the crtc > flags relevant to the early phase. (Ville) > - Rename intel_modeset_all_pipes() in a separate patch. > > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Imre Deak <imre.deak@xxxxxxxxx> Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_display.c | 102 +++++++++++++++---- > drivers/gpu/drm/i915/display/intel_display.h | 2 + > 2 files changed, 83 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 6bbc9069754c4..1c9a128f4af27 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -5407,16 +5407,90 @@ intel_verify_planes(struct intel_atomic_state *state) > plane_state->uapi.visible); > } > > +static int intel_modeset_pipe(struct intel_atomic_state *state, > + struct intel_crtc_state *crtc_state, > + const char *reason) > +{ > + struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + int ret; > + > + drm_dbg_kms(&i915->drm, "[CRTC:%d:%s] Full modeset due to %s\n", > + crtc->base.base.id, crtc->base.name, reason); > + > + ret = drm_atomic_add_affected_connectors(&state->base, > + &crtc->base); > + if (ret) > + return ret; > + > + ret = intel_dp_mst_add_topology_state_for_crtc(state, crtc); > + if (ret) > + return ret; > + > + ret = intel_atomic_add_affected_planes(state, crtc); > + if (ret) > + return ret; > + > + crtc_state->uapi.mode_changed = true; > + > + return 0; > +} > + > +/** > + * intel_modeset_pipes_in_mask_early - force a full modeset on a set of pipes > + * @state: intel atomic state > + * @reason: the reason for the full modeset > + * @mask: mask of pipes to modeset > + * > + * Add pipes in @mask to @state and force a full modeset on the enabled ones > + * due to the description in @reason. > + * This function can be called only before new plane states are computed. > + * > + * Returns 0 in case of success, negative error code otherwise. > + */ > +int intel_modeset_pipes_in_mask_early(struct intel_atomic_state *state, > + const char *reason, u8 mask) > +{ > + struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_crtc *crtc; > + > + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, mask) { > + struct intel_crtc_state *crtc_state; > + int ret; > + > + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + if (!crtc_state->hw.enable || > + intel_crtc_needs_modeset(crtc_state)) > + continue; > + > + ret = intel_modeset_pipe(state, crtc_state, reason); > + if (ret) > + return ret; > + } > + > + return 0; > +} > + > +/** > + * intel_modeset_all_pipes - force a full modeset on all pipes > + * @state: intel atomic state > + * @reason: the reason for the full modeset > + * > + * Add all pipes to @state and force a full modeset on the active ones due to > + * the description in @reason. > + * This function can be called only after new plane states are computed already. > + * > + * Returns 0 in case of success, negative error code otherwise. > + */ > int intel_modeset_all_pipes(struct intel_atomic_state *state, > const char *reason) > { > struct drm_i915_private *dev_priv = to_i915(state->base.dev); > struct intel_crtc *crtc; > > - /* > - * Add all pipes to the state, and force > - * a modeset on all the active ones. > - */ > for_each_intel_crtc(&dev_priv->drm, crtc) { > struct intel_crtc_state *crtc_state; > int ret; > @@ -5429,25 +5503,11 @@ int intel_modeset_all_pipes(struct intel_atomic_state *state, > intel_crtc_needs_modeset(crtc_state)) > continue; > > - drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] Full modeset due to %s\n", > - crtc->base.base.id, crtc->base.name, reason); > + ret = intel_modeset_pipe(state, crtc_state, reason); > + if (ret) > + return ret; > > - crtc_state->uapi.mode_changed = true; > crtc_state->update_pipe = false; > - > - ret = drm_atomic_add_affected_connectors(&state->base, > - &crtc->base); > - if (ret) > - return ret; > - > - ret = intel_dp_mst_add_topology_state_for_crtc(state, crtc); > - if (ret) > - return ret; > - > - ret = intel_atomic_add_affected_planes(state, crtc); > - if (ret) > - return ret; > - > crtc_state->update_planes |= crtc_state->active_planes; > crtc_state->async_flip_planes = 0; > crtc_state->do_async_flip = false; > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h > index 49ac8473b988b..3008e8b2b437e 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.h > +++ b/drivers/gpu/drm/i915/display/intel_display.h > @@ -513,6 +513,8 @@ void intel_plane_fixup_bitmasks(struct intel_crtc_state *crtc_state); > void intel_update_watermarks(struct drm_i915_private *i915); > > /* modesetting */ > +int intel_modeset_pipes_in_mask_early(struct intel_atomic_state *state, > + const char *reason, u8 pipe_mask); > int intel_modeset_all_pipes(struct intel_atomic_state *state, > const char *reason); > void intel_modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state, > -- > 2.37.2 -- Ville Syrjälä Intel