@@ -387,6 +387,7 @@ iort_get_device_domain(struct device *dev, u32 req_id)
{
static struct fwnode_handle *handle;
int its_id;
+ enum irq_domain_bus_token bus_token;
if (!iort_table)
return NULL;
@@ -398,7 +399,9 @@ iort_get_device_domain(struct device *dev, u32 req_id)
if (!handle)
return NULL;
- return irq_find_matching_fwnode(handle, DOMAIN_BUS_PCI_MSI);
+ bus_token = dev_is_pci(dev) ?
+ DOMAIN_BUS_PCI_MSI : DOMAIN_BUS_PLATFORM_MSI;
+ return irq_find_matching_fwnode(handle, bus_token);
}
void __init iort_table_detect(void)
@@ -19,6 +19,7 @@
#include <linux/device.h>
#include <linux/idr.h>
+#include <linux/iort.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/msi.h>
@@ -416,3 +417,16 @@ int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
return err;
}
+
+int acpi_configure_msi_domain(struct device *dev)
+{
+ struct irq_domain *d = NULL;
+
+ d = iort_get_device_domain(dev, 0);
+ if (d) {
+ dev_set_msi_domain(dev, d);
+ return 0;
+ }
+
+ return -EINVAL;
+}
@@ -24,6 +24,7 @@
#include <linux/pm_domain.h>
#include <linux/idr.h>
#include <linux/acpi.h>
+#include <linux/msi.h>
#include <linux/clk/clk-conf.h>
#include <linux/limits.h>
#include <linux/property.h>
@@ -500,6 +501,7 @@ struct platform_device *platform_device_register_full(
pdev->dev.parent = pdevinfo->parent;
pdev->dev.fwnode = pdevinfo->fwnode;
+ acpi_configure_msi_domain(&pdev->dev);
if (pdevinfo->dma_mask) {
/*
* This memory isn't freed when the device is put,
@@ -306,6 +306,7 @@ int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nvec);
void *platform_msi_get_host_data(struct irq_domain *domain);
+int acpi_configure_msi_domain(struct device *dev);
#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN