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