| From 2a57d9cce1c08578097d965468e37f06d71fa495 Mon Sep 17 00:00:00 2001 |
| From: Imre Deak <imre.deak@intel.com> |
| Date: Fri, 27 Jan 2017 11:39:18 +0200 |
| Subject: drm/i915/gen9+: Enable hotplug detection early |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Imre Deak <imre.deak@intel.com> |
| |
| commit 2a57d9cce1c08578097d965468e37f06d71fa495 upstream. |
| |
| For LSPCON resume time initialization we need to sample the |
| corresponding pin's HPD level, but this is only available when HPD |
| detection is enabled. Currently we enable detection only when enabling |
| HPD interrupts which is too late, so bring the enabling of detection |
| earlier. |
| |
| This is needed by the next patch. |
| |
| Cc: Shashank Sharma <shashank.sharma@intel.com> |
| Cc: Jani Nikula <jani.nikula@linux.intel.com> |
| Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Cc: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Reviewed-by: Shashank Sharma <shashank.sharma@intel.com> |
| Link: http://patchwork.freedesktop.org/patch/msgid/1485509961-9010-2-git-send-email-imre.deak@intel.com |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| (rebased onto v4.10.4 due to missing s/IS_BROXTON/IS_GEN9_LP/ upstream change) |
| (corrected stable tag) |
| Signed-off-by: Imre Deak <imre.deak@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/i915/i915_irq.c | 69 ++++++++++++++++++++++++++++------------ |
| 1 file changed, 50 insertions(+), 19 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_irq.c |
| +++ b/drivers/gpu/drm/i915/i915_irq.c |
| @@ -3089,19 +3089,16 @@ static void ibx_hpd_irq_setup(struct drm |
| I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
| } |
| |
| -static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
| +static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv) |
| { |
| - u32 hotplug_irqs, hotplug, enabled_irqs; |
| - |
| - hotplug_irqs = SDE_HOTPLUG_MASK_SPT; |
| - enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt); |
| - |
| - ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); |
| + u32 hotplug; |
| |
| /* Enable digital hotplug on the PCH */ |
| hotplug = I915_READ(PCH_PORT_HOTPLUG); |
| - hotplug |= PORTD_HOTPLUG_ENABLE | PORTC_HOTPLUG_ENABLE | |
| - PORTB_HOTPLUG_ENABLE | PORTA_HOTPLUG_ENABLE; |
| + hotplug |= PORTA_HOTPLUG_ENABLE | |
| + PORTB_HOTPLUG_ENABLE | |
| + PORTC_HOTPLUG_ENABLE | |
| + PORTD_HOTPLUG_ENABLE; |
| I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
| |
| hotplug = I915_READ(PCH_PORT_HOTPLUG2); |
| @@ -3109,6 +3106,18 @@ static void spt_hpd_irq_setup(struct drm |
| I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); |
| } |
| |
| +static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
| +{ |
| + u32 hotplug_irqs, enabled_irqs; |
| + |
| + hotplug_irqs = SDE_HOTPLUG_MASK_SPT; |
| + enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt); |
| + |
| + ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); |
| + |
| + spt_hpd_detection_setup(dev_priv); |
| +} |
| + |
| static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) |
| { |
| u32 hotplug_irqs, hotplug, enabled_irqs; |
| @@ -3143,18 +3152,15 @@ static void ilk_hpd_irq_setup(struct drm |
| ibx_hpd_irq_setup(dev_priv); |
| } |
| |
| -static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
| +static void __bxt_hpd_detection_setup(struct drm_i915_private *dev_priv, |
| + u32 enabled_irqs) |
| { |
| - u32 hotplug_irqs, hotplug, enabled_irqs; |
| - |
| - enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt); |
| - hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; |
| - |
| - bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); |
| + u32 hotplug; |
| |
| hotplug = I915_READ(PCH_PORT_HOTPLUG); |
| - hotplug |= PORTC_HOTPLUG_ENABLE | PORTB_HOTPLUG_ENABLE | |
| - PORTA_HOTPLUG_ENABLE; |
| + hotplug |= PORTA_HOTPLUG_ENABLE | |
| + PORTB_HOTPLUG_ENABLE | |
| + PORTC_HOTPLUG_ENABLE; |
| |
| DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n", |
| hotplug, enabled_irqs); |
| @@ -3164,7 +3170,6 @@ static void bxt_hpd_irq_setup(struct drm |
| * For BXT invert bit has to be set based on AOB design |
| * for HPD detection logic, update it based on VBT fields. |
| */ |
| - |
| if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) && |
| intel_bios_is_port_hpd_inverted(dev_priv, PORT_A)) |
| hotplug |= BXT_DDIA_HPD_INVERT; |
| @@ -3178,6 +3183,23 @@ static void bxt_hpd_irq_setup(struct drm |
| I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
| } |
| |
| +static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv) |
| +{ |
| + __bxt_hpd_detection_setup(dev_priv, BXT_DE_PORT_HOTPLUG_MASK); |
| +} |
| + |
| +static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) |
| +{ |
| + u32 hotplug_irqs, enabled_irqs; |
| + |
| + enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt); |
| + hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; |
| + |
| + bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); |
| + |
| + __bxt_hpd_detection_setup(dev_priv, enabled_irqs); |
| +} |
| + |
| static void ibx_irq_postinstall(struct drm_device *dev) |
| { |
| struct drm_i915_private *dev_priv = to_i915(dev); |
| @@ -3193,6 +3215,12 @@ static void ibx_irq_postinstall(struct d |
| |
| gen5_assert_iir_is_zero(dev_priv, SDEIIR); |
| I915_WRITE(SDEIMR, ~mask); |
| + |
| + if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) || |
| + HAS_PCH_LPT(dev_priv)) |
| + ; /* TODO: Enable HPD detection on older PCH platforms too */ |
| + else |
| + spt_hpd_detection_setup(dev_priv); |
| } |
| |
| static void gen5_gt_irq_postinstall(struct drm_device *dev) |
| @@ -3404,6 +3432,9 @@ static void gen8_de_irq_postinstall(stru |
| |
| GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables); |
| GEN5_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked); |
| + |
| + if (IS_BROXTON(dev_priv)) |
| + bxt_hpd_detection_setup(dev_priv); |
| } |
| |
| static int gen8_irq_postinstall(struct drm_device *dev) |