All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paulo Zanoni <paulo.r.zanoni@intel.com>
To: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
	intel-gfx@lists.freedesktop.org
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Subject: Re: [PATCH 07/27] drm/i915/icl: Interrupt handling
Date: Fri, 19 Jan 2018 16:10:51 -0200	[thread overview]
Message-ID: <1516385451.2673.49.camel@intel.com> (raw)
In-Reply-To: <33fdabce-cf2e-7501-f930-931d232e1bcf@linux.intel.com>

Em Sex, 2018-01-19 às 17:30 +0000, Tvrtko Ursulin escreveu:
> On 10/01/2018 10:16, Joonas Lahtinen wrote:
> > On Tue, 2018-01-09 at 21:23 -0200, Paulo Zanoni wrote:
> > > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > > 
> > > v2: Rebase.
> > > 
> > > v3:
> > >    * Remove DPF, it has been removed from SKL+.
> > >    * Fix -internal rebase wrt. execlists interrupt handling.
> > > 
> > > v4: Rebase.
> > > 
> > > v5:
> > >    * Updated for POR changes. (Daniele Ceraolo Spurio)
> > >    * Merged with irq handling fixes by Daniele Ceraolo Spurio:
> > >        * Simplify the code by using gen8_cs_irq_handler.
> > >        * Fix interrupt handling for the upstream kernel.
> > > 
> > > v6:
> > >    * Remove early bringup debug messages (Tvrtko)
> > >    * Add NB about arbitrary spin wait timeout (Tvrtko)
> > > 
> > > v7 (from Paulo):
> > >    * Don't try to write RO bits to registers.
> > >    * Don't check for PCH types that don't exist. PCH interrupts
> > > are not
> > >      here yet.
> > > 
> > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@inte
> > > l.com>
> > > Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> > > Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > 
> > <SNIP>
> > 
> > > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > > @@ -415,6 +415,9 @@ void gen6_enable_rps_interrupts(struct
> > > drm_i915_private *dev_priv)
> > >   	if (READ_ONCE(rps->interrupts_enabled))
> > >   		return;
> > >   
> > > +	if (WARN_ON_ONCE(IS_GEN11(dev_priv)))
> > > +		return;
> > > +
> > >   	spin_lock_irq(&dev_priv->irq_lock);
> > >   	WARN_ON_ONCE(rps->pm_iir);
> > >   	WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) &
> > > dev_priv->pm_rps_events);
> > > @@ -431,6 +434,9 @@ void gen6_disable_rps_interrupts(struct
> > > drm_i915_private *dev_priv)
> > >   	if (!READ_ONCE(rps->interrupts_enabled))
> > >   		return;
> > >   
> > > +	if (WARN_ON_ONCE(IS_GEN11(dev_priv)))
> > > +		return;
> > > +
> > 
> > These should be GEM_BUG_ON at most and should be the first thing in
> > function.
> 
> That would be a bit unfriendly when you are bringing up the codebase
> and 
> not all pices have been implemented yet. It gets removed later in
> the 
> series, or in a following series, whatever.
> 
> > >   	spin_lock_irq(&dev_priv->irq_lock);
> > >   	rps->interrupts_enabled = false;
> > >   
> > > @@ -2751,6 +2757,131 @@ static void __fini_wedge(struct wedge_me
> > > *w)
> > >   	     (W)->i915;						
> > > 	\
> > >   	     __fini_wedge((W)))
> > >   
> > > +static __always_inline void
> > > +gen11_cs_irq_handler(struct intel_engine_cs *engine, u32 iir)
> > > +{
> > > +	gen8_cs_irq_handler(engine, iir, 0);
> > > +}
> > > +
> > > +static irqreturn_t
> > > +gen11_gt_irq_handler(struct drm_i915_private *dev_priv, u32
> > > master_ctl)
> > 
> > This function could use some readability :)
> 
> Name or body?
> 
> > > +{
> > > +	irqreturn_t ret = IRQ_NONE;
> > > +	u16 irq[2][32];
> > > +	u32 dw, ident;
> > > +	unsigned long tmp;
> > > +	unsigned int bank, bit, engine;
> > > +	unsigned long wait_start, wait_end;
> > > +
> > > +	memset(irq, 0, sizeof(irq));
> > > +
> > > +	for (bank = 0; bank < 2; bank++) {
> > > +		if (master_ctl & GEN11_GT_DW_IRQ(bank)) {
> > 
> > Invert condition and use continue;
> > 
> > > +			dw =
> > > I915_READ_FW(GEN11_GT_INTR_DW(bank));
> > > +			if (!dw)
> > > +				DRM_ERROR("GT_INTR_DW%u
> > > blank!\n", bank);
> > 
> > Probably needs a more appropriate action, GEM_BUG_ON if we've never
> > seen this on HW.
> 
> To early to know. TBD.
> 
> > > +			tmp = dw;
> > > +			for_each_set_bit(bit, &tmp, 32) {
> > > +				I915_WRITE_FW(GEN11_IIR_REG_SELE
> > > CTOR(bank), 1 << bit);
> > 
> > BIT(bit)
> > 
> > + newline here
> 
> Yes sir!
> 
> > 
> > > +				wait_start = local_clock() >>
> > > 10;
> > > +				/* NB: Specs do not specify how
> > > long to spin wait.
> > > +				 * Taking 100us as an educated
> > > guess */
> > > +				wait_end = wait_start + 100;
> > > +				do {
> > > +					ident =
> > > I915_READ_FW(GEN11_INTR_IDENTITY_REG(bank));
> > > +				} while (!(ident &
> > > GEN11_INTR_DATA_VALID) &&
> > > +					 !time_after((unsigned
> > > long)local_clock() >> 10, wait_end));
> > 
> > Uh oh, not a really nice thing to do in IRQ handler :( We should
> > probably look at some actual delay numbers and not do this.
> 
> Too early to know. TBD. Spec wants us to busy poll and doesn't
> specify 
> the timeout. Chris also complained and we chatted about this on IRC, 
> guess you missed this particular stream of conversation.


And so did I. What was the summary of the conversation? What did you
two conclude should be done in this case? Is the current code
acceptable?


> 
> > > +
> > > +				if (!(ident &
> > > GEN11_INTR_DATA_VALID))
> > > +					DRM_ERROR("INTR_IDENTITY
> > > _REG%u:%u timed out!\n",
> > > +						  bank, bit);
> > > +
> > > +				irq[bank][bit] = ident &
> > > GEN11_INTR_ENGINE_MASK;
> > > +				if (!irq[bank][bit])
> > > +					DRM_ERROR("INTR_IDENTITY
> > > _REG%u:%u blank!\n",
> > > +						  bank, bit);
> > 
> > DRM_ERROR again seems like bit of an understatement for interrupt.
> 
> Precedent in "master control interrupt lied" messages. Can be
> revisited 
> when it is known how the real silicon behaves.
> 
> > 
> > + newline here
> > 
> > > +				I915_WRITE_FW(GEN11_INTR_IDENTIT
> > > Y_REG(bank), ident);
> > > +			}
> > 
> > + newline here
> > 
> > > +			I915_WRITE_FW(GEN11_GT_INTR_DW(bank),
> > > dw);
> > > +		}
> > > +	}
> > > +
> > > +	if (irq[0][GEN11_RCS0]) {
> > > +		gen11_cs_irq_handler(dev_priv->engine[RCS],
> > > +				     irq[0][GEN11_RCS0]);
> > > +		ret = IRQ_HANDLED;
> > > +	}
> > > +
> > > +	if (irq[0][GEN11_BCS]) {
> > > +		gen11_cs_irq_handler(dev_priv->engine[BCS],
> > > +				     irq[0][GEN11_BCS]);
> > > +		ret = IRQ_HANDLED;
> > > +	}
> > > +
> > > +	for (engine = 0; engine < 4; engine++) {
> > > +		if (irq[1][GEN11_VCS(engine)]) {
> > > +			gen11_cs_irq_handler(dev_priv-
> > > >engine[_VCS(engine)],
> > > +					     irq[1][GEN11_VCS(en
> > > gine)]);
> > > +			ret = IRQ_HANDLED;
> > > +		}
> > > +	}
> > > +
> > > +	for (engine = 0; engine < 2; engine++) {
> > > +		if (irq[1][GEN11_VECS(engine)]) {
> > > +			gen11_cs_irq_handler(dev_priv-
> > > >engine[_VECS(engine)],
> > > +					     irq[1][GEN11_VECS(e
> > > ngine)]);
> > > +			ret = IRQ_HANDLED;
> > > +		}
> > > +	}
> > 
> > Doesn't the above code look like a table to be iterated over?
> 
> Chris also had some ideas on how to modify the looping, maybe the
> same 
> as yours. Best we chat about it when we are all present.

Please make sure conclusions are posted to this list so the public
review is properly documented.


> 
> > 
> > <SNIP>
> > 
> > > +static void gen11_gt_irq_postinstall(struct drm_i915_private
> > > *dev_priv)
> > > +{
> > > +	const u32 irqs = GT_RENDER_USER_INTERRUPT |
> > > GT_CONTEXT_SWITCH_INTERRUPT;
> > > +
> > > +	BUILD_BUG_ON(irqs & 0xffff0000);
> > 
> > #define for the mask.
> > 
> > > +
> > > +	/* Enable RCS, BCS, VCS and VECS class interrupts. */
> > > +	I915_WRITE(GEN11_RENDER_COPY_INTR_ENABLE, irqs << 16 |
> > > irqs);
> > > +	I915_WRITE(GEN11_VCS_VECS_INTR_ENABLE,	  irqs <<
> > > 16 | irqs);
> > > +
> > > +	/* Unmask irqs on RCS, BCS, VCS and VECS engines. */
> > > +	I915_WRITE(GEN11_RCS0_RSVD_INTR_MASK,	~(irqs <<
> > > 16));
> > > +	I915_WRITE(GEN11_BCS_RSVD_INTR_MASK,	~(irqs <<
> > > 16));
> > > +	I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK,	~(irqs |
> > > irqs << 16));
> > > +	I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK,	~(irqs |
> > > irqs << 16));
> > > +	I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK,	~(irqs |
> > > irqs << 16));
> > 
> > We should also have an actual shift and mask #defines for these,
> > now
> > it's all hardcoded here.
> > 
> > > +
> > > +	dev_priv->pm_imr = 0xffffffff; /* TODO */
> > 
> > Some code missing it seems.
> 
> Not sure on the states of patches which bring up these bits. Maybe
> it 
> can be re-arranged somehow but not sure.
> 
> > 
> > > +}
> > 
> > <SNIP>
> > 
> > > +++ b/drivers/gpu/drm/i915/intel_pm.c
> > > @@ -7957,7 +7957,10 @@ void intel_sanitize_gt_powersave(struct
> > > drm_i915_private *dev_priv)
> > >   	dev_priv->gt_pm.rc6.enabled = true; /* force RC6
> > > disabling */
> > >   	intel_disable_gt_powersave(dev_priv);
> > >   
> > > -	gen6_reset_rps_interrupts(dev_priv);
> > > +	if (INTEL_GEN(dev_priv) < 11)
> > > +		gen6_reset_rps_interrupts(dev_priv);
> > > +	else
> > > +		WARN_ON_ONCE(1);
> > 
> > Some code is obviously missing here.
> 
> Yes, as above.
> 
> > 
> > >   }
> > >   
> > >   static inline void intel_disable_llc_pstate(struct
> > > drm_i915_private *i915)
> > > @@ -8070,6 +8073,8 @@ static void intel_enable_rps(struct
> > > drm_i915_private *dev_priv)
> > >   		cherryview_enable_rps(dev_priv);
> > >   	} else if (IS_VALLEYVIEW(dev_priv)) {
> > >   		valleyview_enable_rps(dev_priv);
> > > +	} else if (WARN_ON_ONCE(INTEL_GEN(dev_priv) >= 11)) {
> > > +		/* TODO */
> > 
> > Ditto.
> > 
> > If these are in a later patch, should be squashed here.
> 
> It might be possible in some cases, or it might be quite challenging
> in 
> others. Need to look into it but no promises. We might have to live
> with 
> having place holders like this in the code which get removed by
> later 
> patches/series. It's quite complex logistically to organise multiple 
> series, written by multiple authors, at different times, and make it 
> look 100% pretty. (And not just squash and butcher everything up at 
> merge time.)

I agree with Tvrtko here and in the other points above. If we take
Joonas's point to the extreme, ICL enabling would be a single giant
patch. We have to accept that some things are going to be incomplete in
the series that enable a platform. We also have the alpha_support
option to protect us here, and CI to make sure ICL's incompleteness
doesn't affect the other platforms.


> 
> Regards,
> 
> Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2018-01-19 18:11 UTC|newest]

Thread overview: 118+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-09 23:23 [PATCH 00/27] ICL basic enabling + GEM Paulo Zanoni
2018-01-09 23:23 ` [PATCH 01/27] drm/i915/icl: Add initial Icelake definitions Paulo Zanoni
2018-01-09 23:59   ` Oscar Mateo
2018-01-10 17:57     ` Paulo Zanoni
2018-01-10 18:08       ` Oscar Mateo
2018-01-10 18:22         ` Rodrigo Vivi
2018-01-10 18:38           ` Paulo Zanoni
2018-01-11  1:25             ` Rodrigo Vivi
2018-01-10 10:15   ` Chris Wilson
2018-01-10 18:19     ` Paulo Zanoni
2018-01-10 19:17   ` Paulo Zanoni
2018-01-19 11:27     ` Joonas Lahtinen
2018-01-09 23:23 ` [PATCH 02/27] drm/i915/icl: Add the ICL PCI IDs Paulo Zanoni
2018-01-10  0:09   ` Oscar Mateo
2018-01-10  1:02     ` De Marchi, Lucas
2018-01-10  1:07       ` Oscar Mateo
2018-01-10 14:08         ` Paulo Zanoni
2018-01-09 23:23 ` [PATCH 03/27] drm/i915/icl: add icelake_init_clock_gating() Paulo Zanoni
2018-01-10  9:39   ` Joonas Lahtinen
2018-01-10 18:42     ` Paulo Zanoni
2018-01-09 23:23 ` [PATCH 04/27] drm/i915/icl: Icelake interrupt register addresses and bits Paulo Zanoni
2018-01-10 19:54   ` Paulo Zanoni
2018-01-09 23:23 ` [PATCH 05/27] drm/i915/icl: Show interrupt registers in debugfs Paulo Zanoni
2018-01-10  9:02   ` Tvrtko Ursulin
2018-01-10 18:49     ` Paulo Zanoni
2018-01-11  8:55       ` Tvrtko Ursulin
2018-01-09 23:23 ` [PATCH 06/27] drm/i915/icl: Prepare for more rings Paulo Zanoni
2018-02-07 22:03   ` Oscar Mateo
2018-01-09 23:23 ` [PATCH 07/27] drm/i915/icl: Interrupt handling Paulo Zanoni
2018-01-10 10:16   ` Joonas Lahtinen
2018-01-10 18:56     ` Paulo Zanoni
2018-01-19 17:30     ` Tvrtko Ursulin
2018-01-19 18:10       ` Paulo Zanoni [this message]
2018-01-19 20:33         ` Chris Wilson
2018-01-26 11:22           ` Jani Nikula
2018-02-09 22:34   ` Daniele Ceraolo Spurio
2018-01-09 23:23 ` [PATCH 08/27] drm/i915/icl: Ringbuffer interrupt handling Paulo Zanoni
2018-01-10 10:12   ` Chris Wilson
2018-01-11 19:17     ` Daniele Ceraolo Spurio
2018-01-15 10:38       ` Tvrtko Ursulin
2018-02-01 23:58         ` Belgaumkar, Vinay
2018-02-02  0:36           ` Belgaumkar, Vinay
2018-01-09 23:23 ` [PATCH 09/27] drm/i915/icl: Correctly initialize the Gen11 engines Paulo Zanoni
2018-01-09 23:28 ` [PATCH 10/27] drm/i915/icl: Enhanced execution list support Paulo Zanoni
2018-01-09 23:28   ` [PATCH 11/27] drm/i915/icl: Gen11 render context size Paulo Zanoni
2018-01-11  1:21     ` Rodrigo Vivi
2018-01-11 18:20       ` Oscar Mateo
2018-01-11 18:23     ` [PATCH v3] " Oscar Mateo
2018-01-11 19:40       ` Rodrigo Vivi
2018-01-11 22:53         ` Oscar Mateo
2018-01-11 22:55       ` [PATCH 1/2] drm/i915: Return a default RCS " Oscar Mateo
2018-01-11 22:55         ` [PATCH 2/2 v4] drm/i915/icl: Gen11 render " Oscar Mateo
2018-01-12  0:01           ` Daniele Ceraolo Spurio
2018-01-11 23:08         ` [PATCH 1/2] drm/i915: Return a default RCS " Daniele Ceraolo Spurio
2018-01-09 23:28   ` [PATCH 12/27] drm/i915/icl: Add Indirect Context Offset for Gen11 Paulo Zanoni
2018-01-10 23:44     ` Oscar Mateo
2018-01-25  1:06     ` [PATCH v2 " Michel Thierry
2018-01-09 23:28   ` [PATCH 13/27] drm/i915/icl: Gen11 forcewake support Paulo Zanoni
2018-02-01  0:52     ` [PATCH v10] " Michel Thierry
2018-02-01 10:25       ` Tvrtko Ursulin
2018-02-01 16:02         ` Michel Thierry
2018-02-01 16:08       ` [PATCH v11] " Michel Thierry
2018-02-03 20:26       ` [PATCH v10] " kbuild test robot
2018-02-03 21:43       ` kbuild test robot
2018-01-09 23:28   ` [PATCH 14/27] drm/i915/icl: Set graphics mode register for gen11 Paulo Zanoni
2018-01-10 13:40     ` Arkadiusz Hiler
2018-01-11 19:32     ` Daniele Ceraolo Spurio
2018-01-19 19:30     ` [PATCH v3] " Kelvin Gardiner
2018-01-19 22:46       ` Daniele Ceraolo Spurio
2018-01-09 23:28   ` [PATCH 15/27] drm/i915/icl: new context descriptor support Paulo Zanoni
2018-01-09 23:28   ` [PATCH 16/27] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Paulo Zanoni
2018-01-10  9:36     ` Chris Wilson
2018-01-10 19:25       ` Oscar Mateo
2018-01-10 19:32         ` Chris Wilson
2018-01-10 19:33           ` Chris Wilson
2018-01-10 23:02             ` Oscar Mateo
2018-01-10 23:03     ` [PATCH v8] " Oscar Mateo
2018-01-09 23:28   ` [PATCH 17/27] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11 Paulo Zanoni
2018-01-09 23:28   ` [PATCH 18/27] drm/i915/icl: Update subslice define for ICL 11 Paulo Zanoni
2018-01-11  0:06     ` Oscar Mateo
2018-01-11 18:25     ` [PATCH v2] " Oscar Mateo
2018-02-08 16:35       ` Lionel Landwerlin
2018-02-09 17:44         ` Oscar Mateo
2018-02-09 17:48           ` Lionel Landwerlin
2018-02-09 18:00       ` [PATCH v3] " Oscar Mateo
2018-01-09 23:28   ` [PATCH 19/27] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Paulo Zanoni
2018-01-10 12:02     ` Tvrtko Ursulin
2018-01-09 23:28   ` [PATCH 20/27] drm/i915/icl: Make use of the SW counter field in the new context descriptor Paulo Zanoni
2018-01-11 21:10     ` Daniele Ceraolo Spurio
2018-01-11 22:37       ` Oscar Mateo
2018-01-11 23:11         ` Daniele Ceraolo Spurio
2018-01-09 23:28   ` [PATCH 21/27] drm/i915/icl: Add reset control register changes Paulo Zanoni
2018-01-09 23:28   ` [PATCH 22/27] drm/i915/icl: Add configuring MOCS in new Icelake engines Paulo Zanoni
2018-01-09 23:28   ` [PATCH 23/27] drm/i915/icl: Split out the servicing of the Selector and Shared IIR registers Paulo Zanoni
2018-01-09 23:28   ` [PATCH 24/27] drm/i915/icl: Handle RPS interrupts correctly for Gen11 Paulo Zanoni
2018-01-09 23:28   ` [PATCH 25/27] drm/i915/icl: Enable RC6 and RPS in Gen11 Paulo Zanoni
2018-01-09 23:28   ` [PATCH 26/27] drm/i915/icl: allow the reg_read ioctl to read the RCS TIMESTAMP register Paulo Zanoni
2018-01-11  1:19     ` Rodrigo Vivi
2018-01-09 23:28   ` [PATCH 27/27] drm/i915/gen11: add support for reading the timestamp frequency Paulo Zanoni
2018-03-28 11:34     ` Lionel Landwerlin
2018-01-10  9:45   ` [PATCH 10/27] drm/i915/icl: Enhanced execution list support Chris Wilson
2018-01-11 19:55   ` Daniele Ceraolo Spurio
2018-01-11 20:55     ` Daniele Ceraolo Spurio
2018-01-17 21:53   ` [PATCH v5] " Daniele Ceraolo Spurio
2018-01-19 13:05     ` Mika Kuoppala
2018-01-19 16:15       ` Daniele Ceraolo Spurio
2018-01-22 15:08         ` Mika Kuoppala
2018-01-22 15:13           ` Chris Wilson
2018-01-22 16:09             ` Daniele Ceraolo Spurio
2018-01-22 17:32               ` Chris Wilson
2018-01-22 21:38                 ` Daniele Ceraolo Spurio
2018-01-11  1:32 ` [PATCH 00/27] ICL basic enabling + GEM Rodrigo Vivi
2018-01-19 11:45   ` Joonas Lahtinen
2018-01-19 11:55     ` Tvrtko Ursulin
2018-01-19 13:14       ` Mika Kuoppala
2018-01-19 12:08     ` Jani Nikula
2018-01-12 10:06 ` ✗ Fi.CI.BAT: failure for ICL basic enabling + GEM (rev24) Patchwork
2018-01-18 10:21 ` ✗ Fi.CI.BAT: failure for ICL basic enabling + GEM (rev25) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1516385451.2673.49.camel@intel.com \
    --to=paulo.r.zanoni@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=joonas.lahtinen@linux.intel.com \
    --cc=rodrigo.vivi@intel.com \
    --cc=tvrtko.ursulin@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.