Am testing the pcie interface with MSI on a dm8148 EVM using ezsdk 5.03.01.15. As noted in another post, the main problem is a polarity issue in ack_msi() in /arch/arm/mach-omap2/pcie-ti81xx.c. Writing a one instead of a zero to acknowledge MSI interrupts appears to work.
A second problem is that ti81xx_msi_handler() only works if CONFIG_PCI_DEBUG=y in the kernel configuration. After patching ack_msi() and rebuilding the kernel, I ran several thousand transfers to test MSI functionality and it worked. Until I disabled pci debugging in the kernel. Then I only get one MSI interrupt, which appears to be waiting for an ack. The difference between MSI working and non-working is the statement:
pr_debug(DRIVER_NAME ": Handling MSI irq %d\n", irq); // noop unless CONFIG_PCI_DEBUG=y
If we respond to an MSI interrupt too fast, the ack apparently gets dropped. Is this behavior documented anywhere in the dm8148 technical documentation? An obvious workaround is to always configure the kernel with CONFIG_PCI_DEBUG=y so the pcie MSI handling works correctly on the dm8148. Besides the workaround, is there a known fix for this problem?