All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sebastian Reichel <sre@kernel.org>
Cc: Tony Lindgren <tony@atomide.com>,
	Aaro Koskinen <aaro.koskinen@iki.fi>,
	Tomi Valkeinen <tomi.valkeinen@ti.com>,
	David Airlie <airlied@linux.ie>,
	linux-omap@vger.kernel.org, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 07/23] drm: omapdrm: crtc: switch pending variable to atomic bitset
Date: Sat, 26 Mar 2016 18:30:02 +0200	[thread overview]
Message-ID: <10595698.j3sjVXcOKr@avalon> (raw)
In-Reply-To: <1457455195-1938-8-git-send-email-sre@kernel.org>

Hi Sebastian,

Thank you for the patch.

On Tuesday 08 Mar 2016 17:39:39 Sebastian Reichel wrote:
> Having the pending variable available as atomic bit helps
> with the later addition of manually updated display support.
> 
> Signed-off-by: Sebastian Reichel <sre@kernel.org>
> ---
>  drivers/gpu/drm/omapdrm/omap_crtc.c | 31 +++++++++++++++++--------------
>  1 file changed, 17 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c
> b/drivers/gpu/drm/omapdrm/omap_crtc.c index 2ed0754ed19e..5ef27664bcfa
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -28,6 +28,11 @@
> 
>  #define to_omap_crtc(x) container_of(x, struct omap_crtc, base)
> 
> +enum omap_crtc_state {

I find that using an enum and calling it omap_crtc_state is confusing, it 
seems to imply that the CRTC state will be one of the enumerated values, while 
the values are actually non-exclusive bits in a bitmask.

> +	crtc_enabled	= 0,

You don't seem to be using this bit in this patch, you can define it in patch 
08/23.

> +	crtc_pending	= 1

Please name this OMAP_CRTC_STATE_PENDING.

> +};

Please add a short description of each bit in a comment above the enum.

> +
>  struct omap_crtc {
>  	struct drm_crtc base;
> 
> @@ -49,7 +54,7 @@ struct omap_crtc {
> 
>  	bool ignore_digit_sync_lost;
> 
> -	bool pending;
> +	unsigned long state;
>  	wait_queue_head_t pending_wait;
>  };
> 
> @@ -81,7 +86,7 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc)
>  	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> 
>  	return wait_event_timeout(omap_crtc->pending_wait,
> -				  !omap_crtc->pending,
> +				  !test_bit(crtc_pending, &omap_crtc->state),
>  				  msecs_to_jiffies(50));
>  }
> 
> @@ -311,10 +316,8 @@ static void omap_crtc_vblank_irq(struct omap_drm_irq
> *irq, uint32_t irqstatus)
> 
>  	__omap_irq_unregister(dev, &omap_crtc->vblank_irq);
> 
> -	rmb();
> -	WARN_ON(!omap_crtc->pending);
> -	omap_crtc->pending = false;
> -	wmb();
> +	if (!test_and_clear_bit(crtc_pending, &omap_crtc->state))
> +		dev_warn(dev->dev, "pending bit was not set in vblank irq");

Documentation/atomic_ops.txt states that the atomic bit ops must be atomic and 
include memory barriers, but I'm confused by the ARM implementation.

The constant bit number version ____atomic_test_and_clear_bit() uses 
raw_local_irq_save() and raw_low_irq_restore() for synchronization, which 
expand to arch_local_irq_save() and arch_local_irq_restore(). On ARMv6 and 
newer, the functions are defined as

static inline unsigned long arch_local_irq_save(void)
{
        unsigned long flags;

        asm volatile(
                "       mrs     %0, " IRQMASK_REG_NAME_R "      @ 
arch_local_irq_save\n"
                "       cpsid   i"
                : "=r" (flags) : : "memory", "cc");
        return flags;
}

and

static inline void arch_local_irq_restore(unsigned long flags)
{
        asm volatile(
                "       msr     " IRQMASK_REG_NAME_W ", %0      @ 
local_irq_restore"
                :
                : "r" (flags)
                : "memory", "cc");
}

I'm probably missing something obvious, but I don't see the memory barriers 
:-/

