[PATCHv2 43/45] drm: omapdrm: don't wait in crtc_atomic_flush
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Jun 5 21:20:07 PDT 2015
Hi Tomi,
Thank you for the patch.
On Thursday 04 June 2015 12:03:00 Tomi Valkeinen wrote:
> omap_crtc_atomic_flush() sets the GO bit and waits for it to get unset,
> which tells us the HW has taken the new configuration into use.
>
> This is unnecessary as omap_atomic_complete() waits for all the GO bits
> to get unset. In fact, waiting is wrong, as with multiple CRTCs we would
> not get the the changes to all the CRTCs as soon as possible, but only
> one after another.
>
> This patch removes the wait.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
> ---
> drivers/gpu/drm/omapdrm/omap_crtc.c | 12 ------------
> 1 file changed, 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> b/drivers/gpu/drm/omapdrm/omap_crtc.c index 8f905d2c8074..2ec34dc0c66c
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -17,8 +17,6 @@
> * this program. If not, see <http://www.gnu.org/licenses/>.
> */
>
> -#include <linux/completion.h>
> -
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_crtc.h>
> @@ -52,8 +50,6 @@ struct omap_crtc {
> /* pending event */
> struct drm_pending_vblank_event *event;
>
> - struct completion completion;
> -
> bool ignore_digit_sync_lost;
> };
>
> @@ -317,8 +313,6 @@ static void omap_crtc_vblank_irq(struct omap_drm_irq
> *irq, uint32_t irqstatus)
>
> /* wakeup userspace */
> omap_crtc_complete_page_flip(&omap_crtc->base);
> -
> - complete(&omap_crtc->completion);
> }
>
> static int omap_crtc_flush(struct drm_crtc *crtc)
> @@ -332,10 +326,6 @@ static int omap_crtc_flush(struct drm_crtc *crtc)
> if (dispc_mgr_is_enabled(omap_crtc->channel)) {
> dispc_mgr_go(omap_crtc->channel);
> omap_irq_register(crtc->dev, &omap_crtc->vblank_irq);
> -
> - WARN_ON(!wait_for_completion_timeout(&omap_crtc->completion,
> - msecs_to_jiffies(100)));
> - reinit_completion(&omap_crtc->completion);
I wonder whether this could introduce a race condition between the CRTC vblank
interrupt handler register here, and the wait for gos in atomic_commit. The
latter might run before our CRTC vblank interrupt handler, potentially
starting processing of the next commit with vblank_irq still registered.
Bonus points if you can remove vblank_irq completely while fixing that :-) I'd
rather see omap_crtc_vblank_irq() being called directly and unconditionally
from omap_irq_handler(), and the drm_crtc_handle_vblank() call being moved to
omap_crtc_vblank_irq().
> }
>
> return 0;
> @@ -517,8 +507,6 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>
> crtc = &omap_crtc->base;
>
> - init_completion(&omap_crtc->completion);
> -
> omap_crtc->channel = channel;
> omap_crtc->name = channel_names[channel];
--
Regards,
Laurent Pinchart
More information about the dri-devel
mailing list