2018-03-28 19:22:28

by Sean Paul

[permalink] [raw]
Subject: [PATCH v2 4/6] drm/msm: Issue queued events when disabling crtc

Ensure that any queued events are issued when disabling the crtc. This
avoids timeouts when we come back and wait for dependencies (like the
previous frame's flip_done).

Changes in v2:
- None

Signed-off-by: Sean Paul <[email protected]>
---
drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
index 76b96081916f..10271359789e 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
@@ -430,6 +430,7 @@ static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc,
struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
struct mdp5_kms *mdp5_kms = get_kms(crtc);
struct device *dev = &mdp5_kms->pdev->dev;
+ unsigned long flags;

DBG("%s", crtc->name);

@@ -445,6 +446,14 @@ static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc,
mdp_irq_unregister(&mdp5_kms->base, &mdp5_crtc->err);
pm_runtime_put_sync(dev);

+ if (crtc->state->event && !crtc->state->active) {
+ WARN_ON(mdp5_crtc->event);
+ spin_lock_irqsave(&mdp5_kms->dev->event_lock, flags);
+ drm_crtc_send_vblank_event(crtc, crtc->state->event);
+ crtc->state->event = NULL;
+ spin_unlock_irqrestore(&mdp5_kms->dev->event_lock, flags);
+ }
+
mdp5_crtc->enabled = false;
}

--
Sean Paul, Software Engineer, Google / Chromium OS



2018-04-02 05:25:52

by Archit Taneja

[permalink] [raw]
Subject: Re: [PATCH v2 4/6] drm/msm: Issue queued events when disabling crtc



On Thursday 29 March 2018 12:36 AM, Sean Paul wrote:
> Ensure that any queued events are issued when disabling the crtc. This
> avoids timeouts when we come back and wait for dependencies (like the
> previous frame's flip_done).

Reviewed-by: Archit Taneja <[email protected]>

>
> Changes in v2:
> - None
>
> Signed-off-by: Sean Paul <[email protected]>
> ---
> drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
> index 76b96081916f..10271359789e 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
> @@ -430,6 +430,7 @@ static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc,
> struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
> struct mdp5_kms *mdp5_kms = get_kms(crtc);
> struct device *dev = &mdp5_kms->pdev->dev;
> + unsigned long flags;
>
> DBG("%s", crtc->name);
>
> @@ -445,6 +446,14 @@ static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc,
> mdp_irq_unregister(&mdp5_kms->base, &mdp5_crtc->err);
> pm_runtime_put_sync(dev);
>
> + if (crtc->state->event && !crtc->state->active) {
> + WARN_ON(mdp5_crtc->event);
> + spin_lock_irqsave(&mdp5_kms->dev->event_lock, flags);
> + drm_crtc_send_vblank_event(crtc, crtc->state->event);
> + crtc->state->event = NULL;
> + spin_unlock_irqrestore(&mdp5_kms->dev->event_lock, flags);
> + }
> +
> mdp5_crtc->enabled = false;
> }
>
>