[Intel-gfx] [PATCH] drm/i915: Add new GET_PIPE_FROM_CRTC_ID ioctl.

Julien Cristau jcristau at debian.org
Thu Apr 30 00:17:11 CEST 2009


Hi Carl,

I'm a novice at kernel stuff, so take this with a grain of salt...

On Wed, Apr 29, 2009 at 14:43:54 -0700, Carl Worth wrote:

> This allows userlevel code to discover the pipe number corresponding
> to a given CRTC ID. This is necessary for doing pipe-specific
> operations such as waiting for vblank on a given CRTC.
> ---
> 
>  I've got a couple of style questions here:
> 
>  * I gave the new function an i915_ prefix like all the other ioctls,
>    but it ends up as i915_get_pipe_from_crtc_id right next to
>    intel_get_crtc_from_pipe, so should I actually give it an intel_
>    prefix instead? I can't be consistent with everything here.
> 
>  * Documentation/CodingStyle suggests using only tabs for indentation,
>    but I notice other functions using tabs and spaces to nicely align
>    long function signatures that are broken into multiple lines. Should
>    I do that here as well?
> 
Use tabs for indentation, space for alignment, I think.

>  drivers/gpu/drm/i915/i915_dma.c      |    1 +
>  drivers/gpu/drm/i915/intel_display.c |   29 +++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/intel_drv.h     |    2 ++
>  include/drm/i915_drm.h               |   10 ++++++++++
>  4 files changed, 42 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index 051134c..77c218d 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -1350,6 +1350,7 @@ struct drm_ioctl_desc i915_ioctls[] = {
>  	DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, 0),
>  	DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, 0),
>  	DRM_IOCTL_DEF(DRM_I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, 0),
> +	DRM_IOCTL_DEF(DRM_I915_GET_PIPE_FROM_CRTC_ID, i915_get_pipe_from_crtc_id, 0),
>  };
>  
>  int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index bdcda36..39551c4 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -1804,6 +1804,35 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  	}
>  }
>  
> +int i915_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
> +			struct drm_file *file_priv)
> +{
> +	drm_i915_private_t *dev_priv = dev->dev_private;
> +	struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
> +	struct drm_crtc *crtc = NULL;
> +	int pipe = -1;
> +
> +	if (!dev_priv) {
> +		DRM_ERROR("called with no initialization\n");
> +		return -EINVAL;
> +	}
> +
> +	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
> +		struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> +		if (crtc->base.id == pipe_from_crtc_id->crtc_id)
> +			pipe = intel_crtc->pipe;

break; here?

> +	}
> +
> +	if (pipe == -1 ) {
> +		DRM_ERROR("no such CRTC id\n");
> +		return -EINVAL;
> +       }
> +

does anything ensure that these DRM_ERRORs can't be trigerred by any
user process?

> +	pipe_from_crtc_id->pipe = pipe;
> +
> +       return 0;
> +}
> +
>  struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe)
>  {
>  	struct drm_crtc *crtc = NULL;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 957daef..2238632 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -125,6 +125,8 @@ extern struct drm_encoder *intel_best_encoder(struct drm_connector *connector);
>  
>  extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
>  						    struct drm_crtc *crtc);
> +int i915_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
> +			struct drm_file *file_priv);

missing extern here.

>  extern void intel_wait_for_vblank(struct drm_device *dev);
>  extern struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe);
>  extern struct drm_crtc *intel_get_load_detect_pipe(struct intel_output *intel_output,
> diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h
> index 95962fa..0508a6e 100644
> --- a/include/drm/i915_drm.h
> +++ b/include/drm/i915_drm.h
> @@ -184,6 +184,7 @@ typedef struct _drm_i915_sarea {
>  #define DRM_I915_GEM_GET_TILING	0x22
>  #define DRM_I915_GEM_GET_APERTURE 0x23
>  #define DRM_I915_GEM_MMAP_GTT	0x24
> +#define DRM_I915_GET_PIPE_FROM_CRTC_ID	0x25
>  
>  #define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
>  #define DRM_IOCTL_I915_FLUSH		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
> @@ -219,6 +220,7 @@ typedef struct _drm_i915_sarea {
>  #define DRM_IOCTL_I915_GEM_SET_TILING	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling)
>  #define DRM_IOCTL_I915_GEM_GET_TILING	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling)
>  #define DRM_IOCTL_I915_GEM_GET_APERTURE	DRM_IOR  (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture)
> +#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id)
>  
>  /* Allow drivers to submit batchbuffers directly to hardware, relying
>   * on the security mechanisms provided by hardware.
> @@ -657,4 +659,12 @@ struct drm_i915_gem_get_aperture {
>  	__u64 aper_available_size;
>  };
>  
> +struct drm_i915_get_pipe_from_crtc_id {
> +	/** ID of CRTC being requested **/
> +	__u32 crtc_id;
> +
> +	/** pipe of requested CRTC **/
> +	__u32 pipe;
> +};
> +
>  #endif				/* _I915_DRM_H_ */

Cheers,
Julien



More information about the Intel-gfx mailing list