Message ID | 1439798150-12603-1-git-send-email-xiong.y.zhang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 17 Aug 2015, Xiong Zhang <xiong.y.zhang@intel.com> 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@intel.com> > Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> > Tested-by: Timo Aaltonen <timo.aaltonen@canonical.com> 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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
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 */ }