diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 168 | 
1 files changed, 101 insertions, 67 deletions
| diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 1a701367a718..7eefbdec25a2 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -192,13 +192,13 @@ static void intel_hpd_init_pins(struct drm_i915_private *dev_priv)  		return;  	} -	if (INTEL_GEN(dev_priv) >= 11) +	if (DISPLAY_VER(dev_priv) >= 11)  		hpd->hpd = hpd_gen11;  	else if (IS_GEN9_LP(dev_priv))  		hpd->hpd = hpd_bxt; -	else if (INTEL_GEN(dev_priv) >= 8) +	else if (DISPLAY_VER(dev_priv) >= 8)  		hpd->hpd = hpd_bdw; -	else if (INTEL_GEN(dev_priv) >= 7) +	else if (DISPLAY_VER(dev_priv) >= 7)  		hpd->hpd = hpd_ivb;  	else  		hpd->hpd = hpd_ilk; @@ -209,8 +209,7 @@ static void intel_hpd_init_pins(struct drm_i915_private *dev_priv)  	if (HAS_PCH_DG1(dev_priv))  		hpd->pch_hpd = hpd_sde_dg1; -	else if (HAS_PCH_TGP(dev_priv) || HAS_PCH_JSP(dev_priv) || -		 HAS_PCH_ICP(dev_priv) || HAS_PCH_MCC(dev_priv)) +	else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)  		hpd->pch_hpd = hpd_icp;  	else if (HAS_PCH_CNP(dev_priv) || HAS_PCH_SPT(dev_priv))  		hpd->pch_hpd = hpd_spt; @@ -478,7 +477,7 @@ u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv,  	lockdep_assert_held(&dev_priv->irq_lock); -	if (INTEL_GEN(dev_priv) < 5) +	if (DISPLAY_VER(dev_priv) < 5)  		goto out;  	/* @@ -580,7 +579,7 @@ static void i915_enable_asle_pipestat(struct drm_i915_private *dev_priv)  	spin_lock_irq(&dev_priv->irq_lock);  	i915_enable_pipestat(dev_priv, PIPE_B, PIPE_LEGACY_BLC_EVENT_STATUS); -	if (INTEL_GEN(dev_priv) >= 4) +	if (DISPLAY_VER(dev_priv) >= 4)  		i915_enable_pipestat(dev_priv, PIPE_A,  				     PIPE_LEGACY_BLC_EVENT_STATUS); @@ -795,7 +794,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)  	int position, vtotal;  	if (!crtc->active) -		return -1; +		return 0;  	vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];  	mode = &vblank->hwmode; @@ -807,7 +806,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)  	if (mode->flags & DRM_MODE_FLAG_INTERLACE)  		vtotal /= 2; -	if (IS_GEN(dev_priv, 2)) +	if (IS_DISPLAY_VER(dev_priv, 2))  		position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;  	else  		position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; @@ -857,8 +856,8 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,  	int position;  	int vbl_start, vbl_end, hsync_start, htotal, vtotal;  	unsigned long irqflags; -	bool use_scanline_counter = INTEL_GEN(dev_priv) >= 5 || -		IS_G4X(dev_priv) || IS_GEN(dev_priv, 2) || +	bool use_scanline_counter = DISPLAY_VER(dev_priv) >= 5 || +		IS_G4X(dev_priv) || IS_DISPLAY_VER(dev_priv, 2) ||  		crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;  	if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) { @@ -1305,7 +1304,7 @@ static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,  	 * don't trust that one either.  	 */  	if (pipe_crc->skipped <= 0 || -	    (INTEL_GEN(dev_priv) >= 8 && pipe_crc->skipped == 1)) { +	    (DISPLAY_VER(dev_priv) >= 8 && pipe_crc->skipped == 1)) {  		pipe_crc->skipped++;  		spin_unlock(&pipe_crc->lock);  		return; @@ -1367,12 +1366,12 @@ static void i9xx_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,  {  	u32 res1, res2; -	if (INTEL_GEN(dev_priv) >= 3) +	if (DISPLAY_VER(dev_priv) >= 3)  		res1 = intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_RES1_I915(pipe));  	else  		res1 = 0; -	if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) +	if (DISPLAY_VER(dev_priv) >= 5 || IS_G4X(dev_priv))  		res2 = intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_RES2_G4X(pipe));  	else  		res2 = 0; @@ -2078,7 +2077,7 @@ static void ilk_display_irq_handler(struct drm_i915_private *dev_priv,  		intel_uncore_write(&dev_priv->uncore, SDEIIR, pch_iir);  	} -	if (IS_GEN(dev_priv, 5) && de_iir & DE_PCU_EVENT) +	if (IS_DISPLAY_VER(dev_priv, 5) && de_iir & DE_PCU_EVENT)  		gen5_rps_irq_handler(&dev_priv->gt.rps);  } @@ -2095,10 +2094,19 @@ static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,  		ivb_err_int_handler(dev_priv);  	if (de_iir & DE_EDP_PSR_INT_HSW) { -		u32 psr_iir = intel_uncore_read(&dev_priv->uncore, EDP_PSR_IIR); +		struct intel_encoder *encoder; + +		for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) { +			struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + +			u32 psr_iir = intel_uncore_read(&dev_priv->uncore, +							EDP_PSR_IIR); -		intel_psr_irq_handler(dev_priv, psr_iir); -		intel_uncore_write(&dev_priv->uncore, EDP_PSR_IIR, psr_iir); +			intel_psr_irq_handler(intel_dp, psr_iir); +			intel_uncore_write(&dev_priv->uncore, +					   EDP_PSR_IIR, psr_iir); +			break; +		}  	}  	if (de_iir & DE_AUX_CHANNEL_A_IVB) @@ -2176,7 +2184,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)  	de_iir = raw_reg_read(regs, DEIIR);  	if (de_iir) {  		raw_reg_write(regs, DEIIR, de_iir); -		if (INTEL_GEN(i915) >= 7) +		if (DISPLAY_VER(i915) >= 7)  			ivb_display_irq_handler(i915, de_iir);  		else  			ilk_display_irq_handler(i915, de_iir); @@ -2261,7 +2269,7 @@ static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)  {  	u32 mask; -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		return TGL_DE_PORT_AUX_DDIA |  			TGL_DE_PORT_AUX_DDIB |  			TGL_DE_PORT_AUX_DDIC | @@ -2274,15 +2282,15 @@ static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)  	mask = GEN8_AUX_CHANNEL_A; -	if (INTEL_GEN(dev_priv) >= 9) +	if (DISPLAY_VER(dev_priv) >= 9)  		mask |= GEN9_AUX_CHANNEL_B |  			GEN9_AUX_CHANNEL_C |  			GEN9_AUX_CHANNEL_D; -	if (IS_CNL_WITH_PORT_F(dev_priv) || IS_GEN(dev_priv, 11)) +	if (IS_CNL_WITH_PORT_F(dev_priv) || IS_DISPLAY_VER(dev_priv, 11))  		mask |= CNL_AUX_CHANNEL_F; -	if (IS_GEN(dev_priv, 11)) +	if (IS_DISPLAY_VER(dev_priv, 11))  		mask |= ICL_AUX_CHANNEL_E;  	return mask; @@ -2290,11 +2298,11 @@ static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)  static u32 gen8_de_pipe_fault_mask(struct drm_i915_private *dev_priv)  { -	if (IS_ROCKETLAKE(dev_priv)) +	if (HAS_D12_PLANE_MINIMIZATION(dev_priv))  		return RKL_DE_PIPE_IRQ_FAULT_ERRORS; -	else if (INTEL_GEN(dev_priv) >= 11) +	else if (DISPLAY_VER(dev_priv) >= 11)  		return GEN11_DE_PIPE_IRQ_FAULT_ERRORS; -	else if (INTEL_GEN(dev_priv) >= 9) +	else if (DISPLAY_VER(dev_priv) >= 9)  		return GEN9_DE_PIPE_IRQ_FAULT_ERRORS;  	else  		return GEN8_DE_PIPE_IRQ_FAULT_ERRORS; @@ -2311,21 +2319,30 @@ gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)  	}  	if (iir & GEN8_DE_EDP_PSR) { +		struct intel_encoder *encoder;  		u32 psr_iir;  		i915_reg_t iir_reg; -		if (INTEL_GEN(dev_priv) >= 12) -			iir_reg = TRANS_PSR_IIR(dev_priv->psr.transcoder); -		else -			iir_reg = EDP_PSR_IIR; +		for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) { +			struct intel_dp *intel_dp = enc_to_intel_dp(encoder); -		psr_iir = intel_uncore_read(&dev_priv->uncore, iir_reg); -		intel_uncore_write(&dev_priv->uncore, iir_reg, psr_iir); +			if (DISPLAY_VER(dev_priv) >= 12) +				iir_reg = TRANS_PSR_IIR(intel_dp->psr.transcoder); +			else +				iir_reg = EDP_PSR_IIR; + +			psr_iir = intel_uncore_read(&dev_priv->uncore, iir_reg); +			intel_uncore_write(&dev_priv->uncore, iir_reg, psr_iir); -		if (psr_iir) -			found = true; +			if (psr_iir) +				found = true; -		intel_psr_irq_handler(dev_priv, psr_iir); +			intel_psr_irq_handler(intel_dp, psr_iir); + +			/* prior GEN12 only have one EDP PSR */ +			if (DISPLAY_VER(dev_priv) < 12) +				break; +		}  	}  	if (!found) @@ -2391,7 +2408,7 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,  static u32 gen8_de_pipe_flip_done_mask(struct drm_i915_private *i915)  { -	if (INTEL_GEN(i915) >= 9) +	if (DISPLAY_VER(i915) >= 9)  		return GEN9_PIPE_PLANE1_FLIP_DONE;  	else  		return GEN8_PIPE_PRIMARY_FLIP_DONE; @@ -2416,7 +2433,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)  		}  	} -	if (INTEL_GEN(dev_priv) >= 11 && (master_ctl & GEN11_DE_HPD_IRQ)) { +	if (DISPLAY_VER(dev_priv) >= 11 && (master_ctl & GEN11_DE_HPD_IRQ)) {  		iir = intel_uncore_read(&dev_priv->uncore, GEN11_DE_HPD_IIR);  		if (iir) {  			intel_uncore_write(&dev_priv->uncore, GEN11_DE_HPD_IIR, iir); @@ -2462,7 +2479,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)  				found = true;  			} -			if (INTEL_GEN(dev_priv) >= 11) { +			if (DISPLAY_VER(dev_priv) >= 11) {  				u32 te_trigger = iir & (DSI0_TE | DSI1_TE);  				if (te_trigger) { @@ -2792,7 +2809,7 @@ int ilk_enable_vblank(struct drm_crtc *crtc)  	struct drm_i915_private *dev_priv = to_i915(crtc->dev);  	enum pipe pipe = to_intel_crtc(crtc)->pipe;  	unsigned long irqflags; -	u32 bit = INTEL_GEN(dev_priv) >= 7 ? +	u32 bit = DISPLAY_VER(dev_priv) >= 7 ?  		DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);  	spin_lock_irqsave(&dev_priv->irq_lock, irqflags); @@ -2903,7 +2920,7 @@ void ilk_disable_vblank(struct drm_crtc *crtc)  	struct drm_i915_private *dev_priv = to_i915(crtc->dev);  	enum pipe pipe = to_intel_crtc(crtc)->pipe;  	unsigned long irqflags; -	u32 bit = INTEL_GEN(dev_priv) >= 7 ? +	u32 bit = DISPLAY_VER(dev_priv) >= 7 ?  		DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);  	spin_lock_irqsave(&dev_priv->irq_lock, irqflags); @@ -3023,6 +3040,24 @@ static void valleyview_irq_reset(struct drm_i915_private *dev_priv)  	spin_unlock_irq(&dev_priv->irq_lock);  } +static void cnp_display_clock_wa(struct drm_i915_private *dev_priv) +{ +	struct intel_uncore *uncore = &dev_priv->uncore; + +	/* +	 * Wa_14010685332:cnp/cmp,tgp,adp +	 * TODO: Clarify which platforms this applies to +	 * TODO: Figure out if this workaround can be applied in the s0ix suspend/resume handlers as +	 * on earlier platforms and whether the workaround is also needed for runtime suspend/resume +	 */ +	if (INTEL_PCH_TYPE(dev_priv) == PCH_CNP || +	    (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP && INTEL_PCH_TYPE(dev_priv) < PCH_DG1)) { +		intel_uncore_rmw(uncore, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, +				 SBCLK_RUN_REFCLK_DIS); +		intel_uncore_rmw(uncore, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, 0); +	} +} +  static void gen8_irq_reset(struct drm_i915_private *dev_priv)  {  	struct intel_uncore *uncore = &dev_priv->uncore; @@ -3046,6 +3081,8 @@ static void gen8_irq_reset(struct drm_i915_private *dev_priv)  	if (HAS_PCH_SPLIT(dev_priv))  		ibx_irq_reset(dev_priv); + +	cnp_display_clock_wa(dev_priv);  }  static void gen11_display_irq_reset(struct drm_i915_private *dev_priv) @@ -3057,7 +3094,7 @@ static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)  	intel_uncore_write(uncore, GEN11_DISPLAY_INT_CTL, 0); -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		enum transcoder trans;  		for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) { @@ -3087,15 +3124,7 @@ static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)  	if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)  		GEN3_IRQ_RESET(uncore, SDE); -	/* Wa_14010685332:cnp/cmp,tgp,adp */ -	if (INTEL_PCH_TYPE(dev_priv) == PCH_CNP || -	    (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP && -	     INTEL_PCH_TYPE(dev_priv) < PCH_DG1)) { -		intel_uncore_rmw(uncore, SOUTH_CHICKEN1, -				 SBCLK_RUN_REFCLK_DIS, SBCLK_RUN_REFCLK_DIS); -		intel_uncore_rmw(uncore, SOUTH_CHICKEN1, -				 SBCLK_RUN_REFCLK_DIS, 0); -	} +	cnp_display_clock_wa(dev_priv);  }  static void gen11_irq_reset(struct drm_i915_private *dev_priv) @@ -3494,7 +3523,7 @@ static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)  	enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.hpd);  	hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.hpd); -	if (INTEL_GEN(dev_priv) >= 8) +	if (DISPLAY_VER(dev_priv) >= 8)  		bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);  	else  		ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs); @@ -3685,13 +3714,13 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)  		BIT(TRANSCODER_C) | BIT(TRANSCODER_D);  	enum pipe pipe; -	if (INTEL_GEN(dev_priv) <= 10) +	if (DISPLAY_VER(dev_priv) <= 10)  		de_misc_masked |= GEN8_DE_MISC_GSE;  	if (IS_GEN9_LP(dev_priv))  		de_port_masked |= BXT_DE_PORT_GMBUS; -	if (INTEL_GEN(dev_priv) >= 11) { +	if (DISPLAY_VER(dev_priv) >= 11) {  		enum port port;  		if (intel_bios_is_dsi_present(dev_priv, &port)) @@ -3708,7 +3737,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)  	else if (IS_BROADWELL(dev_priv))  		de_port_enables |= BDW_DE_PORT_HOTPLUG_MASK; -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		enum transcoder trans;  		for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) { @@ -3737,7 +3766,7 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)  	GEN3_IRQ_INIT(uncore, GEN8_DE_PORT_, ~de_port_masked, de_port_enables);  	GEN3_IRQ_INIT(uncore, GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked); -	if (INTEL_GEN(dev_priv) >= 11) { +	if (DISPLAY_VER(dev_priv) >= 11) {  		u32 de_hpd_masked = 0;  		u32 de_hpd_enables = GEN11_DE_TC_HOTPLUG_MASK |  				     GEN11_DE_TBT_HOTPLUG_MASK; @@ -3747,9 +3776,19 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)  	}  } +static void icp_irq_postinstall(struct drm_i915_private *dev_priv) +{ +	struct intel_uncore *uncore = &dev_priv->uncore; +	u32 mask = SDE_GMBUS_ICP; + +	GEN3_IRQ_INIT(uncore, SDE, ~mask, 0xffffffff); +} +  static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)  { -	if (HAS_PCH_SPLIT(dev_priv)) +	if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) +		icp_irq_postinstall(dev_priv); +	else if (HAS_PCH_SPLIT(dev_priv))  		ibx_irq_postinstall(dev_priv);  	gen8_gt_irq_postinstall(&dev_priv->gt); @@ -3758,13 +3797,6 @@ static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)  	gen8_master_intr_enable(dev_priv->uncore.regs);  } -static void icp_irq_postinstall(struct drm_i915_private *dev_priv) -{ -	struct intel_uncore *uncore = &dev_priv->uncore; -	u32 mask = SDE_GMBUS_ICP; - -	GEN3_IRQ_INIT(uncore, SDE, ~mask, 0xffffffff); -}  static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)  { @@ -4283,10 +4315,12 @@ void intel_irq_init(struct drm_i915_private *dev_priv)  	} else {  		if (HAS_PCH_DG1(dev_priv))  			dev_priv->display.hpd_irq_setup = dg1_hpd_irq_setup; -		else if (INTEL_GEN(dev_priv) >= 11) +		else if (DISPLAY_VER(dev_priv) >= 11)  			dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;  		else if (IS_GEN9_LP(dev_priv))  			dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup; +		else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) +			dev_priv->display.hpd_irq_setup = icp_hpd_irq_setup;  		else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)  			dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup;  		else @@ -4392,7 +4426,7 @@ static void intel_irq_postinstall(struct drm_i915_private *dev_priv)   */  int intel_irq_install(struct drm_i915_private *dev_priv)  { -	int irq = dev_priv->drm.pdev->irq; +	int irq = to_pci_dev(dev_priv->drm.dev)->irq;  	int ret;  	/* @@ -4427,7 +4461,7 @@ int intel_irq_install(struct drm_i915_private *dev_priv)   */  void intel_irq_uninstall(struct drm_i915_private *dev_priv)  { -	int irq = dev_priv->drm.pdev->irq; +	int irq = to_pci_dev(dev_priv->drm.dev)->irq;  	/*  	 * FIXME we can get called twice during driver probe @@ -4487,5 +4521,5 @@ bool intel_irqs_enabled(struct drm_i915_private *dev_priv)  void intel_synchronize_irq(struct drm_i915_private *i915)  { -	synchronize_irq(i915->drm.pdev->irq); +	synchronize_irq(to_pci_dev(i915->drm.dev)->irq);  } | 
