|
@@ -2296,6 +2296,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
|
|
|
PCI_DEVICE_ID_NVIDIA_NVENET_15,
|
|
|
nvenet_msi_disable);
|
|
|
|
|
|
+/*
|
|
|
+ * Some versions of the MCP55 bridge from nvidia have a legacy irq routing
|
|
|
+ * config register. This register controls the routing of legacy interrupts
|
|
|
+ * from devices that route through the MCP55. If this register is misprogramed
|
|
|
+ * interrupts are only sent to the bsp, unlike conventional systems where the
|
|
|
+ * irq is broadxast to all online cpus. Not having this register set
|
|
|
+ * properly prevents kdump from booting up properly, so lets make sure that
|
|
|
+ * we have it set correctly.
|
|
|
+ * Note this is an undocumented register.
|
|
|
+ */
|
|
|
+static void __devinit nvbridge_check_legacy_irq_routing(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ u32 cfg;
|
|
|
+
|
|
|
+ pci_read_config_dword(dev, 0x74, &cfg);
|
|
|
+
|
|
|
+ if (cfg & ((1 << 2) | (1 << 15))) {
|
|
|
+ printk(KERN_INFO "Rewriting irq routing register on MCP55\n");
|
|
|
+ cfg &= ~((1 << 2) | (1 << 15));
|
|
|
+ pci_write_config_dword(dev, 0x74, cfg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
|
|
|
+ PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0,
|
|
|
+ nvbridge_check_legacy_irq_routing);
|
|
|
+
|
|
|
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
|
|
|
+ PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4,
|
|
|
+ nvbridge_check_legacy_irq_routing);
|
|
|
+
|
|
|
static int __devinit ht_check_msi_mapping(struct pci_dev *dev)
|
|
|
{
|
|
|
int pos, ttl = 48;
|