From: Tony Lindgren <tony@atomide.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Sebastian Reichel <sre@kernel.org>,
dri-devel@lists.freedesktop.org, linux-omap@vger.kernel.org,
Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>,
Merlijn Wajer <merlijn@wizzup.org>, ruleh <ruleh@gmx.de>
Subject: Re: [PATCH] drm/omap: Fix drm_handle_vblank() handling for command mode panels
Date: Tue, 25 Feb 2020 14:34:30 -0800 [thread overview]
Message-ID: <20200225223430.GJ37466@atomide.com> (raw)
In-Reply-To: <20200225195258.GI37466@atomide.com>
* Tony Lindgren <tony@atomide.com> [200225 19:53]:
> * Tony Lindgren <tony@atomide.com> [200225 18:38]:
> > Only lightly tested so far, please test. Also, I'm not sure if we
> > should get the id from somewhere for drm_handle_vblank() instead of
> > just using 0?
>
> Also looks like we can now get WARN_ON(omap_crtc->pending)
> in omap_crtc_arm_event(), so obviously some changes are
> needed.
Below is an updated version that just returns early for
omap_crtc_arm_event() for manual update display if already
armed.
I'm now also passing the id from the interrupt handler, maybe
it's available somewhere locally but I just did not notice.
Regards,
Tony
8< -----------------------
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index d0bc9614588f9..515b5c1520b98 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -325,23 +325,21 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
DBG("%s: apply done", omap_crtc->name);
}
-void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus)
+void omap_crtc_framedone_irq(struct drm_crtc *crtc, int id, uint32_t irqstatus)
{
+ struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state);
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+ struct drm_device *dev = crtc->dev;
if (!omap_crtc->framedone_handler)
return;
- omap_crtc->framedone_handler(omap_crtc->framedone_handler_data);
-
- spin_lock(&crtc->dev->event_lock);
- /* Send the vblank event if one has been requested. */
- if (omap_crtc->event) {
- drm_crtc_send_vblank_event(crtc, omap_crtc->event);
- omap_crtc->event = NULL;
+ if (omap_state->manually_updated) {
+ drm_handle_vblank(dev, id);
+ omap_crtc_vblank_irq(crtc);
}
- omap_crtc->pending = false;
- spin_unlock(&crtc->dev->event_lock);
+
+ omap_crtc->framedone_handler(omap_crtc->framedone_handler_data);
/* Wake up omap_atomic_complete. */
wake_up(&omap_crtc->pending_wait);
@@ -439,8 +437,12 @@ static void omap_crtc_destroy(struct drm_crtc *crtc)
static void omap_crtc_arm_event(struct drm_crtc *crtc)
{
+ struct omap_crtc_state *omap_crtc_state = to_omap_crtc_state(crtc->state);
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+ if (omap_crtc->pending && omap_crtc_state->manually_updated)
+ return;
+
WARN_ON(omap_crtc->pending);
omap_crtc->pending = true;
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
index 2fd57751ae2b1..9221f8ef2e87f 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.h
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
@@ -30,7 +30,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
int omap_crtc_wait_pending(struct drm_crtc *crtc);
void omap_crtc_error_irq(struct drm_crtc *crtc, u32 irqstatus);
void omap_crtc_vblank_irq(struct drm_crtc *crtc);
-void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus);
+void omap_crtc_framedone_irq(struct drm_crtc *crtc, int id, uint32_t irqstatus);
void omap_crtc_flush(struct drm_crtc *crtc);
#endif /* __OMAPDRM_CRTC_H__ */
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
index 382bcdc72ac06..068ea4fdf445c 100644
--- a/drivers/gpu/drm/omapdrm/omap_irq.c
+++ b/drivers/gpu/drm/omapdrm/omap_irq.c
@@ -232,7 +232,7 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
omap_crtc_error_irq(crtc, irqstatus);
if (irqstatus & priv->dispc_ops->mgr_get_framedone_irq(priv->dispc, channel))
- omap_crtc_framedone_irq(crtc, irqstatus);
+ omap_crtc_framedone_irq(crtc, id, irqstatus);
}
omap_irq_ocp_error_handler(dev, irqstatus);
next prev parent reply other threads:[~2020-02-25 22:34 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-25 18:37 [PATCH] drm/omap: Fix drm_handle_vblank() handling for command mode panels Tony Lindgren
2020-02-25 19:52 ` Tony Lindgren
2020-02-25 22:34 ` Tony Lindgren [this message]
2020-02-25 22:59 ` Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200225223430.GJ37466@atomide.com \
--to=tony@atomide.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ivo.g.dimitrov.75@gmail.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-omap@vger.kernel.org \
--cc=merlijn@wizzup.org \
--cc=ruleh@gmx.de \
--cc=sre@kernel.org \
--cc=tomi.valkeinen@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox