feat(lib/pcie): add dvsec helpers
Add DVSEC RME DA support and helpers based on RME System
Architecture [1].
[1] https://developer.arm.com/documentation/den0129/latest
Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
Change-Id: I29c2dc3c94fa295c9948f63f57f88e2763326291
diff --git a/include/lib/pcie/pcie_dvsec_rmeda.h b/include/lib/pcie/pcie_dvsec_rmeda.h
new file mode 100644
index 0000000..b693f2a
--- /dev/null
+++ b/include/lib/pcie/pcie_dvsec_rmeda.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2025, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef PCIE_DVSEC_RME_DA_H
+#define PCIE_DVSEC_RME_DA_H
+
+/* PCI RootPort Extended Capability RMEDA registers offset */
+
+/*
+ * Extended Capability Header
+ * DVSEC Headers
+ * RME-DA Control registers
+ */
+#define PCIE_ECAP_ECH_OFFSET U(0)
+#define PCIE_ECAP_DVSEC_HDR1_OFFSET U(4)
+#define PCIE_ECAP_DVSEC_HDR2_OFFSET U(8)
+#define PCIE_ECAP_DVSEC_RME_DA_CTL_REG1_OFFSET U(12)
+#define PCIE_ECAP_DVSEC_RME_DA_CTL_REG2_OFFSET U(16)
+
+/* RME-DA DVSEC Header1 */
+#define DVSEC_HDR1_VENDOR_ID_SHIFT U(0)
+#define DVSEC_HDR1_VENDOR_ID_WIDTH U(16)
+#define DVSEC_HDR1_REVISION_SHIFT U(16)
+#define DVSEC_HDR1_REVISION_WIDTH U(4)
+#define DVSEC_HDR1_LENGTH_SHIFT U(20)
+#define DVSEC_HDR1_LENGTH_WIDTH U(12)
+
+/* RME-DA DVSEC Header1 - Values */
+#define DVSEC_VENDOR_ID_ARM U(0x13b5)
+#define DVSEC_REVISION_0 U(0x0)
+
+/* RME-DA DVSEC Header2 */
+#define DVSEC_HDR2_DVSEC_ID_SHIFT U(0)
+#define DVSEC_HDR2_DVSEC_ID_WIDTH U(16)
+
+/* RME-DA DVSEC Header2 - Values */
+#define DVSEC_ID_RME_DA U(0xFF01)
+
+/* RME-DA Control register 1 */
+#define DVSEC_RMEDA_CTL_REG1_TDISP_EN_SHIFT U(0)
+#define DVSEC_RMEDA_CTL_REG1_TDISP_EN_WIDTH U(1)
+
+/* RME-DA Control register 1 - Values */
+#define RME_DA_TDISP_DISABLE U(0)
+#define RME_DA_TDISP_ENABLE U(1)
+
+/* RME-DA Control register 2. 32 IDE Selective Stream Lock bits */
+#define DVSEC_RME_DA_CTL_REG2_SEL_STR_LOCK_SHIFT U(0)
+#define DVSEC_RME_DA_CTL_REG2_SEL_STR_LOCK_WIDTH U(32)
+
+uint32_t pcie_find_rmeda_capability(uint32_t bdf, uint32_t *cid_offset);
+
+#endif /* PCIE_DVSEC_RME_DA_H */
diff --git a/include/lib/pcie/pcie_spec.h b/include/lib/pcie/pcie_spec.h
index 31fd98b..cd851ee 100644
--- a/include/lib/pcie/pcie_spec.h
+++ b/include/lib/pcie/pcie_spec.h
@@ -87,6 +87,14 @@
#define PCIE_ECAP_CIDR_MASK 0xffff
#define PCIE_ECAP_NCPR_MASK 0xfff
+/* PCIe Extended Capability Header */
+#define PCIE_ECH_ID_SHIFT U(0)
+#define PCIE_ECH_ID_WIDTH U(16)
+#define PCIE_ECH_CAP_VER_SHIFT U(16)
+#define PCIE_ECH_CAP_VER_WIDTH U(4)
+#define PCIE_ECH_NEXT_CAP_OFFSET_SHIFT U(20)
+#define PCIE_ECH_NEXT_CAP_OFFSET_WIDTH U(12)
+
#define PCIE_CAP_START 0x40
#define PCIE_CAP_END 0xFC
#define PCIE_ECAP_START 0x100
@@ -107,6 +115,8 @@
#define ECID_PASID 0x001B
#define ECID_DPC 0x001D
#define ECID_DVSEC 0x0023
+#define ECID_DOE 0x002E
+#define ECID_IDE 0x0030
/* PCI Express capability struct offsets */
#define CIDR_OFFSET 0x0