Message ID | 20230307100949.9231-2-andrei.cherechesu@oss.nxp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix ARM Generic Timer interrupt parsing | expand |
Hi Andrei, > On 7 Mar 2023, at 11:09, Andrei Cherechesu (OSS) <andrei.cherechesu@oss.nxp.com> wrote: > > From: Andrei Cherechesu <andrei.cherechesu@nxp.com> > > Moved implementation for the function which parses the IRQs of a DT > node by the "interrupt-names" property from the SMMU-v3 driver > to the IRQ core code and made it non-static to be used as helper. > > Also changed it to receive a "struct dt_device_node*" as parameter, > like its counterpart, platform_get_irq(). Updated its usage inside > the SMMU-v3 driver accordingly. > > Signed-off-by: Andrei Cherechesu <andrei.cherechesu@nxp.com> Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com> Cheers Bertrand > --- > xen/arch/arm/include/asm/irq.h | 2 ++ > xen/arch/arm/irq.c | 14 +++++++++++ > xen/drivers/passthrough/arm/smmu-v3.c | 35 +++++---------------------- > 3 files changed, 22 insertions(+), 29 deletions(-) > > diff --git a/xen/arch/arm/include/asm/irq.h b/xen/arch/arm/include/asm/irq.h > index 245f49dcba..af94f41994 100644 > --- a/xen/arch/arm/include/asm/irq.h > +++ b/xen/arch/arm/include/asm/irq.h > @@ -89,6 +89,8 @@ int irq_set_type(unsigned int irq, unsigned int type); > > int platform_get_irq(const struct dt_device_node *device, int index); > > +int platform_get_irq_byname(struct dt_device_node *np, const char *name); > + > void irq_set_affinity(struct irq_desc *desc, const cpumask_t *cpu_mask); > > /* > diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c > index 79718f68e7..ded495792b 100644 > --- a/xen/arch/arm/irq.c > +++ b/xen/arch/arm/irq.c > @@ -718,6 +718,20 @@ int platform_get_irq(const struct dt_device_node *device, int index) > return irq; > } > > +int platform_get_irq_byname(struct dt_device_node *np, const char *name) > +{ > + int index; > + > + if ( unlikely(!name) ) > + return -EINVAL; > + > + index = dt_property_match_string(np, "interrupt-names", name); > + if ( index < 0 ) > + return index; > + > + return platform_get_irq(np, index); > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c > index d58c5cd0bf..bfdb62b395 100644 > --- a/xen/drivers/passthrough/arm/smmu-v3.c > +++ b/xen/drivers/passthrough/arm/smmu-v3.c > @@ -200,30 +200,6 @@ static inline void dev_iommu_priv_set(struct device *dev, void *priv) > fwspec->iommu_priv = priv; > } > > -static int platform_get_irq_byname_optional(struct device *dev, > - const char *name) > -{ > - int index, ret; > - struct dt_device_node *np = dev_to_dt(dev); > - > - if (unlikely(!name)) > - return -EINVAL; > - > - index = dt_property_match_string(np, "interrupt-names", name); > - if (index < 0) { > - dev_info(dev, "IRQ %s not found\n", name); > - return index; > - } > - > - ret = platform_get_irq(np, index); > - if (ret < 0) { > - dev_err(dev, "failed to get irq index %d\n", index); > - return -ENODEV; > - } > - > - return ret; > -} > - > /* Start of Linux SMMUv3 code */ > static bool disable_bypass = 1; > > @@ -2434,6 +2410,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev) > int irq, ret; > paddr_t ioaddr, iosize; > struct arm_smmu_device *smmu; > + struct dt_device_node *np = dev_to_dt(pdev); > > smmu = xzalloc(struct arm_smmu_device); > if (!smmu) > @@ -2451,7 +2428,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev) > } > > /* Base address */ > - ret = dt_device_get_address(dev_to_dt(pdev), 0, &ioaddr, &iosize); > + ret = dt_device_get_address(np, 0, &ioaddr, &iosize); > if (ret) > goto out_free_smmu; > > @@ -2484,19 +2461,19 @@ static int arm_smmu_device_probe(struct platform_device *pdev) > > /* Interrupt lines */ > > - irq = platform_get_irq_byname_optional(pdev, "combined"); > + irq = platform_get_irq_byname(np, "combined"); > if (irq > 0) > smmu->combined_irq = irq; > else { > - irq = platform_get_irq_byname_optional(pdev, "eventq"); > + irq = platform_get_irq_byname(np, "eventq"); > if (irq > 0) > smmu->evtq.q.irq = irq; > > - irq = platform_get_irq_byname_optional(pdev, "priq"); > + irq = platform_get_irq_byname(np, "priq"); > if (irq > 0) > smmu->priq.q.irq = irq; > > - irq = platform_get_irq_byname_optional(pdev, "gerror"); > + irq = platform_get_irq_byname(np, "gerror"); > if (irq > 0) > smmu->gerr_irq = irq; > } > -- > 2.35.1 > >
diff --git a/xen/arch/arm/include/asm/irq.h b/xen/arch/arm/include/asm/irq.h index 245f49dcba..af94f41994 100644 --- a/xen/arch/arm/include/asm/irq.h +++ b/xen/arch/arm/include/asm/irq.h @@ -89,6 +89,8 @@ int irq_set_type(unsigned int irq, unsigned int type); int platform_get_irq(const struct dt_device_node *device, int index); +int platform_get_irq_byname(struct dt_device_node *np, const char *name); + void irq_set_affinity(struct irq_desc *desc, const cpumask_t *cpu_mask); /* diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 79718f68e7..ded495792b 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -718,6 +718,20 @@ int platform_get_irq(const struct dt_device_node *device, int index) return irq; } +int platform_get_irq_byname(struct dt_device_node *np, const char *name) +{ + int index; + + if ( unlikely(!name) ) + return -EINVAL; + + index = dt_property_match_string(np, "interrupt-names", name); + if ( index < 0 ) + return index; + + return platform_get_irq(np, index); +} + /* * Local variables: * mode: C diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c index d58c5cd0bf..bfdb62b395 100644 --- a/xen/drivers/passthrough/arm/smmu-v3.c +++ b/xen/drivers/passthrough/arm/smmu-v3.c @@ -200,30 +200,6 @@ static inline void dev_iommu_priv_set(struct device *dev, void *priv) fwspec->iommu_priv = priv; } -static int platform_get_irq_byname_optional(struct device *dev, - const char *name) -{ - int index, ret; - struct dt_device_node *np = dev_to_dt(dev); - - if (unlikely(!name)) - return -EINVAL; - - index = dt_property_match_string(np, "interrupt-names", name); - if (index < 0) { - dev_info(dev, "IRQ %s not found\n", name); - return index; - } - - ret = platform_get_irq(np, index); - if (ret < 0) { - dev_err(dev, "failed to get irq index %d\n", index); - return -ENODEV; - } - - return ret; -} - /* Start of Linux SMMUv3 code */ static bool disable_bypass = 1; @@ -2434,6 +2410,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev) int irq, ret; paddr_t ioaddr, iosize; struct arm_smmu_device *smmu; + struct dt_device_node *np = dev_to_dt(pdev); smmu = xzalloc(struct arm_smmu_device); if (!smmu) @@ -2451,7 +2428,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev) } /* Base address */ - ret = dt_device_get_address(dev_to_dt(pdev), 0, &ioaddr, &iosize); + ret = dt_device_get_address(np, 0, &ioaddr, &iosize); if (ret) goto out_free_smmu; @@ -2484,19 +2461,19 @@ static int arm_smmu_device_probe(struct platform_device *pdev) /* Interrupt lines */ - irq = platform_get_irq_byname_optional(pdev, "combined"); + irq = platform_get_irq_byname(np, "combined"); if (irq > 0) smmu->combined_irq = irq; else { - irq = platform_get_irq_byname_optional(pdev, "eventq"); + irq = platform_get_irq_byname(np, "eventq"); if (irq > 0) smmu->evtq.q.irq = irq; - irq = platform_get_irq_byname_optional(pdev, "priq"); + irq = platform_get_irq_byname(np, "priq"); if (irq > 0) smmu->priq.q.irq = irq; - irq = platform_get_irq_byname_optional(pdev, "gerror"); + irq = platform_get_irq_byname(np, "gerror"); if (irq > 0) smmu->gerr_irq = irq; }