aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2017-01-27 04:39:18 -0500
committerJani Nikula <jani.nikula@intel.com>2017-02-16 04:59:10 -0500
commit2a57d9cce1c08578097d965468e37f06d71fa495 (patch)
tree6a0b271e65779a9e8cfe2f66998827e23712c910
parent1769ae83c8cb32166d1e208f7cefbf334085bd58 (diff)
drm/i915/gen9+: Enable hotplug detection early
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> Cc: <stable@vger.kernel.org> # v4.9+ Signed-off-by: Imre Deak <imre.deak@intel.com> 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 (cherry picked from commit 7fff8126d9cc902b2636d05d5d34894a75174993) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c69
1 files changed, 50 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 6fefc34ef602..7dba148ca792 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3123,19 +3123,16 @@ static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
3123 I915_WRITE(PCH_PORT_HOTPLUG, hotplug); 3123 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
3124} 3124}
3125 3125
3126static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) 3126static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
3127{ 3127{
3128 u32 hotplug_irqs, hotplug, enabled_irqs; 3128 u32 hotplug;
3129
3130 hotplug_irqs = SDE_HOTPLUG_MASK_SPT;
3131 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt);
3132
3133 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
3134 3129
3135 /* Enable digital hotplug on the PCH */ 3130 /* Enable digital hotplug on the PCH */
3136 hotplug = I915_READ(PCH_PORT_HOTPLUG); 3131 hotplug = I915_READ(PCH_PORT_HOTPLUG);
3137 hotplug |= PORTD_HOTPLUG_ENABLE | PORTC_HOTPLUG_ENABLE | 3132 hotplug |= PORTA_HOTPLUG_ENABLE |
3138 PORTB_HOTPLUG_ENABLE | PORTA_HOTPLUG_ENABLE; 3133 PORTB_HOTPLUG_ENABLE |
3134 PORTC_HOTPLUG_ENABLE |
3135 PORTD_HOTPLUG_ENABLE;
3139 I915_WRITE(PCH_PORT_HOTPLUG, hotplug); 3136 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
3140 3137
3141 hotplug = I915_READ(PCH_PORT_HOTPLUG2); 3138 hotplug = I915_READ(PCH_PORT_HOTPLUG2);
@@ -3143,6 +3140,18 @@ static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3143 I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); 3140 I915_WRITE(PCH_PORT_HOTPLUG2, hotplug);
3144} 3141}
3145 3142
3143static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3144{
3145 u32 hotplug_irqs, enabled_irqs;
3146
3147 hotplug_irqs = SDE_HOTPLUG_MASK_SPT;
3148 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt);
3149
3150 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
3151
3152 spt_hpd_detection_setup(dev_priv);
3153}
3154
3146static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) 3155static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
3147{ 3156{
3148 u32 hotplug_irqs, hotplug, enabled_irqs; 3157 u32 hotplug_irqs, hotplug, enabled_irqs;
@@ -3177,18 +3186,15 @@ static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
3177 ibx_hpd_irq_setup(dev_priv); 3186 ibx_hpd_irq_setup(dev_priv);
3178} 3187}
3179 3188
3180static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) 3189static void __bxt_hpd_detection_setup(struct drm_i915_private *dev_priv,
3190 u32 enabled_irqs)
3181{ 3191{
3182 u32 hotplug_irqs, hotplug, enabled_irqs; 3192 u32 hotplug;
3183
3184 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt);
3185 hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK;
3186
3187 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
3188 3193
3189 hotplug = I915_READ(PCH_PORT_HOTPLUG); 3194 hotplug = I915_READ(PCH_PORT_HOTPLUG);
3190 hotplug |= PORTC_HOTPLUG_ENABLE | PORTB_HOTPLUG_ENABLE | 3195 hotplug |= PORTA_HOTPLUG_ENABLE |
3191 PORTA_HOTPLUG_ENABLE; 3196 PORTB_HOTPLUG_ENABLE |
3197 PORTC_HOTPLUG_ENABLE;
3192 3198
3193 DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n", 3199 DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n",
3194 hotplug, enabled_irqs); 3200 hotplug, enabled_irqs);
@@ -3198,7 +3204,6 @@ static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3198 * For BXT invert bit has to be set based on AOB design 3204 * For BXT invert bit has to be set based on AOB design
3199 * for HPD detection logic, update it based on VBT fields. 3205 * for HPD detection logic, update it based on VBT fields.
3200 */ 3206 */
3201
3202 if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) && 3207 if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) &&
3203 intel_bios_is_port_hpd_inverted(dev_priv, PORT_A)) 3208 intel_bios_is_port_hpd_inverted(dev_priv, PORT_A))
3204 hotplug |= BXT_DDIA_HPD_INVERT; 3209 hotplug |= BXT_DDIA_HPD_INVERT;
@@ -3212,6 +3217,23 @@ static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3212 I915_WRITE(PCH_PORT_HOTPLUG, hotplug); 3217 I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
3213} 3218}
3214 3219
3220static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv)
3221{
3222 __bxt_hpd_detection_setup(dev_priv, BXT_DE_PORT_HOTPLUG_MASK);
3223}
3224
3225static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
3226{
3227 u32 hotplug_irqs, enabled_irqs;
3228
3229 enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt);
3230 hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK;
3231
3232 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
3233
3234 __bxt_hpd_detection_setup(dev_priv, enabled_irqs);
3235}
3236
3215static void ibx_irq_postinstall(struct drm_device *dev) 3237static void ibx_irq_postinstall(struct drm_device *dev)
3216{ 3238{
3217 struct drm_i915_private *dev_priv = to_i915(dev); 3239 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -3227,6 +3249,12 @@ static void ibx_irq_postinstall(struct drm_device *dev)
3227 3249
3228 gen5_assert_iir_is_zero(dev_priv, SDEIIR); 3250 gen5_assert_iir_is_zero(dev_priv, SDEIIR);
3229 I915_WRITE(SDEIMR, ~mask); 3251 I915_WRITE(SDEIMR, ~mask);
3252
3253 if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
3254 HAS_PCH_LPT(dev_priv))
3255 ; /* TODO: Enable HPD detection on older PCH platforms too */
3256 else
3257 spt_hpd_detection_setup(dev_priv);
3230} 3258}
3231 3259
3232static void gen5_gt_irq_postinstall(struct drm_device *dev) 3260static void gen5_gt_irq_postinstall(struct drm_device *dev)
@@ -3438,6 +3466,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
3438 3466
3439 GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables); 3467 GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables);
3440 GEN5_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked); 3468 GEN5_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked);
3469
3470 if (IS_GEN9_LP(dev_priv))
3471 bxt_hpd_detection_setup(dev_priv);
3441} 3472}
3442 3473
3443static int gen8_irq_postinstall(struct drm_device *dev) 3474static int gen8_irq_postinstall(struct drm_device *dev)