Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@intel.com>
To: "Kandpal, Suraj" <suraj.kandpal@intel.com>,
	intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH v6 2/3] drm/i915 : Changing intel_connector iterators
Date: Wed, 05 Oct 2022 13:30:38 +0300	[thread overview]
Message-ID: <877d1esgtt.fsf@intel.com> (raw)
In-Reply-To: <20220919130505.1984383-3-suraj.kandpal@intel.com>

On Mon, 19 Sep 2022, "Kandpal, Suraj" <suraj.kandpal@intel.com> wrote:
> From: Suraj Kandpal <suraj.kandpal@intel.com>
>
> Changing intel_connector iterators as with writeback introduction
> not all drm_connector will be embedded within intel_connector.
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_acpi.c     |  7 ++++-
>  drivers/gpu/drm/i915/display/intel_display.h  |  7 ++---
>  .../drm/i915/display/intel_display_types.h    | 26 ++++++++++++++++++-
>  .../drm/i915/display/intel_modeset_setup.c    | 16 +++++++++---
>  4 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_acpi.c b/drivers/gpu/drm/i915/display/intel_acpi.c
> index 9df78e7caa2b..912fe5c2ffe5 100644
> --- a/drivers/gpu/drm/i915/display/intel_acpi.c
> +++ b/drivers/gpu/drm/i915/display/intel_acpi.c
> @@ -349,8 +349,13 @@ void intel_acpi_video_register(struct drm_i915_private *i915)
>  	 */
>  	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
>  	drm_for_each_connector_iter(connector, &conn_iter) {
> -		struct intel_panel *panel = &to_intel_connector(connector)->panel;
> +		struct intel_panel *panel;
> +		struct intel_connector *intel_connector =
> +					to_intel_connector(connector);
>  
> +		if (!intel_connector)
> +			continue;
> +		panel = &intel_connector->panel;
>  		if (panel->backlight.funcs && !panel->backlight.device) {
>  			acpi_video_register_backlight();
>  			break;
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> index a1ed9c82e2ed..102bf7d47ccc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -52,6 +52,7 @@ struct intel_crtc_state;
>  struct intel_digital_port;
>  struct intel_dp;
>  struct intel_encoder;
> +struct intel_connector;
>  struct intel_initial_plane_config;
>  struct intel_load_detect_pipe;
>  struct intel_plane;
> @@ -469,16 +470,12 @@ enum hpd_pin {
>  		for_each_if(intel_encoder_can_psr(intel_encoder))
>  
>  #define for_each_intel_connector_iter(intel_connector, iter) \
> -	while ((intel_connector = to_intel_connector(drm_connector_list_iter_next(iter))))
> +	while ((intel_connector = intel_connector_list_iter_next(iter)))
>  
>  #define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
>  	list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
>  		for_each_if((intel_encoder)->base.crtc == (__crtc))
>  
> -#define for_each_connector_on_encoder(dev, __encoder, intel_connector) \
> -	list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
> -		for_each_if((intel_connector)->base.encoder == (__encoder))
> -

Getting rid of this macro should be a separate change. As the first
patch, could've been merged already.

>  #define for_each_old_intel_plane_in_state(__state, plane, old_plane_state, __i) \
>  	for ((__i) = 0; \
>  	     (__i) < (__state)->base.dev->mode_config.num_total_plane && \
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 633cacd79074..a2d294929a64 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1498,12 +1498,14 @@ struct cxsr_latency {
>  #define to_intel_atomic_state(x) container_of(x, struct intel_atomic_state, base)
>  #define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
>  #define to_intel_crtc_state(x) container_of(x, struct intel_crtc_state, uapi)
> -#define to_intel_connector(x) container_of(x, struct intel_connector, base)
> +#define to_intel_wb_connector(x) container_of(x, struct intel_wb_connector, base)

Note that all of the macros here are sorted alphabetically.

The wb/wd difference is a pretty bad eyesore. Maybe we should use one or
the other, not mix them. (Except if we go with writeback, leave the
register macros WD because that's what they are.)

>  #define to_intel_encoder(x) container_of(x, struct intel_encoder, base)
>  #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
>  #define to_intel_plane(x) container_of(x, struct intel_plane, base)
>  #define to_intel_plane_state(x) container_of(x, struct intel_plane_state, uapi)
>  #define intel_fb_obj(x) ((x) ? to_intel_bo((x)->obj[0]) : NULL)
> +#define to_intel_connector(x) (((x->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)) ?	\
> +				NULL : container_of(x, struct intel_connector, base))

Would need to have (x)->connector_type, with parenthesis.

The problem with this is that we currently have 131 uses of
to_intel_connector() and practically all of them expect to get non-NULL
result.

You're going to get 131 static analyzer reports that you don't check for
NULL. You can't check for NULL in most places, because they're in the
middle of local parameter initialization.

>  
>  struct intel_hdmi {
>  	i915_reg_t hdmi_reg;
> @@ -2069,4 +2071,26 @@ to_intel_frontbuffer(struct drm_framebuffer *fb)
>  	return fb ? to_intel_framebuffer(fb)->frontbuffer : NULL;
>  }
>  
> +static inline struct intel_connector *
> +intel_connector_list_iter_next(struct drm_connector_list_iter *iter)
> +{
> +	struct drm_connector *connector;
> +	bool flag = true;
> +	/*
> +	 * Skipping connector that are Writeback connector as they will
> +	 * not be embedded in intel connector
> +	 */
> +	while (flag) {
> +		connector = drm_connector_list_iter_next(iter);
> +		if (connector && !to_intel_connector(connector))
> +			continue;
> +
> +		flag = false;
> +
> +		if (connector)
> +			return to_intel_connector(connector);
> +
> +	}
> +	return NULL;
> +}

This gets pretty ugly. I've got an idea, I'll send patches later
today.

Code is worth a thousand words, it's easier to explain that way.

BR,
Jani.

>  #endif /*  __INTEL_DISPLAY_TYPES_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> index cbfabd58b75a..e1a90331c230 100644
> --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> @@ -205,12 +205,22 @@ static bool intel_crtc_has_encoders(struct intel_crtc *crtc)
>  
>  static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder)
>  {
> -	struct drm_device *dev = encoder->base.dev;
> +	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>  	struct intel_connector *connector;
> +	struct drm_connector_list_iter conn_iter;
> +	bool found_connector = false;
>  
> -	for_each_connector_on_encoder(dev, &encoder->base, connector)
> -		return connector;
> +	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
> +	for_each_intel_connector_iter(connector, &conn_iter) {
> +		if (&encoder->base == connector->base.encoder) {
> +			found_connector = true;
> +			break;
> +		}
> +	}
> +	drm_connector_list_iter_end(&conn_iter);
>  
> +	if (found_connector)
> +		return connector;
>  	return NULL;
>  }

-- 
Jani Nikula, Intel Open Source Graphics Center

  reply	other threads:[~2022-10-05 10:30 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-19 13:05 [Intel-gfx] [PATCH v6 0/3] Enable Pipewriteback Kandpal, Suraj
2022-09-19 13:05 ` [Intel-gfx] [PATCH v6 1/3] drm/i915: Define WD trancoder for i915 Kandpal, Suraj
2022-10-05  9:07   ` Jani Nikula
2022-09-19 13:05 ` [Intel-gfx] [PATCH v6 2/3] drm/i915 : Changing intel_connector iterators Kandpal, Suraj
2022-10-05 10:30   ` Jani Nikula [this message]
2022-10-20  8:08     ` Kandpal, Suraj
2022-10-20  8:53       ` Jani Nikula
2022-10-20  8:56         ` Kandpal, Suraj
2022-09-19 13:05 ` [Intel-gfx] [PATCH v6 3/3] drm/i915: Enabling WD Transcoder Kandpal, Suraj
2022-09-28 15:23   ` Swati Sharma
2022-09-19 14:14 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable Pipewriteback (rev6) Patchwork
2022-09-19 14:14 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-09-19 14:38 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2022-09-19 23:41 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable Pipewriteback (rev7) Patchwork
2022-09-19 23:41 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-09-20  0:02 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-09-20  8:36 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2022-09-20 14:27 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable Pipewriteback (rev8) Patchwork
2022-09-20 14:27 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-09-20 14:51 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2022-09-20 15:43 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-09-20 20:09 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2022-09-21  2:07 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable Pipewriteback (rev9) Patchwork
2022-09-21  2:07 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-09-21  2:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-09-21  3:35 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2022-09-21  5:14 ` [Intel-gfx] [PATCH v6 0/3] Enable Pipewriteback Kandpal, Suraj
2022-09-28 12:46 ` Swati Sharma
2022-09-28 13:55   ` Kandpal, Suraj
2022-09-28 15:15 ` Swati Sharma

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=877d1esgtt.fsf@intel.com \
    --to=jani.nikula@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=suraj.kandpal@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox