[Intel-gfx] [PATCH 22/58] drm/i915: Add interfaces to read out encoder/connector hw state
Jesse Barnes
jbarnes at virtuousgeek.org
Tue Sep 4 22:25:24 CEST 2012
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
More information about the Intel-gfx
mailing list