On Fri, 26 Feb 2021 20:11:17 +0000, Megha Dey <megha.dey@xxxxxxxxx> wrote: > > From: Dave Jiang <dave.jiang@xxxxxxxxx> > > Add new helpers to get the Linux IRQ number and device specific index > for given device-relative vector so that the drivers don't need to > allocate their own arrays to keep track of the vectors and hwirq for > the multi vector device MSI case. > > Reviewed-by: Tony Luck <tony.luck@xxxxxxxxx> > Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx> > Signed-off-by: Megha Dey <megha.dey@xxxxxxxxx> > --- > include/linux/msi.h | 2 ++ > kernel/irq/msi.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 46 insertions(+) > > diff --git a/include/linux/msi.h b/include/linux/msi.h > index 24abec0..d60a6ba 100644 > --- a/include/linux/msi.h > +++ b/include/linux/msi.h > @@ -451,6 +451,8 @@ struct irq_domain *platform_msi_create_irq_domain(struct fwnode_handle *fwnode, > int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec, > irq_write_msi_msg_t write_msi_msg); > void platform_msi_domain_free_irqs(struct device *dev); > +int msi_irq_vector(struct device *dev, unsigned int nr); > +int dev_msi_hwirq(struct device *dev, unsigned int nr); > > /* When an MSI domain is used as an intermediate domain */ > int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev, > diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c > index 047b59d..f2a8f55 100644 > --- a/kernel/irq/msi.c > +++ b/kernel/irq/msi.c > @@ -581,4 +581,48 @@ struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain) > return (struct msi_domain_info *)domain->host_data; > } > > +/** > + * msi_irq_vector - Get the Linux IRQ number of a device vector > + * @dev: device to operate on > + * @nr: device-relative interrupt vector index (0-based). > + * > + * Returns the Linux IRQ number of a device vector. > + */ > +int msi_irq_vector(struct device *dev, unsigned int nr) > +{ > + struct msi_desc *entry; > + int i = 0; > + > + for_each_msi_entry(entry, dev) { > + if (i == nr) > + return entry->irq; > + i++; This obviously doesn't work with Multi-MSI, does it? > + } > + WARN_ON_ONCE(1); > + return -EINVAL; > +} > +EXPORT_SYMBOL_GPL(msi_irq_vector); > + > +/** > + * dev_msi_hwirq - Get the device MSI hw IRQ number of a device vector > + * @dev: device to operate on > + * @nr: device-relative interrupt vector index (0-based). > + * > + * Return the dev_msi hw IRQ number of a device vector. > + */ > +int dev_msi_hwirq(struct device *dev, unsigned int nr) > +{ > + struct msi_desc *entry; > + int i = 0; > + > + for_each_msi_entry(entry, dev) { > + if (i == nr) > + return entry->device_msi.hwirq; > + i++; > + } > + WARN_ON_ONCE(1); > + return -EINVAL; > +} > +EXPORT_SYMBOL_GPL(dev_msi_hwirq); > + > #endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ And what uses these helpers? Thanks, M. -- Without deviation from the norm, progress is not possible.