All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
To: Maxime Ripard <maxime@cerno.tech>
Cc: Nicolas Saenz Julienne <nsaenz@kernel.org>,
	Tim Gover <tim.gover@raspberrypi.com>,
	Emma Anholt <emma@anholt.net>, David Airlie <airlied@linux.ie>,
	LKML <linux-kernel@vger.kernel.org>,
	DRI Development <dri-devel@lists.freedesktop.org>,
	bcm-kernel-feedback-list@broadcom.com,
	linux-rpi-kernel@lists.infradead.org,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Daniel Vetter <daniel.vetter@intel.com>,
	Phil Elwell <phil@raspberrypi.com>,
	Dom Cobley <dom@raspberrypi.com>
Subject: Re: [PATCH v8 05/10] drm/vc4: crtc: Rework the encoder retrieval code (again)
Date: Tue, 2 Nov 2021 16:32:37 +0000	[thread overview]
Message-ID: <CAPY8ntDHdaz0r8Uxq-QsNkmBSz7Ywbf829uLTj=ZL_OwBhwAgA@mail.gmail.com> (raw)
In-Reply-To: <20211025152903.1088803-6-maxime@cerno.tech>

On Mon, 25 Oct 2021 at 16:29, Maxime Ripard <maxime@cerno.tech> wrote:
>
> It turns out the encoder retrieval code, in addition to being
> unnecessarily complicated, has a bug when only the planes and crtcs are
> affected by a given atomic commit.
>
> Indeed, in such a case, either drm_atomic_get_old_connector_state or
> drm_atomic_get_new_connector_state will return NULL and thus our encoder
> retrieval code will not match on anything.
>
> We can however simplify the code by using drm_for_each_encoder_mask, the
> drm_crtc_state storing the encoders a given CRTC is connected to
> directly and without relying on any other state.
>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>

Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>

> ---
>  drivers/gpu/drm/vc4/vc4_crtc.c | 30 +++++++++---------------------
>  drivers/gpu/drm/vc4/vc4_drv.h  |  4 +---
>  2 files changed, 10 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
> index e5c2e29a6f01..fbc1d4638650 100644
> --- a/drivers/gpu/drm/vc4/vc4_crtc.c
> +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
> @@ -282,26 +282,14 @@ static u32 vc4_crtc_get_fifo_full_level_bits(struct vc4_crtc *vc4_crtc,
>   * same CRTC.
>   */
>  struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc,
> -                                        struct drm_atomic_state *state,
> -                                        struct drm_connector_state *(*get_state)(struct drm_atomic_state *state,
> -                                                                                 struct drm_connector *connector))
> +                                        struct drm_crtc_state *state)
>  {
> -       struct drm_connector *connector;
> -       struct drm_connector_list_iter conn_iter;
> +       struct drm_encoder *encoder;
>
> -       drm_connector_list_iter_begin(crtc->dev, &conn_iter);
> -       drm_for_each_connector_iter(connector, &conn_iter) {
> -               struct drm_connector_state *conn_state = get_state(state, connector);
> +       WARN_ON(hweight32(state->encoder_mask) > 1);
>
> -               if (!conn_state)
> -                       continue;
> -
> -               if (conn_state->crtc == crtc) {
> -                       drm_connector_list_iter_end(&conn_iter);
> -                       return connector->encoder;
> -               }
> -       }
> -       drm_connector_list_iter_end(&conn_iter);
> +       drm_for_each_encoder_mask(encoder, crtc->dev, state->encoder_mask)
> +               return encoder;
>
>         return NULL;
>  }
> @@ -550,8 +538,7 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
>         struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
>                                                                          crtc);
>         struct vc4_crtc_state *old_vc4_state = to_vc4_crtc_state(old_state);
> -       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, state,
> -                                                          drm_atomic_get_old_connector_state);
> +       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, old_state);
>         struct drm_device *dev = crtc->dev;
>
>         require_hvs_enabled(dev);
> @@ -578,10 +565,11 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
>  static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
>                                    struct drm_atomic_state *state)
>  {
> +       struct drm_crtc_state *new_state = drm_atomic_get_new_crtc_state(state,
> +                                                                        crtc);
>         struct drm_device *dev = crtc->dev;
>         struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
> -       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, state,
> -                                                          drm_atomic_get_new_connector_state);
> +       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, new_state);
>         struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
>
>         require_hvs_enabled(dev);
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index f5e678491502..60826aca9e5b 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -545,9 +545,7 @@ vc4_crtc_to_vc4_pv_data(const struct vc4_crtc *crtc)
>  }
>
>  struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc,
> -                                        struct drm_atomic_state *state,
> -                                        struct drm_connector_state *(*get_state)(struct drm_atomic_state *state,
> -                                                                                 struct drm_connector *connector));
> +                                        struct drm_crtc_state *state);
>
>  struct vc4_crtc_state {
>         struct drm_crtc_state base;
> --
> 2.31.1
>

WARNING: multiple messages have this Message-ID (diff)
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
To: Maxime Ripard <maxime@cerno.tech>
Cc: DRI Development <dri-devel@lists.freedesktop.org>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Daniel Vetter <daniel.vetter@intel.com>,
	David Airlie <airlied@linux.ie>,
	linux-rpi-kernel@lists.infradead.org,
	LKML <linux-kernel@vger.kernel.org>,
	Maxime Ripard <mripard@kernel.org>,
	Nicolas Saenz Julienne <nsaenz@kernel.org>,
	bcm-kernel-feedback-list@broadcom.com,
	Emma Anholt <emma@anholt.net>, Phil Elwell <phil@raspberrypi.com>,
	Tim Gover <tim.gover@raspberrypi.com>,
	Dom Cobley <dom@raspberrypi.com>
Subject: Re: [PATCH v8 05/10] drm/vc4: crtc: Rework the encoder retrieval code (again)
Date: Tue, 2 Nov 2021 16:32:37 +0000	[thread overview]
Message-ID: <CAPY8ntDHdaz0r8Uxq-QsNkmBSz7Ywbf829uLTj=ZL_OwBhwAgA@mail.gmail.com> (raw)
In-Reply-To: <20211025152903.1088803-6-maxime@cerno.tech>

On Mon, 25 Oct 2021 at 16:29, Maxime Ripard <maxime@cerno.tech> wrote:
>
> It turns out the encoder retrieval code, in addition to being
> unnecessarily complicated, has a bug when only the planes and crtcs are
> affected by a given atomic commit.
>
> Indeed, in such a case, either drm_atomic_get_old_connector_state or
> drm_atomic_get_new_connector_state will return NULL and thus our encoder
> retrieval code will not match on anything.
>
> We can however simplify the code by using drm_for_each_encoder_mask, the
> drm_crtc_state storing the encoders a given CRTC is connected to
> directly and without relying on any other state.
>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>

Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>

> ---
>  drivers/gpu/drm/vc4/vc4_crtc.c | 30 +++++++++---------------------
>  drivers/gpu/drm/vc4/vc4_drv.h  |  4 +---
>  2 files changed, 10 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
> index e5c2e29a6f01..fbc1d4638650 100644
> --- a/drivers/gpu/drm/vc4/vc4_crtc.c
> +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
> @@ -282,26 +282,14 @@ static u32 vc4_crtc_get_fifo_full_level_bits(struct vc4_crtc *vc4_crtc,
>   * same CRTC.
>   */
>  struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc,
> -                                        struct drm_atomic_state *state,
> -                                        struct drm_connector_state *(*get_state)(struct drm_atomic_state *state,
> -                                                                                 struct drm_connector *connector))
> +                                        struct drm_crtc_state *state)
>  {
> -       struct drm_connector *connector;
> -       struct drm_connector_list_iter conn_iter;
> +       struct drm_encoder *encoder;
>
> -       drm_connector_list_iter_begin(crtc->dev, &conn_iter);
> -       drm_for_each_connector_iter(connector, &conn_iter) {
> -               struct drm_connector_state *conn_state = get_state(state, connector);
> +       WARN_ON(hweight32(state->encoder_mask) > 1);
>
> -               if (!conn_state)
> -                       continue;
> -
> -               if (conn_state->crtc == crtc) {
> -                       drm_connector_list_iter_end(&conn_iter);
> -                       return connector->encoder;
> -               }
> -       }
> -       drm_connector_list_iter_end(&conn_iter);
> +       drm_for_each_encoder_mask(encoder, crtc->dev, state->encoder_mask)
> +               return encoder;
>
>         return NULL;
>  }
> @@ -550,8 +538,7 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
>         struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
>                                                                          crtc);
>         struct vc4_crtc_state *old_vc4_state = to_vc4_crtc_state(old_state);
> -       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, state,
> -                                                          drm_atomic_get_old_connector_state);
> +       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, old_state);
>         struct drm_device *dev = crtc->dev;
>
>         require_hvs_enabled(dev);
> @@ -578,10 +565,11 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
>  static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
>                                    struct drm_atomic_state *state)
>  {
> +       struct drm_crtc_state *new_state = drm_atomic_get_new_crtc_state(state,
> +                                                                        crtc);
>         struct drm_device *dev = crtc->dev;
>         struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
> -       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, state,
> -                                                          drm_atomic_get_new_connector_state);
> +       struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, new_state);
>         struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
>
>         require_hvs_enabled(dev);
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index f5e678491502..60826aca9e5b 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -545,9 +545,7 @@ vc4_crtc_to_vc4_pv_data(const struct vc4_crtc *crtc)
>  }
>
>  struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc,
> -                                        struct drm_atomic_state *state,
> -                                        struct drm_connector_state *(*get_state)(struct drm_atomic_state *state,
> -                                                                                 struct drm_connector *connector));
> +                                        struct drm_crtc_state *state);
>
>  struct vc4_crtc_state {
>         struct drm_crtc_state base;
> --
> 2.31.1
>

  reply	other threads:[~2021-11-02 16:32 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-25 15:28 [PATCH v8 00/10] drm/vc4: hdmi: Support the 4k @ 60Hz modes Maxime Ripard
2021-10-25 15:28 ` [PATCH v8 01/10] drm/vc4: hdmi: Remove the DDC probing for status detection Maxime Ripard
2021-11-02 17:25   ` Dave Stevenson
2021-11-02 17:25     ` Dave Stevenson
2021-10-25 15:28 ` [PATCH v8 02/10] drm/vc4: hdmi: Fix HPD GPIO detection Maxime Ripard
2021-11-02 16:15   ` Dave Stevenson
2021-11-02 16:15     ` Dave Stevenson
2021-10-25 15:28 ` [PATCH v8 03/10] drm/vc4: Make vc4_crtc_get_encoder public Maxime Ripard
2021-11-02 16:21   ` Dave Stevenson
2021-11-02 16:21     ` Dave Stevenson
2021-10-25 15:28 ` [PATCH v8 04/10] drm/vc4: crtc: Add encoder to vc4_crtc_config_pv prototype Maxime Ripard
2021-11-02 16:25   ` Dave Stevenson
2021-11-02 16:25     ` Dave Stevenson
2021-10-25 15:28 ` [PATCH v8 05/10] drm/vc4: crtc: Rework the encoder retrieval code (again) Maxime Ripard
2021-11-02 16:32   ` Dave Stevenson [this message]
2021-11-02 16:32     ` Dave Stevenson
2021-10-25 15:28 ` [PATCH v8 06/10] drm/vc4: crtc: Add some logging Maxime Ripard
2021-11-02 16:33   ` Dave Stevenson
2021-11-02 16:33     ` Dave Stevenson
2021-10-25 15:29 ` [PATCH v8 07/10] drm/vc4: Leverage the load tracker on the BCM2711 Maxime Ripard
2021-11-02 16:46   ` Dave Stevenson
2021-11-02 16:46     ` Dave Stevenson
2021-10-25 15:29 ` [PATCH v8 08/10] drm/vc4: hdmi: Raise the maximum clock rate Maxime Ripard
2021-10-25 15:29 ` [PATCH v8 09/10] drm/vc4: hdmi: Enable the scrambler on reconnection Maxime Ripard
2021-11-02 16:51   ` Dave Stevenson
2021-11-02 16:51     ` Dave Stevenson
2021-10-25 15:29 ` [PATCH v8 10/10] drm/vc4: Increase the core clock based on HVS load Maxime Ripard
2021-11-02 17:12   ` Dave Stevenson
2021-11-02 17:12     ` Dave Stevenson
2021-11-04  9:43 ` [PATCH v8 00/10] drm/vc4: hdmi: Support the 4k @ 60Hz modes Maxime Ripard
2021-11-04  9:43   ` Maxime Ripard

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='CAPY8ntDHdaz0r8Uxq-QsNkmBSz7Ywbf829uLTj=ZL_OwBhwAgA@mail.gmail.com' \
    --to=dave.stevenson@raspberrypi.com \
    --cc=airlied@linux.ie \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=daniel.vetter@intel.com \
    --cc=dom@raspberrypi.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=emma@anholt.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rpi-kernel@lists.infradead.org \
    --cc=maxime@cerno.tech \
    --cc=nsaenz@kernel.org \
    --cc=phil@raspberrypi.com \
    --cc=tim.gover@raspberrypi.com \
    --cc=tzimmermann@suse.de \
    /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.