arm64: dts: rockchip: Pull down the eMMC data strobe on RK3576
Subsystems (3)
PATCH 1/1 arm64: dts: rockchip: Pull down the eMMC data strobe on RK3576
The eMMC data strobe (DS) is only driven by the card while it sends data or the CRC status token; in between, the card releases the line. RK3576 configures emmc_strb with pcfg_pull_none, so DS floats between transfers.
In HS400 the host samples the CRC status token that follows each written block with DS. With the floating line it misreads the token now and
then: the write ends with a data CRC error and is retried. Nothing is logged and the data ends up intact, but the errors show up in the controller's err_stats in debugfs, and write throughput drops.
On a board with RK3576S and a 64 GB eMMC 5.1 in HS400 enhanced strobe mode at 200 MHz, mainline shows about one data CRC error per 16 MiB written (1123 over 18 GiB) and writes at about 50 MB/s. Changing only the strobe pin from pull-none to pull-down at runtime gives 0 errors over 15 GiB written and about 176 MB/s; the drive strength and the pull of the clock pin made no difference.
Pull-down is the reset value of the pad, which the vendor kernel keeps (its eMMC node has no pinctrl), and RK3588 already uses pcfg_pull_down for its eMMC data strobe.
--- arch/arm64/boot/dts/rockchip/rk3576-pinctrl.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3576-pinctrl.dtsi +1 -1
@@ -613,7 +613,7 @@ emmc_cmd: emmc-cmd { emmc_strb: emmc-strb { rockchip,pins = /* emmc_strb */ - <1 RK_PB2 1 &pcfg_pull_none>; + <1 RK_PB2 1 &pcfg_pull_down>; }; };
Signature · 1 line
2.55.0