public inbox for linux-sh@vger.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
	dri-devel@lists.freedesktop.org, linux-sh@vger.kernel.org
Subject: Re: [PATCH 08/22] drm: rcar-du: Restart the DU group when a plane source changes
Date: Sun, 27 Dec 2015 09:00:07 +0000	[thread overview]
Message-ID: <3199261.oWaujEx9hz@avalon> (raw)
In-Reply-To: <20151217094151.GV30437@phenom.ffwll.local>

Hi Daniel,

On Thursday 17 December 2015 10:41:51 Daniel Vetter wrote:
> On Thu, Dec 17, 2015 at 09:11:49AM +0200, Laurent Pinchart wrote:
> > On Monday 14 September 2015 09:22:13 Daniel Vetter wrote:
> >> On Mon, Sep 14, 2015 at 01:50:55AM +0300, Laurent Pinchart wrote:
> >>> Plane sources are configured by the VSPS bit in the PnDDCR4 register.
> >>> Although the datasheet states that the bit is updated during vertical
> >>> blanking, it seems that updates only occur when the DU group is held
> >>> in reset through the DSYSR.DRES bit. Restart the group if the source
> >>> changes.
> >>> 
> >>> Signed-off-by: Laurent Pinchart
> >>> <laurent.pinchart+renesas@ideasonboard.com>
> >>> ---
> >>> 
> >>>  drivers/gpu/drm/rcar-du/rcar_du_crtc.c  |  4 ++++
> >>>  drivers/gpu/drm/rcar-du/rcar_du_group.c |  2 ++
> >>>  drivers/gpu/drm/rcar-du/rcar_du_group.h |  2 ++
> >>>  drivers/gpu/drm/rcar-du/rcar_du_plane.c | 22 ++++++++++++++++++++--
> >>>  4 files changed, 28 insertions(+), 2 deletions(-)
> >>> 
> >>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> >>> b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index
> >>> 48cb19949ca3..7e2f5c26d589
> >>> 100644
> >>> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> >>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> >>> @@ -272,6 +272,10 @@ static void rcar_du_crtc_update_planes(struct
> >>> rcar_du_crtc *rcrtc)
> >>>  			rcar_du_group_restart(rcrtc->group);
> >>>  	}
> >>> 
> >>> +	/* Restart the group if plane sources have changed. */
> >>> +	if (rcrtc->group->need_restart)
> >>> +		rcar_du_group_restart(rcrtc->group);
> >>> +
> >>>  	mutex_unlock(&rcrtc->group->lock);
> >>>  	
> >>>  	rcar_du_group_write(rcrtc->group, rcrtc->index % 2 ? DS2PR : DS1PR,
> >>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.c
> >>> b/drivers/gpu/drm/rcar-du/rcar_du_group.c index
> >>> 4a44ddd51766..0e2b46dce563 100644
> >>> --- a/drivers/gpu/drm/rcar-du/rcar_du_group.c
> >>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_group.c
> >>> @@ -162,6 +162,8 @@ void rcar_du_group_start_stop(struct rcar_du_group
> >>> *rgrp, bool start)
> >>> 
> >>>  void rcar_du_group_restart(struct rcar_du_group *rgrp)
> >>>  {
> >>> +	rgrp->need_restart = false;
> >>> +
> >>>  	__rcar_du_group_start_stop(rgrp, false);
> >>>  	__rcar_du_group_start_stop(rgrp, true);
> >>>  }
> >>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.h
> >>> b/drivers/gpu/drm/rcar-du/rcar_du_group.h index
> >>> 4b1952fd4e7d..5e3adc6b31b5 100644
> >>> --- a/drivers/gpu/drm/rcar-du/rcar_du_group.h
> >>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_group.h
> >>> @@ -32,6 +32,7 @@ struct rcar_du_device;
> >>>   * @dptsr_planes: bitmask of planes driven by dot-clock and timing
> >>>   generator 1
> >>>   * @num_planes: number of planes in the group
> >>>   * @planes: planes handled by the group
> >>> + * @need_restart: the group needs to be restarted due to a
> >>> configuration change
> >>>   */
> >>>  struct rcar_du_group {
> >>>  	struct rcar_du_device *dev;
> >>> @@ -47,6 +48,7 @@ struct rcar_du_group {
> >>>  	unsigned int num_planes;
> >>>  	struct rcar_du_plane planes[RCAR_DU_NUM_KMS_PLANES];
> >>> 
> >>> +	bool need_restart;
> >> 
> >> My recommendation is to keep any of these intermediate values in state
> >> objects too. The reason is that eventually we want to also support real
> >> queues of atomic commits,
> > 
> > I like the idea :-)
> > 
> >> and then anything stored globally (well, outside of the state objects)
> >> won't work. And yes it's ok to push that kind of stuff into helper,
> >> this isn't really any different than e.g. crtc_state->active_changed
> >> and similar booleans indicating that something special needs to be done
> >> when committing.
> >
> > I agree with you. There's still a couple of state variables I need to
> > remove in the driver structures, and that's on my todo list (although not
> > very high I'm afraid).
> > 
> > The group state is a bit of an oddball. The DU groups CRTCs by two and
> > shares resources inside a group. Implementing that resource sharing
> > requires storing group state, which is very difficult without an atomic
> > state object for the group.
> > 
> > Am I missing an easy way to fix that ? And would it be fine to upstream
> > this patch as-is in the meantime ? I'd like to get it in v4.6, it's been
> > out for long enough and is blocking other people.
> 
> Involves a bit of typing, but we allow drivers to subclass
> drm_atomic_state and add whatever they want.

I hadn't noticed it had been introduced, that's very nice.

> The important part is to make sure you get the locking right, i.e. only ever
> duplicate anything when you hold the right locks. For that you have about 3
> options:
> - protect all group state with mode_config->connection_lock. Might
>   unecessarily serialize updates.
> - create a per-group ww_mutex (atomic allows you to throw as many
>   additional ww_mutex locks encapsulated within a drm_modeset_lock as you
>   want).
> - just grab the crtc states (plus locks) for all the crtcs in a group when
>   duplicating a group state
> 
> I highly recommend you follow the patterns laid out in drm_atomic.c and
> only allow your driver to get at the group state through a get_group_state
> helper, like we have for plane/crtc/connector states. That can then take
> care of the locking and everything.

Thanks for the tip, I'll give it a try.

> i915 uses this to keep track of shared resources like dpll and display
> core clock.
> 
> There should be kerneldoc for the individual functions, but I think we
> lack an overview/example section ... hint, hint ;-)

I'll first try to understand it by using it :-)

-- 
Regards,

Laurent Pinchart


  reply	other threads:[~2015-12-27  9:00 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-13 22:50 [PATCH 00/22] R-Car DU: Add Gen3 support Laurent Pinchart
2015-09-13 22:50 ` [PATCH 01/22] drm: rcar-du: Don't update planes on disabled CRTCs Laurent Pinchart
2015-09-13 22:50 ` [PATCH 02/22] drm: rcar-du: Add support for the R8A7793 DU Laurent Pinchart
2015-09-13 22:50 ` [PATCH 03/22] drm: rcar-du: Add support for the R8A7794 DU Laurent Pinchart
2015-09-13 22:50 ` [PATCH 04/22] drm: rcar-du: Compute plane DDCR4 register value directly Laurent Pinchart
2015-09-13 22:50 ` [PATCH 05/22] drm: rcar-du: Refactor plane setup Laurent Pinchart
2015-09-13 22:50 ` [PATCH 06/22] drm: rcar-du: Add VSP1 support to the planes allocator Laurent Pinchart
2015-09-13 22:50 ` [PATCH 07/22] drm: rcar-du: Add VSP1 compositor support Laurent Pinchart
2015-09-13 22:50 ` [PATCH 08/22] drm: rcar-du: Restart the DU group when a plane source changes Laurent Pinchart
2015-09-14  7:22   ` Daniel Vetter
2015-12-17  7:11     ` Laurent Pinchart
2015-12-17  9:41       ` Daniel Vetter
2015-12-27  9:00         ` Laurent Pinchart [this message]
2015-09-13 22:50 ` [PATCH 09/22] drm: rcar-du: Move plane allocator to rcar_du_plane.c Laurent Pinchart
2015-09-13 22:50 ` [PATCH 10/22] drm: rcar-du: Expose the VSP1 compositor through KMS planes Laurent Pinchart
2015-09-13 22:50 ` [PATCH 11/22] drm: rcar-du: Use the VSP atomic update API Laurent Pinchart
2015-09-13 22:50 ` [PATCH 12/22] drm: rcar-du: Fix compile warning on 64-bit platforms Laurent Pinchart
2015-09-13 22:51 ` [PATCH 13/22] drm: rcar-du: Enable compilation on ARM64 Laurent Pinchart
2015-09-13 22:51 ` [PATCH 14/22] drm: rcar-du: Drop LVDS double dependency on OF Laurent Pinchart
2015-09-13 22:51 ` [PATCH 15/22] drm: rcar-du: Support up to 4 CRTCs Laurent Pinchart
2015-09-13 22:51 ` [PATCH 16/22] drm: rcar-du: Output the DISP signal on the DISP pin Laurent Pinchart
2015-09-13 22:51 ` [PATCH 17/22] drm: rcar-du: Output the DISP signal on the ODDF pin Laurent Pinchart
2015-09-13 22:51 ` [PATCH 18/22] drm: rcar-du: Add R8A7795 device support Laurent Pinchart
2015-09-13 22:51 ` [PATCH 19/22] drm: rcar-du: lvds: Avoid duplication of clock clamp code Laurent Pinchart
2015-09-13 22:51 ` [PATCH 20/22] drm: rcar-du: lvds: Fix PLL frequency-related configuration Laurent Pinchart
2015-09-13 22:51 ` [PATCH 21/22] drm: rcar-du: lvds: Rename PLLEN bit to PLLON Laurent Pinchart
2015-09-13 22:51 ` [PATCH 22/22] drm: rcar-du: lvds: Add R-Car Gen3 support Laurent Pinchart
2015-09-14  7:52 ` [PATCH 00/22] R-Car DU: Add " Geert Uytterhoeven
2015-09-14  8:07   ` Geert Uytterhoeven

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=3199261.oWaujEx9hz@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=linux-sh@vger.kernel.org \
    /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