[PATCH] PCI: Provide a boot parameter to disable MSI
Several drivers are starting to grow options to disable MSI. However, it's often a host chipset issue, not something which individual drivers should handle. So we add the pci=nomsi kernel parameter to allow the user to disable MSI modes for systems we haven't added to the quirk list yet. Signed-off-by: Matthew Wilcox <matthew@wil.cx> Signed-off-by: Randy Dunlap <rdunlap@xenotime.net> Acked-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
5eeca8e688
commit
309e57df7b
|
@ -49,6 +49,7 @@ restrictions referred to are that the relevant option is valid if:
|
|||
MCA MCA bus support is enabled.
|
||||
MDA MDA console support is enabled.
|
||||
MOUSE Appropriate mouse support is enabled.
|
||||
MSI Message Signaled Interrupts (PCI).
|
||||
MTD MTD support is enabled.
|
||||
NET Appropriate network support is enabled.
|
||||
NUMA NUMA support is enabled.
|
||||
|
@ -1152,6 +1153,9 @@ running once the system is up.
|
|||
Mechanism 2.
|
||||
nommconf [IA-32,X86_64] Disable use of MMCONFIG for PCI
|
||||
Configuration
|
||||
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||
enabled, this kernel boot option can be used to
|
||||
disable the use of MSI interrupts system-wide.
|
||||
nosort [IA-32] Don't sort PCI devices according to
|
||||
order given by the PCI BIOS. This sorting is
|
||||
done to get a device order compatible with
|
||||
|
|
|
@ -11,6 +11,10 @@ config PCI_MSI
|
|||
generate an interrupt using an inbound Memory Write on its
|
||||
PCI bus instead of asserting a device IRQ pin.
|
||||
|
||||
Use of PCI MSI interrupts can be disabled at kernel boot time
|
||||
by using the 'pci=nomsi' option. This disables MSI for the
|
||||
entire system.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
config PCI_DEBUG
|
||||
|
|
|
@ -765,8 +765,11 @@ void pci_disable_msi(struct pci_dev* dev)
|
|||
u16 control;
|
||||
unsigned long flags;
|
||||
|
||||
if (!pci_msi_enable)
|
||||
return;
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
|
||||
if (!pos)
|
||||
return;
|
||||
|
@ -1026,6 +1029,8 @@ void pci_disable_msix(struct pci_dev* dev)
|
|||
int pos, temp;
|
||||
u16 control;
|
||||
|
||||
if (!pci_msi_enable)
|
||||
return;
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
|
@ -1152,6 +1157,11 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev)
|
|||
}
|
||||
}
|
||||
|
||||
void pci_no_msi(void)
|
||||
{
|
||||
pci_msi_enable = 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pci_enable_msi);
|
||||
EXPORT_SYMBOL(pci_disable_msi);
|
||||
EXPORT_SYMBOL(pci_enable_msix);
|
||||
|
|
|
@ -900,8 +900,12 @@ static int __devinit pci_setup(char *str)
|
|||
if (k)
|
||||
*k++ = 0;
|
||||
if (*str && (str = pcibios_setup(str)) && *str) {
|
||||
/* PCI layer options should be handled here */
|
||||
printk(KERN_ERR "PCI: Unknown option `%s'\n", str);
|
||||
if (!strcmp(str, "nomsi")) {
|
||||
pci_no_msi();
|
||||
} else {
|
||||
printk(KERN_ERR "PCI: Unknown option `%s'\n",
|
||||
str);
|
||||
}
|
||||
}
|
||||
str = k;
|
||||
}
|
||||
|
|
|
@ -50,8 +50,10 @@ extern int pci_msi_quirk;
|
|||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
void disable_msi_mode(struct pci_dev *dev, int pos, int type);
|
||||
void pci_no_msi(void);
|
||||
#else
|
||||
static inline void disable_msi_mode(struct pci_dev *dev, int pos, int type) { }
|
||||
static inline void pci_no_msi(void) { }
|
||||
#endif
|
||||
|
||||
extern int pcie_mch_quirk;
|
||||
|
|
Loading…
Reference in New Issue