[PATCH 4/4] arm: dts: socfpga: agilex5: add SD/eMMC UHS PHY timing
[email protected] Wed, 26 Aug 2026 10:53:03 +0800
Newsgroups
org.u-boot-project.lists.u-boot
Message-ID
<2781fb330eb3af567882b68f709d6445865b028a.1787710268.git.tze.yee.ng@altera.com>
From: Tze Yee Ng <[email protected] >
Add UHS-I PHY and controller timing so SD cards and eMMC can run in the
higher speed modes on the Agilex5 SoCDK and its 013B and modular
variants:
- SoCDK: DDR50 (emmc-ddr) timing so SD cards / eMMC can run in UHS-I
DDR50 / DDR52 mode; advertise sd-uhs-ddr50 on the SD board and
mmc-ddr-1_8v on the eMMC board.
- 013B: drop no-1-8-v to allow 1.8V signalling and add SDR104
(emmc-hs200) and DDR50 (emmc-ddr) timing; advertise sd-uhs-sdr50,
sd-uhs-sdr104 and sd-uhs-ddr50.
- Modular: advertise sd-uhs-sdr50, sd-uhs-sdr104 and sd-uhs-ddr50 and
add DDR50 (emmc-ddr) timing (phony_dqs_timing = 0 re-centres the
returning data on the longer SoM SD path).
Signed-off-by: Tze Yee Ng <[email protected] >
---
.../arm/dts/socfpga_agilex5_socdk-u-boot.dtsi | 13 ++++++++++
.../socfpga_agilex5_socdk_013b-u-boot.dtsi | 24 +++++++++++++++++--
arch/arm/dts/socfpga_agilex5_socdk_013b.dts | 4 +++-
arch/arm/dts/socfpga_agilex5_socdk_emmc.dts | 13 ++++++++++
.../arm/dts/socfpga_agilex5_socdk_modular.dts | 20 ++++++++++++++++
5 files changed, 71 insertions(+), 3 deletions(-)
diff --git a/arch/arm/dts/socfpga_agilex5_socdk-u-boot.dtsi b/arch/arm/dts/socfpga_agilex5_socdk-u-boot.dtsi
index c03f78b2fdf..1cd54e29679 100644
--- a/arch/arm/dts/socfpga_agilex5_socdk-u-boot.dtsi
+++ b/arch/arm/dts/socfpga_agilex5_socdk-u-boot.dtsi
@@ -114,6 +114,7 @@
cap-sd-highspeed;
sd-uhs-sdr50;
sd-uhs-sdr104;
+ sd-uhs-ddr50;
vmmc-supply = <&sd_emmc_power>;
vqmmc-supply = <&sd_io_1v8_reg>;
max-frequency = <200000000>;
@@ -153,6 +154,18 @@
cdns,ctrl-hrs16-slave-ctrl-emmc-hs200 = <0x101>;
cdns,ctrl-hrs07-timing-delay-emmc-hs200 = <0xa0001>;
+ /* SD card UHS-I DDR50 mode & eMMC DDR52 mode timing configuration */
+ cdns,phy-dqs-timing-delay-emmc-ddr = <0x00580000>;
+ cdns,phy-gate-lpbk-ctrl-delay-emmc-ddr = <0x81a40040>;
+ cdns,phy-dll-master-ctrl-emmc-ddr = <0xa00004>;
+ cdns,phy-dll-slave-ctrl-emmc-ddr = <0x60>;
+ cdns,phy-ctrl-emmc-ddr = <0x4010>;
+ cdns,phy-dq-timing-delay-emmc-ddr = <0x10000001>;
+ cdns,ctrl-hrs09-timing-delay-emmc-ddr = <0xf1c1800f>;
+ cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-ddr = <0x00020000>;
+ cdns,ctrl-hrs16-slave-ctrl-emmc-ddr = <0x11000000>;
+ cdns,ctrl-hrs07-timing-delay-emmc-ddr = <0x00090001>;
+
bootph-all;
};
diff --git a/arch/arm/dts/socfpga_agilex5_socdk_013b-u-boot.dtsi b/arch/arm/dts/socfpga_agilex5_socdk_013b-u-boot.dtsi
index 75d51ef06e3..819e0ba9798 100644
--- a/arch/arm/dts/socfpga_agilex5_socdk_013b-u-boot.dtsi
+++ b/arch/arm/dts/socfpga_agilex5_socdk_013b-u-boot.dtsi
@@ -121,14 +121,12 @@
status = "okay";
no-mmc;
- no-1-8-v;
disable-wp;
cap-sd-highspeed;
vmmc-supply = <&sd_emmc_power>;
vqmmc-supply = <&sd_io_1v8_reg>;
max-frequency = <200000000>;
sdhci-caps = <0x00000000 0x0000c800>;
- sdhci-caps-mask = <0x00002007 0x0000ff00>;
/* SD card default speed (DS) and UHS-I SDR12 mode timing configuration */
cdns,phy-dqs-timing-delay-sd-ds = <0x00780000>;
@@ -153,6 +151,28 @@
cdns,ctrl-hrs16-slave-ctrl-emmc-sdr = <0x101>;
cdns,ctrl-hrs07-timing-delay-emmc-sdr = <0x90005>;
+ /* SD card UHS-I SDR104 mode timing configuration */
+ cdns,phy-dq-timing-delay-emmc-hs200 = <0x11000001>;
+ cdns,phy-dqs-timing-delay-emmc-hs200 = <0x780004>;
+ cdns,phy-dll-slave-ctrl-emmc-hs200 = <0x4d4d00>;
+ cdns,phy-gate-lpbk-ctrl-delay-emmc-hs200 = <0x81a40040>;
+ cdns,ctrl-hrs09-timing-delay-emmc-hs200 = <0xf1c18000>;
+ cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-hs200 = <0x90000>;
+ cdns,ctrl-hrs16-slave-ctrl-emmc-hs200 = <0x101>;
+ cdns,ctrl-hrs07-timing-delay-emmc-hs200 = <0xa0001>;
+
+ /* SD card UHS-I DDR50 mode & eMMC DDR52 mode timing configuration */
+ cdns,phy-dqs-timing-delay-emmc-ddr = <0x00580000>;
+ cdns,phy-gate-lpbk-ctrl-delay-emmc-ddr = <0x81a40040>;
+ cdns,phy-dll-master-ctrl-emmc-ddr = <0xa00004>;
+ cdns,phy-dll-slave-ctrl-emmc-ddr = <0x60>;
+ cdns,phy-ctrl-emmc-ddr = <0x4010>;
+ cdns,phy-dq-timing-delay-emmc-ddr = <0x10000001>;
+ cdns,ctrl-hrs09-timing-delay-emmc-ddr = <0xf1c1800f>;
+ cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-ddr = <0x00020000>;
+ cdns,ctrl-hrs16-slave-ctrl-emmc-ddr = <0x11000000>;
+ cdns,ctrl-hrs07-timing-delay-emmc-ddr = <0x00090001>;
+
bootph-all;
};
diff --git a/arch/arm/dts/socfpga_agilex5_socdk_013b.dts b/arch/arm/dts/socfpga_agilex5_socdk_013b.dts
index 9605fa4cb00..1bec13d998e 100644
--- a/arch/arm/dts/socfpga_agilex5_socdk_013b.dts
+++ b/arch/arm/dts/socfpga_agilex5_socdk_013b.dts
@@ -90,11 +90,13 @@
&mmc {
status = "okay";
bus-width = <4>;
- no-1-8-v;
cap-sd-highspeed;
cap-mmc-highspeed;
disable-wp;
sd-uhs-sdr50;
+ sd-uhs-sdr104;
+ sd-uhs-ddr50;
+ sdhci-caps-mask = <0x00002000 0x0000ff00>;
cdns,phy-use-ext-lpbk-dqs = <1>;
cdns,phy-use-lpbk-dqs = <1>;
cdns,phy-use-phony-dqs = <1>;
diff --git a/arch/arm/dts/socfpga_agilex5_socdk_emmc.dts b/arch/arm/dts/socfpga_agilex5_socdk_emmc.dts
index c06781064ca..6c608cfc562 100644
--- a/arch/arm/dts/socfpga_agilex5_socdk_emmc.dts
+++ b/arch/arm/dts/socfpga_agilex5_socdk_emmc.dts
@@ -25,6 +25,7 @@
disable-wp;
non-removable;
cap-mmc-highspeed;
+ mmc-ddr-1_8v;
mmc-hs200-1_8v;
mmc-hs400-1_8v;
bus-width = <8>;
@@ -71,4 +72,16 @@
cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-hs400 = <0x80000>;
cdns,ctrl-hrs16-slave-ctrl-emmc-hs400 = <0x11000001>;
cdns,ctrl-hrs07-timing-delay-emmc-hs400 = <0x90001>;
+
+ /* SD card UHS-I DDR50 mode & eMMC DDR52 mode timing configuration */
+ cdns,phy-dqs-timing-delay-emmc-ddr = <0x00580000>;
+ cdns,phy-gate-lpbk-ctrl-delay-emmc-ddr = <0x81a40040>;
+ cdns,phy-dll-master-ctrl-emmc-ddr = <0xa00004>;
+ cdns,phy-dll-slave-ctrl-emmc-ddr = <0x60>;
+ cdns,phy-ctrl-emmc-ddr = <0x4010>;
+ cdns,phy-dq-timing-delay-emmc-ddr = <0x10000001>;
+ cdns,ctrl-hrs09-timing-delay-emmc-ddr = <0xf1c1800f>;
+ cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-ddr = <0x00020000>;
+ cdns,ctrl-hrs16-slave-ctrl-emmc-ddr = <0x11000000>;
+ cdns,ctrl-hrs07-timing-delay-emmc-ddr = <0x00090001>;
};
diff --git a/arch/arm/dts/socfpga_agilex5_socdk_modular.dts b/arch/arm/dts/socfpga_agilex5_socdk_modular.dts
index 032e40fc639..30a5a749d1d 100644
--- a/arch/arm/dts/socfpga_agilex5_socdk_modular.dts
+++ b/arch/arm/dts/socfpga_agilex5_socdk_modular.dts
@@ -33,6 +33,9 @@
no-mmc;
disable-wp;
cap-sd-highspeed;
+ sd-uhs-sdr50;
+ sd-uhs-sdr104;
+ sd-uhs-ddr50;
vmmc-supply = <&sd_emmc_power>;
vqmmc-supply = <&sd_io_1v8_reg>;
max-frequency = <200000000>;
@@ -71,5 +74,22 @@
cdns,ctrl-hrs16-slave-ctrl-emmc-hs200 = <0x101>;
cdns,ctrl-hrs07-timing-delay-emmc-hs200 = <0xa0001>;
+ /* SD card UHS-I DDR50 mode & eMMC DDR52 mode timing configuration */
+ cdns,phy-dqs-timing-delay-emmc-ddr = <0x00580000>;
+ cdns,phy-gate-lpbk-ctrl-delay-emmc-ddr = <0x81a40040>;
+ cdns,phy-dll-master-ctrl-emmc-ddr = <0xa00004>;
+ cdns,phy-dll-slave-ctrl-emmc-ddr = <0x60>;
+ /*
+ * Modular SoM: PHONY_DQS_TIMING (PHY_CTRL[9:4]) = 0 instead of the
+ * default 1. The longer SD path offsets the returning DDR data from the
+ * phony strobe; re-centring it stops one DDR beat collapsing onto both.
+ */
+ cdns,phy-ctrl-emmc-ddr = <0x4000>;
+ cdns,phy-dq-timing-delay-emmc-ddr = <0x10000001>;
+ cdns,ctrl-hrs09-timing-delay-emmc-ddr = <0xf1c1800f>;
+ cdns,ctrl-hrs10-lpbk-ctrl-delay-emmc-ddr = <0x00020000>;
+ cdns,ctrl-hrs16-slave-ctrl-emmc-ddr = <0x11000000>;
+ cdns,ctrl-hrs07-timing-delay-emmc-ddr = <0x00090001>;
+
bootph-all;
};
--
2.43.7