[PATCH v10 3/7] PCI: endpoint: pci-ep-msi: Add MSI address/data pair mutable check

From: Frank Li
Date: Wed Dec 04 2024 - 18:30:07 EST


Some MSI controller change address/data pair when irq_set_affinity().
Current PCI endpoint can't support this type MSI controller. So add flag
MSI_FLAG_MUTABLE in include/linux/msi.h and check it when allocate
doorbell.

Signed-off-by: Frank Li <Frank.Li@xxxxxxx>
---
Change from v9 to v10
- new patch
---
drivers/pci/endpoint/pci-ep-msi.c | 8 ++++++++
include/linux/msi.h | 2 ++
2 files changed, 10 insertions(+)

diff --git a/drivers/pci/endpoint/pci-ep-msi.c b/drivers/pci/endpoint/pci-ep-msi.c
index b0a91fde202f3..c4a4f211cb27d 100644
--- a/drivers/pci/endpoint/pci-ep-msi.c
+++ b/drivers/pci/endpoint/pci-ep-msi.c
@@ -107,6 +107,14 @@ int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)
return -EINVAL;
}

+ if (!dom->msi_parent_ops)
+ return -EINVAL;
+
+ if (dom->msi_parent_ops->supported_flags & MSI_FLAG_MUTABLE) {
+ dev_err(dev, "Can't support mutable address/data pair MSI controller\n");
+ return -EINVAL;
+ }
+
dev_set_msi_domain(dev, dom);

msg = kcalloc(num_db, sizeof(struct pci_epf_doorbell_msg), GFP_KERNEL);
diff --git a/include/linux/msi.h b/include/linux/msi.h
index b10093c4d00ea..e404e0a01692a 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -556,6 +556,8 @@ enum {
MSI_FLAG_PCI_MSIX_ALLOC_DYN = (1 << 20),
/* PCI MSIs cannot be steered separately to CPU cores */
MSI_FLAG_NO_AFFINITY = (1 << 21),
+ /* Address and data pair is mutable when irq_set_affinity() */
+ MSI_FLAG_MUTABLE = (1 << 22),
};

/**

--
2.34.1