[Intel-xe] [PATCH] drm/xe/irq: Clear GFX_MSTR_IRQ as part of IRQ reset

Gustavo Sousa gustavo.sousa at intel.com
Wed Sep 20 14:44:38 UTC 2023


Quoting Matt Roper (2023-09-19 18:15:06-03:00)
>On Tue, Sep 19, 2023 at 11:41:10AM -0300, Gustavo Sousa wrote:
>> Starting with Xe_LP+, GFX_MSTR_IRQ contains status bits that have W1C
>> behavior. If we do not properly reset them, we would miss delivery of
>> interrupts if a pending bit is set when enabling IRQs.
>> 
>> As an example, the display part of our probe routine contains paths
>> where we wait for vblank interrupts. If a display interrupt was already
>> pending when enabling IRQs, we would time out waiting for the vblank.
>> 
>> That in fact happened recently when modprobing Xe on a Lunar Lake with a
>> specific configuration; and that's how we found out we were missing this
>> step in the IRQ enabling logic.
>> 
>> Fix the issue by clearing GFX_MSTR_IRQ as part of the IRQ reset.
>> 
>> BSpec: 50875, 54028, 62357
>> Signed-off-by: Gustavo Sousa <gustavo.sousa at intel.com>
>> ---
>>  drivers/gpu/drm/xe/xe_irq.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>> 
>> diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
>> index ccb934f8fa34..3746e9204e48 100644
>> --- a/drivers/gpu/drm/xe/xe_irq.c
>> +++ b/drivers/gpu/drm/xe/xe_irq.c
>> @@ -456,6 +456,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
>>  
>>  static void gt_irq_reset(struct xe_tile *tile)
>
>As noted on the i915 patch, the bits in this register correspond to
>tiles rather than GTs.  And in Xe we do a much better job of handling
>the two separately.  You probably want to move this to dg1_irq_reset()

gt_irq_reset() seems to end up being called for each tile, but, yeah,
dg1_irq_reset() looks like a much better and natural place to do this.
Thanks!

>and only reset the bit that corresponds to the specific tile that was
>passed as a parameter.

Not sure I follow here. Shouldn't the bits in that register already be
specific to the tile?

I think the per-tile bits are in MSTR_TILE_INTR (0x190008), and they are
already handled by dg1_intr_disable().

--
Gustavo Sousa

>
>
>Matt
>
>>  {
>> +        struct xe_device *xe = tile_to_xe(tile);
>>          struct xe_gt *mmio = tile->primary_gt;
>>  
>>          u32 ccs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
>> @@ -463,6 +464,9 @@ static void gt_irq_reset(struct xe_tile *tile)
>>          u32 bcs_mask = xe_hw_engine_mask_per_class(tile->primary_gt,
>>                                                     XE_ENGINE_CLASS_COPY);
>>  
>> +        if (GRAPHICS_VERx100(xe) >= 1210)
>> +                xe_mmio_write32(mmio, GFX_MSTR_IRQ, ~0);
>> +
>>          /* Disable RCS, BCS, VCS and VECS class engines. */
>>          xe_mmio_write32(mmio, RENDER_COPY_INTR_ENABLE, 0);
>>          xe_mmio_write32(mmio, VCS_VECS_INTR_ENABLE, 0);
>> -- 
>> 2.42.0
>> 
>
>-- 
>Matt Roper
>Graphics Software Engineer
>Linux GPU Platform Enablement
>Intel Corporation


More information about the Intel-xe mailing list