diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index cc96c7142dac..f5c63fe9db5c 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -2297,6 +2297,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, | |||
| 2297 | PCI_DEVICE_ID_NVIDIA_NVENET_15, | 2297 | PCI_DEVICE_ID_NVIDIA_NVENET_15, | 
| 2298 | nvenet_msi_disable); | 2298 | nvenet_msi_disable); | 
| 2299 | 2299 | ||
| 2300 | /* | ||
| 2301 | * Some versions of the MCP55 bridge from nvidia have a legacy irq routing | ||
| 2302 | * config register. This register controls the routing of legacy interrupts | ||
| 2303 | * from devices that route through the MCP55. If this register is misprogramed | ||
| 2304 | * interrupts are only sent to the bsp, unlike conventional systems where the | ||
| 2305 | * irq is broadxast to all online cpus. Not having this register set | ||
| 2306 | * properly prevents kdump from booting up properly, so lets make sure that | ||
| 2307 | * we have it set correctly. | ||
| 2308 | * Note this is an undocumented register. | ||
| 2309 | */ | ||
| 2310 | static void __devinit nvbridge_check_legacy_irq_routing(struct pci_dev *dev) | ||
| 2311 | { | ||
| 2312 | u32 cfg; | ||
| 2313 | |||
| 2314 | pci_read_config_dword(dev, 0x74, &cfg); | ||
| 2315 | |||
| 2316 | if (cfg & ((1 << 2) | (1 << 15))) { | ||
| 2317 | printk(KERN_INFO "Rewriting irq routing register on MCP55\n"); | ||
| 2318 | cfg &= ~((1 << 2) | (1 << 15)); | ||
| 2319 | pci_write_config_dword(dev, 0x74, cfg); | ||
| 2320 | } | ||
| 2321 | } | ||
| 2322 | |||
| 2323 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, | ||
| 2324 | PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0, | ||
| 2325 | nvbridge_check_legacy_irq_routing); | ||
| 2326 | |||
| 2327 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, | ||
| 2328 | PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4, | ||
| 2329 | nvbridge_check_legacy_irq_routing); | ||
| 2330 | |||
| 2300 | static int __devinit ht_check_msi_mapping(struct pci_dev *dev) | 2331 | static int __devinit ht_check_msi_mapping(struct pci_dev *dev) | 
| 2301 | { | 2332 | { | 
| 2302 | int pos, ttl = 48; | 2333 | int pos, ttl = 48; | 
