pcie msi interrupt

Hi,
I have the problem about msi interrupt. In pci driver code,I use
“ret = pci_enable_msi(lw->pcidev);
if (ret)
v4l2_err(&lw->v4l2_dev, “MSI not available.\n”);
//request irq
lw->irq = pdev->irq;
printk(“irq nu = %d\n”,lw->irq);
if (request_irq(lw->irq, handl_irq,0, “edw”, (void*)lw)) {
v4l2_err(&lw->v4l2_dev, “request_irq failed\n”);
return (CRIT_ERR);”
to request msi interrupt. And I read xilinx FPGA PCIE MSI register with msi_enable_bit = 1.
Use xilinx chipscope, I can see msi message transfer to TX2. But tx2 doen not receive any interrupt.
I use cat/proc/interrupt | grep edw(pcie driver interrupt name),show :
“198: 0 0 0 0 tegra-gpio 65 Edge edw”
I’m confused, why my pcie driver interrupt register to “tegra-gpio” but not “GICv2”?

lspci -v -x show
01:00.0 Memory controller: Xilinx Corporation Device 7022
Subsystem: Xilinx Corporation Device 0007
Flags: bus master, fast devsel, latency 0, IRQ 454
Memory at 50100000 (32-bit, non-prefetchable)
Capabilities: [40] Power Management version 3
Capabilities: [48] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [60] Express Endpoint, MSI 00
Capabilities: [100] Device Serial Number 00-00-00-00-00-00-00-00

MSI 64bit means FPGA have 64bit msi address register?
I make this change
//msi->pages = __get_free_pages(GFP_DMA32, 0);
msi->pages = __get_free_pages(GFP_DMA, 0);
But also can not receive interrupt.
When use “__get_free_pages(GFP_DMA32, 0);” I read FPGA PCIE MSI Cap(offset 48h),Message Address_Lower(offset 4ch),Message Address_upper(offset 50h),and Message Data(offset 54h).
48h = 0x816005
4ch = 0x6afe2000
50h = 0x2
54h = 0x0.

When use “__get_free_pages(GFP_DMA, 0);” I read FPGA PCIE MSI Cap(offset 48h),Message Address_Lower(offset 4ch),Message Address_upper(offset 50h),and Message Data(offset 54h).
48h = 0x816005
4ch = 0xd9300000
50h = 0x0
54h = 0x0.

when use “__get_free_pages(GFP_DMA32, 0)”,50h register always return value equal 0x0.
when use “__get_free_pages(GFP_DMA, 0)”,50h register always return value equal 0x2.

So what should I do this?

Following are correct observations

when use "__get_free_pages(GFP_DMA32, 0)",50h register always return value equal 0x0. 
when use "__get_free_pages(GFP_DMA, 0)",50h register always return value equal 0x2.

But, these observations are not matching with below statements

When use "__get_free_pages(GFP_DMA32, 0);" I read FPGA PCIE MSI Cap(offset 48h),Message Address_Lower(offset 4ch),Message Address_upper(offset 50h),and Message Data(offset 54h).
48h = 0x816005
4ch = 0x6afe2000
50h = 0x2
54h = 0x0.


When use "__get_free_pages(GFP_DMA, 0);" I read FPGA PCIE MSI Cap(offset 48h),Message Address_Lower(offset 4ch),Message Address_upper(offset 50h),and Message Data(offset 54h).
48h = 0x816005
4ch = 0xd9300000
50h = 0x0
54h = 0x0.

I think register dumps need to be swapped

Anyway, the issue seems to be because of your interrupt going under ‘tegra_gpio’ instead of GICv2
This points to an issue with the way you are enabling MSI in your driver.
Can you please compare the flow of your driver w.r.t enabling MSI with an upstream driver (like r8169.c)? I’m sure when you connect any off-the-shelf card, its MSI/MSI-X would go under GICv2 and not under tegra-gpio.