<div dir="ltr"><br><div class="gmail_quote"><div dir="ltr">On Thu, Apr 6, 2017 at 12:34 AM Maarten Lankhorst <<a href="mailto:maarten.lankhorst@linux.intel.com">maarten.lankhorst@linux.intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Op 06-04-17 om 03:27 schreef Pandiyan, Dhinakaran:<br class="gmail_msg">
> On Wed, 2017-04-05 at 12:06 +0200, Daniel Vetter wrote:<br class="gmail_msg">
>> On Wed, Apr 05, 2017 at 10:41:24AM +0200, Maarten Lankhorst wrote:<br class="gmail_msg">
>>> The connector atomic check function may be called multiple times,<br class="gmail_msg">
>>> or not at all. It's mostly useful for implementing properties but if you<br class="gmail_msg">
>>> call check_modeset twice it can be used for other modeset related checks<br class="gmail_msg">
>>> as well.<br class="gmail_msg">
>>><br class="gmail_msg">
>>> Signed-off-by: Maarten Lankhorst <<a href="mailto:maarten.lankhorst@linux.intel.com" class="gmail_msg" target="_blank">maarten.lankhorst@linux.intel.com</a>><br class="gmail_msg">
>>> ---<br class="gmail_msg">
>>>  drivers/gpu/drm/drm_atomic_helper.c      | 25 +++++++++++++++++----<br class="gmail_msg">
>>>  include/drm/drm_modeset_helper_vtables.h | 37 ++++++++++++++++++++++++++++++++<br class="gmail_msg">
>>>  2 files changed, 58 insertions(+), 4 deletions(-)<br class="gmail_msg">
>>><br class="gmail_msg">
>>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c<br class="gmail_msg">
>>> index c3994b4d5f32..d550e79e8347 100644<br class="gmail_msg">
>>> --- a/drivers/gpu/drm/drm_atomic_helper.c<br class="gmail_msg">
>>> +++ b/drivers/gpu/drm/drm_atomic_helper.c<br class="gmail_msg">
>>> @@ -459,10 +459,20 @@ mode_fixup(struct drm_atomic_state *state)<br class="gmail_msg">
>>>   *<br class="gmail_msg">
>>>   * Check the state object to see if the requested state is physically possible.<br class="gmail_msg">
>>>   * This does all the crtc and connector related computations for an atomic<br class="gmail_msg">
>>> - * update and adds any additional connectors needed for full modesets and calls<br class="gmail_msg">
>>> - * down into &drm_crtc_helper_funcs.mode_fixup and<br class="gmail_msg">
>>> - * &drm_encoder_helper_funcs.mode_fixup or<br class="gmail_msg">
>>> - * &drm_encoder_helper_funcs.atomic_check functions of the driver backend.<br class="gmail_msg">
>>> + * update and adds any additional connectors needed for full modesets. It calls<br class="gmail_msg">
>>> + * the various per-object callbacks in the follow order:<br class="gmail_msg">
>>> + *<br class="gmail_msg">
>>> + * 1. &drm_connector_helper_funcs.atomic_best_encoder for determining the new encoder.<br class="gmail_msg">
>>> + * 2. &drm_connector_helper_funcs.atomic_check to validate the connector state.<br class="gmail_msg">
>>> + * 3. If it's determined a modeset is needed then all connectors on the affected crtc<br class="gmail_msg">
>>> + *    crtc are added.<br class="gmail_msg">
> Typo - 'crtc' typed twice.<br class="gmail_msg">
><br class="gmail_msg">
> update_output_state which is called before _helper_check_modeset() also<br class="gmail_msg">
> adds all affected connectors. Why is that not considered when you say<br class="gmail_msg">
> affected connectors are added in Step 3? Is that because<br class="gmail_msg">
> update_output_state() is in the legacy modeset path?<br class="gmail_msg">
Yes. update_output_state is just a legacy function.<br class="gmail_msg">
<br class="gmail_msg">
When a crtc is cloned, a atomic update may only disable 1 connector and leave the other one enabled. In this case there's a modeset<br class="gmail_msg">
but all connectors are not checked yet.<br class="gmail_msg">
<br class="gmail_msg">
Similar for changing crtc_state->active, which may also result in a modeset with no connectors added yet.<br class="gmail_msg">
><br class="gmail_msg">
>>> + * 4. &drm_bridge_funcs.mode_fixup is called on all encoder bridges.<br class="gmail_msg">
>>> + * 5. &drm_encoder_helper_funcs.atomic_check is called to validate any encoder state.<br class="gmail_msg">
>>> + *    This function is only called when the encoder will be part of a configured crtc,<br class="gmail_msg">
>>> + *    it must not be used for implementing connector property validation.<br class="gmail_msg">
>>> + *    If this function is NULL, &drm_atomic_encoder_helper_funcs.mode_fixup is called<br class="gmail_msg">
>>> + *    instead.<br class="gmail_msg">
>>> + * 6. &drm_crtc_helper_funcs.mode_fixup is called last, to fix up the mode with crtc constraints.<br class="gmail_msg">
>> Line too I think. And maybe insert empty lines between each item, to make<br class="gmail_msg">
>> them stand out more. Shouldn't affect rendering, but better to recheck.<br class="gmail_msg">
>><br class="gmail_msg">
>>>   *<br class="gmail_msg">
>>>   * &drm_crtc_state.mode_changed is set when the input mode is changed.<br class="gmail_msg">
>>>   * &drm_crtc_state.connectors_changed is set when a connector is added or<br class="gmail_msg">
>>> @@ -522,6 +532,8 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,<br class="gmail_msg">
>>>             return ret;<br class="gmail_msg">
>>><br class="gmail_msg">
>>>     for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {<br class="gmail_msg">
>>> +           const struct drm_connector_helper_funcs *funcs = connector->helper_private;<br class="gmail_msg">
>>> +<br class="gmail_msg">
>>>             /*<br class="gmail_msg">
>>>              * This only sets crtc->connectors_changed for routing changes,<br class="gmail_msg">
>>>              * drivers must set crtc->connectors_changed themselves when<br class="gmail_msg">
>>> @@ -539,6 +551,11 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,<br class="gmail_msg">
>>>                         new_connector_state->link_status)<br class="gmail_msg">
>>>                             new_crtc_state->connectors_changed = true;<br class="gmail_msg">
>>>             }<br class="gmail_msg">
>>> +<br class="gmail_msg">
>>> +           if (funcs->atomic_check)<br class="gmail_msg">
>>> +                   ret = funcs->atomic_check(connector, new_connector_state);<br class="gmail_msg">
>>> +           if (ret)<br class="gmail_msg">
>>> +                   return ret;<br class="gmail_msg">
>>>     }<br class="gmail_msg">
>>><br class="gmail_msg">
>>>     /*<br class="gmail_msg">
>>> diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h<br class="gmail_msg">
>>> index b304950b402d..7b5dd909f189 100644<br class="gmail_msg">
>>> --- a/include/drm/drm_modeset_helper_vtables.h<br class="gmail_msg">
>>> +++ b/include/drm/drm_modeset_helper_vtables.h<br class="gmail_msg">
>>> @@ -860,6 +860,43 @@ struct drm_connector_helper_funcs {<br class="gmail_msg">
>>>      */<br class="gmail_msg">
>>>     struct drm_encoder *(*atomic_best_encoder)(struct drm_connector *connector,<br class="gmail_msg">
>>>                                                struct drm_connector_state *connector_state);<br class="gmail_msg">
>>> +<br class="gmail_msg">
>>> +   /**<br class="gmail_msg">
>>> +    * @atomic_check:<br class="gmail_msg">
>>> +    *<br class="gmail_msg">
>>> +    * Drivers should check connector properties in this<br class="gmail_msg">
>>> +    * hook. This function is called from &drm_atomic_helper_check_modeset.<br class="gmail_msg">
>>> +    *<br class="gmail_msg">
>>> +    * This function may not be called at all on a modeset or connector<br class="gmail_msg">
>>> +    * change, so it should only be used to validate properties.<br class="gmail_msg">
> I did not understand this part - "function may not be called at all on a<br class="gmail_msg">
> modeset or connector change". Why is that?<br class="gmail_msg">
I meant moving one connector to a different crtc, if there are 2 connectors on one of the crtc the check function for the other one may not be called the first time around.<br class="gmail_msg">
<br class="gmail_msg">
I guess that falls under modeset, so that part may be killed.<br class="gmail_msg"></blockquote><div> </div>With the "crtc crtc" typo fixed and this change, Reviewed-by: Dhinakaran Pandiyan <<a href="mailto:dhinakaran.pandiyan@intel.com">dhinakaran.pandiyan@intel.com</a>></div><div class="gmail_quote">-DK</div><div class="gmail_quote"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>>> +    * If it's required to validate all connectors from there, call<br class="gmail_msg">
>>> +    * &drm_atomic_helper_check_modeset twice. This will result in<br class="gmail_msg">
> s/twice/again ?<br class="gmail_msg">
Indeed.<br class="gmail_msg">
>>> +    * atomic_check possibly being called twice as well, which the callback<br class="gmail_msg">
> &drm_connector_helper_funcs.atomic_check?<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> I had to read this a couple of times to understand, but I guess, that's<br class="gmail_msg">
> mostly me trying to piece things together.<br class="gmail_msg">
Yes.<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
Intel-gfx mailing list<br class="gmail_msg">
<a href="mailto:Intel-gfx@lists.freedesktop.org" class="gmail_msg" target="_blank">Intel-gfx@lists.freedesktop.org</a><br class="gmail_msg">
<a href="https://lists.freedesktop.org/mailman/listinfo/intel-gfx" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.freedesktop.org/mailman/listinfo/intel-gfx</a><br class="gmail_msg">
</blockquote></div></div>