[Intel-xe] [PATCH 4/4] fixup! drm/xe/display: Implement display support

Jani Nikula jani.nikula at intel.com
Wed May 17 08:04:16 UTC 2023


On Tue, 16 May 2023, Rodrigo Vivi <rodrigo.vivi at kernel.org> wrote:
> On Tue, May 16, 2023 at 04:32:34PM +0300, Jani Nikula wrote:
>> Use hotplug irq code from i915 display/intel_hotplug_irq.c instead of
>> copy-paste.
>> 
>> For now, need to add ilk_update_display_irq() and bdw_update_port_irq()
>> to xe display/ext/i915_irq.c.
>
> will we able to get rid of them?

Those are part of intel_display_irq.c, but there were some hiccups in
getting that to build, so I left it for later.

> anyway good clean-up already:
>
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

Thanks, pushed.

BR,
Jani.

>
>
>> 
>> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
>
>
>> ---
>>  drivers/gpu/drm/xe/Makefile                   |   1 +
>>  .../gpu/drm/xe/compat-i915-headers/i915_drv.h |   1 +
>>  drivers/gpu/drm/xe/display/ext/i915_irq.c     | 579 ++----------------
>>  drivers/gpu/drm/xe/display/ext/i915_irq.h     |  11 +-
>>  drivers/gpu/drm/xe/xe_device_types.h          |   6 +-
>>  5 files changed, 58 insertions(+), 540 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>> index b6c41cd7dbe3..5418281b4f89 100644
>> --- a/drivers/gpu/drm/xe/Makefile
>> +++ b/drivers/gpu/drm/xe/Makefile
>> @@ -178,6 +178,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
>>  	i915-display/intel_hdcp.o \
>>  	i915-display/intel_hdmi.o \
>>  	i915-display/intel_hotplug.o \
>> +	i915-display/intel_hotplug_irq.o \
>>  	i915-display/intel_hti.o \
>>  	i915-display/intel_lspcon.o \
>>  	i915-display/intel_modeset_setup.o \
>> diff --git a/drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h b/drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h
>> index ddc0ad39b154..74e6f063f741 100644
>> --- a/drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h
>> +++ b/drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h
>> @@ -101,6 +101,7 @@ static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
>>  #define HAS_DSC(xe) ((xe)->info.display.has_dsc)
>>  #define HAS_CUR_FBC(xe) (xe || 1)
>>  #define HAS_DOUBLE_BUFFERED_M_N(xe) ((xe) || 1)
>> +#define I915_HAS_HOTPLUG(xe) (true)
>>  #define HAS_D12_PLANE_MINIMIZATION(dev_priv) (IS_ROCKETLAKE(dev_priv) || \
>>  					      IS_ALDERLAKE_S(dev_priv))
>>  #define DISPLAY_VER(xe) ((xe)->info.display.ver)
>> diff --git a/drivers/gpu/drm/xe/display/ext/i915_irq.c b/drivers/gpu/drm/xe/display/ext/i915_irq.c
>> index afde97b6faa6..a0f22bd52549 100644
>> --- a/drivers/gpu/drm/xe/display/ext/i915_irq.c
>> +++ b/drivers/gpu/drm/xe/display/ext/i915_irq.c
>> @@ -34,17 +34,18 @@
>>  
>>  #include <drm/drm_drv.h>
>>  
>> +#include "i915_drv.h"
>> +#include "i915_reg.h"
>>  #include "icl_dsi_regs.h"
>>  #include "intel_display_trace.h"
>>  #include "intel_display_types.h"
>> +#include "intel_dp_aux.h"
>>  #include "intel_fifo_underrun.h"
>>  #include "intel_hotplug.h"
>> +#include "intel_hotplug_irq.h"
>>  #include "intel_lpe_audio.h"
>>  #include "intel_psr.h"
>>  #include "intel_psr_regs.h"
>> -
>> -#include "i915_drv.h"
>> -#include "i915_reg.h"
>>  #include "intel_uncore.h"
>>  
>>  static u32 raw_reg_read(void __iomem *base, i915_reg_t reg)
>> @@ -149,55 +150,6 @@ static inline void pmu_irq_stats(struct drm_i915_private *i915,
>>  {
>>  }
>>  
>> -typedef bool (*long_pulse_detect_func)(enum hpd_pin pin, u32 val);
>> -typedef u32 (*hotplug_enables_func)(struct intel_encoder *encoder);
>> -typedef u32 (*hotplug_mask_func)(enum hpd_pin pin);
>> -
>> -static const u32 hpd_gen11[HPD_NUM_PINS] = {
>> -	[HPD_PORT_TC1] = GEN11_TC_HOTPLUG(HPD_PORT_TC1) | GEN11_TBT_HOTPLUG(HPD_PORT_TC1),
>> -	[HPD_PORT_TC2] = GEN11_TC_HOTPLUG(HPD_PORT_TC2) | GEN11_TBT_HOTPLUG(HPD_PORT_TC2),
>> -	[HPD_PORT_TC3] = GEN11_TC_HOTPLUG(HPD_PORT_TC3) | GEN11_TBT_HOTPLUG(HPD_PORT_TC3),
>> -	[HPD_PORT_TC4] = GEN11_TC_HOTPLUG(HPD_PORT_TC4) | GEN11_TBT_HOTPLUG(HPD_PORT_TC4),
>> -	[HPD_PORT_TC5] = GEN11_TC_HOTPLUG(HPD_PORT_TC5) | GEN11_TBT_HOTPLUG(HPD_PORT_TC5),
>> -	[HPD_PORT_TC6] = GEN11_TC_HOTPLUG(HPD_PORT_TC6) | GEN11_TBT_HOTPLUG(HPD_PORT_TC6),
>> -};
>> -
>> -static const u32 hpd_icp[HPD_NUM_PINS] = {
>> -	[HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_A),
>> -	[HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_B),
>> -	[HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_C),
>> -	[HPD_PORT_TC1] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC1),
>> -	[HPD_PORT_TC2] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC2),
>> -	[HPD_PORT_TC3] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC3),
>> -	[HPD_PORT_TC4] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC4),
>> -	[HPD_PORT_TC5] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC5),
>> -	[HPD_PORT_TC6] = SDE_TC_HOTPLUG_ICP(HPD_PORT_TC6),
>> -};
>> -
>> -static const u32 hpd_sde_dg1[HPD_NUM_PINS] = {
>> -	[HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_A),
>> -	[HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_B),
>> -	[HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_C),
>> -	[HPD_PORT_D] = SDE_DDI_HOTPLUG_ICP(HPD_PORT_D),
>> -	[HPD_PORT_TC1] = SDE_TC_HOTPLUG_DG2(HPD_PORT_TC1),
>> -};
>> -
>> -static void intel_hpd_init_pins(struct drm_i915_private *dev_priv)
>> -{
>> -	struct intel_hotplug *hpd = &dev_priv->display.hotplug;
>> -
>> -	hpd->hpd = hpd_gen11;
>> -
>> -	if ((INTEL_PCH_TYPE(dev_priv) < PCH_DG1) &&
>> -	    (!HAS_PCH_SPLIT(dev_priv) || HAS_PCH_NOP(dev_priv)))
>> -		return;
>> -
>> -	if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
>> -		hpd->pch_hpd = hpd_sde_dg1;
>> -	else
>> -		hpd->pch_hpd = hpd_icp;
>> -}
>> -
>>  static void
>>  intel_handle_vblank(struct drm_i915_private *dev_priv, enum pipe pipe)
>>  {
>> @@ -206,42 +158,49 @@ intel_handle_vblank(struct drm_i915_private *dev_priv, enum pipe pipe)
>>  	drm_crtc_handle_vblank(&crtc->base);
>>  }
>>  
>> -/* For display hotplug interrupt */
>> -static inline void
>> -i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv,
>> -				     u32 mask,
>> -				     u32 bits)
>> +void ilk_update_display_irq(struct drm_i915_private *dev_priv,
>> +			    u32 interrupt_mask, u32 enabled_irq_mask)
>>  {
>> -	u32 val;
>> +	u32 new_val;
>>  
>>  	lockdep_assert_held(&dev_priv->irq_lock);
>> -	drm_WARN_ON(&dev_priv->drm, bits & ~mask);
>> +	drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
>> +
>> +	new_val = dev_priv->irq_mask;
>> +	new_val &= ~interrupt_mask;
>> +	new_val |= (~enabled_irq_mask & interrupt_mask);
>>  
>> -	val = intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_EN);
>> -	val &= ~mask;
>> -	val |= bits;
>> -	intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_EN, val);
>> +	if (new_val != dev_priv->irq_mask &&
>> +	    !drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv))) {
>> +		dev_priv->irq_mask = new_val;
>> +		intel_uncore_write(&dev_priv->uncore, DEIMR, dev_priv->irq_mask);
>> +		intel_uncore_posting_read(&dev_priv->uncore, DEIMR);
>> +	}
>>  }
>>  
>> -/**
>> - * i915_hotplug_interrupt_update - update hotplug interrupt enable
>> - * @dev_priv: driver private
>> - * @mask: bits to update
>> - * @bits: bits to enable
>> - * NOTE: the HPD enable bits are modified both inside and outside
>> - * of an interrupt context. To avoid that read-modify-write cycles
>> - * interfer, these bits are protected by a spinlock. Since this
>> - * function is usually not called from a context where the lock is
>> - * held already, this function acquires the lock itself. A non-locking
>> - * version is also available.
>> - */
>> -void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv,
>> -				   u32 mask,
>> -				   u32 bits)
>> +void bdw_update_port_irq(struct drm_i915_private *dev_priv,
>> +			 u32 interrupt_mask, u32 enabled_irq_mask)
>>  {
>> -	spin_lock_irq(&dev_priv->irq_lock);
>> -	i915_hotplug_interrupt_update_locked(dev_priv, mask, bits);
>> -	spin_unlock_irq(&dev_priv->irq_lock);
>> +	u32 new_val;
>> +	u32 old_val;
>> +
>> +	lockdep_assert_held(&dev_priv->irq_lock);
>> +
>> +	drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
>> +
>> +	if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
>> +		return;
>> +
>> +	old_val = intel_uncore_read(&dev_priv->uncore, GEN8_DE_PORT_IMR);
>> +
>> +	new_val = old_val;
>> +	new_val &= ~interrupt_mask;
>> +	new_val |= (~enabled_irq_mask & interrupt_mask);
>> +
>> +	if (new_val != old_val) {
>> +		intel_uncore_write(&dev_priv->uncore, GEN8_DE_PORT_IMR, new_val);
>> +		intel_uncore_posting_read(&dev_priv->uncore, GEN8_DE_PORT_IMR);
>> +	}
>>  }
>>  
>>  /**
>> @@ -287,11 +246,12 @@ void bdw_disable_pipe_irq(struct drm_i915_private *i915,
>>  	bdw_update_pipe_irq(i915, pipe, bits, 0);
>>  }
>>  
>> -static void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
>> -					 u32 interrupt_mask,
>> -					 u32 enabled_irq_mask)
>> +void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
>> +				  u32 interrupt_mask,
>> +				  u32 enabled_irq_mask)
>>  {
>>  	u32 sdeimr = intel_uncore_read(&dev_priv->uncore, SDEIMR);
>> +
>>  	sdeimr &= ~interrupt_mask;
>>  	sdeimr |= (~enabled_irq_mask & interrupt_mask);
>>  
>> @@ -343,142 +303,6 @@ u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv,
>>  	BUG_ON(1); /* Not to be called */
>>  }
>>  
>> -
>> -static bool gen11_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
>> -{
>> -	switch (pin) {
>> -	case HPD_PORT_TC1:
>> -	case HPD_PORT_TC2:
>> -	case HPD_PORT_TC3:
>> -	case HPD_PORT_TC4:
>> -	case HPD_PORT_TC5:
>> -	case HPD_PORT_TC6:
>> -		return val & GEN11_HOTPLUG_CTL_LONG_DETECT(pin);
>> -	default:
>> -		return false;
>> -	}
>> -}
>> -
>> -static bool icp_ddi_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
>> -{
>> -	switch (pin) {
>> -	case HPD_PORT_A:
>> -	case HPD_PORT_B:
>> -	case HPD_PORT_C:
>> -	case HPD_PORT_D:
>> -		return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(pin);
>> -	default:
>> -		return false;
>> -	}
>> -}
>> -
>> -static bool icp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
>> -{
>> -	switch (pin) {
>> -	case HPD_PORT_TC1:
>> -	case HPD_PORT_TC2:
>> -	case HPD_PORT_TC3:
>> -	case HPD_PORT_TC4:
>> -	case HPD_PORT_TC5:
>> -	case HPD_PORT_TC6:
>> -		return val & ICP_TC_HPD_LONG_DETECT(pin);
>> -	default:
>> -		return false;
>> -	}
>> -}
>> -
>> -/*
>> - * Get a bit mask of pins that have triggered, and which ones may be long.
>> - * This can be called multiple times with the same masks to accumulate
>> - * hotplug detection results from several registers.
>> - *
>> - * Note that the caller is expected to zero out the masks initially.
>> - */
>> -static void intel_get_hpd_pins(struct drm_i915_private *dev_priv,
>> -			       u32 *pin_mask, u32 *long_mask,
>> -			       u32 hotplug_trigger, u32 dig_hotplug_reg,
>> -			       const u32 hpd[HPD_NUM_PINS],
>> -			       bool long_pulse_detect(enum hpd_pin pin, u32 val))
>> -{
>> -	enum hpd_pin pin;
>> -
>> -	BUILD_BUG_ON(BITS_PER_TYPE(*pin_mask) < HPD_NUM_PINS);
>> -
>> -	for_each_hpd_pin(pin) {
>> -		if ((hpd[pin] & hotplug_trigger) == 0)
>> -			continue;
>> -
>> -		*pin_mask |= BIT(pin);
>> -
>> -		if (long_pulse_detect(pin, dig_hotplug_reg))
>> -			*long_mask |= BIT(pin);
>> -	}
>> -
>> -	drm_dbg(&dev_priv->drm,
>> -		"hotplug event received, stat 0x%08x, dig 0x%08x, pins 0x%08x, long 0x%08x\n",
>> -		hotplug_trigger, dig_hotplug_reg, *pin_mask, *long_mask);
>> -
>> -}
>> -
>> -static u32 intel_hpd_enabled_irqs(struct drm_i915_private *dev_priv,
>> -				  const u32 hpd[HPD_NUM_PINS])
>> -{
>> -	struct intel_encoder *encoder;
>> -	u32 enabled_irqs = 0;
>> -
>> -	for_each_intel_encoder(&dev_priv->drm, encoder)
>> -		if (dev_priv->display.hotplug.stats[encoder->hpd_pin].state == HPD_ENABLED)
>> -			enabled_irqs |= hpd[encoder->hpd_pin];
>> -
>> -	return enabled_irqs;
>> -}
>> -
>> -static u32 intel_hpd_hotplug_irqs(struct drm_i915_private *dev_priv,
>> -				  const u32 hpd[HPD_NUM_PINS])
>> -{
>> -	struct intel_encoder *encoder;
>> -	u32 hotplug_irqs = 0;
>> -
>> -	for_each_intel_encoder(&dev_priv->drm, encoder)
>> -		hotplug_irqs |= hpd[encoder->hpd_pin];
>> -
>> -	return hotplug_irqs;
>> -}
>> -
>> -static u32 intel_hpd_hotplug_mask(struct drm_i915_private *i915,
>> -				  hotplug_mask_func hotplug_mask)
>> -{
>> -	enum hpd_pin pin;
>> -	u32 hotplug = 0;
>> -
>> -	for_each_hpd_pin(pin)
>> -		hotplug |= hotplug_mask(pin);
>> -
>> -	return hotplug;
>> -}
>> -
>> -static u32 intel_hpd_hotplug_enables(struct drm_i915_private *i915,
>> -				     hotplug_enables_func hotplug_enables)
>> -{
>> -	struct intel_encoder *encoder;
>> -	u32 hotplug = 0;
>> -
>> -	for_each_intel_encoder(&i915->drm, encoder)
>> -		hotplug |= hotplug_enables(encoder);
>> -
>> -	return hotplug;
>> -}
>> -
>> -static void gmbus_irq_handler(struct drm_i915_private *dev_priv)
>> -{
>> -	wake_up_all(&dev_priv->display.gmbus.wait_queue);
>> -}
>> -
>> -static void dp_aux_irq_handler(struct drm_i915_private *dev_priv)
>> -{
>> -	wake_up_all(&dev_priv->display.gmbus.wait_queue);
>> -}
>> -
>>  #if defined(CONFIG_DEBUG_FS)
>>  static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
>>  					 enum pipe pipe,
>> @@ -548,80 +372,6 @@ static void hsw_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
>>  				     0, 0, 0, 0);
>>  }
>>  
>> -static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
>> -{
>> -	u32 ddi_hotplug_trigger = pch_iir & SDE_DDI_HOTPLUG_MASK_ICP;
>> -	u32 tc_hotplug_trigger = pch_iir & SDE_TC_HOTPLUG_MASK_ICP;
>> -	u32 pin_mask = 0, long_mask = 0;
>> -
>> -	if (ddi_hotplug_trigger) {
>> -		u32 dig_hotplug_reg;
>> -
>> -		dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_DDI);
>> -		intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_DDI, dig_hotplug_reg);
>> -
>> -		intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
>> -				   ddi_hotplug_trigger, dig_hotplug_reg,
>> -				   dev_priv->display.hotplug.pch_hpd,
>> -				   icp_ddi_port_hotplug_long_detect);
>> -	}
>> -
>> -	if (tc_hotplug_trigger) {
>> -		u32 dig_hotplug_reg;
>> -
>> -		dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_TC);
>> -		intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_TC, dig_hotplug_reg);
>> -
>> -		intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
>> -				   tc_hotplug_trigger, dig_hotplug_reg,
>> -				   dev_priv->display.hotplug.pch_hpd,
>> -				   icp_tc_port_hotplug_long_detect);
>> -	}
>> -
>> -	if (pin_mask)
>> -		intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
>> -
>> -	if (pch_iir & SDE_GMBUS_ICP)
>> -		gmbus_irq_handler(dev_priv);
>> -}
>> -
>> -static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
>> -{
>> -	u32 pin_mask = 0, long_mask = 0;
>> -	u32 trigger_tc = iir & GEN11_DE_TC_HOTPLUG_MASK;
>> -	u32 trigger_tbt = iir & GEN11_DE_TBT_HOTPLUG_MASK;
>> -
>> -	if (trigger_tc) {
>> -		u32 dig_hotplug_reg;
>> -
>> -		dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL);
>> -		intel_uncore_write(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg);
>> -
>> -		intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
>> -				   trigger_tc, dig_hotplug_reg,
>> -				   dev_priv->display.hotplug.hpd,
>> -				   gen11_port_hotplug_long_detect);
>> -	}
>> -
>> -	if (trigger_tbt) {
>> -		u32 dig_hotplug_reg;
>> -
>> -		dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL);
>> -		intel_uncore_write(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg);
>> -
>> -		intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
>> -				   trigger_tbt, dig_hotplug_reg,
>> -				   dev_priv->display.hotplug.hpd,
>> -				   gen11_port_hotplug_long_detect);
>> -	}
>> -
>> -	if (pin_mask)
>> -		intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
>> -	else
>> -		drm_err(&dev_priv->drm,
>> -			"Unexpected DE HPD interrupt 0x%08x\n", iir);
>> -}
>> -
>>  static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)
>>  {
>>  	u32 mask;
>> @@ -833,7 +583,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
>>  			ret = IRQ_HANDLED;
>>  
>>  			if (iir & gen8_de_port_aux_mask(dev_priv)) {
>> -				dp_aux_irq_handler(dev_priv);
>> +				intel_dp_aux_irq_handler(dev_priv);
>>  				found = true;
>>  			}
>>  
>> @@ -1074,202 +824,6 @@ void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
>>  	intel_synchronize_irq(dev_priv);
>>  }
>>  
>> -static u32 icp_ddi_hotplug_mask(enum hpd_pin hpd_pin)
>> -{
>> -	switch (hpd_pin) {
>> -	case HPD_PORT_A:
>> -	case HPD_PORT_B:
>> -	case HPD_PORT_C:
>> -	case HPD_PORT_D:
>> -		return SHOTPLUG_CTL_DDI_HPD_ENABLE(hpd_pin);
>> -	default:
>> -		return 0;
>> -	}
>> -}
>> -
>> -static u32 icp_ddi_hotplug_enables(struct intel_encoder *encoder)
>> -{
>> -	return icp_ddi_hotplug_mask(encoder->hpd_pin);
>> -}
>> -
>> -static u32 icp_tc_hotplug_mask(enum hpd_pin hpd_pin)
>> -{
>> -	switch (hpd_pin) {
>> -	case HPD_PORT_TC1:
>> -	case HPD_PORT_TC2:
>> -	case HPD_PORT_TC3:
>> -	case HPD_PORT_TC4:
>> -	case HPD_PORT_TC5:
>> -	case HPD_PORT_TC6:
>> -		return ICP_TC_HPD_ENABLE(hpd_pin);
>> -	default:
>> -		return 0;
>> -	}
>> -}
>> -
>> -static u32 icp_tc_hotplug_enables(struct intel_encoder *encoder)
>> -{
>> -	return icp_tc_hotplug_mask(encoder->hpd_pin);
>> -}
>> -
>> -static void icp_ddi_hpd_detection_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI,
>> -			 intel_hpd_hotplug_mask(dev_priv, icp_ddi_hotplug_mask),
>> -			 intel_hpd_hotplug_enables(dev_priv, icp_ddi_hotplug_enables));
>> -}
>> -
>> -static void icp_ddi_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>> -
>> -	intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI,
>> -			 icp_ddi_hotplug_mask(encoder->hpd_pin),
>> -			 icp_ddi_hotplug_enables(encoder));
>> -}
>> -
>> -static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC,
>> -			 intel_hpd_hotplug_mask(dev_priv, icp_tc_hotplug_mask),
>> -			 intel_hpd_hotplug_enables(dev_priv, icp_tc_hotplug_enables));
>> -}
>> -
>> -static void icp_tc_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>> -
>> -	intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC,
>> -			 icp_tc_hotplug_mask(encoder->hpd_pin),
>> -			 icp_tc_hotplug_enables(encoder));
>> -}
>> -
>> -static void icp_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	icp_ddi_hpd_enable_detection(encoder);
>> -	icp_tc_hpd_enable_detection(encoder);
>> -}
>> -
>> -static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	u32 hotplug_irqs, enabled_irqs;
>> -
>> -	enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd);
>> -	hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.pch_hpd);
>> -
>> -	if (INTEL_PCH_TYPE(dev_priv) <= PCH_TGP)
>> -		intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
>> -
>> -	ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
>> -
>> -	icp_ddi_hpd_detection_setup(dev_priv);
>> -	icp_tc_hpd_detection_setup(dev_priv);
>> -}
>> -
>> -static u32 gen11_hotplug_mask(enum hpd_pin hpd_pin)
>> -{
>> -	switch (hpd_pin) {
>> -	case HPD_PORT_TC1:
>> -	case HPD_PORT_TC2:
>> -	case HPD_PORT_TC3:
>> -	case HPD_PORT_TC4:
>> -	case HPD_PORT_TC5:
>> -	case HPD_PORT_TC6:
>> -		return GEN11_HOTPLUG_CTL_ENABLE(hpd_pin);
>> -	default:
>> -		return 0;
>> -	}
>> -}
>> -
>> -static u32 gen11_hotplug_enables(struct intel_encoder *encoder)
>> -{
>> -	return gen11_hotplug_mask(encoder->hpd_pin);
>> -}
>> -
>> -static void dg1_hpd_invert(struct drm_i915_private *dev_priv)
>> -{
>> -	u32 val = (INVERT_DDIA_HPD |
>> -		   INVERT_DDIB_HPD |
>> -		   INVERT_DDIC_HPD |
>> -		   INVERT_DDID_HPD);
>> -	intel_uncore_rmw(&dev_priv->uncore, SOUTH_CHICKEN1, 0, val);
>> -}
>> -
>> -static void dg1_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>> -
>> -	dg1_hpd_invert(i915);
>> -	icp_hpd_enable_detection(encoder);
>> -}
>> -
>> -static void dg1_hpd_irq_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	dg1_hpd_invert(dev_priv);
>> -	icp_hpd_irq_setup(dev_priv);
>> -}
>> -
>> -static void gen11_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL,
>> -			 intel_hpd_hotplug_mask(dev_priv, gen11_hotplug_mask),
>> -			 intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables));
>> -}
>> -
>> -static void gen11_tc_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>> -
>> -	intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL,
>> -			 gen11_hotplug_mask(encoder->hpd_pin),
>> -			 gen11_hotplug_enables(encoder));
>> -}
>> -
>> -static void gen11_tbt_hpd_detection_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL,
>> -			 intel_hpd_hotplug_mask(dev_priv, gen11_hotplug_mask),
>> -			 intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables));
>> -}
>> -
>> -static void gen11_tbt_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>> -
>> -	intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL,
>> -			 gen11_hotplug_mask(encoder->hpd_pin),
>> -			 gen11_hotplug_enables(encoder));
>> -}
>> -
>> -static void gen11_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>> -
>> -	gen11_tc_hpd_enable_detection(encoder);
>> -	gen11_tbt_hpd_enable_detection(encoder);
>> -
>> -	if (INTEL_PCH_TYPE(i915) >= PCH_ICP)
>> -		icp_hpd_enable_detection(encoder);
>> -}
>> -
>> -static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
>> -{
>> -	u32 hotplug_irqs, enabled_irqs;
>> -
>> -	enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.hpd);
>> -	hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.hpd);
>> -
>> -	intel_uncore_rmw(&dev_priv->uncore, GEN11_DE_HPD_IMR, hotplug_irqs,
>> -			 ~enabled_irqs & hotplug_irqs);
>> -	intel_uncore_posting_read(&dev_priv->uncore, GEN11_DE_HPD_IMR);
>> -
>> -	gen11_tc_hpd_detection_setup(dev_priv);
>> -	gen11_tbt_hpd_detection_setup(dev_priv);
>> -
>> -	if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
>> -		icp_hpd_irq_setup(dev_priv);
>> -}
>> -
>>  static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
>>  {
>>  	u32 de_pipe_masked = gen8_de_pipe_fault_mask(dev_priv) |
>> @@ -1363,38 +917,6 @@ void gen11_display_irq_postinstall(struct drm_i915_private *dev_priv)
>>  	gen11_de_irq_postinstall(dev_priv);
>>  }
>>  
>> -struct intel_hotplug_funcs {
>> -	/* Enable HPD sense and interrupts for all present encoders */
>> -	void (*hpd_irq_setup)(struct drm_i915_private *i915);
>> -	/* Enable HPD sense for a single encoder */
>> -	void (*hpd_enable_detection)(struct intel_encoder *encoder);
>> -};
>> -
>> -#define HPD_FUNCS(platform)					 \
>> -static const struct intel_hotplug_funcs platform##_hpd_funcs = { \
>> -	.hpd_irq_setup = platform##_hpd_irq_setup,		 \
>> -	.hpd_enable_detection = platform##_hpd_enable_detection, \
>> -}
>> -
>> -HPD_FUNCS(dg1);
>> -HPD_FUNCS(gen11);
>> -HPD_FUNCS(icp);
>> -#undef HPD_FUNCS
>> -
>> -void intel_hpd_enable_detection(struct intel_encoder *encoder)
>> -{
>> -	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>> -
>> -	if (i915->display.funcs.hotplug)
>> -		i915->display.funcs.hotplug->hpd_enable_detection(encoder);
>> -}
>> -
>> -void intel_hpd_irq_setup(struct drm_i915_private *i915)
>> -{
>> -	if (i915->display_irqs_enabled && i915->display.funcs.hotplug)
>> -		i915->display.funcs.hotplug->hpd_irq_setup(i915);
>> -}
>> -
>>  void intel_display_irq_init(struct drm_i915_private *dev_priv)
>>  {
>>  	struct drm_device *dev = &dev_priv->drm;
>> @@ -1402,10 +924,6 @@ void intel_display_irq_init(struct drm_i915_private *dev_priv)
>>  	if (!HAS_DISPLAY(dev_priv))
>>  		return;
>>  
>> -	intel_hpd_init_pins(dev_priv);
>> -
>> -	intel_hpd_init_early(dev_priv);
>> -
>>  	dev->vblank_disable_immediate = true;
>>  
>>  	/* Most platforms treat the display irq block as an always-on
>> @@ -1418,12 +936,7 @@ void intel_display_irq_init(struct drm_i915_private *dev_priv)
>>  	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
>>  		dev_priv->display_irqs_enabled = false;
>>  
>> -	if (HAS_PCH_DG2(dev_priv))
>> -		dev_priv->display.funcs.hotplug = &icp_hpd_funcs;
>> -	else if (HAS_PCH_DG1(dev_priv))
>> -		dev_priv->display.funcs.hotplug = &dg1_hpd_funcs;
>> -	else if (DISPLAY_VER(dev_priv) >= 11)
>> -		dev_priv->display.funcs.hotplug = &gen11_hpd_funcs;
>> +	intel_hotplug_irq_init(dev_priv);
>>  }
>>  
>>  void intel_display_irq_uninstall(struct drm_i915_private *dev_priv)
>> diff --git a/drivers/gpu/drm/xe/display/ext/i915_irq.h b/drivers/gpu/drm/xe/display/ext/i915_irq.h
>> index c64926a5a919..829b3dd55096 100644
>> --- a/drivers/gpu/drm/xe/display/ext/i915_irq.h
>> +++ b/drivers/gpu/drm/xe/display/ext/i915_irq.h
>> @@ -40,18 +40,17 @@ static inline void valleyview_disable_display_irqs(struct drm_i915_private *dev_
>>  {
>>  }
>>  
>> -void intel_hpd_enable_detection(struct intel_encoder *encoder);
>> -void intel_hpd_irq_setup(struct drm_i915_private *i915);
>> -void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv,
>> -				   u32 mask,
>> -				   u32 bits);
>> -
>> +void ilk_update_display_irq(struct drm_i915_private *dev_priv,
>> +			    u32 interrupt_mask, u32 enabled_irq_mask);
>>  void ilk_enable_display_irq(struct drm_i915_private *i915, u32 bits);
>>  void ilk_disable_display_irq(struct drm_i915_private *i915, u32 bits);
>>  
>> +void bdw_update_port_irq(struct drm_i915_private *i915, u32 interrupt_mask, u32 enabled_irq_mask);
>>  void bdw_enable_pipe_irq(struct drm_i915_private *i915, enum pipe pipe, u32 bits);
>>  void bdw_disable_pipe_irq(struct drm_i915_private *i915, enum pipe pipe, u32 bits);
>>  
>> +void ibx_display_interrupt_update(struct drm_i915_private *i915,
>> +				  u32 interrupt_mask, u32 enabled_irq_mask);
>>  void ibx_enable_display_interrupt(struct drm_i915_private *i915, u32 bits);
>>  void ibx_disable_display_interrupt(struct drm_i915_private *i915, u32 bits);
>>  
>> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
>> index 6490a04614ce..cbd18b839236 100644
>> --- a/drivers/gpu/drm/xe/xe_device_types.h
>> +++ b/drivers/gpu/drm/xe/xe_device_types.h
>> @@ -307,7 +307,11 @@ struct xe_device {
>>  	struct drm_atomic_state *modeset_restore_state;
>>  	struct list_head global_obj_list;
>>  
>> -	u32 de_irq_mask[I915_MAX_PIPES];
>> +	union {
>> +		/* only to allow build, not used functionally */
>> +		u32 irq_mask;
>> +		u32 de_irq_mask[I915_MAX_PIPES];
>> +	};
>>  	bool display_irqs_enabled;
>>  	u32 enabled_irq_mask;
>>  
>> -- 
>> 2.39.2
>> 

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-xe mailing list