summaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
diff options
context:
space:
mode:
authorDiana Craciun <diana.craciun@oss.nxp.com>2020-06-19 09:20:12 +0100
committerCatalin Marinas <catalin.marinas@arm.com>2020-07-28 15:51:32 +0100
commit998fb7badf0362a2057694878098642ef363d899 (patch)
treefab3424f96c4a7102053629d17b30ed0d45b2de2 /drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
parent2bcdd8f2c07f1aa1bfd34fa0dab8e06949e34846 (diff)
downloadlinux-stable-998fb7badf0362a2057694878098642ef363d899.tar.gz
linux-stable-998fb7badf0362a2057694878098642ef363d899.tar.bz2
linux-stable-998fb7badf0362a2057694878098642ef363d899.zip
bus/fsl-mc: Refactor the MSI domain creation in the DPRC driver
The DPRC driver is not taking into account the msi-map property and assumes that the icid is the same as the stream ID. Although this assumption is correct, generalize the code to include a translation between icid and streamID. Furthermore do not just copy the MSI domain from parent (for child containers), but use the information provided by the msi-map property. If the msi-map property is missing from the device tree retain the old behaviour for backward compatibility ie the child DPRC objects inherit the MSI domain from the parent. Signed-off-by: Diana Craciun <diana.craciun@oss.nxp.com> Acked-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20200619082013.13661-12-lorenzo.pieralisi@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c')
-rw-r--r--drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c b/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
index 606efa64adff..a5c8d577e424 100644
--- a/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
+++ b/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
@@ -23,6 +23,18 @@ static struct irq_chip its_msi_irq_chip = {
.irq_set_affinity = msi_domain_set_affinity
};
+static u32 fsl_mc_msi_domain_get_msi_id(struct irq_domain *domain,
+ struct fsl_mc_device *mc_dev)
+{
+ struct device_node *of_node;
+ u32 out_id;
+
+ of_node = irq_domain_get_of_node(domain);
+ out_id = of_msi_map_id(&mc_dev->dev, of_node, mc_dev->icid);
+
+ return out_id;
+}
+
static int its_fsl_mc_msi_prepare(struct irq_domain *msi_domain,
struct device *dev,
int nvec, msi_alloc_info_t *info)
@@ -43,7 +55,8 @@ static int its_fsl_mc_msi_prepare(struct irq_domain *msi_domain,
* NOTE: This device id corresponds to the IOMMU stream ID
* associated with the DPRC object (ICID).
*/
- info->scratchpad[0].ul = mc_bus_dev->icid;
+ info->scratchpad[0].ul = fsl_mc_msi_domain_get_msi_id(msi_domain,
+ mc_bus_dev);
msi_info = msi_get_domain_info(msi_domain->parent);
/* Allocate at least 32 MSIs, and always as a power of 2 */