Messages in this thread | | | Date | Tue, 24 Jan 2023 02:30:34 +0200 | Subject | Re: [PATCH Resend v11 15/15] drm/msm/disp/dpu: update dpu_enc crtc state on crtc enable/disable during self refresh | From | Dmitry Baryshkov <> |
| |
On 19/01/2023 16:26, Vinod Polimera wrote: > Populate the enocder software structure to reflect the updated > crtc appropriately during crtc enable/disable for a new commit > while taking care of the self refresh transitions when crtc > disable is triggered from the drm self refresh library. > > Signed-off-by: Vinod Polimera <quic_vpolimer@quicinc.com> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 31 ++++++++++++++++++++++++++----- > 1 file changed, 26 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > index d513aeb4..e8e456a 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > @@ -1013,14 +1013,23 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, > crtc); > struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); > struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); > - struct drm_encoder *encoder; > + struct drm_encoder *encoder = NULL;
Why is this chunk necessary?
> unsigned long flags; > bool release_bandwidth = false; > > DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); > > - if (old_crtc_state->self_refresh_active) > + /* If disable is triggered while in self refresh mode, > + * reset the encoder software state so that in enable > + * it won't trigger a warn while assigning crtc. > + */ > + if (old_crtc_state->self_refresh_active) { > + drm_for_each_encoder_mask(encoder, crtc->dev, > + old_crtc_state->encoder_mask) { > + dpu_encoder_assign_crtc(encoder, NULL); > + } > return; > + } > > /* Disable/save vblank irq handling */ > drm_crtc_vblank_off(crtc); > @@ -1033,7 +1042,14 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, > */ > if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO) > release_bandwidth = true; > - dpu_encoder_assign_crtc(encoder, NULL); > + > + /* > + * If disable is triggered during psr active(e.g: screen dim in PSR), > + * we will need encoder->crtc connection to process the device sleep & > + * preserve it during psr sequence. > + */ > + if (!crtc->state->self_refresh_active) > + dpu_encoder_assign_crtc(encoder, NULL); > } > > /* wait for frame_event_done completion */ > @@ -1081,6 +1097,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, > struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); > struct drm_encoder *encoder; > bool request_bandwidth = false; > + struct drm_crtc_state *old_crtc_state; > + > + old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc); > > pm_runtime_get_sync(crtc->dev->dev); > > @@ -1103,8 +1122,10 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, > trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc); > dpu_crtc->enabled = true; > > - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) > - dpu_encoder_assign_crtc(encoder, crtc); > + if (!old_crtc_state->self_refresh_active) { > + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) > + dpu_encoder_assign_crtc(encoder, crtc); > + } > > /* Enable/restore vblank irq handling */ > drm_crtc_vblank_on(crtc);
-- With best wishes Dmitry
| |