From: Kieran Bingham <kieran.bingham@ideasonboard.com>
To: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
dri-devel@lists.freedesktop.org
Cc: linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH 2/5] drm: rcar-du: Move CRTC outputs bitmask to private CRTC state
Date: Fri, 7 Dec 2018 12:34:58 +0000 [thread overview]
Message-ID: <baec4d0f-08ec-56e1-2c8a-3d01921255ed@ideasonboard.com> (raw)
In-Reply-To: <20181125144031.4407-3-laurent.pinchart+renesas@ideasonboard.com>
Hi Laurent,
Thank you for the patch,
On 25/11/2018 14:40, Laurent Pinchart wrote:
> The rcar_du_crtc outputs field stores a bitmask of the outputs driven by
> the CRTC. This changes based on the configuration requested by
> userspace, and is used for the sole purpose of configuring the hardware.
> The field thus belongs to the CRTC state. Move it to the
> rcar_du_crtc_state structure.
>
> As a result the rcar_du_crtc_route_output() function loses most of its
> purpose. In order to remove it, move dpad0_source calculation to
> rcar_du_atomic_commit_tail(), until the field gets moved to a state
> structure. In order to simplify the rcar_du_group_set_routing()
> implementation, we also store the DPAD1 source in a new dpad1_source
> field which will move to a state structure with dpad0_source.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
that was a fairly tough read - but aside from one comment near the
bottom regarding initialising dpad0 which I'm sure you can handle
correctly, and another comment which I think we could improve things
outside of this patch:
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> ---
> drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 42 +++++++++++------------
> drivers/gpu/drm/rcar-du/rcar_du_crtc.h | 7 ++--
> drivers/gpu/drm/rcar-du/rcar_du_drv.h | 1 +
> drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 10 ------
> drivers/gpu/drm/rcar-du/rcar_du_group.c | 4 +--
> drivers/gpu/drm/rcar-du/rcar_du_kms.c | 22 ++++++++++++
> 6 files changed, 47 insertions(+), 39 deletions(-)
+8 ... It's a good job you bought -13 lines in the previous patch ;)
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> index 90dacab67be5..40b7f17159b0 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> @@ -22,6 +22,7 @@
>
> #include "rcar_du_crtc.h"
> #include "rcar_du_drv.h"
> +#include "rcar_du_encoder.h"
> #include "rcar_du_kms.h"
> #include "rcar_du_plane.h"
> #include "rcar_du_regs.h"
> @@ -316,26 +317,6 @@ static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc)
> rcar_du_crtc_write(rcrtc, DEWR, mode->hdisplay);
> }
>
> -void rcar_du_crtc_route_output(struct drm_crtc *crtc,
> - enum rcar_du_output output)
> -{
> - struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> - struct rcar_du_device *rcdu = rcrtc->group->dev;
> -
> - /*
> - * Store the route from the CRTC output to the DU output. The DU will be
> - * configured when starting the CRTC.
> - */
> - rcrtc->outputs |= BIT(output);
> -
> - /*
> - * Store RGB routing to DPAD0, the hardware will be configured when
> - * starting the CRTC.
> - */
> - if (output == RCAR_DU_OUTPUT_DPAD0)
> - rcdu->dpad0_source = rcrtc->index;
> -}
> -
> static unsigned int plane_zpos(struct rcar_du_plane *plane)
> {
> return plane->plane.state->normalized_zpos;
> @@ -655,6 +636,24 @@ static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc)
> * CRTC Functions
> */
>
> +static int rcar_du_crtc_atomic_check(struct drm_crtc *crtc,
> + struct drm_crtc_state *state)
> +{
> + struct rcar_du_crtc_state *rstate = to_rcar_crtc_state(state);
> + struct drm_encoder *encoder;
> +
> + /* Store the routes from the CRTC output to the DU outputs. */
> + rstate->outputs = 0;
> +
> + drm_for_each_encoder_mask(encoder, crtc->dev, state->encoder_mask) {
> + struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
> +
> + rstate->outputs |= BIT(renc->output);
> + }
> +
> + return 0;
> +}
> +
> static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc,
> struct drm_crtc_state *old_state)
> {
> @@ -678,8 +677,6 @@ static void rcar_du_crtc_atomic_disable(struct drm_crtc *crtc,
> crtc->state->event = NULL;
> }
> spin_unlock_irq(&crtc->dev->event_lock);
> -
> - rcrtc->outputs = 0;
> }
>
> static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc,
> @@ -755,6 +752,7 @@ enum drm_mode_status rcar_du_crtc_mode_valid(struct drm_crtc *crtc,
> }
>
> static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
> + .atomic_check = rcar_du_crtc_atomic_check,
> .atomic_begin = rcar_du_crtc_atomic_begin,
> .atomic_flush = rcar_du_crtc_atomic_flush,
> .atomic_enable = rcar_du_crtc_atomic_enable,
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> index 59ac6e7d22c9..ec47f164e69b 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h
> @@ -37,7 +37,6 @@ struct rcar_du_vsp;
> * @vblank_lock: protects vblank_wait and vblank_count
> * @vblank_wait: wait queue used to signal vertical blanking
> * @vblank_count: number of vertical blanking interrupts to wait for
> - * @outputs: bitmask of the outputs (enum rcar_du_output) driven by this CRTC
> * @group: CRTC group this CRTC belongs to
> * @vsp: VSP feeding video to this CRTC
> * @vsp_pipe: index of the VSP pipeline feeding video to this CRTC
> @@ -61,8 +60,6 @@ struct rcar_du_crtc {
> wait_queue_head_t vblank_wait;
> unsigned int vblank_count;
>
> - unsigned int outputs;
> -
> struct rcar_du_group *group;
> struct rcar_du_vsp *vsp;
> unsigned int vsp_pipe;
> @@ -77,11 +74,13 @@ struct rcar_du_crtc {
> * struct rcar_du_crtc_state - Driver-specific CRTC state
> * @state: base DRM CRTC state
> * @crc: CRC computation configuration
> + * @outputs: bitmask of the outputs (enum rcar_du_output) driven by this CRTC
> */
> struct rcar_du_crtc_state {
> struct drm_crtc_state state;
>
> struct vsp1_du_crc_config crc;
> + unsigned int outputs;
> };
>
> #define to_rcar_crtc_state(s) container_of(s, struct rcar_du_crtc_state, state)
> @@ -102,8 +101,6 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int swindex,
> void rcar_du_crtc_suspend(struct rcar_du_crtc *rcrtc);
> void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc);
>
> -void rcar_du_crtc_route_output(struct drm_crtc *crtc,
> - enum rcar_du_output output);
> void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc);
>
> void rcar_du_crtc_dsysr_clr_set(struct rcar_du_crtc *rcrtc, u32 clr, u32 set);
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> index 8ef9165957cb..8b47b8546fc8 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> @@ -90,6 +90,7 @@ struct rcar_du_device {
> } props;
>
> unsigned int dpad0_source;
> + unsigned int dpad1_source;
> unsigned int vspd1_sink;
> };
>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> index 1877764bd6d9..a123c28ea6ed 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> @@ -22,17 +22,7 @@
> * Encoder
> */
>
> -static void rcar_du_encoder_mode_set(struct drm_encoder *encoder,
> - struct drm_crtc_state *crtc_state,
> - struct drm_connector_state *conn_state)
> -{
> - struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
> -
> - rcar_du_crtc_route_output(crtc_state->crtc, renc->output);
> -}
> -
> static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
> - .atomic_mode_set = rcar_du_encoder_mode_set,
> };
>
> static const struct drm_encoder_funcs encoder_funcs = {
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.c b/drivers/gpu/drm/rcar-du/rcar_du_group.c
> index 3366cda6086c..7e440f61977f 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_group.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_group.c
> @@ -289,7 +289,7 @@ int rcar_du_set_dpad0_vsp1_routing(struct rcar_du_device *rcdu)
>
> int rcar_du_group_set_routing(struct rcar_du_group *rgrp)
> {
> - struct rcar_du_crtc *crtc0 = &rgrp->dev->crtcs[rgrp->index * 2];
> + struct rcar_du_device *rcdu = rgrp->dev;
> u32 dorcr = rcar_du_group_read(rgrp, DORCR);
>
> dorcr &= ~(DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_MASK);
> @@ -299,7 +299,7 @@ int rcar_du_group_set_routing(struct rcar_du_group *rgrp)
> * CRTC 1 in all other cases to avoid cloning CRTC 0 to DPAD0 and DPAD1
> * by default.
> */
> - if (crtc0->outputs & BIT(RCAR_DU_OUTPUT_DPAD1))
> + if (rcdu->dpad1_source == rgrp->index * 2)
The magic of getting (rgrp->index * 2) is a little bit ... magic ...
The what is happening ( ({0,1} => {0,2}) ) is clear - but not the why.
This happens a bit throughout as a means to convert from CRTC to Group
indexes, and back. But it could be clearer with a helper.
(not in this patch)
> dorcr |= DORCR_PG2D_DS1;
> else
> dorcr |= DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_DS2;
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> index fe6f65c94eef..bd3c2c5ea66f 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -285,6 +285,28 @@ static int rcar_du_atomic_check(struct drm_device *dev,
> static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state)
> {
> struct drm_device *dev = old_state->dev;
> + struct rcar_du_device *rcdu = dev->dev_private;
> + struct drm_crtc_state *crtc_state;
> + struct drm_crtc *crtc;
> + unsigned int i;
> +
> + /*
> + * Store RGB routing to DPAD0 and DPAD1, the hardware will be configured
> + * when starting the CRTCs.
> + */
> + rcdu->dpad1_source = -1;
Why do we initialise dpad1_source but not dpad0_source?
Are we *guaranteed* to always have RCAR_DU_OUTPUT_DPAD0 set in one of
the rcrtc_state->outputs ?
If so - then this isn't an issue.
> +
> + for_each_new_crtc_in_state(old_state, crtc, crtc_state, i) {
> + struct rcar_du_crtc_state *rcrtc_state =
> + to_rcar_crtc_state(crtc_state);
> + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
> +
> + if (rcrtc_state->outputs & BIT(RCAR_DU_OUTPUT_DPAD0))
> + rcdu->dpad0_source = rcrtc->index;
> +
> + if (rcrtc_state->outputs & BIT(RCAR_DU_OUTPUT_DPAD1))
> + rcdu->dpad1_source = rcrtc->index;
> + }
>
> /* Apply the atomic update. */
> drm_atomic_helper_commit_modeset_disables(dev, old_state);
>
--
Regards
--
Kieran
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2018-12-07 12:35 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-25 14:40 [PATCH 0/5] R-Car DU: Fix DPAD output routing on D3 and E3 Laurent Pinchart
2018-11-25 14:40 ` [PATCH 1/5] drm: rcar-du: Replace EXT_CTRL_REGS feature flag with generation check Laurent Pinchart
2018-11-26 8:36 ` Simon Horman
2018-12-07 11:39 ` Kieran Bingham
2018-11-25 14:40 ` [PATCH 2/5] drm: rcar-du: Move CRTC outputs bitmask to private CRTC state Laurent Pinchart
2018-12-07 12:34 ` Kieran Bingham [this message]
2018-12-09 20:40 ` Laurent Pinchart
2018-11-25 14:40 ` [PATCH 3/5] drm: rcar-du: Disable unused DPAD outputs Laurent Pinchart
2018-12-07 12:50 ` Kieran Bingham
2018-12-07 22:38 ` Laurent Pinchart
2018-12-09 20:44 ` [PATCH v1.1 " Laurent Pinchart
2018-11-25 14:40 ` [PATCH 4/5] arm64: dts: renesas: r8a77995: draak: Add backlight Laurent Pinchart
2018-12-04 16:57 ` Laurent Pinchart
2018-12-05 19:47 ` Simon Horman
2018-12-04 17:36 ` Geert Uytterhoeven
2018-12-10 12:30 ` Geert Uytterhoeven
2018-12-10 12:33 ` Laurent Pinchart
2018-12-12 10:58 ` Simon Horman
2018-11-25 14:40 ` [PATCH 5/5] [HACK] arm64: dts: r8a77995: draak: Add panel to DT 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=baec4d0f-08ec-56e1-2c8a-3d01921255ed@ideasonboard.com \
--to=kieran.bingham@ideasonboard.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=linux-renesas-soc@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