From nobody Tue Feb 10 02:44:55 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1770010972; cv=none; d=zohomail.com; s=zohoarc; b=frTW39xrELJZuTxNIAmqjamDbHdk13MxTfBlK+0KQCoruntt6Wr90nlm4ssc6avwj2kfdd6td4rhyOHYYoDvQiyGVIXZ9BtSVke1aYYrSyNky29XprJXtp9wk7IX80oo0moCYgdafiMnVo2OHOQ6AURdCxquIigtp0mPjX2IatQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1770010972; 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=+iDOixNWGXe//eYSxb/EkDkyE8fD6B5hJmT9PeOp5xY=; b=AlKpMGiz3oRsyi+Zgkq9+CGMj1Lr8B+sRK7ylkDYdlitJ6FjMg2Va4cSPLRjtmVKZYLQvMLn3r0TxkKjS/XMbPENGr1No6S2MWiEyCb2rw0L+2W7d9VqZ1koza9PNrDdKo59DUTm/GGLuUdp+HIH8q/MLgfyKlCRlF4TrfKQIpw= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1770010972796496.28995347883495; Sun, 1 Feb 2026 21:42:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vmmh3-0003wA-AY; Mon, 02 Feb 2026 00:41:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vmmgz-0003uK-S7 for qemu-devel@nongnu.org; Mon, 02 Feb 2026 00:41:46 -0500 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vmmgy-0003zd-5q for qemu-devel@nongnu.org; Mon, 02 Feb 2026 00:41:45 -0500 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2a9004e4239so4775205ad.0 for ; Sun, 01 Feb 2026 21:41:43 -0800 (PST) Received: from jeuk-MS-7D42.. ([175.119.5.143]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-353f610266esm17804018a91.4.2026.02.01.21.41.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Feb 2026 21:41:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770010902; x=1770615702; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+iDOixNWGXe//eYSxb/EkDkyE8fD6B5hJmT9PeOp5xY=; b=Y8DvHY21yTLZU+qwjSzqBWhfjFnoz/SAi6d/c0gOjtbHowCP1R4rKQjFnls2II1Zaj 0515Jek73rz0RmVMtkakGi5sJ+V9zO+JYxwmGjQLOGUSk1YpbxMw9L+gFyZ3yQs2BF4v PKzd8IZnKXXmm6eLTurlSNZktvqY3TMwYwRQANK6qEzE6t67Yppze+w3OZtnsIlz40NK sOEYHyR6Qml7mp9nSEOd4fTXRvgEUhaaJlt27F/tqksm3ylIbP3/qC9A4B+FMiLyUeSx zXJMqnPQRa9KIOzjz1/Zg1BjliiBE8PRlrLZ80ntUT6x9Crdltb/A0FtehWvvqCPARI/ ZNLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770010902; x=1770615702; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+iDOixNWGXe//eYSxb/EkDkyE8fD6B5hJmT9PeOp5xY=; b=W7/CwHwFWJZU87Lnhqj/b8h6TjzP6NnAUrHw0kP6cL0h6UWZBqYVeXmn/QbEgeQe2F jt/VVC9VCyQ8m0PSY6TnOqC6gGljh8lUJcPwT/mJkwYj17yPVWd4AHNW2pzWaITYPSqG xG9ZDC0MLrnfV9HbB2HitM5M9kjIS4Taa276rw3rh8phi2VARK3EIgxXhDaQuSDgBqvX o/1pCWxl0KVSDEln8p7MSa+35I7g9y0PTicY5wrI3sWHvywTSTc+RqffvfenfgP1yKkU iiUJWPUYSgVbpS94kyikMwh+Emaeg0SzSyNSnsM+51bpQ3hizSyOMgMl0YnF7jYjSygj 4t3g== X-Gm-Message-State: AOJu0YzCKy8t1t6u6y4CiV7ZcLq936e0Mcqp62f8t6jTQafpGJ/Kg3w0 OfWkUGtLJ8ZI23SByyblZmasG7Ot/8GqkI9gSNFKn45QvKgby1EL0qo/avt63w== X-Gm-Gg: AZuq6aLG5WPeNCRLab9nx4mPLRE/8KASfUqYJWRPyFhZ7+ojCH/9ZD2hqMiNNoyMGnU RDgUOJEROP8okl3kZ41nXUolYWmdbKhEm8uTQ43rAkayM6jJOKgUGh7Rcd/sw8eJwkVYgFIFaSL 7UFGVLxkM18/xZCH+4PoYxuGiqBjb7kufTcH7HQFMM5i+edAbKvC0od94vyIP8rTnPhSUCxXPKH 8cH7IvOTfmvZlFz+HbRBiQskjtLV3lewq0aGFr3gP9uesCYDzFFL5y9QbIU9utwU9YHFC0OA1Dl sc95CIpR5Hwnkpa+fU+oos/lBMdbcMMNk3PwQfo9oNqVpccLr8D+Jom6Co97mwr2Hrgj4Mq2aew m/rSLlYDRCvgHB57UR7y27l94Dvr7hRALPu4OboGi9t8+0U0s/bxOazJc9l48mC0GJDazr8vL5C leduKDt+p/DyTxpw== X-Received: by 2002:a17:903:3b51:b0:2a7:80bf:3131 with SMTP id d9443c01a7336-2a8d9a7b928mr72828965ad.58.1770010901607; Sun, 01 Feb 2026 21:41:41 -0800 (PST) From: Jeuk Kim To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, jeuk20.kim@samsung.com, qemu-block@nongnu.org, j-young.choi@samsung.com, Ilia Levi , Fabiano Rosas Subject: [PULL v2 4/4] tests/qtest/ufs-test: Add test for mcq completion queue wraparound Date: Mon, 2 Feb 2026 14:41:14 +0900 Message-ID: <94e72135d4d657d672561b1ae02a5854421616a7.1770010668.git.jeuk20.kim@samsung.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::633; envelope-from=jeuk20.kim@gmail.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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 @gmail.com) X-ZM-MESSAGEID: 1770010975185154100 Content-Type: text/plain; charset="utf-8" From: Ilia Levi Added a test that sends 32 NOP Out commands asynchronously. Since the CQ has 31 entries by default, this tests the scenario where CQ processing needs to wait for space to become available. Additionally, added two minor fixes to existing tests: * advance CQ head after reading from CQ * initialize command descriptor slots bitmap in ufs_init() Signed-off-by: Ilia Levi Acked-by: Fabiano Rosas Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- tests/qtest/ufs-test.c | 126 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/tests/qtest/ufs-test.c b/tests/qtest/ufs-test.c index 8cfdc41d3c..7f99944155 100644 --- a/tests/qtest/ufs-test.c +++ b/tests/qtest/ufs-test.c @@ -167,6 +167,7 @@ __ufs_send_transfer_request_mcq(QUfs *ufs, uint8_t lun, cqhp =3D ufs_rreg(ufs, ufs->cqdao[TEST_QID]); cqentry_addr =3D ufs->cqlba[TEST_QID] + cqhp; qtest_memread(ufs->dev.bus->qts, cqentry_addr, &cqentry, sizeof(cqentr= y)); + cqhp =3D (cqhp + sizeof(UfsCqEntry)) % (QUEUE_SIZE * sizeof(UfsCqEntry= )); ufs_wreg(ufs, ufs->cqdao[TEST_QID], cqhp); =20 return cqentry.status; @@ -209,6 +210,81 @@ static enum UtpOcsCodes ufs_send_nop_out(QUfs *ufs, Ut= pUpiuRsp *rsp_out) return ret; } =20 +static bool ufs_mcq_sq_has_space(QUfs *ufs) +{ + uint32_t sqhp =3D ufs_rreg(ufs, ufs->sqdao[TEST_QID]); + uint32_t sqtp =3D ufs_rreg(ufs, ufs->sqdao[TEST_QID] + 0x4); + uint32_t next_sqtp =3D + (sqtp + sizeof(UfsSqEntry)) % (QUEUE_SIZE * sizeof(UfsSqEntry)); + return next_sqtp !=3D sqhp; +} + +static void +__ufs_send_transfer_request_mcq_async(QUfs *ufs, uint8_t lun, + const UtpTransferReqDesc *utrd) +{ + uint32_t sqtp; + uint64_t utrd_addr; + + /* Wait for SQ space */ + while (!ufs_mcq_sq_has_space(ufs)) { + qtest_clock_step(ufs->dev.bus->qts, 100); + } + + sqtp =3D ufs_rreg(ufs, ufs->sqdao[TEST_QID] + 0x4); + utrd_addr =3D ufs->sqlba[TEST_QID] + sqtp; + qtest_memwrite(ufs->dev.bus->qts, utrd_addr, utrd, sizeof(*utrd)); + sqtp =3D (sqtp + sizeof(UfsSqEntry)) % (QUEUE_SIZE * sizeof(UfsSqEntry= )); + ufs_wreg(ufs, ufs->sqdao[TEST_QID] + 0x4, sqtp); +} + +static int ufs_mcq_send_nop_out_async(QUfs *ufs) +{ + int cmd_desc_slot =3D alloc_cmd_desc_slot(ufs); + uint64_t req_upiu_addr =3D + ufs->cmd_desc_addr + cmd_desc_slot * UTP_COMMAND_DESCRIPTOR_SIZE; + + /* Build up request upiu */ + UtpUpiuReq req_upiu =3D { 0 }; + req_upiu.header.trans_type =3D UFS_UPIU_TRANSACTION_NOP_OUT; + req_upiu.header.task_tag =3D cmd_desc_slot; + qtest_memwrite(ufs->dev.bus->qts, req_upiu_addr, &req_upiu, + sizeof(req_upiu)); + + /* Build up utp transfer request descriptor */ + UtpTransferReqDesc utrd =3D + ufs_build_req_utrd(req_upiu_addr, UFS_UTP_NO_DATA_TRANSFER, 0); + + /* Send Transfer Request */ + __ufs_send_transfer_request_mcq_async(ufs, 0, &utrd); + + return cmd_desc_slot; +} + +static int ufs_mcq_poll_cq(QUfs *ufs, UfsCqEntry *cqe, uint16_t n_cqe) +{ + uint32_t cqhp, cqtp; + uint64_t cqe_addr; + int ix =3D 0; + + cqhp =3D ufs_rreg(ufs, ufs->cqdao[TEST_QID]); + cqtp =3D ufs_rreg(ufs, ufs->cqdao[TEST_QID] + 0x4); + + while (cqhp !=3D cqtp && ix < n_cqe) { + /* read completion entry */ + cqe_addr =3D ufs->cqlba[TEST_QID] + cqhp; + qtest_memread(ufs->dev.bus->qts, cqe_addr, &cqe[ix], sizeof(cqe[ix= ])); + + /* advance completion queue head pointer */ + cqhp =3D (cqhp + sizeof(UfsCqEntry)) % (QUEUE_SIZE * sizeof(UfsCqE= ntry)); + ix++; + } + + ufs_wreg(ufs, ufs->cqdao[TEST_QID], cqhp); + + return ix; +} + static enum UtpOcsCodes ufs_send_query(QUfs *ufs, uint8_t query_function, uint8_t query_opcode, uint8_t idn, uint8_t index, uint8_t selector, @@ -417,6 +493,7 @@ static void ufs_init(QUfs *ufs, QGuestAllocator *alloc) ufs_wreg(ufs, A_UTRIACR, 0); =20 /* Enable transfer request */ + bitmap_zero(ufs->cmd_desc_bitmap, UFS_MAX_CMD_DESC); ufs->cmd_desc_addr =3D guest_alloc(alloc, UFS_MAX_CMD_DESC * UTP_COMMAND_DESCRIPTOR_SIZE); ufs->data_buffer_addr =3D @@ -680,6 +757,53 @@ static void ufstest_read_write(void *obj, void *data, = QGuestAllocator *alloc) ufs_exit(ufs, alloc); } =20 +static void ufstest_mcq_cq_wraparound(void *obj, void *data, + QGuestAllocator *alloc) +{ + QUfs *ufs =3D obj; + UfsCqEntry cqe[QUEUE_SIZE]; + const int num_requests =3D QUEUE_SIZE; + int i, completed =3D 0; + + ufs_init(ufs, alloc); + + /* Ensure MCQ is supported */ + g_assert_true(ufs->support_mcq); + + for (i =3D 0; i < num_requests; ++i) { + ufs_mcq_send_nop_out_async(ufs); + } + + while (completed !=3D num_requests) { + int n_cqe =3D ufs_mcq_poll_cq(ufs, cqe, ARRAY_SIZE(cqe)); + if (!n_cqe) { + break; + } + + for (i =3D 0; i < n_cqe; ++i) { + uint64_t ucdba; + uint64_t rsp_upiu_addr; + UtpUpiuRsp rsp_upiu; + uint8_t tag; + + g_assert_cmpuint(cqe[i].status, =3D=3D, UFS_OCS_SUCCESS); + + ucdba =3D le64_to_cpu(cqe[i].utp_addr) & MAKE_64BIT_MASK(7, 57= ); + rsp_upiu_addr =3D ucdba + UTP_RESPONSE_UPIU_OFFSET; + qtest_memread(ufs->dev.bus->qts, rsp_upiu_addr, &rsp_upiu, + sizeof(rsp_upiu)); + + tag =3D rsp_upiu.header.task_tag; + release_cmd_desc_slot(ufs, tag); + } + + completed +=3D n_cqe; + } + + g_assert_cmpint(completed, =3D=3D, num_requests); + ufs_exit(ufs, alloc); +} + static void ufstest_query_flag_request(void *obj, void *data, QGuestAllocator *alloc) { @@ -1130,6 +1254,8 @@ static void ufs_register_nodes(void) qos_add_test("init", "ufs", ufstest_init, NULL); qos_add_test("legacy-read-write", "ufs", ufstest_read_write, &io_test_= opts); qos_add_test("mcq-read-write", "ufs", ufstest_read_write, &mcq_test_op= ts); + qos_add_test("mcq-cq-wraparound", "ufs", ufstest_mcq_cq_wraparound, + &mcq_test_opts); qos_add_test("query-flag", "ufs", ufstest_query_flag_request, &io_test_opts); qos_add_test("query-attribute", "ufs", ufstest_query_attr_request, --=20 2.43.0