]>
Commit | Line | Data |
---|---|---|
2874c5fd | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
df87ef55 ME |
2 | /* |
3 | * Copyright 2006-2007, Michael Ellerman, IBM Corporation. | |
df87ef55 ME |
4 | */ |
5 | ||
6 | #include <linux/kernel.h> | |
7 | #include <linux/msi.h> | |
ceb93a9f | 8 | #include <linux/pci.h> |
df87ef55 ME |
9 | |
10 | #include <asm/machdep.h> | |
11 | ||
6b2fd7ef | 12 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
df87ef55 | 13 | { |
e059b105 DA |
14 | struct pci_controller *phb = pci_bus_to_host(dev->bus); |
15 | ||
1f88d586 DA |
16 | if (!phb->controller_ops.setup_msi_irqs || |
17 | !phb->controller_ops.teardown_msi_irqs) { | |
df87ef55 ME |
18 | pr_debug("msi: Platform doesn't provide MSI callbacks.\n"); |
19 | return -ENOSYS; | |
20 | } | |
21 | ||
1c8d7b0a MW |
22 | /* PowerPC doesn't support multiple MSI yet */ |
23 | if (type == PCI_CAP_ID_MSI && nvec > 1) | |
24 | return 1; | |
25 | ||
1f88d586 | 26 | return phb->controller_ops.setup_msi_irqs(dev, nvec, type); |
df87ef55 ME |
27 | } |
28 | ||
29 | void arch_teardown_msi_irqs(struct pci_dev *dev) | |
30 | { | |
e059b105 DA |
31 | struct pci_controller *phb = pci_bus_to_host(dev->bus); |
32 | ||
78e7b15e RR |
33 | /* |
34 | * We can be called even when arch_setup_msi_irqs() returns -ENOSYS, | |
35 | * so check the pointer again. | |
36 | */ | |
37 | if (phb->controller_ops.teardown_msi_irqs) | |
38 | phb->controller_ops.teardown_msi_irqs(dev); | |
df87ef55 | 39 | } |