|
@@ -30,9 +30,24 @@ int pci_msi_ignore_mask;
|
|
|
|
|
|
/* Arch hooks */
|
|
/* Arch hooks */
|
|
|
|
|
|
|
|
+struct msi_controller * __weak pcibios_msi_controller(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct msi_controller *pci_msi_controller(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ struct msi_controller *msi_ctrl = dev->bus->msi;
|
|
|
|
+
|
|
|
|
+ if (msi_ctrl)
|
|
|
|
+ return msi_ctrl;
|
|
|
|
+
|
|
|
|
+ return pcibios_msi_controller(dev);
|
|
|
|
+}
|
|
|
|
+
|
|
int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
|
|
int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
|
|
{
|
|
{
|
|
- struct msi_controller *chip = dev->bus->msi;
|
|
|
|
|
|
+ struct msi_controller *chip = pci_msi_controller(dev);
|
|
int err;
|
|
int err;
|
|
|
|
|
|
if (!chip || !chip->setup_irq)
|
|
if (!chip || !chip->setup_irq)
|