Add helper function pci_epf_msi_domain_get_msi_rid() to convert EP device id to msi domain's request ID to pave the road to support RC-to-EP doorbell with platform MSI controller. Signed-off-by: Frank Li <Frank.Li@xxxxxxx> --- change from v12 to v13 - new patch --- drivers/pci/endpoint/Makefile | 2 +- drivers/pci/endpoint/pci-ep-msi.c | 36 ++++++++++++++++++++++++++++++++++++ include/linux/pci-ep-msi.h | 21 +++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/drivers/pci/endpoint/Makefile b/drivers/pci/endpoint/Makefile index 95b2fe47e3b06..a1ccce440c2c5 100644 --- a/drivers/pci/endpoint/Makefile +++ b/drivers/pci/endpoint/Makefile @@ -5,4 +5,4 @@ obj-$(CONFIG_PCI_ENDPOINT_CONFIGFS) += pci-ep-cfs.o obj-$(CONFIG_PCI_ENDPOINT) += pci-epc-core.o pci-epf-core.o\ - pci-epc-mem.o functions/ + pci-epc-mem.o pci-ep-msi.o functions/ diff --git a/drivers/pci/endpoint/pci-ep-msi.c b/drivers/pci/endpoint/pci-ep-msi.c new file mode 100644 index 0000000000000..7aedc1cafbd14 --- /dev/null +++ b/drivers/pci/endpoint/pci-ep-msi.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * PCI Endpoint *Controller* (EPC) MSI library + * + * Copyright (C) 2024 NXP + * Author: Frank Li <Frank.Li@xxxxxxx> + */ + +#include <linux/device.h> +#include <linux/module.h> +#include <linux/msi.h> +#include <linux/of_irq.h> +#include <linux/pci-epc.h> +#include <linux/pci-epf.h> +#include <linux/pci-ep-cfs.h> +#include <linux/pci-ep-msi.h> +#include <linux/slab.h> + +int pci_epf_msi_domain_get_msi_rid(struct device *dev, u32 *rid) +{ + struct pci_epf *epf = to_pci_epf(dev); + struct pci_epc *epc = epf->epc; + + if (!rid) + return -EINVAL; + + /* + * PCI Endpoint device ID can't full reuse PCI's BDF, BUS number is + * Root Complex Bus number, which is no means for EP side. Move func_no + * as low 3 bits to partially match PCI's BDF. + */ + *rid = of_msi_map_id(epc->dev.parent, NULL, (epf->func_no & 0x7) | (epf->vfunc_no << 3)); + + return 0; +} +EXPORT_SYMBOL_GPL(pci_epf_msi_domain_get_msi_rid); diff --git a/include/linux/pci-ep-msi.h b/include/linux/pci-ep-msi.h new file mode 100644 index 0000000000000..75236867426a4 --- /dev/null +++ b/include/linux/pci-ep-msi.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * PCI Endpoint *Function* side MSI header file + * + * Copyright (C) 2024 NXP + * Author: Frank Li <Frank.Li@xxxxxxx> + */ + +#ifndef __PCI_EP_MSI__ +#define __PCI_EP_MSI__ + +#ifdef CONFIG_PCI_ENDPOINT +int pci_epf_msi_domain_get_msi_rid(struct device *dev, u32 *rid); +#else +static inline int pci_epf_msi_domain_get_msi_rid(struct device *dev, u32 *rid) +{ + return -EINVAL; +} +#endif + +#endif /* __PCI_EP_MSI__ */ -- 2.34.1