]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
UBUNTU: SAUCE: ACPI: platform-msi: retrieve dev id from IORT
authorHanjun Guo <hanjun.guo@linaro.org>
Wed, 18 Jan 2017 12:55:00 +0000 (20:55 +0800)
committerTim Gardner <tim.gardner@canonical.com>
Thu, 2 Mar 2017 12:38:21 +0000 (05:38 -0700)
For devices connecting to ITS, it needs dev id to identify itself, and
this dev id is represented in the IORT table in named component node
[1] for platform devices, so in this patch we will scan the IORT to
retrieve device's dev id.

With the preparation of iort_node_map_platform_id(), a new API
iort_pmsi_get_dev_id() is introduced for that purpose, call it in
its_pmsi_prepare() to make retrieving dev id ACPI aware.

[1]: https://static.docs.arm.com/den0049/b/DEN0049B_IO_Remapping_Table.pdf

Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
Tested-by: Ming Lei <ming.lei@canonical.com>
Tested-by: Wei Xu <xuwei5@hisilicon.com>
Tested-by: Sinan Kaya <okaya@codeaurora.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Tomasz Nowicki <tn@semihalf.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
[v8 submission from:
 https://www.spinics.net/lists/arm-kernel/msg555514.html ]
BugLink: http://bugs.launchpad.net/bugs/1669061
Signed-off-by: dann frazier <dann.frazier@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/acpi/arm64/iort.c
drivers/irqchip/irq-gic-v3-its-platform-msi.c
include/linux/acpi_iort.h

index dacf5e1add453bb593f0d20655c94f14ff784c8d..9aebb14c23a1b67cd6915f767c5bf921b6989b42 100644 (file)
@@ -467,6 +467,30 @@ u32 iort_msi_map_rid(struct device *dev, u32 req_id)
        return dev_id;
 }
 
+/**
+ * iort_pmsi_get_dev_id() - Get the device id for a device
+ * @dev: The device for which the mapping is to be done.
+ * @dev_id: The device ID found.
+ *
+ * Returns: 0 for successful find a dev id, -ENODEV on error
+ */
+int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id)
+{
+       int i;
+       struct acpi_iort_node *node;
+
+       node = iort_find_dev_node(dev);
+       if (!node)
+               return -ENODEV;
+
+       for (i = 0; i < node->mapping_count; i++) {
+               if (iort_node_map_platform_id(node, dev_id, IORT_MSI_TYPE, i))
+                       return 0;
+       }
+
+       return -ENODEV;
+}
+
 /**
  * iort_dev_find_its_id() - Find the ITS identifier for a device
  * @dev: The device.
index e4ba9f4cbd1ab607ee53b1c96d69ff97b11155f0..e801fc0c66616e3d1a48d67791daaf41f3d635f5 100644 (file)
@@ -57,7 +57,8 @@ static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev,
 
        msi_info = msi_get_domain_info(domain->parent);
 
-       ret = of_pmsi_get_dev_id(domain, dev, &dev_id);
+       ret = dev->of_node ? of_pmsi_get_dev_id(domain, dev, &dev_id) :
+               iort_pmsi_get_dev_id(dev, &dev_id);
        if (ret)
                return ret;
 
index 77e08099e55404b53225e71f7bd0b9ca34caec4a..d074c778618a2e4b8477547b18082fa7051b55b9 100644 (file)
@@ -34,6 +34,7 @@ void acpi_iort_init(void);
 bool iort_node_match(u8 type);
 u32 iort_msi_map_rid(struct device *dev, u32 req_id);
 struct irq_domain *iort_get_device_domain(struct device *dev, u32 req_id);
+int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id);
 /* IOMMU interface */
 void iort_set_dma_mask(struct device *dev);
 const struct iommu_ops *iort_iommu_configure(struct device *dev);
@@ -45,6 +46,10 @@ static inline u32 iort_msi_map_rid(struct device *dev, u32 req_id)
 static inline struct irq_domain *iort_get_device_domain(struct device *dev,
                                                        u32 req_id)
 { return NULL; }
+
+static inline int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id)
+{ return -ENODEV; }
+
 /* IOMMU interface */
 static inline void iort_set_dma_mask(struct device *dev) { }
 static inline