* [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure
@ 2026-02-24 10:09 Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 1/6] fsl-mc: Remove MSI domain propagation to sub-devices Marc Zyngier
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
This is the second drop of this cleanup series for the fsl-mc MSI
infrastructure, initially posted at [1].
* From v1 [1]:
- Drop the now unused DOMAIN_BUS_FSL_MC_MSI bus token
- Tidy-up fsl_mc_write_msi_msg() while removing the legacy helper
- Fix include ordering in irq-gic-its-msi-parent.c
- Various commit message cleanups
- Collected tags from Ioana and Sascha, with thanks
- Rebased on top of v7.0.rc1
[1] https://lore.kernel.org/r/20260218135203.2267907-1-maz@kernel.org
Marc Zyngier (6):
fsl-mc: Remove MSI domain propagation to sub-devices
fsl-mc: Add minimal infrastructure to use platform MSI
irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent
handling
fsl-mc: Switch over to per-device platform MSI
fsl-mc: Remove legacy MSI implementation
platform-msi: Remove stale comment
drivers/base/platform-msi.c | 4 -
drivers/bus/fsl-mc/dprc-driver.c | 14 +-
drivers/bus/fsl-mc/fsl-mc-bus.c | 4 +-
drivers/bus/fsl-mc/fsl-mc-msi.c | 166 +++----------------
drivers/bus/fsl-mc/fsl-mc-private.h | 2 +-
drivers/irqchip/Kconfig | 6 -
drivers/irqchip/Makefile | 1 -
drivers/irqchip/irq-gic-its-msi-parent.c | 7 +-
drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c | 168 --------------------
include/linux/fsl/mc.h | 6 +-
include/linux/irqdomain_defs.h | 1 -
11 files changed, 39 insertions(+), 340 deletions(-)
delete mode 100644 drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
--
2.47.3
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/6] fsl-mc: Remove MSI domain propagation to sub-devices
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 2/6] fsl-mc: Add minimal infrastructure to use platform MSI Marc Zyngier
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
Only the root device generates MSIs (it is the only one talking to
the ITS), so propagating the domain is pretty pointless. Remove it.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/bus/fsl-mc/fsl-mc-bus.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c
index c117745cf2065..1a6c8e3c0b27f 100644
--- a/drivers/bus/fsl-mc/fsl-mc-bus.c
+++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
@@ -854,14 +854,12 @@ int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc,
} else {
/*
* A non-DPRC object has to be a child of a DPRC, use the
- * parent's ICID and interrupt domain.
+ * parent's ICID.
*/
mc_dev->icid = parent_mc_dev->icid;
mc_dev->dma_mask = FSL_MC_DEFAULT_DMA_MASK;
mc_dev->dev.dma_mask = &mc_dev->dma_mask;
mc_dev->dev.coherent_dma_mask = mc_dev->dma_mask;
- dev_set_msi_domain(&mc_dev->dev,
- dev_get_msi_domain(&parent_mc_dev->dev));
}
/*
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/6] fsl-mc: Add minimal infrastructure to use platform MSI
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 1/6] fsl-mc: Remove MSI domain propagation to sub-devices Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 3/6] irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent handling Marc Zyngier
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
Add the tiny bit of infrastructure required to use platform MSI
instead of the current hack. This means providing a write_msi_msg
callback, as well as irq domain and devid retrieval helpers.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/bus/fsl-mc/fsl-mc-msi.c | 50 ++++++++++++++++++++++++-----
drivers/bus/fsl-mc/fsl-mc-private.h | 1 +
include/linux/fsl/mc.h | 2 ++
3 files changed, 45 insertions(+), 8 deletions(-)
diff --git a/drivers/bus/fsl-mc/fsl-mc-msi.c b/drivers/bus/fsl-mc/fsl-mc-msi.c
index 82cd69f7884c6..c9f50969e88ce 100644
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -110,13 +110,8 @@ static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
}
}
-/*
- * NOTE: This function is invoked with interrupts disabled
- */
-static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
- struct msi_msg *msg)
+static void fsl_mc_write_msi_msg(struct msi_desc *msi_desc, struct msi_msg *msg)
{
- struct msi_desc *msi_desc = irq_data_get_msi_desc(irq_data);
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 =
@@ -130,6 +125,17 @@ static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
__fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc);
}
+/*
+ * NOTE: This function is invoked with interrupts disabled
+ */
+static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
+ struct msi_msg *msg)
+{
+ struct msi_desc *msi_desc = irq_data_get_msi_desc(irq_data);
+
+ fsl_mc_write_msi_msg(msi_desc, msg);
+}
+
static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
{
struct irq_chip *chip = info->chip;
@@ -209,6 +215,20 @@ struct irq_domain *fsl_mc_find_msi_domain(struct device *dev)
return msi_domain;
}
+struct irq_domain *fsl_mc_get_msi_parent(struct device *dev)
+{
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
+ struct device *root_dprc_dev;
+ struct device *bus_dev;
+
+ fsl_mc_get_root_dprc(dev, &root_dprc_dev);
+ bus_dev = root_dprc_dev->parent;
+
+ return (bus_dev->of_node ?
+ of_msi_get_domain(bus_dev, bus_dev->of_node, DOMAIN_BUS_NEXUS) :
+ iort_get_device_domain(bus_dev, mc_dev->icid, DOMAIN_BUS_NEXUS));
+}
+
int fsl_mc_msi_domain_alloc_irqs(struct device *dev, unsigned int irq_count)
{
int error = msi_setup_device_data(dev);
@@ -220,8 +240,10 @@ int fsl_mc_msi_domain_alloc_irqs(struct device *dev, unsigned int irq_count)
* NOTE: Calling this function will trigger the invocation of the
* its_fsl_mc_msi_prepare() callback
*/
- error = msi_domain_alloc_irqs_range(dev, MSI_DEFAULT_DOMAIN, 0, irq_count - 1);
-
+ if (!irq_domain_is_msi_parent(dev_get_msi_domain(dev)))
+ error = msi_domain_alloc_irqs_range(dev, MSI_DEFAULT_DOMAIN, 0, irq_count - 1);
+ else
+ error = platform_device_msi_init_and_alloc_irqs(dev, irq_count, fsl_mc_write_msi_msg);
if (error)
dev_err(dev, "Failed to allocate IRQs\n");
return error;
@@ -231,3 +253,15 @@ void fsl_mc_msi_domain_free_irqs(struct device *dev)
{
msi_domain_free_irqs_all(dev, MSI_DEFAULT_DOMAIN);
}
+
+u32 fsl_mc_get_msi_id(struct device *dev)
+{
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
+ struct device *root_dprc_dev;
+
+ fsl_mc_get_root_dprc(dev, &root_dprc_dev);
+
+ return (root_dprc_dev->parent->of_node ?
+ of_msi_xlate(dev, NULL, mc_dev->icid) :
+ iort_msi_map_id(dev, mc_dev->icid));
+}
diff --git a/drivers/bus/fsl-mc/fsl-mc-private.h b/drivers/bus/fsl-mc/fsl-mc-private.h
index beed4c53533d8..44868f874fd66 100644
--- a/drivers/bus/fsl-mc/fsl-mc-private.h
+++ b/drivers/bus/fsl-mc/fsl-mc-private.h
@@ -642,6 +642,7 @@ int fsl_mc_msi_domain_alloc_irqs(struct device *dev,
void fsl_mc_msi_domain_free_irqs(struct device *dev);
struct irq_domain *fsl_mc_find_msi_domain(struct device *dev);
+struct irq_domain *fsl_mc_get_msi_parent(struct device *dev);
int __must_check fsl_create_mc_io(struct device *dev,
phys_addr_t mc_portal_phys_addr,
diff --git a/include/linux/fsl/mc.h b/include/linux/fsl/mc.h
index 897d6211c1635..bcc38c0fc230a 100644
--- a/include/linux/fsl/mc.h
+++ b/include/linux/fsl/mc.h
@@ -361,9 +361,11 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct fsl_mc_command *cmd);
#ifdef CONFIG_FSL_MC_BUS
#define dev_is_fsl_mc(_dev) ((_dev)->bus == &fsl_mc_bus_type)
+u32 fsl_mc_get_msi_id(struct device *dev);
#else
/* If fsl-mc bus is not present device cannot belong to fsl-mc bus */
#define dev_is_fsl_mc(_dev) (0)
+#define fsl_mc_get_msi_id(_dev) (0)
#endif
/* Macro to check if a device is a container device */
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/6] irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent handling
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 1/6] fsl-mc: Remove MSI domain propagation to sub-devices Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 2/6] fsl-mc: Add minimal infrastructure to use platform MSI Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 4/6] fsl-mc: Switch over to per-device platform MSI Marc Zyngier
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
Make the ITS code aware of fsl_mc devices by plumbing the devid
retrieval primitive.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/irqchip/irq-gic-its-msi-parent.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/irqchip/irq-gic-its-msi-parent.c b/drivers/irqchip/irq-gic-its-msi-parent.c
index a832cdb2e6978..d36b278ae66c5 100644
--- a/drivers/irqchip/irq-gic-its-msi-parent.c
+++ b/drivers/irqchip/irq-gic-its-msi-parent.c
@@ -5,6 +5,7 @@
// Copyright (C) 2022 Intel
#include <linux/acpi_iort.h>
+#include <linux/fsl/mc.h>
#include <linux/of_address.h>
#include <linux/pci.h>
@@ -187,9 +188,11 @@ static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev,
{
struct msi_domain_info *msi_info;
u32 dev_id;
- int ret;
+ int ret = 0;
- if (dev->of_node)
+ if (dev_is_fsl_mc(dev))
+ dev_id = fsl_mc_get_msi_id(dev);
+ else if (dev->of_node)
ret = of_pmsi_get_msi_info(domain->parent, dev, &dev_id, NULL);
else
ret = iort_pmsi_get_msi_info(dev, &dev_id, NULL);
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/6] fsl-mc: Switch over to per-device platform MSI
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
` (2 preceding siblings ...)
2026-02-24 10:09 ` [PATCH v2 3/6] irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent handling Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 5/6] fsl-mc: Remove legacy MSI implementation Marc Zyngier
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
Obtain the msi-parent irqdomain instead of the fsl_mc domain,
which magically engages the per-device infrastructure.
Additionally, simplify the overly complicated error handling.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/bus/fsl-mc/dprc-driver.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/bus/fsl-mc/dprc-driver.c b/drivers/bus/fsl-mc/dprc-driver.c
index db67442addad2..a85706826fa06 100644
--- a/drivers/bus/fsl-mc/dprc-driver.c
+++ b/drivers/bus/fsl-mc/dprc-driver.c
@@ -609,9 +609,8 @@ int dprc_setup(struct fsl_mc_device *mc_dev)
{
struct device *parent_dev = mc_dev->dev.parent;
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
- struct irq_domain *mc_msi_domain;
+ struct irq_domain *mc_msi_domain = NULL;
bool mc_io_created = false;
- bool msi_domain_set = false;
bool uapi_created = false;
u16 major_ver, minor_ver;
size_t region_size;
@@ -652,14 +651,12 @@ int dprc_setup(struct fsl_mc_device *mc_dev)
uapi_created = true;
}
- mc_msi_domain = fsl_mc_find_msi_domain(&mc_dev->dev);
- if (!mc_msi_domain) {
+ mc_msi_domain = fsl_mc_get_msi_parent(&mc_dev->dev);
+ if (!mc_msi_domain)
dev_warn(&mc_dev->dev,
"WARNING: MC bus without interrupt support\n");
- } else {
+ else
dev_set_msi_domain(&mc_dev->dev, mc_msi_domain);
- msi_domain_set = true;
- }
error = dprc_open(mc_dev->mc_io, 0, mc_dev->obj_desc.id,
&mc_dev->mc_handle);
@@ -699,8 +696,7 @@ int dprc_setup(struct fsl_mc_device *mc_dev)
(void)dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
error_cleanup_msi_domain:
- if (msi_domain_set)
- dev_set_msi_domain(&mc_dev->dev, NULL);
+ dev_set_msi_domain(&mc_dev->dev, NULL);
if (mc_io_created) {
fsl_destroy_mc_io(mc_dev->mc_io);
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 5/6] fsl-mc: Remove legacy MSI implementation
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
` (3 preceding siblings ...)
2026-02-24 10:09 ` [PATCH v2 4/6] fsl-mc: Switch over to per-device platform MSI Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 6/6] platform-msi: Remove stale comment Marc Zyngier
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
Get rid of most of the fsl_mc MSI infrastructure, which is now replaced
by common code.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/bus/fsl-mc/fsl-mc-msi.c | 166 +------------------
drivers/bus/fsl-mc/fsl-mc-private.h | 1 -
drivers/irqchip/Kconfig | 6 -
drivers/irqchip/Makefile | 1 -
drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c | 168 --------------------
include/linux/fsl/mc.h | 4 -
include/linux/irqdomain_defs.h | 1 -
7 files changed, 8 insertions(+), 339 deletions(-)
delete mode 100644 drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
diff --git a/drivers/bus/fsl-mc/fsl-mc-msi.c b/drivers/bus/fsl-mc/fsl-mc-msi.c
index c9f50969e88ce..be38b43803dea 100644
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -15,53 +15,16 @@
#include "fsl-mc-private.h"
-#ifdef GENERIC_MSI_DOMAIN_OPS
-/*
- * Generate a unique ID identifying the interrupt (only used within the MSI
- * irqdomain. Combine the icid with the interrupt index.
- */
-static irq_hw_number_t fsl_mc_domain_calc_hwirq(struct fsl_mc_device *dev,
- struct msi_desc *desc)
-{
- /*
- * 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->msi_index + (dev->icid * 10000));
-}
-
-static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg,
- struct msi_desc *desc)
-{
- arg->desc = desc;
- arg->hwirq = fsl_mc_domain_calc_hwirq(to_fsl_mc_device(desc->dev),
- desc);
-}
-#else
-#define fsl_mc_msi_set_desc NULL
-#endif
-
-static void fsl_mc_msi_update_dom_ops(struct msi_domain_info *info)
-{
- struct msi_domain_ops *ops = info->ops;
-
- if (!ops)
- return;
-
- /*
- * set_desc should not be set by the caller
- */
- if (!ops->set_desc)
- ops->set_desc = fsl_mc_msi_set_desc;
-}
-
-static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
- struct fsl_mc_device_irq *mc_dev_irq,
- struct msi_desc *msi_desc)
+static void fsl_mc_write_msi_msg(struct msi_desc *msi_desc, struct msi_msg *msg)
{
- int error;
+ 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->msi_index];
struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev;
struct dprc_irq_cfg irq_cfg;
+ int error;
+
+ msi_desc->msg = *msg;
/*
* msi_desc->msg.address is 0x0 when this function is invoked in
@@ -110,111 +73,6 @@ static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
}
}
-static void fsl_mc_write_msi_msg(struct msi_desc *msi_desc, struct msi_msg *msg)
-{
- 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->msi_index];
-
- msi_desc->msg = *msg;
-
- /*
- * Program the MSI (paddr, value) pair in the device:
- */
- __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc);
-}
-
-/*
- * NOTE: This function is invoked with interrupts disabled
- */
-static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
- struct msi_msg *msg)
-{
- struct msi_desc *msi_desc = irq_data_get_msi_desc(irq_data);
-
- fsl_mc_write_msi_msg(msi_desc, msg);
-}
-
-static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
-{
- struct irq_chip *chip = info->chip;
-
- if (!chip)
- return;
-
- /*
- * irq_write_msi_msg should not be set by the caller
- */
- if (!chip->irq_write_msi_msg)
- chip->irq_write_msi_msg = fsl_mc_msi_write_msg;
-}
-
-/**
- * fsl_mc_msi_create_irq_domain - Create a fsl-mc MSI interrupt domain
- * @fwnode: Optional firmware node of the interrupt controller
- * @info: MSI domain info
- * @parent: Parent irq domain
- *
- * Updates the domain and chip ops and creates a fsl-mc MSI
- * interrupt domain.
- *
- * Returns:
- * A domain pointer or NULL in case of failure.
- */
-struct irq_domain *fsl_mc_msi_create_irq_domain(struct fwnode_handle *fwnode,
- struct msi_domain_info *info,
- struct irq_domain *parent)
-{
- struct irq_domain *domain;
-
- if (WARN_ON((info->flags & MSI_FLAG_LEVEL_CAPABLE)))
- info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
- if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS)
- fsl_mc_msi_update_dom_ops(info);
- if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
- fsl_mc_msi_update_chip_ops(info);
- info->flags |= MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS | MSI_FLAG_FREE_MSI_DESCS;
-
- domain = msi_create_irq_domain(fwnode, info, parent);
- if (domain)
- irq_domain_update_bus_token(domain, DOMAIN_BUS_FSL_MC_MSI);
-
- return domain;
-}
-
-struct irq_domain *fsl_mc_find_msi_domain(struct device *dev)
-{
- struct device *root_dprc_dev;
- struct device *bus_dev;
- struct irq_domain *msi_domain;
- struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
-
- fsl_mc_get_root_dprc(dev, &root_dprc_dev);
- bus_dev = root_dprc_dev->parent;
-
- if (bus_dev->of_node) {
- msi_domain = of_msi_map_get_device_domain(dev,
- mc_dev->icid,
- DOMAIN_BUS_FSL_MC_MSI);
-
- /*
- * if the msi-map property is missing assume that all the
- * child containers inherit the domain from the parent
- */
- if (!msi_domain)
-
- msi_domain = of_msi_get_domain(bus_dev,
- bus_dev->of_node,
- DOMAIN_BUS_FSL_MC_MSI);
- } else {
- msi_domain = iort_get_device_domain(dev, mc_dev->icid,
- DOMAIN_BUS_FSL_MC_MSI);
- }
-
- return msi_domain;
-}
-
struct irq_domain *fsl_mc_get_msi_parent(struct device *dev)
{
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
@@ -232,18 +90,10 @@ struct irq_domain *fsl_mc_get_msi_parent(struct device *dev)
int fsl_mc_msi_domain_alloc_irqs(struct device *dev, unsigned int irq_count)
{
int error = msi_setup_device_data(dev);
-
if (error)
return error;
- /*
- * NOTE: Calling this function will trigger the invocation of the
- * its_fsl_mc_msi_prepare() callback
- */
- if (!irq_domain_is_msi_parent(dev_get_msi_domain(dev)))
- error = msi_domain_alloc_irqs_range(dev, MSI_DEFAULT_DOMAIN, 0, irq_count - 1);
- else
- error = platform_device_msi_init_and_alloc_irqs(dev, irq_count, fsl_mc_write_msi_msg);
+ error = platform_device_msi_init_and_alloc_irqs(dev, irq_count, fsl_mc_write_msi_msg);
if (error)
dev_err(dev, "Failed to allocate IRQs\n");
return error;
diff --git a/drivers/bus/fsl-mc/fsl-mc-private.h b/drivers/bus/fsl-mc/fsl-mc-private.h
index 44868f874fd66..197edcc8cde46 100644
--- a/drivers/bus/fsl-mc/fsl-mc-private.h
+++ b/drivers/bus/fsl-mc/fsl-mc-private.h
@@ -641,7 +641,6 @@ int fsl_mc_msi_domain_alloc_irqs(struct device *dev,
void fsl_mc_msi_domain_free_irqs(struct device *dev);
-struct irq_domain *fsl_mc_find_msi_domain(struct device *dev);
struct irq_domain *fsl_mc_get_msi_parent(struct device *dev);
int __must_check fsl_create_mc_io(struct device *dev,
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index f07b00d7fef90..3e5b2040cb4ef 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -51,12 +51,6 @@ config ARM_GIC_V3_ITS
default ARM_GIC_V3
select IRQ_MSI_IOMMU
-config ARM_GIC_V3_ITS_FSL_MC
- bool
- depends on ARM_GIC_V3_ITS
- depends on FSL_MC_BUS
- default ARM_GIC_V3_ITS
-
config ARM_GIC_V5
bool
select IRQ_DOMAIN_HIERARCHY
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index 26aa3b6ec99fd..d5a28cee0d8eb 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -35,7 +35,6 @@ obj-$(CONFIG_ARM_GIC_V2M) += irq-gic-v2m.o
obj-$(CONFIG_ARM_GIC_V3) += irq-gic-v3.o irq-gic-v3-mbi.o irq-gic-common.o
obj-$(CONFIG_ARM_GIC_ITS_PARENT) += irq-gic-its-msi-parent.o
obj-$(CONFIG_ARM_GIC_V3_ITS) += irq-gic-v3-its.o irq-gic-v4.o
-obj-$(CONFIG_ARM_GIC_V3_ITS_FSL_MC) += irq-gic-v3-its-fsl-mc-msi.o
obj-$(CONFIG_ARM_GIC_V5) += irq-gic-v5.o irq-gic-v5-irs.o irq-gic-v5-its.o \
irq-gic-v5-iwb.o
obj-$(CONFIG_HISILICON_IRQ_MBIGEN) += irq-mbigen.o
diff --git a/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c b/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
deleted file mode 100644
index b5785472765a3..0000000000000
--- a/drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c
+++ /dev/null
@@ -1,168 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Freescale Management Complex (MC) bus driver MSI support
- *
- * Copyright (C) 2015-2016 Freescale Semiconductor, Inc.
- * Author: German Rivera <German.Rivera@freescale.com>
- *
- */
-
-#include <linux/acpi.h>
-#include <linux/acpi_iort.h>
-#include <linux/irq.h>
-#include <linux/msi.h>
-#include <linux/of.h>
-#include <linux/of_irq.h>
-#include <linux/fsl/mc.h>
-
-static struct irq_chip its_msi_irq_chip = {
- .name = "ITS-fMSI",
- .irq_mask = irq_chip_mask_parent,
- .irq_unmask = irq_chip_unmask_parent,
- .irq_eoi = irq_chip_eoi_parent,
- .irq_set_affinity = msi_domain_set_affinity
-};
-
-static u32 fsl_mc_msi_domain_get_msi_id(struct irq_domain *domain,
- struct fsl_mc_device *mc_dev)
-{
- struct device_node *of_node;
- u32 out_id;
-
- of_node = irq_domain_get_of_node(domain);
- out_id = of_node ? of_msi_xlate(&mc_dev->dev, &of_node, mc_dev->icid) :
- iort_msi_map_id(&mc_dev->dev, mc_dev->icid);
-
- return out_id;
-}
-
-static int its_fsl_mc_msi_prepare(struct irq_domain *msi_domain,
- struct device *dev,
- int nvec, msi_alloc_info_t *info)
-{
- struct fsl_mc_device *mc_bus_dev;
- struct msi_domain_info *msi_info;
-
- if (!dev_is_fsl_mc(dev))
- return -EINVAL;
-
- mc_bus_dev = to_fsl_mc_device(dev);
- if (!(mc_bus_dev->flags & FSL_MC_IS_DPRC))
- return -EINVAL;
-
- /*
- * Set the device Id to be passed to the GIC-ITS:
- *
- * NOTE: This device id corresponds to the IOMMU stream ID
- * associated with the DPRC object (ICID).
- */
- info->scratchpad[0].ul = fsl_mc_msi_domain_get_msi_id(msi_domain,
- mc_bus_dev);
- msi_info = msi_get_domain_info(msi_domain->parent);
-
- /* Allocate at least 32 MSIs, and always as a power of 2 */
- nvec = max_t(int, 32, roundup_pow_of_two(nvec));
- return msi_info->ops->msi_prepare(msi_domain->parent, dev, nvec, info);
-}
-
-static struct msi_domain_ops its_fsl_mc_msi_ops __ro_after_init = {
- .msi_prepare = its_fsl_mc_msi_prepare,
-};
-
-static struct msi_domain_info its_fsl_mc_msi_domain_info = {
- .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS),
- .ops = &its_fsl_mc_msi_ops,
- .chip = &its_msi_irq_chip,
-};
-
-static const struct of_device_id its_device_id[] = {
- { .compatible = "arm,gic-v3-its", },
- {},
-};
-
-static void __init its_fsl_mc_msi_init_one(struct fwnode_handle *handle,
- const char *name)
-{
- struct irq_domain *parent;
- struct irq_domain *mc_msi_domain;
-
- parent = irq_find_matching_fwnode(handle, DOMAIN_BUS_NEXUS);
- if (!parent || !msi_get_domain_info(parent)) {
- pr_err("%s: unable to locate ITS domain\n", name);
- return;
- }
-
- mc_msi_domain = fsl_mc_msi_create_irq_domain(handle,
- &its_fsl_mc_msi_domain_info,
- parent);
- if (!mc_msi_domain) {
- pr_err("%s: unable to create fsl-mc domain\n", name);
- return;
- }
-
- pr_info("fsl-mc MSI: %s domain created\n", name);
-}
-
-#ifdef CONFIG_ACPI
-static int __init
-its_fsl_mc_msi_parse_madt(union acpi_subtable_headers *header,
- const unsigned long end)
-{
- struct acpi_madt_generic_translator *its_entry;
- struct fwnode_handle *dom_handle;
- const char *node_name;
- int err = 0;
-
- its_entry = (struct acpi_madt_generic_translator *)header;
- node_name = kasprintf(GFP_KERNEL, "ITS@0x%lx",
- (long)its_entry->base_address);
-
- dom_handle = iort_find_domain_token(its_entry->translation_id);
- if (!dom_handle) {
- pr_err("%s: Unable to locate ITS domain handle\n", node_name);
- err = -ENXIO;
- goto out;
- }
-
- its_fsl_mc_msi_init_one(dom_handle, node_name);
-
-out:
- kfree(node_name);
- return err;
-}
-
-
-static void __init its_fsl_mc_acpi_msi_init(void)
-{
- acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_TRANSLATOR,
- its_fsl_mc_msi_parse_madt, 0);
-}
-#else
-static inline void its_fsl_mc_acpi_msi_init(void) { }
-#endif
-
-static void __init its_fsl_mc_of_msi_init(void)
-{
- struct device_node *np;
-
- for (np = of_find_matching_node(NULL, its_device_id); np;
- np = of_find_matching_node(np, its_device_id)) {
- if (!of_device_is_available(np))
- continue;
- if (!of_property_read_bool(np, "msi-controller"))
- continue;
-
- its_fsl_mc_msi_init_one(of_fwnode_handle(np),
- np->full_name);
- }
-}
-
-static int __init its_fsl_mc_msi_init(void)
-{
- its_fsl_mc_of_msi_init();
- its_fsl_mc_acpi_msi_init();
-
- return 0;
-}
-
-early_initcall(its_fsl_mc_msi_init);
diff --git a/include/linux/fsl/mc.h b/include/linux/fsl/mc.h
index bcc38c0fc230a..e9522233f9b57 100644
--- a/include/linux/fsl/mc.h
+++ b/include/linux/fsl/mc.h
@@ -425,10 +425,6 @@ int __must_check fsl_mc_object_allocate(struct fsl_mc_device *mc_dev,
void fsl_mc_object_free(struct fsl_mc_device *mc_adev);
-struct irq_domain *fsl_mc_msi_create_irq_domain(struct fwnode_handle *fwnode,
- struct msi_domain_info *info,
- struct irq_domain *parent);
-
int __must_check fsl_mc_allocate_irqs(struct fsl_mc_device *mc_dev);
void fsl_mc_free_irqs(struct fsl_mc_device *mc_dev);
diff --git a/include/linux/irqdomain_defs.h b/include/linux/irqdomain_defs.h
index 36653e2ee1c92..3a03bdfeeee93 100644
--- a/include/linux/irqdomain_defs.h
+++ b/include/linux/irqdomain_defs.h
@@ -17,7 +17,6 @@ enum irq_domain_bus_token {
DOMAIN_BUS_PLATFORM_MSI,
DOMAIN_BUS_NEXUS,
DOMAIN_BUS_IPI,
- DOMAIN_BUS_FSL_MC_MSI,
DOMAIN_BUS_TI_SCI_INTA_MSI,
DOMAIN_BUS_WAKEUP,
DOMAIN_BUS_VMD_MSI,
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 6/6] platform-msi: Remove stale comment
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
` (4 preceding siblings ...)
2026-02-24 10:09 ` [PATCH v2 5/6] fsl-mc: Remove legacy MSI implementation Marc Zyngier
@ 2026-02-24 10:09 ` Marc Zyngier
2026-02-24 16:15 ` [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Thomas Gleixner
2026-02-26 9:50 ` Christophe Leroy (CS GROUP)
7 siblings, 0 replies; 9+ messages in thread
From: Marc Zyngier @ 2026-02-24 10:09 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
The backward compatibility code for the previous incarnation of
platform MSI was removed in e9894248994ca ("genirq/msi: Remove
platform MSI leftovers"), but the comment about that removal is
still present. Remove it.
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB, LS2088ARDB
Tested-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/base/platform-msi.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/base/platform-msi.c b/drivers/base/platform-msi.c
index 70db08f3ac6fa..69eed058eb208 100644
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -61,10 +61,6 @@ static const struct msi_domain_template platform_msi_template = {
* parent. The parent domain sets up the new domain. The domain has
* a fixed size of @nvec. The domain is managed by devres and will
* be removed when the device is removed.
- *
- * Note: For migration purposes this falls back to the original platform_msi code
- * up to the point where all platforms have been converted to the MSI
- * parent model.
*/
int platform_device_msi_init_and_alloc_irqs(struct device *dev, unsigned int nvec,
irq_write_msi_msg_t write_msi_msg)
--
2.47.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
` (5 preceding siblings ...)
2026-02-24 10:09 ` [PATCH v2 6/6] platform-msi: Remove stale comment Marc Zyngier
@ 2026-02-24 16:15 ` Thomas Gleixner
2026-02-26 9:50 ` Christophe Leroy (CS GROUP)
7 siblings, 0 replies; 9+ messages in thread
From: Thomas Gleixner @ 2026-02-24 16:15 UTC (permalink / raw)
To: Marc Zyngier, Ioana Ciornei, Christophe Leroy (CS GROUP)
Cc: Sascha Bischoff, linux-kernel, linux-arm-kernel, linuxppc-dev
On Tue, Feb 24 2026 at 10:09, Marc Zyngier wrote:
> This is the second drop of this cleanup series for the fsl-mc MSI
> infrastructure, initially posted at [1].
>
> * From v1 [1]:
>
> - Drop the now unused DOMAIN_BUS_FSL_MC_MSI bus token
>
> - Tidy-up fsl_mc_write_msi_msg() while removing the legacy helper
>
> - Fix include ordering in irq-gic-its-msi-parent.c
>
> - Various commit message cleanups
>
> - Collected tags from Ioana and Sascha, with thanks
>
> - Rebased on top of v7.0.rc1
>
> [1] https://lore.kernel.org/r/20260218135203.2267907-1-maz@kernel.org
Acked-by: Thomas Gleixner <tglx@kernel.org>
in case this goes through the FSL SoC tree. If not, please let me know
and I pick it up.
Thanks,
tglx
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
` (6 preceding siblings ...)
2026-02-24 16:15 ` [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Thomas Gleixner
@ 2026-02-26 9:50 ` Christophe Leroy (CS GROUP)
7 siblings, 0 replies; 9+ messages in thread
From: Christophe Leroy (CS GROUP) @ 2026-02-26 9:50 UTC (permalink / raw)
To: Ioana Ciornei, Thomas Gleixner, Marc Zyngier
Cc: Christophe Leroy, Sascha Bischoff, linux-kernel, linux-arm-kernel,
linuxppc-dev
On Tue, 24 Feb 2026 10:09:30 +0000, Marc Zyngier wrote:
> This is the second drop of this cleanup series for the fsl-mc MSI
> infrastructure, initially posted at [1].
>
> * From v1 [1]:
>
> - Drop the now unused DOMAIN_BUS_FSL_MC_MSI bus token
>
> [...]
Applied, thanks!
[1/6] fsl-mc: Remove MSI domain propagation to sub-devices
commit: 1fb7392ee3408494d4d62c09a8c3e5f5934caba7
[2/6] fsl-mc: Add minimal infrastructure to use platform MSI
commit: 0c9f522f2d41c7e055a602a0d2c41dc7af01010b
[3/6] irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent handling
commit: cf3179b4e53f527aba9f0c6c3b921619c8adf761
[4/6] fsl-mc: Switch over to per-device platform MSI
commit: 4a958e47c246fa3fb8954f4303e0da15ab3d026d
[5/6] fsl-mc: Remove legacy MSI implementation
commit: 14b1cbcc6cec0b02298f4adf717646cd943b7ef6
[6/6] platform-msi: Remove stale comment
commit: f0a2eac6a597268034fd40d92c1469182438b53d
Best regards,
--
Christophe Leroy (CS GROUP) <chleroy@kernel.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-02-26 9:53 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-24 10:09 [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 1/6] fsl-mc: Remove MSI domain propagation to sub-devices Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 2/6] fsl-mc: Add minimal infrastructure to use platform MSI Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 3/6] irqchip/gic-v3-its: Add fsl_mc device plumbing to the msi-parent handling Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 4/6] fsl-mc: Switch over to per-device platform MSI Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 5/6] fsl-mc: Remove legacy MSI implementation Marc Zyngier
2026-02-24 10:09 ` [PATCH v2 6/6] platform-msi: Remove stale comment Marc Zyngier
2026-02-24 16:15 ` [PATCH v2 0/6] fsl-mc: Move over to device MSI infrastructure Thomas Gleixner
2026-02-26 9:50 ` Christophe Leroy (CS GROUP)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox