On Thu, Jul 16, 2026 at 12:08 AM Tao Ding <[email protected]> wrote: > > During SDMA transfers, the controller raises an interrupt at buffer boundaries > to request a system address update. The host driver will rewrite the > SDHC_SYSAD register. > (according to PartA2_SD_Host_Controller_Simplified_Specification_Ver2.00.pdf > section 2.2.1) > However, the current code will ignore write operations to SDHC_SYSAD. > > To fix this bug, when SDMA encounters a boundary, a state is set to record it. > In this state, SDHC_SYSAD can be written. In other cases, it is still > protected by TRANSFERRING_DATA. > > Meanwhile, a subsection has been added for migration. > > Suggested-by: Bin Meng <[email protected]> > Signed-off-by: Tao Ding <[email protected]> > --- > This bug may be encountered when using uboot with SDMA functionality, and can > be reproduced by following the steps below. > Uboot test: > 1. Prepare zImage, uboot and rootfs.cpio.gz, make sure uboot config > (MMC_SDHCI_SDMA=y). > for more detail, can obtained > > "https://lore.kernel.org/qemu-devel/[email protected]/T/#mcdf231e6bd762903f8393bf93253cbcb12ececcf" > 2. ./qemu-system-aarch64 -M xilinx-zynq-a9 -machine boot-mode=sd -m 1024 > -display none -serial null -serial stdio -monitor none \ > -device loader,file=u-boot-dtb.bin,addr=0x04000000,cpu-num=0 \ > -drive file=zynq-sd.img,format=raw,if=sd -D qemu.log > > > After applying the fix, success load sd card: > > U-Boot 2026.07-rc4-g1e80ee41441c (Jun 15 2026 - 19:05:05 +0800) > > Model: Xilinx ZC702 board > DRAM: ECC disabled 1 GiB > Core: 33 devices, 21 uclasses, devicetree: board > Flash: 0 Bytes > NAND: 0 MiB > MMC: mmc@e0100000: 0 > Loading Environment from FAT... *** Error - No Valid Environment Area found > *** Warning - bad env area, using default environment > > In: serial@e0001000 > Out: serial@e0001000 > Err: serial@e0001000 > Net: > ZYNQ GEM: e000b000, mdio bus e000b000, phyaddr 7, interface rgmii-id > > Warning: ethernet@e000b000 (eth0) using random MAC address - 4a:63:5a:a4:d3:6b > eth0: ethernet@e000b000 > Hit any key to stop autoboot: 0 > Zynq> fatload mmc 0 ${kernel_addr_r} zImage > 10838528 bytes read in 4316 ms (2.4 MiB/s) > Zynq> fatload mmc 0 ${ramdisk_addr_r} rootfs-arm32.cpio.gz > 406531 bytes read in 199 ms (1.9 MiB/s) > Zynq> setenv ramdisk_size ${filesize} > Zynq> fatload mmc 0 ${fdt_addr_r} zynq-zc702.dtb > 15754 bytes read in 21 ms (732.4 KiB/s) > Zynq> setenv bootargs console=ttyPS0,115200 earlycon ignore_loglevel > rdinit=/init > Zynq> bootz ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr_r} > Kernel image @ 0x2000000 [ 0x000000 - 0xa56200 ] > ## Flattened Device Tree blob at 01f00000 > Booting using the fdt blob at 0x1f00000 > Working FDT set to 1f00000 > Loading Ramdisk to 2ff9c000, end 2ffff403 ... OK > Loading Device Tree to 2ff95000, end 2ff9bd89 ... OK > Working FDT set to 2ff95000 > > Starting kernel ... > > hw/sd/sdhci.c | 54 ++++++++++++++++++++++++++++++++++++++++++- > include/hw/sd/sdhci.h | 2 ++ > 2 files changed, 55 insertions(+), 1 deletion(-) >
Reviewed-by: Bin Meng <[email protected]>
