[Intel-gfx] [PATCH] drm/i915: be sure panel is powered up in eDP configs
Sergio Monteiro Basto
sergio at sergiomb.no-ip.org
Thu Jul 22 05:09:31 CEST 2010
Hi!,
so what is the state of this ?
From: Adam Jackson <ajax at redhat.com>
To: intel-gfx at lists.freedesktop.org
Subject: [Intel-gfx] [PATCH 1/6] drm/i915/dp: Rename has_edp to
is_pch_edp to reflect its real meaning
Date: Fri, 16 Jul 2010 14:46:27 -0400 (07/16/2010 07:46:27 PM)
seems that have something related to this.
Should I try yours patch in this email ?
On Wed, 2010-07-14 at 15:40 -0700, Jesse Barnes wrote:
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=28739. We need to
> enable power to the panel with the AUX VDD bit in order to properly
> detect the eDP attached panel, and we also need to turn the panel on in
> case it was off when we started (as happens at resume time).
>
> But this patch raises a couple of questions:
> 1) why does the first panel on sequence time out?
> 2) why do I need to unlock the panel protected regs?
>
> Keith, I think this is your code, any ideas?
>
> Thanks,
> Jesse
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 42c6024..b191f02 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2805,6 +2805,7 @@
>
> #define PCH_PP_STATUS 0xc7200
> #define PCH_PP_CONTROL 0xc7204
> +#define PANEL_UNLOCK_REGS (0xabcd << 16)
> #define EDP_FORCE_VDD (1 << 3)
> #define EDP_BLC_ENABLE (1 << 2)
> #define PANEL_POWER_RESET (1 << 1)
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index b4f0282..a20dd7b 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -744,6 +744,32 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
> }
> }
>
> +static void ironlake_edp_panel_on(struct drm_device *dev)
> +{
> + struct drm_i915_private *dev_priv = dev->dev_private;
> + unsigned long timeout = jiffies + msecs_to_jiffies(5000);
> + u32 pp, pp_status;
> +
> + pp_status = I915_READ(PCH_PP_STATUS);
> + if (pp_status & PP_ON)
> + return;
> +
> + DRM_DEBUG_KMS("\n");
> + pp = I915_READ(PCH_PP_CONTROL);
> + pp |= POWER_TARGET_ON;
> + I915_WRITE(PCH_PP_CONTROL, pp);
> + do {
> + pp_status = I915_READ(PCH_PP_STATUS);
> + } while (((pp_status & PP_ON) == 0) && !time_after(jiffies, timeout));
> +
> + if (time_after(jiffies, timeout))
> + DRM_DEBUG_KMS("panel on wait timed out: 0x%08x\n", pp_status);
> +
> + pp |= PANEL_UNLOCK_REGS;
> + pp &= ~EDP_FORCE_VDD;
> + I915_WRITE(PCH_PP_CONTROL, pp);
> +}
> +
> static void ironlake_edp_backlight_on (struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -755,6 +781,28 @@ static void ironlake_edp_backlight_on (struct drm_device *dev)
> I915_WRITE(PCH_PP_CONTROL, pp);
> }
>
> +static void ironlake_edp_panel_off(struct drm_device *dev)
> +{
> + struct drm_i915_private *dev_priv = dev->dev_private;
> + unsigned long timeout = jiffies + msecs_to_jiffies(5000);
> + u32 pp, pp_status;
> +
> + DRM_DEBUG_KMS("\n");
> + pp = I915_READ(PCH_PP_CONTROL);
> + pp &= ~POWER_TARGET_ON;
> + I915_WRITE(PCH_PP_CONTROL, pp);
> + do {
> + pp_status = I915_READ(PCH_PP_STATUS);
> + } while ((pp_status & PP_ON) && !time_after(jiffies, timeout));
> +
> + if (time_after(jiffies, timeout))
> + DRM_DEBUG_KMS("panel off wait timed out\n");
> +
> + /* Make sure VDD is enabled so DP AUX will work */
> + pp |= EDP_FORCE_VDD;
> + I915_WRITE(PCH_PP_CONTROL, pp);
> +}
> +
> static void ironlake_edp_backlight_off (struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -776,16 +824,24 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
> uint32_t dp_reg = I915_READ(dp_priv->output_reg);
>
> if (mode != DRM_MODE_DPMS_ON) {
> + if (IS_eDP(intel_encoder) || IS_PCH_eDP(dp_priv)) {
> + ironlake_edp_backlight_off(dev);
> + ironlake_edp_panel_off(dev);
> + }
> if (dp_reg & DP_PORT_EN) {
> intel_dp_link_down(intel_encoder, dp_priv->DP);
> - if (IS_eDP(intel_encoder) || IS_PCH_eDP(dp_priv))
> - ironlake_edp_backlight_off(dev);
> }
> } else {
> + /* Turn off the panel so we can modify DP_A etc */
> + if (IS_eDP(intel_encoder) || IS_PCH_eDP(dp_priv))
> + ironlake_edp_panel_off(dev);
> if (!(dp_reg & DP_PORT_EN)) {
> intel_dp_link_train(intel_encoder, dp_priv->DP, dp_priv->link_configuration);
> - if (IS_eDP(intel_encoder) || IS_PCH_eDP(dp_priv))
> - ironlake_edp_backlight_on(dev);
> + }
> + if (IS_eDP(intel_encoder) || IS_PCH_eDP(dp_priv)) {
> + if (I915_READ(dp_priv->output_reg) & DP_PORT_EN)
> + ironlake_edp_panel_on(dev);
> + ironlake_edp_backlight_on(dev);
> }
> }
> dp_priv->dpms_mode = mode;
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Sérgio M. B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3293 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20100722/4b6b0646/attachment.bin>
More information about the Intel-gfx
mailing list