[Intel-gfx] [PATCH 03/58] drm/i915: add direct encoder disable/enable infrastructure
Jesse Barnes
jbarnes at virtuousgeek.org
Wed Aug 29 20:01:14 CEST 2012
On Sun, 19 Aug 2012 21:12:20 +0200
Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> Just prep work, not yet put to some use.
>
> Note that because we're still using the crtc helper to switch modes
> (and their complicated way to do partial modesets), we need to call
> the encoder's disable function unconditionally.
>
> But once this is cleaned up we shouldn't call the encoder's disable
> function unconditionally any more, because then we know that we'll
> only call it if the encoder is actually enabled. Also note that we
> then need to be careful about which crtc we're filtering the encoder
> list on: We want to filter on the crtc of the _current_ mode, not the
> one we're about to set up.
>
> For the enabling side we need to do the same trick. And again, we
> should be able to simplify this quite a bit when things have settled
> into place.
>
> Also note that this simply does not take cloning into account, so dpms
> needs to be handled specially for the few outputs where we even bother
> with it.
>
> Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/i915/intel_display.c | 38
> ++++++++++++++++++++++++++++++++++--
> drivers/gpu/drm/i915/intel_drv.h | 2 ++ 2 files changed, 38
> insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c
> b/drivers/gpu/drm/i915/intel_display.c index 04bec4b..82aaded 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -3209,13 +3209,16 @@ static void ironlake_crtc_enable(struct
> drm_crtc *crtc) struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + struct intel_encoder *encoder;
> int pipe = intel_crtc->pipe;
> int plane = intel_crtc->plane;
> u32 temp;
> bool is_pch_port;
>
> + /* XXX: For compatability with the crtc helper code, call
> the encoder's
> + * enable function unconditionally for now. */
> if (intel_crtc->active)
> - return;
> + goto encoders;
>
> intel_crtc->active = true;
> intel_update_watermarks(dev);
> @@ -3262,6 +3265,12 @@ static void ironlake_crtc_enable(struct
> drm_crtc *crtc) mutex_unlock(&dev->struct_mutex);
>
> intel_crtc_update_cursor(crtc, true);
> +
> +encoders:
> + for_each_encoder_on_crtc(dev, crtc, encoder) {
> + if (encoder->enable)
> + encoder->enable(encoder);
> + }
> }
>
> static void ironlake_crtc_disable(struct drm_crtc *crtc)
> @@ -3269,10 +3278,18 @@ static void ironlake_crtc_disable(struct
> drm_crtc *crtc) struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + struct intel_encoder *encoder;
> int pipe = intel_crtc->pipe;
> int plane = intel_crtc->plane;
> u32 reg, temp;
>
> + /* XXX: For compatability with the crtc helper code, call
> the encoder's
> + * disable function unconditionally for now. */
> + for_each_encoder_on_crtc(dev, crtc, encoder) {
> + if (encoder->disable)
> + encoder->disable(encoder);
> + }
> +
> if (!intel_crtc->active)
> return;
>
> @@ -3371,11 +3388,14 @@ static void i9xx_crtc_enable(struct drm_crtc
> *crtc) struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + struct intel_encoder *encoder;
> int pipe = intel_crtc->pipe;
> int plane = intel_crtc->plane;
>
> + /* XXX: For compatability with the crtc helper code, call
> the encoder's
> + * enable function unconditionally for now. */
> if (intel_crtc->active)
> - return;
> + goto encoders;
>
> intel_crtc->active = true;
> intel_update_watermarks(dev);
> @@ -3390,6 +3410,12 @@ static void i9xx_crtc_enable(struct drm_crtc
> *crtc) /* Give the overlay scaler a chance to enable if it's on this
> pipe */ intel_crtc_dpms_overlay(intel_crtc, true);
> intel_crtc_update_cursor(crtc, true);
> +
> +encoders:
> + for_each_encoder_on_crtc(dev, crtc, encoder) {
> + if (encoder->enable)
> + encoder->enable(encoder);
> + }
> }
>
> static void i9xx_crtc_disable(struct drm_crtc *crtc)
> @@ -3397,9 +3423,17 @@ static void i9xx_crtc_disable(struct drm_crtc
> *crtc) struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> + struct intel_encoder *encoder;
> int pipe = intel_crtc->pipe;
> int plane = intel_crtc->plane;
>
> + /* XXX: For compatability with the crtc helper code, call
> the encoder's
> + * disable function unconditionally for now. */
> + for_each_encoder_on_crtc(dev, crtc, encoder) {
> + if (encoder->disable)
> + encoder->disable(encoder);
> + }
> +
> if (!intel_crtc->active)
> return;
>
> diff --git a/drivers/gpu/drm/i915/intel_drv.h
> b/drivers/gpu/drm/i915/intel_drv.h index 95f635b..9a5adcc 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -141,6 +141,8 @@ struct intel_encoder {
> */
> bool cloneable;
> void (*hot_plug)(struct intel_encoder *);
> + void (*enable)(struct intel_encoder *);
> + void (*disable)(struct intel_encoder *);
> int crtc_mask;
> };
>
Yep, looks good.
Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>
More information about the Intel-gfx
mailing list