diff mbox

[5/6] drm/i915/skl: enable DDIE hotplug

Message ID 1438847501-28454-5-git-send-email-xiong.y.zhang@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhang, Xiong Y Aug. 6, 2015, 7:51 a.m. UTC
Signed-off-by: Xiong Zhang <xiong.y.zhang@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(-)

Comments

Rodrigo Vivi Aug. 8, 2015, 12:06 a.m. UTC | #1
Great!

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>


On Thu, Aug 6, 2015 at 12:45 AM Xiong Zhang <xiong.y.zhang@intel.com> wrote:

> Signed-off-by: Xiong Zhang <xiong.y.zhang@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
>
diff mbox

Patch

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 */
 	}