On Mon, 17 Aug 2015, Xiong Zhang <xiong.y.zhang@xxxxxxxxx> wrote: > v2: fix one error found by checkpath.pl > v3: Add one ignored break for switch-case. DDI-E hotplug > function doesn't work after updating drm-intel tree, > I checked the code and found this missing which isn't > the root cause for broke DDI-E hp. The broken > DDI-E hp function is fixed by "Adding DDI_E power > well domain". > > Signed-off-by: Xiong Zhang <xiong.y.zhang@xxxxxxxxx> > Reviewed-by: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx> > Tested-by: Timo Aaltonen <timo.aaltonen@xxxxxxxxxxxxx> Pushed to drm-intel-next-fixes. BR, Jani. > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/i915_irq.c | 48 +++++++++++++++++++++++++++++++++--- > drivers/gpu/drm/i915/i915_reg.h | 12 +++++++++ > drivers/gpu/drm/i915/intel_display.c | 3 +++ > drivers/gpu/drm/i915/intel_dp.c | 3 +++ > drivers/gpu/drm/i915/intel_hotplug.c | 3 +++ > 6 files changed, 66 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index e0f3f05..5f6fd0b 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -215,6 +215,7 @@ enum hpd_pin { > HPD_PORT_B, > HPD_PORT_C, > HPD_PORT_D, > + HPD_PORT_E, > HPD_NUM_PINS > }; > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > index a051045..8485bea 100644 > --- a/drivers/gpu/drm/i915/i915_irq.c > +++ b/drivers/gpu/drm/i915/i915_irq.c > @@ -61,6 +61,13 @@ static const u32 hpd_cpt[HPD_NUM_PINS] = { > [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT > }; > > +static const u32 hpd_spt[HPD_NUM_PINS] = { > + [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT, > + [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT, > + [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT, > + [HPD_PORT_E] = SDE_PORTE_HOTPLUG_SPT > +}; > + > static const u32 hpd_mask_i915[HPD_NUM_PINS] = { > [HPD_CRT] = CRT_HOTPLUG_INT_EN, > [HPD_SDVO_B] = SDVOB_HOTPLUG_INT_EN, > @@ -1253,6 +1260,8 @@ static bool pch_port_hotplug_long_detect(enum port port, u32 val) > return val & PORTC_HOTPLUG_LONG_DETECT; > case PORT_D: > return val & PORTD_HOTPLUG_LONG_DETECT; > + case PORT_E: > + return val & PORTE_HOTPLUG_LONG_DETECT; > default: > return false; > } > @@ -1753,7 +1762,12 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) > { > struct drm_i915_private *dev_priv = dev->dev_private; > int pipe; > - u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; > + u32 hotplug_trigger; > + > + if (HAS_PCH_SPT(dev)) > + hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_SPT; > + else > + hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT; > > if (hotplug_trigger) { > u32 dig_hotplug_reg, pin_mask, long_mask; > @@ -1761,9 +1775,23 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) > dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG); > I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg); > > - intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, > - dig_hotplug_reg, hpd_cpt, > - pch_port_hotplug_long_detect); > + if (HAS_PCH_SPT(dev)) { > + intel_get_hpd_pins(&pin_mask, &long_mask, > + hotplug_trigger, > + dig_hotplug_reg, hpd_spt, > + pch_port_hotplug_long_detect); > + > + /* detect PORTE HP event */ > + dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2); > + if (pch_port_hotplug_long_detect(PORT_E, > + dig_hotplug_reg)) > + long_mask |= 1 << HPD_PORT_E; > + } else > + intel_get_hpd_pins(&pin_mask, &long_mask, > + hotplug_trigger, > + dig_hotplug_reg, hpd_cpt, > + pch_port_hotplug_long_detect); > + > intel_hpd_irq_handler(dev, pin_mask, long_mask); > } > > @@ -2985,6 +3013,11 @@ static void ibx_hpd_irq_setup(struct drm_device *dev) > for_each_intel_encoder(dev, intel_encoder) > if (dev_priv->hotplug.stats[intel_encoder->hpd_pin].state == HPD_ENABLED) > enabled_irqs |= hpd_ibx[intel_encoder->hpd_pin]; > + } else if (HAS_PCH_SPT(dev)) { > + hotplug_irqs = SDE_HOTPLUG_MASK_SPT; > + for_each_intel_encoder(dev, intel_encoder) > + if (dev_priv->hotplug.stats[intel_encoder->hpd_pin].state == HPD_ENABLED) > + enabled_irqs |= hpd_spt[intel_encoder->hpd_pin]; > } else { > hotplug_irqs = SDE_HOTPLUG_MASK_CPT; > for_each_intel_encoder(dev, intel_encoder) > @@ -3006,6 +3039,13 @@ static void ibx_hpd_irq_setup(struct drm_device *dev) > hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms; > hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms; > I915_WRITE(PCH_PORT_HOTPLUG, hotplug); > + > + /* enable SPT PORTE hot plug */ > + if (HAS_PCH_SPT(dev)) { > + hotplug = I915_READ(PCH_PORT_HOTPLUG2); > + hotplug |= PORTE_HOTPLUG_ENABLE; > + I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); > + } > } > > static void bxt_hpd_irq_setup(struct drm_device *dev) > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 1fa0554..7187383 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -5958,6 +5958,7 @@ enum skl_disp_power_wells { > #define SDE_AUXC_CPT (1 << 26) > #define SDE_AUXB_CPT (1 << 25) > #define SDE_AUX_MASK_CPT (7 << 25) > +#define SDE_PORTE_HOTPLUG_SPT (1 << 25) > #define SDE_PORTD_HOTPLUG_CPT (1 << 23) > #define SDE_PORTC_HOTPLUG_CPT (1 << 22) > #define SDE_PORTB_HOTPLUG_CPT (1 << 21) > @@ -5968,6 +5969,10 @@ enum skl_disp_power_wells { > SDE_PORTD_HOTPLUG_CPT | \ > SDE_PORTC_HOTPLUG_CPT | \ > SDE_PORTB_HOTPLUG_CPT) > +#define SDE_HOTPLUG_MASK_SPT (SDE_PORTE_HOTPLUG_SPT | \ > + SDE_PORTD_HOTPLUG_CPT | \ > + SDE_PORTC_HOTPLUG_CPT | \ > + SDE_PORTB_HOTPLUG_CPT) > #define SDE_GMBUS_CPT (1 << 17) > #define SDE_ERROR_CPT (1 << 16) > #define SDE_AUDIO_CP_REQ_C_CPT (1 << 10) > @@ -6039,6 +6044,13 @@ enum skl_disp_power_wells { > #define PORTB_HOTPLUG_SHORT_DETECT (1 << 0) > #define PORTB_HOTPLUG_LONG_DETECT (2 << 0) > > +#define PCH_PORT_HOTPLUG2 0xc403C /* SHOTPLUG_CTL2 */ > +#define PORTE_HOTPLUG_ENABLE (1 << 4) > +#define PORTE_HOTPLUG_STATUS_MASK (0x3 << 0) > +#define PORTE_HOTPLUG_NO_DETECT (0 << 0) > +#define PORTE_HOTPLUG_SHORT_DETECT (1 << 0) > +#define PORTE_HOTPLUG_LONG_DETECT (2 << 0) > + > #define PCH_GPIOA 0xc5010 > #define PCH_GPIOB 0xc5014 > #define PCH_GPIOC 0xc5018 > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index f604ce1..5510eb8c 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -1098,6 +1098,9 @@ bool ibx_digital_port_connected(struct drm_i915_private *dev_priv, > case PORT_D: > bit = SDE_PORTD_HOTPLUG_CPT; > break; > + case PORT_E: > + bit = SDE_PORTE_HOTPLUG_SPT; > + break; > default: > return true; > } > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index b905c19..4776f87 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -5916,6 +5916,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, > case PORT_D: > intel_encoder->hpd_pin = HPD_PORT_D; > break; > + case PORT_E: > + intel_encoder->hpd_pin = HPD_PORT_E; > + break; > default: > BUG(); > } > diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c > index 032a0bf..53c0173 100644 > --- a/drivers/gpu/drm/i915/intel_hotplug.c > +++ b/drivers/gpu/drm/i915/intel_hotplug.c > @@ -91,6 +91,9 @@ bool intel_hpd_pin_to_port(enum hpd_pin pin, enum port *port) > case HPD_PORT_D: > *port = PORT_D; > return true; > + case HPD_PORT_E: > + *port = PORT_E; > + return true; > default: > return false; /* no hpd */ > } > -- > 2.1.4 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Jani Nikula, Intel Open Source Technology Center _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx