On Wed, Feb 15, 2006 at 04:52:17PM -0800, Roland Dreier wrote:

> I've not seen any problems with MSI/MSI-X with nforce4 and PCIe HCAs
> on both my Asus A8N-SLI and HP DL145G2 systems.

I've managed to make it work here too. I found an earlier email from
you about the HT MSI Mapping capability which proved to be the key.
The BIOS on this board doesn't enable it :|

People on this list may be interested in this patch which adds a PCI
quirk to force the HyperTransport MSI mapping function to be enabled
if the BIOS forgot about it. It makes my board work:

ib1{jgg}~#cat /proc/interrupts 
           CPU0
  0:     344750    IO-APIC-edge  timer
  1:          8    IO-APIC-edge  i8042
  2:          0          XT-PIC  cascade
  5:     141156   IO-APIC-level  ohci_hcd:usb1, ehci_hcd:usb2, eth0
  8:          4    IO-APIC-edge  rtc
 14:       1445    IO-APIC-edge  ide0
 15:         15    IO-APIC-edge  ide1
193:        179         PCI-MSI  ib_mthca

Thanks,
Jason

--- linux-2.6.15.4/drivers/pci/quirks.c 2006-02-16 12:08:59.000000000 -0700
+++ lin/drivers/pci/quirks.c    2006-02-16 12:12:30.000000000 -0700
@@ -1257,6 +1257,29 @@
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, 
fixup_rev1_53c810);
 
+#ifdef CONFIG_PCI_MSI
+static void __devinit fixup_ht_msi(struct pci_dev* dev)
+{
+       /* Some BIOS's do not enable the hypertransport MSI mapping capability
+          on the chipset. This breaks MSI support.. */
+       int pos = pci_find_capability(dev,PCI_CAP_ID_HT);
+       while (pos != 0)
+       {
+               u32 cap;
+               pci_read_config_dword(dev,pos,&cap);
+               if (((cap >> 16) & PCI_HT_CMD_TYP) == PCI_HT_CMD_TYP_MSIM) {
+                       if ((cap & PCI_HT_MSIM_ENABLE) == 0) {
+                               printk("BIOS BUG: HyperTransport MSI mapping 
not enabled for %s, enabling.\n",pci_name(dev));
+                               cap |= PCI_HT_MSIM_ENABLE;
+                               pci_write_config_dword(dev,pos,cap);
+                       }
+                       break;
+               }
+               pos = pci_find_next_capability(dev, pos, PCI_CAP_ID_HT);
+       }
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, fixup_ht_msi);
+#endif
 
 static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct 
pci_fixup *end)
 {
--- linux-2.6.15.4/include/linux/pci_regs.h     2006-02-16 12:09:05.000000000 
-0700
+++ lin/include/linux/pci_regs.h        2006-02-16 12:12:30.000000000 -0700
@@ -196,12 +196,14 @@
 #define  PCI_CAP_ID_MSI                0x05    /* Message Signalled Interrupts 
*/
 #define  PCI_CAP_ID_CHSWP      0x06    /* CompactPCI HotSwap */
 #define  PCI_CAP_ID_PCIX       0x07    /* PCI-X */
+#define  PCI_CAP_ID_HT          0x08    /* HyperTransport */
 #define  PCI_CAP_ID_SHPC       0x0C    /* PCI Standard Hot-Plug Controller */
 #define  PCI_CAP_ID_EXP        0x10    /* PCI Express */
 #define  PCI_CAP_ID_MSIX       0x11    /* MSI-X */
 #define PCI_CAP_LIST_NEXT      1       /* Next capability in the list */
 #define PCI_CAP_FLAGS          2       /* Capability defined flags (16 bits) */
 #define PCI_CAP_SIZEOF         4
+#define PCI_HT_CMD_TYP          0xf800  /* Hypertransport capability type mask 
*/
 
 /* Power Management Registers */
 
@@ -285,6 +287,10 @@
 #define PCI_MSI_DATA_64                12      /* 16 bits of data for 64-bit 
devices */
 #define PCI_MSI_MASK_BIT       16      /* Mask bits register */
 
+/* HyperTransport MSI Mapping registers */
+#define PCI_HT_CMD_TYP_MSIM 0xa800      // MSI Mapping type
+#define PCI_HT_MSIM_ENABLE  (1<<16)
+
 /* CompactPCI Hotswap Register */
 
 #define PCI_CHSWP_CSR          2       /* Control and Status Register */
_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to