From: Lokesh Vutla <lokeshvutla@ti.com> To: Marc Zyngier <maz@kernel.org>, Rob Herring <robh+dt@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de>, Nishanth Menon <nm@ti.com>, Tero Kristo <t-kristo@ti.com>, Santosh Shilimkar <ssantosh@kernel.org>, Linux ARM Mailing List <linux-arm-kernel@lists.infradead.org>, Sekhar Nori <nsekhar@ti.com>, Grygorii Strashko <grygorii.strashko@ti.com>, Peter Ujfalusi <peter.ujfalusi@ti.com>, Device Tree Mailing List <devicetree@vger.kernel.org>, Suman Anna <s-anna@ti.com>, Lokesh Vutla <lokeshvutla@ti.com> Subject: [PATCH v6 10/13] irqchip/ti-sci-inta: Add support for INTA directly connecting to GIC Date: Thu, 6 Aug 2020 13:18:23 +0530 [thread overview] Message-ID: <20200806074826.24607-11-lokeshvutla@ti.com> (raw) In-Reply-To: <20200806074826.24607-1-lokeshvutla@ti.com> Driver assumes that Interrupt parent to Interrupt Aggregator is always Interrupt router. This is not true always and GIC can be a parent to Interrupt Aggregator. Update the driver to detect the parent and request the parent irqs accordingly. Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> --- drivers/irqchip/irq-ti-sci-inta.c | 87 ++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 13 deletions(-) diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c index fbfa1f4f521e..d4e97605456b 100644 --- a/drivers/irqchip/irq-ti-sci-inta.c +++ b/drivers/irqchip/irq-ti-sci-inta.c @@ -8,6 +8,7 @@ #include <linux/err.h> #include <linux/io.h> +#include <linux/irq.h> #include <linux/irqchip.h> #include <linux/irqdomain.h> #include <linux/interrupt.h> @@ -130,6 +131,37 @@ static void ti_sci_inta_irq_handler(struct irq_desc *desc) chained_irq_exit(irq_desc_get_chip(desc), desc); } +/** + * ti_sci_inta_xlate_irq() - Translate hwirq to parent's hwirq. + * @inta: IRQ domain corresponding to Interrupt Aggregator + * @irq: Hardware irq corresponding to the above irq domain + * + * Return parent irq number if translation is available else -ENOENT. + */ +static int ti_sci_inta_xlate_irq(struct ti_sci_inta_irq_domain *inta, + u16 vint_id) +{ + struct device_node *np = dev_of_node(&inta->pdev->dev); + u32 base, parent_base, size; + const __be32 *range; + int len; + + range = of_get_property(np, "ti,interrupt-ranges", &len); + if (!range) + return vint_id; + + for (len /= sizeof(*range); len >= 3; len -= 3) { + base = be32_to_cpu(*range++); + parent_base = be32_to_cpu(*range++); + size = be32_to_cpu(*range++); + + if (base <= vint_id && vint_id < base + size) + return vint_id - base + parent_base; + } + + return -ENOENT; +} + /** * ti_sci_inta_alloc_parent_irq() - Allocate parent irq to Interrupt aggregator * @domain: IRQ domain corresponding to Interrupt Aggregator @@ -141,30 +173,52 @@ static struct ti_sci_inta_vint_desc *ti_sci_inta_alloc_parent_irq(struct irq_dom struct ti_sci_inta_irq_domain *inta = domain->host_data; struct ti_sci_inta_vint_desc *vint_desc; struct irq_fwspec parent_fwspec; + struct device_node *parent_node; unsigned int parent_virq; - u16 vint_id; + u16 vint_id, p_hwirq; + int ret; vint_id = ti_sci_get_free_resource(inta->vint); if (vint_id == TI_SCI_RESOURCE_NULL) return ERR_PTR(-EINVAL); + p_hwirq = ti_sci_inta_xlate_irq(inta, vint_id); + if (p_hwirq < 0) { + ret = p_hwirq; + goto free_vint; + } + vint_desc = kzalloc(sizeof(*vint_desc), GFP_KERNEL); - if (!vint_desc) - return ERR_PTR(-ENOMEM); + if (!vint_desc) { + ret = -ENOMEM; + goto free_vint; + } vint_desc->domain = domain; vint_desc->vint_id = vint_id; INIT_LIST_HEAD(&vint_desc->list); - parent_fwspec.fwnode = of_node_to_fwnode(of_irq_find_parent(dev_of_node(&inta->pdev->dev))); - parent_fwspec.param_count = 2; - parent_fwspec.param[0] = inta->ti_sci_id; - parent_fwspec.param[1] = vint_desc->vint_id; + parent_node = of_irq_find_parent(dev_of_node(&inta->pdev->dev)); + parent_fwspec.fwnode = of_node_to_fwnode(parent_node); + + if (of_device_is_compatible(parent_node, "arm,gic-v3")) { + /* Parent is GIC */ + parent_fwspec.param_count = 3; + parent_fwspec.param[0] = 0; + parent_fwspec.param[1] = p_hwirq - 32; + parent_fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH; + } else { + /* Parent is Interrupt Router */ + parent_fwspec.param_count = 1; + parent_fwspec.param[0] = p_hwirq; + } parent_virq = irq_create_fwspec_mapping(&parent_fwspec); if (parent_virq == 0) { - kfree(vint_desc); - return ERR_PTR(-EINVAL); + dev_err(&inta->pdev->dev, "Parent IRQ allocation failed\n"); + ret = -EINVAL; + goto free_vint_desc; + } vint_desc->parent_virq = parent_virq; @@ -173,6 +227,11 @@ static struct ti_sci_inta_vint_desc *ti_sci_inta_alloc_parent_irq(struct irq_dom ti_sci_inta_irq_handler, vint_desc); return vint_desc; +free_vint_desc: + kfree(vint_desc); +free_vint: + ti_sci_release_resource(inta->vint, vint_id); + return ERR_PTR(ret); } /** @@ -555,15 +614,15 @@ static int ti_sci_inta_irq_domain_probe(struct platform_device *pdev) return -EINVAL; } - inta->vint = devm_ti_sci_get_of_resource(inta->sci, dev, inta->ti_sci_id, - "ti,sci-rm-range-vint"); + inta->vint = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, + TI_SCI_RESASG_SUBTYPE_IA_VINT); if (IS_ERR(inta->vint)) { dev_err(dev, "VINT resource allocation failed\n"); return PTR_ERR(inta->vint); } - inta->global_event = devm_ti_sci_get_of_resource(inta->sci, dev, inta->ti_sci_id, - "ti,sci-rm-range-global-event"); + inta->global_event = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, + TI_SCI_RESASG_SUBTYPE_GLOBAL_EVENT_SEVT); if (IS_ERR(inta->global_event)) { dev_err(dev, "Global event resource allocation failed\n"); return PTR_ERR(inta->global_event); @@ -594,6 +653,8 @@ static int ti_sci_inta_irq_domain_probe(struct platform_device *pdev) INIT_LIST_HEAD(&inta->vint_list); mutex_init(&inta->vint_mutex); + dev_info(dev, "Interrupt Aggregator domain %d created\n", pdev->id); + return 0; } -- 2.27.0
WARNING: multiple messages have this Message-ID (diff)
From: Lokesh Vutla <lokeshvutla@ti.com> To: Marc Zyngier <maz@kernel.org>, Rob Herring <robh+dt@kernel.org> Cc: Nishanth Menon <nm@ti.com>, Peter Ujfalusi <peter.ujfalusi@ti.com>, Grygorii Strashko <grygorii.strashko@ti.com>, Device Tree Mailing List <devicetree@vger.kernel.org>, Lokesh Vutla <lokeshvutla@ti.com>, Sekhar Nori <nsekhar@ti.com>, Tero Kristo <t-kristo@ti.com>, Santosh Shilimkar <ssantosh@kernel.org>, Thomas Gleixner <tglx@linutronix.de>, Linux ARM Mailing List <linux-arm-kernel@lists.infradead.org> Subject: [PATCH v6 10/13] irqchip/ti-sci-inta: Add support for INTA directly connecting to GIC Date: Thu, 6 Aug 2020 13:18:23 +0530 [thread overview] Message-ID: <20200806074826.24607-11-lokeshvutla@ti.com> (raw) In-Reply-To: <20200806074826.24607-1-lokeshvutla@ti.com> Driver assumes that Interrupt parent to Interrupt Aggregator is always Interrupt router. This is not true always and GIC can be a parent to Interrupt Aggregator. Update the driver to detect the parent and request the parent irqs accordingly. Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> --- drivers/irqchip/irq-ti-sci-inta.c | 87 ++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 13 deletions(-) diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c index fbfa1f4f521e..d4e97605456b 100644 --- a/drivers/irqchip/irq-ti-sci-inta.c +++ b/drivers/irqchip/irq-ti-sci-inta.c @@ -8,6 +8,7 @@ #include <linux/err.h> #include <linux/io.h> +#include <linux/irq.h> #include <linux/irqchip.h> #include <linux/irqdomain.h> #include <linux/interrupt.h> @@ -130,6 +131,37 @@ static void ti_sci_inta_irq_handler(struct irq_desc *desc) chained_irq_exit(irq_desc_get_chip(desc), desc); } +/** + * ti_sci_inta_xlate_irq() - Translate hwirq to parent's hwirq. + * @inta: IRQ domain corresponding to Interrupt Aggregator + * @irq: Hardware irq corresponding to the above irq domain + * + * Return parent irq number if translation is available else -ENOENT. + */ +static int ti_sci_inta_xlate_irq(struct ti_sci_inta_irq_domain *inta, + u16 vint_id) +{ + struct device_node *np = dev_of_node(&inta->pdev->dev); + u32 base, parent_base, size; + const __be32 *range; + int len; + + range = of_get_property(np, "ti,interrupt-ranges", &len); + if (!range) + return vint_id; + + for (len /= sizeof(*range); len >= 3; len -= 3) { + base = be32_to_cpu(*range++); + parent_base = be32_to_cpu(*range++); + size = be32_to_cpu(*range++); + + if (base <= vint_id && vint_id < base + size) + return vint_id - base + parent_base; + } + + return -ENOENT; +} + /** * ti_sci_inta_alloc_parent_irq() - Allocate parent irq to Interrupt aggregator * @domain: IRQ domain corresponding to Interrupt Aggregator @@ -141,30 +173,52 @@ static struct ti_sci_inta_vint_desc *ti_sci_inta_alloc_parent_irq(struct irq_dom struct ti_sci_inta_irq_domain *inta = domain->host_data; struct ti_sci_inta_vint_desc *vint_desc; struct irq_fwspec parent_fwspec; + struct device_node *parent_node; unsigned int parent_virq; - u16 vint_id; + u16 vint_id, p_hwirq; + int ret; vint_id = ti_sci_get_free_resource(inta->vint); if (vint_id == TI_SCI_RESOURCE_NULL) return ERR_PTR(-EINVAL); + p_hwirq = ti_sci_inta_xlate_irq(inta, vint_id); + if (p_hwirq < 0) { + ret = p_hwirq; + goto free_vint; + } + vint_desc = kzalloc(sizeof(*vint_desc), GFP_KERNEL); - if (!vint_desc) - return ERR_PTR(-ENOMEM); + if (!vint_desc) { + ret = -ENOMEM; + goto free_vint; + } vint_desc->domain = domain; vint_desc->vint_id = vint_id; INIT_LIST_HEAD(&vint_desc->list); - parent_fwspec.fwnode = of_node_to_fwnode(of_irq_find_parent(dev_of_node(&inta->pdev->dev))); - parent_fwspec.param_count = 2; - parent_fwspec.param[0] = inta->ti_sci_id; - parent_fwspec.param[1] = vint_desc->vint_id; + parent_node = of_irq_find_parent(dev_of_node(&inta->pdev->dev)); + parent_fwspec.fwnode = of_node_to_fwnode(parent_node); + + if (of_device_is_compatible(parent_node, "arm,gic-v3")) { + /* Parent is GIC */ + parent_fwspec.param_count = 3; + parent_fwspec.param[0] = 0; + parent_fwspec.param[1] = p_hwirq - 32; + parent_fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH; + } else { + /* Parent is Interrupt Router */ + parent_fwspec.param_count = 1; + parent_fwspec.param[0] = p_hwirq; + } parent_virq = irq_create_fwspec_mapping(&parent_fwspec); if (parent_virq == 0) { - kfree(vint_desc); - return ERR_PTR(-EINVAL); + dev_err(&inta->pdev->dev, "Parent IRQ allocation failed\n"); + ret = -EINVAL; + goto free_vint_desc; + } vint_desc->parent_virq = parent_virq; @@ -173,6 +227,11 @@ static struct ti_sci_inta_vint_desc *ti_sci_inta_alloc_parent_irq(struct irq_dom ti_sci_inta_irq_handler, vint_desc); return vint_desc; +free_vint_desc: + kfree(vint_desc); +free_vint: + ti_sci_release_resource(inta->vint, vint_id); + return ERR_PTR(ret); } /** @@ -555,15 +614,15 @@ static int ti_sci_inta_irq_domain_probe(struct platform_device *pdev) return -EINVAL; } - inta->vint = devm_ti_sci_get_of_resource(inta->sci, dev, inta->ti_sci_id, - "ti,sci-rm-range-vint"); + inta->vint = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, + TI_SCI_RESASG_SUBTYPE_IA_VINT); if (IS_ERR(inta->vint)) { dev_err(dev, "VINT resource allocation failed\n"); return PTR_ERR(inta->vint); } - inta->global_event = devm_ti_sci_get_of_resource(inta->sci, dev, inta->ti_sci_id, - "ti,sci-rm-range-global-event"); + inta->global_event = devm_ti_sci_get_resource(inta->sci, dev, inta->ti_sci_id, + TI_SCI_RESASG_SUBTYPE_GLOBAL_EVENT_SEVT); if (IS_ERR(inta->global_event)) { dev_err(dev, "Global event resource allocation failed\n"); return PTR_ERR(inta->global_event); @@ -594,6 +653,8 @@ static int ti_sci_inta_irq_domain_probe(struct platform_device *pdev) INIT_LIST_HEAD(&inta->vint_list); mutex_init(&inta->vint_mutex); + dev_info(dev, "Interrupt Aggregator domain %d created\n", pdev->id); + return 0; } -- 2.27.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-08-06 11:05 UTC|newest] Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-06 7:48 [PATCH v6 00/13] irqchip: ti,sci-intr/inta: Update the dt bindings to accept different interrupt parents Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 00/13] irqchip: ti, sci-intr/inta: " Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 01/13] firmware: ti_sci: Drop the device id to resource type translation Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-25 23:41 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 02/13] firmware: ti_sci: Drop unused structure ti_sci_rm_type_map Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-25 23:41 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 03/13] firmware: ti_sci: Add support for getting resource with subtype Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-25 23:41 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 04/13] dt-bindings: irqchip: ti,sci-intr: Update bindings to drop the usage of gic as parent Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 04/13] dt-bindings: irqchip: ti, sci-intr: " Lokesh Vutla 2020-08-25 23:41 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 05/13] dt-bindings: irqchip: Convert ti,sci-intr bindings to yaml Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 05/13] dt-bindings: irqchip: Convert ti, sci-intr " Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 06/13] irqchip/ti-sci-intr: Add support for INTR being a parent to INTR Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 07/13] dt-bindings: irqchip: ti,sci-inta: Update docs to support different parent Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 07/13] dt-bindings: irqchip: ti, sci-inta: " Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 08/13] dt-bindings: irqchip: Convert ti,sci-inta bindings to yaml Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 08/13] dt-bindings: irqchip: Convert ti, sci-inta " Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 09/13] irqchip/ti-sci-inta: Do not store TISCI device id in platform device id field Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla [this message] 2020-08-06 7:48 ` [PATCH v6 10/13] irqchip/ti-sci-inta: Add support for INTA directly connecting to GIC Lokesh Vutla 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 11/13] arm64: dts: k3-j721e: ti-sci-inta/intr: Update to latest bindings Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-12 13:35 ` Nishanth Menon 2020-08-12 13:35 ` Nishanth Menon 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 12/13] arm64: dts: k3-am65: " Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-12 13:35 ` Nishanth Menon 2020-08-12 13:35 ` Nishanth Menon 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-06 7:48 ` [PATCH v6 13/13] arm64: dts: k3-am65: Update the RM resource types Lokesh Vutla 2020-08-06 7:48 ` Lokesh Vutla 2020-08-12 13:36 ` Nishanth Menon 2020-08-12 13:36 ` Nishanth Menon 2020-08-25 23:40 ` [tip: irq/urgent] " tip-bot2 for Lokesh Vutla 2020-08-07 6:32 ` [PATCH v6 00/13] irqchip: ti,sci-intr/inta: Update the dt bindings to accept different interrupt parents Lokesh Vutla 2020-08-07 6:32 ` Lokesh Vutla 2020-08-12 2:14 ` Lokesh Vutla 2020-08-12 2:14 ` Lokesh Vutla 2020-08-12 13:40 ` Nishanth Menon 2020-08-12 13:40 ` Nishanth Menon 2020-08-13 9:41 ` Peter Ujfalusi 2020-08-13 9:41 ` Peter Ujfalusi 2020-08-13 10:03 ` Sekhar Nori 2020-08-13 10:03 ` Sekhar Nori 2020-08-13 10:20 ` Peter Ujfalusi 2020-08-13 10:20 ` Peter Ujfalusi 2020-08-16 21:03 ` [PATCH v6 00/13] irqchip: ti, sci-intr/inta: " Marc Zyngier 2020-08-16 21:03 ` Marc Zyngier 2020-08-17 17:30 ` Sekhar Nori 2020-08-17 17:30 ` Sekhar Nori
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200806074826.24607-11-lokeshvutla@ti.com \ --to=lokeshvutla@ti.com \ --cc=devicetree@vger.kernel.org \ --cc=grygorii.strashko@ti.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=maz@kernel.org \ --cc=nm@ti.com \ --cc=nsekhar@ti.com \ --cc=peter.ujfalusi@ti.com \ --cc=robh+dt@kernel.org \ --cc=s-anna@ti.com \ --cc=ssantosh@kernel.org \ --cc=t-kristo@ti.com \ --cc=tglx@linutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.