[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20251216-fix_pciatops-v2-1-d013e9b7e2ee@linux.ibm.com>
Date: Tue, 16 Dec 2025 18:04:42 +0100
From: Gerd Bayer <gbayer@...ux.ibm.com>
To: Bjorn Helgaas <bhelgaas@...gle.com>, Jay Cornwall <Jay.Cornwall@....com>,
Felix Kuehling <Felix.Kuehling@....com>
Cc: Niklas Schnelle <schnelle@...ux.ibm.com>,
Alexander Schmidt <alexs@...ux.ibm.com>, linux-s390@...r.kernel.org,
linux-pci@...r.kernel.org, linux-kernel@...r.kernel.org,
Gerd Bayer <gbayer@...ux.ibm.com>, Leon Romanovsky <leon@...nel.org>
Subject: [PATCH v2 1/2] PCI: AtomicOps: Define valid root port capabilities
Provide the two combinations of Atomic Op Completion size attributes
that a root port may support per PCIe Spec 7.0 section 6.15.3.1. -
besides the trivial "No support" - as two new defines.
Change documentation of pci_enable_atomic_ops_to_root() that these are
the only ones that should be used. Also, spell out that all requested
capabilities need to be supported at the root port for enable to
succeed. Also emphasize that on success, this sets AtomicOpsCtl:ReqEn to
1, and leaves it untouched in case of failure.
Suggested-by: Leon Romanovsky <leon@...nel.org>
Signed-off-by: Gerd Bayer <gbayer@...ux.ibm.com>
---
drivers/pci/pci.c | 13 +++++++------
include/uapi/linux/pci_regs.h | 8 ++++++++
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 13dbb405dc31f8054afa090a2d14acf16845f587..d2261ac964316f3fc3efc4d5b30cf821ac46d75d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -3661,15 +3661,16 @@ void pci_acs_init(struct pci_dev *dev)
/**
* pci_enable_atomic_ops_to_root - enable AtomicOp requests to root port
* @dev: the PCI device
- * @cap_mask: mask of desired AtomicOp sizes, including one or more of:
- * PCI_EXP_DEVCAP2_ATOMIC_COMP32
- * PCI_EXP_DEVCAP2_ATOMIC_COMP64
- * PCI_EXP_DEVCAP2_ATOMIC_COMP128
+ * @cap_mask: root port must support combinations of AtomicOp sizes
+ * PCI_EXP_ROOT_PORT_ATOMIC_BASE
+ * PCI_EXP_ROOT_PORT_ATOMIC_FULL
*
* Return 0 if all upstream bridges support AtomicOp routing, egress
* blocking is disabled on all upstream ports, and the root port supports
- * the requested completion capabilities (32-bit, 64-bit and/or 128-bit
- * AtomicOp completion), or negative otherwise.
+ * all the requested completion capabilities (BASE: 32-bit, 64-bit or
+ * FULL: 32/64- and 128-bit AtomicOp completion). In that case enable the
+ * device to send AtomicOp requests. Otherwise, return negative and leave
+ * the enablement in the PCI config space untouched.
*/
int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask)
{
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index 3add74ae259483bab76e7552cb28bd9c9ef0b30c..e4d91c379416841fcf2090043b2b4784d69538a0 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -664,6 +664,14 @@
#define PCI_EXP_DEVCAP2_ATOMIC_COMP32 0x00000080 /* 32b AtomicOp completion */
#define PCI_EXP_DEVCAP2_ATOMIC_COMP64 0x00000100 /* 64b AtomicOp completion */
#define PCI_EXP_DEVCAP2_ATOMIC_COMP128 0x00000200 /* 128b AtomicOp completion */
+/* PCIe spec 7.0 6.15.3.1: Root ports may support one of 2 sets of Atomic Ops */
+#define PCI_EXP_ROOT_PORT_ATOMIC_BASE \
+ (PCI_EXP_DEVCAP2_ATOMIC_COMP32 | \
+ PCI_EXP_DEVCAP2_ATOMIC_COMP64)
+#define PCI_EXP_ROOT_PORT_ATOMIC_FULL \
+ (PCI_EXP_DEVCAP2_ATOMIC_COMP32 | \
+ PCI_EXP_DEVCAP2_ATOMIC_COMP64 | \
+ PCI_EXP_DEVCAP2_ATOMIC_COMP128)
#define PCI_EXP_DEVCAP2_LTR 0x00000800 /* Latency tolerance reporting */
#define PCI_EXP_DEVCAP2_TPH_COMP_MASK 0x00003000 /* TPH completer support */
#define PCI_EXP_DEVCAP2_OBFF_MASK 0x000c0000 /* OBFF support mechanism */
--
2.51.0
Powered by blists - more mailing lists