diff mbox

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

Message ID 1345403595-9678-23-git-send-email-daniel.vetter@ffwll.ch (mailing list archive)
State Accepted
Headers show

Commit Message

Daniel Vetter Aug. 19, 2012, 7:12 p.m. UTC
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@ffwll.ch>
---
 drivers/gpu/drm/i915/intel_display.c | 11 +++++++++++
 drivers/gpu/drm/i915/intel_drv.h     |  8 ++++++++
 2 files changed, 19 insertions(+)

Comments

Jesse Barnes Sept. 4, 2012, 8:25 p.m. UTC | #1
On Sun, 19 Aug 2012 21:12:39 +0200
Daniel Vetter <daniel.vetter@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@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@virtuousgeek.org>
diff mbox

Patch

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)
 {