drm/i915/gen5+, pch: Enable hotplug detection early
To be consistent with the recent change to enable hotplug detection early on GEN9 platforms do the same on all non-GMCH platforms starting from GEN5. On GMCH platforms enabling detection without interrupts isn't trivial, since AUX and HPD have a shared interrupt line. It could be done there too by using a SW interrupt mask, but I punt on that for now. 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> 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-5-git-send-email-imre.deak@intel.com
This commit is contained in:
Родитель
f123959594
Коммит
1a56b1a2db
|
@ -3096,9 +3096,34 @@ static u32 intel_hpd_enabled_irqs(struct drm_i915_private *dev_priv,
|
||||||
return enabled_irqs;
|
return enabled_irqs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
u32 hotplug;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable digital hotplug on the PCH, and configure the DP short pulse
|
||||||
|
* duration to 2ms (which is the minimum in the Display Port spec).
|
||||||
|
* The pulse duration bits are reserved on LPT+.
|
||||||
|
*/
|
||||||
|
hotplug = I915_READ(PCH_PORT_HOTPLUG);
|
||||||
|
hotplug &= ~(PORTB_PULSE_DURATION_MASK |
|
||||||
|
PORTC_PULSE_DURATION_MASK |
|
||||||
|
PORTD_PULSE_DURATION_MASK);
|
||||||
|
hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms;
|
||||||
|
hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms;
|
||||||
|
hotplug |= PORTD_HOTPLUG_ENABLE | PORTD_PULSE_DURATION_2ms;
|
||||||
|
/*
|
||||||
|
* When CPU and PCH are on the same package, port A
|
||||||
|
* HPD must be enabled in both north and south.
|
||||||
|
*/
|
||||||
|
if (HAS_PCH_LPT_LP(dev_priv))
|
||||||
|
hotplug |= PORTA_HOTPLUG_ENABLE;
|
||||||
|
I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
|
||||||
|
}
|
||||||
|
|
||||||
static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
u32 hotplug_irqs, hotplug, enabled_irqs;
|
u32 hotplug_irqs, enabled_irqs;
|
||||||
|
|
||||||
if (HAS_PCH_IBX(dev_priv)) {
|
if (HAS_PCH_IBX(dev_priv)) {
|
||||||
hotplug_irqs = SDE_HOTPLUG_MASK;
|
hotplug_irqs = SDE_HOTPLUG_MASK;
|
||||||
|
@ -3110,23 +3135,7 @@ static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
|
ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
|
||||||
|
|
||||||
/*
|
ibx_hpd_detection_setup(dev_priv);
|
||||||
* Enable digital hotplug on the PCH, and configure the DP short pulse
|
|
||||||
* duration to 2ms (which is the minimum in the Display Port spec).
|
|
||||||
* The pulse duration bits are reserved on LPT+.
|
|
||||||
*/
|
|
||||||
hotplug = I915_READ(PCH_PORT_HOTPLUG);
|
|
||||||
hotplug &= ~(PORTD_PULSE_DURATION_MASK|PORTC_PULSE_DURATION_MASK|PORTB_PULSE_DURATION_MASK);
|
|
||||||
hotplug |= PORTD_HOTPLUG_ENABLE | PORTD_PULSE_DURATION_2ms;
|
|
||||||
hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms;
|
|
||||||
hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms;
|
|
||||||
/*
|
|
||||||
* When CPU and PCH are on the same package, port A
|
|
||||||
* HPD must be enabled in both north and south.
|
|
||||||
*/
|
|
||||||
if (HAS_PCH_LPT_LP(dev_priv))
|
|
||||||
hotplug |= PORTA_HOTPLUG_ENABLE;
|
|
||||||
I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
|
static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
|
||||||
|
@ -3158,9 +3167,25 @@ static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
||||||
spt_hpd_detection_setup(dev_priv);
|
spt_hpd_detection_setup(dev_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ilk_hpd_detection_setup(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
u32 hotplug;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable digital hotplug on the CPU, and configure the DP short pulse
|
||||||
|
* duration to 2ms (which is the minimum in the Display Port spec)
|
||||||
|
* The pulse duration bits are reserved on HSW+.
|
||||||
|
*/
|
||||||
|
hotplug = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
|
||||||
|
hotplug &= ~DIGITAL_PORTA_PULSE_DURATION_MASK;
|
||||||
|
hotplug |= DIGITAL_PORTA_HOTPLUG_ENABLE |
|
||||||
|
DIGITAL_PORTA_PULSE_DURATION_2ms;
|
||||||
|
I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug);
|
||||||
|
}
|
||||||
|
|
||||||
static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
u32 hotplug_irqs, hotplug, enabled_irqs;
|
u32 hotplug_irqs, enabled_irqs;
|
||||||
|
|
||||||
if (INTEL_GEN(dev_priv) >= 8) {
|
if (INTEL_GEN(dev_priv) >= 8) {
|
||||||
hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG;
|
hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG;
|
||||||
|
@ -3179,15 +3204,7 @@ static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
||||||
ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
|
ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
ilk_hpd_detection_setup(dev_priv);
|
||||||
* Enable digital hotplug on the CPU, and configure the DP short pulse
|
|
||||||
* duration to 2ms (which is the minimum in the Display Port spec)
|
|
||||||
* The pulse duration bits are reserved on HSW+.
|
|
||||||
*/
|
|
||||||
hotplug = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
|
|
||||||
hotplug &= ~DIGITAL_PORTA_PULSE_DURATION_MASK;
|
|
||||||
hotplug |= DIGITAL_PORTA_HOTPLUG_ENABLE | DIGITAL_PORTA_PULSE_DURATION_2ms;
|
|
||||||
I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug);
|
|
||||||
|
|
||||||
ibx_hpd_irq_setup(dev_priv);
|
ibx_hpd_irq_setup(dev_priv);
|
||||||
}
|
}
|
||||||
|
@ -3258,7 +3275,7 @@ static void ibx_irq_postinstall(struct drm_device *dev)
|
||||||
|
|
||||||
if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
|
if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
|
||||||
HAS_PCH_LPT(dev_priv))
|
HAS_PCH_LPT(dev_priv))
|
||||||
; /* TODO: Enable HPD detection on older PCH platforms too */
|
ibx_hpd_detection_setup(dev_priv);
|
||||||
else
|
else
|
||||||
spt_hpd_detection_setup(dev_priv);
|
spt_hpd_detection_setup(dev_priv);
|
||||||
}
|
}
|
||||||
|
@ -3335,6 +3352,8 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
||||||
|
|
||||||
gen5_gt_irq_postinstall(dev);
|
gen5_gt_irq_postinstall(dev);
|
||||||
|
|
||||||
|
ilk_hpd_detection_setup(dev_priv);
|
||||||
|
|
||||||
ibx_irq_postinstall(dev);
|
ibx_irq_postinstall(dev);
|
||||||
|
|
||||||
if (IS_IRONLAKE_M(dev_priv)) {
|
if (IS_IRONLAKE_M(dev_priv)) {
|
||||||
|
@ -3475,6 +3494,8 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
if (IS_GEN9_LP(dev_priv))
|
if (IS_GEN9_LP(dev_priv))
|
||||||
bxt_hpd_detection_setup(dev_priv);
|
bxt_hpd_detection_setup(dev_priv);
|
||||||
|
else if (IS_BROADWELL(dev_priv))
|
||||||
|
ilk_hpd_detection_setup(dev_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gen8_irq_postinstall(struct drm_device *dev)
|
static int gen8_irq_postinstall(struct drm_device *dev)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче