@@ -478,6 +478,7 @@ struct irq_domain *iort_get_device_domain(struct device *dev, u32 req_id)
{
struct fwnode_handle *handle;
int its_id;
+ enum irq_domain_bus_token bus_token;
if (iort_dev_find_its_id(dev, req_id, 0, &its_id))
return NULL;
@@ -486,7 +487,9 @@ struct irq_domain *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);
}
static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
@@ -17,8 +17,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <linux/acpi_iort.h>
#include <linux/device.h>
-#include <linux/idr.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/msi.h>
@@ -416,3 +416,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,
@@ -308,6 +308,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