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