<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<meta content="text/html; charset=UTF-8">
<style type="text/css" style="">
<!--
p
        {margin-top:0;
        margin-bottom:0}
-->
</style>
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif">
<p><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> But this patch is not about that - it is about how we signal/determine</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> that some change has to be written at commit stage.</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>As you remember when we were discussed offline, I just wanted to have</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> some expicit way to mark if some global state subsystem had changed,</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>without having to do any additional checks, because imho all the checks</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> we should do during atomic check, while commit simply applies what has</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> to be applied.</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>></span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>If you are really against having those boolean or any other way to be</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>able so simply mark some stage object "dirty" (just like mem pages</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>analogy) then would vote at least to have some helper functions to do</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>that.</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>i.e smth like:</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>></span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>>bool pipe_sagv_mask_changed(..)</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px"><br>
</span></p>
<p><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>This is just a !=, no? Don't see a function really making it any more clear.</span></p>
<p><span style="font-size:12pt"><br>
</span></p>
<p><span style="font-size:12pt">it is more compact at least(imho) and also it makes it more clear why</span><br>
</p>
<p>we do this "!=".  </p>
<p><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>></span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>> bool ddb_state_changed(...)</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:13.3333px">>So far I don't see any real need to check for that.</span><br>
</p>
<p><br>
</p>
<p>The idea behind this is that we need to recompute SAGV only</p>
<p>when either active pipes had changed or wm/ddb allocations had changed(lets</p>
<p>say we now use a different mode or less planes and so on).</p>
<p><br>
</p>
<p>Currently we have _no_ flag that indicates if ddb/wm had changed and </p>
<p>recomputing SAGV everytime "just in case" looks redundant.</p>
<p><br>
</p>
<p>To me it looks easier rather than having comparisons with implicit</p>
<p>meaning.  </p>
<p><span style="font-size:12pt">Would be even nicer to unify that idea in a sense that any global object</span></p>
<p><span style="font-size:12pt">like bw_state, dbuf_state can be checked if it's state had changed and to</span></p>
<p><span style="font-size:12pt">have it as some helper functions for that in intel_global_state.c or something like that.</span></p>
<p><span style="font-size:12pt"> </span></p>
<p><span style="font-size:12pt">If you can propose a better way, please do: I think you got the idea,</span></p>
<p><span style="font-size:12pt">what I mean.</span></p>
<div id="x_Signature">
<div style="font-family:Tahoma; font-size:13px"><font size="2"><span style="font-size:10pt"><br>
</span></font></div>
</div>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Ville Syrjälä <ville.syrjala@linux.intel.com><br>
<b>Sent:</b> Friday, February 28, 2020 6:12:36 PM<br>
<b>To:</b> Lisovskiy, Stanislav<br>
<b>Cc:</b> intel-gfx@lists.freedesktop.org; Roper, Matthew D<br>
<b>Subject:</b> Re: [PATCH v18 4/8] drm/i915: Introduce more *_state_changed indicators</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">On Fri, Feb 28, 2020 at 08:56:58AM +0000, Lisovskiy, Stanislav wrote:<br>
> On Thu, 2020-02-27 at 18:12 +0200, Ville Syrjälä wrote:<br>
> > On Tue, Feb 25, 2020 at 04:57:33PM +0200, Stanislav Lisovskiy wrote:<br>
> > > The reasoning behind this is such that current dependencies<br>
> > > in the code are rather implicit in a sense, we have to constantly<br>
> > > check a bunch of different bits like state->modeset,<br>
> > > state->active_pipe_changes, which sometimes can indicate counter<br>
> > > intuitive changes.<br>
> > > <br>
> > > By introducing more fine grained state change tracking we achieve<br>
> > > better readability and dependency maintenance for the code.<br>
> > > <br>
> > > For example it is no longer needed to evaluate active_pipe_changes<br>
> > > to understand if there were changes for wm/ddb - lets just have<br>
> > > a correspondent bit in a state, called ddb_state_changed.<br>
> > > <br>
> > > active_pipe_changes just indicate whether there was some pipe added<br>
> > > or removed. Then we evaluate if wm/ddb had been changed.<br>
> > > Same for sagv/bw state. ddb changes may or may not affect if out<br>
> > > bandwidth constraints have been changed.<br>
> > > <br>
> > > v2: Add support for older Gens in order not to introduce<br>
> > > regressions<br>
> > > <br>
> > > Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com><br>
> > > ---<br>
> > >  drivers/gpu/drm/i915/display/intel_atomic.c   |  2 ++<br>
> > >  drivers/gpu/drm/i915/display/intel_bw.c       | 28 ++++++++++++++-<br>
> > > -<br>
> > >  drivers/gpu/drm/i915/display/intel_display.c  | 16 ++++++----<br>
> > >  .../drm/i915/display/intel_display_types.h    | 32 ++++++++++++---<br>
> > > ----<br>
> > >  drivers/gpu/drm/i915/intel_pm.c               |  5 ++-<br>
> > >  5 files changed, 62 insertions(+), 21 deletions(-)<br>
> > > <br>
> > > diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c<br>
> > > b/drivers/gpu/drm/i915/display/intel_atomic.c<br>
> > > index d043057d2fa0..0db9c66d3c0f 100644<br>
> > > --- a/drivers/gpu/drm/i915/display/intel_atomic.c<br>
> > > +++ b/drivers/gpu/drm/i915/display/intel_atomic.c<br>
> > > @@ -525,6 +525,8 @@ void intel_atomic_state_clear(struct<br>
> > > drm_atomic_state *s)<br>
> > >    state->dpll_set = state->modeset = false;<br>
> > >    state->global_state_changed = false;<br>
> > >    state->active_pipes = 0;<br>
> > > + state->ddb_state_changed = false;<br>
> > > + state->bw_state_changed = false;<br>
> > <br>
> > Not really liking these.<br>
> > <br>
> > After some pondering I was thinking along the lines of something<br>
> > simple<br>
> > like this:<br>
> > <br>
> > struct bw_state {<br>
> >      u8 sagv_reject;<br>
> > };<br>
> > <br>
> > bw_check()<br>
> > {<br>
> >      for_each_crtc_in_state() {<br>
> >              if (sagv_possible(crtc_state))<br>
> >                      new->sagv_reject &= ~BIT(pipe);<br>
> >              else<br>
> >                      new->sagv_reject |= BIT(pipe);<br>
> >      }<br>
> > <br>
> >      calculate new->qgv_mask<br>
> > }<br>
> <br>
> This is exactly what's done in the next patch, except <br>
> that I store pipe, which are allowed to have SAGV, i.e:<br>
<br>
I think inverted mask idea leads to neater code because then we<br>
don't have to care which pipes are actually present in the hw<br>
and which are fused off/not present:<br>
<br>
sagv_reject == 0 -> SAGV possible<br>
sagv_reject != 0 -> SAGV not possible<br>
<br>
> <br>
>  struct intel_bw_state {<br>
>        struct intel_global_state base;<br>
>  <br>
> +     /*<br>
> +      * Contains a bit mask, used to determine, whether<br>
> correspondent<br>
> +      * pipe allows SAGV or not.<br>
> +      */<br>
> +     u8 pipe_sagv_mask;<br>
> +<br>
> +     /*<br>
> +      * Used to determine if we already had calculated<br>
> +      * SAGV mask for this state once.<br>
> +      */<br>
> +     bool sagv_calculated;<br>
> +<br>
> +     /*<br>
> +      * Contains final SAGV decision based on current mask,<br>
> +      * to prevent doing the same job over and over again.<br>
> +      */<br>
> +     bool can_sagv;<br>
> +<br>
> <br>
> Also the mask is calculated almost exactly same way:<br>
> <br>
> static void icl_compute_sagv_mask(struct intel_atomic_state *state)<br>
> +{<br>
> +     struct intel_crtc *crtc;<br>
> +     struct intel_crtc_state *new_crtc_state;<br>
> +     int i;<br>
> +     struct intel_bw_state *new_bw_state =<br>
> intel_bw_get_state(state);<br>
> +<br>
> +     if (IS_ERR(new_bw_state)) {<br>
> +             WARN(1, "Could not get bw_state\n");<br>
> +             return;<br>
> +     }<br>
> +<br>
> +     for_each_new_intel_crtc_in_state(state, crtc,<br>
> +                                      new_crtc_state, i) {<br>
> +             if (skl_can_enable_sagv_on_pipe(state, crtc->pipe))<br>
> +                     new_bw_state->pipe_sagv_mask |= BIT(crtc-<br>
> >pipe);<br>
> +             else<br>
> +                     new_bw_state->pipe_sagv_mask &= ~BIT(crtc-<br>
> >pipe);<br>
> +     }<br>
> +}<br>
> <br>
> But this patch is not about that - it is about how we signal/determine<br>
> that some change has to be written at commit stage.<br>
> As you remember when we were discussed offline, I just wanted to have<br>
> some expicit way to mark if some global state subsystem had changed,<br>
> without having to do any additional checks, because imho all the checks<br>
> we should do during atomic check, while commit simply applies what has<br>
> to be applied.<br>
> <br>
> If you are really against having those boolean or any other way to be<br>
> able so simply mark some stage object "dirty" (just like mem pages<br>
> analogy) then would vote at least to have some helper functions to do<br>
> that. <br>
> i.e smth like:<br>
> <br>
> bool pipe_sagv_mask_changed(..)<br>
<br>
This is just a !=, no? Don't see a function really making it any more clear.<br>
<br>
> <br>
> bool ddb_state_changed(...)<br>
<br>
So far I don't see any real need to check for that.<br>
<br>
>  <br>
> Stan<br>
> <br>
> > <br>
> > >  }<br>
> > >  <br>
> > >  struct intel_crtc_state *<br>
> > > diff --git a/drivers/gpu/drm/i915/display/intel_bw.c<br>
> > > b/drivers/gpu/drm/i915/display/intel_bw.c<br>
> > > index bdad7476dc7b..d5be603b8b03 100644<br>
> > > --- a/drivers/gpu/drm/i915/display/intel_bw.c<br>
> > > +++ b/drivers/gpu/drm/i915/display/intel_bw.c<br>
> > > @@ -424,9 +424,27 @@ int intel_bw_atomic_check(struct<br>
> > > intel_atomic_state *state)<br>
> > >    struct intel_crtc *crtc;<br>
> > >    int i, ret;<br>
> > >  <br>
> > > - /* FIXME earlier gens need some checks too */<br>
> > > - if (INTEL_GEN(dev_priv) < 11)<br>
> > > + /*<br>
> > > +  * For earlier Gens let's consider bandwidth changed if ddb<br>
> > > requirements,<br>
> > > +  * has been changed.<br>
> > > +  */<br>
> > > + if (INTEL_GEN(dev_priv) < 11) {<br>
> > > +         if (state->ddb_state_changed) {<br>
> > > +                 bw_state = intel_bw_get_state(state);<br>
> > > +                 if (IS_ERR(bw_state))<br>
> > > +                         return PTR_ERR(bw_state);<br>
> > > +<br>
> > > +                 ret = intel_atomic_lock_global_state(&bw_state-<br>
> > > >base);<br>
> > > +                 if (ret)<br>
> > > +                         return ret;<br>
> > > +<br>
> > > +                 DRM_DEBUG_KMS("Marking bw state changed for<br>
> > > atomic state %p\n",<br>
> > > +                               state);<br>
> > > +<br>
> > > +                 state->bw_state_changed = true;<br>
> > > +         }<br>
> > >            return 0;<br>
> > > + }<br>
> > >  <br>
> > >    for_each_oldnew_intel_crtc_in_state(state, crtc,<br>
> > > old_crtc_state,<br>
> > >                                        new_crtc_state, i) {<br>
> > > @@ -447,7 +465,7 @@ int intel_bw_atomic_check(struct<br>
> > > intel_atomic_state *state)<br>
> > >                old_active_planes == new_active_planes)<br>
> > >                    continue;<br>
> > >  <br>
> > > -         bw_state  = intel_bw_get_state(state);<br>
> > > +         bw_state = intel_bw_get_state(state);<br>
> > >            if (IS_ERR(bw_state))<br>
> > >                    return PTR_ERR(bw_state);<br>
> > >  <br>
> > > @@ -468,6 +486,10 @@ int intel_bw_atomic_check(struct<br>
> > > intel_atomic_state *state)<br>
> > >    if (ret)<br>
> > >            return ret;<br>
> > >  <br>
> > > + DRM_DEBUG_KMS("Marking bw state changed for atomic state %p\n",<br>
> > > state);<br>
> > > +<br>
> > > + state->bw_state_changed = true;<br>
> > > +<br>
> > >    data_rate = intel_bw_data_rate(dev_priv, bw_state);<br>
> > >    num_active_planes = intel_bw_num_active_planes(dev_priv,<br>
> > > bw_state);<br>
> > >  <br>
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c<br>
> > > b/drivers/gpu/drm/i915/display/intel_display.c<br>
> > > index 3031e64ee518..137fb645097a 100644<br>
> > > --- a/drivers/gpu/drm/i915/display/intel_display.c<br>
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.c<br>
> > > @@ -15540,8 +15540,10 @@ static void<br>
> > > intel_atomic_commit_tail(struct intel_atomic_state *state)<br>
> > >             * SKL workaround: bspec recommends we disable the SAGV<br>
> > > when we<br>
> > >             * have more then one pipe enabled<br>
> > >             */<br>
> > > -         if (!intel_can_enable_sagv(state))<br>
> > > -                 intel_disable_sagv(dev_priv);<br>
> > > +         if (state->bw_state_changed) {<br>
> > > +                 if (!intel_can_enable_sagv(state))<br>
> > > +                         intel_disable_sagv(dev_priv);<br>
> > > +         }<br>
> > >  <br>
> > >            intel_modeset_verify_disabled(dev_priv, state);<br>
> > >    }<br>
> > > @@ -15565,7 +15567,7 @@ static void intel_atomic_commit_tail(struct<br>
> > > intel_atomic_state *state)<br>
> > >            intel_encoders_update_prepare(state);<br>
> > >  <br>
> > >    /* Enable all new slices, we might need */<br>
> > > - if (state->modeset)<br>
> > > + if (state->ddb_state_changed)<br>
> > >            icl_dbuf_slice_pre_update(state);<br>
> > >  <br>
> > >    /* Now enable the clocks, plane, pipe, and connectors that we<br>
> > > set up. */<br>
> > > @@ -15622,7 +15624,7 @@ static void intel_atomic_commit_tail(struct<br>
> > > intel_atomic_state *state)<br>
> > >    }<br>
> > >  <br>
> > >    /* Disable all slices, we don't need */<br>
> > > - if (state->modeset)<br>
> > > + if (state->ddb_state_changed)<br>
> > >            icl_dbuf_slice_post_update(state);<br>
> > >  <br>
> > >    for_each_oldnew_intel_crtc_in_state(state, crtc,<br>
> > > old_crtc_state, new_crtc_state, i) {<br>
> > > @@ -15641,8 +15643,10 @@ static void<br>
> > > intel_atomic_commit_tail(struct intel_atomic_state *state)<br>
> > >    if (state->modeset)<br>
> > >            intel_verify_planes(state);<br>
> > >  <br>
> > > - if (state->modeset && intel_can_enable_sagv(state))<br>
> > > -         intel_enable_sagv(dev_priv);<br>
> > > + if (state->bw_state_changed) {<br>
> > > +         if (intel_can_enable_sagv(state)<br>
> > > +                 intel_enable_sagv(dev_priv);<br>
> > > + }<br>
> > >  <br>
> > >    drm_atomic_helper_commit_hw_done(&state->base);<br>
> > >  <br>
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h<br>
> > > b/drivers/gpu/drm/i915/display/intel_display_types.h<br>
> > > index 0d8a64305464..12b47ba3c68d 100644<br>
> > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h<br>
> > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h<br>
> > > @@ -471,16 +471,6 @@ struct intel_atomic_state {<br>
> > >  <br>
> > >    bool dpll_set, modeset;<br>
> > >  <br>
> > > - /*<br>
> > > -  * Does this transaction change the pipes that are<br>
> > > active?  This mask<br>
> > > -  * tracks which CRTC's have changed their active state at the<br>
> > > end of<br>
> > > -  * the transaction (not counting the temporary disable during<br>
> > > modesets).<br>
> > > -  * This mask should only be non-zero when intel_state->modeset<br>
> > > is true,<br>
> > > -  * but the converse is not necessarily true; simply changing a<br>
> > > mode may<br>
> > > -  * not flip the final active status of any CRTC's<br>
> > > -  */<br>
> > > - u8 active_pipe_changes;<br>
> > > -<br>
> > >    u8 active_pipes;<br>
> > >  <br>
> > >    struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS];<br>
> > > @@ -494,10 +484,30 @@ struct intel_atomic_state {<br>
> > >    bool rps_interactive;<br>
> > >  <br>
> > >    /*<br>
> > > -  * active_pipes<br>
> > > +  * active pipes<br>
> > >     */<br>
> > >    bool global_state_changed;<br>
> > >  <br>
> > > + /*<br>
> > > +  * Does this transaction change the pipes that are<br>
> > > active?  This mask<br>
> > > +  * tracks which CRTC's have changed their active state at the<br>
> > > end of<br>
> > > +  * the transaction (not counting the temporary disable during<br>
> > > modesets).<br>
> > > +  * This mask should only be non-zero when intel_state->modeset<br>
> > > is true,<br>
> > > +  * but the converse is not necessarily true; simply changing a<br>
> > > mode may<br>
> > > +  * not flip the final active status of any CRTC's<br>
> > > +  */<br>
> > > + u8 active_pipe_changes;<br>
> > > +<br>
> > > + /*<br>
> > > +  * More granular change indicator for ddb changes<br>
> > > +  */<br>
> > > + bool ddb_state_changed;<br>
> > > +<br>
> > > + /*<br>
> > > +  * More granular change indicator for bandwidth state changes<br>
> > > +  */<br>
> > > + bool bw_state_changed;<br>
> > > +<br>
> > >    /* Number of enabled DBuf slices */<br>
> > >    u8 enabled_dbuf_slices_mask;<br>
> > >  <br>
> > > diff --git a/drivers/gpu/drm/i915/intel_pm.c<br>
> > > b/drivers/gpu/drm/i915/intel_pm.c<br>
> > > index 409b91c17a7f..ac4b317ea1bf 100644<br>
> > > --- a/drivers/gpu/drm/i915/intel_pm.c<br>
> > > +++ b/drivers/gpu/drm/i915/intel_pm.c<br>
> > > @@ -3894,7 +3894,7 @@ skl_ddb_get_pipe_allocation_limits(struct<br>
> > > drm_i915_private *dev_priv,<br>
> > >     * that changes the active CRTC list or do modeset would need<br>
> > > to<br>
> > >     * grab _all_ crtc locks, including the one we currently hold.<br>
> > >     */<br>
> > > - if (!intel_state->active_pipe_changes && !intel_state->modeset) <br>
> > > {<br>
> > > + if (!intel_state->ddb_state_changed) {<br>
> > >            /*<br>
> > >             * alloc may be cleared by clear_intel_crtc_state,<br>
> > >             * copy from old state to be sure<br>
> > > @@ -5787,6 +5787,9 @@ static int skl_wm_add_affected_planes(struct<br>
> > > intel_atomic_state *state,<br>
> > >                    return PTR_ERR(plane_state);<br>
> > >  <br>
> > >            new_crtc_state->update_planes |= BIT(plane_id);<br>
> > > +<br>
> > > +         DRM_DEBUG_KMS("Marking ddb state changed for atomic<br>
> > > state %p\n", state);<br>
> > > +         state->ddb_state_changed = true;<br>
> > >    }<br>
> > >  <br>
> > >    return 0;<br>
> > > -- <br>
> > > 2.24.1.485.gad05a3d8e5<br>
> > <br>
> > <br>
<br>
-- <br>
Ville Syrjälä<br>
Intel<br>
</div>
</span></font>
</body>
</html>