Re: [PATCH 5/6 v3] drm/i915/skl: enable DDI-E hotplug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux