Inki Dae wrote:
> 
> 
> 2017년 01월 20일 22:05에 Tobias Jakobi 이(가) 쓴 글:
>> Inki Dae wrote:
>>> Hi Tobias,
>>>
>>> 2017년 01월 19일 21:49에 Tobias Jakobi 이(가) 쓴 글:
>>>> What about Laurent's comment stating that drm_atomic_helper_commit() is
>>>> broken at the moment? Shouldn't there be some kind of warning in the
>>>> commit message that this patch is only safe to apply once the fixes for
>>>> drm_atomic_helper_commit() have landed? I'm already seeing this getting
>>>> merged by accident, without Maarten's series even being reviewed.
>>>
>>> What patches you mean?
>> The patchset that Laurent mentioned.
>> [PATCH v3 0/7] drm/atomic: Add accessor macros for all atomic state.
>> https://www.spinics.net/lists/dri-devel/msg129537.html
>>
>>
>>> According to Laurent's comment, async commit support of 
>>> drm_atomic_helper_commit is subect to a race condition.
>>> So I'm checking whether there is any case to use async commit in Exynos DRM 
>>> driver.
>> I'm not sure what you're exactly checking here, because it is userspace
>> that requests a atomic commit to be executed asynchronously.
> 
> Hm... See the below code from mainline,
> 
> nt drm_mode_atomic_ioctl(struct drm_device *dev,
>                         void *data, struct drm_file *file_priv)
> {
>       ...
> 
>       if ((arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) &&
>                       !dev->mode_config.async_page_flip)
>               return -EINVAL;
>       ...
> 
> I'm not sure you checked Exynos drm driver but Exynos drm driver doesn't 
> support async page flip.
> And you are right. userspace requests async commit but that is also depend on 
> specific driver.
OK, I assumed that this mandatory by now. Nevermind then.


>>> As of now, I don't see any case. even without Maarten's patch set, it works 
>>> well - actually, I had a test with atomic test app more than 10 hours..
>> Can you provide this test application? In particular I'm asking this
>> because libdrm currently doesn't provide any tests using the atomic API.
>> So this application might be of interest also for other people.
> 
> Below is the app I tested. Know that this application is from chromiumOS tree 
> and I just fixed some parts for internal test.
> https://review.tizen.org/git/?p=atform/upstream/libdrm.git;a=commitdiff;h�3bd95f2c5a9b4b69062a3ff008947054b94f55
Thanks, any chance this is going to be submitted upstream?



>>> And important thing is that this posting is just for review not merge.
>> In this case the patches should be tagged as 'RFC', something which I
>> don't see here.
>>
>>
>>> So if there is any critical problem with this patch, I will stop to merge 
>>> it. This would be my role, maintainer.
>> Let me phrase it this way. Your patch is not fixing a bug, it is a
> 
> This patch definitely phrased 'This patch replaces specific atomic commit 
> function with atomic helper commit one' not fixing a bug.
Please read the sentences in full.

- Tobias


> 
> Thanks.
> 
>> cleanup patch that reduces driver specific code with DRM core code. But
>> as Laurent has pointed out this core code currently has some known (!)
>> issues. In the interest of not breaking anything I would advise against
>> merging this before Maarten's patches have landed.
>>
>>
>> With best wishes,
>> Tobias
>>
>>
>>>
>>> Thanks.
>>>
>>>>
>>>> The commit message looks much better now. Still some spelling issues 
>>>> remain:
>>>> implemention -> implementation
>>>>
>>>>
>>>> With best wishes,
>>>> Tobias
>>>>
>>>>
>>>> Inki Dae wrote:
>>>>> This patch replaces specific atomic commit function
>>>>> with atomic helper commit one.
>>>>>
>>>>> For this, it removes existing atomic commit function
>>>>> and relevant code specific to Exynos DRM and makes
>>>>> atomic helper commit to be used instead.
>>>>>
>>>>> Below are changes for the use of atomic helper commit:
>>>>> - add atomic_commit_tail callback specific to Exynos DRM
>>>>>   . default implemention of atomic helper doesn't mesh well
>>>>>     with runtime PM so the device driver which supports runtime
>>>>>     PM should call drm_atomic_helper_commit_modeset_enables function
>>>>>     prior to drm_atomic_helper_commit_planes function call.
>>>>>     atomic_commit_tail callback implements this call ordering.
>>>>> - allow plane commit only in case that CRTC device is enabled.
>>>>>   . for this, it calls atomic_helper_commit_planes function
>>>>>     with DRM_PLANE_COMMIT_ACTIVE_ONLY flag in atomic_commit_tail callback.
>>>>>
>>>>> Changelog v1:
>>>>> - fix comment
>>>>> - fix trivial things
>>>>> - revive existing comment which explains why plane commit should be
>>>>>   called after crtc and encoder device are enabled.
>>>>>
>>>>> Signed-off-by: Inki Dae <inki....@samsung.com>
>>>>> Reviewed-by: Gustavo Padovan <gustavo.pado...@collabora.com>
>>>>> ---
>>>>>  drivers/gpu/drm/exynos/exynos_drm_crtc.c |  10 ++-
>>>>>  drivers/gpu/drm/exynos/exynos_drm_drv.c  | 109 
>>>>> -------------------------------
>>>>>  drivers/gpu/drm/exynos/exynos_drm_fb.c   |  32 ++++++++-
>>>>>  3 files changed, 40 insertions(+), 111 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
>>>>> b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>>>>> index 2530bf5..8f13bce 100644
>>>>> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>>>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
>>>>> @@ -39,6 +39,14 @@ static void exynos_drm_crtc_disable(struct drm_crtc 
>>>>> *crtc)
>>>>>  
>>>>>   if (exynos_crtc->ops->disable)
>>>>>           exynos_crtc->ops->disable(exynos_crtc);
>>>>> +
>>>>> + if (crtc->state->event && !crtc->state->active) {
>>>>> +         spin_lock_irq(&crtc->dev->event_lock);
>>>>> +         drm_crtc_send_vblank_event(crtc, crtc->state->event);
>>>>> +         spin_unlock_irq(&crtc->dev->event_lock);
>>>>> +
>>>>> +         crtc->state->event =L;
>>>>> + }
>>>>>  }
>>>>>  
>>>>>  static void
>>>>> @@ -94,9 +102,9 @@ static void exynos_crtc_atomic_flush(struct drm_crtc 
>>>>> *crtc,
>>>>>                   drm_crtc_send_vblank_event(crtc, event);
>>>>>           spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
>>>>>   }
>>>>> -
>>>>>  }
>>>>>  
>>>>> +
>>>>>  static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs >>>>  
>>>>>         .enable         = xynos_drm_crtc_enable,
>>>>>   .disable        =nos_drm_crtc_disable,
>>>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
>>>>> b/drivers/gpu/drm/exynos/exynos_drm_drv.c
>>>>> index 3ec0535..c8f3eeb 100644
>>>>> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
>>>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
>>>>> @@ -38,56 +38,6 @@
>>>>>  #define DRIVER_MAJOR     1
>>>>>  #define DRIVER_MINOR     0
>>>>>  
>>>>> -struct exynos_atomic_commit {
>>>>> - struct work_struct      work;
>>>>> - struct drm_device       *dev;
>>>>> - struct drm_atomic_state *state;
>>>>> - u32                     crtcs;
>>>>> -};
>>>>> -
>>>>> -static void exynos_atomic_commit_complete(struct exynos_atomic_commit 
>>>>> *commit)
>>>>> -{
>>>>> - struct drm_device *dev =mit->dev;
>>>>> - struct exynos_drm_private *priv =->dev_private;
>>>>> - struct drm_atomic_state *state =mit->state;
>>>>> -
>>>>> - drm_atomic_helper_commit_modeset_disables(dev, state);
>>>>> -
>>>>> - drm_atomic_helper_commit_modeset_enables(dev, state);
>>>>> -
>>>>> - /*
>>>>> -  * Exynos can't update planes with CRTCs and encoders disabled,
>>>>> -  * its updates routines, specially for FIMD, requires the clocks
>>>>> -  * to be enabled. So it is necessary to handle the modeset operations
>>>>> -  * *before* the commit_planes() step, this way it will always
>>>>> -  * have the relevant clocks enabled to perform the update.
>>>>> -  */
>>>>> -
>>>>> - drm_atomic_helper_commit_planes(dev, state, 0);
>>>>> -
>>>>> - drm_atomic_helper_wait_for_vblanks(dev, state);
>>>>> -
>>>>> - drm_atomic_helper_cleanup_planes(dev, state);
>>>>> -
>>>>> - drm_atomic_state_put(state);
>>>>> -
>>>>> - spin_lock(&priv->lock);
>>>>> - priv->pending &=mmit->crtcs;
>>>>> - spin_unlock(&priv->lock);
>>>>> -
>>>>> - wake_up_all(&priv->wait);
>>>>> -
>>>>> - kfree(commit);
>>>>> -}
>>>>> -
>>>>> -static void exynos_drm_atomic_work(struct work_struct *work)
>>>>> -{
>>>>> - struct exynos_atomic_commit *commit =tainer_of(work,
>>>>> -                         struct exynos_atomic_commit, work);
>>>>> -
>>>>> - exynos_atomic_commit_complete(commit);
>>>>> -}
>>>>> -
>>>>>  static struct device *exynos_drm_get_dma_device(void);
>>>>>  
>>>>>  static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
>>>>> @@ -202,65 +152,6 @@ static void exynos_drm_unload(struct drm_device *dev)
>>>>>   dev->dev_private =L;
>>>>>  }
>>>>>  
>>>>> -static int commit_is_pending(struct exynos_drm_private *priv, u32 crtcs)
>>>>> -{
>>>>> - bool pending;
>>>>> -
>>>>> - spin_lock(&priv->lock);
>>>>> - pending =v->pending & crtcs;
>>>>> - spin_unlock(&priv->lock);
>>>>> -
>>>>> - return pending;
>>>>> -}
>>>>> -
>>>>> -int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state 
>>>>> *state,
>>>>> -                  bool nonblock)
>>>>> -{
>>>>> - struct exynos_drm_private *priv =->dev_private;
>>>>> - struct exynos_atomic_commit *commit;
>>>>> - struct drm_crtc *crtc;
>>>>> - struct drm_crtc_state *crtc_state;
>>>>> - int i, ret;
>>>>> -
>>>>> - commit =lloc(sizeof(*commit), GFP_KERNEL);
>>>>> - if (!commit)
>>>>> -         return -ENOMEM;
>>>>> -
>>>>> - ret =_atomic_helper_prepare_planes(dev, state);
>>>>> - if (ret) {
>>>>> -         kfree(commit);
>>>>> -         return ret;
>>>>> - }
>>>>> -
>>>>> - /* This is the point of no return */
>>>>> -
>>>>> - INIT_WORK(&commit->work, exynos_drm_atomic_work);
>>>>> - commit->dev =;
>>>>> - commit->state =te;
>>>>> -
>>>>> - /* Wait until all affected CRTCs have completed previous commits and
>>>>> -  * mark them as pending.
>>>>> -  */
>>>>> - for_each_crtc_in_state(state, crtc, crtc_state, i)
>>>>> -         commit->crtcs |=_crtc_mask(crtc);
>>>>> -
>>>>> - wait_event(priv->wait, !commit_is_pending(priv, commit->crtcs));
>>>>> -
>>>>> - spin_lock(&priv->lock);
>>>>> - priv->pending |=mit->crtcs;
>>>>> - spin_unlock(&priv->lock);
>>>>> -
>>>>> - drm_atomic_helper_swap_state(state, true);
>>>>> -
>>>>> - drm_atomic_state_get(state);
>>>>> - if (nonblock)
>>>>> -         schedule_work(&commit->work);
>>>>> - else
>>>>> -         exynos_atomic_commit_complete(commit);
>>>>> -
>>>>> - return 0;
>>>>> -}
>>>>> -
>>>>>  int exynos_atomic_check(struct drm_device *dev,
>>>>>                   struct drm_atomic_state *state)
>>>>>  {
>>>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c 
>>>>> b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>>>> index 68d4142..c77a5ac 100644
>>>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>>>> @@ -187,11 +187,40 @@ dma_addr_t exynos_drm_fb_dma_addr(struct 
>>>>> drm_framebuffer *fb, int index)
>>>>>   return exynos_fb->dma_addr[index];
>>>>>  }
>>>>>  
>>>>> +static void exynos_drm_atomic_commit_tail(struct drm_atomic_state *state)
>>>>> +{
>>>>> + struct drm_device *dev =te->dev;
>>>>> +
>>>>> + drm_atomic_helper_commit_modeset_disables(dev, state);
>>>>> +
>>>>> + drm_atomic_helper_commit_modeset_enables(dev, state);
>>>>> +
>>>>> + /*
>>>>> +  * Exynos can't update planes with CRTCs and encoders disabled,
>>>>> +  * its updates routines, specially for FIMD, requires the clocks
>>>>> +  * to be enabled. So it is necessary to handle the modeset operations
>>>>> +  * *before* the commit_planes() step, this way it will always
>>>>> +  * have the relevant clocks enabled to perform the update.
>>>>> +  */
>>>>> + drm_atomic_helper_commit_planes(dev, state,
>>>>> +                                 DRM_PLANE_COMMIT_ACTIVE_ONLY);
>>>>> +
>>>>> + drm_atomic_helper_commit_hw_done(state);
>>>>> +
>>>>> + drm_atomic_helper_wait_for_vblanks(dev, state);
>>>>> +
>>>>> + drm_atomic_helper_cleanup_planes(dev, state);
>>>>> +}
>>>>> +
>>>>> +static struct drm_mode_config_helper_funcs 
>>>>> exynos_drm_mode_config_helpers >>>> + .atomic_commit_tail = 
>>>>> xynos_drm_atomic_commit_tail,
>>>>> +};
>>>>> +
>>>>>  static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs 
>>>>> >>>>      .fb_create = xynos_user_fb_create,
>>>>>   .output_poll_changed =nos_drm_output_poll_changed,
>>>>>   .atomic_check =nos_atomic_check,
>>>>> - .atomic_commit =nos_atomic_commit,
>>>>> + .atomic_commit =_atomic_helper_commit,
>>>>>  };
>>>>>  
>>>>>  void exynos_drm_mode_config_init(struct drm_device *dev)
>>>>> @@ -208,4 +237,5 @@ void exynos_drm_mode_config_init(struct drm_device 
>>>>> *dev)
>>>>>   dev->mode_config.max_height     6;
>>>>>  
>>>>>   dev->mode_config.funcs =ynos_drm_mode_config_funcs;
>>>>> + dev->mode_config.helper_private =ynos_drm_mode_config_helpers;
>>>>>  }
>>>>>
>>>>
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe 
>>>> linux-samsung-soc" in
>>>> the body of a message to majord...@vger.kernel.org
>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>>
>>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe 
>>> linux-samsung-soc" in
>>> the body of a message to majord...@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" 
>> in
>> the body of a message to majord...@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" 
> in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to