* [patch V2 01/36] device: Move MSI related data into a struct
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
@ 2021-12-06 22:38 ` Thomas Gleixner
2021-12-06 22:38 ` [patch V2 02/36] device: Add device::msi_data pointer and struct msi_device_data Thomas Gleixner
` (34 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:38 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
The only unconditional part of MSI data in struct device is the irqdomain
pointer. Everything else can be allocated on demand. Create a data
structure and move the irqdomain pointer into it. The other MSI specific
parts are going to be removed from struct device in later steps.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Will Deacon <will@kernel.org>
Cc: Santosh Shilimkar <ssantosh@kernel.org>
Cc: iommu@lists.linux-foundation.org
Cc: dmaengine@vger.kernel.org
---
drivers/base/platform-msi.c | 12 ++++++------
drivers/dma/ti/k3-udma.c | 4 ++--
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 +-
drivers/irqchip/irq-mvebu-icu.c | 6 +++---
drivers/soc/ti/k3-ringacc.c | 4 ++--
drivers/soc/ti/ti_sci_inta_msi.c | 2 +-
include/linux/device.h | 20 ++++++++++++++------
7 files changed, 29 insertions(+), 21 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -210,10 +210,10 @@ platform_msi_alloc_priv_data(struct devi
* accordingly (which would impact the max number of MSI
* capable devices).
*/
- if (!dev->msi_domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
+ if (!dev->msi.domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
return ERR_PTR(-EINVAL);
- if (dev->msi_domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
+ if (dev->msi.domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
dev_err(dev, "Incompatible msi_domain, giving up\n");
return ERR_PTR(-EINVAL);
}
@@ -269,7 +269,7 @@ int platform_msi_domain_alloc_irqs(struc
if (err)
goto out_free_priv_data;
- err = msi_domain_alloc_irqs(dev->msi_domain, dev, nvec);
+ err = msi_domain_alloc_irqs(dev->msi.domain, dev, nvec);
if (err)
goto out_free_desc;
@@ -282,7 +282,7 @@ int platform_msi_domain_alloc_irqs(struc
return 0;
out_free_irqs:
- msi_domain_free_irqs(dev->msi_domain, dev);
+ msi_domain_free_irqs(dev->msi.domain, dev);
out_free_desc:
platform_msi_free_descs(dev, 0, nvec);
out_free_priv_data:
@@ -306,7 +306,7 @@ void platform_msi_domain_free_irqs(struc
platform_msi_free_priv_data(desc->platform.msi_priv_data);
}
- msi_domain_free_irqs(dev->msi_domain, dev);
+ msi_domain_free_irqs(dev->msi.domain, dev);
platform_msi_free_descs(dev, 0, MAX_DEV_MSIS);
}
EXPORT_SYMBOL_GPL(platform_msi_domain_free_irqs);
@@ -354,7 +354,7 @@ struct irq_domain *
return NULL;
data->host_data = host_data;
- domain = irq_domain_create_hierarchy(dev->msi_domain, 0,
+ domain = irq_domain_create_hierarchy(dev->msi.domain, 0,
is_tree ? 0 : nvec,
dev->fwnode, ops, data);
if (!domain)
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -5279,9 +5279,9 @@ static int udma_probe(struct platform_de
if (IS_ERR(ud->ringacc))
return PTR_ERR(ud->ringacc);
- dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+ dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
DOMAIN_BUS_TI_SCI_INTA_MSI);
- if (!dev->msi_domain) {
+ if (!dev->msi.domain) {
dev_err(dev, "Failed to get MSI domain\n");
return -EPROBE_DEFER;
}
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3170,7 +3170,7 @@ static void arm_smmu_setup_msis(struct a
if (!(smmu->features & ARM_SMMU_FEAT_MSI))
return;
- if (!dev->msi_domain) {
+ if (!dev->msi.domain) {
dev_info(smmu->dev, "msi_domain absent - falling back to wired irqs\n");
return;
}
--- a/drivers/irqchip/irq-mvebu-icu.c
+++ b/drivers/irqchip/irq-mvebu-icu.c
@@ -314,12 +314,12 @@ static int mvebu_icu_subset_probe(struct
msi_data->subset_data = of_device_get_match_data(dev);
}
- dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+ dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
DOMAIN_BUS_PLATFORM_MSI);
- if (!dev->msi_domain)
+ if (!dev->msi.domain)
return -EPROBE_DEFER;
- msi_parent_dn = irq_domain_get_of_node(dev->msi_domain);
+ msi_parent_dn = irq_domain_get_of_node(dev->msi.domain);
if (!msi_parent_dn)
return -ENODEV;
--- a/drivers/soc/ti/k3-ringacc.c
+++ b/drivers/soc/ti/k3-ringacc.c
@@ -1356,9 +1356,9 @@ static int k3_ringacc_init(struct platfo
struct resource *res;
int ret, i;
- dev->msi_domain = of_msi_get_domain(dev, dev->of_node,
+ dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
DOMAIN_BUS_TI_SCI_INTA_MSI);
- if (!dev->msi_domain) {
+ if (!dev->msi.domain) {
dev_err(dev, "Failed to get MSI domain\n");
return -EPROBE_DEFER;
}
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -140,7 +140,7 @@ EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain
void ti_sci_inta_msi_domain_free_irqs(struct device *dev)
{
- msi_domain_free_irqs(dev->msi_domain, dev);
+ msi_domain_free_irqs(dev->msi.domain, dev);
ti_sci_inta_msi_free_descs(dev);
}
EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain_free_irqs);
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -372,6 +372,16 @@ struct dev_links_info {
};
/**
+ * struct dev_msi_info - Device data related to MSI
+ * @domain: The MSI interrupt domain associated to the device
+ */
+struct dev_msi_info {
+#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+ struct irq_domain *domain;
+#endif
+};
+
+/**
* struct device - The basic device structure
* @parent: The device's "parent" device, the device to which it is attached.
* In most cases, a parent device is some sort of bus or host
@@ -407,8 +417,8 @@ struct dev_links_info {
* @em_pd: device's energy model performance domain
* @pins: For device pin management.
* See Documentation/driver-api/pin-control.rst for details.
+ * @msi: MSI related data
* @msi_list: Hosts MSI descriptors
- * @msi_domain: The generic MSI domain this device is using.
* @numa_node: NUMA node this device is close to.
* @dma_ops: DMA mapping operations for this device.
* @dma_mask: Dma mask (if dma'ble device).
@@ -500,12 +510,10 @@ struct device {
struct em_perf_domain *em_pd;
#endif
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- struct irq_domain *msi_domain;
-#endif
#ifdef CONFIG_PINCTRL
struct dev_pin_info *pins;
#endif
+ struct dev_msi_info msi;
#ifdef CONFIG_GENERIC_MSI_IRQ
struct list_head msi_list;
#endif
@@ -666,7 +674,7 @@ static inline void set_dev_node(struct d
static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
{
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- return dev->msi_domain;
+ return dev->msi.domain;
#else
return NULL;
#endif
@@ -675,7 +683,7 @@ static inline struct irq_domain *dev_get
static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
{
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- dev->msi_domain = d;
+ dev->msi.domain = d;
#endif
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 02/36] device: Add device::msi_data pointer and struct msi_device_data
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
2021-12-06 22:38 ` [patch V2 01/36] device: Move MSI related data into a struct Thomas Gleixner
@ 2021-12-06 22:38 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 03/36] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
` (33 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:38 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Create struct msi_device_data and add a pointer of that type to struct
dev_msi_info, which is part of struct device. Provide an allocator function
which can be invoked from the MSI interrupt allocation code pathes.
Add a properties field to the data structure as a first member so the
allocation size is not zero bytes. The field will be uses later on.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
include/linux/device.h | 5 +++++
include/linux/msi.h | 18 ++++++++++++++++++
kernel/irq/msi.c | 32 ++++++++++++++++++++++++++++++++
3 files changed, 55 insertions(+)
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -45,6 +45,7 @@ struct iommu_ops;
struct iommu_group;
struct dev_pin_info;
struct dev_iommu;
+struct msi_device_data;
/**
* struct subsys_interface - interfaces to device functions
@@ -374,11 +375,15 @@ struct dev_links_info {
/**
* struct dev_msi_info - Device data related to MSI
* @domain: The MSI interrupt domain associated to the device
+ * @data: Pointer to MSI device data
*/
struct dev_msi_info {
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
struct irq_domain *domain;
#endif
+#ifdef CONFIG_GENERIC_MSI_IRQ
+ struct msi_device_data *data;
+#endif
};
/**
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -171,6 +171,16 @@ struct msi_desc {
};
};
+/**
+ * msi_device_data - MSI per device data
+ * @properties: MSI properties which are interesting to drivers
+ */
+struct msi_device_data {
+ unsigned long properties;
+};
+
+int msi_setup_device_data(struct device *dev);
+
/* Helpers to hide struct msi_desc implementation details */
#define msi_desc_to_dev(desc) ((desc)->dev)
#define dev_to_msi_list(dev) (&(dev)->msi_list)
@@ -233,10 +243,16 @@ void pci_msi_mask_irq(struct irq_data *d
void pci_msi_unmask_irq(struct irq_data *data);
#ifdef CONFIG_SYSFS
+int msi_device_populate_sysfs(struct device *dev);
+void msi_device_destroy_sysfs(struct device *dev);
+
const struct attribute_group **msi_populate_sysfs(struct device *dev);
void msi_destroy_sysfs(struct device *dev,
const struct attribute_group **msi_irq_groups);
#else
+static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
+static inline void msi_device_destroy_sysfs(struct device *dev) { }
+
static inline const struct attribute_group **msi_populate_sysfs(struct device *dev)
{
return NULL;
@@ -384,6 +400,8 @@ enum {
MSI_FLAG_MUST_REACTIVATE = (1 << 5),
/* Is level-triggered capable, using two messages */
MSI_FLAG_LEVEL_CAPABLE = (1 << 6),
+ /* Populate sysfs on alloc() and destroy it on free() */
+ MSI_FLAG_DEV_SYSFS = (1 << 7),
};
int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -73,6 +73,38 @@ void get_cached_msi_msg(unsigned int irq
}
EXPORT_SYMBOL_GPL(get_cached_msi_msg);
+static void msi_device_data_release(struct device *dev, void *res)
+{
+ WARN_ON_ONCE(!list_empty(&dev->msi_list));
+ dev->msi.data = NULL;
+}
+
+/**
+ * msi_setup_device_data - Setup MSI device data
+ * @dev: Device for which MSI device data should be set up
+ *
+ * Return: 0 on success, appropriate error code otherwise
+ *
+ * This can be called more than once for @dev. If the MSI device data is
+ * already allocated the call succeeds. The allocated memory is
+ * automatically released when the device is destroyed.
+ */
+int msi_setup_device_data(struct device *dev)
+{
+ struct msi_device_data *md;
+
+ if (dev->msi.data)
+ return 0;
+
+ md = devres_alloc(msi_device_data_release, sizeof(*md), GFP_KERNEL);
+ if (!md)
+ return -ENOMEM;
+
+ dev->msi.data = md;
+ devres_add(dev, md);
+ return 0;
+}
+
#ifdef CONFIG_SYSFS
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
char *buf)
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 03/36] PCI/MSI: Allocate MSI device data on first use
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
2021-12-06 22:38 ` [patch V2 01/36] device: Move MSI related data into a struct Thomas Gleixner
2021-12-06 22:38 ` [patch V2 02/36] device: Add device::msi_data pointer and struct msi_device_data Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 21:03 ` Bjorn Helgaas
2021-12-06 22:39 ` [patch V2 04/36] platform-msi: " Thomas Gleixner
` (32 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Allocate MSI device data on first use, i.e. when a PCI driver invokes one
of the PCI/MSI enablement functions.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/pci/msi/msi.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -889,10 +889,12 @@ static int __pci_enable_msi_range(struct
/* deprecated, don't use */
int pci_enable_msi(struct pci_dev *dev)
{
- int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
- if (rc < 0)
- return rc;
- return 0;
+ int rc = msi_setup_device_data(&dev->dev);
+
+ if (!rc)
+ rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+
+ return rc < 0 ? rc : 0;
}
EXPORT_SYMBOL(pci_enable_msi);
@@ -947,7 +949,11 @@ static int __pci_enable_msix_range(struc
int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
int minvec, int maxvec)
{
- return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+ int ret = msi_setup_device_data(&dev->dev);
+
+ if (!ret)
+ ret = __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+ return ret;
}
EXPORT_SYMBOL(pci_enable_msix_range);
@@ -974,8 +980,12 @@ int pci_alloc_irq_vectors_affinity(struc
struct irq_affinity *affd)
{
struct irq_affinity msi_default_affd = {0};
+ int ret = msi_setup_device_data(&dev->dev);
int nvecs = -ENOSPC;
+ if (ret)
+ return ret;
+
if (flags & PCI_IRQ_AFFINITY) {
if (!affd)
affd = &msi_default_affd;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 03/36] PCI/MSI: Allocate MSI device data on first use
2021-12-06 22:39 ` [patch V2 03/36] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-07 21:03 ` Bjorn Helgaas
0 siblings, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:03 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:00PM +0100, Thomas Gleixner wrote:
> Allocate MSI device data on first use, i.e. when a PCI driver invokes one
> of the PCI/MSI enablement functions.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 20 +++++++++++++++-----
> 1 file changed, 15 insertions(+), 5 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -889,10 +889,12 @@ static int __pci_enable_msi_range(struct
> /* deprecated, don't use */
> int pci_enable_msi(struct pci_dev *dev)
> {
> - int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> - if (rc < 0)
> - return rc;
> - return 0;
> + int rc = msi_setup_device_data(&dev->dev);
> +
> + if (!rc)
> + rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> +
> + return rc < 0 ? rc : 0;
> }
> EXPORT_SYMBOL(pci_enable_msi);
>
> @@ -947,7 +949,11 @@ static int __pci_enable_msix_range(struc
> int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> int minvec, int maxvec)
> {
> - return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> + int ret = msi_setup_device_data(&dev->dev);
> +
> + if (!ret)
> + ret = __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> + return ret;
> }
> EXPORT_SYMBOL(pci_enable_msix_range);
>
> @@ -974,8 +980,12 @@ int pci_alloc_irq_vectors_affinity(struc
> struct irq_affinity *affd)
> {
> struct irq_affinity msi_default_affd = {0};
> + int ret = msi_setup_device_data(&dev->dev);
> int nvecs = -ENOSPC;
>
> + if (ret)
> + return ret;
> +
> if (flags & PCI_IRQ_AFFINITY) {
> if (!affd)
> affd = &msi_default_affd;
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 04/36] platform-msi: Allocate MSI device data on first use
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (2 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 03/36] PCI/MSI: Allocate MSI device data on first use Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 05/36] bus: fsl-mc-msi: " Thomas Gleixner
` (31 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Allocate the MSI device data on first invocation of the allocation function
for platform MSI private data.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/base/platform-msi.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -204,6 +204,8 @@ platform_msi_alloc_priv_data(struct devi
irq_write_msi_msg_t write_msi_msg)
{
struct platform_msi_priv_data *datap;
+ int err;
+
/*
* Limit the number of interrupts to 2048 per device. Should we
* need to bump this up, DEV_ID_SHIFT should be adjusted
@@ -218,6 +220,10 @@ platform_msi_alloc_priv_data(struct devi
return ERR_PTR(-EINVAL);
}
+ err = msi_setup_device_data(dev);
+ if (err)
+ return ERR_PTR(err);
+
/* Already had a helping of MSI? Greed... */
if (!list_empty(dev_to_msi_list(dev)))
return ERR_PTR(-EBUSY);
@@ -229,7 +235,7 @@ platform_msi_alloc_priv_data(struct devi
datap->devid = ida_simple_get(&platform_msi_devid_ida,
0, 1 << DEV_ID_SHIFT, GFP_KERNEL);
if (datap->devid < 0) {
- int err = datap->devid;
+ err = datap->devid;
kfree(datap);
return ERR_PTR(err);
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 05/36] bus: fsl-mc-msi: Allocate MSI device data on first use
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (3 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 04/36] platform-msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 06/36] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
` (30 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Allocate the MSI device data on first invocation of the allocation function.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
---
drivers/bus/fsl-mc/fsl-mc-msi.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -253,6 +253,14 @@ int fsl_mc_msi_domain_alloc_irqs(struct
struct irq_domain *msi_domain;
int error;
+ msi_domain = dev_get_msi_domain(dev);
+ if (!msi_domain)
+ return -EINVAL;
+
+ error = msi_setup_device_data(dev);
+ if (error)
+ return error;
+
if (!list_empty(dev_to_msi_list(dev)))
return -EINVAL;
@@ -260,12 +268,6 @@ int fsl_mc_msi_domain_alloc_irqs(struct
if (error < 0)
return error;
- msi_domain = dev_get_msi_domain(dev);
- if (!msi_domain) {
- error = -EINVAL;
- goto cleanup_msi_descs;
- }
-
/*
* NOTE: Calling this function will trigger the invocation of the
* its_fsl_mc_msi_prepare() callback
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 06/36] soc: ti: ti_sci_inta_msi: Allocate MSI device data on first use
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (4 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 05/36] bus: fsl-mc-msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 07/36] genirq/msi: Provide msi_device_populate/destroy_sysfs() Thomas Gleixner
` (29 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, linux-arm-kernel, Jason Gunthorpe, xen-devel,
Kevin Tian, Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
Megha Dey, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Allocate the MSI device data on first invocation of the allocation function.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Nishanth Menon <nm@ti.com>
Cc: Tero Kristo <kristo@kernel.org>
Cc: Santosh Shilimkar <ssantosh@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
---
drivers/soc/ti/ti_sci_inta_msi.c | 4 ++++
1 file changed, 4 insertions(+)
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -120,6 +120,10 @@ int ti_sci_inta_msi_domain_alloc_irqs(st
if (pdev->id < 0)
return -ENODEV;
+ ret = msi_setup_device_data(dev);
+ if (ret)
+ return ret;
+
nvec = ti_sci_inta_msi_alloc_descs(dev, res);
if (nvec <= 0)
return nvec;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 07/36] genirq/msi: Provide msi_device_populate/destroy_sysfs()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (5 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 06/36] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 08/36] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
` (28 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Add new allocation functions which can be activated by domain info
flags. They store the groups pointer in struct msi_device_data.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
include/linux/msi.h | 4 ++++
kernel/irq/msi.c | 42 ++++++++++++++++++++++++++++++++++++++++--
2 files changed, 44 insertions(+), 2 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -56,6 +56,8 @@ struct irq_data;
struct msi_desc;
struct pci_dev;
struct platform_msi_priv_data;
+struct attribute_group;
+
void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
#ifdef CONFIG_GENERIC_MSI_IRQ
void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
@@ -174,9 +176,11 @@ struct msi_desc {
/**
* msi_device_data - MSI per device data
* @properties: MSI properties which are interesting to drivers
+ * @attrs: Pointer to the sysfs attribute group
*/
struct msi_device_data {
unsigned long properties;
+ const struct attribute_group **attrs;
};
int msi_setup_device_data(struct device *dev);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -213,6 +213,20 @@ const struct attribute_group **msi_popul
}
/**
+ * msi_device_populate_sysfs - Populate msi_irqs sysfs entries for a device
+ * @dev: The device (PCI, platform etc) which will get sysfs entries
+ */
+int msi_device_populate_sysfs(struct device *dev)
+{
+ const struct attribute_group **group = msi_populate_sysfs(dev);
+
+ if (IS_ERR(group))
+ return PTR_ERR(group);
+ dev->msi.data->attrs = group;
+ return 0;
+}
+
+/**
* msi_destroy_sysfs - Destroy msi_irqs sysfs entries for devices
* @dev: The device(PCI, platform etc) who will remove sysfs entries
* @msi_irq_groups: attribute_group for device msi_irqs entries
@@ -238,6 +252,17 @@ void msi_destroy_sysfs(struct device *de
kfree(msi_irq_groups);
}
}
+
+/**
+ * msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
+ * @dev: The device (PCI, platform etc) for which to remove
+ * sysfs entries
+ */
+void msi_device_destroy_sysfs(struct device *dev)
+{
+ msi_destroy_sysfs(dev, dev->msi.data->attrs);
+ dev->msi.data->attrs = NULL;
+}
#endif
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
@@ -685,8 +710,19 @@ int msi_domain_alloc_irqs(struct irq_dom
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
+ int ret;
- return ops->domain_alloc_irqs(domain, dev, nvec);
+ ret = ops->domain_alloc_irqs(domain, dev, nvec);
+ if (ret)
+ return ret;
+
+ if (!(info->flags & MSI_FLAG_DEV_SYSFS))
+ return 0;
+
+ ret = msi_device_populate_sysfs(dev);
+ if (ret)
+ msi_domain_free_irqs(domain, dev);
+ return ret;
}
void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
@@ -725,7 +761,9 @@ void msi_domain_free_irqs(struct irq_dom
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
- return ops->domain_free_irqs(domain, dev);
+ if (info->flags & MSI_FLAG_DEV_SYSFS)
+ msi_device_destroy_sysfs(dev);
+ ops->domain_free_irqs(domain, dev);
}
/**
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 08/36] PCI/MSI: Let the irq code handle sysfs groups
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (6 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 07/36] genirq/msi: Provide msi_device_populate/destroy_sysfs() Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 21:04 ` Bjorn Helgaas
2021-12-06 22:39 ` [patch V2 09/36] platform-msi: Let the core " Thomas Gleixner
` (27 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Set the domain info flag which makes the core code handle sysfs groups and
put an explicit invocation into the legacy code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/pci/msi/irqdomain.c | 2 +-
drivers/pci/msi/legacy.c | 6 +++++-
drivers/pci/msi/msi.c | 23 -----------------------
include/linux/pci.h | 1 -
4 files changed, 6 insertions(+), 26 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -159,7 +159,7 @@ struct irq_domain *pci_msi_create_irq_do
if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
pci_msi_domain_update_chip_ops(info);
- info->flags |= MSI_FLAG_ACTIVATE_EARLY;
+ info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
info->flags |= MSI_FLAG_MUST_REACTIVATE;
--- a/drivers/pci/msi/legacy.c
+++ b/drivers/pci/msi/legacy.c
@@ -70,10 +70,14 @@ int pci_msi_legacy_setup_msi_irqs(struct
{
int ret = arch_setup_msi_irqs(dev, nvec, type);
- return pci_msi_setup_check_result(dev, type, ret);
+ ret = pci_msi_setup_check_result(dev, type, ret);
+ if (!ret)
+ ret = msi_device_populate_sysfs(&dev->dev);
+ return ret;
}
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
{
+ msi_device_destroy_sysfs(&dev->dev);
arch_teardown_msi_irqs(dev);
}
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -233,11 +233,6 @@ static void free_msi_irqs(struct pci_dev
for (i = 0; i < entry->nvec_used; i++)
BUG_ON(irq_has_action(entry->irq + i));
- if (dev->msi_irq_groups) {
- msi_destroy_sysfs(&dev->dev, dev->msi_irq_groups);
- dev->msi_irq_groups = NULL;
- }
-
pci_msi_teardown_msi_irqs(dev);
list_for_each_entry_safe(entry, tmp, msi_list, list) {
@@ -417,7 +412,6 @@ static int msi_verify_entries(struct pci
static int msi_capability_init(struct pci_dev *dev, int nvec,
struct irq_affinity *affd)
{
- const struct attribute_group **groups;
struct msi_desc *entry;
int ret;
@@ -441,14 +435,6 @@ static int msi_capability_init(struct pc
if (ret)
goto err;
- groups = msi_populate_sysfs(&dev->dev);
- if (IS_ERR(groups)) {
- ret = PTR_ERR(groups);
- goto err;
- }
-
- dev->msi_irq_groups = groups;
-
/* Set MSI enabled bits */
pci_intx_for_msi(dev, 0);
pci_msi_set_enable(dev, 1);
@@ -576,7 +562,6 @@ static void msix_mask_all(void __iomem *
static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd)
{
- const struct attribute_group **groups;
void __iomem *base;
int ret, tsize;
u16 control;
@@ -618,14 +603,6 @@ static int msix_capability_init(struct p
msix_update_entries(dev, entries);
- groups = msi_populate_sysfs(&dev->dev);
- if (IS_ERR(groups)) {
- ret = PTR_ERR(groups);
- goto out_free;
- }
-
- dev->msi_irq_groups = groups;
-
/* Set MSI-X enabled bits and unmask the function */
pci_intx_for_msi(dev, 0);
dev->msix_enabled = 1;
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -475,7 +475,6 @@ struct pci_dev {
#ifdef CONFIG_PCI_MSI
void __iomem *msix_base;
raw_spinlock_t msi_lock;
- const struct attribute_group **msi_irq_groups;
#endif
struct pci_vpd vpd;
#ifdef CONFIG_PCIE_DPC
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 08/36] PCI/MSI: Let the irq code handle sysfs groups
2021-12-06 22:39 ` [patch V2 08/36] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
@ 2021-12-07 21:04 ` Bjorn Helgaas
0 siblings, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:04 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:09PM +0100, Thomas Gleixner wrote:
> Set the domain info flag which makes the core code handle sysfs groups and
> put an explicit invocation into the legacy code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 2 +-
> drivers/pci/msi/legacy.c | 6 +++++-
> drivers/pci/msi/msi.c | 23 -----------------------
> include/linux/pci.h | 1 -
> 4 files changed, 6 insertions(+), 26 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -159,7 +159,7 @@ struct irq_domain *pci_msi_create_irq_do
> if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
> pci_msi_domain_update_chip_ops(info);
>
> - info->flags |= MSI_FLAG_ACTIVATE_EARLY;
> + info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
> if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
> info->flags |= MSI_FLAG_MUST_REACTIVATE;
>
> --- a/drivers/pci/msi/legacy.c
> +++ b/drivers/pci/msi/legacy.c
> @@ -70,10 +70,14 @@ int pci_msi_legacy_setup_msi_irqs(struct
> {
> int ret = arch_setup_msi_irqs(dev, nvec, type);
>
> - return pci_msi_setup_check_result(dev, type, ret);
> + ret = pci_msi_setup_check_result(dev, type, ret);
> + if (!ret)
> + ret = msi_device_populate_sysfs(&dev->dev);
> + return ret;
> }
>
> void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
> {
> + msi_device_destroy_sysfs(&dev->dev);
> arch_teardown_msi_irqs(dev);
> }
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -233,11 +233,6 @@ static void free_msi_irqs(struct pci_dev
> for (i = 0; i < entry->nvec_used; i++)
> BUG_ON(irq_has_action(entry->irq + i));
>
> - if (dev->msi_irq_groups) {
> - msi_destroy_sysfs(&dev->dev, dev->msi_irq_groups);
> - dev->msi_irq_groups = NULL;
> - }
> -
> pci_msi_teardown_msi_irqs(dev);
>
> list_for_each_entry_safe(entry, tmp, msi_list, list) {
> @@ -417,7 +412,6 @@ static int msi_verify_entries(struct pci
> static int msi_capability_init(struct pci_dev *dev, int nvec,
> struct irq_affinity *affd)
> {
> - const struct attribute_group **groups;
> struct msi_desc *entry;
> int ret;
>
> @@ -441,14 +435,6 @@ static int msi_capability_init(struct pc
> if (ret)
> goto err;
>
> - groups = msi_populate_sysfs(&dev->dev);
> - if (IS_ERR(groups)) {
> - ret = PTR_ERR(groups);
> - goto err;
> - }
> -
> - dev->msi_irq_groups = groups;
> -
> /* Set MSI enabled bits */
> pci_intx_for_msi(dev, 0);
> pci_msi_set_enable(dev, 1);
> @@ -576,7 +562,6 @@ static void msix_mask_all(void __iomem *
> static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
> int nvec, struct irq_affinity *affd)
> {
> - const struct attribute_group **groups;
> void __iomem *base;
> int ret, tsize;
> u16 control;
> @@ -618,14 +603,6 @@ static int msix_capability_init(struct p
>
> msix_update_entries(dev, entries);
>
> - groups = msi_populate_sysfs(&dev->dev);
> - if (IS_ERR(groups)) {
> - ret = PTR_ERR(groups);
> - goto out_free;
> - }
> -
> - dev->msi_irq_groups = groups;
> -
> /* Set MSI-X enabled bits and unmask the function */
> pci_intx_for_msi(dev, 0);
> dev->msix_enabled = 1;
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -475,7 +475,6 @@ struct pci_dev {
> #ifdef CONFIG_PCI_MSI
> void __iomem *msix_base;
> raw_spinlock_t msi_lock;
> - const struct attribute_group **msi_irq_groups;
> #endif
> struct pci_vpd vpd;
> #ifdef CONFIG_PCIE_DPC
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 09/36] platform-msi: Let the core code handle sysfs groups
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (7 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 08/36] PCI/MSI: Let the irq code handle sysfs groups Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 10/36] genirq/msi: Remove the original sysfs interfaces Thomas Gleixner
` (26 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Set the domain info flag and remove the local sysfs code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/base/platform-msi.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -23,7 +23,6 @@
struct platform_msi_priv_data {
struct device *dev;
void *host_data;
- const struct attribute_group **msi_irq_groups;
msi_alloc_info_t arg;
irq_write_msi_msg_t write_msg;
int devid;
@@ -191,6 +190,7 @@ struct irq_domain *platform_msi_create_i
platform_msi_update_dom_ops(info);
if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
platform_msi_update_chip_ops(info);
+ info->flags |= MSI_FLAG_DEV_SYSFS;
domain = msi_create_irq_domain(fwnode, info, parent);
if (domain)
@@ -279,16 +279,8 @@ int platform_msi_domain_alloc_irqs(struc
if (err)
goto out_free_desc;
- priv_data->msi_irq_groups = msi_populate_sysfs(dev);
- if (IS_ERR(priv_data->msi_irq_groups)) {
- err = PTR_ERR(priv_data->msi_irq_groups);
- goto out_free_irqs;
- }
-
return 0;
-out_free_irqs:
- msi_domain_free_irqs(dev->msi.domain, dev);
out_free_desc:
platform_msi_free_descs(dev, 0, nvec);
out_free_priv_data:
@@ -308,7 +300,6 @@ void platform_msi_domain_free_irqs(struc
struct msi_desc *desc;
desc = first_msi_entry(dev);
- msi_destroy_sysfs(dev, desc->platform.msi_priv_data->msi_irq_groups);
platform_msi_free_priv_data(desc->platform.msi_priv_data);
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 10/36] genirq/msi: Remove the original sysfs interfaces
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (8 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 09/36] platform-msi: Let the core " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 11/36] platform-msi: Rename functions and clarify comments Thomas Gleixner
` (25 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
No more users. Refactor the core code accordingly and move the global
interface under CONFIG_PCI_MSI_ARCH_FALLBACKS.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
include/linux/msi.h | 29 +++++++---------------------
kernel/irq/msi.c | 53 +++++++++++++++++++---------------------------------
2 files changed, 28 insertions(+), 54 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -246,26 +246,6 @@ void __pci_write_msi_msg(struct msi_desc
void pci_msi_mask_irq(struct irq_data *data);
void pci_msi_unmask_irq(struct irq_data *data);
-#ifdef CONFIG_SYSFS
-int msi_device_populate_sysfs(struct device *dev);
-void msi_device_destroy_sysfs(struct device *dev);
-
-const struct attribute_group **msi_populate_sysfs(struct device *dev);
-void msi_destroy_sysfs(struct device *dev,
- const struct attribute_group **msi_irq_groups);
-#else
-static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
-static inline void msi_device_destroy_sysfs(struct device *dev) { }
-
-static inline const struct attribute_group **msi_populate_sysfs(struct device *dev)
-{
- return NULL;
-}
-static inline void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
-{
-}
-#endif
-
/*
* The arch hooks to setup up msi irqs. Default functions are implemented
* as weak symbols so that they /can/ be overriden by architecture specific
@@ -279,7 +259,14 @@ int arch_setup_msi_irq(struct pci_dev *d
void arch_teardown_msi_irq(unsigned int irq);
int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void arch_teardown_msi_irqs(struct pci_dev *dev);
-#endif
+#ifdef CONFIG_SYSFS
+int msi_device_populate_sysfs(struct device *dev);
+void msi_device_destroy_sysfs(struct device *dev);
+#else /* CONFIG_SYSFS */
+static inline int msi_device_populate_sysfs(struct device *dev) { return 0; }
+static inline void msi_device_destroy_sysfs(struct device *dev) { }
+#endif /* !CONFIG_SYSFS */
+#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */
/*
* The restore hook is still available even for fully irq domain based
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -131,12 +131,8 @@ static ssize_t msi_mode_show(struct devi
/**
* msi_populate_sysfs - Populate msi_irqs sysfs entries for devices
* @dev: The device(PCI, platform etc) who will get sysfs entries
- *
- * Return attribute_group ** so that specific bus MSI can save it to
- * somewhere during initilizing msi irqs. If devices has no MSI irq,
- * return NULL; if it fails to populate sysfs, return ERR_PTR
*/
-const struct attribute_group **msi_populate_sysfs(struct device *dev)
+static const struct attribute_group **msi_populate_sysfs(struct device *dev)
{
const struct attribute_group **msi_irq_groups;
struct attribute **msi_attrs, *msi_attr;
@@ -227,41 +223,32 @@ int msi_device_populate_sysfs(struct dev
}
/**
- * msi_destroy_sysfs - Destroy msi_irqs sysfs entries for devices
- * @dev: The device(PCI, platform etc) who will remove sysfs entries
- * @msi_irq_groups: attribute_group for device msi_irqs entries
- */
-void msi_destroy_sysfs(struct device *dev, const struct attribute_group **msi_irq_groups)
-{
- struct device_attribute *dev_attr;
- struct attribute **msi_attrs;
- int count = 0;
-
- if (msi_irq_groups) {
- sysfs_remove_groups(&dev->kobj, msi_irq_groups);
- msi_attrs = msi_irq_groups[0]->attrs;
- while (msi_attrs[count]) {
- dev_attr = container_of(msi_attrs[count],
- struct device_attribute, attr);
- kfree(dev_attr->attr.name);
- kfree(dev_attr);
- ++count;
- }
- kfree(msi_attrs);
- kfree(msi_irq_groups[0]);
- kfree(msi_irq_groups);
- }
-}
-
-/**
* msi_device_destroy_sysfs - Destroy msi_irqs sysfs entries for a device
* @dev: The device (PCI, platform etc) for which to remove
* sysfs entries
*/
void msi_device_destroy_sysfs(struct device *dev)
{
- msi_destroy_sysfs(dev, dev->msi.data->attrs);
+ const struct attribute_group **msi_irq_groups = dev->msi.data->attrs;
+ struct device_attribute *dev_attr;
+ struct attribute **msi_attrs;
+ int count = 0;
+
dev->msi.data->attrs = NULL;
+ if (!msi_irq_groups)
+ return;
+
+ sysfs_remove_groups(&dev->kobj, msi_irq_groups);
+ msi_attrs = msi_irq_groups[0]->attrs;
+ while (msi_attrs[count]) {
+ dev_attr = container_of(msi_attrs[count], struct device_attribute, attr);
+ kfree(dev_attr->attr.name);
+ kfree(dev_attr);
+ ++count;
+ }
+ kfree(msi_attrs);
+ kfree(msi_irq_groups[0]);
+ kfree(msi_irq_groups);
}
#endif
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 11/36] platform-msi: Rename functions and clarify comments
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (9 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 10/36] genirq/msi: Remove the original sysfs interfaces Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 12/36] platform-msi: Store platform private data pointer in msi_device_data Thomas Gleixner
` (24 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
It's hard to distinguish what platform_msi_domain_alloc() and
platform_msi_domain_alloc_irqs() are about. Make the distinction more
explicit and add comments which explain the use cases properly.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/base/platform-msi.c | 36 +++++++++++++++++++++---------------
drivers/irqchip/irq-mbigen.c | 4 ++--
drivers/irqchip/irq-mvebu-icu.c | 6 +++---
include/linux/msi.h | 8 ++++----
4 files changed, 30 insertions(+), 24 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -313,17 +313,18 @@ EXPORT_SYMBOL_GPL(platform_msi_domain_fr
* a platform-msi domain
* @domain: The platform-msi domain
*
- * Returns the private data provided when calling
- * platform_msi_create_device_domain.
+ * Return: The private data provided when calling
+ * platform_msi_create_device_domain().
*/
void *platform_msi_get_host_data(struct irq_domain *domain)
{
struct platform_msi_priv_data *data = domain->host_data;
+
return data->host_data;
}
/**
- * __platform_msi_create_device_domain - Create a platform-msi domain
+ * __platform_msi_create_device_domain - Create a platform-msi device domain
*
* @dev: The device generating the MSIs
* @nvec: The number of MSIs that need to be allocated
@@ -332,7 +333,11 @@ void *platform_msi_get_host_data(struct
* @ops: The hierarchy domain operations to use
* @host_data: Private data associated to this domain
*
- * Returns an irqdomain for @nvec interrupts
+ * Return: An irqdomain for @nvec interrupts on success, NULL in case of error.
+ *
+ * This is for interrupt domains which stack on a platform-msi domain
+ * created by platform_msi_create_irq_domain(). @dev->msi.domain points to
+ * that platform-msi domain which is the parent for the new domain.
*/
struct irq_domain *
__platform_msi_create_device_domain(struct device *dev,
@@ -372,18 +377,19 @@ struct irq_domain *
}
/**
- * platform_msi_domain_free - Free interrupts associated with a platform-msi
- * domain
+ * platform_msi_device_domain_free - Free interrupts associated with a platform-msi
+ * device domain
*
- * @domain: The platform-msi domain
+ * @domain: The platform-msi device domain
* @virq: The base irq from which to perform the free operation
* @nvec: How many interrupts to free from @virq
*/
-void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
- unsigned int nvec)
+void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
+ unsigned int nvec)
{
struct platform_msi_priv_data *data = domain->host_data;
struct msi_desc *desc, *tmp;
+
for_each_msi_entry_safe(desc, tmp, data->dev) {
if (WARN_ON(!desc->irq || desc->nvec_used != 1))
return;
@@ -397,10 +403,10 @@ void platform_msi_domain_free(struct irq
}
/**
- * platform_msi_domain_alloc - Allocate interrupts associated with
- * a platform-msi domain
+ * platform_msi_device_domain_alloc - Allocate interrupts associated with
+ * a platform-msi device domain
*
- * @domain: The platform-msi domain
+ * @domain: The platform-msi device domain
* @virq: The base irq from which to perform the allocate operation
* @nr_irqs: How many interrupts to free from @virq
*
@@ -408,8 +414,8 @@ void platform_msi_domain_free(struct irq
* with irq_domain_mutex held (which can only be done as part of a
* top-level interrupt allocation).
*/
-int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
- unsigned int nr_irqs)
+int platform_msi_device_domain_alloc(struct irq_domain *domain, unsigned int virq,
+ unsigned int nr_irqs)
{
struct platform_msi_priv_data *data = domain->host_data;
int err;
@@ -421,7 +427,7 @@ int platform_msi_domain_alloc(struct irq
err = msi_domain_populate_irqs(domain->parent, data->dev,
virq, nr_irqs, &data->arg);
if (err)
- platform_msi_domain_free(domain, virq, nr_irqs);
+ platform_msi_device_domain_free(domain, virq, nr_irqs);
return err;
}
--- a/drivers/irqchip/irq-mbigen.c
+++ b/drivers/irqchip/irq-mbigen.c
@@ -207,7 +207,7 @@ static int mbigen_irq_domain_alloc(struc
if (err)
return err;
- err = platform_msi_domain_alloc(domain, virq, nr_irqs);
+ err = platform_msi_device_domain_alloc(domain, virq, nr_irqs);
if (err)
return err;
@@ -223,7 +223,7 @@ static int mbigen_irq_domain_alloc(struc
static void mbigen_irq_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nr_irqs)
{
- platform_msi_domain_free(domain, virq, nr_irqs);
+ platform_msi_device_domain_free(domain, virq, nr_irqs);
}
static const struct irq_domain_ops mbigen_domain_ops = {
--- a/drivers/irqchip/irq-mvebu-icu.c
+++ b/drivers/irqchip/irq-mvebu-icu.c
@@ -221,7 +221,7 @@ mvebu_icu_irq_domain_alloc(struct irq_do
icu_irqd->icu_group = msi_data->subset_data->icu_group;
icu_irqd->icu = icu;
- err = platform_msi_domain_alloc(domain, virq, nr_irqs);
+ err = platform_msi_device_domain_alloc(domain, virq, nr_irqs);
if (err) {
dev_err(icu->dev, "failed to allocate ICU interrupt in parent domain\n");
goto free_irqd;
@@ -245,7 +245,7 @@ mvebu_icu_irq_domain_alloc(struct irq_do
return 0;
free_msi:
- platform_msi_domain_free(domain, virq, nr_irqs);
+ platform_msi_device_domain_free(domain, virq, nr_irqs);
free_irqd:
kfree(icu_irqd);
return err;
@@ -260,7 +260,7 @@ mvebu_icu_irq_domain_free(struct irq_dom
kfree(icu_irqd);
- platform_msi_domain_free(domain, virq, nr_irqs);
+ platform_msi_device_domain_free(domain, virq, nr_irqs);
}
static const struct irq_domain_ops mvebu_icu_domain_ops = {
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -434,10 +434,10 @@ struct irq_domain *
#define platform_msi_create_device_tree_domain(dev, nvec, write, ops, data) \
__platform_msi_create_device_domain(dev, nvec, true, write, ops, data)
-int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
- unsigned int nr_irqs);
-void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,
- unsigned int nvec);
+int platform_msi_device_domain_alloc(struct irq_domain *domain, unsigned int virq,
+ unsigned int nr_irqs);
+void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
+ unsigned int nvec);
void *platform_msi_get_host_data(struct irq_domain *domain);
#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 12/36] platform-msi: Store platform private data pointer in msi_device_data
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (10 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 11/36] platform-msi: Rename functions and clarify comments Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 13/36] genirq/msi: Consolidate MSI descriptor data Thomas Gleixner
` (23 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Storing the platform private data in a MSI descriptor is sloppy at
best. The data belongs to the device and not to the descriptor.
Add a pointer to struct msi_device_data and store the pointer there.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/base/platform-msi.c | 79 +++++++++++++++++---------------------------
include/linux/msi.h | 4 +-
2 files changed, 34 insertions(+), 49 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -38,9 +38,7 @@ static DEFINE_IDA(platform_msi_devid_ida
*/
static irq_hw_number_t platform_msi_calc_hwirq(struct msi_desc *desc)
{
- u32 devid;
-
- devid = desc->platform.msi_priv_data->devid;
+ u32 devid = desc->dev->msi.data->platform_data->devid;
return (devid << (32 - DEV_ID_SHIFT)) | desc->platform.msi_index;
}
@@ -85,11 +83,8 @@ static void platform_msi_update_dom_ops(
static void platform_msi_write_msg(struct irq_data *data, struct msi_msg *msg)
{
struct msi_desc *desc = irq_data_get_msi_desc(data);
- struct platform_msi_priv_data *priv_data;
-
- priv_data = desc->platform.msi_priv_data;
- priv_data->write_msg(desc, msg);
+ desc->dev->msi.data->platform_data->write_msg(desc, msg);
}
static void platform_msi_update_chip_ops(struct msi_domain_info *info)
@@ -126,9 +121,7 @@ static void platform_msi_free_descs(stru
}
static int platform_msi_alloc_descs_with_irq(struct device *dev, int virq,
- int nvec,
- struct platform_msi_priv_data *data)
-
+ int nvec)
{
struct msi_desc *desc;
int i, base = 0;
@@ -144,7 +137,6 @@ static int platform_msi_alloc_descs_with
if (!desc)
break;
- desc->platform.msi_priv_data = data;
desc->platform.msi_index = base + i;
desc->irq = virq ? virq + i : 0;
@@ -161,11 +153,9 @@ static int platform_msi_alloc_descs_with
return 0;
}
-static int platform_msi_alloc_descs(struct device *dev, int nvec,
- struct platform_msi_priv_data *data)
-
+static int platform_msi_alloc_descs(struct device *dev, int nvec)
{
- return platform_msi_alloc_descs_with_irq(dev, 0, nvec, data);
+ return platform_msi_alloc_descs_with_irq(dev, 0, nvec);
}
/**
@@ -199,9 +189,8 @@ struct irq_domain *platform_msi_create_i
return domain;
}
-static struct platform_msi_priv_data *
-platform_msi_alloc_priv_data(struct device *dev, unsigned int nvec,
- irq_write_msi_msg_t write_msi_msg)
+static int platform_msi_alloc_priv_data(struct device *dev, unsigned int nvec,
+ irq_write_msi_msg_t write_msi_msg)
{
struct platform_msi_priv_data *datap;
int err;
@@ -213,41 +202,44 @@ platform_msi_alloc_priv_data(struct devi
* capable devices).
*/
if (!dev->msi.domain || !write_msi_msg || !nvec || nvec > MAX_DEV_MSIS)
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
if (dev->msi.domain->bus_token != DOMAIN_BUS_PLATFORM_MSI) {
dev_err(dev, "Incompatible msi_domain, giving up\n");
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
}
err = msi_setup_device_data(dev);
if (err)
- return ERR_PTR(err);
+ return err;
- /* Already had a helping of MSI? Greed... */
- if (!list_empty(dev_to_msi_list(dev)))
- return ERR_PTR(-EBUSY);
+ /* Already initialized? */
+ if (dev->msi.data->platform_data)
+ return -EBUSY;
datap = kzalloc(sizeof(*datap), GFP_KERNEL);
if (!datap)
- return ERR_PTR(-ENOMEM);
+ return -ENOMEM;
datap->devid = ida_simple_get(&platform_msi_devid_ida,
0, 1 << DEV_ID_SHIFT, GFP_KERNEL);
if (datap->devid < 0) {
err = datap->devid;
kfree(datap);
- return ERR_PTR(err);
+ return err;
}
datap->write_msg = write_msi_msg;
datap->dev = dev;
-
- return datap;
+ dev->msi.data->platform_data = datap;
+ return 0;
}
-static void platform_msi_free_priv_data(struct platform_msi_priv_data *data)
+static void platform_msi_free_priv_data(struct device *dev)
{
+ struct platform_msi_priv_data *data = dev->msi.data->platform_data;
+
+ dev->msi.data->platform_data = NULL;
ida_simple_remove(&platform_msi_devid_ida, data->devid);
kfree(data);
}
@@ -264,14 +256,13 @@ static void platform_msi_free_priv_data(
int platform_msi_domain_alloc_irqs(struct device *dev, unsigned int nvec,
irq_write_msi_msg_t write_msi_msg)
{
- struct platform_msi_priv_data *priv_data;
int err;
- priv_data = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
- if (IS_ERR(priv_data))
- return PTR_ERR(priv_data);
+ err = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
+ if (err)
+ return err;
- err = platform_msi_alloc_descs(dev, nvec, priv_data);
+ err = platform_msi_alloc_descs(dev, nvec);
if (err)
goto out_free_priv_data;
@@ -284,8 +275,7 @@ int platform_msi_domain_alloc_irqs(struc
out_free_desc:
platform_msi_free_descs(dev, 0, nvec);
out_free_priv_data:
- platform_msi_free_priv_data(priv_data);
-
+ platform_msi_free_priv_data(dev);
return err;
}
EXPORT_SYMBOL_GPL(platform_msi_domain_alloc_irqs);
@@ -296,15 +286,9 @@ EXPORT_SYMBOL_GPL(platform_msi_domain_al
*/
void platform_msi_domain_free_irqs(struct device *dev)
{
- if (!list_empty(dev_to_msi_list(dev))) {
- struct msi_desc *desc;
-
- desc = first_msi_entry(dev);
- platform_msi_free_priv_data(desc->platform.msi_priv_data);
- }
-
msi_domain_free_irqs(dev->msi.domain, dev);
platform_msi_free_descs(dev, 0, MAX_DEV_MSIS);
+ platform_msi_free_priv_data(dev);
}
EXPORT_SYMBOL_GPL(platform_msi_domain_free_irqs);
@@ -351,10 +335,11 @@ struct irq_domain *
struct irq_domain *domain;
int err;
- data = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
- if (IS_ERR(data))
+ err = platform_msi_alloc_priv_data(dev, nvec, write_msi_msg);
+ if (err)
return NULL;
+ data = dev->msi.data->platform_data;
data->host_data = host_data;
domain = irq_domain_create_hierarchy(dev->msi.domain, 0,
is_tree ? 0 : nvec,
@@ -372,7 +357,7 @@ struct irq_domain *
free_domain:
irq_domain_remove(domain);
free_priv:
- platform_msi_free_priv_data(data);
+ platform_msi_free_priv_data(dev);
return NULL;
}
@@ -420,7 +405,7 @@ int platform_msi_device_domain_alloc(str
struct platform_msi_priv_data *data = domain->host_data;
int err;
- err = platform_msi_alloc_descs_with_irq(data->dev, virq, nr_irqs, data);
+ err = platform_msi_alloc_descs_with_irq(data->dev, virq, nr_irqs);
if (err)
return err;
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -108,11 +108,9 @@ struct pci_msi_desc {
/**
* platform_msi_desc - Platform device specific msi descriptor data
- * @msi_priv_data: Pointer to platform private data
* @msi_index: The index of the MSI descriptor for multi MSI
*/
struct platform_msi_desc {
- struct platform_msi_priv_data *msi_priv_data;
u16 msi_index;
};
@@ -177,10 +175,12 @@ struct msi_desc {
* msi_device_data - MSI per device data
* @properties: MSI properties which are interesting to drivers
* @attrs: Pointer to the sysfs attribute group
+ * @platform_data: Platform-MSI specific data
*/
struct msi_device_data {
unsigned long properties;
const struct attribute_group **attrs;
+ struct platform_msi_priv_data *platform_data;
};
int msi_setup_device_data(struct device *dev);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 13/36] genirq/msi: Consolidate MSI descriptor data
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (11 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 12/36] platform-msi: Store platform private data pointer in msi_device_data Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 14/36] platform-msi: Use msi_desc::msi_index Thomas Gleixner
` (22 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
All non PCI/MSI usage variants have data structures in struct msi_desc with
only one member: xxx_index. PCI/MSI has a entry_nr member.
Add a common msi_index member to struct msi_desc so all implementations can
share it which allows further consolidation.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
include/linux/msi.h | 2 ++
1 file changed, 2 insertions(+)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -142,6 +142,7 @@ struct ti_sci_inta_msi_desc {
* address or data changes
* @write_msi_msg_data: Data parameter for the callback.
*
+ * @msi_index: Index of the msi descriptor
* @pci: [PCI] PCI speficic msi descriptor data
* @platform: [platform] Platform device specific msi descriptor data
* @fsl_mc: [fsl-mc] FSL MC device specific msi descriptor data
@@ -162,6 +163,7 @@ struct msi_desc {
void (*write_msi_msg)(struct msi_desc *entry, void *data);
void *write_msi_msg_data;
+ u16 msi_index;
union {
struct pci_msi_desc pci;
struct platform_msi_desc platform;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 14/36] platform-msi: Use msi_desc::msi_index
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (12 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 13/36] genirq/msi: Consolidate MSI descriptor data Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 15/36] bus: fsl-mc-msi: " Thomas Gleixner
` (21 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, linux-arm-kernel, Jason Gunthorpe, xen-devel,
Kevin Tian, Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
Megha Dey, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Use the common msi_index member and get rid of the pointless wrapper struct.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: iommu@lists.linux-foundation.org
Cc: dmaengine@vger.kernel.org
---
drivers/base/platform-msi.c | 10 +++++-----
drivers/dma/qcom/hidma.c | 4 ++--
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 ++--
drivers/mailbox/bcm-flexrm-mailbox.c | 4 ++--
include/linux/msi.h | 10 ----------
5 files changed, 11 insertions(+), 21 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -40,7 +40,7 @@ static irq_hw_number_t platform_msi_calc
{
u32 devid = desc->dev->msi.data->platform_data->devid;
- return (devid << (32 - DEV_ID_SHIFT)) | desc->platform.msi_index;
+ return (devid << (32 - DEV_ID_SHIFT)) | desc->msi_index;
}
static void platform_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
@@ -112,8 +112,8 @@ static void platform_msi_free_descs(stru
struct msi_desc *desc, *tmp;
list_for_each_entry_safe(desc, tmp, dev_to_msi_list(dev), list) {
- if (desc->platform.msi_index >= base &&
- desc->platform.msi_index < (base + nvec)) {
+ if (desc->msi_index >= base &&
+ desc->msi_index < (base + nvec)) {
list_del(&desc->list);
free_msi_entry(desc);
}
@@ -129,7 +129,7 @@ static int platform_msi_alloc_descs_with
if (!list_empty(dev_to_msi_list(dev))) {
desc = list_last_entry(dev_to_msi_list(dev),
struct msi_desc, list);
- base = desc->platform.msi_index + 1;
+ base = desc->msi_index + 1;
}
for (i = 0; i < nvec; i++) {
@@ -137,7 +137,7 @@ static int platform_msi_alloc_descs_with
if (!desc)
break;
- desc->platform.msi_index = base + i;
+ desc->msi_index = base + i;
desc->irq = virq ? virq + i : 0;
list_add_tail(&desc->list, dev_to_msi_list(dev));
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -666,7 +666,7 @@ static void hidma_write_msi_msg(struct m
struct device *dev = msi_desc_to_dev(desc);
struct hidma_dev *dmadev = dev_get_drvdata(dev);
- if (!desc->platform.msi_index) {
+ if (!desc->msi_index) {
writel(msg->address_lo, dmadev->dev_evca + 0x118);
writel(msg->address_hi, dmadev->dev_evca + 0x11C);
writel(msg->data, dmadev->dev_evca + 0x120);
@@ -702,7 +702,7 @@ static int hidma_request_msi(struct hidm
return rc;
for_each_msi_entry(desc, &pdev->dev) {
- if (!desc->platform.msi_index)
+ if (!desc->msi_index)
dmadev->msi_virqbase = desc->irq;
rc = devm_request_irq(&pdev->dev, desc->irq,
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3142,7 +3142,7 @@ static void arm_smmu_write_msi_msg(struc
phys_addr_t doorbell;
struct device *dev = msi_desc_to_dev(desc);
struct arm_smmu_device *smmu = dev_get_drvdata(dev);
- phys_addr_t *cfg = arm_smmu_msi_cfg[desc->platform.msi_index];
+ phys_addr_t *cfg = arm_smmu_msi_cfg[desc->msi_index];
doorbell = (((u64)msg->address_hi) << 32) | msg->address_lo;
doorbell &= MSI_CFG0_ADDR_MASK;
@@ -3183,7 +3183,7 @@ static void arm_smmu_setup_msis(struct a
}
for_each_msi_entry(desc, dev) {
- switch (desc->platform.msi_index) {
+ switch (desc->msi_index) {
case EVTQ_MSI_INDEX:
smmu->evtq.q.irq = desc->irq;
break;
--- a/drivers/mailbox/bcm-flexrm-mailbox.c
+++ b/drivers/mailbox/bcm-flexrm-mailbox.c
@@ -1484,7 +1484,7 @@ static void flexrm_mbox_msi_write(struct
{
struct device *dev = msi_desc_to_dev(desc);
struct flexrm_mbox *mbox = dev_get_drvdata(dev);
- struct flexrm_ring *ring = &mbox->rings[desc->platform.msi_index];
+ struct flexrm_ring *ring = &mbox->rings[desc->msi_index];
/* Configure per-Ring MSI registers */
writel_relaxed(msg->address_lo, ring->regs + RING_MSI_ADDR_LS);
@@ -1609,7 +1609,7 @@ static int flexrm_mbox_probe(struct plat
/* Save alloced IRQ numbers for each ring */
for_each_msi_entry(desc, dev) {
- ring = &mbox->rings[desc->platform.msi_index];
+ ring = &mbox->rings[desc->msi_index];
ring->irq = desc->irq;
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -106,14 +106,6 @@ struct pci_msi_desc {
};
/**
- * platform_msi_desc - Platform device specific msi descriptor data
- * @msi_index: The index of the MSI descriptor for multi MSI
- */
-struct platform_msi_desc {
- u16 msi_index;
-};
-
-/**
* fsl_mc_msi_desc - FSL-MC device specific msi descriptor data
* @msi_index: The index of the MSI descriptor
*/
@@ -144,7 +136,6 @@ struct ti_sci_inta_msi_desc {
*
* @msi_index: Index of the msi descriptor
* @pci: [PCI] PCI speficic msi descriptor data
- * @platform: [platform] Platform device specific msi descriptor data
* @fsl_mc: [fsl-mc] FSL MC device specific msi descriptor data
* @inta: [INTA] TISCI based INTA specific msi descriptor data
*/
@@ -166,7 +157,6 @@ struct msi_desc {
u16 msi_index;
union {
struct pci_msi_desc pci;
- struct platform_msi_desc platform;
struct fsl_mc_msi_desc fsl_mc;
struct ti_sci_inta_msi_desc inta;
};
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 15/36] bus: fsl-mc-msi: Use msi_desc::msi_index
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (13 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 14/36] platform-msi: Use msi_desc::msi_index Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 16/36] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
` (20 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Use the common msi_index member and get rid of the pointless wrapper struct.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/bus/fsl-mc/fsl-mc-allocator.c | 2 +-
drivers/bus/fsl-mc/fsl-mc-msi.c | 6 +++---
include/linux/msi.h | 10 ----------
3 files changed, 4 insertions(+), 14 deletions(-)
--- a/drivers/bus/fsl-mc/fsl-mc-allocator.c
+++ b/drivers/bus/fsl-mc/fsl-mc-allocator.c
@@ -393,7 +393,7 @@ int fsl_mc_populate_irq_pool(struct fsl_
}
for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
- mc_dev_irq = &irq_resources[msi_desc->fsl_mc.msi_index];
+ mc_dev_irq = &irq_resources[msi_desc->msi_index];
mc_dev_irq->msi_desc = msi_desc;
mc_dev_irq->resource.id = msi_desc->irq;
}
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -29,7 +29,7 @@ static irq_hw_number_t fsl_mc_domain_cal
* Make the base hwirq value for ICID*10000 so it is readable
* as a decimal value in /proc/interrupts.
*/
- return (irq_hw_number_t)(desc->fsl_mc.msi_index + (dev->icid * 10000));
+ return (irq_hw_number_t)(desc->msi_index + (dev->icid * 10000));
}
static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg,
@@ -122,7 +122,7 @@ static void fsl_mc_msi_write_msg(struct
struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev);
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev);
struct fsl_mc_device_irq *mc_dev_irq =
- &mc_bus->irq_resources[msi_desc->fsl_mc.msi_index];
+ &mc_bus->irq_resources[msi_desc->msi_index];
msi_desc->msg = *msg;
@@ -235,7 +235,7 @@ static int fsl_mc_msi_alloc_descs(struct
goto cleanup_msi_descs;
}
- msi_desc->fsl_mc.msi_index = i;
+ msi_desc->msi_index = i;
INIT_LIST_HEAD(&msi_desc->list);
list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -106,14 +106,6 @@ struct pci_msi_desc {
};
/**
- * fsl_mc_msi_desc - FSL-MC device specific msi descriptor data
- * @msi_index: The index of the MSI descriptor
- */
-struct fsl_mc_msi_desc {
- u16 msi_index;
-};
-
-/**
* ti_sci_inta_msi_desc - TISCI based INTA specific msi descriptor data
* @dev_index: TISCI device index
*/
@@ -136,7 +128,6 @@ struct ti_sci_inta_msi_desc {
*
* @msi_index: Index of the msi descriptor
* @pci: [PCI] PCI speficic msi descriptor data
- * @fsl_mc: [fsl-mc] FSL MC device specific msi descriptor data
* @inta: [INTA] TISCI based INTA specific msi descriptor data
*/
struct msi_desc {
@@ -157,7 +148,6 @@ struct msi_desc {
u16 msi_index;
union {
struct pci_msi_desc pci;
- struct fsl_mc_msi_desc fsl_mc;
struct ti_sci_inta_msi_desc inta;
};
};
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 16/36] soc: ti: ti_sci_inta_msi: Use msi_desc::msi_index
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (14 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 15/36] bus: fsl-mc-msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 17/36] PCI/MSI: " Thomas Gleixner
` (19 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Use the common msi_index member and get rid of the pointless wrapper struct.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/irqchip/irq-ti-sci-inta.c | 2 +-
drivers/soc/ti/ti_sci_inta_msi.c | 6 +++---
include/linux/msi.h | 16 ++--------------
3 files changed, 6 insertions(+), 18 deletions(-)
--- a/drivers/irqchip/irq-ti-sci-inta.c
+++ b/drivers/irqchip/irq-ti-sci-inta.c
@@ -595,7 +595,7 @@ static void ti_sci_inta_msi_set_desc(msi
struct platform_device *pdev = to_platform_device(desc->dev);
arg->desc = desc;
- arg->hwirq = TO_HWIRQ(pdev->id, desc->inta.dev_index);
+ arg->hwirq = TO_HWIRQ(pdev->id, desc->msi_index);
}
static struct msi_domain_ops ti_sci_inta_msi_ops = {
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -84,7 +84,7 @@ static int ti_sci_inta_msi_alloc_descs(s
return -ENOMEM;
}
- msi_desc->inta.dev_index = res->desc[set].start + i;
+ msi_desc->msi_index = res->desc[set].start + i;
INIT_LIST_HEAD(&msi_desc->list);
list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
count++;
@@ -96,7 +96,7 @@ static int ti_sci_inta_msi_alloc_descs(s
return -ENOMEM;
}
- msi_desc->inta.dev_index = res->desc[set].start_sec + i;
+ msi_desc->msi_index = res->desc[set].start_sec + i;
INIT_LIST_HEAD(&msi_desc->list);
list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
count++;
@@ -154,7 +154,7 @@ unsigned int ti_sci_inta_msi_get_virq(st
struct msi_desc *desc;
for_each_msi_entry(desc, dev)
- if (desc->inta.dev_index == dev_index)
+ if (desc->msi_index == dev_index)
return desc->irq;
return -ENODEV;
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -107,14 +107,6 @@ struct pci_msi_desc {
};
/**
- * ti_sci_inta_msi_desc - TISCI based INTA specific msi descriptor data
- * @dev_index: TISCI device index
- */
-struct ti_sci_inta_msi_desc {
- u16 dev_index;
-};
-
-/**
* struct msi_desc - Descriptor structure for MSI based interrupts
* @list: List head for management
* @irq: The base interrupt number
@@ -128,8 +120,7 @@ struct ti_sci_inta_msi_desc {
* @write_msi_msg_data: Data parameter for the callback.
*
* @msi_index: Index of the msi descriptor
- * @pci: [PCI] PCI speficic msi descriptor data
- * @inta: [INTA] TISCI based INTA specific msi descriptor data
+ * @pci: PCI specific msi descriptor data
*/
struct msi_desc {
/* Shared device/bus type independent data */
@@ -147,10 +138,7 @@ struct msi_desc {
void *write_msi_msg_data;
u16 msi_index;
- union {
- struct pci_msi_desc pci;
- struct ti_sci_inta_msi_desc inta;
- };
+ struct pci_msi_desc pci;
};
/**
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 17/36] PCI/MSI: Use msi_desc::msi_index
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (15 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 16/36] soc: ti: ti_sci_inta_msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 21:04 ` Bjorn Helgaas
2021-12-06 22:39 ` [patch V2 18/36] genirq/msi: Add msi_device_data::properties Thomas Gleixner
` (18 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
The usage of msi_desc::pci::entry_nr is confusing at best. It's the index
into the MSI[X] descriptor table.
Use msi_desc::msi_index which is shared between all MSI incarnations
instead of having a PCI specific storage for no value.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
arch/powerpc/platforms/pseries/msi.c | 4 ++--
arch/x86/pci/xen.c | 2 +-
drivers/pci/msi/irqdomain.c | 2 +-
drivers/pci/msi/msi.c | 20 ++++++++------------
drivers/pci/xen-pcifront.c | 2 +-
include/linux/msi.h | 2 --
6 files changed, 13 insertions(+), 19 deletions(-)
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -332,7 +332,7 @@ static int check_msix_entries(struct pci
expected = 0;
for_each_pci_msi_entry(entry, pdev) {
- if (entry->pci.msi_attrib.entry_nr != expected) {
+ if (entry->msi_index != expected) {
pr_debug("rtas_msi: bad MSI-X entries.\n");
return -EINVAL;
}
@@ -580,7 +580,7 @@ static int pseries_irq_domain_alloc(stru
int hwirq;
int i, ret;
- hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->pci.msi_attrib.entry_nr);
+ hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->msi_index);
if (hwirq < 0) {
dev_err(&pdev->dev, "Failed to query HW IRQ: %d\n", hwirq);
return hwirq;
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -306,7 +306,7 @@ static int xen_initdom_setup_msi_irqs(st
return -EINVAL;
map_irq.table_base = pci_resource_start(dev, bir);
- map_irq.entry_nr = msidesc->pci.msi_attrib.entry_nr;
+ map_irq.entry_nr = msidesc->msi_index;
}
ret = -EINVAL;
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -57,7 +57,7 @@ static irq_hw_number_t pci_msi_domain_ca
{
struct pci_dev *dev = msi_desc_to_pci_dev(desc);
- return (irq_hw_number_t)desc->pci.msi_attrib.entry_nr |
+ return (irq_hw_number_t)desc->msi_index |
pci_dev_id(dev) << 11 |
(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
}
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -44,7 +44,7 @@ static inline void pci_msi_unmask(struct
static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
{
- return desc->pci.mask_base + desc->pci.msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
+ return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
}
/*
@@ -356,13 +356,10 @@ msi_setup_entry(struct pci_dev *dev, int
if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING)
control |= PCI_MSI_FLAGS_MASKBIT;
- entry->pci.msi_attrib.is_msix = 0;
- entry->pci.msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
- entry->pci.msi_attrib.is_virtual = 0;
- entry->pci.msi_attrib.entry_nr = 0;
+ entry->pci.msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
entry->pci.msi_attrib.can_mask = !pci_msi_ignore_mask &&
!!(control & PCI_MSI_FLAGS_MASKBIT);
- entry->pci.msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
+ entry->pci.msi_attrib.default_irq = dev->irq;
entry->pci.msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
entry->pci.msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec));
@@ -496,12 +493,11 @@ static int msix_setup_entries(struct pci
entry->pci.msi_attrib.is_64 = 1;
if (entries)
- entry->pci.msi_attrib.entry_nr = entries[i].entry;
+ entry->msi_index = entries[i].entry;
else
- entry->pci.msi_attrib.entry_nr = i;
+ entry->msi_index = i;
- entry->pci.msi_attrib.is_virtual =
- entry->pci.msi_attrib.entry_nr >= vec_count;
+ entry->pci.msi_attrib.is_virtual = entry->msi_index >= vec_count;
entry->pci.msi_attrib.can_mask = !pci_msi_ignore_mask &&
!entry->pci.msi_attrib.is_virtual;
@@ -1034,7 +1030,7 @@ int pci_irq_vector(struct pci_dev *dev,
struct msi_desc *entry;
for_each_pci_msi_entry(entry, dev) {
- if (entry->pci.msi_attrib.entry_nr == nr)
+ if (entry->msi_index == nr)
return entry->irq;
}
WARN_ON_ONCE(1);
@@ -1073,7 +1069,7 @@ const struct cpumask *pci_irq_get_affini
struct msi_desc *entry;
for_each_pci_msi_entry(entry, dev) {
- if (entry->pci.msi_attrib.entry_nr == nr)
+ if (entry->msi_index == nr)
return &entry->affinity->mask;
}
WARN_ON_ONCE(1);
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -263,7 +263,7 @@ static int pci_frontend_enable_msix(stru
i = 0;
for_each_pci_msi_entry(entry, dev) {
- op.msix_entries[i].entry = entry->pci.msi_attrib.entry_nr;
+ op.msix_entries[i].entry = entry->msi_index;
/* Vector is useless at this point. */
op.msix_entries[i].vector = -1;
i++;
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -80,7 +80,6 @@ typedef void (*irq_write_msi_msg_t)(stru
* @multi_cap: [PCI MSI/X] log2 num of messages supported
* @can_mask: [PCI MSI/X] Masking supported?
* @is_64: [PCI MSI/X] Address size: 0=32bit 1=64bit
- * @entry_nr: [PCI MSI/X] Entry which is described by this descriptor
* @default_irq:[PCI MSI/X] The default pre-assigned non-MSI irq
* @mask_pos: [PCI MSI] Mask register position
* @mask_base: [PCI MSI-X] Mask register base address
@@ -97,7 +96,6 @@ struct pci_msi_desc {
u8 can_mask : 1;
u8 is_64 : 1;
u8 is_virtual : 1;
- u16 entry_nr;
unsigned default_irq;
} msi_attrib;
union {
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 17/36] PCI/MSI: Use msi_desc::msi_index
2021-12-06 22:39 ` [patch V2 17/36] PCI/MSI: " Thomas Gleixner
@ 2021-12-07 21:04 ` Bjorn Helgaas
0 siblings, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:04 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:23PM +0100, Thomas Gleixner wrote:
> The usage of msi_desc::pci::entry_nr is confusing at best. It's the index
> into the MSI[X] descriptor table.
>
> Use msi_desc::msi_index which is shared between all MSI incarnations
> instead of having a PCI specific storage for no value.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> arch/powerpc/platforms/pseries/msi.c | 4 ++--
> arch/x86/pci/xen.c | 2 +-
> drivers/pci/msi/irqdomain.c | 2 +-
> drivers/pci/msi/msi.c | 20 ++++++++------------
> drivers/pci/xen-pcifront.c | 2 +-
> include/linux/msi.h | 2 --
> 6 files changed, 13 insertions(+), 19 deletions(-)
>
> --- a/arch/powerpc/platforms/pseries/msi.c
> +++ b/arch/powerpc/platforms/pseries/msi.c
> @@ -332,7 +332,7 @@ static int check_msix_entries(struct pci
>
> expected = 0;
> for_each_pci_msi_entry(entry, pdev) {
> - if (entry->pci.msi_attrib.entry_nr != expected) {
> + if (entry->msi_index != expected) {
> pr_debug("rtas_msi: bad MSI-X entries.\n");
> return -EINVAL;
> }
> @@ -580,7 +580,7 @@ static int pseries_irq_domain_alloc(stru
> int hwirq;
> int i, ret;
>
> - hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->pci.msi_attrib.entry_nr);
> + hwirq = rtas_query_irq_number(pci_get_pdn(pdev), desc->msi_index);
> if (hwirq < 0) {
> dev_err(&pdev->dev, "Failed to query HW IRQ: %d\n", hwirq);
> return hwirq;
> --- a/arch/x86/pci/xen.c
> +++ b/arch/x86/pci/xen.c
> @@ -306,7 +306,7 @@ static int xen_initdom_setup_msi_irqs(st
> return -EINVAL;
>
> map_irq.table_base = pci_resource_start(dev, bir);
> - map_irq.entry_nr = msidesc->pci.msi_attrib.entry_nr;
> + map_irq.entry_nr = msidesc->msi_index;
> }
>
> ret = -EINVAL;
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -57,7 +57,7 @@ static irq_hw_number_t pci_msi_domain_ca
> {
> struct pci_dev *dev = msi_desc_to_pci_dev(desc);
>
> - return (irq_hw_number_t)desc->pci.msi_attrib.entry_nr |
> + return (irq_hw_number_t)desc->msi_index |
> pci_dev_id(dev) << 11 |
> (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
> }
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -44,7 +44,7 @@ static inline void pci_msi_unmask(struct
>
> static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
> {
> - return desc->pci.mask_base + desc->pci.msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
> + return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
> }
>
> /*
> @@ -356,13 +356,10 @@ msi_setup_entry(struct pci_dev *dev, int
> if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING)
> control |= PCI_MSI_FLAGS_MASKBIT;
>
> - entry->pci.msi_attrib.is_msix = 0;
> - entry->pci.msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
> - entry->pci.msi_attrib.is_virtual = 0;
> - entry->pci.msi_attrib.entry_nr = 0;
> + entry->pci.msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
> entry->pci.msi_attrib.can_mask = !pci_msi_ignore_mask &&
> !!(control & PCI_MSI_FLAGS_MASKBIT);
> - entry->pci.msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
> + entry->pci.msi_attrib.default_irq = dev->irq;
> entry->pci.msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
> entry->pci.msi_attrib.multiple = ilog2(__roundup_pow_of_two(nvec));
>
> @@ -496,12 +493,11 @@ static int msix_setup_entries(struct pci
> entry->pci.msi_attrib.is_64 = 1;
>
> if (entries)
> - entry->pci.msi_attrib.entry_nr = entries[i].entry;
> + entry->msi_index = entries[i].entry;
> else
> - entry->pci.msi_attrib.entry_nr = i;
> + entry->msi_index = i;
>
> - entry->pci.msi_attrib.is_virtual =
> - entry->pci.msi_attrib.entry_nr >= vec_count;
> + entry->pci.msi_attrib.is_virtual = entry->msi_index >= vec_count;
>
> entry->pci.msi_attrib.can_mask = !pci_msi_ignore_mask &&
> !entry->pci.msi_attrib.is_virtual;
> @@ -1034,7 +1030,7 @@ int pci_irq_vector(struct pci_dev *dev,
> struct msi_desc *entry;
>
> for_each_pci_msi_entry(entry, dev) {
> - if (entry->pci.msi_attrib.entry_nr == nr)
> + if (entry->msi_index == nr)
> return entry->irq;
> }
> WARN_ON_ONCE(1);
> @@ -1073,7 +1069,7 @@ const struct cpumask *pci_irq_get_affini
> struct msi_desc *entry;
>
> for_each_pci_msi_entry(entry, dev) {
> - if (entry->pci.msi_attrib.entry_nr == nr)
> + if (entry->msi_index == nr)
> return &entry->affinity->mask;
> }
> WARN_ON_ONCE(1);
> --- a/drivers/pci/xen-pcifront.c
> +++ b/drivers/pci/xen-pcifront.c
> @@ -263,7 +263,7 @@ static int pci_frontend_enable_msix(stru
>
> i = 0;
> for_each_pci_msi_entry(entry, dev) {
> - op.msix_entries[i].entry = entry->pci.msi_attrib.entry_nr;
> + op.msix_entries[i].entry = entry->msi_index;
> /* Vector is useless at this point. */
> op.msix_entries[i].vector = -1;
> i++;
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -80,7 +80,6 @@ typedef void (*irq_write_msi_msg_t)(stru
> * @multi_cap: [PCI MSI/X] log2 num of messages supported
> * @can_mask: [PCI MSI/X] Masking supported?
> * @is_64: [PCI MSI/X] Address size: 0=32bit 1=64bit
> - * @entry_nr: [PCI MSI/X] Entry which is described by this descriptor
> * @default_irq:[PCI MSI/X] The default pre-assigned non-MSI irq
> * @mask_pos: [PCI MSI] Mask register position
> * @mask_base: [PCI MSI-X] Mask register base address
> @@ -97,7 +96,6 @@ struct pci_msi_desc {
> u8 can_mask : 1;
> u8 is_64 : 1;
> u8 is_virtual : 1;
> - u16 entry_nr;
> unsigned default_irq;
> } msi_attrib;
> union {
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 18/36] genirq/msi: Add msi_device_data::properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (16 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 17/36] PCI/MSI: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 9:04 ` Cédric Le Goater
2021-12-06 22:39 ` [patch V2 19/36] PCI/MSI: Store properties in device::msi::data Thomas Gleixner
` (17 subsequent siblings)
35 siblings, 2 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Add a properties field which allows core code to store information for easy
retrieval in order to replace MSI descriptor fiddling.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Add a setter function to prepare for future changes
---
include/linux/msi.h | 17 +++++++++++++++++
kernel/irq/msi.c | 24 ++++++++++++++++++++++++
2 files changed, 41 insertions(+)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -4,6 +4,7 @@
#include <linux/cpumask.h>
#include <linux/list.h>
+#include <linux/bits.h>
#include <asm/msi.h>
/* Dummy shadow structures if an architecture does not define them */
@@ -153,6 +154,22 @@ struct msi_device_data {
int msi_setup_device_data(struct device *dev);
+/* MSI device properties */
+#define MSI_PROP_PCI_MSI BIT(0)
+#define MSI_PROP_PCI_MSIX BIT(1)
+#define MSI_PROP_64BIT BIT(2)
+
+#ifdef CONFIG_GENERIC_MSI_IRQ
+bool msi_device_has_property(struct device *dev, unsigned long prop);
+void msi_device_set_properties(struct device *dev, unsigned long prop);
+#else
+static inline bool msi_device_has_property(struct device *dev, unsigned long prop)
+{
+ return false;
+}
+static inline void msi_device_set_properties(struct device *dev, unsigned long prop) { }
+#endif
+
/* Helpers to hide struct msi_desc implementation details */
#define msi_desc_to_dev(desc) ((desc)->dev)
#define dev_to_msi_list(dev) (&(dev)->msi_list)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -60,6 +60,30 @@ void free_msi_entry(struct msi_desc *ent
kfree(entry);
}
+/**
+ * msi_device_set_properties - Set device specific MSI properties
+ * @dev: Pointer to the device which is queried
+ * @prop: Properties to set
+ */
+void msi_device_set_properties(struct device *dev, unsigned long prop)
+{
+ if (WARN_ON_ONCE(!dev->msi.data))
+ return ;
+ dev->msi.data->properties = 0;
+}
+
+/**
+ * msi_device_has_property - Check whether a device has a specific MSI property
+ * @dev: Pointer to the device which is queried
+ * @prop: Property to check for
+ */
+bool msi_device_has_property(struct device *dev, unsigned long prop)
+{
+ if (!dev->msi.data)
+ return false;
+ return !!(dev->msi.data->properties & prop);
+}
+
void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
{
*msg = entry->msg;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 18/36] genirq/msi: Add msi_device_data::properties
2021-12-06 22:39 ` [patch V2 18/36] genirq/msi: Add msi_device_data::properties Thomas Gleixner
@ 2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 9:04 ` Cédric Le Goater
1 sibling, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:25PM +0100, Thomas Gleixner wrote:
> Add a properties field which allows core code to store information for easy
> retrieval in order to replace MSI descriptor fiddling.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* Re: [patch V2 18/36] genirq/msi: Add msi_device_data::properties
2021-12-06 22:39 ` [patch V2 18/36] genirq/msi: Add msi_device_data::properties Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
@ 2021-12-07 9:04 ` Cédric Le Goater
2021-12-07 12:47 ` Thomas Gleixner
1 sibling, 1 reply; 62+ messages in thread
From: Cédric Le Goater @ 2021-12-07 9:04 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
dmaengine, Robin Murphy
Hello Thomas,
On 12/6/21 23:39, Thomas Gleixner wrote:
> Add a properties field which allows core code to store information for easy
> retrieval in order to replace MSI descriptor fiddling.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V2: Add a setter function to prepare for future changes
> ---
> include/linux/msi.h | 17 +++++++++++++++++
> kernel/irq/msi.c | 24 ++++++++++++++++++++++++
> 2 files changed, 41 insertions(+)
>
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -4,6 +4,7 @@
>
> #include <linux/cpumask.h>
> #include <linux/list.h>
> +#include <linux/bits.h>
> #include <asm/msi.h>
>
> /* Dummy shadow structures if an architecture does not define them */
> @@ -153,6 +154,22 @@ struct msi_device_data {
>
> int msi_setup_device_data(struct device *dev);
>
> +/* MSI device properties */
> +#define MSI_PROP_PCI_MSI BIT(0)
> +#define MSI_PROP_PCI_MSIX BIT(1)
> +#define MSI_PROP_64BIT BIT(2)
> +
> +#ifdef CONFIG_GENERIC_MSI_IRQ
> +bool msi_device_has_property(struct device *dev, unsigned long prop);
> +void msi_device_set_properties(struct device *dev, unsigned long prop);
> +#else
> +static inline bool msi_device_has_property(struct device *dev, unsigned long prop)
> +{
> + return false;
> +}
> +static inline void msi_device_set_properties(struct device *dev, unsigned long prop) { }
> +#endif
> +
> /* Helpers to hide struct msi_desc implementation details */
> #define msi_desc_to_dev(desc) ((desc)->dev)
> #define dev_to_msi_list(dev) (&(dev)->msi_list)
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -60,6 +60,30 @@ void free_msi_entry(struct msi_desc *ent
> kfree(entry);
> }
>
> +/**
> + * msi_device_set_properties - Set device specific MSI properties
> + * @dev: Pointer to the device which is queried
> + * @prop: Properties to set
> + */
> +void msi_device_set_properties(struct device *dev, unsigned long prop)
> +{
> + if (WARN_ON_ONCE(!dev->msi.data))
> + return ;
> + dev->msi.data->properties = 0;
It would work better if the prop variable was used instead of 0.
With that fixed,
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Thanks,
C.
> +}
> +
> +/**
> + * msi_device_has_property - Check whether a device has a specific MSI property
> + * @dev: Pointer to the device which is queried
> + * @prop: Property to check for
> + */
> +bool msi_device_has_property(struct device *dev, unsigned long prop)
> +{
> + if (!dev->msi.data)
> + return false;
> + return !!(dev->msi.data->properties & prop);
> +}
> +
> void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
> {
> *msg = entry->msg;
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 18/36] genirq/msi: Add msi_device_data::properties
2021-12-07 9:04 ` Cédric Le Goater
@ 2021-12-07 12:47 ` Thomas Gleixner
2021-12-07 12:53 ` Thomas Gleixner
0 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-07 12:47 UTC (permalink / raw)
To: Cédric Le Goater, LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
dmaengine, Robin Murphy
On Tue, Dec 07 2021 at 10:04, Cédric Le Goater wrote:
>> +/**
>> + * msi_device_set_properties - Set device specific MSI properties
>> + * @dev: Pointer to the device which is queried
>> + * @prop: Properties to set
>> + */
>> +void msi_device_set_properties(struct device *dev, unsigned long prop)
>> +{
>> + if (WARN_ON_ONCE(!dev->msi.data))
>> + return ;
>> + dev->msi.data->properties = 0;
> It would work better if the prop variable was used instead of 0.
>
> With that fixed,
Indeed. Copy & pasta w/o brain usage ...
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 18/36] genirq/msi: Add msi_device_data::properties
2021-12-07 12:47 ` Thomas Gleixner
@ 2021-12-07 12:53 ` Thomas Gleixner
0 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-07 12:53 UTC (permalink / raw)
To: Cédric Le Goater, LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
dmaengine, Robin Murphy
On Tue, Dec 07 2021 at 13:47, Thomas Gleixner wrote:
> On Tue, Dec 07 2021 at 10:04, Cédric Le Goater wrote:
>>> +/**
>>> + * msi_device_set_properties - Set device specific MSI properties
>>> + * @dev: Pointer to the device which is queried
>>> + * @prop: Properties to set
>>> + */
>>> +void msi_device_set_properties(struct device *dev, unsigned long prop)
>>> +{
>>> + if (WARN_ON_ONCE(!dev->msi.data))
>>> + return ;
>>> + dev->msi.data->properties = 0;
>> It would work better if the prop variable was used instead of 0.
>>
>> With that fixed,
>
> Indeed. Copy & pasta w/o brain usage ...
I've pushed out an incremental fix on top. Will be folded back.
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git msi-v2-part-3-1
Thanks,
tglx
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (17 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 18/36] genirq/msi: Add msi_device_data::properties Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
` (2 more replies)
2021-12-06 22:39 ` [patch V2 20/36] x86/pci/XEN: Use device MSI properties Thomas Gleixner
` (16 subsequent siblings)
35 siblings, 3 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Store the properties which are interesting for various places so the MSI
descriptor fiddling can be removed.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Use the setter function
---
drivers/pci/msi/msi.c | 8 ++++++++
1 file changed, 8 insertions(+)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -244,6 +244,8 @@ static void free_msi_irqs(struct pci_dev
iounmap(dev->msix_base);
dev->msix_base = NULL;
}
+
+ msi_device_set_properties(&dev->dev, 0);
}
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
@@ -341,6 +343,7 @@ msi_setup_entry(struct pci_dev *dev, int
{
struct irq_affinity_desc *masks = NULL;
struct msi_desc *entry;
+ unsigned long prop;
u16 control;
if (affd)
@@ -372,6 +375,10 @@ msi_setup_entry(struct pci_dev *dev, int
if (entry->pci.msi_attrib.can_mask)
pci_read_config_dword(dev, entry->pci.mask_pos, &entry->pci.msi_mask);
+ prop = MSI_PROP_PCI_MSI;
+ if (entry->pci.msi_attrib.is_64)
+ prop |= MSI_PROP_64BIT;
+ msi_device_set_properties(&dev->dev, prop);
out:
kfree(masks);
return entry;
@@ -514,6 +521,7 @@ static int msix_setup_entries(struct pci
if (masks)
curmsk++;
}
+ msi_device_set_properties(&dev->dev, MSI_PROP_PCI_MSIX | MSI_PROP_64BIT);
ret = 0;
out:
kfree(masks);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-06 22:39 ` [patch V2 19/36] PCI/MSI: Store properties in device::msi::data Thomas Gleixner
@ 2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 21:05 ` Bjorn Helgaas
2021-12-08 15:58 ` Jason Gunthorpe via iommu
2 siblings, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:26PM +0100, Thomas Gleixner wrote:
> Store the properties which are interesting for various places so the MSI
> descriptor fiddling can be removed.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* Re: [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-06 22:39 ` [patch V2 19/36] PCI/MSI: Store properties in device::msi::data Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
@ 2021-12-07 21:05 ` Bjorn Helgaas
2021-12-08 15:58 ` Jason Gunthorpe via iommu
2 siblings, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:05 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:26PM +0100, Thomas Gleixner wrote:
> Store the properties which are interesting for various places so the MSI
> descriptor fiddling can be removed.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> V2: Use the setter function
> ---
> drivers/pci/msi/msi.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -244,6 +244,8 @@ static void free_msi_irqs(struct pci_dev
> iounmap(dev->msix_base);
> dev->msix_base = NULL;
> }
> +
> + msi_device_set_properties(&dev->dev, 0);
> }
>
> static void pci_intx_for_msi(struct pci_dev *dev, int enable)
> @@ -341,6 +343,7 @@ msi_setup_entry(struct pci_dev *dev, int
> {
> struct irq_affinity_desc *masks = NULL;
> struct msi_desc *entry;
> + unsigned long prop;
> u16 control;
>
> if (affd)
> @@ -372,6 +375,10 @@ msi_setup_entry(struct pci_dev *dev, int
> if (entry->pci.msi_attrib.can_mask)
> pci_read_config_dword(dev, entry->pci.mask_pos, &entry->pci.msi_mask);
>
> + prop = MSI_PROP_PCI_MSI;
> + if (entry->pci.msi_attrib.is_64)
> + prop |= MSI_PROP_64BIT;
> + msi_device_set_properties(&dev->dev, prop);
> out:
> kfree(masks);
> return entry;
> @@ -514,6 +521,7 @@ static int msix_setup_entries(struct pci
> if (masks)
> curmsk++;
> }
> + msi_device_set_properties(&dev->dev, MSI_PROP_PCI_MSIX | MSI_PROP_64BIT);
> ret = 0;
> out:
> kfree(masks);
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-06 22:39 ` [patch V2 19/36] PCI/MSI: Store properties in device::msi::data Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 21:05 ` Bjorn Helgaas
@ 2021-12-08 15:58 ` Jason Gunthorpe via iommu
2021-12-09 17:53 ` Thomas Gleixner
2 siblings, 1 reply; 62+ messages in thread
From: Jason Gunthorpe via iommu @ 2021-12-08 15:58 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:26PM +0100, Thomas Gleixner wrote:
> Store the properties which are interesting for various places so the MSI
> descriptor fiddling can be removed.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V2: Use the setter function
> ---
> drivers/pci/msi/msi.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
I took more time to look at this, to summarize my remarks on the other
patches
I think we don't need properties. The info in the msi_desc can come
from the pci_dev which we have easy access to. This seems overall
clearer
The notable one is the sysfs, but that is probably better handled by
storing a
const char *sysfs_label
in the dev->msi and emitting that instead of computing it.
Jason
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* Re: [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-08 15:58 ` Jason Gunthorpe via iommu
@ 2021-12-09 17:53 ` Thomas Gleixner
2021-12-09 21:02 ` Thomas Gleixner
0 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-09 17:53 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Wed, Dec 08 2021 at 11:58, Jason Gunthorpe wrote:
> On Mon, Dec 06, 2021 at 11:39:26PM +0100, Thomas Gleixner wrote:
>> Store the properties which are interesting for various places so the MSI
>> descriptor fiddling can be removed.
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>> V2: Use the setter function
>> ---
>> drivers/pci/msi/msi.c | 8 ++++++++
>> 1 file changed, 8 insertions(+)
>
> I took more time to look at this, to summarize my remarks on the other
> patches
>
> I think we don't need properties. The info in the msi_desc can come
> from the pci_dev which we have easy access to. This seems overall
> clearer
I fixed that now.
> The notable one is the sysfs, but that is probably better handled by
> storing a
>
> const char *sysfs_label
>
> in the dev->msi and emitting that instead of computing it.
I just compute is for now via is_pci_dev() and
to_pci_dev()->msi_enabled.
We are still debating to remove the whole thing completely.
Thanks,
tglx
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 19/36] PCI/MSI: Store properties in device::msi::data
2021-12-09 17:53 ` Thomas Gleixner
@ 2021-12-09 21:02 ` Thomas Gleixner
0 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-09 21:02 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Thu, Dec 09 2021 at 18:53, Thomas Gleixner wrote:
> On Wed, Dec 08 2021 at 11:58, Jason Gunthorpe wrote:
>> On Mon, Dec 06, 2021 at 11:39:26PM +0100, Thomas Gleixner wrote:
>>> Store the properties which are interesting for various places so the MSI
>>> descriptor fiddling can be removed.
>>>
>>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>>> ---
>>> V2: Use the setter function
>>> ---
>>> drivers/pci/msi/msi.c | 8 ++++++++
>>> 1 file changed, 8 insertions(+)
>>
>> I took more time to look at this, to summarize my remarks on the other
>> patches
>>
>> I think we don't need properties. The info in the msi_desc can come
>> from the pci_dev which we have easy access to. This seems overall
>> clearer
>
> I fixed that now.
So much for the theory. dev->msi[x]_enabled are set after everything is
set up. Some of the places are part of the setup...
/me goes back to stare
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 20/36] x86/pci/XEN: Use device MSI properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (18 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 19/36] PCI/MSI: Store properties in device::msi::data Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-08 15:53 ` Jason Gunthorpe via iommu
2021-12-06 22:39 ` [patch V2 21/36] x86/apic/msi: " Thomas Gleixner
` (15 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
instead of fiddling with MSI descriptors.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
arch/x86/pci/xen.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -399,9 +399,7 @@ static void xen_teardown_msi_irqs(struct
static void xen_pv_teardown_msi_irqs(struct pci_dev *dev)
{
- struct msi_desc *msidesc = first_pci_msi_entry(dev);
-
- if (msidesc->pci.msi_attrib.is_msix)
+ if (msi_device_has_property(&dev->dev, MSI_PROP_PCI_MSIX))
xen_pci_frontend_disable_msix(dev);
else
xen_pci_frontend_disable_msi(dev);
@@ -417,7 +415,7 @@ static int xen_msi_domain_alloc_irqs(str
if (WARN_ON_ONCE(!dev_is_pci(dev)))
return -EINVAL;
- if (first_msi_entry(dev)->pci.msi_attrib.is_msix)
+ if (msi_device_has_property(dev, MSI_PROP_PCI_MSIX))
type = PCI_CAP_ID_MSIX;
else
type = PCI_CAP_ID_MSI;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 20/36] x86/pci/XEN: Use device MSI properties
2021-12-06 22:39 ` [patch V2 20/36] x86/pci/XEN: Use device MSI properties Thomas Gleixner
@ 2021-12-08 15:53 ` Jason Gunthorpe via iommu
2021-12-08 17:53 ` Thomas Gleixner
0 siblings, 1 reply; 62+ messages in thread
From: Jason Gunthorpe via iommu @ 2021-12-08 15:53 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:28PM +0100, Thomas Gleixner wrote:
> instead of fiddling with MSI descriptors.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> arch/x86/pci/xen.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> +++ b/arch/x86/pci/xen.c
> @@ -399,9 +399,7 @@ static void xen_teardown_msi_irqs(struct
>
> static void xen_pv_teardown_msi_irqs(struct pci_dev *dev)
> {
> - struct msi_desc *msidesc = first_pci_msi_entry(dev);
> -
> - if (msidesc->pci.msi_attrib.is_msix)
> + if (msi_device_has_property(&dev->dev, MSI_PROP_PCI_MSIX))
> xen_pci_frontend_disable_msix(dev);
> else
> xen_pci_frontend_disable_msi(dev);
Same remark as for power, we have a pci_dev, so can it be dev->msix_enabled?
> @@ -417,7 +415,7 @@ static int xen_msi_domain_alloc_irqs(str
> if (WARN_ON_ONCE(!dev_is_pci(dev)))
> return -EINVAL;
>
> - if (first_msi_entry(dev)->pci.msi_attrib.is_msix)
> + if (msi_device_has_property(dev, MSI_PROP_PCI_MSIX))
And this WARNS if it is not a pci_dev, so same
Jason
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 20/36] x86/pci/XEN: Use device MSI properties
2021-12-08 15:53 ` Jason Gunthorpe via iommu
@ 2021-12-08 17:53 ` Thomas Gleixner
0 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-08 17:53 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Wed, Dec 08 2021 at 11:53, Jason Gunthorpe wrote:
> On Mon, Dec 06, 2021 at 11:39:28PM +0100, Thomas Gleixner wrote:
>> static void xen_pv_teardown_msi_irqs(struct pci_dev *dev)
>> {
>> - struct msi_desc *msidesc = first_pci_msi_entry(dev);
>> -
>> - if (msidesc->pci.msi_attrib.is_msix)
>> + if (msi_device_has_property(&dev->dev, MSI_PROP_PCI_MSIX))
>> xen_pci_frontend_disable_msix(dev);
>> else
>> xen_pci_frontend_disable_msi(dev);
>
> Same remark as for power, we have a pci_dev, so can it be
> dev->msix_enabled?
Yes, let me rework that.
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 21/36] x86/apic/msi: Use device MSI properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (19 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 20/36] x86/pci/XEN: Use device MSI properties Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-08 15:45 ` Jason Gunthorpe via iommu
2021-12-06 22:39 ` [patch V2 22/36] genirq/msi: " Thomas Gleixner
` (14 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
instead of fiddling with MSI descriptors.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
arch/x86/kernel/apic/msi.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -160,11 +160,8 @@ static struct irq_chip pci_msi_controlle
int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
msi_alloc_info_t *arg)
{
- struct pci_dev *pdev = to_pci_dev(dev);
- struct msi_desc *desc = first_pci_msi_entry(pdev);
-
init_irq_alloc_info(arg, NULL);
- if (desc->pci.msi_attrib.is_msix) {
+ if (msi_device_has_property(dev, MSI_PROP_PCI_MSIX)) {
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
} else {
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 21/36] x86/apic/msi: Use device MSI properties
2021-12-06 22:39 ` [patch V2 21/36] x86/apic/msi: " Thomas Gleixner
@ 2021-12-08 15:45 ` Jason Gunthorpe via iommu
0 siblings, 0 replies; 62+ messages in thread
From: Jason Gunthorpe via iommu @ 2021-12-08 15:45 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:29PM +0100, Thomas Gleixner wrote:
> instead of fiddling with MSI descriptors.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> ---
> arch/x86/kernel/apic/msi.c | 5 +----
> 1 file changed, 1 insertion(+), 4 deletions(-)
>
> --- a/arch/x86/kernel/apic/msi.c
> +++ b/arch/x86/kernel/apic/msi.c
> @@ -160,11 +160,8 @@ static struct irq_chip pci_msi_controlle
> int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
> msi_alloc_info_t *arg)
> {
> - struct pci_dev *pdev = to_pci_dev(dev);
> - struct msi_desc *desc = first_pci_msi_entry(pdev);
> -
> init_irq_alloc_info(arg, NULL);
> - if (desc->pci.msi_attrib.is_msix) {
> + if (msi_device_has_property(dev, MSI_PROP_PCI_MSIX)) {
> arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
> } else {
> arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
>
Just thought for future
It looks like the only use of this is to link to the irq_remapping
which is only using it to get back to the physical device:
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
set_msi_sid(irte,
pci_real_dma_dev(msi_desc_to_pci_dev(info->desc)));
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
return get_device_id(msi_desc_to_dev(info->desc));
And this is super confusing:
static inline int get_device_id(struct device *dev)
{
int devid;
if (dev_is_pci(dev))
devid = get_pci_device_id(dev);
else
devid = get_acpihid_device_id(dev, NULL);
return devid;
}
How does an ACPI device have a *PCI* MSI or MSI-X ??
IMHO this makes more sense written as:
struct device *origin_device = msi_desc_get_origin_dev(info->desc);
if (dev_is_pci(origin_device)
devid = get_pci_device_id(origin_device);
else if (dev_is_acpi(origin_device))
devid = get_acpihid_device_id(dev, NULL);
And similar in all places touching X86_IRQ_ALLOC_TYPE_PCI_MSI/X
Like this oddball thing in AMD too:
} else if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI ||
info->type == X86_IRQ_ALLOC_TYPE_PCI_MSIX) {
bool align = (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI);
index = alloc_irq_index(devid, nr_irqs, align,
msi_desc_to_pci_dev(info->desc));
} else {
index = alloc_irq_index(devid, nr_irqs, false, NULL);
This should just use a dev and inside alloc_irq_table do the dev_is_pci()
thing to guard the pci_for_each_dma_alias()
Then just call it X86_IRQ_ALLOC_TYPE_DEVICE (ie allocated for a struct device)
Jason
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 22/36] genirq/msi: Use device MSI properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (20 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 21/36] x86/apic/msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties Thomas Gleixner
` (13 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
instead of fiddling with MSI descriptors.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
kernel/irq/msi.c | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -122,21 +122,8 @@ int msi_setup_device_data(struct device
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
- struct msi_desc *entry;
- bool is_msix = false;
- unsigned long irq;
- int retval;
-
- retval = kstrtoul(attr->attr.name, 10, &irq);
- if (retval)
- return retval;
-
- entry = irq_get_msi_desc(irq);
- if (!entry)
- return -ENODEV;
-
- if (dev_is_pci(dev))
- is_msix = entry->pci.msi_attrib.is_msix;
+ /* MSI vs. MSIX is per device not per interrupt */
+ bool is_msix = msi_device_has_property(dev, MSI_PROP_PCI_MSIX);
return sysfs_emit(buf, "%s\n", is_msix ? "msix" : "msi");
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (21 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 22/36] genirq/msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-08 15:54 ` Jason Gunthorpe via iommu
2021-12-06 22:39 ` [patch V2 24/36] powerpc/pseries/msi: " Thomas Gleixner
` (12 subsequent siblings)
35 siblings, 2 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
instead of fiddling with MSI descriptors.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Invoke the function with the correct number of arguments - Andy
---
arch/powerpc/platforms/cell/axon_msi.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
--- a/arch/powerpc/platforms/cell/axon_msi.c
+++ b/arch/powerpc/platforms/cell/axon_msi.c
@@ -199,7 +199,7 @@ static struct axon_msic *find_msi_transl
static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
{
struct device_node *dn;
- struct msi_desc *entry;
+ bool is_64bit;
int len;
const u32 *prop;
@@ -209,10 +209,10 @@ static int setup_msi_msg_address(struct
return -ENODEV;
}
- entry = first_pci_msi_entry(dev);
+ is_64bit = msi_device_has_property(&dev->dev, MSI_PROP_64BIT);
for (; dn; dn = of_get_next_parent(dn)) {
- if (entry->pci.msi_attrib.is_64) {
+ if (is_64bit) {
prop = of_get_property(dn, "msi-address-64", &len);
if (prop)
break;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties
2021-12-06 22:39 ` [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties Thomas Gleixner
@ 2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-08 15:54 ` Jason Gunthorpe via iommu
1 sibling, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:33PM +0100, Thomas Gleixner wrote:
> instead of fiddling with MSI descriptors.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* Re: [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties
2021-12-06 22:39 ` [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
@ 2021-12-08 15:54 ` Jason Gunthorpe via iommu
1 sibling, 0 replies; 62+ messages in thread
From: Jason Gunthorpe via iommu @ 2021-12-08 15:54 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:33PM +0100, Thomas Gleixner wrote:
> @@ -209,10 +209,10 @@ static int setup_msi_msg_address(struct
> return -ENODEV;
> }
>
> - entry = first_pci_msi_entry(dev);
> + is_64bit = msi_device_has_property(&dev->dev, MSI_PROP_64BIT);
How about !dev->no_64bit_msi ?
Jason
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 24/36] powerpc/pseries/msi: Use MSI device properties
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (22 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 23/36] powerpc/cell/axon_msi: Use MSI device properties Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-08 15:51 ` Jason Gunthorpe via iommu
2021-12-06 22:39 ` [patch V2 25/36] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
` (11 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
instead of fiddling with MSI descriptors.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
arch/powerpc/platforms/pseries/msi.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -447,9 +447,9 @@ static int rtas_prepare_msi_irqs(struct
static int pseries_msi_ops_prepare(struct irq_domain *domain, struct device *dev,
int nvec, msi_alloc_info_t *arg)
{
+ bool is_msix = msi_device_has_property(dev, MSI_PROP_PCI_MSIX);
+ int type = is_msix ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
struct pci_dev *pdev = to_pci_dev(dev);
- struct msi_desc *desc = first_pci_msi_entry(pdev);
- int type = desc->pci.msi_attrib.is_msix ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
return rtas_prepare_msi_irqs(pdev, nvec, type, arg);
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 24/36] powerpc/pseries/msi: Use MSI device properties
2021-12-06 22:39 ` [patch V2 24/36] powerpc/pseries/msi: " Thomas Gleixner
@ 2021-12-08 15:51 ` Jason Gunthorpe via iommu
0 siblings, 0 replies; 62+ messages in thread
From: Jason Gunthorpe via iommu @ 2021-12-08 15:51 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, xen-devel, Kevin Tian, Alex Williamson,
Cedric Le Goater, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:34PM +0100, Thomas Gleixner wrote:
> instead of fiddling with MSI descriptors.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> arch/powerpc/platforms/pseries/msi.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> +++ b/arch/powerpc/platforms/pseries/msi.c
> @@ -447,9 +447,9 @@ static int rtas_prepare_msi_irqs(struct
> static int pseries_msi_ops_prepare(struct irq_domain *domain, struct device *dev,
> int nvec, msi_alloc_info_t *arg)
> {
> + bool is_msix = msi_device_has_property(dev, MSI_PROP_PCI_MSIX);
> + int type = is_msix ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;
> struct pci_dev *pdev = to_pci_dev(dev);
We have the pci_dev here, why not just do something like
bool is_msix = pdev->msix_enabled;
?
Jason
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 25/36] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (23 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 24/36] powerpc/pseries/msi: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 21:05 ` Bjorn Helgaas
2021-12-06 22:39 ` [patch V2 26/36] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
` (10 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Provide a domain info flag which makes the core code check for a contiguous
MSI-X index on allocation. That's simpler than checking it at some other
domain callback in architecture code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/pci/msi/irqdomain.c | 16 ++++++++++++++--
include/linux/msi.h | 2 ++
2 files changed, 16 insertions(+), 2 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -89,9 +89,21 @@ static int pci_msi_domain_check_cap(stru
if (pci_msi_desc_is_multi_msi(desc) &&
!(info->flags & MSI_FLAG_MULTI_PCI_MSI))
return 1;
- else if (desc->pci.msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX))
- return -ENOTSUPP;
+ if (desc->pci.msi_attrib.is_msix) {
+ if (!(info->flags & MSI_FLAG_PCI_MSIX))
+ return -ENOTSUPP;
+
+ if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
+ unsigned int idx = 0;
+
+ /* Check for gaps in the entry indices */
+ for_each_msi_entry(desc, dev) {
+ if (desc->msi_index != idx++)
+ return -ENOTSUPP;
+ }
+ }
+ }
return 0;
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -376,6 +376,8 @@ enum {
MSI_FLAG_LEVEL_CAPABLE = (1 << 6),
/* Populate sysfs on alloc() and destroy it on free() */
MSI_FLAG_DEV_SYSFS = (1 << 7),
+ /* MSI-X entries must be contiguous */
+ MSI_FLAG_MSIX_CONTIGUOUS = (1 << 8),
};
int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 25/36] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS
2021-12-06 22:39 ` [patch V2 25/36] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
@ 2021-12-07 21:05 ` Bjorn Helgaas
0 siblings, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:05 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:36PM +0100, Thomas Gleixner wrote:
> Provide a domain info flag which makes the core code check for a contiguous
> MSI-X index on allocation. That's simpler than checking it at some other
> domain callback in architecture code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 16 ++++++++++++++--
> include/linux/msi.h | 2 ++
> 2 files changed, 16 insertions(+), 2 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -89,9 +89,21 @@ static int pci_msi_domain_check_cap(stru
> if (pci_msi_desc_is_multi_msi(desc) &&
> !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
> return 1;
> - else if (desc->pci.msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX))
> - return -ENOTSUPP;
>
> + if (desc->pci.msi_attrib.is_msix) {
> + if (!(info->flags & MSI_FLAG_PCI_MSIX))
> + return -ENOTSUPP;
> +
> + if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
> + unsigned int idx = 0;
> +
> + /* Check for gaps in the entry indices */
> + for_each_msi_entry(desc, dev) {
> + if (desc->msi_index != idx++)
> + return -ENOTSUPP;
> + }
> + }
> + }
> return 0;
> }
>
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -376,6 +376,8 @@ enum {
> MSI_FLAG_LEVEL_CAPABLE = (1 << 6),
> /* Populate sysfs on alloc() and destroy it on free() */
> MSI_FLAG_DEV_SYSFS = (1 << 7),
> + /* MSI-X entries must be contiguous */
> + MSI_FLAG_MSIX_CONTIGUOUS = (1 << 8),
> };
>
> int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 26/36] powerpc/pseries/msi: Let core code check for contiguous entries
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (24 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 25/36] PCI/MSI: Provide MSI_FLAG_MSIX_CONTIGUOUS Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-06 22:39 ` [patch V2 27/36] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
` (9 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Set the domain info flag and remove the check.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Remove it completely - Cedric
---
arch/powerpc/platforms/pseries/msi.c | 33 ++++++++-------------------------
1 file changed, 8 insertions(+), 25 deletions(-)
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -321,27 +321,6 @@ static int msi_quota_for_device(struct p
return request;
}
-static int check_msix_entries(struct pci_dev *pdev)
-{
- struct msi_desc *entry;
- int expected;
-
- /* There's no way for us to express to firmware that we want
- * a discontiguous, or non-zero based, range of MSI-X entries.
- * So we must reject such requests. */
-
- expected = 0;
- for_each_pci_msi_entry(entry, pdev) {
- if (entry->msi_index != expected) {
- pr_debug("rtas_msi: bad MSI-X entries.\n");
- return -EINVAL;
- }
- expected++;
- }
-
- return 0;
-}
-
static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev)
{
u32 addr_hi, addr_lo;
@@ -380,9 +359,6 @@ static int rtas_prepare_msi_irqs(struct
if (quota && quota < nvec)
return quota;
- if (type == PCI_CAP_ID_MSIX && check_msix_entries(pdev))
- return -EINVAL;
-
/*
* Firmware currently refuse any non power of two allocation
* so we round up if the quota will allow it.
@@ -530,9 +506,16 @@ static struct irq_chip pseries_pci_msi_i
.irq_write_msi_msg = pseries_msi_write_msg,
};
+
+/*
+ * Set MSI_FLAG_MSIX_CONTIGUOUS as there is no way to express to
+ * firmware to request a discontiguous or non-zero based range of
+ * MSI-X entries. Core code will reject such setup attempts.
+ */
static struct msi_domain_info pseries_msi_domain_info = {
.flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
- MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX),
+ MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX |
+ MSI_FLAG_MSIX_CONTIGUOUS),
.ops = &pseries_pci_msi_domain_ops,
.chip = &pseries_pci_msi_irq_chip,
};
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 26/36] powerpc/pseries/msi: Let core code check for contiguous entries
2021-12-06 22:39 ` [patch V2 26/36] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
@ 2021-12-07 7:52 ` Greg Kroah-Hartman
0 siblings, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:37PM +0100, Thomas Gleixner wrote:
> Set the domain info flag and remove the check.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 27/36] genirq/msi: Provide interface to retrieve Linux interrupt number
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (25 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 26/36] powerpc/pseries/msi: Let core code check for contiguous entries Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:51 ` Greg Kroah-Hartman
2021-12-06 22:39 ` [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
` (8 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
This allows drivers to retrieve the Linux interrupt number instead of
fiddling with MSI descriptors.
msi_get_virq() returns the Linux interrupt number or 0 in case that there
is no entry for the given MSI index.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Simplify the implementation and let PCI deal with the PCI specialities - Marc
---
include/linux/msi.h | 2 ++
kernel/irq/msi.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -170,6 +170,8 @@ static inline bool msi_device_has_proper
static inline void msi_device_set_properties(struct device *dev, unsigned long prop) { }
#endif
+unsigned int msi_get_virq(struct device *dev, unsigned int index);
+
/* Helpers to hide struct msi_desc implementation details */
#define msi_desc_to_dev(desc) ((desc)->dev)
#define dev_to_msi_list(dev) (&(dev)->msi_list)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -129,6 +129,42 @@ int msi_setup_device_data(struct device
return 0;
}
+/**
+ * msi_get_virq - Return Linux interrupt number of a MSI interrupt
+ * @dev: Device to operate on
+ * @index: MSI interrupt index to look for (0-based)
+ *
+ * Return: The Linux interrupt number on success (> 0), 0 if not found
+ */
+unsigned int msi_get_virq(struct device *dev, unsigned int index)
+{
+ struct msi_desc *desc;
+ bool pcimsi;
+
+ if (!dev->msi.data)
+ return 0;
+
+ pcimsi = msi_device_has_property(dev, MSI_PROP_PCI_MSI);
+
+ for_each_msi_entry(desc, dev) {
+ /* PCI-MSI has only one descriptor for multiple interrupts. */
+ if (pcimsi) {
+ if (desc->irq && index < desc->nvec_used)
+ return desc->irq + index;
+ break;
+ }
+
+ /*
+ * PCI-MSIX and platform MSI use a descriptor per
+ * interrupt.
+ */
+ if (desc->msi_index == index)
+ return desc->irq;
+ }
+ return 0;
+}
+EXPORT_SYMBOL_GPL(msi_get_virq);
+
#ifdef CONFIG_SYSFS
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
char *buf)
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 27/36] genirq/msi: Provide interface to retrieve Linux interrupt number
2021-12-06 22:39 ` [patch V2 27/36] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
@ 2021-12-07 7:51 ` Greg Kroah-Hartman
0 siblings, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:51 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:39PM +0100, Thomas Gleixner wrote:
> This allows drivers to retrieve the Linux interrupt number instead of
> fiddling with MSI descriptors.
>
> msi_get_virq() returns the Linux interrupt number or 0 in case that there
> is no entry for the given MSI index.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (26 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 27/36] genirq/msi: Provide interface to retrieve Linux interrupt number Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 21:05 ` Bjorn Helgaas
2021-12-06 22:39 ` [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
` (7 subsequent siblings)
35 siblings, 2 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Use msi_get_vector() and handle the return value to be compatible.
No functional change intended.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Handle the INTx case directly instead of trying to be overly smart - Marc
---
drivers/pci/msi/msi.c | 25 +++++--------------------
1 file changed, 5 insertions(+), 20 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1032,28 +1032,13 @@ EXPORT_SYMBOL(pci_free_irq_vectors);
*/
int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
{
- if (dev->msix_enabled) {
- struct msi_desc *entry;
+ unsigned int irq;
- for_each_pci_msi_entry(entry, dev) {
- if (entry->msi_index == nr)
- return entry->irq;
- }
- WARN_ON_ONCE(1);
- return -EINVAL;
- }
+ if (!dev->msi_enabled && !dev->msix_enabled)
+ return !nr ? dev->irq : -EINVAL;
- if (dev->msi_enabled) {
- struct msi_desc *entry = first_pci_msi_entry(dev);
-
- if (WARN_ON_ONCE(nr >= entry->nvec_used))
- return -EINVAL;
- } else {
- if (WARN_ON_ONCE(nr > 0))
- return -EINVAL;
- }
-
- return dev->irq + nr;
+ irq = msi_get_virq(&dev->dev, nr);
+ return irq ? irq : -EINVAL;
}
EXPORT_SYMBOL(pci_irq_vector);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
2021-12-06 22:39 ` [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
@ 2021-12-07 7:52 ` Greg Kroah-Hartman
2021-12-07 21:05 ` Bjorn Helgaas
1 sibling, 0 replies; 62+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-07 7:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, LKML, Vinod Koul,
dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:41PM +0100, Thomas Gleixner wrote:
> Use msi_get_vector() and handle the return value to be compatible.
>
> No functional change intended.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* Re: [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
2021-12-06 22:39 ` [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
2021-12-07 7:52 ` Greg Kroah-Hartman
@ 2021-12-07 21:05 ` Bjorn Helgaas
1 sibling, 0 replies; 62+ messages in thread
From: Bjorn Helgaas @ 2021-12-07 21:05 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
LKML, iommu, dmaengine, Robin Murphy
On Mon, Dec 06, 2021 at 11:39:41PM +0100, Thomas Gleixner wrote:
> Use msi_get_vector() and handle the return value to be compatible.
>
> No functional change intended.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> V2: Handle the INTx case directly instead of trying to be overly smart - Marc
> ---
> drivers/pci/msi/msi.c | 25 +++++--------------------
> 1 file changed, 5 insertions(+), 20 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -1032,28 +1032,13 @@ EXPORT_SYMBOL(pci_free_irq_vectors);
> */
> int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> {
> - if (dev->msix_enabled) {
> - struct msi_desc *entry;
> + unsigned int irq;
>
> - for_each_pci_msi_entry(entry, dev) {
> - if (entry->msi_index == nr)
> - return entry->irq;
> - }
> - WARN_ON_ONCE(1);
> - return -EINVAL;
> - }
> + if (!dev->msi_enabled && !dev->msix_enabled)
> + return !nr ? dev->irq : -EINVAL;
>
> - if (dev->msi_enabled) {
> - struct msi_desc *entry = first_pci_msi_entry(dev);
> -
> - if (WARN_ON_ONCE(nr >= entry->nvec_used))
> - return -EINVAL;
> - } else {
> - if (WARN_ON_ONCE(nr > 0))
> - return -EINVAL;
> - }
> -
> - return dev->irq + nr;
> + irq = msi_get_virq(&dev->dev, nr);
> + return irq ? irq : -EINVAL;
> }
> EXPORT_SYMBOL(pci_irq_vector);
>
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (27 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 28/36] PCI/MSI: Use __msi_get_virq() in pci_get_vector() Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-07 17:42 ` Cédric Le Goater
2021-12-06 22:39 ` [patch V2 30/36] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
` (6 subsequent siblings)
35 siblings, 1 reply; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Replace open coded MSI descriptor chasing and use the proper accessor
functions instead.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/pci/msi/msi.c | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -1056,26 +1056,20 @@ EXPORT_SYMBOL(pci_irq_vector);
*/
const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
{
- if (dev->msix_enabled) {
- struct msi_desc *entry;
+ int irq = pci_irq_vector(dev, nr);
+ struct msi_desc *desc;
- for_each_pci_msi_entry(entry, dev) {
- if (entry->msi_index == nr)
- return &entry->affinity->mask;
- }
- WARN_ON_ONCE(1);
+ if (WARN_ON_ONCE(irq <= 0))
return NULL;
- } else if (dev->msi_enabled) {
- struct msi_desc *entry = first_pci_msi_entry(dev);
- if (WARN_ON_ONCE(!entry || !entry->affinity ||
- nr >= entry->nvec_used))
- return NULL;
-
- return &entry->affinity[nr].mask;
- } else {
+ desc = irq_get_msi_desc(irq);
+ /* Non-MSI does not have the information handy */
+ if (!desc)
return cpu_possible_mask;
- }
+
+ if (WARN_ON_ONCE(!desc->affinity))
+ return NULL;
+ return &desc->affinity[nr].mask;
}
EXPORT_SYMBOL(pci_irq_get_affinity);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity()
2021-12-06 22:39 ` [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
@ 2021-12-07 17:42 ` Cédric Le Goater
2021-12-07 21:19 ` Thomas Gleixner
0 siblings, 1 reply; 62+ messages in thread
From: Cédric Le Goater @ 2021-12-07 17:42 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Santosh Shilimkar, linux-arm-kernel,
Juergen Gross, Tero Kristo, Greg Kroah-Hartman, Vinod Koul,
dmaengine, Robin Murphy
Thomas,
On 12/6/21 23:39, Thomas Gleixner wrote:
> Replace open coded MSI descriptor chasing and use the proper accessor
> functions instead.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> ---
> drivers/pci/msi/msi.c | 26 ++++++++++----------------
> 1 file changed, 10 insertions(+), 16 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -1056,26 +1056,20 @@ EXPORT_SYMBOL(pci_irq_vector);
> */
> const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
> {
> - if (dev->msix_enabled) {
> - struct msi_desc *entry;
> + int irq = pci_irq_vector(dev, nr);
> + struct msi_desc *desc;
>
> - for_each_pci_msi_entry(entry, dev) {
> - if (entry->msi_index == nr)
> - return &entry->affinity->mask;
> - }
> - WARN_ON_ONCE(1);
> + if (WARN_ON_ONCE(irq <= 0))
> return NULL;
> - } else if (dev->msi_enabled) {
> - struct msi_desc *entry = first_pci_msi_entry(dev);
>
> - if (WARN_ON_ONCE(!entry || !entry->affinity ||
> - nr >= entry->nvec_used))
> - return NULL;
> -
> - return &entry->affinity[nr].mask;
> - } else {
> + desc = irq_get_msi_desc(irq);
> + /* Non-MSI does not have the information handy */
> + if (!desc)
> return cpu_possible_mask;
> - }
> +
> + if (WARN_ON_ONCE(!desc->affinity))
> + return NULL;
> + return &desc->affinity[nr].mask;
> }
> EXPORT_SYMBOL(pci_irq_get_affinity);
This is breaking nvme on pseries but it's probably one of the previous
patches. I haven't figured out what's wrong yet. Here is the oops FYI.
Thanks,
C.
[ 32.494536] ------------[ cut here ]------------
[ 32.494562] WARNING: CPU: 26 PID: 658 at kernel/irq/chip.c:210 irq_startup+0x1c0/0x1e0
[ 32.494575] Modules linked in: ibmvscsi ibmveth scsi_transport_srp bnx2x ipr libata xhci_pci xhci_hcd nvme xts vmx_crypto nvme_core mdio t10_pi libcrc32c dm_mirror dm_region_hash dm_log dm_mod
[ 32.494601] CPU: 26 PID: 658 Comm: kworker/26:1H Not tainted 5.16.0-rc4-clg+ #54
[ 32.494607] Workqueue: kblockd blk_mq_timeout_work
[ 32.494615] NIP: c000000000206f00 LR: c000000000206df0 CTR: c000000000201570
[ 32.494619] REGS: c0000018050f3610 TRAP: 0700 Not tainted (5.16.0-rc4-clg+)
[ 32.494624] MSR: 800000000282b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 44002288 XER: 00000000
[ 32.494636] CFAR: c000000000206e0c IRQMASK: 1
[ 32.494636] GPR00: c000000000206df0 c0000018050f38b0 c000000001ca2900 0000000000000800
[ 32.494636] GPR04: c000000001ce21b8 0000000000000800 0000000000000800 0000000000000000
[ 32.494636] GPR08: 0000000000000000 0000000000000200 0000000000000000 fffffffffffffffd
[ 32.494636] GPR12: 0000000000000000 c000001fff7c5880 c00000000018f488 c00000012faaba40
[ 32.494636] GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000001
[ 32.494636] GPR20: 0000000000000000 c0000018050f3c40 c00000000076e110 c00000013ac23678
[ 32.494636] GPR24: 000000000000007f 0000000000000100 0000000000000001 c000001805b08000
[ 32.494636] GPR28: c000000139b8cc18 0000000000000001 0000000000000001 c000000139b8cc00
[ 32.494681] NIP [c000000000206f00] irq_startup+0x1c0/0x1e0
[ 32.494686] LR [c000000000206df0] irq_startup+0xb0/0x1e0
[ 32.494690] Call Trace:
[ 32.494692] [c0000018050f38b0] [c000000000206df0] irq_startup+0xb0/0x1e0 (unreliable)
[ 32.494699] [c0000018050f38f0] [c00000000020155c] __enable_irq+0x9c/0xb0
[ 32.494705] [c0000018050f3950] [c0000000002015d0] enable_irq+0x60/0xc0
[ 32.494710] [c0000018050f39d0] [c008000014a54ae8] nvme_poll_irqdisable+0x80/0xc0 [nvme]
[ 32.494719] [c0000018050f3a00] [c008000014a55824] nvme_timeout+0x18c/0x420 [nvme]
[ 32.494726] [c0000018050f3ae0] [c00000000076e1b8] blk_mq_check_expired+0xa8/0x130
[ 32.494732] [c0000018050f3b10] [c0000000007793e8] bt_iter+0xd8/0x120
[ 32.494737] [c0000018050f3b60] [c00000000077a34c] blk_mq_queue_tag_busy_iter+0x25c/0x3f0
[ 32.494742] [c0000018050f3c20] [c00000000076ffa4] blk_mq_timeout_work+0x84/0x1a0
[ 32.494747] [c0000018050f3c70] [c000000000182a78] process_one_work+0x2a8/0x5a0
[ 32.494754] [c0000018050f3d10] [c000000000183468] worker_thread+0xa8/0x610
[ 32.494759] [c0000018050f3da0] [c00000000018f634] kthread+0x1b4/0x1c0
[ 32.494764] [c0000018050f3e10] [c00000000000cd64] ret_from_kernel_thread+0x5c/0x64
[ 32.494769] Instruction dump:
[ 32.494773] 60000000 0b030000 38a00000 7f84e378 7fc3f378 4bff9a55 60000000 7fe3fb78
[ 32.494781] 4bfffd79 eb810020 7c7e1b78 4bfffe94 <0fe00000> 60000000 60000000 60420000
[ 32.494788] ---[ end trace 2a27b87f2b3e7a1f ]---
[ 32.494798] nvme nvme0: I/O 192 QID 128 timeout, aborting
[ 32.584562] nvme nvme0: Abort status: 0x0
[ 62.574526] nvme nvme0: I/O 200 QID 128 timeout, aborting
[ 62.574587] nvme0n1: p1
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* Re: [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity()
2021-12-07 17:42 ` Cédric Le Goater
@ 2021-12-07 21:19 ` Thomas Gleixner
0 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-07 21:19 UTC (permalink / raw)
To: Cédric Le Goater, LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Christoph Hellwig, Bjorn Helgaas, Megha Dey, Jason Gunthorpe,
xen-devel, Kevin Tian, Alex Williamson, Santosh Shilimkar,
Keith Busch, Dan Williams, linux-arm-kernel, Juergen Gross,
Tero Kristo, Greg Kroah-Hartman, Vinod Koul, dmaengine,
Robin Murphy
Cedric,
On Tue, Dec 07 2021 at 18:42, Cédric Le Goater wrote:
>
> This is breaking nvme on pseries but it's probably one of the previous
> patches. I haven't figured out what's wrong yet. Here is the oops FYI.
Hrm.
> [ 32.494562] WARNING: CPU: 26 PID: 658 at kernel/irq/chip.c:210 irq_startup+0x1c0/0x1e0
This complains about a manual enable_irq() on a managed interrupt.
> [ 32.494575] Modules linked in: ibmvscsi ibmveth scsi_transport_srp bnx2x ipr libata xhci_pci xhci_hcd nvme xts vmx_crypto nvme_core mdio t10_pi libcrc32c dm_mirror dm_region_hash dm_log dm_mod
> [ 32.494601] CPU: 26 PID: 658 Comm: kworker/26:1H Not tainted 5.16.0-rc4-clg+ #54
> [ 32.494607] Workqueue: kblockd blk_mq_timeout_work
> [ 32.494681] NIP [c000000000206f00] irq_startup+0x1c0/0x1e0
> [ 32.494686] LR [c000000000206df0] irq_startup+0xb0/0x1e0
> [ 32.494690] Call Trace:
> [ 32.494692] [c0000018050f38b0] [c000000000206df0] irq_startup+0xb0/0x1e0 (unreliable)
> [ 32.494699] [c0000018050f38f0] [c00000000020155c] __enable_irq+0x9c/0xb0
> [ 32.494705] [c0000018050f3950] [c0000000002015d0] enable_irq+0x60/0xc0
> [ 32.494710] [c0000018050f39d0] [c008000014a54ae8] nvme_poll_irqdisable+0x80/0xc0 [nvme]
> [ 32.494719] [c0000018050f3a00] [c008000014a55824] nvme_timeout+0x18c/0x420 [nvme]
> [ 32.494726] [c0000018050f3ae0] [c00000000076e1b8] blk_mq_check_expired+0xa8/0x130
> [ 32.494732] [c0000018050f3b10] [c0000000007793e8] bt_iter+0xd8/0x120
> [ 32.494737] [c0000018050f3b60] [c00000000077a34c] blk_mq_queue_tag_busy_iter+0x25c/0x3f0
> [ 32.494742] [c0000018050f3c20] [c00000000076ffa4] blk_mq_timeout_work+0x84/0x1a0
> [ 32.494747] [c0000018050f3c70] [c000000000182a78] process_one_work+0x2a8/0x5a0
Confused. I diffed against v1, but could not spot anything except that
properties issue which you found too.
Thanks,
tglx
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread
* [patch V2 30/36] dmaengine: mv_xor_v2: Get rid of msi_desc abuse
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (28 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 29/36] PCI/MSI: Simplify pci_irq_get_affinity() Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 31/36] perf/smmuv3: Use msi_get_virq() Thomas Gleixner
` (5 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Storing a pointer to the MSI descriptor just to keep track of the Linux
interrupt number is daft. Use msi_get_virq() instead.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: dmaengine@vger.kernel.org
Cc: Vinod Koul <vkoul@kernel.org>
---
drivers/dma/mv_xor_v2.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
--- a/drivers/dma/mv_xor_v2.c
+++ b/drivers/dma/mv_xor_v2.c
@@ -149,7 +149,7 @@ struct mv_xor_v2_descriptor {
* @desc_size: HW descriptor size
* @npendings: number of pending descriptors (for which tx_submit has
* @hw_queue_idx: HW queue index
- * @msi_desc: local interrupt descriptor information
+ * @irq: The Linux interrupt number
* been called, but not yet issue_pending)
*/
struct mv_xor_v2_device {
@@ -168,7 +168,7 @@ struct mv_xor_v2_device {
int desc_size;
unsigned int npendings;
unsigned int hw_queue_idx;
- struct msi_desc *msi_desc;
+ unsigned int irq;
};
/**
@@ -718,7 +718,6 @@ static int mv_xor_v2_probe(struct platfo
int i, ret = 0;
struct dma_device *dma_dev;
struct mv_xor_v2_sw_desc *sw_desc;
- struct msi_desc *msi_desc;
BUILD_BUG_ON(sizeof(struct mv_xor_v2_descriptor) !=
MV_XOR_V2_EXT_DESC_SIZE);
@@ -770,14 +769,9 @@ static int mv_xor_v2_probe(struct platfo
if (ret)
goto disable_clk;
- msi_desc = first_msi_entry(&pdev->dev);
- if (!msi_desc) {
- ret = -ENODEV;
- goto free_msi_irqs;
- }
- xor_dev->msi_desc = msi_desc;
+ xor_dev->irq = msi_get_virq(&pdev->dev, 0);
- ret = devm_request_irq(&pdev->dev, msi_desc->irq,
+ ret = devm_request_irq(&pdev->dev, xor_dev->irq,
mv_xor_v2_interrupt_handler, 0,
dev_name(&pdev->dev), xor_dev);
if (ret)
@@ -892,7 +886,7 @@ static int mv_xor_v2_remove(struct platf
xor_dev->desc_size * MV_XOR_V2_DESC_NUM,
xor_dev->hw_desq_virt, xor_dev->hw_desq);
- devm_free_irq(&pdev->dev, xor_dev->msi_desc->irq, xor_dev);
+ devm_free_irq(&pdev->dev, xor_dev->irq, xor_dev);
platform_msi_domain_free_irqs(&pdev->dev);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 31/36] perf/smmuv3: Use msi_get_virq()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (29 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 30/36] dmaengine: mv_xor_v2: Get rid of msi_desc abuse Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 32/36] iommu/arm-smmu-v3: " Thomas Gleixner
` (4 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Mark Rutland, Nishanth Menon, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Bjorn Helgaas, linux-arm-kernel, Jason Gunthorpe, xen-devel,
Kevin Tian, Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
Megha Dey, Juergen Gross, Tero Kristo, Greg Kroah-Hartman, iommu,
dmaengine, Robin Murphy
Let the core code fiddle with the MSI descriptor retrieval.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
---
drivers/perf/arm_smmuv3_pmu.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
--- a/drivers/perf/arm_smmuv3_pmu.c
+++ b/drivers/perf/arm_smmuv3_pmu.c
@@ -684,7 +684,6 @@ static void smmu_pmu_write_msi_msg(struc
static void smmu_pmu_setup_msi(struct smmu_pmu *pmu)
{
- struct msi_desc *desc;
struct device *dev = pmu->dev;
int ret;
@@ -701,9 +700,7 @@ static void smmu_pmu_setup_msi(struct sm
return;
}
- desc = first_msi_entry(dev);
- if (desc)
- pmu->irq = desc->irq;
+ pmu->irq = msi_get_virq(dev, 0);
/* Add callback to free MSIs on teardown */
devm_add_action(dev, smmu_pmu_free_msis, dev);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 32/36] iommu/arm-smmu-v3: Use msi_get_virq()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (30 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 31/36] perf/smmuv3: Use msi_get_virq() Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 33/36] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling Thomas Gleixner
` (3 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
iommu, dmaengine, Robin Murphy
Let the core code fiddle with the MSI descriptor retrieval.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 19 +++----------------
1 file changed, 3 insertions(+), 16 deletions(-)
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3154,7 +3154,6 @@ static void arm_smmu_write_msi_msg(struc
static void arm_smmu_setup_msis(struct arm_smmu_device *smmu)
{
- struct msi_desc *desc;
int ret, nvec = ARM_SMMU_MAX_MSIS;
struct device *dev = smmu->dev;
@@ -3182,21 +3181,9 @@ static void arm_smmu_setup_msis(struct a
return;
}
- for_each_msi_entry(desc, dev) {
- switch (desc->msi_index) {
- case EVTQ_MSI_INDEX:
- smmu->evtq.q.irq = desc->irq;
- break;
- case GERROR_MSI_INDEX:
- smmu->gerr_irq = desc->irq;
- break;
- case PRIQ_MSI_INDEX:
- smmu->priq.q.irq = desc->irq;
- break;
- default: /* Unknown */
- continue;
- }
- }
+ smmu->evtq.q.irq = msi_get_virq(dev, EVTQ_MSI_INDEX);
+ smmu->gerr_irq = msi_get_virq(dev, GERROR_MSI_INDEX);
+ smmu->priq.q.irq = msi_get_virq(dev, PRIQ_MSI_INDEX);
/* Add callback to free MSIs on teardown */
devm_add_action(dev, arm_smmu_free_msis, dev);
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 33/36] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (31 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 32/36] iommu/arm-smmu-v3: " Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 34/36] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling Thomas Gleixner
` (2 subsequent siblings)
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
No point in retrieving the MSI descriptors. Just query the Linux interrupt
number.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/mailbox/bcm-flexrm-mailbox.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
--- a/drivers/mailbox/bcm-flexrm-mailbox.c
+++ b/drivers/mailbox/bcm-flexrm-mailbox.c
@@ -1497,7 +1497,6 @@ static int flexrm_mbox_probe(struct plat
int index, ret = 0;
void __iomem *regs;
void __iomem *regs_end;
- struct msi_desc *desc;
struct resource *iomem;
struct flexrm_ring *ring;
struct flexrm_mbox *mbox;
@@ -1608,10 +1607,8 @@ static int flexrm_mbox_probe(struct plat
goto fail_destroy_cmpl_pool;
/* Save alloced IRQ numbers for each ring */
- for_each_msi_entry(desc, dev) {
- ring = &mbox->rings[desc->msi_index];
- ring->irq = desc->irq;
- }
+ for (index = 0; index < mbox->num_rings; index++)
+ mbox->rings[index].irq = msi_get_virq(dev, index);
/* Check availability of debugfs */
if (!debugfs_initialized())
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 34/36] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (32 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 33/36] mailbox: bcm-flexrm-mailbox: Rework MSI interrupt handling Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 35/36] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
2021-12-06 22:39 ` [patch V2 36/36] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Storing a pointer to the MSI descriptor just to track the Linux interrupt
number is daft. Just store the interrupt number and be done with it.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
---
drivers/bus/fsl-mc/dprc-driver.c | 8 ++++----
drivers/bus/fsl-mc/fsl-mc-allocator.c | 9 ++-------
drivers/bus/fsl-mc/fsl-mc-msi.c | 6 +++---
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 4 ++--
drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c | 4 +---
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c | 5 ++---
drivers/soc/fsl/dpio/dpio-driver.c | 8 ++++----
drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c | 4 ++--
include/linux/fsl/mc.h | 4 ++--
9 files changed, 22 insertions(+), 30 deletions(-)
--- a/drivers/bus/fsl-mc/dprc-driver.c
+++ b/drivers/bus/fsl-mc/dprc-driver.c
@@ -400,7 +400,7 @@ static irqreturn_t dprc_irq0_handler_thr
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
struct fsl_mc_io *mc_io = mc_dev->mc_io;
- struct msi_desc *msi_desc = mc_dev->irqs[0]->msi_desc;
+ int irq = mc_dev->irqs[0]->virq;
dev_dbg(dev, "DPRC IRQ %d triggered on CPU %u\n",
irq_num, smp_processor_id());
@@ -409,7 +409,7 @@ static irqreturn_t dprc_irq0_handler_thr
return IRQ_HANDLED;
mutex_lock(&mc_bus->scan_mutex);
- if (!msi_desc || msi_desc->irq != (u32)irq_num)
+ if (irq != (u32)irq_num)
goto out;
status = 0;
@@ -521,7 +521,7 @@ static int register_dprc_irq_handler(str
* function that programs the MSI physically in the device
*/
error = devm_request_threaded_irq(&mc_dev->dev,
- irq->msi_desc->irq,
+ irq->virq,
dprc_irq0_handler,
dprc_irq0_handler_thread,
IRQF_NO_SUSPEND | IRQF_ONESHOT,
@@ -771,7 +771,7 @@ static void dprc_teardown_irq(struct fsl
(void)disable_dprc_irq(mc_dev);
- devm_free_irq(&mc_dev->dev, irq->msi_desc->irq, &mc_dev->dev);
+ devm_free_irq(&mc_dev->dev, irq->virq, &mc_dev->dev);
fsl_mc_free_irqs(mc_dev);
}
--- a/drivers/bus/fsl-mc/fsl-mc-allocator.c
+++ b/drivers/bus/fsl-mc/fsl-mc-allocator.c
@@ -350,7 +350,6 @@ int fsl_mc_populate_irq_pool(struct fsl_
unsigned int irq_count)
{
unsigned int i;
- struct msi_desc *msi_desc;
struct fsl_mc_device_irq *irq_resources;
struct fsl_mc_device_irq *mc_dev_irq;
int error;
@@ -388,16 +387,12 @@ int fsl_mc_populate_irq_pool(struct fsl_
mc_dev_irq->resource.type = res_pool->type;
mc_dev_irq->resource.data = mc_dev_irq;
mc_dev_irq->resource.parent_pool = res_pool;
+ mc_dev_irq->virq = msi_get_virq(&mc_bus_dev->dev, i);
+ mc_dev_irq->resource.id = mc_dev_irq->virq;
INIT_LIST_HEAD(&mc_dev_irq->resource.node);
list_add_tail(&mc_dev_irq->resource.node, &res_pool->free_list);
}
- for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
- mc_dev_irq = &irq_resources[msi_desc->msi_index];
- mc_dev_irq->msi_desc = msi_desc;
- mc_dev_irq->resource.id = msi_desc->irq;
- }
-
res_pool->max_count = irq_count;
res_pool->free_count = irq_count;
mc_bus->irq_resources = irq_resources;
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -58,11 +58,11 @@ static void fsl_mc_msi_update_dom_ops(st
}
static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
- struct fsl_mc_device_irq *mc_dev_irq)
+ struct fsl_mc_device_irq *mc_dev_irq,
+ struct msi_desc *msi_desc)
{
int error;
struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev;
- struct msi_desc *msi_desc = mc_dev_irq->msi_desc;
struct dprc_irq_cfg irq_cfg;
/*
@@ -129,7 +129,7 @@ static void fsl_mc_msi_write_msg(struct
/*
* Program the MSI (paddr, value) pair in the device:
*/
- __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq);
+ __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc);
}
static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -4246,7 +4246,7 @@ static int dpaa2_eth_setup_irqs(struct f
}
irq = ls_dev->irqs[0];
- err = devm_request_threaded_irq(&ls_dev->dev, irq->msi_desc->irq,
+ err = devm_request_threaded_irq(&ls_dev->dev, irq->virq,
NULL, dpni_irq0_handler_thread,
IRQF_NO_SUSPEND | IRQF_ONESHOT,
dev_name(&ls_dev->dev), &ls_dev->dev);
@@ -4273,7 +4273,7 @@ static int dpaa2_eth_setup_irqs(struct f
return 0;
free_irq:
- devm_free_irq(&ls_dev->dev, irq->msi_desc->irq, &ls_dev->dev);
+ devm_free_irq(&ls_dev->dev, irq->virq, &ls_dev->dev);
free_mc_irq:
fsl_mc_free_irqs(ls_dev);
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
@@ -129,7 +129,6 @@ static irqreturn_t dpaa2_ptp_irq_handler
static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev)
{
struct device *dev = &mc_dev->dev;
- struct fsl_mc_device_irq *irq;
struct ptp_qoriq *ptp_qoriq;
struct device_node *node;
void __iomem *base;
@@ -177,8 +176,7 @@ static int dpaa2_ptp_probe(struct fsl_mc
goto err_unmap;
}
- irq = mc_dev->irqs[0];
- ptp_qoriq->irq = irq->msi_desc->irq;
+ ptp_qoriq->irq = mc_dev->irqs[0]->virq;
err = request_threaded_irq(ptp_qoriq->irq, NULL,
dpaa2_ptp_irq_handler_thread,
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
@@ -1553,8 +1553,7 @@ static int dpaa2_switch_setup_irqs(struc
irq = sw_dev->irqs[DPSW_IRQ_INDEX_IF];
- err = devm_request_threaded_irq(dev, irq->msi_desc->irq,
- NULL,
+ err = devm_request_threaded_irq(dev, irq->virq, NULL,
dpaa2_switch_irq0_handler_thread,
IRQF_NO_SUSPEND | IRQF_ONESHOT,
dev_name(dev), dev);
@@ -1580,7 +1579,7 @@ static int dpaa2_switch_setup_irqs(struc
return 0;
free_devm_irq:
- devm_free_irq(dev, irq->msi_desc->irq, dev);
+ devm_free_irq(dev, irq->virq, dev);
free_irq:
fsl_mc_free_irqs(sw_dev);
return err;
--- a/drivers/soc/fsl/dpio/dpio-driver.c
+++ b/drivers/soc/fsl/dpio/dpio-driver.c
@@ -88,7 +88,7 @@ static void unregister_dpio_irq_handlers
irq = dpio_dev->irqs[0];
/* clear the affinity hint */
- irq_set_affinity_hint(irq->msi_desc->irq, NULL);
+ irq_set_affinity_hint(irq->virq, NULL);
}
static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
@@ -98,7 +98,7 @@ static int register_dpio_irq_handlers(st
irq = dpio_dev->irqs[0];
error = devm_request_irq(&dpio_dev->dev,
- irq->msi_desc->irq,
+ irq->virq,
dpio_irq_handler,
0,
dev_name(&dpio_dev->dev),
@@ -111,10 +111,10 @@ static int register_dpio_irq_handlers(st
}
/* set the affinity hint */
- if (irq_set_affinity_hint(irq->msi_desc->irq, cpumask_of(cpu)))
+ if (irq_set_affinity_hint(irq->virq, cpumask_of(cpu)))
dev_err(&dpio_dev->dev,
"irq_set_affinity failed irq %d cpu %d\n",
- irq->msi_desc->irq, cpu);
+ irq->virq, cpu);
return 0;
}
--- a/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c
@@ -67,7 +67,7 @@ static int vfio_set_trigger(struct vfio_
int hwirq;
int ret;
- hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
+ hwirq = vdev->mc_dev->irqs[index]->virq;
if (irq->trigger) {
free_irq(hwirq, irq);
kfree(irq->name);
@@ -137,7 +137,7 @@ static int vfio_fsl_mc_set_irq_trigger(s
return vfio_set_trigger(vdev, index, fd);
}
- hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
+ hwirq = vdev->mc_dev->irqs[index]->virq;
irq = &vdev->mc_irqs[index];
--- a/include/linux/fsl/mc.h
+++ b/include/linux/fsl/mc.h
@@ -91,13 +91,13 @@ struct fsl_mc_resource {
/**
* struct fsl_mc_device_irq - MC object device message-based interrupt
- * @msi_desc: pointer to MSI descriptor allocated by fsl_mc_msi_alloc_descs()
+ * @virq: Linux virtual interrupt number
* @mc_dev: MC object device that owns this interrupt
* @dev_irq_index: device-relative IRQ index
* @resource: MC generic resource associated with the interrupt
*/
struct fsl_mc_device_irq {
- struct msi_desc *msi_desc;
+ unsigned int virq;
struct fsl_mc_device *mc_dev;
u8 dev_irq_index;
struct fsl_mc_resource resource;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 35/36] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq()
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (33 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 34/36] bus: fsl-mc: fsl-mc-allocator: Rework MSI handling Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
2021-12-06 22:39 ` [patch V2 36/36] dmaengine: qcom_hidma: Cleanup MSI handling Thomas Gleixner
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, iommu,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
Vinod Koul, dmaengine, Robin Murphy
Just use the core function msi_get_virq().
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/dma/ti/k3-udma-private.c | 6 ++----
drivers/dma/ti/k3-udma.c | 10 ++++------
drivers/soc/ti/k3-ringacc.c | 2 +-
drivers/soc/ti/ti_sci_inta_msi.c | 12 ------------
include/linux/soc/ti/ti_sci_inta_msi.h | 1 -
5 files changed, 7 insertions(+), 24 deletions(-)
--- a/drivers/dma/ti/k3-udma-private.c
+++ b/drivers/dma/ti/k3-udma-private.c
@@ -168,8 +168,7 @@ int xudma_pktdma_tflow_get_irq(struct ud
{
const struct udma_oes_offsets *oes = &ud->soc_data->oes;
- return ti_sci_inta_msi_get_virq(ud->dev, udma_tflow_id +
- oes->pktdma_tchan_flow);
+ return msi_get_virq(ud->dev, udma_tflow_id + oes->pktdma_tchan_flow);
}
EXPORT_SYMBOL(xudma_pktdma_tflow_get_irq);
@@ -177,7 +176,6 @@ int xudma_pktdma_rflow_get_irq(struct ud
{
const struct udma_oes_offsets *oes = &ud->soc_data->oes;
- return ti_sci_inta_msi_get_virq(ud->dev, udma_rflow_id +
- oes->pktdma_rchan_flow);
+ return msi_get_virq(ud->dev, udma_rflow_id + oes->pktdma_rchan_flow);
}
EXPORT_SYMBOL(xudma_pktdma_rflow_get_irq);
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -2313,8 +2313,7 @@ static int udma_alloc_chan_resources(str
/* Event from UDMA (TR events) only needed for slave TR mode channels */
if (is_slave_direction(uc->config.dir) && !uc->config.pkt_mode) {
- uc->irq_num_udma = ti_sci_inta_msi_get_virq(ud->dev,
- irq_udma_idx);
+ uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
if (uc->irq_num_udma <= 0) {
dev_err(ud->dev, "Failed to get udma irq (index: %u)\n",
irq_udma_idx);
@@ -2486,7 +2485,7 @@ static int bcdma_alloc_chan_resources(st
uc->psil_paired = true;
}
- uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx);
+ uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
if (uc->irq_num_ring <= 0) {
dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
irq_ring_idx);
@@ -2503,8 +2502,7 @@ static int bcdma_alloc_chan_resources(st
/* Event from BCDMA (TR events) only needed for slave channels */
if (is_slave_direction(uc->config.dir)) {
- uc->irq_num_udma = ti_sci_inta_msi_get_virq(ud->dev,
- irq_udma_idx);
+ uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
if (uc->irq_num_udma <= 0) {
dev_err(ud->dev, "Failed to get bcdma irq (index: %u)\n",
irq_udma_idx);
@@ -2672,7 +2670,7 @@ static int pktdma_alloc_chan_resources(s
uc->psil_paired = true;
- uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx);
+ uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
if (uc->irq_num_ring <= 0) {
dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
irq_ring_idx);
--- a/drivers/soc/ti/k3-ringacc.c
+++ b/drivers/soc/ti/k3-ringacc.c
@@ -647,7 +647,7 @@ int k3_ringacc_get_ring_irq_num(struct k
if (!ring)
return -EINVAL;
- irq_num = ti_sci_inta_msi_get_virq(ring->parent->dev, ring->ring_id);
+ irq_num = msi_get_virq(ring->parent->dev, ring->ring_id);
if (irq_num <= 0)
irq_num = -EINVAL;
return irq_num;
--- a/drivers/soc/ti/ti_sci_inta_msi.c
+++ b/drivers/soc/ti/ti_sci_inta_msi.c
@@ -148,15 +148,3 @@ void ti_sci_inta_msi_domain_free_irqs(st
ti_sci_inta_msi_free_descs(dev);
}
EXPORT_SYMBOL_GPL(ti_sci_inta_msi_domain_free_irqs);
-
-unsigned int ti_sci_inta_msi_get_virq(struct device *dev, u32 dev_index)
-{
- struct msi_desc *desc;
-
- for_each_msi_entry(desc, dev)
- if (desc->msi_index == dev_index)
- return desc->irq;
-
- return -ENODEV;
-}
-EXPORT_SYMBOL_GPL(ti_sci_inta_msi_get_virq);
--- a/include/linux/soc/ti/ti_sci_inta_msi.h
+++ b/include/linux/soc/ti/ti_sci_inta_msi.h
@@ -18,6 +18,5 @@ struct irq_domain
struct irq_domain *parent);
int ti_sci_inta_msi_domain_alloc_irqs(struct device *dev,
struct ti_sci_resource *res);
-unsigned int ti_sci_inta_msi_get_virq(struct device *dev, u32 index);
void ti_sci_inta_msi_domain_free_irqs(struct device *dev);
#endif /* __INCLUDE_LINUX_IRQCHIP_TI_SCI_INTA_H */
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread* [patch V2 36/36] dmaengine: qcom_hidma: Cleanup MSI handling
2021-12-06 22:38 [patch V2 00/36] genirq/msi, PCI/MSI: Spring cleaning - Part 2 Thomas Gleixner
` (34 preceding siblings ...)
2021-12-06 22:39 ` [patch V2 35/36] soc: ti: ti_sci_inta_msi: Get rid of ti_sci_inta_msi_get_virq() Thomas Gleixner
@ 2021-12-06 22:39 ` Thomas Gleixner
35 siblings, 0 replies; 62+ messages in thread
From: Thomas Gleixner @ 2021-12-06 22:39 UTC (permalink / raw)
To: LKML
Cc: Nishanth Menon, Mark Rutland, Stuart Yoder, linux-pci,
Will Deacon, Ashok Raj, Marc Zygnier, Sinan Kaya, Vinod Koul,
Bjorn Helgaas, Megha Dey, Jason Gunthorpe, xen-devel, Kevin Tian,
Alex Williamson, Cedric Le Goater, Santosh Shilimkar,
linux-arm-kernel, Juergen Gross, Tero Kristo, Greg Kroah-Hartman,
iommu, dmaengine, Robin Murphy
There is no reason to walk the MSI descriptors to retrieve the interrupt
number for a device. Use msi_get_virq() instead.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Sinan Kaya <okaya@kernel.org>
Cc: dmaengine@vger.kernel.org
---
drivers/dma/qcom/hidma.c | 42 ++++++++++++++++++------------------------
1 file changed, 18 insertions(+), 24 deletions(-)
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -678,11 +678,13 @@ static void hidma_free_msis(struct hidma
{
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
struct device *dev = dmadev->ddev.dev;
- struct msi_desc *desc;
+ int i, virq;
- /* free allocated MSI interrupts above */
- for_each_msi_entry(desc, dev)
- devm_free_irq(dev, desc->irq, &dmadev->lldev);
+ for (i = 0; i < HIDMA_MSI_INTS; i++) {
+ virq = msi_get_virq(dev, i);
+ if (virq)
+ devm_free_irq(dev, virq, &dmadev->lldev);
+ }
platform_msi_domain_free_irqs(dev);
#endif
@@ -692,45 +694,37 @@ static int hidma_request_msi(struct hidm
struct platform_device *pdev)
{
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- int rc;
- struct msi_desc *desc;
- struct msi_desc *failed_desc = NULL;
+ int rc, i, virq;
rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
hidma_write_msi_msg);
if (rc)
return rc;
- for_each_msi_entry(desc, &pdev->dev) {
- if (!desc->msi_index)
- dmadev->msi_virqbase = desc->irq;
-
- rc = devm_request_irq(&pdev->dev, desc->irq,
+ for (i = 0; i < HIDMA_MSI_INTS; i++) {
+ virq = msi_get_virq(&pdev->dev, i);
+ rc = devm_request_irq(&pdev->dev, virq,
hidma_chirq_handler_msi,
0, "qcom-hidma-msi",
&dmadev->lldev);
- if (rc) {
- failed_desc = desc;
+ if (rc)
break;
- }
+ if (!i)
+ dmadev->msi_virqbase = virq;
}
if (rc) {
/* free allocated MSI interrupts above */
- for_each_msi_entry(desc, &pdev->dev) {
- if (desc == failed_desc)
- break;
- devm_free_irq(&pdev->dev, desc->irq,
- &dmadev->lldev);
+ for (--i; i >= 0; i--) {
+ virq = msi_get_virq(&pdev->dev, i);
+ devm_free_irq(&pdev->dev, virq, &dmadev->lldev);
}
+ dev_warn(&pdev->dev,
+ "failed to request MSI irq, falling back to wired IRQ\n");
} else {
/* Add callback to free MSIs on teardown */
hidma_ll_setup_irq(dmadev->lldev, true);
-
}
- if (rc)
- dev_warn(&pdev->dev,
- "failed to request MSI irq, falling back to wired IRQ\n");
return rc;
#else
return -EINVAL;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 62+ messages in thread