From nobody Thu Oct 22 19:24:53 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=1791802756; cv=none; d=zohomail.com; s=zohoarc; b=K9LDseijoQkpwEJLjuIt6Iapowp255npjES/ebf+/ELGhYhyC5LpD+PP8bpe1o0oMCgFyN4mJ6AWDZshi9v+JAMWjyd8xyNXPXhy2nu2jBGZoB7k45WenLbeIEdvzWNt8mci4X5hY1JQzR0234gSKCHdmVVWExDp91HKWCGZYs8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791802756; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ecy/dAmBmlUUJNwI7R0zMatOFewvkTQ2mkggnhbfvX8=; b=eH4p8yizowLZ8b9I8JD1VLWWt4iQOatneK3tKf+rP8zOE0WvVEmAhryrVOdh4n7cWixd1HR+wx7g4b2OnCfEV5DQzGNlLnP/Zdl+zdzHdZp7bFJGwT91BC+rXQXz0rCd7lp4O7rJFBAKjyRy+F8o38tTCvcFdR9DbmEwlDekSTA= 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 1791802756923492.0560828401725; Mon, 12 Oct 2026 03:59:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xGDjt-0005fb-8d; Mon, 12 Oct 2026 06:58:41 -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 1xGDje-0005cb-K8 for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:26 -0400 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xGDjc-0000vI-Sr for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:26 -0400 Received: by mail-pg1-x52f.google.com with SMTP id 41be03b00d2f7-ccca948203aso547746a12.3 for ; Mon, 12 Oct 2026 03:58:24 -0700 (PDT) Received: from jeuk-MS-7D42.. ([211.226.54.223]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2e84219e6aasm41220305ad.18.2026.10.12.03.58.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 03:58:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791802703; x=1792407503; 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:content-type; bh=ecy/dAmBmlUUJNwI7R0zMatOFewvkTQ2mkggnhbfvX8=; b=fdW0DFEu7Oy6tO23KE6DsNflwL9qlITj++sfmuTt70zuIvKHfKMWtBUQbJvpINeHVD ECChMuITscO6ZrbYtHTm8Ixcgz8XTanHOsmgPcSoVt8dTbt6XFyI9ZJWRfvrma+szx+o SjD8GBb+j3NmH9ah6d0y37WG40iannGW6TddJAVUFpQJWwHmMnma6zVGTBdzbtNWzOfG H8sarnDSYaCaq9y8MQlv9spwRugFJudzxTLTfV/hSUJtJRusRFq0zUscmEl5+7z91Sdt lPTL5WnQ1Miyamk2AV6VaT5JPdV0+gt4g0TS2I6HM4tQ8ho6tOD6Gpk8WzE7ytYRcD04 F4xQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791802703; x=1792407503; 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:content-type; bh=ecy/dAmBmlUUJNwI7R0zMatOFewvkTQ2mkggnhbfvX8=; b=mDiNvuGwZC9s6/E7jS4qZDYyRXGFzXCKNq8yqti3KGxk34d39arzC+fUvrMZA2u/Ik 74S/oX4mY7Jy9NNInH/Vrl0R5pax7MZ82cKbCxn5txHvVWbz+x/DI9S63OwjOn/O0xzV d15RuvGMlSmj/l6Ru6cT70wJMpkipXab5sgAY03yEUrgPp0mpiWu228rO2uOolBA4OM/ w0BNy1NHFd+0EFbIDZZ26Z/75zaf4VheFtxxD/TVrkP2Zh+wyPUd9uHpHJ9fBF9xjFRE EUom409etCQHKYuJM5TIsCcP4ivq6i+/ulVt7wBMQlw7tCAnC4dokSRa39/Ivjsu83/v dZOw== X-Gm-Message-State: AFq9FYK4aZJoVvp0qv5PlyWi8E2GFvZdwv2W7MN6f2USLvmprT3qrzF9 p+k1LcDLxUw/MaKymp/8nwr2Ox1+o9XDwSC85MnjY6IK1mSyUCLMYZimLiIxZw== X-Gm-Gg: AYBFou3mqcjyo5n61Sux9fZIRD7/ub84yt3bXqlNeoqz4BrTBd0r5HJP56kjsbzC8s3 plpNQjWVGVFCl3xzMkiggWLNvxb1vWXLEG7kFlxcyC9esjeK+O+x7QO+nA0p458CY7Lly5I1say DGsyeD64jGZlbiPh5W+MG214/gNLV/xLgaa0718hn3kZRQD6BVwKhgqPmKNlR2WsLJ2r0fNGcqk M9XLjRgntEnIJ/4l1tUfXO5FzjLFcEGf+N5a84BvTCtHaey4XizC+WEY2W51lunZhfvO19QeYlY or6V2wRomKYC3TQP+GsouCjVAyapzcNzyWdS6WjqqxTc99cZMFhqTIULPSEywvZJzeiv9Gp2xE5 6VKCtkexKbiVAsdBXwlicmSyl2Hxq3LkbzZ3rbV3SdCXFWLfMR+bR7kAAsIb34Hej+ZncRBUgHK BvYU7OK63aquUoiSWhNnip5NGggF6N3X+TZaYU41xTQfeTIM5v9pHSzdzdQdtY4EM9qPixgtmPh jM= X-Received: by 2002:a17:902:e5c1:b0:2d3:716e:e2ae with SMTP id d9443c01a7336-2e8427f762emr79594495ad.6.1791802703014; Mon, 12 Oct 2026 03:58:23 -0700 (PDT) From: Jeuk Kim To: qemu-devel@nongnu.org, richard.henderson@linaro.org Cc: stanleyjhu@google.com, pierrick.bouvier@oss.qualcomm.com, kwolf@redhat.com, hreitz@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, jeuk20.kim@samsung.com, j-young.choi@samsung.com Subject: [PULL 1/5] hw/ufs: Track SCSIRequest and cancel pending requests in ufs_clear_req Date: Mon, 12 Oct 2026 19:58:03 +0900 Message-ID: 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52f; envelope-from=jeuk20.kim@gmail.com; helo=mail-pg1-x52f.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=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 @gmail.com) X-ZM-MESSAGEID: 1791802758949158500 Content-Type: text/plain; charset="utf-8" From: Stanley Jhu Existing callers of ufs_clear_req() only invoke it after requests are no longer in flight. In preparation for Task Management Request (TMR) task abort and MCQ queue cleanup support, where individual in-flight requests are aborted without purging the entire SCSI device, track the active SCSIRequest in UfsRequest and cancel any pending request via scsi_req_cancel() in ufs_clear_req(). Signed-off-by: Stanley Jhu Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- hw/ufs/lu.c | 8 ++++++++ hw/ufs/ufs.c | 6 ++++++ hw/ufs/ufs.h | 1 + 3 files changed, 15 insertions(+) diff --git a/hw/ufs/lu.c b/hw/ufs/lu.c index bdb16508512..5905c49fac9 100644 --- a/hw/ufs/lu.c +++ b/hw/ufs/lu.c @@ -173,6 +173,9 @@ static void ufs_scsi_command_complete(SCSIRequest *scsi= _req, size_t resid) int16_t status =3D scsi_req->status; uint32_t transfered_len =3D scsi_req->cmd.xfer - resid; =20 + assert(req !=3D NULL); + req->sreq =3D NULL; + /* WB / HID accounting should only happen for successful commands */ if (status =3D=3D GOOD) { ufs_wb_process_write_req(req, transfered_len); @@ -190,6 +193,10 @@ static void ufs_scsi_command_complete(SCSIRequest *scs= i_req, size_t resid) =20 static void ufs_scsi_command_cancelled(SCSIRequest *scsi_req) { + UfsRequest *req =3D scsi_req->hba_private; + + assert(req !=3D NULL); + req->sreq =3D NULL; scsi_req->hba_private =3D NULL; scsi_req_unref(scsi_req); } @@ -389,6 +396,7 @@ static UfsReqResult ufs_process_scsi_cmd(UfsLu *lu, Ufs= Request *req) SCSIRequest *scsi_req =3D scsi_req_new(lu->scsi_dev, task_tag, lu->lun, req->req_upiu.sc.cdb, UFS_CDB_SIZE, req); + req->sreq =3D scsi_req; =20 uint32_t len =3D scsi_req_enqueue(scsi_req); if (len) { diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c index 3c4d7424dae..adae6639e16 100644 --- a/hw/ufs/ufs.c +++ b/hw/ufs/ufs.c @@ -2221,6 +2221,12 @@ void ufs_complete_req(UfsRequest *req, UfsReqResult = req_result) =20 static void ufs_clear_req(UfsRequest *req) { + if (req->sreq !=3D NULL) { + SCSIRequest *sreq =3D req->sreq; + req->sreq =3D NULL; + scsi_req_cancel(sreq); + } + if (req->sg !=3D NULL) { qemu_sglist_destroy(req->sg); g_free(req->sg); diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h index 6f2693b7ca2..265a43faaa6 100644 --- a/hw/ufs/ufs.h +++ b/hw/ufs/ufs.h @@ -60,6 +60,7 @@ typedef struct UfsRequest { UtpUpiuRsp rsp_upiu; =20 /* for scsi command */ + SCSIRequest *sreq; QEMUSGList *sg; uint32_t data_len; =20 --=20 2.43.0 From nobody Thu Oct 22 19:24:53 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=1791802775; cv=none; d=zohomail.com; s=zohoarc; b=TD6b8GL2xQUfn2y16QRYkArwqRaVfW8mwZwT+LFek8xwHI4JHfUTyMCKCBu+qMR1CU/jc3U3X9GP7ksYIECkN5fc2g/zawkF0pjNLANKwcbsFC+Nit8L2xKLoA68WvrgT1CQyrJ6LJy+0ksEQuCx2NkumhphLVbAXanROIyzXAU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791802775; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7V3jOPRB/kiA2idBqkKjY+LkhnYmwzQx/7a+A3ZswXA=; b=nxUG2pEgpV58VKRUglTkH2+mxTM1ob+r78nptSXEfjYR9awboVletRfc9wcSzW6klFL1sgRAhlnsbkIQ7eB2p6ueK9OmYi72/jZQGv0+9FqAzuR38ywp6ojA2tUjC52S2Aok0Egsb2Lowds7x3zoph1QVlRntyl37v9ni6tprys= 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 1791802775739706.9585054917427; Mon, 12 Oct 2026 03:59:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xGDjo-0005dz-6H; Mon, 12 Oct 2026 06:58:36 -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 1xGDji-0005dG-1l for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:30 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xGDjg-0000w0-4v for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:29 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-2e8b20a899fso4463055ad.1 for ; Mon, 12 Oct 2026 03:58:27 -0700 (PDT) Received: from jeuk-MS-7D42.. ([211.226.54.223]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2e84219e6aasm41220305ad.18.2026.10.12.03.58.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 03:58:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791802706; x=1792407506; 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:content-type; bh=7V3jOPRB/kiA2idBqkKjY+LkhnYmwzQx/7a+A3ZswXA=; b=jwFa06YvZYBUvQChF6jYTdkgj7i7RFh7W53AR3PrlxYmOl2pv7othBoPHiKja/0Xjo kU5u/P/gJSsqzzm0WMAQ13t6eLWqN8UZN2Hj4MOBge2jU0PE1wPS/CamGRChqTVDF15V 7sjUvKWpxYzxTqyBg98HAleHipf9V08V4tmImlJK4f2eXMK2JjVR7pWae9h3/DFDV/zX sbMJ/Wuz+8CGvriSuNSnoLtbTj62NUDZGSs3t3v9gAr0hLvgsuMnF9L5xGfYSoztes4z G0aEsehX+rq9QySQrcdCEQDGxrzqo3P1fT8YUbSz2SbEEeVvzyunrDT+swyjiJwU6arH fO9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791802706; x=1792407506; 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:content-type; bh=7V3jOPRB/kiA2idBqkKjY+LkhnYmwzQx/7a+A3ZswXA=; b=dOmiTxXbWOcOYXIJ3f+qN4AcGaoPa3aHj1H22PjkoC6QLfq0cmA2MH/T8Fo3vXlKbQ tyt9m+zHcf08XHMvVpLswR/Fv3Fi2lDqthHFRf2ZpGzpeeYGh6jKQuKRi0cj/Wn1Jac9 AgaR1du/zP3JWopQEXx33tGfJh/Mlwui6NRq850OLRnNgUoJYxOw+k65t2QQUbxh34Of QYPEDpYzhYe1tKK5bpix3Rq2DNW9pS7JByWHAh57MooupS5a2H0V0/l4sSayGndBrfgQ r2vCROh/gjYmbM0kdWzwLzIzoqi4MilymNH0BLDTBb1bR3MKagUNkCAZ5PwGwN7QFu+4 Bx3g== X-Gm-Message-State: AFq9FYKzPGdUIxUgkt+zRdcMD8k83qnUcITc6Yiw67Bnv47JDaI+SRfM JFg2EBB9arjjTtPW5MEPOwR85HKa5R6Rqi4wIH697vx7NXRCcpQdDChy1WLpvQ== X-Gm-Gg: AYBFou3VLLHh7XxjIvccG8TWCsKTf7Xc2sV9FPChXP2h5qHtBhOrmZR26/jmqdkFJux 4RNA3wYeZ+VVwg/mtUX/nHBLA/4dbP1PU20YR0sL6D0t7pQQ29g9TS3qxxCN9ipkMgY8dqdV9oP 3vgZLnqPSbx62TXQ4b+5oZhRSeBR38ZDKD+b3ZdzEPEt5/WlXviPpxKSnbN5HLPNsG0+IKyuV0r +VYQThKnvayAALNTZ8FdiEKztFkrwNJQJgr+PeUfzBzNWNk3SRb/Fav1PLHJmNLQ+vrE5CEq/GF psoW0qaUQhyxLelD9XEqO3SKYByXhkBub7rkQq7RN8hZdo/h9yWQH223JdDWwQYJuKno4o620zx hUa4K0L0hy4watcbrPbR8iZ9jXnK8rTkPEx2tv2SIFCnTcpXLcTLf6oxE1zOhbgrIY7YGQBKYnb KImMFeJPL00hnN656OoMezBwW/ZTZTS1NaqjLvW+C8Ae0N/E89oReYTOJri1GW523DDfk/5FRGk 78= X-Received: by 2002:a17:903:41cf:b0:2dd:ad74:6d16 with SMTP id d9443c01a7336-2e842ab68efmr86529855ad.28.1791802706189; Mon, 12 Oct 2026 03:58:26 -0700 (PDT) From: Jeuk Kim To: qemu-devel@nongnu.org, richard.henderson@linaro.org Cc: stanleyjhu@google.com, pierrick.bouvier@oss.qualcomm.com, kwolf@redhat.com, hreitz@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, jeuk20.kim@samsung.com, j-young.choi@samsung.com Subject: [PULL 2/5] hw/ufs: Support MCQ runtime interrupt and queue status registers Date: Mon, 12 Oct 2026 19:58:04 +0900 Message-ID: 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=jeuk20.kim@gmail.com; helo=mail-pl1-x62b.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, T_PDS_OTHER_BAD_TLD=0.01 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: 1791802777410158500 Content-Type: text/plain; charset="utf-8" From: Stanley Jhu Implement Multi-Circular Queue (MCQ) runtime operational registers (SQnRTC, SQnRTS, SQnCTI, SQnIS/IE, CQnIS/IE, CQnIACR) per JEDEC UFSHCI: - Handle SQRTC.STOP transitions (0 -> 1 stop and 1 -> 0 resume) and SQRTC.ICU cleanup using Submission Queue Cleanup Task Information (SQCTI). Immediately clear SQRTS.CUS and SQRTS.RTC on ICU =3D 1, post a CQE with OCS =3D UFS_OCS_ABORTED on an active matching task, and set SQRTS.CUS =3D 1 with SQRTS.RTC =3D 0 (success), 1 (task not found), 2 (SQ not stopped), or 3 (SQ disabled). - Implement write-1-to-clear per-queue interrupt status (SQnIS, CQnIS) and synchronize the global IS.CQES bit. Signed-off-by: Stanley Jhu Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- hw/ufs/trace-events | 1 + hw/ufs/ufs.c | 112 +++++++++++++++++++++++++++++++++++++++++++- include/block/ufs.h | 15 ++++++ 3 files changed, 126 insertions(+), 2 deletions(-) diff --git a/hw/ufs/trace-events b/hw/ufs/trace-events index 922293355b2..d8173b12b6c 100644 --- a/hw/ufs/trace-events +++ b/hw/ufs/trace-events @@ -14,6 +14,7 @@ ufs_process_uiccmd(uint32_t uiccmd, uint32_t ucmdarg1, ui= nt32_t ucmdarg2, uint32 ufs_mcq_complete_req(uint8_t qid) "sqid %"PRIu8"" ufs_mcq_create_sq(uint8_t sqid, uint8_t cqid, uint64_t addr, uint16_t size= ) "mcq create sq sqid %"PRIu8", cqid %"PRIu8", addr 0x%"PRIx64", size %"PRI= u16"" ufs_mcq_create_cq(uint8_t cqid, uint64_t addr, uint16_t size) "mcq create = cq cqid %"PRIu8", addr 0x%"PRIx64", size %"PRIu16"" +ufs_write_mcq_op_reg(uint8_t qid, uint32_t offset, uint32_t data) "qid %"P= RIu8", offset 0x%"PRIx32", data 0x%"PRIx32"" ufs_hce_reset(void) "HCE 1 -> 0 reset: cancelling BHs, resetting MCQ and r= equest lists" =20 # error condition diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c index adae6639e16..956ef9c878e 100644 --- a/hw/ufs/ufs.c +++ b/hw/ufs/ufs.c @@ -446,13 +446,14 @@ static void ufs_mcq_process_sq(void *opaque) { UfsSq *sq =3D opaque; UfsHc *u =3D sq->u; + UfsMcqOpReg *opr =3D &u->mcq_op_reg[sq->sqid]; UfsSqEntry sqe; UfsRequest *req; hwaddr addr; uint16_t head =3D ufs_mcq_sq_head(u, sq->sqid); int err; =20 - if (u->resetting) { + if (u->resetting || FIELD_EX32(opr->sq.rts, SQRTS, STS)) { return; } =20 @@ -536,6 +537,7 @@ static void ufs_mcq_process_cq(void *opaque) } =20 ufs_clear_req(req); + req->state =3D UFS_REQUEST_IDLE; QTAILQ_INSERT_TAIL(&req->sq->req_list, req, entry); } =20 @@ -970,6 +972,56 @@ static void ufs_mcq_process_db(UfsHc *u, uint8_t qid, = uint32_t db) qemu_bh_schedule(sq->bh); } =20 +static void ufs_mcq_sq_cleanup(UfsHc *u, uint8_t qid) +{ + UfsMcqOpReg *opr =3D &u->mcq_op_reg[qid]; + UfsSq *sq =3D u->sq[qid]; + uint8_t task_tag =3D FIELD_EX32(opr->sq.cti, SQCTI, TASK_TAG); + uint8_t lun =3D FIELD_EX32(opr->sq.cti, SQCTI, LUN); + UfsRequest *req =3D NULL; + uint8_t rtc; + + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, CUS, 0); + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, RTC, 0); + + if (!sq) { + rtc =3D 3; + } else if (!FIELD_EX32(opr->sq.rts, SQRTS, STS)) { + rtc =3D 2; + } else { + for (int i =3D 0; i < sq->size; i++) { + UfsRequest *candidate =3D &sq->req[i]; + if ((candidate->state =3D=3D UFS_REQUEST_RUNNING || + candidate->state =3D=3D UFS_REQUEST_ERROR) && + candidate->req_upiu.header.task_tag =3D=3D task_tag && + candidate->req_upiu.header.lun =3D=3D lun) { + req =3D candidate; + break; + } + } + + if (req) { + if (req->sreq !=3D NULL) { + SCSIRequest *sreq =3D req->sreq; + req->sreq =3D NULL; + scsi_req_cancel(sreq); + } + req->utrd.header.dword_2 =3D cpu_to_le32( + (le32_to_cpu(req->utrd.header.dword_2) & ~UFS_MASK_OCS) | + UFS_OCS_ABORTED); + req->state =3D UFS_REQUEST_COMPLETE; + QTAILQ_INSERT_TAIL(&sq->cq->req_list, req, entry); + ufs_mcq_process_cq(sq->cq); + rtc =3D 0; + } else { + rtc =3D 1; + } + } + + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, CUS, 1); + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, RTC, rtc); +} + static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr offset, uint32_t data, unsigned size) { @@ -983,6 +1035,9 @@ static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr offs= et, uint32_t data, =20 opr =3D &u->mcq_op_reg[qid]; =20 + trace_ufs_write_mcq_op_reg(qid, (uint32_t)(offset % sizeof(UfsMcqOpReg= )), + data); + switch (offset % sizeof(UfsMcqOpReg)) { case offsetof(UfsMcqOpReg, sq.tp): if (opr->sq.tp !=3D data) { @@ -990,6 +1045,40 @@ static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr off= set, uint32_t data, } opr->sq.tp =3D data; break; + case offsetof(UfsMcqOpReg, sq.rtc): { + bool prev_stop =3D FIELD_EX32(opr->sq.rtc, SQRTC, STOP); + bool new_stop =3D FIELD_EX32(data, SQRTC, STOP); + + if (!prev_stop && new_stop) { + /* SQ_STOP (0 -> 1): Stop queue */ + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, STS, 1); + if (u->sq[qid] && u->sq[qid]->bh) { + qemu_bh_cancel(u->sq[qid]->bh); + } + } else if (prev_stop && !new_stop) { + /* SQ_START (1 -> 0): Resume queue */ + opr->sq.rts =3D FIELD_DP32(opr->sq.rts, SQRTS, STS, 0); + if (u->sq[qid] && u->sq[qid]->bh) { + qemu_bh_schedule(u->sq[qid]->bh); + } + } + if (FIELD_EX32(data, SQRTC, ICU)) { + ufs_mcq_sq_cleanup(u, qid); + data =3D FIELD_DP32(data, SQRTC, ICU, 0); + } + opr->sq.rtc =3D data; + break; + } + case offsetof(UfsMcqOpReg, sq.cti): + opr->sq.cti =3D data; + break; + case offsetof(UfsMcqOpReg, sq_int.is): + opr->sq_int.is &=3D ~data; + ufs_irq_check(u); + break; + case offsetof(UfsMcqOpReg, sq_int.ie): + opr->sq_int.ie =3D data; + break; case offsetof(UfsMcqOpReg, cq.hp): { UfsCq *cq =3D u->cq[qid]; =20 @@ -1006,8 +1095,27 @@ static void ufs_write_mcq_op_reg(UfsHc *u, hwaddr of= fset, uint32_t data, ufs_mcq_update_cq_head(u, qid, data); break; } - case offsetof(UfsMcqOpReg, cq_int.is): + case offsetof(UfsMcqOpReg, cq_int.is): { + bool pending =3D false; + opr->cq_int.is &=3D ~data; + for (int i =3D 0; i < ARRAY_SIZE(u->mcq_op_reg); i++) { + if (u->mcq_op_reg[i].cq_int.is) { + pending =3D true; + break; + } + } + if (!pending) { + u->reg.is =3D FIELD_DP32(u->reg.is, IS, CQES, 0); + } + ufs_irq_check(u); + break; + } + case offsetof(UfsMcqOpReg, cq_int.ie): + opr->cq_int.ie =3D data; + break; + case offsetof(UfsMcqOpReg, cq_int.iacr): + opr->cq_int.iacr =3D data; break; default: trace_ufs_err_invalid_register_offset(offset); diff --git a/include/block/ufs.h b/include/block/ufs.h index d19b3c65ef4..b72403c478e 100644 --- a/include/block/ufs.h +++ b/include/block/ufs.h @@ -224,6 +224,21 @@ typedef struct QEMU_PACKED UfsMcqSqReg { uint32_t rts; } UfsMcqSqReg; =20 +REG32(SQRTC, offsetof(UfsMcqSqReg, rtc)) + FIELD(SQRTC, STOP, 0, 1) + FIELD(SQRTC, ICU, 1, 1) + +REG32(SQCTI, offsetof(UfsMcqSqReg, cti)) + FIELD(SQCTI, TASK_TAG, 0, 8) + FIELD(SQCTI, LUN, 8, 8) + FIELD(SQCTI, IID, 16, 4) + FIELD(SQCTI, EXT_IID, 20, 4) + +REG32(SQRTS, offsetof(UfsMcqSqReg, rts)) + FIELD(SQRTS, STS, 0, 1) + FIELD(SQRTS, CUS, 1, 1) + FIELD(SQRTS, RTC, 4, 4) + typedef struct QEMU_PACKED UfsMcqCqReg { uint32_t hp; uint32_t tp; --=20 2.43.0 From nobody Thu Oct 22 19:24:53 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=1791802746; cv=none; d=zohomail.com; s=zohoarc; b=QOl6UtlPdZoj+9vfR92h88NPySRN2dFBoAm8GrXlX1fB2LhD2mMbhnVfIG+xPMLk+BShZRBDZgq1dm0LuBQdwaer30DQRsmmBwxzQLa+j9NH9fNASVAvImSKrEYIlIUbcuBkmE1WR079nHYZSk97bOforsusug1OwweQBo8+EDY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791802746; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fwi0iXujdLHTAusPZjEirlwrKNPsdESWzCH86y8wZho=; b=a8X1Gkh9/bzBPc3Sv6hrU1n4nZSp3+u3t69RR5NzR7C9cKHDF8ajuv2UIT1Zq+f7607hLPWgVBpicIi7IPgR3He8zYTqxF1OIzFiNp1A2uWsUnUdfgVRyUf5rsUmSjRu+F6gvRAAq5myGGAxWp7q+lLuFSCXAOV/Y06VQv0ybp4= 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 1791802746003759.3592626052595; Mon, 12 Oct 2026 03:59:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xGDju-0005gh-JS; Mon, 12 Oct 2026 06:58:42 -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 1xGDjm-0005e6-Lw for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:36 -0400 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xGDji-0000wc-Ri for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:34 -0400 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2dd9ec41bc4so9196595ad.2 for ; Mon, 12 Oct 2026 03:58:30 -0700 (PDT) Received: from jeuk-MS-7D42.. ([211.226.54.223]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2e84219e6aasm41220305ad.18.2026.10.12.03.58.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 03:58:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791802709; x=1792407509; 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:content-type; bh=fwi0iXujdLHTAusPZjEirlwrKNPsdESWzCH86y8wZho=; b=m9KffEpt1K9G4XpNUlz9RkKCUcDlyerNBKtPptW9BfYcs9/s1rm6GSVh4lahwMiejp MVlWdc3w5iaEj4qfQuwVAfzVUHyjSibzX127HN0LocAqQfu+Io4HB4NdWTHpld6ncHpR 5G0AUN02S/Hkj45fUqsRYiLVgMSMDUotnYmFjudQxJzqjKbRyYerrjWfAyHf4oKPmu5L qeCh0lj/0aYx/mBUkHizSzySupxlyv3cNPZkf2kwgF6eyqjNuU/0qX5H7xp9vcOJCXew 8Shmet3WmDOD9SPJgo942zmYMt+UyaDYYwXvCkRIavSWEJ3VDS9n3B1Gk9Fx8BowkqMZ u1Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791802709; x=1792407509; 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:content-type; bh=fwi0iXujdLHTAusPZjEirlwrKNPsdESWzCH86y8wZho=; b=wI+/bx5dpkwDkdDVTG8O8B6hHOOVnQtYw5s0rTIPlLa+K3O+UNEtOIxBocNKEj2zIf Ji+XXiHZKOaChA2UWLaxyCw2F9Ywd+UL30vMTz/eqDXppwEn4BsPrafK/QwiM2XKoiqt yPZP0sm9fgMkk1ydJSmDBiBND6SYt3dUHsGvTMYgnEOrgf66a/DyZfWHWywibTiPT2Nb FPNVD8wU6PZUxc9fIqJ2h3qalFiQQ1RWTyAwpEP0lbdPDpZMtCE9R848z79ez120xB3d 5iNBxT3ka1JZCuQh/MkwShmMVMLwSYKNcZsBjxE+X12Svm/849xkI6s44iESSD7loO8q kHcA== X-Gm-Message-State: AFq9FYKTRzm3NqTNqwVi0zaM+ib19dTaburON45nbRdCSY14Mq5BAkyg Up0TRylZ+c7f0BggSYk/+TyUKNSAVkUwNIaBUI4oVISGec+yqZyHzptvg474tA== X-Gm-Gg: AYBFou03zvp/p1hjQ9JVskUenvAxG0nI+p4T5VfxZmWigR0qO9M84ZRKU1og0QqGt03 UcD5EOtJXxLJObwK8NJ9GWEUmTe0AryxXxuRx2FcyHOyUSaH5bJY/qoqj2uVACUonpoBlXKlHW1 nKaAPt7O6CMRVVAnMNAXEXSb1iDeBbeipmB4uKe0CemJgJnkckq9SGLaNwtfMRB/tYdoRDF/CQK gJcXlHxdVyVcZ3fly19LMRrcHvVVYRPFcVnbl8sivKNCUZeV6HCIOBCjsbV7cINGvM+Wcr4/fDW 49l6XKX9jMbBJ1r598eOAEJpAFhfxkTjNruZfbj4Jbp8JKcVKyRmLGEGVzAY7h3S1XkNwlsiUjZ RskgZRUmSSRVtCLARNTXQKfoIbrrHzfWkkxRf79tvFKiOYDBbuFv5UvRwSeF1BBBxUyce/Gb7C6 BWunpDXKHt7LK2+PicDQooy6Je2YOMgKxvCkhrWkuJ+bcg/cg4t7RLHH28nZhBKFfNJx/2WE8Uc BYzXHJzTZoxKys= X-Received: by 2002:a17:903:19ef:b0:2e8:b20a:88cb with SMTP id d9443c01a7336-2e8b20a89e2mr29204275ad.13.1791802709424; Mon, 12 Oct 2026 03:58:29 -0700 (PDT) From: Jeuk Kim To: qemu-devel@nongnu.org, richard.henderson@linaro.org Cc: stanleyjhu@google.com, pierrick.bouvier@oss.qualcomm.com, kwolf@redhat.com, hreitz@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, jeuk20.kim@samsung.com, j-young.choi@samsung.com Subject: [PULL 3/5] hw/ufs: Implement Task Management Request (TMR) handling Date: Mon, 12 Oct 2026 19:58:05 +0900 Message-ID: <5791c5832fead3fcbcd09592f93262477fc9fb2c.1791802312.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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::635; envelope-from=jeuk20.kim@gmail.com; helo=mail-pl1-x635.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, T_PDS_OTHER_BAD_TLD=0.01 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 @gmail.com) X-ZM-MESSAGEID: 1791802746864158500 Content-Type: text/plain; charset="utf-8" From: Stanley Jhu Implement UTP Task Management Request List (UTMRL) doorbell and TMR processing per JEDEC UFSHCI: - Support UTMRLDBR, UTMRLCLR (clear-on-zero), and UTMRLRSR registers, and gate IS.UTMRCS interrupt assertion on the UTMRD Interrupt (I) bit. - Handle UFS_QUERY_TASK and UFS_ABORT_TASK across legacy UTRL and MCQ queues, reporting overall Target Success/Failure in rsp_header.response and the TM Service Response in output_param1. For MCQ, UFS_ABORT_TASK cancels the active SCSIRequest and defers CQE posting (OCS =3D UFS_OCS_ABORTED) and slot recycling to subsequent SQRTC.ICU cleanup. - Reset UTMRLRSR on HCE reset. Signed-off-by: Stanley Jhu Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- hw/ufs/trace-events | 1 + hw/ufs/ufs.c | 133 +++++++++++++++++++++++++++++++++++++++++++- include/block/ufs.h | 1 + 3 files changed, 134 insertions(+), 1 deletion(-) diff --git a/hw/ufs/trace-events b/hw/ufs/trace-events index d8173b12b6c..5e5a54a3fb3 100644 --- a/hw/ufs/trace-events +++ b/hw/ufs/trace-events @@ -15,6 +15,7 @@ ufs_mcq_complete_req(uint8_t qid) "sqid %"PRIu8"" ufs_mcq_create_sq(uint8_t sqid, uint8_t cqid, uint64_t addr, uint16_t size= ) "mcq create sq sqid %"PRIu8", cqid %"PRIu8", addr 0x%"PRIx64", size %"PRI= u16"" ufs_mcq_create_cq(uint8_t cqid, uint64_t addr, uint16_t size) "mcq create = cq cqid %"PRIu8", addr 0x%"PRIx64", size %"PRIu16"" ufs_write_mcq_op_reg(uint8_t qid, uint32_t offset, uint32_t data) "qid %"P= RIu8", offset 0x%"PRIx32", data 0x%"PRIx32"" +ufs_process_tmr(uint8_t func, uint32_t tag, uint8_t resp) "query_func 0x%"= PRIx8", task_tag %"PRIu32", tm_resp 0x%"PRIx8"" ufs_hce_reset(void) "HCE 1 -> 0 reset: cancelling BHs, resetting MCQ and r= equest lists" =20 # error condition diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c index 956ef9c878e..4c505e0bffe 100644 --- a/hw/ufs/ufs.c +++ b/hw/ufs/ufs.c @@ -772,6 +772,7 @@ static void ufs_hce_reset(UfsHc *u) u->reg.utmrldbr =3D 0; u->reg.utrlcnr =3D 0; u->reg.utrlrsr =3D 0; + u->reg.utmrlrsr =3D 0; u->reg.is =3D 0; =20 /* 4. Free MCQ Queues and reset MCQ dynamic registers */ @@ -809,6 +810,126 @@ static void ufs_hce_reset(UfsHc *u) ufs_irq_check(u); } =20 +static UfsRequest *ufs_find_req_by_tag(UfsHc *u, uint8_t lun, uint32_t tas= k_tag) +{ + if (task_tag < u->params.nutrs) { + UfsRequest *req =3D &u->req_list[task_tag]; + if ((req->state =3D=3D UFS_REQUEST_RUNNING || + req->state =3D=3D UFS_REQUEST_READY) && + req->req_upiu.header.lun =3D=3D lun && + req->req_upiu.header.task_tag =3D=3D task_tag) { + return req; + } + } + + if (u->params.mcq) { + for (int q =3D 0; q < ARRAY_SIZE(u->sq); q++) { + UfsSq *sq =3D u->sq[q]; + if (!sq) { + continue; + } + for (int i =3D 0; i < sq->size; i++) { + UfsRequest *req =3D &sq->req[i]; + if (req->state =3D=3D UFS_REQUEST_RUNNING && + req->req_upiu.header.lun =3D=3D lun && + req->req_upiu.header.task_tag =3D=3D task_tag) { + return req; + } + } + } + } + + return NULL; +} + +static void ufs_process_tmr(UfsHc *u, uint32_t val) +{ + hwaddr base_addr =3D (((hwaddr)u->reg.utmrlbau) << 32) + u->reg.utmrlb= a; + uint32_t completed_int_mask =3D 0; + + u->reg.utmrldbr |=3D val; + + for (int i =3D 0; i < u->params.nutmrs; i++) { + if (val & (1 << i)) { + uint64_t desc_addr =3D base_addr + i * sizeof(UtpTaskReqDesc); + UtpTaskReqDesc desc; + uint8_t tm_func, tm_resp, lun; + uint32_t task_tag; + + if (ufs_addr_read(u, desc_addr, &desc, sizeof(desc))) { + continue; + } + + tm_func =3D desc.upiu_req.req_header.query_func; + lun =3D desc.upiu_req.req_header.lun; + task_tag =3D be32_to_cpu(desc.upiu_req.input_param2); + + if (tm_func =3D=3D UFS_QUERY_TASK) { + UfsRequest *req =3D ufs_find_req_by_tag(u, lun, task_tag); + + if (req) { + tm_resp =3D UFS_UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED; + } else { + tm_resp =3D UFS_UPIU_TASK_MANAGEMENT_FUNC_COMPL; + } + } else if (tm_func =3D=3D UFS_ABORT_TASK) { + UfsRequest *req =3D ufs_find_req_by_tag(u, lun, task_tag); + + if (req) { + if (ufs_mcq_req(req)) { + if (req->sreq !=3D NULL) { + SCSIRequest *sreq =3D req->sreq; + req->sreq =3D NULL; + scsi_req_cancel(sreq); + } + req->state =3D UFS_REQUEST_ERROR; + } else { + ufs_clear_req(req); + req->state =3D UFS_REQUEST_IDLE; + u->reg.utrldbr &=3D ~(1 << req->slot); + } + } + tm_resp =3D UFS_UPIU_TASK_MANAGEMENT_FUNC_COMPL; + } else { + tm_resp =3D UFS_UPIU_TASK_MANAGEMENT_FUNC_NOT_SUPPORTED; + } + + memset(&desc.upiu_rsp, 0, sizeof(desc.upiu_rsp)); + desc.header.dword_2 =3D cpu_to_le32( + (le32_to_cpu(desc.header.dword_2) & ~UFS_MASK_OCS) | + UFS_OCS_SUCCESS); + desc.upiu_rsp.rsp_header.trans_type =3D + UFS_UPIU_TRANSACTION_TASK_RSP; + desc.upiu_rsp.rsp_header.flags =3D 0; + desc.upiu_rsp.rsp_header.lun =3D desc.upiu_req.req_header.lun; + desc.upiu_rsp.rsp_header.task_tag =3D + desc.upiu_req.req_header.task_tag; + if (tm_resp =3D=3D UFS_UPIU_TASK_MANAGEMENT_FUNC_COMPL || + tm_resp =3D=3D UFS_UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED) { + desc.upiu_rsp.rsp_header.response =3D UFS_COMMAND_RESULT_S= UCCESS; + } else { + desc.upiu_rsp.rsp_header.response =3D UFS_COMMAND_RESULT_F= AIL; + } + desc.upiu_rsp.output_param1 =3D cpu_to_be32(tm_resp); + + if (ufs_addr_write(u, desc_addr, &desc, sizeof(desc))) { + continue; + } + + trace_ufs_process_tmr(tm_func, task_tag, tm_resp); + u->reg.utmrldbr &=3D ~(1 << i); + if (le32_to_cpu(desc.header.dword_0) & UFS_UTP_REQ_DESC_INT_CM= D) { + completed_int_mask |=3D (1 << i); + } + } + } + + if (completed_int_mask) { + u->reg.is =3D FIELD_DP32(u->reg.is, IS, UTMRCS, 1); + ufs_irq_check(u); + } +} + static void ufs_write_reg(UfsHc *u, hwaddr offset, uint32_t data, unsigned= size) { switch (offset) { @@ -871,10 +992,20 @@ static void ufs_write_reg(UfsHc *u, hwaddr offset, ui= nt32_t data, unsigned size) case A_MCQCONFIG: u->reg.mcqconfig =3D data; break; - case A_UTRLCLR: case A_UTMRLDBR: + if (!FIELD_EX32(u->reg.hce, HCE, HCE) || + !FIELD_EX32(u->reg.utmrlrsr, UTMRLRSR, UTMRLRSR)) { + break; + } + ufs_process_tmr(u, data); + break; case A_UTMRLCLR: + u->reg.utmrldbr &=3D data; + break; case A_UTMRLRSR: + u->reg.utmrlrsr =3D data; + break; + case A_UTRLCLR: trace_ufs_err_unsupport_register_offset(offset); break; default: diff --git a/include/block/ufs.h b/include/block/ufs.h index b72403c478e..b0515325f92 100644 --- a/include/block/ufs.h +++ b/include/block/ufs.h @@ -141,6 +141,7 @@ REG32(UTMRLBAU, offsetof(UfsReg, utmrlbau)) REG32(UTMRLDBR, offsetof(UfsReg, utmrldbr)) REG32(UTMRLCLR, offsetof(UfsReg, utmrlclr)) REG32(UTMRLRSR, offsetof(UfsReg, utmrlrsr)) + FIELD(UTMRLRSR, UTMRLRSR, 0, 1) REG32(UICCMD, offsetof(UfsReg, uiccmd)) REG32(UCMDARG1, offsetof(UfsReg, ucmdarg1)) REG32(UCMDARG2, offsetof(UfsReg, ucmdarg2)) --=20 2.43.0 From nobody Thu Oct 22 19:24:53 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=1791802764; cv=none; d=zohomail.com; s=zohoarc; b=HxYTCiu8m7dRK0be/C8CoWdPk/GLZyb91qV+jxhKkUqFEX7uGFOfa/qIaILS8GOY5yrUlvxT3VX0ba4biIjAaQ2jjW76+qYgKmZH4rXIMbF6l7/o9kZhl/v/cxyDtMNi7BYQrNJ5Mk/GsWVCmTK6VFvsTgdPUXqHqMLOAZRKmnE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791802764; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Bb/f9KYrBOEB+uAscivhZYsDn6rA989y0DzG/mE0dNM=; b=MiM6Hz8a046iDPMsLzfGh04qNQ9nLVmy6uSmyf2QtsHqCnMqNeqM0OqWY1XzT1bPkjHGOQppeKkksM3y7teBlYBWlRZY3irdEZPE4C2gwKTEGMnBrzw5Tap8E20HsXnM700drnbJTSfn3/gfOwwegOzOVBLNnSydFVRaFVrPofo= 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 1791802764458428.8919907454531; Mon, 12 Oct 2026 03:59:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xGDju-0005gi-W6; Mon, 12 Oct 2026 06:58:43 -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 1xGDjq-0005eZ-Mr for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:40 -0400 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 1xGDjm-0000x8-Ef for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:37 -0400 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2e8662d5e95so9237525ad.0 for ; Mon, 12 Oct 2026 03:58:33 -0700 (PDT) Received: from jeuk-MS-7D42.. ([211.226.54.223]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2e84219e6aasm41220305ad.18.2026.10.12.03.58.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 03:58:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791802712; x=1792407512; 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:content-type; bh=Bb/f9KYrBOEB+uAscivhZYsDn6rA989y0DzG/mE0dNM=; b=ZUP4q+iHARN5MbSBX/eMZCJdXCdPFaytrU94Y9UygExtdecneMLqnQNY1Isz3CR9sn 2qdqV/awaGXY1PKOM85LurfvtxiDwp0Klx8fUVXfOjkbghoEeeufgE+iilywt5ggGTFO RLogm3y6Py1473FJJeplVx8udqd4RS1RPfuiz6/UM9p2WDJCi4S1Rzw3Kbq2grYocDYx hT1PMgSgar0LKKlnYo5Qi8iAFJA3RJAkSQBQTc0CRRI8RJipJkWdM/mgLd1DbFO3qikv So7FnCAYEXBFanhk+YdkzEH0bWHGEnmpXMheqq+JPIWP7MjUmx5MNtzZffBgG68P08fp SmZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791802712; x=1792407512; 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:content-type; bh=Bb/f9KYrBOEB+uAscivhZYsDn6rA989y0DzG/mE0dNM=; b=dDhoCDptUSazUTL12PQwNoCfrF/8BouDN1EeyKFS2Vis95wQSNJsrmjTRw3AhHEWj9 4SXX6NwLGUWv46YOlpVKDKf3zTRc5u6YRIwzz15J5/nTcDYIIs1xC7S2pXw7oevBKSON x2dMQDfdUh9BV439T68dvEuZYeEM6ahkNWJv3oDcyNhaXyHsb++c56GDm3E8F36uqmyh CmhbRyyuJ78A8HOafH9H2c44/4g83DZsrM1v4GyFGlJkLxZvQnmOzeE/W1KF3LrbxJ9c 6Z+BwmTswW76uk6aT6tM1TI4efJ5H3fPtlAmlyUFBYmkGpNdCzZ9zcshZ9ZfkmqRWOkY Ha8A== X-Gm-Message-State: AFq9FYKByZAQ8gUbj4MB2dOhh8nK8YWo7yWeV2SCDUWJJ6BQ8ySI8VOH IW6Md+LFbvI7QLR5+gITHuRQbclb/tJjJK/gf2Bg6Td/g6nDD24JqTWqpdQTeA== X-Gm-Gg: AYBFou1vAIJmXDvp37DjmIUK7c0GqJPFVvVqeHJcvysEpm1PgqrRYKNg6scOksZaMeN Fcq0oxvOm/pWaxn8oAXWvRZIV8SXllRBiJlNJAYVUlIbUfJQNjh82xC0GPFs5KPEOgnd96aoAbH RWTHecIr+Zarlcdc0lW45OSQualmPCWxQEIGZQbaaI982u7NoJ4QyewoRLLi2xdq4CHAUg6H1LE g3oG1ixyVXC/HJKCN+OLBCLyTlpURix4WJy9iNJxG+uydbdCrk38BvpIt+qiLyMHN7uEjBaTwX9 zNVS5/w8rv2BGlKNJmNcDkthmtwwL4eMTL13ZJk0QpQXttS3YPkrc0/ev5busXf50U+WRmvWuUh sp3tJtlDV0Zr7l5PIt9zq18cflRfFapxAozWokgveAVrcY5YKmIHNoqsmVbMRfIPWco/xGAT3dJ 4kOk6yTl572pd7sii8x3QgHdm3SmWSCZMXf/+tKQRW+awbkCqbl9n/noDJrr2NZHu264QI3C/eq rU= X-Received: by 2002:a17:902:ecd0:b0:2e4:4eed:5cc5 with SMTP id d9443c01a7336-2e842cd23b1mr82446595ad.38.1791802712560; Mon, 12 Oct 2026 03:58:32 -0700 (PDT) From: Jeuk Kim To: qemu-devel@nongnu.org, richard.henderson@linaro.org Cc: stanleyjhu@google.com, pierrick.bouvier@oss.qualcomm.com, kwolf@redhat.com, hreitz@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, jeuk20.kim@samsung.com, j-young.choi@samsung.com Subject: [PULL 4/5] hw/ufs: Skip nullified MCQ submission queue entries with OCS_ABORTED Date: Mon, 12 Oct 2026 19:58:06 +0900 Message-ID: <92d01b9ee2bc95771e8b9348b111a10083ff64e2.1791802312.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=lists1p.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=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 @gmail.com) X-ZM-MESSAGEID: 1791802765101158500 Content-Type: text/plain; charset="utf-8" From: Stanley Jhu Per JEDEC UFSHCI (JESD223G Section 6.1.1 and Section 4.4.6 Step 2B), host software in MCQ mode may stop a Submission Queue and nullify an unfetched SQE by setting its UTRD Command Type (DW0 bits 31:28) to 0xF. When the Submission Queue is resumed, the host controller shall skip execution of the nullified transfer request and post a Completion Queue Entry (CQE) to the Completion Queue with OCS =3D ABORTED (0x06). In ufs_mcq_process_sq(), check for UFS_UTP_CMD_TYPE_NULL (0xF), read the Request UPIU header on a best-effort basis via ufs_dma_read_req_upiu() to populate cqe.task_tag and cqe.lun for UFSHCI 4.1+ completion decoding, and unconditionally post a CQE with UFS_OCS_ABORTED without executing the command or writing a Response UPIU for the nullified entry. Signed-off-by: Stanley Jhu Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- hw/ufs/ufs.c | 17 ++++++++++++++++- include/block/ufs.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c index 4c505e0bffe..f008af7467e 100644 --- a/hw/ufs/ufs.c +++ b/hw/ufs/ufs.c @@ -36,6 +36,7 @@ =20 static void ufs_exec_req(UfsRequest *req); static void ufs_clear_req(UfsRequest *req); +static void ufs_mcq_process_cq(void *opaque); =20 static inline uint64_t ufs_mcq_reg_addr(UfsHc *u, int qid) { @@ -474,6 +475,17 @@ static void ufs_mcq_process_sq(void *opaque) ufs_mcq_init_req(sq->u, req, sq); memcpy(&req->utrd, &sqe, sizeof(req->utrd)); =20 + if ((le32_to_cpu(sqe.header.dword_0) >> 28) =3D=3D UFS_UTP_CMD_TYP= E_NULL) { + ufs_dma_read_req_upiu(req); + req->utrd.header.dword_2 =3D cpu_to_le32( + (le32_to_cpu(req->utrd.header.dword_2) & ~UFS_MASK_OCS) | + UFS_OCS_ABORTED); + req->state =3D UFS_REQUEST_COMPLETE; + QTAILQ_INSERT_TAIL(&sq->cq->req_list, req, entry); + ufs_mcq_process_cq(sq->cq); + continue; + } + req->state =3D UFS_REQUEST_RUNNING; ufs_exec_req(req); } @@ -493,7 +505,10 @@ static void ufs_mcq_process_cq(void *opaque) break; } =20 - ufs_dma_write_rsp_upiu(req); + if ((le32_to_cpu(req->utrd.header.dword_0) >> 28) !=3D + UFS_UTP_CMD_TYPE_NULL) { + ufs_dma_write_rsp_upiu(req); + } =20 /* UTRD/CQE are LE; round-trip through host to keep BE correct. */ uint64_t ucdba =3D diff --git a/include/block/ufs.h b/include/block/ufs.h index b0515325f92..4a614fbe526 100644 --- a/include/block/ufs.h +++ b/include/block/ufs.h @@ -665,6 +665,7 @@ enum { UFS_UTP_CMD_TYPE_SCSI =3D 0x0, UFS_UTP_CMD_TYPE_UFS =3D 0x1, UFS_UTP_CMD_TYPE_DEV_MANAGE =3D 0x2, + UFS_UTP_CMD_TYPE_NULL =3D 0xf, }; =20 /* To accommodate UFS2.0 required Command type */ --=20 2.43.0 From nobody Thu Oct 22 19:24:53 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=1791802749; cv=none; d=zohomail.com; s=zohoarc; b=VuCw+KW25YSr1lHsQw49Pii8uEqrNLOTKmmK5otm7KwPsz39GQOMRo0Jyy+j9yWyWt2C+xqmFWyYbKZexAZctwDsHJqQeiloSLp5Zi8UPBYFT8sZEpKKj5B5/FHqBLWP3WDmb7PYQwpFGuTvJeeZi4irkwyTgy5cgsfuyrgwLNQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1791802749; 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:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=X+WxLx+zZjQOI7fhiqyMiVvUah5BrBJxOzJuO13wGSI=; b=SuNdbNDyrAF5DsERWDYw0WCQiN7F76Dq3VJcAhGVzix6BEBSfXP0IYn/9pExfszWBCbPvTwOuOl0xnIkkB4a01Q0UNVQmFxx8kDa20gBociKezggeLdmGKyfxWrrhIxRx2xQ2EBbhXlvRx3uBRlRVbgADkv3pzKMYF8LuwHL3k8= 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 1791802749387726.0727091115103; Mon, 12 Oct 2026 03:59:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xGDjx-0005hD-6m; Mon, 12 Oct 2026 06:58:47 -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 1xGDjs-0005ex-6I for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:40 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1xGDjq-0000xu-BS for qemu-devel@nongnu.org; Mon, 12 Oct 2026 06:58:39 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-2e608cd460eso8734965ad.3 for ; Mon, 12 Oct 2026 03:58:37 -0700 (PDT) Received: from jeuk-MS-7D42.. ([211.226.54.223]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2e84219e6aasm41220305ad.18.2026.10.12.03.58.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2026 03:58:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791802717; x=1792407517; 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:content-type; bh=X+WxLx+zZjQOI7fhiqyMiVvUah5BrBJxOzJuO13wGSI=; b=ROCHFVdF9sZWV8OzpR8Jdtph+EZKhVZ3dhlVbLY9ifg3Bx39Td8hteih19dYbsA9Yc 7RgTypt32xgCL6eNDnuZ1mrNr/Qlgk2SMtuThcN+XID+mohqKG7gtLD36DuUiDMW0Vpq 1AsEG81A6Ok+0m7n3M1oCjWyJtFe2P2zkHfwSPR1DeiIir9GiPaTaUC5qIRgx4k6fEPQ cED3cMQbP+dIfz3pV4dmPuX8OnMJYPaie6V1515VawSF4Nthh0qXInZ5pMFK7R/c2Dp0 xlcIJoJtErfeHMGS/IC3OBugX/Z3AXbPrx02Ww3JRMxbdoVTSkKzr8o1stRGVQxtdoua 4G2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791802717; x=1792407517; 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:content-type; bh=X+WxLx+zZjQOI7fhiqyMiVvUah5BrBJxOzJuO13wGSI=; b=KdUi7fKJB7f6gTiSHt7FQKjL668S/rdvV+9KHNG4ctCIM3HhBLK8G0qC2HJ9fbiWKK hRyvk+zrNgEf+OtV3d2NrBTuKjqAQ0fFJn4f7YHBBwgCpHMcZsJIe5pkPR3tq6g6BY+t Cm0ILNUIOcOVWBH1bHTGdFES4Iaxl+Nlwgd3uHVNrvn6m1BZKdF2Ymemqpb5BHgPidmz zx6Oxl0m/SJaECxEYyhLiR6jxswtt1qZxiIWreeebVWk/nAkaQjq9ZsZkmozyzh3fGCE 0DdWc+mNoepFfE7CZ3gq9NSEgiQt8G0oq6r5ezDUFKNB8ypIHnTKYM8oVX7C358ljqCJ a0ug== X-Gm-Message-State: AFq9FYJTpERRmgLU7dUmmg8YHI1ypYkC02yFxw5B7/6Q2aCtqyKsKRRQ TGAc9IdveC00JMOzGrtcClZHAL7uq+DDdUGf8/pynlkR2jbOSEvqzz0NgU/CZQ== X-Gm-Gg: AYBFou0MY2Gl1XvUlsCQbm94hKFOd+7WCqMpuP9p0UNlW/5QXN2idPAGQ6Swqz8q0pJ UHQMgDkQwiGpEQFpNVcfgwDegfzarChk2C/C4qQCmueaapsqvcb2e2nCgsRQaFecz9QW3WL3WQC euKn5xg1o+6WpGs3uBEO+OMpHquz+pJwTzrISUso37tqQ4fNLsnrnNyfnPT9GcKTt91ca2c+z+/ DDy/RLQk7EPQ+yn1y/e6xerQ9hfIZfUAtPvXDlC8wJzXAvzm9x8U7Vq/NnIhguakz+TmZMysRZ6 94sWTSTJ8qN1YuQKN+DgEznK5QxHuq0T214F00sD3NQJr/bBl8IvcNR9o+CFQ9YWLOekdKPApYP WLCaiOpVii5cGMDK6hQIre8pJqQ/RGE38UaQz6u7mQc+fxHZY/KM64i1lHfdU8SWGsi6MtRypZP FxnLQKH24MoJlHN1lGRRYS0xfq1V7fWD+J7qZxwMaf55PiQKJsbNd/fBkH3nq2YhpYD0rhyIjOv 5w= X-Received: by 2002:a17:903:2283:b0:2e8:3d48:4d80 with SMTP id d9443c01a7336-2e842ab6dd1mr74734335ad.45.1791802716756; Mon, 12 Oct 2026 03:58:36 -0700 (PDT) From: Jeuk Kim To: qemu-devel@nongnu.org, richard.henderson@linaro.org Cc: stanleyjhu@google.com, pierrick.bouvier@oss.qualcomm.com, kwolf@redhat.com, hreitz@redhat.com, pbonzini@redhat.com, qemu-block@nongnu.org, jeuk20.kim@samsung.com, j-young.choi@samsung.com Subject: [PULL 5/5] docs/system: Add UFS emulation page Date: Mon, 12 Oct 2026 19:58:07 +0900 Message-ID: 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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=jeuk20.kim@gmail.com; helo=mail-pl1-x634.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=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 @gmail.com) X-ZM-MESSAGEID: 1791802750783158500 Content-Type: text/plain; charset="utf-8" From: Stanley Jhu The UFS host controller and logical unit devices have no user documentation. Their properties and the way the two devices fit together can only be found by reading hw/ufs/. Add docs/system/devices/ufs.rst with an example command line, the device properties, and current limitations, and list it under the UFS entry in MAINTAINERS. Signed-off-by: Stanley Jhu Reviewed-by: Jeuk Kim Signed-off-by: Jeuk Kim --- MAINTAINERS | 1 + docs/system/device-emulation.rst | 1 + docs/system/devices/ufs.rst | 88 ++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 docs/system/devices/ufs.rst diff --git a/MAINTAINERS b/MAINTAINERS index 1312bbd1bd8..c7f65a5a779 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2758,6 +2758,7 @@ S: Supported F: hw/ufs/* F: include/block/ufs.h F: tests/qtest/ufs-test.c +F: docs/system/devices/ufs.rst =20 megasas L: qemu-block@nongnu.org diff --git a/docs/system/device-emulation.rst b/docs/system/device-emulatio= n.rst index 40054bb7dfc..a7d247a270e 100644 --- a/docs/system/device-emulation.rst +++ b/docs/system/device-emulation.rst @@ -96,6 +96,7 @@ Emulated Devices devices/net.rst devices/nvme.rst devices/scsi/index.rst + devices/ufs.rst devices/usb-u2f.rst devices/usb.rst devices/vfio-user.rst diff --git a/docs/system/devices/ufs.rst b/docs/system/devices/ufs.rst new file mode 100644 index 00000000000..d3482e92992 --- /dev/null +++ b/docs/system/devices/ufs.rst @@ -0,0 +1,88 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +UFS Emulation +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +QEMU emulates a Universal Flash Storage (UFS) host controller and the +logical units behind it. The host controller follows the UFSHCI +register interface and reports UFS version 4.1 to the guest. + +Two devices are involved: + +``ufs`` + The host controller on the PCI bus. A ``sysbus-ufs`` variant exists + for boards that place the controller on the system bus; it cannot be + created with ``-device``. + +``ufs-lu`` + A logical unit attached to a host controller through ``bus=3D``. Each + logical unit is backed by a block device. + +The well-known logical units (REPORT LUNS, UFS Device, Boot and RPMB) +are created by the host controller and need no configuration. + +Adding a UFS Device +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The following adds a host controller with MCQ enabled and one logical +unit backed by ``ufs.img``: + +.. code-block:: console + + -drive file=3Dufs.img,if=3Dnone,id=3Dlu0,format=3Draw \ + -device ufs,id=3Dufs0,serial=3D0001,mcq=3Don \ + -device ufs-lu,drive=3Dlu0,bus=3Dufs0,lun=3D0 + +Add more ``ufs-lu`` devices with different ``lun`` values to create +more logical units. On top of the architecture defconfig, a Linux +guest needs ``CONFIG_SCSI_UFSHCD``, ``CONFIG_SCSI_UFSHCD_PCI`` and +``CONFIG_BLK_DEV_SD``; each logical unit then appears as a SCSI disk. + +Host Controller Properties +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D + +``serial`` + Serial number string. It is accepted but not reported to the guest + yet; the serial number string descriptor reads back empty. + +``nutrs`` (default 32, maximum 32) + Number of UTP transfer request slots. + +``nutmrs`` (default 8, maximum 8) + Number of UTP task management request slots advertised to the guest. + Task management requests are not processed yet (see Limitations). + +``mcq`` (default off) + Advertise Multi-Circular Queue (MCQ) support. When off, the guest + uses the single doorbell transfer request list. + +``mcq-maxq`` (default 2, maximum 31) + Number of MCQ submission and completion queue pairs. + +``wb-max-size``, ``wb-min-size`` (default 0x400 and 0x100) + Maximum and minimum WriteBooster buffer size, in allocation units. + ``wb-min-size`` must not exceed ``wb-max-size``. + +Logical Unit Properties +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +``drive`` + Backing block device. + +``lun`` (default 0) + Logical unit number, 0 to 31. A host controller accepts up to 32 + logical units. + +Limitations +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +* UniPro and M-PHY are not modelled. Only the UIC commands needed for + link startup, DME attribute access and hibernation are handled; DME + reads return fixed values, and DME writes, power mode changes and + hibernation do not change any link state. +* UTP task management requests are not processed, so a guest that + tries to abort a command or reset a logical unit gets no completion. +* The Boot and RPMB well-known logical units only answer basic SCSI + commands such as INQUIRY; boot and RPMB data access are not emulated. +* The device cannot be migrated. --=20 2.43.0