Great! Reviewed-by: Rodrigo Vivi <rodrigo.v...@intel.com>
On Thu, Aug 6, 2015 at 12:45 AM Xiong Zhang <xiong.y.zh...@intel.com> wrote: > Signed-off-by: Xiong Zhang <xiong.y.zh...@intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/i915_irq.c | 49 > +++++++++++++++++++++++++++++++++--- > drivers/gpu/drm/i915/i915_reg.h | 12 +++++++++ > drivers/gpu/drm/i915/intel_display.c | 2 ++ > 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 8d50d4f..6d93334 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -214,6 +214,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 1118c39..420cf5a 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, > @@ -1252,6 +1259,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; > } > @@ -1752,7 +1761,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; > @@ -1760,9 +1774,24 @@ 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); > } > > @@ -2984,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) > @@ -3005,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 3a77678..cdd2244 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -5940,6 +5940,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) > @@ -5950,6 +5951,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) > @@ -6021,6 +6026,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 ea10fa8..5009b01 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -1098,6 +1098,8 @@ 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; > default: > return true; > } > diff --git a/drivers/gpu/drm/i915/intel_dp.c > b/drivers/gpu/drm/i915/intel_dp.c > index 0643a91..3b5c0ee 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -5823,6 +5823,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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx >
_______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx