Wrong Message ID in case of 9 MSI interrupts

Hello,

My FPGA design contains 9 interrupts. All of them are listed in the device manager of windows 10 (x64)

The following code is used to handle those interrupts:

BOOLEAN
PLxEvtInterruptIsr(
    IN WDFINTERRUPT Interrupt,
    IN ULONG        MessageID
    )
{
/*Arguments:

    Interupt   - Handle to WDFINTERRUPT Object for this device.
    MessageID  - MSI message ID (always 0 in this configuration)

Return Value:

     TRUE   --  This device generated the interrupt.
     FALSE  --  This device did not generated this interrupt.*/

     KdPrint(("--> PLxInterruptHandler: %d\n", MessageID));

     return TRUE;

}

Upon all the first 8 interrupts (0..7), the ISR works OK.
Upon the 9th one, the MessageId printed is 0.
Can you please tell why ?

I'm using KMDF 11.1

Thank you,
Zvika

1 Like

Are these MSI? You're not guaranteed to get all the interrupts you request -- some may be overlaid.

Hi Tim,

Thank you very much for your reply.
Is it MSI.
What do you mean by "some may be overlaid" ?
How should I "catch" the 9th interrupt ?

Following is the log of the resources:

--> PLxPrepareHardware
desc->Type=3 desc->u.Memory.Length=100000
Start=94000000 Length=100000
desc->Type=129 desc->u.Memory.Length=0
desc->Type=3 desc->u.Memory.Length=4000000
Start=90000000 Length=4000000
desc->Type=129 desc->u.Memory.Length=0
desc->Type=7 desc->u.Memory.Length=1000000
Start=0x6000000000 Length=0x100000000
desc->Type=129 desc->u.Memory.Length=0
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x93, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x9,  Translated.Vector: 0x93 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x83, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x8,  Translated.Vector: 0x83 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x73, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x7,  Translated.Vector: 0x73 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x63, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x6,  Translated.Vector: 0x63 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x53, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x5,  Translated.Vector: 0x53 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0xb4, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0xb,  Translated.Vector: 0xb4 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0xa4, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0xa,  Translated.Vector: 0xa4 
desc->Type=2 desc->u.Memory.Length=3f
 -Flags: 0x2 ,  Raw.Vectort: 0x94, Raw.MessageCount: 0x0  
 -Flags: 0x2 , Translated.Level: 0x9,  Translated.Vector: 0x94 
<-- PLxPrepareHardware

Best regards,
Zvika

1 Like

!wdflogdump after you've returned from EvtDevicePrepareHardware is your friend.

Be sure WDF Verifier is enabled along with VERBOSE debugging.

WAIT! If I'm reading your debug output right (and I don't know if I am) those look like MSI-X interrupts, not MSI.

Which is it? And, yes... it matters.

And... PS: The comment about doing a !wdflogdump is still relevant, MSI or MSI-X.

Hi Peter,

Thank you very much for your reply.
It's MSI-X

Best regards,
Zvika

Thanks @zvivered
Your solution is helpful for me. I also try this code in my project.

@zvivered

And the output from !wdflogdump is?

Hi Peter,

In my case the cause to the problem is a bug in firmware.
After fixing the bug, I get message ID 8.

Thank you very much for your help,
Zvika