All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Jani Nikula <jani.nikula@intel.com>
Cc: igt-dev@lists.freedesktop.org
Subject: Re: [PATCH i-g-t 05/10] lib/kms: Use igt_crtc_for_pipe() everywhere
Date: Fri, 12 Dec 2025 17:32:50 +0200	[thread overview]
Message-ID: <aTw1ou91cjbFOAPh@intel.com> (raw)
In-Reply-To: <420526a14d54fe8b7ff466b7093b7e6f48a451cf@intel.com>

On Wed, Dec 10, 2025 at 04:25:10PM +0200, Jani Nikula wrote:
> On Wed, 10 Dec 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Replace all the naked display->pipes[] stuff with igt_crtc_for_pipe().
> >
> > One step towards using 'crtcs' instead of 'pipes'.
> >
> > Done with cocci:
> >  #include "scripts/iterators.cocci"
> >
> > @@
> > expression D, P;
> > identifier M;
> > @@
> > (
> > - D.pipes[P].M
> > + igt_crtc_for_pipe(&D, P)->M
> > |
> > - D->pipes[P].M
> > + igt_crtc_for_pipe(D, P)->M
> > |
> > - &D.pipes[P]
> > + igt_crtc_for_pipe(&D, P)
> > |
> > - &D->pipes[P]
> > + igt_crtc_for_pipe(D, P)
> > |
> > - D->pipes[P]
> > + XXX
> 
> Is that just to catch any remaining references that didn't match the
> earlier ones?

Yeah, that was probably it.

> 
> > )
> >
> > @@
> > expression display, pipe;
> > @@
> > igt_crtc_for_pipe(...)
> > {
> > <...
> > - igt_crtc_for_pipe(display, pipe)
> > + &display->pipes[pipe]
> > ...>
> > }
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> I'm guessing most of these places shouldn't be using pipe to begin with,
> but that's for another patch. This is nice cleanup.
> 
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> 
> > ---
> >  lib/igt_kms.c                                 | 38 ++++++++++---------
> >  lib/igt_kms.h                                 |  6 ++-
> >  tests/amdgpu/amd_abm.c                        |  2 +-
> >  tests/amdgpu/amd_assr.c                       |  2 +-
> >  tests/amdgpu/amd_bypass.c                     |  2 +-
> >  tests/amdgpu/amd_color.c                      |  2 +-
> >  tests/amdgpu/amd_dp_dsc.c                     |  3 +-
> >  tests/amdgpu/amd_hotplug.c                    |  3 +-
> >  tests/amdgpu/amd_ilr.c                        |  2 +-
> >  tests/amdgpu/amd_link_settings.c              |  2 +-
> >  tests/amdgpu/amd_mall.c                       |  2 +-
> >  tests/amdgpu/amd_max_bpc.c                    |  2 +-
> >  tests/amdgpu/amd_mem_leak.c                   |  2 +-
> >  tests/amdgpu/amd_mode_switch.c                |  4 +-
> >  tests/amdgpu/amd_multidisplay_modeset.c       |  6 +--
> >  tests/amdgpu/amd_odm.c                        |  2 +-
> >  tests/amdgpu/amd_plane.c                      |  2 +-
> >  tests/amdgpu/amd_psr.c                        |  2 +-
> >  tests/amdgpu/amd_replay.c                     |  2 +-
> >  tests/amdgpu/amd_subvp.c                      |  3 +-
> >  tests/chamelium/kms_chamelium_color.c         | 10 ++---
> >  .../kms_chamelium_sharpness_filter.c          |  4 +-
> >  tests/intel/gem_eio.c                         |  2 +-
> >  tests/intel/gem_pxp.c                         |  4 +-
> >  tests/intel/kms_big_fb.c                      |  6 +--
> >  tests/intel/kms_busy.c                        |  6 +--
> >  tests/intel/kms_cdclk.c                       |  2 +-
> >  tests/intel/kms_flip_scaled_crc.c             |  4 +-
> >  tests/intel/kms_frontbuffer_tracking.c        | 16 +++++---
> >  tests/intel/kms_joiner_helper.c               |  2 +-
> >  tests/intel/kms_pipe_stress.c                 | 10 +++--
> >  tests/intel/kms_pm_dc.c                       |  4 +-
> >  tests/intel/kms_sharpness_filter.c            |  2 +-
> >  tests/intel/perf_pmu.c                        |  2 +-
> >  tests/intel/xe_pxp.c                          |  6 +--
> >  tests/kms_async_flips.c                       |  2 +-
> >  tests/kms_atomic.c                            | 18 +++++----
> >  tests/kms_atomic_transition.c                 | 33 ++++++++--------
> >  tests/kms_bw.c                                |  3 +-
> >  tests/kms_color.c                             | 10 ++---
> >  tests/kms_color_helper.c                      |  4 +-
> >  tests/kms_concurrent.c                        |  4 +-
> >  tests/kms_cursor_crc.c                        |  8 ++--
> >  tests/kms_cursor_edge_walk.c                  |  2 +-
> >  tests/kms_cursor_legacy.c                     | 26 +++++++------
> >  tests/kms_display_modes.c                     | 16 +++++---
> >  tests/kms_dither.c                            |  2 +-
> >  tests/kms_hdr.c                               |  2 +-
> >  tests/kms_invalid_mode.c                      |  2 +-
> >  tests/kms_lease.c                             | 37 +++++++++---------
> >  tests/kms_multipipe_modeset.c                 |  4 +-
> >  tests/kms_pipe_crc_basic.c                    |  6 ++-
> >  tests/kms_plane.c                             | 10 ++---
> >  tests/kms_plane_alpha_blend.c                 | 15 +++++---
> >  tests/kms_plane_cursor.c                      |  8 ++--
> >  tests/kms_plane_multiple.c                    |  4 +-
> >  tests/kms_plane_scaling.c                     |  8 ++--
> >  tests/kms_properties.c                        | 12 ++++--
> >  tests/kms_rotation_crc.c                      |  3 +-
> >  tests/kms_sequence.c                          |  2 +-
> >  tests/kms_tiled_display.c                     |  2 +-
> >  tests/kms_universal_plane.c                   | 10 +++--
> >  tests/kms_vblank.c                            |  4 +-
> >  tools/amd_hdmi_compliance.c                   |  2 +-
> >  64 files changed, 239 insertions(+), 189 deletions(-)
> >
> > diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> > index a6bc41fb357d..951144bae955 100644
> > --- a/lib/igt_kms.c
> > +++ b/lib/igt_kms.c
> > @@ -2839,7 +2839,7 @@ void igt_display_reset(igt_display_t *display)
> >  	display->first_commit = true;
> >  
> >  	for_each_pipe(display, pipe) {
> > -		igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +		igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  		igt_plane_t *plane;
> >  
> >  		for_each_plane_on_pipe(display, pipe, plane)
> > @@ -2870,7 +2870,7 @@ static void igt_fill_display_format_mod(igt_display_t *display);
> >   */
> >  void igt_require_pipe(igt_display_t *display, enum pipe pipe)
> >  {
> > -	igt_skip_on_f(pipe >= igt_display_n_crtcs(display) || !display->pipes[pipe].valid,
> > +	igt_skip_on_f(pipe >= igt_display_n_crtcs(display) || !igt_crtc_for_pipe(display, pipe)->valid,
> >  			"Pipe %s does not exist\n",
> >  			kmstest_pipe_name(pipe));
> >  }
> > @@ -3013,7 +3013,7 @@ void igt_display_reset_outputs(igt_display_t *display)
> >  	igt_display_reset(display);
> >  
> >  	for_each_pipe(display, i) {
> > -		igt_pipe_t *pipe = &display->pipes[i];
> > +		igt_pipe_t *pipe = igt_crtc_for_pipe(display, i);
> >  		igt_output_t *output;
> >  
> >  		if (!igt_pipe_has_valid_output(display, i))
> > @@ -3118,7 +3118,7 @@ void igt_display_require(igt_display_t *display, int drm_fd)
> >  			__intel_get_pipe_from_crtc_id(drm_fd,
> >  						      resources->crtcs[i], i) : i;
> >  
> > -		pipe = &display->pipes[pipe_enum];
> > +		pipe = igt_crtc_for_pipe(display, pipe_enum);
> >  		pipe->pipe = pipe_enum;
> >  
> >  		pipe->valid = true;
> > @@ -3156,7 +3156,7 @@ void igt_display_require(igt_display_t *display, int drm_fd)
> >  	display->n_colorops = 0;
> >  
> >  	for_each_pipe(display, i) {
> > -		igt_pipe_t *pipe = &display->pipes[i];
> > +		igt_pipe_t *pipe = igt_crtc_for_pipe(display, i);
> >  		igt_plane_t *plane;
> >  		int p = 1, crtc_mask = 0;
> >  		int j, type;
> > @@ -3461,7 +3461,7 @@ void igt_display_fini(igt_display_t *display)
> >  	}
> >  
> >  	for (i = 0; i < igt_display_n_crtcs(display); i++)
> > -		igt_pipe_fini(&display->pipes[i]);
> > +		igt_pipe_fini(igt_crtc_for_pipe(display, i));
> >  
> >  	for (i = 0; i < display->n_outputs; i++)
> >  		igt_output_fini(&display->outputs[i]);
> > @@ -3532,7 +3532,7 @@ static igt_pipe_t *igt_output_get_driving_pipe(igt_output_t *output)
> >  
> >  	igt_assert(pipe >= 0 && pipe < igt_display_n_crtcs(display));
> >  
> > -	return &display->pipes[pipe];
> > +	return igt_crtc_for_pipe(display, pipe);
> >  }
> >  
> >  static igt_plane_t *igt_pipe_get_plane(igt_pipe_t *pipe, int plane_idx)
> > @@ -3658,7 +3658,7 @@ igt_output_t **__igt_pipe_populate_outputs(igt_display_t *display, igt_output_t
> >  	       sizeof(*chosen_outputs) * igt_display_n_crtcs(display));
> >  
> >  	for (i = 0; i < igt_display_n_crtcs(display); i++) {
> > -		igt_pipe_t *pipe = &display->pipes[i];
> > +		igt_pipe_t *pipe = igt_crtc_for_pipe(display, i);
> >  		if (pipe->valid)
> >  			full_pipe_mask |= (1 << i);
> >  	}
> > @@ -4815,7 +4815,7 @@ static int igt_atomic_commit(igt_display_t *display, uint32_t flags, void *user_
> >  	req = drmModeAtomicAlloc();
> >  
> >  	for_each_pipe(display, pipe) {
> > -		igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +		igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  		igt_plane_t *plane;
> >  
> >  		/*
> > @@ -4866,7 +4866,7 @@ display_commit_changed(igt_display_t *display, enum igt_commit_style s)
> >  	enum pipe pipe;
> >  
> >  	for_each_pipe(display, pipe) {
> > -		igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +		igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  		igt_plane_t *plane;
> >  
> >  		if (s == COMMIT_ATOMIC) {
> > @@ -4969,7 +4969,8 @@ static int do_display_commit(igt_display_t *display,
> >  		ret = igt_atomic_commit(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> >  	} else {
> >  		for_each_pipe(display, pipe) {
> > -			igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +			igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display,
> > +								 pipe);
> >  
> >  			ret = igt_pipe_commit(pipe_obj, s, fail_on_error);
> >  			if (ret)
> > @@ -5296,7 +5297,7 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe)
> >  		old_pipe = igt_output_get_driving_pipe(output);
> >  
> >  	if (pipe != PIPE_NONE)
> > -		pipe_obj = &display->pipes[pipe];
> > +		pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  
> >  	LOG(display, "%s: set_pipe(%s)\n", igt_output_name(output),
> >  	    kmstest_pipe_name(pipe));
> > @@ -5316,7 +5317,8 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe)
> >  		}
> >  	}
> >  
> > -	igt_output_set_prop_value(output, IGT_CONNECTOR_CRTC_ID, pipe == PIPE_NONE ? 0 : display->pipes[pipe].crtc_id);
> > +	igt_output_set_prop_value(output, IGT_CONNECTOR_CRTC_ID,
> > +				  pipe == PIPE_NONE ? 0 : igt_crtc_for_pipe(display, pipe)->crtc_id);
> >  
> >  	igt_output_refresh(output);
> >  
> > @@ -5450,7 +5452,7 @@ bool igt_fit_modes_in_bw(igt_display_t *display)
> >   */
> >  void igt_pipe_refresh(igt_display_t *display, enum pipe pipe, bool force)
> >  {
> > -	igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  
> >  	if (force && display->is_atomic) {
> >  		igt_output_t *output = igt_pipe_get_output(pipe_obj);
> > @@ -7196,9 +7198,9 @@ bool igt_check_bigjoiner_support(igt_display_t *display)
> >  				}
> >  			}
> >  
> > -			if (!display->pipes[pipes[i].idx + 1].valid) {
> > +			if (!igt_crtc_for_pipe(display, pipes[i].idx + 1)->valid) {
> >  				igt_info("Consecutive pipe-%s: Fused-off, couldn't be used as a Bigjoiner Secondary.\n",
> > -					 kmstest_pipe_name(display->pipes[pipes[i].idx + 1].pipe));
> > +					 kmstest_pipe_name(igt_crtc_for_pipe(display, pipes[i].idx + 1)->pipe));
> >  				return false;
> >  			}
> >  
> > @@ -7218,9 +7220,9 @@ bool igt_check_bigjoiner_support(igt_display_t *display)
> >  				 max_dotclock, pipes[i - 1].force_joiner ? "Yes" : "No");
> >  			kmstest_dump_mode(pipes[i - 1].mode);
> >  
> > -			if (!display->pipes[pipes[i - 1].idx + 1].valid) {
> > +			if (!igt_crtc_for_pipe(display, pipes[i - 1].idx + 1)->valid) {
> >  				igt_info("Consecutive pipe-%s: Fused-off, couldn't be used as a Bigjoiner Secondary.\n",
> > -					 kmstest_pipe_name(display->pipes[pipes[i - 1].idx + 1].pipe));
> > +					 kmstest_pipe_name(igt_crtc_for_pipe(display, pipes[i - 1].idx + 1)->pipe));
> >  				return false;
> >  			}
> >  
> > diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> > index 5bb5c2cac19c..fd3c8448983e 100644
> > --- a/lib/igt_kms.h
> > +++ b/lib/igt_kms.h
> > @@ -1074,7 +1074,8 @@ static inline bool igt_pipe_is_prop_changed(igt_display_t *display,
> >  					    enum pipe pipe,
> >  					    enum igt_atomic_crtc_properties prop)
> >  {
> > -	return igt_pipe_obj_is_prop_changed(&display->pipes[pipe], prop);
> > +	return igt_pipe_obj_is_prop_changed(igt_crtc_for_pipe(display, pipe),
> > +					    prop);
> >  }
> >  
> >  /**
> > @@ -1132,7 +1133,8 @@ static inline void igt_pipe_set_prop_value(igt_display_t *display,
> >  					   enum igt_atomic_crtc_properties prop,
> >  					   uint64_t value)
> >  {
> > -	igt_pipe_obj_set_prop_value(&display->pipes[pipe], prop, value);
> > +	igt_pipe_obj_set_prop_value(igt_crtc_for_pipe(display, pipe), prop,
> > +				    value);
> >  }
> >  
> >  extern bool igt_pipe_obj_try_prop_enum(igt_pipe_t *pipe,
> > diff --git a/tests/amdgpu/amd_abm.c b/tests/amdgpu/amd_abm.c
> > index 84677fef80d6..9be5cfe8efc1 100644
> > --- a/tests/amdgpu/amd_abm.c
> > +++ b/tests/amdgpu/amd_abm.c
> > @@ -131,7 +131,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_assr.c b/tests/amdgpu/amd_assr.c
> > index 8a42baa0ba86..ebd6654ee2a1 100644
> > --- a/tests/amdgpu/amd_assr.c
> > +++ b/tests/amdgpu/amd_assr.c
> > @@ -168,7 +168,7 @@ static void present_visual_pattern(data_t *data, igt_output_t *output)
> >  	mode = igt_output_get_mode(output);
> >  	igt_assert(mode);
> >  
> > -	pipe = &data->display.pipes[PIPE_A];
> > +	pipe = igt_crtc_for_pipe(&data->display, PIPE_A);
> >  	primary =
> >  		igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  	igt_output_set_pipe(output, PIPE_A);
> > diff --git a/tests/amdgpu/amd_bypass.c b/tests/amdgpu/amd_bypass.c
> > index a3fc39c50a51..40828fa52b1f 100644
> > --- a/tests/amdgpu/amd_bypass.c
> > +++ b/tests/amdgpu/amd_bypass.c
> > @@ -65,7 +65,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_color.c b/tests/amdgpu/amd_color.c
> > index 917d30b20a47..fcfbe48d1eeb 100644
> > --- a/tests/amdgpu/amd_color.c
> > +++ b/tests/amdgpu/amd_color.c
> > @@ -180,7 +180,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_dp_dsc.c b/tests/amdgpu/amd_dp_dsc.c
> > index 788ff911691d..fe40d0901548 100644
> > --- a/tests/amdgpu/amd_dp_dsc.c
> > +++ b/tests/amdgpu/amd_dp_dsc.c
> > @@ -65,7 +65,8 @@ static void test_init(data_t *data)
> >  
> >  	for_each_pipe(display, i) {
> >  		data->pipe_id[i] = PIPE_A + i;
> > -		data->pipe[i] = &data->display.pipes[data->pipe_id[i]];
> > +		data->pipe[i] = igt_crtc_for_pipe(&data->display,
> > +						  data->pipe_id[i]);
> >  		data->primary[i] = igt_pipe_get_plane_type(
> >  				data->pipe[i], DRM_PLANE_TYPE_PRIMARY);
> >  		data->pipe_crc[i] =
> > diff --git a/tests/amdgpu/amd_hotplug.c b/tests/amdgpu/amd_hotplug.c
> > index 8d875a5b888f..d80eb65bd263 100644
> > --- a/tests/amdgpu/amd_hotplug.c
> > +++ b/tests/amdgpu/amd_hotplug.c
> > @@ -55,7 +55,8 @@ static void test_init(data_t *data)
> >  
> >  	for_each_pipe(display, i) {
> >  		data->pipe_id[i] = PIPE_A + i;
> > -		data->pipe[i] = &data->display.pipes[data->pipe_id[i]];
> > +		data->pipe[i] = igt_crtc_for_pipe(&data->display,
> > +						  data->pipe_id[i]);
> >  		data->primary[i] = igt_pipe_get_plane_type(
> >  			data->pipe[i], DRM_PLANE_TYPE_PRIMARY);
> >  		data->overlay[i] = igt_pipe_get_plane_type_index(
> > diff --git a/tests/amdgpu/amd_ilr.c b/tests/amdgpu/amd_ilr.c
> > index 5767d4ac4c11..680b46763af3 100644
> > --- a/tests/amdgpu/amd_ilr.c
> > +++ b/tests/amdgpu/amd_ilr.c
> > @@ -98,7 +98,7 @@ static void test_init(data_t *data, igt_output_t *output)
> >  
> >  	igt_require(data->pipe_id != PIPE_NONE);
> >  
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe_id,
> >  					  AMDGPU_PIPE_CRC_SOURCE_DPRX);
> > diff --git a/tests/amdgpu/amd_link_settings.c b/tests/amdgpu/amd_link_settings.c
> > index fb83f3c13932..6e6037ae5fbc 100644
> > --- a/tests/amdgpu/amd_link_settings.c
> > +++ b/tests/amdgpu/amd_link_settings.c
> > @@ -100,7 +100,7 @@ static void test_init(data_t *data, igt_output_t *output)
> >  
> >  	igt_require(data->pipe_id != PIPE_NONE);
> >  
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_output_set_pipe(output, data->pipe_id);
> >  
> > diff --git a/tests/amdgpu/amd_mall.c b/tests/amdgpu/amd_mall.c
> > index a3e82a33f8f9..27589b865a53 100644
> > --- a/tests/amdgpu/amd_mall.c
> > +++ b/tests/amdgpu/amd_mall.c
> > @@ -62,7 +62,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_max_bpc.c b/tests/amdgpu/amd_max_bpc.c
> > index 869a3e5c52b7..9771c67338c7 100644
> > --- a/tests/amdgpu/amd_max_bpc.c
> > +++ b/tests/amdgpu/amd_max_bpc.c
> > @@ -56,7 +56,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_mem_leak.c b/tests/amdgpu/amd_mem_leak.c
> > index 9863ec78d143..1b6b2b730c5b 100644
> > --- a/tests/amdgpu/amd_mem_leak.c
> > +++ b/tests/amdgpu/amd_mem_leak.c
> > @@ -47,7 +47,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_mode_switch.c b/tests/amdgpu/amd_mode_switch.c
> > index 8b6b93d68df7..c443578f5f09 100644
> > --- a/tests/amdgpu/amd_mode_switch.c
> > +++ b/tests/amdgpu/amd_mode_switch.c
> > @@ -41,8 +41,8 @@ static void test_init(data_t *data)
> >  	for_each_pipe(display, i) {
> >  		igt_output_t *output = &display->outputs[i];
> >  
> > -		data->primary[i] = igt_pipe_get_plane_type(
> > -			&data->display.pipes[i], DRM_PLANE_TYPE_PRIMARY);
> > +		data->primary[i] = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, i),
> > +							   DRM_PLANE_TYPE_PRIMARY);
> >  
> >  		data->output[i] = output;
> >  	}
> > diff --git a/tests/amdgpu/amd_multidisplay_modeset.c b/tests/amdgpu/amd_multidisplay_modeset.c
> > index 4e97438ad978..91455ed1dfb8 100644
> > --- a/tests/amdgpu/amd_multidisplay_modeset.c
> > +++ b/tests/amdgpu/amd_multidisplay_modeset.c
> > @@ -160,9 +160,9 @@ static void test_init(struct data_t *data)
> >  		 * tested
> >  		 */
> >  		output = igt_get_single_output_for_pipe(display, i);
> > -		pipes = &display->pipes[i];
> > -		data->primary[i] = igt_pipe_get_plane_type(
> > -			&data->display.pipes[i], DRM_PLANE_TYPE_PRIMARY);
> > +		pipes = igt_crtc_for_pipe(display, i);
> > +		data->primary[i] = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, i),
> > +							   DRM_PLANE_TYPE_PRIMARY);
> >  		data->output[i] = output;
> >  
> >  		/* dp rx crc only available for eDP, SST DP, MST DP */
> > diff --git a/tests/amdgpu/amd_odm.c b/tests/amdgpu/amd_odm.c
> > index 101c89e60e4e..483b30e8ac8f 100644
> > --- a/tests/amdgpu/amd_odm.c
> > +++ b/tests/amdgpu/amd_odm.c
> > @@ -49,7 +49,7 @@ static void test_init(struct data *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_plane.c b/tests/amdgpu/amd_plane.c
> > index ad7d921d2aa3..0dbac17a6e7f 100644
> > --- a/tests/amdgpu/amd_plane.c
> > +++ b/tests/amdgpu/amd_plane.c
> > @@ -156,7 +156,7 @@ static void test_init(data_t *data)
> >  
> >  	for_each_pipe(display, i) {
> >  		data->pipe_id[i] = PIPE_A + i;
> > -		data->pipe[i] = &display->pipes[data->pipe_id[i]];
> > +		data->pipe[i] = igt_crtc_for_pipe(display, data->pipe_id[i]);
> >  		data->primary[i] = igt_pipe_get_plane_type(
> >  			data->pipe[i], DRM_PLANE_TYPE_PRIMARY);
> >  		data->overlay[i] = igt_pipe_get_plane_type_index(
> > diff --git a/tests/amdgpu/amd_psr.c b/tests/amdgpu/amd_psr.c
> > index 040c39f0abdb..789d243f8e86 100644
> > --- a/tests/amdgpu/amd_psr.c
> > +++ b/tests/amdgpu/amd_psr.c
> > @@ -172,7 +172,7 @@ static void test_init(data_t *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_replay.c b/tests/amdgpu/amd_replay.c
> > index d06f56df233c..8b194f797938 100644
> > --- a/tests/amdgpu/amd_replay.c
> > +++ b/tests/amdgpu/amd_replay.c
> > @@ -62,7 +62,7 @@ static void test_init(struct test_data *data)
> >  
> >  	/* It doesn't matter which pipe we choose on amdpgu. */
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> >  
> > diff --git a/tests/amdgpu/amd_subvp.c b/tests/amdgpu/amd_subvp.c
> > index fca9d6036ca2..a0a546a3e398 100644
> > --- a/tests/amdgpu/amd_subvp.c
> > +++ b/tests/amdgpu/amd_subvp.c
> > @@ -65,7 +65,8 @@ static void test_init(struct data *data)
> >  
> >  	for_each_pipe(display, i) {
> >  		data->pipe_id[i] = PIPE_A + i;
> > -		data->pipe[i] = &data->display.pipes[data->pipe_id[i]];
> > +		data->pipe[i] = igt_crtc_for_pipe(&data->display,
> > +						  data->pipe_id[i]);
> >  		data->primary[i] = igt_pipe_get_plane_type(data->pipe[i],
> >  							   DRM_PLANE_TYPE_PRIMARY);
> >  		data->pipe_crc[i] = igt_pipe_crc_new(data->fd,
> > diff --git a/tests/chamelium/kms_chamelium_color.c b/tests/chamelium/kms_chamelium_color.c
> > index fd4f2aad46d6..195556c9368c 100644
> > --- a/tests/chamelium/kms_chamelium_color.c
> > +++ b/tests/chamelium/kms_chamelium_color.c
> > @@ -433,16 +433,16 @@ prep_pipe(data_t *data, enum pipe p)
> >  {
> >  	igt_require_pipe(&data->display, p);
> >  
> > -	if (igt_pipe_obj_has_prop(&data->display.pipes[p], IGT_CRTC_DEGAMMA_LUT_SIZE)) {
> > +	if (igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, p), IGT_CRTC_DEGAMMA_LUT_SIZE)) {
> >  		data->degamma_lut_size =
> > -			igt_pipe_obj_get_prop(&data->display.pipes[p],
> > +			igt_pipe_obj_get_prop(igt_crtc_for_pipe(&data->display, p),
> >  					      IGT_CRTC_DEGAMMA_LUT_SIZE);
> >  		igt_assert_lt(0, data->degamma_lut_size);
> >  	}
> >  
> > -	if (igt_pipe_obj_has_prop(&data->display.pipes[p], IGT_CRTC_GAMMA_LUT_SIZE)) {
> > +	if (igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, p), IGT_CRTC_GAMMA_LUT_SIZE)) {
> >  		data->gamma_lut_size =
> > -			igt_pipe_obj_get_prop(&data->display.pipes[p],
> > +			igt_pipe_obj_get_prop(igt_crtc_for_pipe(&data->display, p),
> >  					      IGT_CRTC_GAMMA_LUT_SIZE);
> >  		igt_assert_lt(0, data->gamma_lut_size);
> >  	}
> > @@ -456,7 +456,7 @@ static int test_setup(data_t *data, enum pipe p)
> >  	igt_display_reset(&data->display);
> >  	prep_pipe(data, p);
> >  
> > -	pipe = &data->display.pipes[p];
> > +	pipe = igt_crtc_for_pipe(&data->display, p);
> >  	igt_require(pipe->n_planes >= 0);
> >  
> >  	data->primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> > diff --git a/tests/chamelium/kms_chamelium_sharpness_filter.c b/tests/chamelium/kms_chamelium_sharpness_filter.c
> > index 014532d5c6b8..25e0275630f0 100644
> > --- a/tests/chamelium/kms_chamelium_sharpness_filter.c
> > +++ b/tests/chamelium/kms_chamelium_sharpness_filter.c
> > @@ -180,7 +180,7 @@ static int test_setup(data_t *data, enum pipe p)
> >  
> >  	igt_display_reset(&data->display);
> >  
> > -	pipe = &data->display.pipes[p];
> > +	pipe = igt_crtc_for_pipe(&data->display, p);
> >  	igt_require(pipe->n_planes >= 0);
> >  
> >  	data->primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> > @@ -217,7 +217,7 @@ static void test_sharpness_filter(data_t *data,  enum pipe p)
> >  	int port_idx = test_setup(data, p);
> >  
> >  	igt_require(port_idx >= 0);
> > -	igt_require(igt_pipe_obj_has_prop(&data->display.pipes[p], IGT_CRTC_SHARPNESS_STRENGTH));
> > +	igt_require(igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, p), IGT_CRTC_SHARPNESS_STRENGTH));
> >  
> >  	if (!pipe_output_combo_valid(data, p))
> >  		return;
> > diff --git a/tests/intel/gem_eio.c b/tests/intel/gem_eio.c
> > index 5f58cfe699a4..0d4aa1bd33cb 100644
> > --- a/tests/intel/gem_eio.c
> > +++ b/tests/intel/gem_eio.c
> > @@ -1035,7 +1035,7 @@ static void display_helper(igt_display_t *dpy, int *done)
> >  		int pipe;
> >  
> >  		pipe = rand() % igt_display_n_crtcs(dpy);
> > -		if (!dpy->pipes[pipe].valid)
> > +		if (!igt_crtc_for_pipe(dpy, pipe)->valid)
> >  			continue;
> >  		output = igt_get_single_output_for_pipe(dpy, pipe);
> >  		if (!output)
> > diff --git a/tests/intel/gem_pxp.c b/tests/intel/gem_pxp.c
> > index b80b7d33ee6c..49edf744f943 100644
> > --- a/tests/intel/gem_pxp.c
> > +++ b/tests/intel/gem_pxp.c
> > @@ -1226,7 +1226,7 @@ static void test_display_protected_crc(int i915, igt_display_t *display)
> >  	/* Do a modeset on all outputs */
> >  	for_each_connected_output(display, output) {
> >  		mode = igt_output_get_mode(output);
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  		igt_require(igt_pipe_connector_valid(i, output));
> >  		igt_output_set_pipe(output, i);
> > @@ -1243,7 +1243,7 @@ static void test_display_protected_crc(int i915, igt_display_t *display)
> >  
> >  	for_each_connected_output(display, output) {
> >  		mode = igt_output_get_mode(output);
> > -		pipe = &display->pipes[output->pending_pipe];
> > +		pipe = igt_crtc_for_pipe(display, output->pending_pipe);
> >  		pipe_crc = igt_pipe_crc_new(i915, pipe->pipe,
> >  					    IGT_PIPE_CRC_SOURCE_AUTO);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> > diff --git a/tests/intel/kms_big_fb.c b/tests/intel/kms_big_fb.c
> > index 686c6772ef4b..7316547d276d 100644
> > --- a/tests/intel/kms_big_fb.c
> > +++ b/tests/intel/kms_big_fb.c
> > @@ -375,7 +375,7 @@ static void prep_fb(data_t *data)
> >  
> >  static void set_c8_lut(data_t *data)
> >  {
> > -	igt_pipe_t *pipe = &data->display.pipes[data->pipe];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(&data->display, data->pipe);
> >  	struct drm_color_lut *lut;
> >  	int i, lut_size = 256;
> >  
> > @@ -396,7 +396,7 @@ static void set_c8_lut(data_t *data)
> >  
> >  static void unset_lut(data_t *data)
> >  {
> > -	igt_pipe_t *pipe = &data->display.pipes[data->pipe];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(&data->display, data->pipe);
> >  
> >  	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_GAMMA_LUT, NULL, 0);
> >  }
> > @@ -517,7 +517,7 @@ static bool test_pipe(data_t *data)
> >  		 kmstest_pipe_name(data->pipe), igt_output_name(data->output));
> >  
> >  	if (data->format == DRM_FORMAT_C8 &&
> > -	    !igt_pipe_obj_has_prop(&data->display.pipes[data->pipe],
> > +	    !igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, data->pipe),
> >  				   IGT_CRTC_GAMMA_LUT))
> >  		return false;
> >  
> > diff --git a/tests/intel/kms_busy.c b/tests/intel/kms_busy.c
> > index b2eb418db1fa..53ed4b39813b 100644
> > --- a/tests/intel/kms_busy.c
> > +++ b/tests/intel/kms_busy.c
> > @@ -130,7 +130,7 @@ static void flip_to_fb(igt_display_t *dpy, int pipe,
> >  		igt_assert(gem_bo_busy(dpy->drm_fd, fb->gem_handle));
> >  		if (!modeset)
> >  			do_or_die(drmModePageFlip(dpy->drm_fd,
> > -						  dpy->pipes[pipe].crtc_id, fb->fb_id,
> > +						  igt_crtc_for_pipe(dpy, pipe)->crtc_id, fb->fb_id,
> >  						  DRM_MODE_PAGE_FLIP_EVENT, fb));
> >  		else {
> >  			igt_plane_set_fb(igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY), fb);
> > @@ -204,7 +204,7 @@ static void test_flip(igt_display_t *dpy, int pipe,
> >  		struct drm_event_vblank ev;
> >  
> >  		do_or_die(drmModePageFlip(dpy->drm_fd,
> > -					  dpy->pipes[pipe].crtc_id,
> > +					  igt_crtc_for_pipe(dpy, pipe)->crtc_id,
> >  					  fb[warmup[i]].fb_id,
> >  					  DRM_MODE_PAGE_FLIP_EVENT,
> >  					  &fb[warmup[i]]));
> > @@ -335,7 +335,7 @@ test_pageflip_modeset_hang(igt_display_t *dpy,
> >  			 .dependency = fb.gem_handle,
> >  			 .flags = IGT_SPIN_NO_PREEMPTION);
> >  
> > -	do_or_die(drmModePageFlip(dpy->drm_fd, dpy->pipes[pipe].crtc_id, fb.fb_id, DRM_MODE_PAGE_FLIP_EVENT, &fb));
> > +	do_or_die(drmModePageFlip(dpy->drm_fd, igt_crtc_for_pipe(dpy, pipe)->crtc_id, fb.fb_id, DRM_MODE_PAGE_FLIP_EVENT, &fb));
> >  
> >  	/* Kill crtc with hung fb */
> >  	igt_plane_set_fb(primary, NULL);
> > diff --git a/tests/intel/kms_cdclk.c b/tests/intel/kms_cdclk.c
> > index 8238b89582ee..3aeaba226cda 100644
> > --- a/tests/intel/kms_cdclk.c
> > +++ b/tests/intel/kms_cdclk.c
> > @@ -240,7 +240,7 @@ static void set_mode(data_t *data, int count, drmModeModeInfo *mode,
> >  	igt_plane_t *plane;
> >  
> >  	for (int i = 0; i < count; i++) {
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  
> >  		igt_output_override_mode(valid_outputs[i], &mode[i]);
> > diff --git a/tests/intel/kms_flip_scaled_crc.c b/tests/intel/kms_flip_scaled_crc.c
> > index f057b5070bcb..dd5967c91486 100644
> > --- a/tests/intel/kms_flip_scaled_crc.c
> > +++ b/tests/intel/kms_flip_scaled_crc.c
> > @@ -537,7 +537,7 @@ static void free_fbs(data_t *data)
> >  
> >  static void set_lut(data_t *data, enum pipe pipe)
> >  {
> > -	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(&data->display, pipe);
> >  	struct drm_color_lut *lut;
> >  	drmModeCrtc *drm_crtc;
> >  	int i, lut_size;
> > @@ -569,7 +569,7 @@ static void set_lut(data_t *data, enum pipe pipe)
> >  
> >  static void clear_lut(data_t *data, enum pipe pipe)
> >  {
> > -	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(&data->display, pipe);
> >  
> >  	igt_pipe_obj_set_prop_value(pipe_obj, IGT_CRTC_GAMMA_LUT, 0);
> >  }
> > diff --git a/tests/intel/kms_frontbuffer_tracking.c b/tests/intel/kms_frontbuffer_tracking.c
> > index c32f9c582e86..069f03a6c9f1 100644
> > --- a/tests/intel/kms_frontbuffer_tracking.c
> > +++ b/tests/intel/kms_frontbuffer_tracking.c
> > @@ -1110,21 +1110,24 @@ static void init_mode_params(struct modeset_params *params,
> >  	params->output = output;
> >  	params->mode = *mode;
> >  
> > -	params->primary.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_PRIMARY);
> > +	params->primary.plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&drm.display, pipe),
> > +							DRM_PLANE_TYPE_PRIMARY);
> >  	params->primary.fb = NULL;
> >  	params->primary.x = 0;
> >  	params->primary.y = 0;
> >  	params->primary.w = mode->hdisplay;
> >  	params->primary.h = mode->vdisplay;
> >  
> > -	params->cursor.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_CURSOR);
> > +	params->cursor.plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&drm.display, pipe),
> > +						       DRM_PLANE_TYPE_CURSOR);
> >  	params->cursor.fb = NULL;
> >  	params->cursor.x = 0;
> >  	params->cursor.y = 0;
> >  	params->cursor.w = 64;
> >  	params->cursor.h = 64;
> >  
> > -	params->sprite.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_OVERLAY);
> > +	params->sprite.plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&drm.display, pipe),
> > +						       DRM_PLANE_TYPE_OVERLAY);
> >  	igt_require(params->sprite.plane);
> >  	params->sprite.fb = NULL;
> >  	params->sprite.x = 0;
> > @@ -3112,7 +3115,8 @@ static void page_flip_for_params(struct modeset_params *params,
> >  
> >  	switch (type) {
> >  	case FLIP_PAGEFLIP:
> > -		rc = drmModePageFlip(drm.fd, drm.display.pipes[params->pipe].crtc_id,
> > +		rc = drmModePageFlip(drm.fd,
> > +				     igt_crtc_for_pipe(&drm.display, params->pipe)->crtc_id,
> >  				     params->primary.fb->fb_id,
> >  				     DRM_MODE_PAGE_FLIP_EVENT, NULL);
> >  		igt_assert_eq(rc, 0);
> > @@ -3724,7 +3728,9 @@ static void stridechange_subtest(const struct test_mode *t)
> >  	 * Try to set a new stride. with the page flip api. This is allowed
> >  	 * with the atomic page flip helper, but not with the legacy page flip.
> >  	 */
> > -	rc = drmModePageFlip(drm.fd, drm.display.pipes[params->pipe].crtc_id, new_fb->fb_id, 0, NULL);
> > +	rc = drmModePageFlip(drm.fd,
> > +			     igt_crtc_for_pipe(&drm.display, params->pipe)->crtc_id,
> > +			     new_fb->fb_id, 0, NULL);
> >  	igt_assert(rc == -EINVAL || rc == 0);
> >  	do_assertions(rc ? 0 : DONT_ASSERT_FBC_STATUS);
> >  }
> > diff --git a/tests/intel/kms_joiner_helper.c b/tests/intel/kms_joiner_helper.c
> > index d2a3117fec26..a59efcd1217a 100644
> > --- a/tests/intel/kms_joiner_helper.c
> > +++ b/tests/intel/kms_joiner_helper.c
> > @@ -105,7 +105,7 @@ void igt_set_all_master_pipes_for_platform(igt_display_t *display, uint32_t *mas
> >  
> >  	*master_pipes = 0;
> >  	for (pipe = PIPE_A; pipe < IGT_MAX_PIPES - 1; pipe++) {
> > -		if (display->pipes[pipe].valid && display->pipes[pipe + 1].valid) {
> > +		if (igt_crtc_for_pipe(display, pipe)->valid && igt_crtc_for_pipe(display, pipe + 1)->valid) {
> >  			*master_pipes |= BIT(pipe);
> >  			igt_info("Found master pipe %s\n", kmstest_pipe_name(pipe));
> >  		}
> > diff --git a/tests/intel/kms_pipe_stress.c b/tests/intel/kms_pipe_stress.c
> > index 282288f8e943..7d212a07cb75 100644
> > --- a/tests/intel/kms_pipe_stress.c
> > +++ b/tests/intel/kms_pipe_stress.c
> > @@ -588,8 +588,8 @@ static void stress_pipes(struct data *data, struct timespec *start,
> >  		if (!data->highest_mode[pipe])
> >  			continue;
> >  
> > -		igt_assert_f(data->display.pipes[pipe].n_planes < MAX_PLANES,
> > -			    "Currently we don't support more than %d planes!",
> > +		igt_assert_f(igt_crtc_for_pipe(&data->display, pipe)->n_planes < MAX_PLANES,
> > +			     "Currently we don't support more than %d planes!",
> >  			     MAX_PLANES);
> >  
> >  		ret = pipe_stress(data, output, pipe,
> > @@ -748,7 +748,8 @@ static void destroy_framebuffers(struct data *data)
> >  
> >  		for (j = 0; j < MAX_PLANES; j++) {
> >  			if (data->fb[i * MAX_PLANES + j].fb_id) {
> > -				igt_plane_set_fb(&data->display.pipes[i].planes[j], NULL);
> > +				igt_plane_set_fb(&igt_crtc_for_pipe(&data->display, i)->planes[j],
> > +						 NULL);
> >  				igt_remove_fb(data->display.drm_fd, &data->fb[i * MAX_PLANES + j]);
> >  				data->fb[i * MAX_PLANES + j].fb_id = 0;
> >  			}
> > @@ -812,7 +813,8 @@ static void prepare_test(struct data *data)
> >  			data->pipe_crc[i] = NULL;
> >  
> >  		if (data->num_planes[i] == -1)
> > -			data->num_planes[i] = data->display.pipes[i].n_planes;
> > +			data->num_planes[i] = igt_crtc_for_pipe(&data->display,
> > +								i)->n_planes;
> >  
> >  		igt_info("Max number of planes is %d for pipe %d\n",
> >  			 data->num_planes[i], i);
> > diff --git a/tests/intel/kms_pm_dc.c b/tests/intel/kms_pm_dc.c
> > index dbdd7b3e3eaa..47b2db268568 100644
> > --- a/tests/intel/kms_pm_dc.c
> > +++ b/tests/intel/kms_pm_dc.c
> > @@ -697,7 +697,9 @@ static void test_deep_pkgc_state(data_t *data)
> >  	igt_plane_set_fb(primary, &data->fb_rgb);
> >  	igt_display_commit(&data->display);
> >  	/* Wait for the vblank to sync the frame time */
> > -	igt_wait_for_vblank_count(data->drm_fd, data->display.pipes[pipe].crtc_offset, 1);
> > +	igt_wait_for_vblank_count(data->drm_fd,
> > +				  igt_crtc_for_pipe(&data->display, pipe)->crtc_offset,
> > +				  1);
> >  	pre_val = read_pkgc_counter(data->debugfs_root_fd);
> >  	/* Add a half-frame delay to ensure the flip occurs when the frame is active. */
> >  	usleep(delay * 0.5);
> > diff --git a/tests/intel/kms_sharpness_filter.c b/tests/intel/kms_sharpness_filter.c
> > index 41a42c60868a..3714153276b0 100644
> > --- a/tests/intel/kms_sharpness_filter.c
> > +++ b/tests/intel/kms_sharpness_filter.c
> > @@ -436,7 +436,7 @@ run_sharpness_filter_test(data_t *data, enum test_type type)
> >  
> >  			data->output = output;
> >  			data->pipe_id = pipe;
> > -			data->pipe = &display->pipes[data->pipe_id];
> > +			data->pipe = igt_crtc_for_pipe(display, data->pipe_id);
> >  			data->mode = igt_output_get_mode(data->output);
> >  
> >  			if (!has_sharpness_filter(data->pipe)) {
> > diff --git a/tests/intel/perf_pmu.c b/tests/intel/perf_pmu.c
> > index 8fd5ace40b07..ef95b50cd1ab 100644
> > --- a/tests/intel/perf_pmu.c
> > +++ b/tests/intel/perf_pmu.c
> > @@ -1066,7 +1066,7 @@ static void prepare_crtc(data_t *data, int fd, igt_output_t *output)
> >  	igt_display_commit(display);
> >  
> >  	igt_wait_for_vblank(fd,
> > -			display->pipes[data->pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, data->pipe)->crtc_offset);
> >  }
> >  
> >  static void cleanup_crtc(data_t *data, int fd, igt_output_t *output)
> > diff --git a/tests/intel/xe_pxp.c b/tests/intel/xe_pxp.c
> > index c6274bf616bf..351897e1ce68 100644
> > --- a/tests/intel/xe_pxp.c
> > +++ b/tests/intel/xe_pxp.c
> > @@ -845,7 +845,7 @@ static void compare_crcs(int fd, igt_display_t *display, igt_fb_t *ref_fb, igt_f
> >  
> >  	for_each_connected_output(display, output) {
> >  		mode = igt_output_get_mode(output);
> > -		pipe = &display->pipes[output->pending_pipe];
> > +		pipe = igt_crtc_for_pipe(display, output->pending_pipe);
> >  		pipe_crc = igt_pipe_crc_new(fd, pipe->pipe,
> >  					    IGT_PIPE_CRC_SOURCE_AUTO);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> > @@ -902,7 +902,7 @@ static void test_display_pxp_fb(int fd, igt_display_t *display)
> >  	/* Do a modeset on all outputs */
> >  	for_each_connected_output(display, output) {
> >  		mode = igt_output_get_mode(output);
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  		igt_require(igt_pipe_connector_valid(i, output));
> >  		igt_output_set_pipe(output, i);
> > @@ -959,7 +959,7 @@ static void test_display_black_pxp_fb(int fd, igt_display_t *display)
> >  	/* Do a modeset on all outputs */
> >  	for_each_connected_output(display, output) {
> >  		mode = igt_output_get_mode(output);
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  		igt_require(igt_pipe_connector_valid(i, output));
> >  		igt_output_set_pipe(output, i);
> > diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
> > index 6b2da0013b25..6762f172c4fa 100644
> > --- a/tests/kms_async_flips.c
> > +++ b/tests/kms_async_flips.c
> > @@ -299,7 +299,7 @@ static void test_init(data_t *data)
> >  
> >  	mode = igt_output_get_mode(data->output);
> >  
> > -	data->crtc_id = data->display.pipes[data->pipe].crtc_id;
> > +	data->crtc_id = igt_crtc_for_pipe(&data->display, data->pipe)->crtc_id;
> >  	data->refresh_rate = mode->vrefresh;
> >  
> >  	igt_output_set_pipe(data->output, data->pipe);
> > diff --git a/tests/kms_atomic.c b/tests/kms_atomic.c
> > index d25528e65fa5..01a058673913 100644
> > --- a/tests/kms_atomic.c
> > +++ b/tests/kms_atomic.c
> > @@ -488,7 +488,7 @@ plane_immutable_zpos(data_t *data, igt_output_t *output, enum pipe pipe, int n_p
> >  		int zpos;
> >  		igt_plane_t *temp;
> >  
> > -		temp = &data->display.pipes[pipe].planes[k];
> > +		temp = &igt_crtc_for_pipe(&data->display, pipe)->planes[k];
> >  
> >  		if (!igt_plane_has_prop(temp, IGT_PLANE_ZPOS))
> >  			continue;
> > @@ -1333,8 +1333,9 @@ static void atomic_setup(data_t *data, enum pipe pipe, igt_output_t *output)
> >  	igt_display_reset(&data->display);
> >  	igt_output_set_pipe(output, pipe);
> >  
> > -	data->primary = igt_pipe_get_plane_type(&data->display.pipes[pipe], DRM_PLANE_TYPE_PRIMARY);
> > -	data->pipe = &data->display.pipes[pipe];
> > +	data->primary = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, pipe),
> > +						DRM_PLANE_TYPE_PRIMARY);
> > +	data->pipe = igt_crtc_for_pipe(&data->display, pipe);
> >  	mode = igt_output_get_mode(output);
> >  
> >  	igt_create_pattern_fb(data->drm_fd,
> > @@ -1418,7 +1419,8 @@ int igt_main_args("e", NULL, help_str, opt_handler, NULL)
> >  	igt_subtest_with_dynamic("plane-overlay-legacy") {
> >  		for_each_pipe_with_single_output(&data.display, pipe, output) {
> >  			igt_plane_t *overlay =
> > -				igt_pipe_get_plane_type(&data.display.pipes[pipe], DRM_PLANE_TYPE_OVERLAY);
> > +				igt_pipe_get_plane_type(igt_crtc_for_pipe(&data.display, pipe),
> > +							DRM_PLANE_TYPE_OVERLAY);
> >  			uint32_t format = plane_get_igt_format(overlay);
> >  
> >  			if (!pipe_output_combo_valid(&data.display, pipe, output))
> > @@ -1456,7 +1458,8 @@ int igt_main_args("e", NULL, help_str, opt_handler, NULL)
> >  	igt_subtest_with_dynamic("plane-primary-overlay-mutable-zpos") {
> >  		for_each_pipe_with_single_output(&data.display, pipe, output) {
> >  			igt_plane_t *overlay =
> > -				igt_pipe_get_plane_type(&data.display.pipes[pipe], DRM_PLANE_TYPE_OVERLAY);
> > +				igt_pipe_get_plane_type(igt_crtc_for_pipe(&data.display, pipe),
> > +							DRM_PLANE_TYPE_OVERLAY);
> >  
> >  			if (!pipe_output_combo_valid(&data.display, pipe, output))
> >  				continue;
> > @@ -1483,7 +1486,7 @@ int igt_main_args("e", NULL, help_str, opt_handler, NULL)
> >  		     "only higher zpos planes cover the lower zpos ones.");
> >  	igt_subtest_with_dynamic("plane-immutable-zpos") {
> >  		for_each_pipe_with_single_output(&data.display, pipe, output) {
> > -			int n_planes = data.display.pipes[pipe].n_planes;
> > +			int n_planes = igt_crtc_for_pipe(&data.display, pipe)->n_planes;
> >  
> >  			if (!pipe_output_combo_valid(&data.display, pipe, output))
> >  				continue;
> > @@ -1527,7 +1530,8 @@ int igt_main_args("e", NULL, help_str, opt_handler, NULL)
> >  	igt_subtest_with_dynamic("plane-cursor-legacy") {
> >  		for_each_pipe_with_single_output(&data.display, pipe, output) {
> >  			igt_plane_t *cursor =
> > -				igt_pipe_get_plane_type(&data.display.pipes[pipe], DRM_PLANE_TYPE_CURSOR);
> > +				igt_pipe_get_plane_type(igt_crtc_for_pipe(&data.display, pipe),
> > +							DRM_PLANE_TYPE_CURSOR);
> >  
> >  			if (!pipe_output_combo_valid(&data.display, pipe, output))
> >  				continue;
> > diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
> > index 18f79136c30f..ab04b9f711b7 100644
> > --- a/tests/kms_atomic_transition.c
> > +++ b/tests/kms_atomic_transition.c
> > @@ -163,14 +163,14 @@ run_primary_test(data_t *data, enum pipe pipe, igt_output_t *output)
> >  
> >  		if (!(i & 1))
> >  			igt_wait_for_vblank(data->drm_fd,
> > -					data->display.pipes[pipe].crtc_offset);
> > +					igt_crtc_for_pipe(&data->display, pipe)->crtc_offset);
> >  
> >  		igt_plane_set_fb(primary, (i & 1) ? fb : NULL);
> >  		igt_display_commit2(&data->display, COMMIT_ATOMIC);
> >  
> >  		if (i & 1)
> >  			igt_wait_for_vblank(data->drm_fd,
> > -					data->display.pipes[pipe].crtc_offset);
> > +					igt_crtc_for_pipe(&data->display, pipe)->crtc_offset);
> >  
> >  		igt_plane_set_fb(primary, (i & 1) ? NULL : fb);
> >  	}
> > @@ -327,7 +327,7 @@ static void setup_parms(data_t *data, enum pipe pipe,
> >  	uint64_t cursor_width, cursor_height;
> >  	unsigned sprite_width, sprite_height, prev_w, prev_h;
> >  	bool max_sprite_width, max_sprite_height, alpha = true;
> > -	uint32_t n_planes = data->display.pipes[pipe].n_planes;
> > +	uint32_t n_planes = igt_crtc_for_pipe(&data->display, pipe)->n_planes;
> >  	uint32_t n_overlays = 0, overlays[n_planes];
> >  	igt_plane_t *plane;
> >  	uint32_t iter_mask = 3;
> > @@ -438,7 +438,8 @@ static void setup_parms(data_t *data, enum pipe pipe,
> >  			igt_assert_f(n_planes >= 3, "No planes left to proceed with!");
> >  			if (n_overlays > 0) {
> >  				uint32_t plane_to_remove = hars_petruska_f54_1_random_unsafe_max(n_overlays);
> > -				removed_plane = &data->display.pipes[pipe].planes[overlays[plane_to_remove]];
> > +				removed_plane = &igt_crtc_for_pipe(&data->display,
> > +								   pipe)->planes[overlays[plane_to_remove]];
> >  				igt_plane_set_fb(removed_plane, NULL);
> >  				while (plane_to_remove < (n_overlays - 1)) {
> >  					overlays[plane_to_remove] = overlays[plane_to_remove + 1];
> > @@ -479,7 +480,7 @@ static void prepare_fencing(data_t *data, enum pipe pipe)
> >  
> >  	igt_require_sw_sync();
> >  
> > -	n_planes = data->display.pipes[pipe].n_planes;
> > +	n_planes = igt_crtc_for_pipe(&data->display, pipe)->n_planes;
> >  	timeline = calloc(n_planes, sizeof(*timeline));
> >  	igt_assert_f(timeline != NULL, "Failed to allocate memory for timelines\n");
> >  	thread = calloc(n_planes, sizeof(*thread));
> > @@ -510,7 +511,7 @@ static void unprepare_fencing(data_t *data, enum pipe pipe)
> >  static void atomic_commit(data_t *data_v, enum pipe pipe, unsigned int flags, void *data, bool fencing)
> >  {
> >  	if (fencing)
> > -		igt_pipe_request_out_fence(&data_v->display.pipes[pipe]);
> > +		igt_pipe_request_out_fence(igt_crtc_for_pipe(&data_v->display, pipe));
> >  
> >  	igt_display_commit_atomic(&data_v->display, flags, data);
> >  }
> > @@ -528,7 +529,7 @@ static int fd_completed(int fd)
> >  static void wait_for_transition(data_t *data, enum pipe pipe, bool nonblocking, bool fencing)
> >  {
> >  	if (fencing) {
> > -		int fence_fd = data->display.pipes[pipe].out_fence_fd;
> > +		int fence_fd = igt_crtc_for_pipe(&data->display, pipe)->out_fence_fd;
> >  
> >  		if (!nonblocking)
> >  			igt_assert(fd_completed(fence_fd));
> > @@ -557,7 +558,7 @@ run_transition_test(data_t *data, enum pipe pipe, igt_output_t *output,
> >  {
> >  	drmModeModeInfo *mode, override_mode;
> >  	igt_plane_t *plane;
> > -	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(&data->display, pipe);
> >  	uint32_t iter_max, i;
> >  	struct plane_parms parms[pipe_obj->n_planes];
> >  	unsigned flags = 0;
> > @@ -804,8 +805,8 @@ static unsigned set_combinations(data_t *data, unsigned mask, struct igt_fb *fb)
> >  	unset_output_pipe(&data->display);
> >  
> >  	for_each_pipe(&data->display, pipe) {
> > -		igt_plane_t *plane = igt_pipe_get_plane_type(&data->display.pipes[pipe],
> > -			DRM_PLANE_TYPE_PRIMARY);
> > +		igt_plane_t *plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, pipe),
> > +							     DRM_PLANE_TYPE_PRIMARY);
> >  
> >  		enum pipe old_pipe = plane->ref->pipe->pipe;
> >  
> > @@ -814,8 +815,8 @@ static unsigned set_combinations(data_t *data, unsigned mask, struct igt_fb *fb)
> >  		 * currently is holding the plane
> >  		 */
> >  		if (old_pipe != pipe) {
> > -			igt_plane_t *old_plane = igt_pipe_get_plane_type(&data->display.pipes[old_pipe],
> > -				DRM_PLANE_TYPE_PRIMARY);
> > +			igt_plane_t *old_plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, old_pipe),
> > +									 DRM_PLANE_TYPE_PRIMARY);
> >  
> >  			igt_plane_set_fb(old_plane, NULL);
> >  			igt_display_commit2(&data->display, COMMIT_ATOMIC);
> > @@ -823,8 +824,8 @@ static unsigned set_combinations(data_t *data, unsigned mask, struct igt_fb *fb)
> >  	}
> >  
> >  	for_each_pipe(&data->display, pipe) {
> > -		igt_plane_t *plane = igt_pipe_get_plane_type(&data->display.pipes[pipe],
> > -			DRM_PLANE_TYPE_PRIMARY);
> > +		igt_plane_t *plane = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->display, pipe),
> > +							     DRM_PLANE_TYPE_PRIMARY);
> >  		drmModeModeInfo *mode = NULL;
> >  
> >  		if (!(mask & (1 << pipe))) {
> > @@ -918,7 +919,7 @@ retry:
> >  				    DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, .5, .5, .5, &data->fbs[1]);
> >  
> >  	for_each_pipe(&data->display, i) {
> > -		igt_pipe_t *pipe = &data->display.pipes[i];
> > +		igt_pipe_t *pipe = igt_crtc_for_pipe(&data->display, i);
> >  		igt_plane_t *plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  		drmModeModeInfo *mode = NULL;
> >  
> > @@ -953,7 +954,7 @@ retry:
> >  			igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
> >  
> >  			if (fencing)
> > -				igt_pipe_request_out_fence(&data->display.pipes[i]);
> > +				igt_pipe_request_out_fence(igt_crtc_for_pipe(&data->display, i));
> >  		} else {
> >  			igt_plane_set_fb(plane, NULL);
> >  		}
> > diff --git a/tests/kms_bw.c b/tests/kms_bw.c
> > index 9100dd329e30..a8a094f4d1f1 100644
> > --- a/tests/kms_bw.c
> > +++ b/tests/kms_bw.c
> > @@ -125,7 +125,8 @@ static void test_init(data_t *data, bool physical)
> >  
> >  	for_each_pipe(display, i) {
> >  		data->pipe_id[i] = i;
> > -		data->pipe[i] = &data->display.pipes[data->pipe_id[i]];
> > +		data->pipe[i] = igt_crtc_for_pipe(&data->display,
> > +						  data->pipe_id[i]);
> >  		data->primary[i] = igt_pipe_get_plane_type(
> >  			data->pipe[i], DRM_PLANE_TYPE_PRIMARY);
> >  		data->pipe_crc[i] =
> > diff --git a/tests/kms_color.c b/tests/kms_color.c
> > index b3f3a34a559c..d7c713a775b0 100644
> > --- a/tests/kms_color.c
> > +++ b/tests/kms_color.c
> > @@ -724,16 +724,16 @@ prep_pipe(data_t *data, enum pipe p)
> >  {
> >  	igt_require_pipe(&data->display, p);
> >  
> > -	if (igt_pipe_obj_has_prop(&data->display.pipes[p], IGT_CRTC_DEGAMMA_LUT_SIZE)) {
> > +	if (igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, p), IGT_CRTC_DEGAMMA_LUT_SIZE)) {
> >  		data->degamma_lut_size =
> > -			igt_pipe_obj_get_prop(&data->display.pipes[p],
> > +			igt_pipe_obj_get_prop(igt_crtc_for_pipe(&data->display, p),
> >  					      IGT_CRTC_DEGAMMA_LUT_SIZE);
> >  		igt_assert_lt(0, data->degamma_lut_size);
> >  	}
> >  
> > -	if (igt_pipe_obj_has_prop(&data->display.pipes[p], IGT_CRTC_GAMMA_LUT_SIZE)) {
> > +	if (igt_pipe_obj_has_prop(igt_crtc_for_pipe(&data->display, p), IGT_CRTC_GAMMA_LUT_SIZE)) {
> >  		data->gamma_lut_size =
> > -			igt_pipe_obj_get_prop(&data->display.pipes[p],
> > +			igt_pipe_obj_get_prop(igt_crtc_for_pipe(&data->display, p),
> >  					      IGT_CRTC_GAMMA_LUT_SIZE);
> >  		igt_assert_lt(0, data->gamma_lut_size);
> >  	}
> > @@ -746,7 +746,7 @@ static void test_setup(data_t *data, enum pipe p)
> >  	prep_pipe(data, p);
> >  	igt_require_pipe_crc(data->drm_fd);
> >  
> > -	pipe = &data->display.pipes[p];
> > +	pipe = igt_crtc_for_pipe(&data->display, p);
> >  	igt_require(pipe->n_planes >= 0);
> >  
> >  	data->primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> > diff --git a/tests/kms_color_helper.c b/tests/kms_color_helper.c
> > index 143dff43e76b..3ca56138e97d 100644
> > --- a/tests/kms_color_helper.c
> > +++ b/tests/kms_color_helper.c
> > @@ -319,7 +319,7 @@ invalid_lut_sizes(data_t *data, enum pipe p,
> >  		  enum igt_atomic_crtc_properties prop, int size)
> >  {
> >  	igt_display_t *display = &data->display;
> > -	igt_pipe_t *pipe = &display->pipes[p];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(display, p);
> >  	struct drm_color_lut *lut;
> >  	size_t lut_size = size * sizeof(lut[0]);
> >  
> > @@ -362,7 +362,7 @@ invalid_degamma_lut_sizes(data_t *data, enum pipe p)
> >  void invalid_ctm_matrix_sizes(data_t *data, enum pipe p)
> >  {
> >  	igt_display_t *display = &data->display;
> > -	igt_pipe_t *pipe = &display->pipes[p];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(display, p);
> >  	void *ptr;
> >  
> >  	igt_require(igt_pipe_obj_has_prop(pipe, IGT_CRTC_CTM));
> > diff --git a/tests/kms_concurrent.c b/tests/kms_concurrent.c
> > index bb8cbe703622..b3cc2cec4931 100644
> > --- a/tests/kms_concurrent.c
> > +++ b/tests/kms_concurrent.c
> > @@ -306,7 +306,7 @@ test_resolution_with_output(data_t *data, enum pipe pipe, int max_planes, igt_ou
> >  static void
> >  run_test(data_t *data, enum pipe pipe, igt_output_t *output)
> >  {
> > -	int n_planes = data->display.pipes[pipe].n_planes;
> > +	int n_planes = igt_crtc_for_pipe(&data->display, pipe)->n_planes;
> >  	igt_display_reset(&data->display);
> >  
> >  	if (!opt.user_seed)
> > @@ -346,7 +346,7 @@ run_tests_for_pipe(data_t *data)
> >  			if (!intel_pipe_output_combo_valid(&data->display))
> >  				continue;
> >  
> > -			igt_require(data->display.pipes[pipe].n_planes > 0);
> > +			igt_require(igt_crtc_for_pipe(&data->display, pipe)->n_planes > 0);
> >  			igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), igt_output_name(output))
> >  				run_test(data, pipe, output);
> >  		}
> > diff --git a/tests/kms_cursor_crc.c b/tests/kms_cursor_crc.c
> > index 7ca2ca82c0bd..fe5a63eb0a64 100644
> > --- a/tests/kms_cursor_crc.c
> > +++ b/tests/kms_cursor_crc.c
> > @@ -215,7 +215,7 @@ static void cursor_disable(data_t *data)
> >  
> >  	/* do this wait here so it will not need to be added everywhere */
> >  	igt_wait_for_vblank_count(data->drm_fd,
> > -				  data->display.pipes[data->pipe].crtc_offset,
> > +				  igt_crtc_for_pipe(&data->display, data->pipe)->crtc_offset,
> >  				  data->vblank_wait_count);
> >  }
> >  
> > @@ -301,7 +301,7 @@ static void do_single_test(data_t *data, int x, int y, bool hw_test,
> >  
> >  		/* Extra vblank wait is because nonblocking cursor ioctl */
> >  		igt_wait_for_vblank_count(data->drm_fd,
> > -					  display->pipes[data->pipe].crtc_offset,
> > +					  igt_crtc_for_pipe(display, data->pipe)->crtc_offset,
> >  					  data->vblank_wait_count);
> >  
> >  		igt_pipe_crc_get_current(data->drm_fd, pipe_crc, hwcrc);
> > @@ -351,7 +351,7 @@ static void do_single_test(data_t *data, int x, int y, bool hw_test,
> >  		 */
> >  		if (is_amdgpu_device(data->drm_fd))
> >  			igt_wait_for_vblank_count(data->drm_fd,
> > -				display->pipes[data->pipe].crtc_offset,
> > +				igt_crtc_for_pipe(display, data->pipe)->crtc_offset,
> >  				data->vblank_wait_count);
> >  
> >  		igt_pipe_crc_get_current(data->drm_fd, pipe_crc, &crc);
> > @@ -736,7 +736,7 @@ static void timed_cursor_changes(data_t *data, void (changefunc)(data_t *, enum
> >  
> >  	/* Extra vblank wait is because nonblocking cursor ioctl */
> >  	igt_wait_for_vblank_count(data->drm_fd,
> > -				  data->display.pipes[data->pipe].crtc_offset,
> > +				  igt_crtc_for_pipe(&data->display, data->pipe)->crtc_offset,
> >  				  data->vblank_wait_count);
> >  
> >  	igt_pipe_crc_get_current(data->drm_fd, data->pipe_crc, &crc1);
> > diff --git a/tests/kms_cursor_edge_walk.c b/tests/kms_cursor_edge_walk.c
> > index 27f861378763..e84dfeb9aefb 100644
> > --- a/tests/kms_cursor_edge_walk.c
> > +++ b/tests/kms_cursor_edge_walk.c
> > @@ -127,7 +127,7 @@ static void cursor_move(data_t *data, int x, int y, int i)
> >  		   (IS_CHERRYVIEW(data->devid) && data->pipe == PIPE_C &&
> >  		    x < 0 && x > -data->curw));
> >  	igt_wait_for_vblank(data->drm_fd,
> > -			display->pipes[data->pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, data->pipe)->crtc_offset);
> >  }
> >  
> >  #define XSTEP 8
> > diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
> > index ec35992bac6a..566d920124ad 100644
> > --- a/tests/kms_cursor_legacy.c
> > +++ b/tests/kms_cursor_legacy.c
> > @@ -289,13 +289,15 @@ static void stress(igt_display_t *display,
> >  	if (pipe < 0) {
> >  		num_crtcs = igt_display_n_crtcs(display);
> >  		for_each_pipe(display, n) {
> > -			arg.crtc_id = crtc_id[n] = display->pipes[n].crtc_id;
> > +			arg.crtc_id = crtc_id[n] = igt_crtc_for_pipe(display,
> > +								     n)->crtc_id;
> >  			do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg);
> >  		}
> >  	} else {
> >  		num_crtcs = 1;
> > -		if(display->pipes[pipe].valid) {
> > -			arg.crtc_id = crtc_id[0] = display->pipes[pipe].crtc_id;
> > +		if(igt_crtc_for_pipe(display, pipe)->valid) {
> > +			arg.crtc_id = crtc_id[0] = igt_crtc_for_pipe(display,
> > +								     pipe)->crtc_id;
> >  			do_ioctl(display->drm_fd, DRM_IOCTL_MODE_CURSOR, &arg);
> >  		}
> >  	}
> > @@ -410,7 +412,7 @@ static void set_cursor_hotspot(igt_plane_t *cursor, int  hot_x, int hot_y)
> >  static void populate_cursor_args(igt_display_t *display, enum pipe pipe,
> >  				 struct drm_mode_cursor *arg, struct igt_fb *fb)
> >  {
> > -	arg->crtc_id = display->pipes[pipe].crtc_id;
> > +	arg->crtc_id = igt_crtc_for_pipe(display, pipe)->crtc_id;
> >  	arg->flags = DRM_MODE_CURSOR_MOVE;
> >  	arg->x = 128;
> >  	arg->y = 128;
> > @@ -468,7 +470,7 @@ find_connected_pipe(igt_display_t *display, bool second, igt_output_t **output)
> >  
> >  static void flip_nonblocking(igt_display_t *display, enum pipe pipe_id, bool atomic, struct igt_fb *fb, void *data)
> >  {
> > -	igt_pipe_t *pipe = &display->pipes[pipe_id];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(display, pipe_id);
> >  	igt_plane_t *primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  	int ret;
> >  
> > @@ -532,7 +534,7 @@ static void transition_nonblocking(igt_display_t *display, enum pipe pipe_id,
> >  				   struct igt_fb *prim_fb, struct igt_fb *argb_fb,
> >  				   bool hide_sprite)
> >  {
> > -	igt_pipe_t *pipe = &display->pipes[pipe_id];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(display, pipe_id);
> >  	igt_plane_t *primary = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  	igt_plane_t *sprite = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_OVERLAY);
> >  
> > @@ -600,8 +602,8 @@ static void prepare_flip_test(igt_display_t *display,
> >  
> >  	if (mode == flip_test_atomic_transitions ||
> >  	    mode == flip_test_atomic_transitions_varying_size) {
> > -		igt_require(display->pipes[flip_pipe].n_planes > 1 &&
> > -		            display->pipes[flip_pipe].planes[1].type != DRM_PLANE_TYPE_CURSOR);
> > +		igt_require(igt_crtc_for_pipe(display, flip_pipe)->n_planes > 1 &&
> > +		            igt_crtc_for_pipe(display, flip_pipe)->planes[1].type != DRM_PLANE_TYPE_CURSOR);
> >  
> >  		igt_create_color_pattern_fb(display->drm_fd, prim_fb->width, prim_fb->height,
> >  					    DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_LINEAR, .1, .1, .1, argb_fb);
> > @@ -633,8 +635,8 @@ static void flip(igt_display_t *display,
> >  
> >  	if (mode == flip_test_atomic_transitions ||
> >  		mode == flip_test_atomic_transitions_varying_size) {
> > -		igt_require(igt_pipe_get_plane_type(&display->pipes[flip_pipe],
> > -					DRM_PLANE_TYPE_OVERLAY));
> > +		igt_require(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, flip_pipe),
> > +						    DRM_PLANE_TYPE_OVERLAY));
> >  	}
> >  
> >  	set_fb_on_crtc(display, flip_pipe, output, &fb_info);
> > @@ -1289,11 +1291,11 @@ static void two_screens_flip_vs_cursor(igt_display_t *display, int nloops, bool
> >  			continue;
> >  		}
> >  
> > -		if (vbl.crtc_id == display->pipes[pipe].crtc_id) {
> > +		if (vbl.crtc_id == igt_crtc_for_pipe(display, pipe)->crtc_id) {
> >  			vblank_start = kmstest_get_vblank(display->drm_fd, pipe, DRM_VBLANK_NEXTONMISS);
> >  			flip_nonblocking(display, pipe, atomic, &fb_info, (void*)(ptrdiff_t)vblank_start);
> >  		} else {
> > -			igt_assert(vbl.crtc_id == display->pipes[pipe2].crtc_id);
> > +			igt_assert(vbl.crtc_id == igt_crtc_for_pipe(display, pipe2)->crtc_id);
> >  
> >  			nloops--;
> >  
> > diff --git a/tests/kms_display_modes.c b/tests/kms_display_modes.c
> > index b8b1fa8e555c..a5588904b0d3 100644
> > --- a/tests/kms_display_modes.c
> > +++ b/tests/kms_display_modes.c
> > @@ -103,8 +103,10 @@ static void run_extendedmode_basic(data_t *data,
> >  	igt_create_color_fb(data->drm_fd, mode[1]->hdisplay, mode[1]->vdisplay,
> >  			    DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, 0, 0, 1, &fbs[1]);
> >  
> > -	plane[0] = igt_pipe_get_plane_type(&display->pipes[pipe1], DRM_PLANE_TYPE_PRIMARY);
> > -	plane[1] = igt_pipe_get_plane_type(&display->pipes[pipe2], DRM_PLANE_TYPE_PRIMARY);
> > +	plane[0] = igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe1),
> > +					   DRM_PLANE_TYPE_PRIMARY);
> > +	plane[1] = igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe2),
> > +					   DRM_PLANE_TYPE_PRIMARY);
> >  
> >  	igt_plane_set_fb(plane[0], &fbs[0]);
> >  	igt_fb_set_size(&fbs[0], plane[0], mode[0]->hdisplay, mode[0]->vdisplay);
> > @@ -157,10 +159,12 @@ static void run_extendedmode_basic(data_t *data,
> >  	igt_output_set_pipe(output1, PIPE_NONE);
> >  	igt_output_set_pipe(output2, PIPE_NONE);
> >  
> > -	igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe1],
> > -			  DRM_PLANE_TYPE_PRIMARY), NULL);
> > -	igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe2],
> > -			  DRM_PLANE_TYPE_PRIMARY), NULL);
> > +	igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe1),
> > +						 DRM_PLANE_TYPE_PRIMARY),
> > +			 NULL);
> > +	igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe2),
> > +						 DRM_PLANE_TYPE_PRIMARY),
> > +			 NULL);
> >  	igt_assert_f(igt_fit_modes_in_bw(display), "Unable to fit modes in bw\n");
> >  	igt_display_commit2(display, COMMIT_ATOMIC);
> >  
> > diff --git a/tests/kms_dither.c b/tests/kms_dither.c
> > index a4cb004e8e24..102bab1debd1 100644
> > --- a/tests/kms_dither.c
> > +++ b/tests/kms_dither.c
> > @@ -74,7 +74,7 @@ typedef struct {
> >  /* Prepare test data. */
> >  static void prepare_test(data_t *data, igt_output_t *output, enum pipe p)
> >  {
> > -	igt_pipe_t *pipe = &data->display.pipes[p];
> > +	igt_pipe_t *pipe = igt_crtc_for_pipe(&data->display, p);
> >  
> >  	igt_assert(pipe);
> >  
> > diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c
> > index ab0ec47cbfad..45840945d658 100644
> > --- a/tests/kms_hdr.c
> > +++ b/tests/kms_hdr.c
> > @@ -213,7 +213,7 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> >  	igt_display_t *display = &data->display;
> >  
> >  	data->pipe_id = pipe;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  	igt_assert(data->pipe);
> >  
> >  	igt_display_reset(display);
> > diff --git a/tests/kms_invalid_mode.c b/tests/kms_invalid_mode.c
> > index 78c73e72ffa3..2b385d4931f2 100644
> > --- a/tests/kms_invalid_mode.c
> > +++ b/tests/kms_invalid_mode.c
> > @@ -277,7 +277,7 @@ test_output(data_t *data)
> >  
> >  	kmstest_unset_all_crtcs(data->drm_fd, data->res);
> >  
> > -	crtc_id = data->display.pipes[data->pipe].crtc_id;
> > +	crtc_id = igt_crtc_for_pipe(&data->display, data->pipe)->crtc_id;
> >  
> >  	ret = drmModeSetCrtc(data->drm_fd, crtc_id,
> >  			     fb.fb_id, 0, 0,
> > diff --git a/tests/kms_lease.c b/tests/kms_lease.c
> > index 495b9aebba53..df16fc7af78e 100644
> > --- a/tests/kms_lease.c
> > +++ b/tests/kms_lease.c
> > @@ -153,7 +153,7 @@ static int prepare_crtc(data_t *data, bool is_master)
> >  	lease_t *lease = is_master ? &data->master : &data->lease;
> >  	igt_display_t *display = &lease->display;
> >  	igt_output_t *output = connector_id_to_output(display, data->connector_id);
> > -	enum pipe pipe = display->pipes[data->pipe].pipe;
> > +	enum pipe pipe = igt_crtc_for_pipe(display, data->pipe)->pipe;
> >  	igt_plane_t *primary;
> >  	int ret;
> >  
> > @@ -179,7 +179,8 @@ static int prepare_crtc(data_t *data, bool is_master)
> >  	if (ret)
> >  		return ret;
> >  
> > -	igt_wait_for_vblank(lease->fd, display->pipes[pipe].crtc_offset);
> > +	igt_wait_for_vblank(lease->fd,
> > +			    igt_crtc_for_pipe(display, pipe)->crtc_offset);
> >  
> >  	lease->output = output;
> >  	lease->mode = mode;
> > @@ -377,7 +378,7 @@ static void page_flip_implicit_plane(data_t *data)
> >  	display = &data->master.display;
> >  
> >  	igt_wait_for_vblank(data->master.fd,
> > -			display->pipes[pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, pipe)->crtc_offset);
> >  
> >  	do_or_die(drmModePageFlip(data->lease.fd, data->crtc_id,
> >  			      data->master.primary_fb.fb_id,
> > @@ -388,7 +389,7 @@ static void page_flip_implicit_plane(data_t *data)
> >  	do_or_die(create_lease(data->master.fd, &mcl, &data->lease.fd));
> >  
> >  	igt_wait_for_vblank(data->master.fd,
> > -			display->pipes[pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, pipe)->crtc_offset);
> >  
> >  	igt_assert_eq(drmModePageFlip(data->lease.fd, data->crtc_id,
> >  				      data->master.primary_fb.fb_id,
> > @@ -714,8 +715,9 @@ static void lease_unleased_crtc(data_t *data)
> >  	for_each_pipe(&data->master.display, p) {
> >  		if (bad_crtc_id != 0)
> >  			break;
> > -		if (data->master.display.pipes[p].crtc_id != data->crtc_id)
> > -			bad_crtc_id = data->master.display.pipes[p].crtc_id;
> > +		if (igt_crtc_for_pipe(&data->master.display, p)->crtc_id != data->crtc_id)
> > +			bad_crtc_id = igt_crtc_for_pipe(&data->master.display,
> > +							p)->crtc_id;
> >  	}
> >  
> >  	/* Give up if there isn't another crtc */
> > @@ -895,11 +897,11 @@ static void invalid_create_leases(data_t *data)
> >  	igt_assert_eq(create_lease(data->master.fd, &mcl, NULL), -EINVAL);
> >  
> >  	/* no connector, non-universal_plane */
> > -	object_ids[0] = data->master.display.pipes[0].crtc_id;
> > +	object_ids[0] = igt_crtc_for_pipe(&data->master.display, 0)->crtc_id;
> >  	igt_assert_eq(create_lease(data->master.fd, &mcl, NULL), -EINVAL);
> >  
> >  	/* sanity check */
> > -	object_ids[0] = data->master.display.pipes[0].crtc_id;
> > +	object_ids[0] = igt_crtc_for_pipe(&data->master.display, 0)->crtc_id;
> >  	object_ids[1] = data->master.display.outputs[0].id;
> >  	mcl.object_count = 2;
> >  	igt_assert_eq(create_lease(data->master.fd, &mcl, NULL), 0);
> > @@ -910,7 +912,7 @@ static void invalid_create_leases(data_t *data)
> >  	igt_assert_eq(create_lease(data->master.fd, &mcl, NULL), -EINVAL);
> >  
> >  	/* sanity check */
> > -	object_ids[2] = igt_pipe_get_plane_type(&data->master.display.pipes[0],
> > +	object_ids[2] = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->master.display, 0),
> >  						DRM_PLANE_TYPE_PRIMARY)->drm_plane->plane_id;
> >  	mcl.object_count = 3;
> >  	igt_assert_eq(create_lease(data->master.fd, &mcl, NULL), 0);
> > @@ -1075,9 +1077,9 @@ static int _create_simple_lease(int master_fd, data_t *data, int expected_ret)
> >  	uint32_t object_ids[3];
> >  	struct drm_mode_create_lease mcl;
> >  
> > -	object_ids[0] = data->master.display.pipes[0].crtc_id;
> > +	object_ids[0] = igt_crtc_for_pipe(&data->master.display, 0)->crtc_id;
> >  	object_ids[1] = data->master.display.outputs[0].id;
> > -	object_ids[2] = igt_pipe_get_plane_type(&data->master.display.pipes[0],
> > +	object_ids[2] = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->master.display, 0),
> >  						DRM_PLANE_TYPE_PRIMARY)->drm_plane->plane_id;
> >  	mcl.object_ids = (uint64_t) (uintptr_t) object_ids;
> >  	mcl.object_count = 3;
> > @@ -1165,12 +1167,12 @@ static void implicit_plane_lease(data_t *data)
> >  	struct drm_mode_create_lease mcl;
> >  	struct drm_mode_get_lease mgl;
> >  	int ret;
> > -	uint32_t cursor_id = igt_pipe_get_plane_type(&data->master.display.pipes[0],
> > +	uint32_t cursor_id = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->master.display, 0),
> >  						     DRM_PLANE_TYPE_CURSOR)->drm_plane->plane_id;
> >  
> > -	object_ids[0] = data->master.display.pipes[0].crtc_id;
> > +	object_ids[0] = igt_crtc_for_pipe(&data->master.display, 0)->crtc_id;
> >  	object_ids[1] = data->master.display.outputs[0].id;
> > -	object_ids[2] = igt_pipe_get_plane_type(&data->master.display.pipes[0],
> > +	object_ids[2] = igt_pipe_get_plane_type(igt_crtc_for_pipe(&data->master.display, 0),
> >  						DRM_PLANE_TYPE_PRIMARY)->drm_plane->plane_id;
> >  	mcl.object_ids = (uint64_t) (uintptr_t) object_ids;
> >  	mcl.object_count = 3;
> > @@ -1298,11 +1300,12 @@ int igt_main()
> >  
> >  					igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(data.pipe),
> >  						      igt_output_name(output)) {
> > -						data.crtc_id = display->pipes[data.pipe].crtc_id;
> > +						data.crtc_id = igt_crtc_for_pipe(display,
> > +										 data.pipe)->crtc_id;
> >  						data.connector_id = output->id;
> >  						data.plane_id =
> > -							igt_pipe_get_plane_type(&data.master.display.pipes[data.pipe],
> > -									DRM_PLANE_TYPE_PRIMARY)->drm_plane->plane_id;
> > +							igt_pipe_get_plane_type(igt_crtc_for_pipe(&data.master.display, data.pipe),
> > +										DRM_PLANE_TYPE_PRIMARY)->drm_plane->plane_id;
> >  						f->func(&data);
> >  					}
> >  					terminate_lease(data.lease.fd);
> > diff --git a/tests/kms_multipipe_modeset.c b/tests/kms_multipipe_modeset.c
> > index 28c71fdec00a..3a1944b48874 100644
> > --- a/tests/kms_multipipe_modeset.c
> > +++ b/tests/kms_multipipe_modeset.c
> > @@ -75,7 +75,7 @@ static void run_test(data_t *data, int valid_outputs)
> >  
> >  	/* Collect reference CRC by Committing individually on all outputs*/
> >  	for_each_connected_output(display, output) {
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  
> >  		mode = NULL;
> > @@ -100,7 +100,7 @@ static void run_test(data_t *data, int valid_outputs)
> >  	i = 0;
> >  	/* Simultaneously commit on all outputs */
> >  	for_each_connected_output(display, output) {
> > -		pipe = &display->pipes[i];
> > +		pipe = igt_crtc_for_pipe(display, i);
> >  		plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
> >  
> >  		mode = NULL;
> > diff --git a/tests/kms_pipe_crc_basic.c b/tests/kms_pipe_crc_basic.c
> > index ca8f76c8aa27..1699b68ff3d0 100644
> > --- a/tests/kms_pipe_crc_basic.c
> > +++ b/tests/kms_pipe_crc_basic.c
> > @@ -169,11 +169,13 @@ static void test_read_crc(data_t *data, enum pipe pipe,
> >  
> >  			pipe_crc = igt_pipe_crc_new_nonblock(data->drm_fd, pipe,
> >  							     IGT_PIPE_CRC_SOURCE_AUTO);
> > -			igt_wait_for_vblank(data->drm_fd, display->pipes[pipe].crtc_offset);
> > +			igt_wait_for_vblank(data->drm_fd,
> > +					    igt_crtc_for_pipe(display, pipe)->crtc_offset);
> >  			igt_pipe_crc_start(pipe_crc);
> >  
> >  			igt_wait_for_vblank_count(data->drm_fd,
> > -					display->pipes[pipe].crtc_offset, N_CRCS);
> > +					igt_crtc_for_pipe(display, pipe)->crtc_offset,
> > +					N_CRCS);
> >  			n_crcs = igt_pipe_crc_get_crcs(pipe_crc, N_CRCS+1, &crcs);
> >  			igt_pipe_crc_stop(pipe_crc);
> >  			igt_pipe_crc_free(pipe_crc);
> > diff --git a/tests/kms_plane.c b/tests/kms_plane.c
> > index 5f18eac13ac1..84455e77bbb2 100644
> > --- a/tests/kms_plane.c
> > +++ b/tests/kms_plane.c
> > @@ -127,7 +127,7 @@ static color_t blue  = { 0.0f, 0.0f, 1.0f };
> >   */
> >  static void test_init(data_t *data, enum pipe pipe)
> >  {
> > -	igt_require(data->display.pipes[pipe].n_planes > 0);
> > +	igt_require(igt_crtc_for_pipe(&data->display, pipe)->n_planes > 0);
> >  	if (data->pipe_crc)
> >  		igt_pipe_crc_free(data->pipe_crc);
> >  	data->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe,
> > @@ -337,7 +337,7 @@ test_plane_position_with_output(data_t *data,
> >  static void
> >  test_plane_position(data_t *data, enum pipe pipe)
> >  {
> > -	int n_planes = data->display.pipes[pipe].n_planes;
> > +	int n_planes = igt_crtc_for_pipe(&data->display, pipe)->n_planes;
> >  	igt_output_t *output = data->output;
> >  	igt_crc_t reference_crc;
> >  
> > @@ -522,7 +522,7 @@ static const color_t colors_reduced[] = {
> >  static void set_legacy_lut(data_t *data, enum pipe pipe,
> >  			   uint16_t mask)
> >  {
> > -	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(&data->display, pipe);
> >  	drmModeCrtc *drm_crtc;
> >  	uint16_t *lut;
> >  	int i, lut_size;
> > @@ -549,7 +549,7 @@ static void set_legacy_lut(data_t *data, enum pipe pipe,
> >  static bool set_c8_legacy_lut(data_t *data, enum pipe pipe,
> >  			      uint16_t mask)
> >  {
> > -	igt_pipe_t *pipe_obj = &data->display.pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(&data->display, pipe);
> >  	drmModeCrtc *drm_crtc;
> >  	uint16_t *r, *g, *b;
> >  	int i, lut_size;
> > @@ -793,7 +793,7 @@ restart_round:
> >  				igt_display_t *display = &data->display;
> >  
> >  				igt_wait_for_vblank(data->drm_fd,
> > -						display->pipes[pipe].crtc_offset);
> > +						igt_crtc_for_pipe(display, pipe)->crtc_offset);
> >  			}
> >  		}
> >  
> > diff --git a/tests/kms_plane_alpha_blend.c b/tests/kms_plane_alpha_blend.c
> > index 037a5c1060a2..99ce90616720 100644
> > --- a/tests/kms_plane_alpha_blend.c
> > +++ b/tests/kms_plane_alpha_blend.c
> > @@ -214,7 +214,8 @@ static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe)
> >  	drmModeModeInfo *mode;
> >  	igt_display_t *display = &data->display;
> >  	int w, h;
> > -	igt_plane_t *primary = igt_pipe_get_plane_type(&display->pipes[pipe], DRM_PLANE_TYPE_PRIMARY);
> > +	igt_plane_t *primary = igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe),
> > +						       DRM_PLANE_TYPE_PRIMARY);
> >  
> >  	/* create the pipe_crc object for this pipe */
> >  	igt_pipe_crc_free(data->pipe_crc);
> > @@ -387,7 +388,8 @@ static void constant_alpha_mid(data_t *data, enum pipe pipe, igt_plane_t *plane)
> >  	igt_crc_t ref_crc, crc;
> >  
> >  	if (plane->type != DRM_PLANE_TYPE_PRIMARY)
> > -		igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe], DRM_PLANE_TYPE_PRIMARY), &data->gray_fb);
> > +		igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe), DRM_PLANE_TYPE_PRIMARY),
> > +				 &data->gray_fb);
> >  
> >  	igt_plane_set_prop_enum(plane, IGT_PLANE_PIXEL_BLEND_MODE, "None");
> >  	igt_plane_set_prop_value(plane, IGT_PLANE_ALPHA, 0x7fff);
> > @@ -412,7 +414,8 @@ static void constant_alpha_max(data_t *data, enum pipe pipe, igt_plane_t *plane)
> >  	igt_crc_t ref_crc, crc;
> >  
> >  	if (plane->type != DRM_PLANE_TYPE_PRIMARY)
> > -		igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe], DRM_PLANE_TYPE_PRIMARY), &data->gray_fb);
> > +		igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe), DRM_PLANE_TYPE_PRIMARY),
> > +				 &data->gray_fb);
> >  
> >  	igt_plane_set_fb(plane, &data->argb_fb_100);
> >  	igt_display_commit2(display, COMMIT_ATOMIC);
> > @@ -442,7 +445,8 @@ static void alpha_7efc(data_t *data, enum pipe pipe, igt_plane_t *plane)
> >  	igt_crc_t ref_crc = {}, crc = {};
> >  
> >  	if (plane->type != DRM_PLANE_TYPE_PRIMARY)
> > -		igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe], DRM_PLANE_TYPE_PRIMARY), &data->gray_fb);
> > +		igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe), DRM_PLANE_TYPE_PRIMARY),
> > +				 &data->gray_fb);
> >  
> >  	igt_display_commit2(display, COMMIT_ATOMIC);
> >  	igt_pipe_crc_start(data->pipe_crc);
> > @@ -496,7 +500,8 @@ static void coverage_premult_constant(data_t *data, enum pipe pipe, igt_plane_t
> >  
> >  	/* Set a background color on the primary fb for testing */
> >  	if (plane->type != DRM_PLANE_TYPE_PRIMARY)
> > -		igt_plane_set_fb(igt_pipe_get_plane_type(&display->pipes[pipe], DRM_PLANE_TYPE_PRIMARY), &data->gray_fb);
> > +		igt_plane_set_fb(igt_pipe_get_plane_type(igt_crtc_for_pipe(display, pipe), DRM_PLANE_TYPE_PRIMARY),
> > +				 &data->gray_fb);
> >  
> >  	igt_require(igt_plane_try_prop_enum(plane, IGT_PLANE_PIXEL_BLEND_MODE, "Coverage"));
> >  	igt_plane_set_fb(plane, &data->argb_fb_cov_7e);
> > diff --git a/tests/kms_plane_cursor.c b/tests/kms_plane_cursor.c
> > index 3f9afe674259..7817d6df9f1d 100644
> > --- a/tests/kms_plane_cursor.c
> > +++ b/tests/kms_plane_cursor.c
> > @@ -94,7 +94,7 @@ static void test_init(data_t *data, enum pipe pipe_id, igt_output_t *output,
> >  		      unsigned int flags)
> >  {
> >  	data->pipe_id = pipe_id;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  	data->output = output;
> >  
> >  	data->mode = igt_output_get_mode(data->output);
> > @@ -188,7 +188,9 @@ static void test_cursor_pos(data_t *data, int x, int y, unsigned int flags)
> >  	/* Wait for one more vblank since cursor updates are not
> >  	 * synchronized to the same frame on AMD hw */
> >  	if(is_amdgpu_device(data->drm_fd))
> > -		igt_wait_for_vblank_count(data->drm_fd, data->display.pipes[data->pipe_id].crtc_offset, 1);
> > +		igt_wait_for_vblank_count(data->drm_fd,
> > +					  igt_crtc_for_pipe(&data->display, data->pipe_id)->crtc_offset,
> > +					  1);
> >  
> >  	igt_pipe_crc_get_current(data->drm_fd, data->pipe_crc, &test_crc);
> >  	igt_pipe_crc_stop(data->pipe_crc);
> > @@ -326,7 +328,7 @@ int igt_main()
> >  		igt_subtest_with_dynamic_f("%s", tests[i].name) {
> >  			for_each_pipe_with_single_output(&data.display, pipe, output) {
> >  				if ((tests[i].flags & TEST_OVERLAY) &&
> > -				    !igt_pipe_get_plane_type(&data.display.pipes[pipe],
> > +				    !igt_pipe_get_plane_type(igt_crtc_for_pipe(&data.display, pipe),
> >  							     DRM_PLANE_TYPE_OVERLAY))
> >  					continue;
> >  
> > diff --git a/tests/kms_plane_multiple.c b/tests/kms_plane_multiple.c
> > index 2f1bd16a1b33..0ce12749f7c8 100644
> > --- a/tests/kms_plane_multiple.c
> > +++ b/tests/kms_plane_multiple.c
> > @@ -403,7 +403,7 @@ static void
> >  test_plane_position(data_t *data, enum pipe pipe, igt_output_t *output, uint64_t modifier)
> >  {
> >  	int n_planes = opt.all_planes ?
> > -			data->display.pipes[pipe].n_planes : DEFAULT_N_PLANES;
> > +			igt_crtc_for_pipe(&data->display, pipe)->n_planes : DEFAULT_N_PLANES;
> >  
> >  	if (!opt.user_seed)
> >  		opt.seed = time(NULL);
> > @@ -464,7 +464,7 @@ static void test_plane_position_2_display(data_t *data, enum pipe pipe1, enum pi
> >  	color_t blue  = { 0.0f, 0.0f, 1.0f };
> >  	igt_crc_t crc1, crc2;
> >  	int n_planes = opt.all_planes ?
> > -		       data->display.pipes[0].n_planes : DEFAULT_N_PLANES;
> > +		       igt_crtc_for_pipe(&data->display, 0)->n_planes : DEFAULT_N_PLANES;
> >  
> >  	/*
> >  	 * Note: We could use the dynamic way of calculating the maximum planes here
> > diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
> > index bdb290b5430e..10b168615226 100644
> > --- a/tests/kms_plane_scaling.c
> > +++ b/tests/kms_plane_scaling.c
> > @@ -963,7 +963,7 @@ test_planes_scaling_combo(data_t *d, double sf_plane1,
> >  		w2 = get_width(mode, sf_plane2);
> >  		h2 = get_height(mode, sf_plane2);
> >  
> > -		n_planes = display->pipes[pipe].n_planes;
> > +		n_planes = igt_crtc_for_pipe(display, pipe)->n_planes;
> >  		igt_require(n_planes >= 2);
> >  
> >  		switch (test_type) {
> > @@ -990,9 +990,9 @@ test_planes_scaling_combo(data_t *d, double sf_plane1,
> >  		for (int k = 0; k < n_planes - 1; k += 2) {
> >  			igt_plane_t *p1, *p2;
> >  
> > -			p1 = &display->pipes[pipe].planes[k];
> > +			p1 = &igt_crtc_for_pipe(display, pipe)->planes[k];
> >  			igt_require(p1);
> > -			p2 = &display->pipes[pipe].planes[k+1];
> > +			p2 = &igt_crtc_for_pipe(display, pipe)->planes[k+1];
> >  			igt_require(p2);
> >  
> >  			if (p1->type == DRM_PLANE_TYPE_CURSOR || p2->type == DRM_PLANE_TYPE_CURSOR)
> > @@ -1015,7 +1015,7 @@ static void
> >  test_invalid_num_scalers(data_t *d, enum pipe pipe, igt_output_t *output)
> >  {
> >  	igt_display_t *display = &d->display;
> > -	igt_pipe_t *pipe_obj = &display->pipes[pipe];
> > +	igt_pipe_t *pipe_obj = igt_crtc_for_pipe(display, pipe);
> >  	int width, height;
> >  	igt_plane_t *plane[3];
> >  	drmModeModeInfo *mode;
> > diff --git a/tests/kms_properties.c b/tests/kms_properties.c
> > index 64514b4d2676..95bfe293a242 100644
> > --- a/tests/kms_properties.c
> > +++ b/tests/kms_properties.c
> > @@ -291,7 +291,9 @@ static void run_crtc_property_tests(igt_display_t *display, enum pipe pipe, igt_
> >  
> >  	igt_info("Testing crtc properties on %s (output: %s)\n", kmstest_pipe_name(pipe), output->name);
> >  
> > -	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic, false);
> > +	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC,
> > +			igt_crtc_for_pipe(display, pipe)->crtc_id, atomic,
> > +			false);
> >  
> >  	cleanup_pipe(display, pipe, output, &fb);
> >  }
> > @@ -482,7 +484,9 @@ static void test_object_invalid_properties(igt_display_t *display,
> >  	enum pipe pipe;
> >  
> >  	for_each_pipe(display, pipe)
> > -		test_invalid_properties(display->drm_fd, id, type, display->pipes[pipe].crtc_id, DRM_MODE_OBJECT_CRTC, atomic);
> > +		test_invalid_properties(display->drm_fd, id, type,
> > +				        igt_crtc_for_pipe(display, pipe)->crtc_id,
> > +				        DRM_MODE_OBJECT_CRTC, atomic);
> >  
> >  	for_each_pipe(display, pipe)
> >  		for_each_plane_on_pipe(display, pipe, plane)
> > @@ -888,7 +892,9 @@ static void invalid_properties(igt_display_t *display, bool atomic)
> >  		igt_skip_on(!display->is_atomic);
> >  
> >  	for_each_pipe(display, pipe)
> > -		test_object_invalid_properties(display, display->pipes[pipe].crtc_id, DRM_MODE_OBJECT_CRTC, atomic);
> > +		test_object_invalid_properties(display,
> > +				               igt_crtc_for_pipe(display, pipe)->crtc_id,
> > +				               DRM_MODE_OBJECT_CRTC, atomic);
> >  
> >  	for_each_pipe(display, pipe)
> >  		for_each_plane_on_pipe(display, pipe, plane)
> > diff --git a/tests/kms_rotation_crc.c b/tests/kms_rotation_crc.c
> > index 6f10da8fbf7c..d37a14e275f7 100644
> > --- a/tests/kms_rotation_crc.c
> > +++ b/tests/kms_rotation_crc.c
> > @@ -1353,7 +1353,8 @@ int igt_main_args("", long_opts, help_str, opt_handler, &data)
> >  		igt_display_require_output(&data.display);
> >  
> >  		for_each_pipe_with_valid_output(&data.display, pipe, output) {
> > -			igt_plane_t *primary = &data.display.pipes[pipe].planes[0];
> > +			igt_plane_t *primary = &igt_crtc_for_pipe(&data.display,
> > +								  pipe)->planes[0];
> >  
> >  			test_plane_rotation_exhaust_fences(&data, pipe, output, primary);
> >  			break;
> > diff --git a/tests/kms_sequence.c b/tests/kms_sequence.c
> > index 46edcc50d2ab..80a586ce62f5 100644
> > --- a/tests/kms_sequence.c
> > +++ b/tests/kms_sequence.c
> > @@ -123,7 +123,7 @@ static void prepare_crtc(data_t *data, int fd, igt_output_t *output)
> >  	igt_display_commit(display);
> >  
> >  	igt_wait_for_vblank(fd,
> > -			display->pipes[data->pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, data->pipe)->crtc_offset);
> >  }
> >  
> >  static void cleanup_crtc(data_t *data, int fd, igt_output_t *output)
> > diff --git a/tests/kms_tiled_display.c b/tests/kms_tiled_display.c
> > index d6f5eda7d841..003e6ea408e8 100644
> > --- a/tests/kms_tiled_display.c
> > +++ b/tests/kms_tiled_display.c
> > @@ -328,7 +328,7 @@ static data_connector_t *conn_for_crtc(data_t *data, unsigned int crtc_id)
> >  	for (int i = 0; i < data->num_h_tiles; i++) {
> >  		data_connector_t *conn = &data->conns[i];
> >  
> > -		if (data->display.pipes[conn->pipe].crtc_id == crtc_id)
> > +		if (igt_crtc_for_pipe(&data->display, conn->pipe)->crtc_id == crtc_id)
> >  			return conn;
> >  	}
> >  
> > diff --git a/tests/kms_universal_plane.c b/tests/kms_universal_plane.c
> > index 47c805cd36cd..a4913ec13819 100644
> > --- a/tests/kms_universal_plane.c
> > +++ b/tests/kms_universal_plane.c
> > @@ -172,10 +172,10 @@ functional_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
> >  	 * drm_universal_plane_init(), the type enum can get interpreted as a
> >  	 * boolean and show up in userspace as the wrong type.
> >  	 */
> > -	for (i = 0; i < display->pipes[pipe].n_planes; i++)
> > -		if (display->pipes[pipe].planes[i].type == DRM_PLANE_TYPE_PRIMARY)
> > +	for (i = 0; i < igt_crtc_for_pipe(display, pipe)->n_planes; i++)
> > +		if (igt_crtc_for_pipe(display, pipe)->planes[i].type == DRM_PLANE_TYPE_PRIMARY)
> >  			num_primary++;
> > -		else if (display->pipes[pipe].planes[i].type == DRM_PLANE_TYPE_CURSOR)
> > +		else if (igt_crtc_for_pipe(display, pipe)->planes[i].type == DRM_PLANE_TYPE_CURSOR)
> >  			num_cursor++;
> >  
> >  	igt_warn_on(num_primary != 1);
> > @@ -711,7 +711,9 @@ cursor_leak_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
> >  	 * framebuffer.
> >  	 */
> >  	if (is_xe_device(data->drm_fd))
> > -		igt_wait_for_vblank_count(data->drm_fd, data->display.pipes[pipe].crtc_offset, 2);
> > +		igt_wait_for_vblank_count(data->drm_fd,
> > +					  igt_crtc_for_pipe(&data->display, pipe)->crtc_offset,
> > +					  2);
> >  
> >  	/* We should be back to the same framebuffer count as when we started */
> >  	count2 = intel_gem_fb_count(data);
> > diff --git a/tests/kms_vblank.c b/tests/kms_vblank.c
> > index bce767a2ab83..1803308c56e1 100644
> > --- a/tests/kms_vblank.c
> > +++ b/tests/kms_vblank.c
> > @@ -144,7 +144,7 @@ static void prepare_crtc(data_t *data, int fd, igt_output_t *output)
> >  	igt_display_commit(display);
> >  
> >  	igt_wait_for_vblank(fd,
> > -			display->pipes[data->pipe].crtc_offset);
> > +			igt_crtc_for_pipe(display, data->pipe)->crtc_offset);
> >  }
> >  
> >  static void cleanup_crtc(data_t *data, int fd, igt_output_t *output)
> > @@ -251,7 +251,7 @@ static void crtc_id_subtest(data_t *data, int fd)
> >  	uint64_t val;
> >  	union drm_wait_vblank vbl;
> >  
> > -	crtc_id = display->pipes[p].crtc_id;
> > +	crtc_id = igt_crtc_for_pipe(display, p)->crtc_id;
> >  	if (drmGetCap(display->drm_fd, DRM_CAP_CRTC_IN_VBLANK_EVENT, &val) == 0)
> >  		expected_crtc_id = crtc_id;
> >  	else
> > diff --git a/tools/amd_hdmi_compliance.c b/tools/amd_hdmi_compliance.c
> > index d21301733b5c..bcb7e00b0b07 100644
> > --- a/tools/amd_hdmi_compliance.c
> > +++ b/tools/amd_hdmi_compliance.c
> > @@ -385,7 +385,7 @@ static void test_init(data_t *data, int conn_id)
> >  	igt_display_t *display = &data->display;
> >  
> >  	data->pipe_id = PIPE_A;
> > -	data->pipe = &data->display.pipes[data->pipe_id];
> > +	data->pipe = igt_crtc_for_pipe(&data->display, data->pipe_id);
> >  
> >  	igt_display_reset(display);
> 
> -- 
> Jani Nikula, Intel

-- 
Ville Syrjälä
Intel

  reply	other threads:[~2025-12-12 15:32 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-10  9:38 [PATCH i-g-t 00/10] lib/kms: Move towards using 'crtcs' instead of 'pipes' Ville Syrjala
2025-12-10  9:38 ` [PATCH i-g-t 01/10] tests/intel/kms_dp_linktrain_fallback: Reduce side effects in igt_output_set_pipe() args Ville Syrjala
2025-12-10 14:21   ` Jani Nikula
2025-12-10  9:38 ` [PATCH i-g-t 02/10] lib/kms: Introduce igt_display_n_crtcs() Ville Syrjala
2025-12-10 14:21   ` Jani Nikula
2025-12-10  9:38 ` [PATCH i-g-t 03/10] lib/kms: Use igt_display_n_crtcs() everywhere Ville Syrjala
2025-12-10 14:22   ` Jani Nikula
2025-12-10  9:38 ` [PATCH i-g-t 04/10] lib/kms: Introduce igt_crtc_for_pipe() Ville Syrjala
2025-12-10 14:23   ` Jani Nikula
2025-12-10 17:16   ` [PATCH i-g-t v2 " Ville Syrjala
2025-12-10  9:38 ` [PATCH i-g-t 05/10] lib/kms: Use igt_crtc_for_pipe() everywhere Ville Syrjala
2025-12-10 14:25   ` Jani Nikula
2025-12-12 15:32     ` Ville Syrjälä [this message]
2025-12-10  9:38 ` [PATCH i-g-t 06/10] lib/kms: Remove tall tales about 'pipe' in DRM_IOCTL_WAIT_VBLANK Ville Syrjala
2025-12-10 14:25   ` Jani Nikula
2025-12-10  9:39 ` [PATCH i-g-t 07/10] lib/kms: Pass the entire igt_pipe_t to igt_wait_for_vblank*() Ville Syrjala
2025-12-10 14:29   ` Jani Nikula
2025-12-10  9:39 ` [PATCH i-g-t 08/10] lib/kms: Introduce igt_output_set_crtc() Ville Syrjala
2025-12-10 14:34   ` Jani Nikula
2025-12-10 14:36     ` Jani Nikula
2025-12-10 14:38       ` Jani Nikula
2025-12-10 14:44         ` Jani Nikula
2025-12-10 14:48         ` Ville Syrjälä
2025-12-10  9:39 ` [PATCH i-g-t 09/10] lib/kms: Replace igt_output_set_pipe() with igt_output_set_crtc() Ville Syrjala
2025-12-10 14:42   ` Jani Nikula
2025-12-10  9:39 ` [PATCH i-g-t 10/10] lib/kms: Rename igt_pipe_t to igt_crtc_t Ville Syrjala
2025-12-10 14:43   ` Jani Nikula
2025-12-10 13:34 ` ✓ Xe.CI.BAT: success for lib/kms: Move towards using 'crtcs' instead of 'pipes' Patchwork
2025-12-10 14:12 ` ✗ i915.CI.BAT: failure " Patchwork
2025-12-10 19:49 ` ✗ Xe.CI.Full: " Patchwork

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=aTw1ou91cjbFOAPh@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=jani.nikula@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 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.