[igt-dev] [i-g-t V3] lib/kms: Get pipe enum from debugfs

Kamil Konieczny kamil.konieczny at linux.intel.com
Tue Mar 21 11:26:58 UTC 2023


Hi Bhanuprakash,

On 2023-03-20 at 18:43:42 +0530, Bhanuprakash Modem wrote:
> The pipe may not be the same as crtc index if pipes are fused off.
> For testing purposes, IGT needs to know the pipe. There's already
> a I915_GET_PIPE_FROM_CRTC_ID IOCTL for this. However, the upcoming
> Xe driver won't have that IOCTL.
> 
> Add IGT support to read the pipe from debugfs. For i915, still
> fallback to ioctl method to support older kernels.
> 
> V2: - Fix kmstest_get_pipe_from_crtc_id() (Bhanu)
> V3: - Read pipe as a letter instead of number (Jani)
> 
> Cc: Jani Nikula <jani.nikula at intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
> ---
>  lib/igt_kms.c | 80 +++++++++++++++++++++++++++++++++++----------------
>  1 file changed, 56 insertions(+), 24 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index c12823d31..e08949cef 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -1067,6 +1067,53 @@ void kmstest_dump_mode(drmModeModeInfo *mode)
>  		 aspect ? aspect : "", aspect ? ")" : "");
>  }
>  
> +/*
> + * With non-contiguous pipes display, crtc mapping is not always same
> + * as pipe mapping, In i915 pipe is enum id of i915's crtc object.
> + * hence allocating upper bound igt_pipe array to support non-contiguos
> + * pipe display and reading pipe enum for a crtc using GET_PIPE_FROM_CRTC_ID
> + * ioctl for a pipe to do pipe ordering with respect to crtc list.
> + */
> +static int __intel_get_pipe_from_crtc_id(int fd, int crtc_id, int crtc_idx)
> +{
> +	char buf[2];
> +	int debugfs_fd, res;
> +
> +	/*
> +	 * No GET_PIPE_FROM_CRTC_ID ioctl support for XE. Instead read
> +	 * from the debugfs "i915_pipe".
> +	 *
> +	 * This debugfs is applicable for both i915 & XE. For i915, still
> +	 * we can fallback to ioctl method to support older kernels.
> +	 */
> +	debugfs_fd = igt_debugfs_pipe_dir(fd, crtc_idx, O_RDONLY);
> +	igt_assert(debugfs_fd >= 0);
------- ^
Do not use assert here, rather fall back to old ioctl.

Regards,
Kamil

> +
> +	res = igt_debugfs_simple_read(debugfs_fd, "i915_pipe", buf, sizeof(buf));
> +	close(debugfs_fd);
> +
> +	if (res <= 0) {
> +		/* Fallback to older ioctl method. */
> +		if (is_i915_device(fd)) {
> +			struct drm_i915_get_pipe_from_crtc_id get_pipe;
> +
> +			get_pipe.pipe = 0;
> +			get_pipe.crtc_id =  crtc_id;
> +
> +			do_ioctl(fd, DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
> +				 &get_pipe);
> +
> +			return get_pipe.pipe;
> +		} else
> +			igt_assert_f(false, "XE: Failed to read the debugfs i915_pipe.\n");
> +	} else {
> +		char pipe;
> +
> +		igt_assert_eq(sscanf(buf, "%c", &pipe), 1);
> +		return kmstest_pipe_to_index(pipe);
> +	}
> +}
> +
>  /**
>   * kmstest_get_pipe_from_crtc_id:
>   * @fd: DRM fd
> @@ -1100,7 +1147,8 @@ int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id)
>  
>  	drmModeFreeResources(res);
>  
> -	return i;
> +	return is_intel_device(fd) ?
> +		__intel_get_pipe_from_crtc_id(fd, crtc_id, i) : i;
>  }
>  
>  /**
> @@ -2558,14 +2606,14 @@ void igt_display_require(igt_display_t *display, int drm_fd)
>  	drmModeRes *resources;
>  	drmModePlaneRes *plane_resources;
>  	int i;
> -	bool is_i915_dev;
> +	bool is_intel_dev;
>  
>  	memset(display, 0, sizeof(igt_display_t));
>  
>  	LOG_INDENT(display, "init");
>  
>  	display->drm_fd = drm_fd;
> -	is_i915_dev = is_i915_device(drm_fd);
> +	is_intel_dev = is_intel_device(drm_fd);
>  
>  	drmSetClientCap(drm_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
>  
> @@ -2593,34 +2641,18 @@ void igt_display_require(igt_display_t *display, int drm_fd)
>  	if (is_xe_device(drm_fd))
>  		xe_device_get(drm_fd);
>  
> -	/*
> -	 * With non-contiguous pipes display, crtc mapping is not always same
> -	 * as pipe mapping, In i915 pipe is enum id of i915's crtc object.
> -	 * hence allocating upper bound igt_pipe array to support non-contiguos
> -	 * pipe display and reading pipe enum for a crtc using GET_PIPE_FROM_CRTC_ID ioctl
> -	 * for a pipe to do pipe ordering with respect to crtc list.
> -	 */
>  	display->n_pipes = IGT_MAX_PIPES;
>  	display->pipes = calloc(sizeof(igt_pipe_t), display->n_pipes);
>  	igt_assert_f(display->pipes, "Failed to allocate memory for %d pipes\n", display->n_pipes);
>  
>  	for (i = 0; i < resources->count_crtcs; i++) {
>  		igt_pipe_t *pipe;
> +		int pipe_enum = (is_intel_dev)?
> +			__intel_get_pipe_from_crtc_id(drm_fd,
> +						      resources->crtcs[i], i) : i;
>  
> -		if (is_i915_dev) {
> -			struct drm_i915_get_pipe_from_crtc_id get_pipe;
> -
> -			get_pipe.pipe = 0;
> -			get_pipe.crtc_id =  resources->crtcs[i];
> -			do_ioctl(display->drm_fd,
> -					DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, &get_pipe);
> -			pipe = &display->pipes[get_pipe.pipe];
> -			pipe->pipe = get_pipe.pipe;
> -		}
> -		else {
> -			pipe = &display->pipes[i];
> -			pipe->pipe = i;
> -		}
> +		pipe = &display->pipes[pipe_enum];
> +		pipe->pipe = pipe_enum;
>  
>  		/* pipe is enabled/disabled */
>  		pipe->enabled = true;
> -- 
> 2.40.0
> 


More information about the igt-dev mailing list