All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCHv2 42/45] drm: omapdrm: add omap_atomic_wait_for_gos()
Date: Sat, 06 Jun 2015 07:10:19 +0300	[thread overview]
Message-ID: <7878755.bG2kh6HLMr@avalon> (raw)
In-Reply-To: <1433408582-9828-43-git-send-email-tomi.valkeinen@ti.com>

Hi Tomi,

Thank you for the patch.

On Thursday 04 June 2015 12:02:59 Tomi Valkeinen wrote:
> omap_atomic_complete() uses drm_atomic_helper_wait_for_vblanks() to wait
> for all operations to finish. That works, but can easily cause waits for
> vblanks when no wait is actually necessary.

It actually doesn't work properly, as a full mode set without any change to 
framebuffers will need to reenable planes after enabling the CRTC and thus 
sets the go bit, but the drm_atomic_helper_wait_for_vblanks() function called 
during atomic commit waits for vblank only on CRTCs that have seen a page 
flip. This leads to missing waits, resulting in a go busy warning if the next 
.atomic_flush() call occurs too soon.

Your patch fixes that issue, so I'm fine with the code, but I think the commit 
message should be fixed. Then,

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> This patch adds omap_atomic_wait_for_gos() and uses it instead.
> omap_atomic_wait_for_gos() waits for the GO bit to get unset for all
> relevant crtcs.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> ---
>  drivers/gpu/drm/omapdrm/omap_crtc.c |  7 +++++++
>  drivers/gpu/drm/omapdrm/omap_drv.c  | 31 ++++++++++++++++++++++++++++++-
>  drivers/gpu/drm/omapdrm/omap_drv.h  |  1 +
>  3 files changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> b/drivers/gpu/drm/omapdrm/omap_crtc.c index 2c0d91a67418..8f905d2c8074
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -80,6 +80,13 @@ enum omap_channel omap_crtc_channel(struct drm_crtc
> *crtc) return omap_crtc->channel;
>  }
> 
> +bool omap_crtc_needs_wait(struct drm_crtc *crtc)
> +{
> +	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> +
> +	return dispc_mgr_go_busy(omap_crtc->channel);
> +}
> +
>  /*
> ---------------------------------------------------------------------------
> -- * DSS Manager Functions
>   */
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c
> b/drivers/gpu/drm/omapdrm/omap_drv.c index 50f555530e55..c03405593f9f
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -66,6 +66,35 @@ struct omap_atomic_state_commit {
>  	u32 crtcs;
>  };
> 
> +static void omap_atomic_wait_for_gos(struct drm_device *dev,
> +					 struct drm_atomic_state *old_state)
> +{
> +	struct drm_crtc *crtc;
> +	struct drm_crtc_state *old_crtc_state;
> +	int i, ret;
> +
> +	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
> +		if (!crtc->state->enable)
> +			continue;
> +
> +		if (!omap_crtc_needs_wait(crtc))
> +			continue;
> +
> +		ret = drm_crtc_vblank_get(crtc);
> +		if (ret != 0)
> +			continue;
> +
> +		ret = wait_event_timeout(dev->vblank[i].queue,
> +					 !omap_crtc_needs_wait(crtc),
> +					 msecs_to_jiffies(50));
> +		if (!ret)
> +			dev_warn(dev->dev,
> +				 "atomic flush timeout (pipe %u)!\n", i);
> +
> +		drm_crtc_vblank_put(crtc);
> +	}
> +}
> +
>  static void omap_atomic_complete(struct omap_atomic_state_commit *commit)
>  {
>  	struct drm_device *dev = commit->dev;
> @@ -79,7 +108,7 @@ static void omap_atomic_complete(struct
> omap_atomic_state_commit *commit) drm_atomic_helper_commit_planes(dev,
> old_state);
>  	drm_atomic_helper_commit_modeset_enables(dev, old_state);
> 
> -	drm_atomic_helper_wait_for_vblanks(dev, old_state);
> +	omap_atomic_wait_for_gos(dev, old_state);
> 
>  	drm_atomic_helper_cleanup_planes(dev, old_state);
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h
> b/drivers/gpu/drm/omapdrm/omap_drv.h index 0b7a055bf007..27bbf7c4d76e
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -147,6 +147,7 @@ void omap_crtc_pre_init(void);
>  void omap_crtc_pre_uninit(void);
>  struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  		struct drm_plane *plane, enum omap_channel channel, int id);
> +bool omap_crtc_needs_wait(struct drm_crtc *crtc);
> 
>  struct drm_plane *omap_plane_init(struct drm_device *dev,
>  		int id, enum drm_plane_type type);

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2015-06-06  6:24 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-04  9:02 [PATCHv2 00/45] Convert omapdrm to the atomic updates API Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 01/45] drm: omapdrm: Store the rotation property in dev->mode_config Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 02/45] drm: omapdrm: Apply settings synchronously Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 03/45] drm: omapdrm: Rename omap_crtc_page_flip_locked to omap_crtc_page_flip Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 04/45] drm: omapdrm: Rename omap_crtc page flip-related fields Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 05/45] drm: omapdrm: Simplify IRQ registration Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 06/45] drm: omapdrm: Cancel pending page flips when closing device Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 07/45] drm: omapdrm: Rework page flip handling Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 08/45] drm: omapdrm: Turn vblank on/off when enabling/disabling CRTC Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 09/45] drm: omapdrm: Fix page flip race with CRTC disable Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 10/45] drm: omapdrm: Clean up #include's Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 11/45] drm: omapdrm: Rename CRTC DSS operations with an omap_crtc_dss_ prefix Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 12/45] drm: omapdrm: Rework CRTC enable/disable for atomic updates Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 13/45] drm: omapdrm: Implement encoder .disable() and .enable() operations Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 14/45] drm: omapdrm: Wire up atomic state object scaffolding Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 15/45] drm: omapdrm: Implement planes atomic operations Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 16/45] drm: omapdrm: Handle primary plane config through atomic plane ops Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 17/45] drm: omapdrm: Switch plane update to atomic helpers Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 18/45] drm: omapdrm: Switch mode config " Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 19/45] drm: omapdrm: Switch connector DPMS " Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 20/45] drm: omapdrm: Replace encoder mode_fixup with atomic_check Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 21/45] drm: omapdrm: Implement asynchronous commit support Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 22/45] drm: omapdrm: Switch page flip to atomic helpers Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 23/45] drm: omapdrm: Drop manual framebuffer pin handling Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 24/45] drm: omapdrm: Switch crtc and plane set_property to atomic helpers Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 25/45] drm: omapdrm: Move plane info and win out of the plane structure Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 26/45] drm: omapdrm: Move crtc info out of the crtc structure Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 27/45] drm: omapdrm: Remove omap_crtc enabled field Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 28/45] drm: omapdrm: Remove omap_plane " Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 29/45] drm: omapdrm: Make the omap_crtc_flush function static Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 30/45] drm: omapdrm: Don't get/put dispc in omap_crtc_flush() Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 31/45] drm: omapdrm: omap_crtc_flush() isn't called with modeset locked Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 32/45] drm: omapdrm: Support unlinking page flip events prematurely Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 33/45] drm: omapdrm: Remove nested PM get/sync when configuring encoders Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 34/45] drm: omapdrm: Simplify DSS power management Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 35/45] drm: omapdrm: Move encoder setup to encoder operations Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 36/45] drm: omapdrm: Don't flush CRTC when enabling or disabling it Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 37/45] drm: omapdrm: Don't setup planes manually from CRTC .enable()/.disable() Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 38/45] drm: omapdrm: omap_plane_setup() cannot fail, use WARN Tomi Valkeinen
2015-06-06  3:14   ` Laurent Pinchart
2015-06-04  9:02 ` [PATCHv2 39/45] drm: omapdrm: inline omap_plane_setup into update/disable Tomi Valkeinen
2015-06-06  3:15   ` Laurent Pinchart
2015-06-04  9:02 ` [PATCHv2 40/45] drm: omapdrm: if omap_plane_atomic_update fails, disable plane Tomi Valkeinen
2015-06-06  3:23   ` Laurent Pinchart
2015-06-04  9:02 ` [PATCHv2 41/45] drm: omapdrm: remove omap_crtc_wait_page_flip Tomi Valkeinen
2015-06-06  4:09   ` Laurent Pinchart
2015-06-08 16:02     ` Tomi Valkeinen
2015-06-04  9:02 ` [PATCHv2 42/45] drm: omapdrm: add omap_atomic_wait_for_gos() Tomi Valkeinen
2015-06-06  4:10   ` Laurent Pinchart [this message]
2015-06-08  8:36     ` Tomi Valkeinen
2015-06-04  9:03 ` [PATCHv2 43/45] drm: omapdrm: don't wait in crtc_atomic_flush Tomi Valkeinen
2015-06-06  4:20   ` Laurent Pinchart
2015-06-04  9:03 ` [PATCHv2 44/45] drm: omapdrm: merge omap_crtc_flush and omap_crtc_atomic_flush Tomi Valkeinen
2015-06-06  4:01   ` Laurent Pinchart
2015-06-04  9:03 ` [PATCHv2 45/45] drm: omapdrm: add lock for fb pinning Tomi Valkeinen
2015-06-06  4:30   ` Laurent Pinchart

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=7878755.bG2kh6HLMr@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=dri-devel@lists.freedesktop.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.