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