|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/smp.h>
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/io.h>
|
|
|
+#include <linux/acpi_iort.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/irqdomain.h>
|
|
|
#include <linux/of_irq.h>
|
|
@@ -1502,8 +1503,8 @@ u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev)
|
|
|
pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);
|
|
|
|
|
|
of_node = irq_domain_get_of_node(domain);
|
|
|
- if (of_node)
|
|
|
- rid = of_msi_map_rid(&pdev->dev, of_node, rid);
|
|
|
+ rid = of_node ? of_msi_map_rid(&pdev->dev, of_node, rid) :
|
|
|
+ iort_msi_map_rid(&pdev->dev, rid);
|
|
|
|
|
|
return rid;
|
|
|
}
|
|
@@ -1519,9 +1520,13 @@ u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev)
|
|
|
*/
|
|
|
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
|
|
|
{
|
|
|
+ struct irq_domain *dom;
|
|
|
u32 rid = 0;
|
|
|
|
|
|
pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);
|
|
|
- return of_msi_map_get_device_domain(&pdev->dev, rid);
|
|
|
+ dom = of_msi_map_get_device_domain(&pdev->dev, rid);
|
|
|
+ if (!dom)
|
|
|
+ dom = iort_get_device_domain(&pdev->dev, rid);
|
|
|
+ return dom;
|
|
|
}
|
|
|
#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
|