[PATCH 22/58] drm/i915: Add interfaces to read out encoder/connector hw state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 19 Aug 2012 21:12:39 +0200
Daniel Vetter <daniel.vetter at ffwll.ch> wrote:

> It is all glorious if we try really hard to only enable/disable an
> entire display pipe to ensure that everyting happens in the right
> order. But if we don't know the output configuration when the driver
> takes over, this will all be for vain because we'll make the hw angry
> right on the first modeset - we don't know what outputs/ports are
> enabled and hence have to disable everything in a rather ad-hoc way.
> 
> Hence we need to be able to read out the current hw state, so that we
> can properly tear down the current hw state on the first modeset.
> Obviously this is also a nice preparation for the fastboot work, where
> we try to avoid the modeset on driver load if it matches what the hw
> is currently using.
> 
> Furthermore we'll be using these functions to cross-check the actual
> hw state with what we think it should be, to ensure that the modeset
> state machine actually works as advertised.
> 
> This patch only contains the interface definitions and a little helper
> for the simple case where we have a 1:1 encoder to connector mapping.
> 
> Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/i915/intel_display.c | 11 +++++++++++
>  drivers/gpu/drm/i915/intel_drv.h     |  8 ++++++++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 5ab8694..7e7569b 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -3584,6 +3584,17 @@ void intel_connector_dpms(struct drm_connector *connector, int mode)
>  		encoder->connectors_active = false;
>  }
>  
> +/* Simple connector->get_hw_state implementation for encoders that support only
> + * one connector and no cloning and hence the encoder state determines the state
> + * of the connector. */
> +bool intel_connector_get_hw_state(struct intel_connector *connector)
> +{
> +	enum pipe pipe;
> +	struct intel_encoder *encoder = connector->encoder;
> +
> +	return encoder->get_hw_state(encoder, &pipe);
> +}
> +
>  static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
>  				  const struct drm_display_mode *mode,
>  				  struct drm_display_mode *adjusted_mode)
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 36991de..c39c705 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -144,12 +144,19 @@ struct intel_encoder {
>  	void (*hot_plug)(struct intel_encoder *);
>  	void (*enable)(struct intel_encoder *);
>  	void (*disable)(struct intel_encoder *);
> +	/* Read out the current hw state of this connector, returning true if
> +	 * the encoder is active. If the encoder is enabled it also set the pipe
> +	 * it is connected to in the pipe parameter. */
> +	bool (*get_hw_state)(struct intel_encoder *, enum pipe *pipe);
>  	int crtc_mask;
>  };
>  
>  struct intel_connector {
>  	struct drm_connector base;
>  	struct intel_encoder *encoder;
> +	/* Reads out the current hw, returning true if the connector is enabled
> +	 * and active (i.e. dpms ON state). */
> +	bool (*get_hw_state)(struct intel_connector *);
>  };
>  
>  struct intel_crtc {
> @@ -426,6 +433,7 @@ extern void intel_encoder_disable(struct drm_encoder *encoder);
>  extern void intel_encoder_destroy(struct drm_encoder *encoder);
>  extern void intel_encoder_dpms(struct intel_encoder *encoder, int mode);
>  extern void intel_connector_dpms(struct drm_connector *, int mode);
> +extern bool intel_connector_get_hw_state(struct intel_connector *connector);
>  
>  static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
>  {

Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>

-- 
Jesse Barnes, Intel Open Source Technology Center


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux