Message Signaled Interrupt (MSI) for x64

I’m writing a wdf driver for a Genum/Semtech GN4124 PCIe interface chip.

So far the driver is working correctly and stable, incl. Interrupts and DMA.

Now I like to use message signaled interrupts instead of legacy INTA messages.
I made the entries in the inf file for enabling MSI and the MSI interrupts are working correctly under Windows 7, 32 Bit but under 64 Bit (Win 7 or Win 8.1) my ISR function get not called. Is there something special to care about in 64 Bit systems?

After loading the driver, I can check the config space and see the following MSI register are set:
MSI Control: 0081 8505
MSI Address: 0000 0000 FEEF F00C
MSI Data : 0000 0172

I also checked with a PCIe anaylzer if the MSI write command is send out and could not found any issue so far. I see a MWr(32) to address FEEF F00C with the data 0170.

Regards Roman

Does your device take 64 bit MSI address?

It should take 64 bit addresses. The 64 Bit MSI capability bit is set by the device and there is a 64 bit MSI address register.

Do you have another MSI capable device? What do you see in its descriptor?

The USB3 controller has MSI enabled too and the register are:

MSI Control: 00B7 0005
MSI Address: 0000 0000 FEEF F00C
MSI Data : 0000 01B8

If I compare it to my device the registers are set correctly.

The descriptor shows data 0172, and you see the message with data 0170. Why?

That was the problem, the GN4124 chip changes the data vector - dependend on the interrupt source and so the OS will not recognize the message any more.

The problem and solution is described here:

http://blog.tftechpages.com/?p=595

Wow… That’s a pretty crazy problem.

Good to know about, as more people migrate their legacy designs to PCIe (I understand the GN4124 can be pretty cost-effective in this role).

Thanks for posting the follow-up,

Peter
OSR
@OSRDrivers