>  	/* wake up userspace */
>  	omap_crtc_complete_page_flip(&omap_crtc->base);
> @@ -351,13 +354,12 @@ static bool omap_crtc_mode_fixup(struct drm_crtc
> *crtc, static void omap_crtc_enable(struct drm_crtc *crtc)
>  {
>  	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> +	struct drm_device *dev = crtc->dev;
> 
>  	DBG("%s", omap_crtc->name);
> 
> -	rmb();
> -	WARN_ON(omap_crtc->pending);
> -	omap_crtc->pending = true;
> -	wmb();
> +	if (test_and_set_bit(crtc_pending, &omap_crtc->state))
> +		dev_warn(dev->dev, "crtc enable while pending bit set!");
> 
>  	omap_irq_register(crtc->dev, &omap_crtc->vblank_irq);
> 
> @@ -397,6 +399,7 @@ static void omap_crtc_atomic_flush(struct drm_crtc
> *crtc, struct drm_crtc_state *old_crtc_state) {
>  	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
> +	struct drm_device *dev = crtc->dev;
> 
>  	WARN_ON(omap_crtc->vblank_irq.registered);
> 
> @@ -404,10 +407,8 @@ static void omap_crtc_atomic_flush(struct drm_crtc
> *crtc,
> 
>  		DBG("%s: GO", omap_crtc->name);
> 
> -		rmb();
> -		WARN_ON(omap_crtc->pending);
> -		omap_crtc->pending = true;
> -		wmb();
> +		if (test_and_set_bit(crtc_pending, &omap_crtc->state))
> +			dev_warn(dev->dev, "atomic flush while pending bit set!");
> 
>  		dispc_mgr_go(omap_crtc->channel);
>  		omap_irq_register(crtc->dev, &omap_crtc->vblank_irq);
> @@ -509,6 +510,8 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
> 
>  	init_waitqueue_head(&omap_crtc->pending_wait);
> 
> +	omap_crtc->state = 0;
> +
>  	omap_crtc->channel = channel;
>  	omap_crtc->name = channel_names[channel];

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2016-03-26 16:30 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-08 16:39 [PATCH 00/23] Nokia N950 display support Sebastian Reichel
2016-03-08 16:39 ` [PATCH 01/23] ARM: dts: n9/n950: regulator configuration Sebastian Reichel
2016-03-08 16:39 ` [PATCH 02/23] ARM: dts: n950: add display support Sebastian Reichel
2016-03-17 12:14   ` Laurent Pinchart
2016-03-17 12:14     ` Laurent Pinchart
2016-03-17 17:49     ` Sebastian Reichel
2016-03-23 12:40       ` Jani Nikula
2016-03-23 12:40         ` Jani Nikula
2016-03-23 14:01         ` Sebastian Reichel
2016-03-24 10:03           ` Jani Nikula
2016-03-24 10:03             ` Jani Nikula
2016-03-24 14:26             ` Sebastian Reichel
2016-03-24 15:11               ` Jani Nikula
2016-03-24 15:11                 ` Jani Nikula
2016-03-25  0:15                 ` Sebastian Reichel
2016-04-12 20:51                   ` Tony Lindgren
2016-06-21 11:01                     ` Tony Lindgren
2016-06-24  0:30                       ` Sebastian Reichel
2016-03-08 16:39 ` [PATCH 03/23] drm: omapdrm: dss: reset dsi module during initialization Sebastian Reichel
2016-05-10 12:07   ` Tomi Valkeinen
2016-05-10 12:07     ` Tomi Valkeinen
2016-03-08 16:39 ` [PATCH 04/23] drm: omapdrm: add DSI mapping Sebastian Reichel
2016-03-26  9:09   ` Laurent Pinchart
2016-03-26  9:09     ` Laurent Pinchart
2016-05-10 12:08   ` Tomi Valkeinen
2016-05-10 12:08     ` Tomi Valkeinen
2016-03-08 16:39 ` [PATCH 05/23] Revert "drm: omapdrm: Remove manual update display support" Sebastian Reichel
2016-03-08 16:39 ` [PATCH 06/23] drm: omapdrm: wait for pending operations before updating plane Sebastian Reichel
2016-03-26  9:20   ` Laurent Pinchart
2016-03-26  9:20     ` Laurent Pinchart
2016-03-26 15:52     ` Sebastian Reichel
2016-03-08 16:39 ` [PATCH 07/23] drm: omapdrm: crtc: switch pending variable to atomic bitset Sebastian Reichel
2016-03-26 16:30   ` Laurent Pinchart [this message]
2016-03-08 16:39 ` [PATCH 08/23] drm: omapdrm: crtc: add enabled bit to state Sebastian Reichel
2016-03-26 16:35   ` Laurent Pinchart
2016-03-08 16:39 ` [PATCH 09/23] drm: omapdrm: dss: method to get stallmode from lcd config Sebastian Reichel
2016-03-08 16:39 ` [PATCH 10/23] drm: omapdrm: crtc: detect manually updated displays Sebastian Reichel
2016-03-26 16:51   ` Laurent Pinchart
2016-03-08 16:39 ` [PATCH 11/23] include: video: omapdss: provide fifo threshold methods Sebastian Reichel
2016-03-26 16:44   ` Laurent Pinchart
2016-03-08 16:39 ` [PATCH 12/23] drm: omapdrm: plane: update fifo size on atomic update Sebastian Reichel
2016-12-13 17:35   ` Laurent Pinchart
2016-12-13 17:35     ` Laurent Pinchart
2016-12-14  8:43     ` Tomi Valkeinen
2016-12-14  8:43       ` Tomi Valkeinen
2016-12-14  9:10       ` Laurent Pinchart
2016-12-14  9:10         ` Laurent Pinchart
2016-12-14  9:14         ` Tomi Valkeinen
2016-12-14  9:14           ` Tomi Valkeinen
2016-12-14 14:03           ` Sebastian Reichel
2016-12-14 21:36             ` Laurent Pinchart
2016-12-15  8:40               ` Tomi Valkeinen
2016-12-15  8:40                 ` Tomi Valkeinen
2016-03-08 16:39 ` [PATCH 13/23] drm: omapdrm: crtc: update plane fifos on lcd config change Sebastian Reichel
2016-03-26 17:00   ` Laurent Pinchart
2016-03-26 17:00     ` Laurent Pinchart
2016-03-08 16:39 ` [PATCH 14/23] drm: omapdrm: crtc: save framedone callback from dss Sebastian Reichel
2016-03-26 17:03   ` Laurent Pinchart
2016-03-26 17:03     ` Laurent Pinchart
2016-03-08 16:39 ` [PATCH 15/23] drm: omapdrm: crtc: add support for manual updated displays Sebastian Reichel
2016-03-08 16:39 ` [PATCH 16/23] drm: omapdrm: update manual displays on dirty ioctl Sebastian Reichel
2016-03-08 16:39 ` [PATCH 17/23] drm: omapdrm: panel-dsi-cm: add regulator support Sebastian Reichel
2016-03-08 16:39 ` [PATCH 18/23] drm: omapdrm: panel-dsi-cm: use threaded irq handler Sebastian Reichel
2016-05-10 12:19   ` Tomi Valkeinen
2016-05-10 12:19     ` Tomi Valkeinen
2016-03-08 16:39 ` [PATCH 19/23] drm: omapdrm: panel-dsi-cm: improve DT support Sebastian Reichel
2016-03-08 16:39 ` [PATCH 20/23] drm: omapdrm: panel-dsi-cm: add offset support Sebastian Reichel
2016-03-08 16:39 ` [PATCH 21/23] drm: omapdrm: panel-dsi-cm: block disable until update completed Sebastian Reichel
2016-03-08 16:39 ` [PATCH 22/23] drm: omapdrm: panel-dsi-cm: ratelimit debug output in update path Sebastian Reichel
2016-03-08 16:39 ` [PATCH 23/23] drm: omapdrm: panel-dsi-cm: provide timings methods for omapdrm Sebastian Reichel
2016-03-08 18:39 ` [PATCH 00/23] Nokia N950 display support Aaro Koskinen
2016-03-08 20:45   ` Sebastian Reichel
2016-03-09  7:10     ` Tomi Valkeinen
2016-03-09  7:10       ` Tomi Valkeinen
2016-03-09 14:33       ` Sebastian Reichel
2016-03-09 21:02     ` Aaro Koskinen
2016-03-09 16:19 ` Emil Velikov
2016-03-09 16:24   ` Tomi Valkeinen
2016-03-09 16:24     ` Tomi Valkeinen
2016-03-09 16:58     ` Emil Velikov
2016-03-09 16:58       ` Emil Velikov
2016-03-09 17:09   ` Sebastian Reichel
2016-03-28 12:34     ` Emil Velikov
2016-03-28 12:34       ` Emil Velikov

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=10595698.j3sjVXcOKr@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=aaro.koskinen@iki.fi \
    --cc=airlied@linux.ie \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=sre@kernel.org \
    --cc=tomi.valkeinen@ti.com \
    --cc=tony@atomide.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.