From nobody Sat May 18 18:57:59 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1653464644054604.3503672206763; Wed, 25 May 2022 00:44:04 -0700 (PDT) Received: from localhost ([::1]:41574 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ntlgY-0005f8-S3 for importer@patchew.org; Wed, 25 May 2022 03:44:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42232) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ntlYI-0000tI-6i; Wed, 25 May 2022 03:35:31 -0400 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:55609) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ntlYG-00067d-Jf; Wed, 25 May 2022 03:35:29 -0400 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id E8E6E5C0242; Wed, 25 May 2022 03:35:26 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Wed, 25 May 2022 03:35:26 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 25 May 2022 03:35:25 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:date:date:from:from :in-reply-to:message-id:mime-version:reply-to:sender:subject :subject:to:to; s=fm3; t=1653464126; x=1653550526; bh=COcy5zVGWu b1NrTqSWYL0qyBJLgIKlRWXhwAuV3l0QE=; b=IAQLfsftGSeA0SqsrJeOD64mxd dg/aGMquCAxaVY6yXHL3FIxfhjtFrchE7zMSJL2eW20A1NSUy7bQt2h3/ZKoWGs2 f7fS9lH/yAf7MJIXMhc/NALVy4FqjEH+GMsyv4iRPotW8GxybKgYAfkp8qN0dMCg iMdYkg8dJp1Bn6WjrKnBuZtA9ALAuqeLCQauAJwE8gEcqzLEpd4UlIF4HaRKgglt Hs92ATLoH+x3za1+LY/+GOLCwzeI68OibfSh9qWPJicB1/FW9UiKx2hLTDGghEoe fQi722k0/Dt3Aa/fdUDxyG1rGMnP5aIL5jBl5ankENx5fC/N4ux4sU9+fv0A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t= 1653464126; x=1653550526; bh=COcy5zVGWub1NrTqSWYL0qyBJLgIKlRWXhw AuV3l0QE=; b=nr2wIwtKmeqPrhtGt8jgV2AqsC8jdhkrkBUgK4ocVvh7ZjiHyD6 0dXB1hgsF3rGeUXNDpzXxP789zK4zVKfqzH951w973merRFJlClhWo14mTmHlX8z 8+OaM+citzrQe20M00o7aFHBte1fns0ltHSux231zAZ5o/hOAjTPhpVFK7dWAclE PBO2dFCyw27tuCBS6bJ4DFcBvG0EpL/ahrd/+6bVTuF+kjoCP0JCbVO1BV32ML1p 9r0a9Jwwr9QHjxEphgh6R867SQQ8cwabyLk1CHnq3VhI2d1ckz2FmGByrh8IChsj eTw1GP5C26Qdkl8kF9nYRXkEjSybFyEpxEQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrjeeggdduudelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvvefufffkofgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnheptdeludfhgeelheelledtjefffeejtdeluedvgfetveffgeetvdevkeehieeikeet necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Keith Busch , qemu-block@nongnu.org, Lukasz Maniak , Klaus Jensen , Klaus Jensen Subject: [PATCH v2] hw/nvme: clean up CC register write logic Date: Wed, 25 May 2022 09:35:24 +0200 Message-Id: <20220525073524.2227333-1-its@irrelevant.dk> X-Mailer: git-send-email 2.36.1 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=66.111.4.27; envelope-from=its@irrelevant.dk; helo=out3-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.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, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1653464646235100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen The SRIOV series exposed an issued with how CC register writes are handled and how CSTS is set in response to that. Specifically, after applying the SRIOV series, the controller could end up in a state with CC.EN set to '1' but with CSTS.RDY cleared to '0', causing drivers to expect CSTS.RDY to transition to '1' but timing out. Clean this up. Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 658584d417fe..8b16b2b8febb 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -6190,8 +6190,12 @@ static void nvme_ctrl_reset(NvmeCtrl *n, NvmeResetTy= pe rst) =20 if (pci_is_vf(pci_dev)) { sctrl =3D nvme_sctrl(n); + stl_le_p(&n->bar.csts, sctrl->scs ? 0 : NVME_CSTS_FAILED); } else { + stl_le_p(&n->bar.intms, 0); + stl_le_p(&n->bar.intmc, 0); + stl_le_p(&n->bar.cc, 0); stl_le_p(&n->bar.csts, 0); } } @@ -6405,20 +6409,21 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offs= et, uint64_t data, nvme_irq_check(n); break; case NVME_REG_CC: + stl_le_p(&n->bar.cc, data); + trace_pci_nvme_mmio_cfg(data & 0xffffffff); =20 - /* Windows first sends data, then sends enable bit */ - if (!NVME_CC_EN(data) && !NVME_CC_EN(cc) && - !NVME_CC_SHN(data) && !NVME_CC_SHN(cc)) - { - cc =3D data; + if (NVME_CC_SHN(data) && !(NVME_CC_SHN(cc))) { + trace_pci_nvme_mmio_shutdown_set(); + nvme_ctrl_shutdown(n); + csts &=3D ~(CSTS_SHST_MASK << CSTS_SHST_SHIFT); + csts |=3D NVME_CSTS_SHST_COMPLETE; + } else if (!NVME_CC_SHN(data) && NVME_CC_SHN(cc)) { + trace_pci_nvme_mmio_shutdown_cleared(); + csts &=3D ~(CSTS_SHST_MASK << CSTS_SHST_SHIFT); } =20 if (NVME_CC_EN(data) && !NVME_CC_EN(cc)) { - cc =3D data; - - /* flush CC since nvme_start_ctrl() needs the value */ - stl_le_p(&n->bar.cc, cc); if (unlikely(nvme_start_ctrl(n))) { trace_pci_nvme_err_startfail(); csts =3D NVME_CSTS_FAILED; @@ -6429,22 +6434,10 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offs= et, uint64_t data, } else if (!NVME_CC_EN(data) && NVME_CC_EN(cc)) { trace_pci_nvme_mmio_stopped(); nvme_ctrl_reset(n, NVME_RESET_CONTROLLER); - cc =3D 0; - csts &=3D ~NVME_CSTS_READY; - } =20 - if (NVME_CC_SHN(data) && !(NVME_CC_SHN(cc))) { - trace_pci_nvme_mmio_shutdown_set(); - nvme_ctrl_shutdown(n); - cc =3D data; - csts |=3D NVME_CSTS_SHST_COMPLETE; - } else if (!NVME_CC_SHN(data) && NVME_CC_SHN(cc)) { - trace_pci_nvme_mmio_shutdown_cleared(); - csts &=3D ~NVME_CSTS_SHST_COMPLETE; - cc =3D data; + break; } =20 - stl_le_p(&n->bar.cc, cc); stl_le_p(&n->bar.csts, csts); =20 break; --=20 2.36.1