From nobody Sun Jul 26 11:51:04 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=163.com ARC-Seal: i=1; a=rsa-sha256; t=1782751657; cv=none; d=zohomail.com; s=zohoarc; b=iybQuGqI9SC28SP+BcwDLGsfC2rEuIMXa9S5os8EWqjpAqKAa1qJ+C2iFrZWmurnbP1dk4TRJA7NUpR5jfwoaOcc2SKqnwDmI18/ehgxw0ooS11KfQBEDyzLBiOEiX2eG5y4klRq81fqLORK8txbzQpoE15gkqNHP3Ao2u3CmtE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782751657; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1ydwkpFapKt+oISVO7BXsjsNG3KUKnBk+W+fyW5zLBM=; b=O58iy0flZRVUqpDQu6oReZ3H6yxiA91wibQ29hiqpsZpXktP9nXvA3+mE4aPj1TsNsSw5dPr8DNXcO3uQon0UyHe+uQ2tWi0tAmpNeG4JfeIza0b6SsG7qva2/zywO9/M0/GjIHVJOVC872kPhoUInfmyW8kdSv7RVRiposBdJY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782751657084683.7203279620873; Mon, 29 Jun 2026 09:47:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weF8P-0001To-1u; Mon, 29 Jun 2026 12:47:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weF7v-0001SM-MB; Mon, 29 Jun 2026 12:46:33 -0400 Received: from m16.mail.163.com ([220.197.31.2]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weF7t-0006r4-ET; Mon, 29 Jun 2026 12:46:31 -0400 Received: from dt-VM.localdomain (unknown []) by gzga-smtp-mtada-g0-4 (Coremail) with SMTP id _____wD311NLoUJq1eP1Gg--.32114S3; Tue, 30 Jun 2026 00:46:04 +0800 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=1y dwkpFapKt+oISVO7BXsjsNG3KUKnBk+W+fyW5zLBM=; b=O/RQL+wtMQocwN2nXQ yJEofGfRuMFj17jlpbeg+LUHKoBapQ2rBWpGK1L6roEJLe9hv55nRdnT0C0Vfv7q p8A1/MBdJyQqL79J2PfSsXpKvBZ0wqGiPN5b8FZF0eOUxlSkPlts97sDP4dZCMJm O4a8j5aVh1oOhYwcInVsEV1FQ= From: Tao Ding To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Bin Meng , qemu-block@nongnu.org, Fabiano Rosas , Laurent Vivier , Paolo Bonzini , Tao Ding Subject: [PATCH v2 1/2] fixed sdma boundary bug Date: Tue, 30 Jun 2026 00:45:32 +0800 Message-ID: <20260629164533.42956-2-dingtao0430@163.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260629164533.42956-1-dingtao0430@163.com> References: <20260629164533.42956-1-dingtao0430@163.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _____wD311NLoUJq1eP1Gg--.32114S3 X-Coremail-Antispam: 1Uf129KBjvJXoWxCF1rXw4rAr13WF1fWry5twb_yoW5CF1xpF ZFvr4rWrs3Jry5Aa1kGa4rCFyjqw47ZasxXr1FyrnY9ayY9FyFqw43K3WakFyjqrWxZr17 Ar9xJ34Yv3W5taUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0zinYFJUUUUU= X-Originating-IP: [101.204.16.250] X-CM-SenderInfo: pglqw3tdrqkjqq6rljoofrz/xtbC4Qym5GpCoUzxXQAA3G Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=220.197.31.2; envelope-from=dingtao0430@163.com; helo=m16.mail.163.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @163.com) X-ZM-MESSAGEID: 1782751658080158501 Content-Type: text/plain; charset="utf-8" During SDMA transfers, the controller raises an interrupt at buffer boundar= ies to request a system address update. But the emulation fails to clear the SDHC_DOING_READ/WRITE flags after DMA completion, so writes to SDHC_SYSAD a= re ignored. Clear these flags when the transfer ends.=20 (according to PartA2_SD_Host_Controller_Simplified_Specification_Ver2.00.pd= f section 2.2.1) Signed-off-by: Tao Ding --- Uboot test: 1. Prepare zImage, U-Boot, and rootfs.cpio.gz, and make sure the U-Boot configuration enables MMC_SDHCI_SDMA. More details can be found at: https://lore.kernel.org/qemu-devel/20260617155857.7451-1-dingtao0430@1= 63.com/T/#mcdf231e6bd762903f8393bf93253cbcb12ececcf 2. ./qemu-system-aarch64 -M xilinx-zynq-a9 -machine boot-mode=3Dsd -m 1= 024 -display none -serial null -serial stdio -monitor none \ -device loader,file=3Du-boot-dtb.bin,addr=3D0x04000000,cpu-num=3D0 = \ -drive file=3Dzynq-sd.img,format=3Draw,if=3Dsd -D qemu.log After applying the fix, success load sd card: =20 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: =20 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=3DttyPS0,115200 earlycon ignore_loglevel rdin= it=3D/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 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c index c86dfa281f..0d87289ca4 100644 --- a/hw/sd/sdhci.c +++ b/hw/sd/sdhci.c @@ -644,6 +644,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState= *s) s->data_count =3D 0; } if (page_aligned && boundary_count =3D=3D 0) { + s->prnsts &=3D ~SDHC_DOING_READ; break; } } @@ -669,6 +670,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState= *s) } } if (page_aligned && boundary_count =3D=3D 0) { + s->prnsts &=3D ~SDHC_DOING_WRITE; break; } } --=20 2.43.0 From nobody Sun Jul 26 11:51:04 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=163.com ARC-Seal: i=1; a=rsa-sha256; t=1782751613; cv=none; d=zohomail.com; s=zohoarc; b=XzVzX15WQdxL2n2k6IOw6xt45JAU+axrRZMqHzWWO8s3fqwP3kn/jFvFKW/H1zN8hCMDSRu4fmtyX5OmNEsDjStfIyN/0XUbjf58rDb4bn+LuyM5Hs8hG2QgRg5zzTi65crJdkkFVJG6UHp4irxAP/soOLmc/Sy56NcYHTi8Pqc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782751613; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=68DELvQ63CxdDYcJUgQUdUT2IAmUQtFHhivD0F/+SLA=; b=W+ORS+79QuV4v/JNJloLEzsSyzpHRyO1sU4pbivJtgzUHMR2tZSUQRkqxCDRJgGB7h52KfSiU4NomfTavXKfX7OgbPrAYQ+Q2ojma7LRJMG0w+CbrV9OkK4PlSLLtUaIQEf3Hs3BPqS7eiIqWz8lNPuKk8/t+zm7HwPRibwOY08= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17827516130874.220116498157267; Mon, 29 Jun 2026 09:46:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weF7x-0001Rz-2y; Mon, 29 Jun 2026 12:46:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weF7t-0001RJ-2n; Mon, 29 Jun 2026 12:46:29 -0400 Received: from m16.mail.163.com ([117.135.210.4]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weF7p-0006nm-3Y; Mon, 29 Jun 2026 12:46:28 -0400 Received: from dt-VM.localdomain (unknown []) by gzga-smtp-mtada-g0-4 (Coremail) with SMTP id _____wD311NLoUJq1eP1Gg--.32114S4; Tue, 30 Jun 2026 00:46:04 +0800 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=68 DELvQ63CxdDYcJUgQUdUT2IAmUQtFHhivD0F/+SLA=; b=iXh8bRBakUHY7fq3A6 Ajk7vebMHPyBXxM1tximSDrVxM5oKFFRuRdTxtF2kedhWYDdvOdhxMunDS+cqsUS pawzFCHb7CRQTyZ5T5EpzL8TRXgvvj4D0sgAlVmaHVeDxW/M15kwDdnrf8uNuAbj L2J4CT9YhrdoXTrXt+uxpJ5kA= From: Tao Ding To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Bin Meng , qemu-block@nongnu.org, Fabiano Rosas , Laurent Vivier , Paolo Bonzini , Tao Ding Subject: [PATCH v2 2/2] qtest: add xilinx-zynq SDHCI sdma test Date: Tue, 30 Jun 2026 00:45:33 +0800 Message-ID: <20260629164533.42956-3-dingtao0430@163.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260629164533.42956-1-dingtao0430@163.com> References: <20260629164533.42956-1-dingtao0430@163.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _____wD311NLoUJq1eP1Gg--.32114S4 X-Coremail-Antispam: 1Uf129KBjvJXoW3JFyDWF4rGF4xuF1xXw4UXFb_yoW3XFy7pa yj9FyjyrWqyF18Xrs3Ga15tFyY9rsxZa4UWFy5urs2krs7JF92vrs7KFyUXrs7GrW8Xryr urs8XF1DGw1xWrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0pi8nY7UUUUU= X-Originating-IP: [101.204.16.250] X-CM-SenderInfo: pglqw3tdrqkjqq6rljoofrz/xtbC4Qym5GpCoUzxagAA3x Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=117.135.210.4; envelope-from=dingtao0430@163.com; helo=m16.mail.163.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @163.com) X-ZM-MESSAGEID: 1782751617148158500 Content-Type: text/plain; charset="utf-8" Thanks for the review comments. Add a standalone qtest for the SDHCI controller on the xilinx-zynq-a9 machine. This test covers the bug fixed by patch 1/2 in this= series. The test covers the SDMA boundary continuation case for a multi-block read. After the controller stops at a boundary, software updates SYSAD to continue the transfer. This verifies the generic SDHCI behavior that previously failed when the continuation SYSAD write was ignored and the transfer stalled. Signed-off-by: Tao Ding --- Build: mkdir build cd build ../configure --target-list=3D"arm-softmmu" --disable-slirp --enable-debu= g --disable-werror make -j4 Run: QTEST_QEMU_BINARY=3D./qemu-system-arm \ tests/qtest/xilinx-zynq-sdhci-test Before the fix, the test fails with a BLKCNT assertion: ERROR:../tests/qtest/xilinx-zynq-sdhci-test.c:90:wait_for_block_count:=20 assertion failed (qtest_readw(qts, XILINX_ZYNQ_MMC_BA + SDHC_BLKCNT) =3D= =3D expected): (1 =3D=3D 0) After applying the fix, the test passes: ok 1 /arm/xilinx-zynq-sdhci/sdma/read-boundary-continue tests/qtest/meson.build | 1 + tests/qtest/xilinx-zynq-sdhci-test.c | 178 +++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 tests/qtest/xilinx-zynq-sdhci-test.c diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 2ae720156f..c12a35721d 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -244,6 +244,7 @@ qtests_arm =3D \ config_all_devices.has_key('CONFIG_MUSICPAL') ? ['pflash-cfi02-test'] := []) + \ (config_all_devices.has_key('CONFIG_ASPEED_SOC') ? qtests_aspeed : []) += \ (config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \ + (config_all_devices.has_key('CONFIG_ZYNQ') ? ['xilinx-zynq-sdhci-test'] = : []) + \ (config_all_devices.has_key('CONFIG_GENERIC_LOADER') ? ['hexloader-test'= ] : []) + \ (config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test',= 'tpm-tis-i2c-swtpm-test'] : []) + \ (config_all_devices.has_key('CONFIG_VEXPRESS') ? ['test-arm-mptimer'] : = []) + \ diff --git a/tests/qtest/xilinx-zynq-sdhci-test.c b/tests/qtest/xilinx-zynq= -sdhci-test.c new file mode 100644 index 0000000000..1be9bdabf7 --- /dev/null +++ b/tests/qtest/xilinx-zynq-sdhci-test.c @@ -0,0 +1,178 @@ +/* +* QTests for the Xilinx Zynq SDHCI controller. +* +* Copyright (c) 2026 Tao Ding +* +* SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "qemu/osdep.h" +#include "hw/sd/sdhci.h" +#include "hw/sd/sdhci-internal.h" + +#include "libqtest.h" +#include "libqtest-single.h" +#include "libqos/sdhci-cmd.h" + +#define XILINX_ZYNQ_MMC_BA 0xE0100000 +#define XILINX_ZYNQ_BLK_SIZE 512 +#define XILINX_ZYNQ_TEST_IMAGE_SIZE (1 << 20) +#define XILINX_ZYNQ_SDMA_BOUNDARY_ARG 7 +#define XILINX_ZYNQ_SDMA_BOUNDARY_SIZE (512 * 1024) +#define XILINX_ZYNQ_SDMA_BLOCK_COUNT \ + ((XILINX_ZYNQ_SDMA_BOUNDARY_SIZE / XILINX_ZYNQ_BLK_SIZE) + 1) +#define XILINX_ZYNQ_SDMA_TRANSFER_SIZE \ + (XILINX_ZYNQ_SDMA_BLOCK_COUNT * XILINX_ZYNQ_BLK_SIZE) +#define XILINX_ZYNQ_DMA_ADDR 0x00100000 + +#define SDHC_MAKE_BLKSZ(boundary, size) (((boundary) << 12) | (size)) + +static char *sd_path; + +static QTestState *setup_sd_card(void) +{ + QTestState *qts; + uint16_t rca; + + qts =3D qtest_initf( + "-machine xilinx-zynq-a9 " + "-drive if=3Dsd,index=3D0,file=3D%s,format=3Draw,auto-read-only=3D= off", + sd_path); + + qtest_writew(qts, XILINX_ZYNQ_MMC_BA + SDHC_SWRST, SDHC_RESET_ALL); + qtest_writew(qts, XILINX_ZYNQ_MMC_BA + SDHC_CLKCON, + SDHC_CLOCK_SDCLK_EN | SDHC_CLOCK_INT_STABLE | + SDHC_CLOCK_INT_EN); + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, 0, 0, 0, 0, SDHC_APP_CMD); + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, 0, 0, 0x41200000, 0, + (41 << 8)); + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, 0, 0, 0, 0, SDHC_ALL_SEND_CID); + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, 0, 0, 0, 0, + SDHC_SEND_RELATIVE_ADDR | SDHC_CMD_RESPONSE); + rca =3D qtest_readl(qts, XILINX_ZYNQ_MMC_BA + SDHC_RSPREG0) >> 16; + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, 0, 0, rca << 16, 0, + SDHC_SELECT_DESELECT_CARD); + + return qts; +} + +static void write_pattern_to_image(size_t offset, size_t len) +{ + int fd; + int ret; + uint8_t *buf =3D g_malloc(len); + + for (size_t i =3D 0; i < len; i++) { + buf[i] =3D (i * 13 + 7) & 0xff; + } + + fd =3D open(sd_path, O_WRONLY); + g_assert_cmpint(fd, >=3D, 0); + ret =3D pwrite(fd, buf, len, offset); + close(fd); + g_assert_cmpint(ret, =3D=3D, len); + + g_free(buf); +} + +static void wait_for_block_count(QTestState *qts, uint16_t expected) +{ + int i; + + for (i =3D 0; i < 1000; i++) { + if (qtest_readw(qts, XILINX_ZYNQ_MMC_BA + SDHC_BLKCNT) =3D=3D expe= cted) { + return; + } + g_usleep(100); + } + + g_assert_cmpuint(qtest_readw(qts, XILINX_ZYNQ_MMC_BA + SDHC_BLKCNT), + =3D=3D, expected); +} + +/* + * SDMA stops at each boundary and requires software to update SYSAD + * to continue. The bug this test covers leaves DOING_READ/WRITE asserted, + * so the continuation SYSAD write is ignored and the transfer stalls. + */ +static void test_read_sdma_boundary_continue(void) +{ + QTestState *qts =3D setup_sd_card(); + uint8_t *actual =3D g_malloc0(XILINX_ZYNQ_SDMA_TRANSFER_SIZE); + uint8_t *expected =3D g_malloc(XILINX_ZYNQ_SDMA_TRANSFER_SIZE); + + write_pattern_to_image(0, XILINX_ZYNQ_SDMA_TRANSFER_SIZE); + + for (size_t i =3D 0; i < XILINX_ZYNQ_SDMA_TRANSFER_SIZE; i++) { + expected[i] =3D (i * 13 + 7) & 0xff; + } + + qtest_writel(qts, XILINX_ZYNQ_DMA_ADDR, 0xdeadbeef); + qtest_writel(qts, XILINX_ZYNQ_DMA_ADDR + XILINX_ZYNQ_SDMA_BOUNDARY_SIZ= E, + 0xcafef00d); + + qtest_writel(qts, XILINX_ZYNQ_MMC_BA + SDHC_SYSAD, XILINX_ZYNQ_DMA_ADD= R); + sdhci_cmd_regs(qts, XILINX_ZYNQ_MMC_BA, + SDHC_MAKE_BLKSZ(XILINX_ZYNQ_SDMA_BOUNDARY_ARG, + XILINX_ZYNQ_BLK_SIZE), + XILINX_ZYNQ_SDMA_BLOCK_COUNT, 0, + SDHC_TRNS_DMA | SDHC_TRNS_MULTI | SDHC_TRNS_READ | + SDHC_TRNS_BLK_CNT_EN, + SDHC_READ_MULTIPLE_BLOCK | SDHC_CMD_DATA_PRESENT); + + wait_for_block_count(qts, 1); + + qtest_writew(qts, XILINX_ZYNQ_MMC_BA + SDHC_NORINTSTS, 0xffff); + qtest_writel(qts, XILINX_ZYNQ_MMC_BA + SDHC_SYSAD, + XILINX_ZYNQ_DMA_ADDR + XILINX_ZYNQ_SDMA_BOUNDARY_SIZE); + + wait_for_block_count(qts, 0); + + qtest_memread(qts, XILINX_ZYNQ_DMA_ADDR, actual, + XILINX_ZYNQ_SDMA_TRANSFER_SIZE); + g_assert_cmpmem(actual, XILINX_ZYNQ_SDMA_TRANSFER_SIZE, + expected, XILINX_ZYNQ_SDMA_TRANSFER_SIZE); + + g_free(expected); + g_free(actual); + qtest_quit(qts); +} + +static void drive_destroy(void) +{ + unlink(sd_path); + g_free(sd_path); +} + +static void drive_create(void) +{ + int fd; + int ret; + GError *error =3D NULL; + + fd =3D g_file_open_tmp("xilinx-zynq-sdhci.XXXXXX", &sd_path, &error); + if (fd =3D=3D -1) { + fprintf(stderr, "unable to create sdhci file: %s\n", error->messag= e); + g_error_free(error); + } + g_assert_nonnull(sd_path); + + ret =3D ftruncate(fd, XILINX_ZYNQ_TEST_IMAGE_SIZE); + g_assert_cmpint(ret, =3D=3D, 0); + close(fd); +} + +int main(int argc, char **argv) +{ + int ret; + + drive_create(); + + g_test_init(&argc, &argv, NULL); + qtest_add_func("xilinx-zynq-sdhci/sdma/read-boundary-continue", + test_read_sdma_boundary_continue); + + ret =3D g_test_run(); + drive_destroy(); + return ret; +} --=20 2.43.0