From nobody Sun May 19 20:47:26 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 ARC-Seal: i=1; a=rsa-sha256; t=1615445381; cv=none; d=zohomail.com; s=zohoarc; b=MGqDPCaFa8p0CDQVhMrboP8lMymWeEEocUj23SJ0uJpYSxKenuIg/OuhjHJ02g4VwkXgGgnhejM8ohRxhK/WQgow0h18WN+2hOmZngGbcRTjQaMmrRtsgSx4DOiqX3kq7TALTD08jSlsZI2RjuhSX/3o/pPJtpcPcduKPq/7KE8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615445381; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qqYFSI8mwDYOxSJ+iJlBUmBMEirl5i8ijNKPETsNelg=; b=HZBBnc15hgwbWUFd5rx6jDxIvbhrUUzTc3CM1pUiqA6Kw5Obs5Ij0V0xMXVIZk33M8GNr14l/LTJMzp/RdZlwxmVClK5lrk/X1QTUM1IcDPqVRakDdZHTcQpw5KUFZPLiZtiimWhJebmX5KD7iB9aJvUdfb4nkBfm6Q7V4FcO/M= ARC-Authentication-Results: i=1; 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 1615445381220825.4033468669336; Wed, 10 Mar 2021 22:49:41 -0800 (PST) Received: from localhost ([::1]:47762 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lKF8e-000803-1B for importer@patchew.org; Thu, 11 Mar 2021 01:49:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43726) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyN-0005iG-RW; Thu, 11 Mar 2021 01:39:03 -0500 Received: from out1-smtp.messagingengine.com ([66.111.4.25]:49783) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyJ-0008BW-Ba; Thu, 11 Mar 2021 01:39:02 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id C181A5C00A7; Thu, 11 Mar 2021 01:38:55 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 11 Mar 2021 01:38:55 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id DE39C108005F; Thu, 11 Mar 2021 01:38:53 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=qqYFSI8mwDYOx SJ+iJlBUmBMEirl5i8ijNKPETsNelg=; b=VNnsHe0n6XGHkLmTi2+DlUiyq7FAT 1pvNM8eXCQWQ0SXgQQQ0I1LFxRhi1pPK8gQIj65T9PD4Yz0saLq/Wouf31meTq24 0fUjhngqir9qJwYMFBUvDqKE8m7r1KSmUXJ3d8fNWxRz+ndvTkA8IHIm2jM5DaEi F6xurhKYp4y8YSrmPBZzfZ+7CEnbXm1etsJ7cFVLEJLih2FacISLUAso7UNJ9oXE S1FwN+sR3QUdLV1AG54PKigTPQw+8Qi10P5OoRBLWOEeUqjDoethXzq31KZu8ixG 9nTjk0V6NIu6/CEaBpyvUFDFImEEmyv8YBxze3FFGfoXyc8oqF3cfnwzg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=qqYFSI8mwDYOxSJ+iJlBUmBMEirl5i8ijNKPETsNelg=; b=PVLQavrP 8rwKRbU5XgJKWpHv4QVlkqdpBPXaYsMjIinNLe96lVBkyxQQJxGAybbhb251+afQ 2aa5T5FQSO2YuwbV2m+VZZOk5vwzmEGMODFUaUH5rocB7ZEik6Kkt1M85CHIZ7mm c2lHI+v7c336NVGxoSkbq+ftiCcZQ95HQwSdcNvUTk/MCYz/B1WsoAeiM1nvQwc9 WxirGWfli66KEQaDdwVaxsWUYZ98j4W5d39dXc7PYewnokRkiNGwRVoY6ww9bVC5 FNDCExDTaoSG2gCo93kvlReqS28zmI9YaFr3vy9Acmh/HWegLDIUxWGcCCoqKsHT Nq7STBuCvR9vOQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudduledgleejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtne curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH 1/3] hw/block/nvme: add oncs device parameter Date: Thu, 11 Mar 2021 07:38:49 +0100 Message-Id: <20210311063851.757481-2-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210311063851.757481-1-its@irrelevant.dk> References: <20210311063851.757481-1-its@irrelevant.dk> 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.25; envelope-from=its@irrelevant.dk; helo=out1-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, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Gollu Appalanaidu , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Gollu Appalanaidu Add the 'oncs' nvme device parameter to allow optional features to be enabled/disabled explicitly. Since most of these are optional commands, make the CSE log pages dynamic to account for the value of ONCS. Signed-off-by: Gollu Appalanaidu Signed-off-by: Klaus Jensen --- hw/block/nvme.h | 7 ++++ hw/block/nvme.c | 101 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 74 insertions(+), 34 deletions(-) diff --git a/hw/block/nvme.h b/hw/block/nvme.h index 4955d649c7d4..65c80cfaef62 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -9,6 +9,7 @@ =20 #define NVME_DEFAULT_ZONE_SIZE (128 * MiB) #define NVME_DEFAULT_MAX_ZA_SIZE (128 * KiB) +#define NVME_MAX_COMMANDS 0x100 =20 /* * Subsystem namespace list for allocated namespaces should be larger than @@ -28,6 +29,7 @@ typedef struct NvmeParams { bool use_intel_id; uint8_t zasl; bool legacy_cmb; + uint16_t oncs; } NvmeParams; =20 typedef struct NvmeAsyncEvent { @@ -210,6 +212,11 @@ typedef struct NvmeCtrl { NvmeCQueue admin_cq; NvmeIdCtrl id_ctrl; NvmeFeatureVal features; + + struct { + uint32_t nvm[NVME_MAX_COMMANDS]; + uint32_t zoned[NVME_MAX_COMMANDS]; + } iocs; } NvmeCtrl; =20 static inline NvmeNamespace *nvme_ns(NvmeCtrl *n, uint32_t nsid) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index d439e44db839..fbb578a6e669 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -84,6 +84,11 @@ * the minimum memory page size (CAP.MPSMIN). The default value is 0 (i.= e. * defaulting to the value of `mdts`). * + * - `oncs` + * This field indicates the optional NVM commands and features supported + * by the controller. To add support for the optional feature, needs to + * set the corresponding support indicated bit. + * * nvme namespace device parameters * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - `subsys` @@ -185,7 +190,7 @@ static const uint32_t nvme_feature_cap[NVME_FID_MAX] = =3D { [NVME_TIMESTAMP] =3D NVME_FEAT_CAP_CHANGE, }; =20 -static const uint32_t nvme_cse_acs[256] =3D { +static const uint32_t nvme_cse_acs[NVME_MAX_COMMANDS] =3D { [NVME_ADM_CMD_DELETE_SQ] =3D NVME_CMD_EFF_CSUPP, [NVME_ADM_CMD_CREATE_SQ] =3D NVME_CMD_EFF_CSUPP, [NVME_ADM_CMD_GET_LOG_PAGE] =3D NVME_CMD_EFF_CSUPP, @@ -199,30 +204,7 @@ static const uint32_t nvme_cse_acs[256] =3D { [NVME_ADM_CMD_NS_ATTACHMENT] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= NIC, }; =20 -static const uint32_t nvme_cse_iocs_none[256]; - -static const uint32_t nvme_cse_iocs_nvm[256] =3D { - [NVME_CMD_FLUSH] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_WRITE_ZEROES] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP, - [NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP, -}; - -static const uint32_t nvme_cse_iocs_zoned[256] =3D { - [NVME_CMD_FLUSH] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_WRITE_ZEROES] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP, - [NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP, - [NVME_CMD_ZONE_APPEND] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_ZONE_MGMT_SEND] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, - [NVME_CMD_ZONE_MGMT_RECV] =3D NVME_CMD_EFF_CSUPP, -}; +static const uint32_t nvme_cse_iocs_none[NVME_MAX_COMMANDS]; =20 static void nvme_process_sq(void *opaque); =20 @@ -3071,17 +3053,17 @@ static uint16_t nvme_cmd_effects(NvmeCtrl *n, uint8= _t csi, uint32_t buf_len, =20 switch (NVME_CC_CSS(n->bar.cc)) { case NVME_CC_CSS_NVM: - src_iocs =3D nvme_cse_iocs_nvm; + src_iocs =3D n->iocs.nvm; /* fall through */ case NVME_CC_CSS_ADMIN_ONLY: break; case NVME_CC_CSS_CSI: switch (csi) { case NVME_CSI_NVM: - src_iocs =3D nvme_cse_iocs_nvm; + src_iocs =3D n->iocs.nvm; break; case NVME_CSI_ZONED: - src_iocs =3D nvme_cse_iocs_zoned; + src_iocs =3D n->iocs.zoned; break; } } @@ -3684,6 +3666,10 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRe= quest *req) return NVME_INVALID_FIELD | NVME_DNR; } =20 + if (!(le16_to_cpu(n->id_ctrl.oncs) & NVME_ONCS_FEATURES) && sel) { + return NVME_INVALID_FIELD | NVME_DNR; + } + if (nvme_feature_cap[fid] & NVME_FEAT_CAP_NS) { if (!nvme_nsid_valid(n, nsid) || nsid =3D=3D NVME_NSID_BROADCAST) { /* @@ -3766,6 +3752,9 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeReq= uest *req) result =3D n->features.async_config; goto out; case NVME_TIMESTAMP: + if (!(le16_to_cpu(n->id_ctrl.oncs) & NVME_ONCS_TIMESTAMP)) { + return NVME_INVALID_FIELD | NVME_DNR; + } return nvme_get_feature_timestamp(n, req); default: break; @@ -3843,6 +3832,10 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRe= quest *req) =20 trace_pci_nvme_setfeat(nvme_cid(req), nsid, fid, save, dw11); =20 + if (save && !(le16_to_cpu(n->id_ctrl.oncs) & NVME_ONCS_FEATURES)) { + return NVME_INVALID_FIELD | NVME_DNR; + } + if (save && !(nvme_feature_cap[fid] & NVME_FEAT_CAP_SAVE)) { return NVME_FID_NOT_SAVEABLE | NVME_DNR; } @@ -3959,6 +3952,9 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeReq= uest *req) n->features.async_config =3D dw11; break; case NVME_TIMESTAMP: + if (!(le16_to_cpu(n->id_ctrl.oncs) & NVME_ONCS_TIMESTAMP)) { + return NVME_INVALID_FIELD | NVME_DNR; + } return nvme_set_feature_timestamp(n, req); case NVME_COMMAND_SET_PROFILE: if (dw11 & 0x1ff) { @@ -4201,14 +4197,14 @@ static void __nvme_select_ns_iocs(NvmeCtrl *n, Nvme= Namespace *ns) switch (ns->csi) { case NVME_CSI_NVM: if (NVME_CC_CSS(n->bar.cc) !=3D NVME_CC_CSS_ADMIN_ONLY) { - ns->iocs =3D nvme_cse_iocs_nvm; + ns->iocs =3D n->iocs.nvm; } break; case NVME_CSI_ZONED: if (NVME_CC_CSS(n->bar.cc) =3D=3D NVME_CC_CSS_CSI) { - ns->iocs =3D nvme_cse_iocs_zoned; + ns->iocs =3D n->iocs.zoned; } else if (NVME_CC_CSS(n->bar.cc) =3D=3D NVME_CC_CSS_NVM) { - ns->iocs =3D nvme_cse_iocs_nvm; + ns->iocs =3D n->iocs.nvm; } break; } @@ -4838,6 +4834,40 @@ static void nvme_check_constraints(NvmeCtrl *n, Erro= r **errp) } } =20 +static void nvme_init_cse_iocs(NvmeCtrl *n) +{ + uint16_t oncs =3D n->params.oncs; + + n->iocs.nvm[NVME_CMD_FLUSH] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC; + n->iocs.nvm[NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC; + n->iocs.nvm[NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP; + + if (oncs & NVME_ONCS_WRITE_ZEROES) { + n->iocs.nvm[NVME_CMD_WRITE_ZEROES] =3D NVME_CMD_EFF_CSUPP | + NVME_CMD_EFF_LBCC; + } + + if (oncs & NVME_ONCS_COMPARE) { + n->iocs.nvm[NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP; + } + + if (oncs & NVME_ONCS_DSM) { + n->iocs.nvm[NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LB= CC; + } + + if (oncs & NVME_ONCS_COPY) { + n->iocs.nvm[NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_L= BCC; + } + + memcpy(n->iocs.zoned, n->iocs.nvm, sizeof(n->iocs.nvm)); + + n->iocs.zoned[NVME_CMD_ZONE_APPEND] =3D NVME_CMD_EFF_CSUPP | + NVME_CMD_EFF_LBCC; + n->iocs.zoned[NVME_CMD_ZONE_MGMT_SEND] =3D NVME_CMD_EFF_CSUPP | + NVME_CMD_EFF_LBCC; + n->iocs.zoned[NVME_CMD_ZONE_MGMT_RECV] =3D NVME_CMD_EFF_CSUPP; +} + static void nvme_init_state(NvmeCtrl *n) { n->num_namespaces =3D NVME_MAX_NAMESPACES; @@ -4850,6 +4880,8 @@ static void nvme_init_state(NvmeCtrl *n) n->features.temp_thresh_hi =3D NVME_TEMPERATURE_WARNING; n->starttime_ms =3D qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL); n->aer_reqs =3D g_new0(NvmeRequest *, n->params.aerl + 1); + + nvme_init_cse_iocs(n); } =20 static int nvme_attach_namespace(NvmeCtrl *n, NvmeNamespace *ns, Error **e= rrp) @@ -5091,9 +5123,7 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pc= i_dev) id->sqes =3D (0x6 << 4) | 0x6; id->cqes =3D (0x4 << 4) | 0x4; id->nn =3D cpu_to_le32(n->num_namespaces); - id->oncs =3D cpu_to_le16(NVME_ONCS_WRITE_ZEROES | NVME_ONCS_TIMESTAMP | - NVME_ONCS_FEATURES | NVME_ONCS_DSM | - NVME_ONCS_COMPARE | NVME_ONCS_COPY); + id->oncs =3D cpu_to_le16(n->params.oncs); =20 /* * NOTE: If this device ever supports a command set that does NOT use = 0x0 @@ -5239,6 +5269,9 @@ static Property nvme_props[] =3D { DEFINE_PROP_BOOL("use-intel-id", NvmeCtrl, params.use_intel_id, false), DEFINE_PROP_BOOL("legacy-cmb", NvmeCtrl, params.legacy_cmb, false), DEFINE_PROP_UINT8("zoned.zasl", NvmeCtrl, params.zasl, 0), + DEFINE_PROP_UINT16("oncs", NvmeCtrl, params.oncs, NVME_ONCS_WRITE_ZERO= ES | + NVME_ONCS_TIMESTAMP | NVME_ONCS_DSM | + NVME_ONCS_COMPARE | NVME_ONCS_FEATURES | NVME_ONCS_= COPY), DEFINE_PROP_END_OF_LIST(), }; =20 --=20 2.30.1 From nobody Sun May 19 20:47:26 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 ARC-Seal: i=1; a=rsa-sha256; t=1615445380; cv=none; d=zohomail.com; s=zohoarc; b=SJEzp9OEVIM1xZyCWbEMVsWolQYuCjaKTG3Ea56wMDw7GZE7KAJrWaceLDbijW0FdU3mRQYrIup7s6voFYADYRBal+nZxGUF0cO8NC6UifufQWqmT+zudNC+AH4n+J746/eFE8zP7jDic1Y+bAQJbm8Ch/S/RZgkpgKSHdQ+vlA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615445380; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pt+6vM9le9ie/FElty80/C9S2l5Coce/eCBWMxX5p/s=; b=lejratzjyElMZoC8j2LOf6OrBHPOSccLkiXBEdV69TcsiyKq/QE2BCSlVNvmrAoF/UXwCFGkRotWMECAkFYvdkRSN0QTec0ntadqEZuSUaZATGNzlQqeuzv8TOfR+Go4JUldr42URG58axYk5v1wJOtChB754bW0SryCszkm8W0= ARC-Authentication-Results: i=1; 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 1615445380093505.1333682256653; Wed, 10 Mar 2021 22:49:40 -0800 (PST) Received: from localhost ([::1]:47692 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lKF8c-0007ri-Rw for importer@patchew.org; Thu, 11 Mar 2021 01:49:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43696) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyL-0005hK-HH; Thu, 11 Mar 2021 01:39:01 -0500 Received: from out1-smtp.messagingengine.com ([66.111.4.25]:44969) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyJ-0008Cm-BI; Thu, 11 Mar 2021 01:39:01 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id A0C855C00AA; Thu, 11 Mar 2021 01:38:56 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 11 Mar 2021 01:38:56 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id 58F4A1080067; Thu, 11 Mar 2021 01:38:55 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=pt+6vM9le9ie/ FElty80/C9S2l5Coce/eCBWMxX5p/s=; b=SbpZgfu7Sre5ad1F/R6Li4DiiM70t ugGwOJjSb0HyQ670I8RR/WZ4byQ3Ayk/+iLS5PoiVXZSGMv1rnIrQJRjnt4ssho6 S6AvUpSNVAePsmpmTzCNHITBJBPHV9wOKLUKdgKt+PhTS3Sg2Gl2eYd7z4OG47/R cgpTXaonQiB1+taeFUu5QIHCEOIPWqi4+7IZ9CGipAzg2eZpYjiEGatJ3f96uZIt 2HhKre7FzAu5D0E9p3ijQdyapZZvw/ZUe6Wb83u+G/77xqS25Hw7xVRvAUG9ajmU w17tIQGEPoNdQcqf4uKFyaoGSUT9LgliYUxz5wBd5yzYtJ67Da2oi+teg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=pt+6vM9le9ie/FElty80/C9S2l5Coce/eCBWMxX5p/s=; b=k67nvxZM fYDmZyNPhcoIVJYOP22NGwz9tMBgYkaYNoNJFX4d6hIZXy+DMvfzMZ/CQbFIPlq2 a+ZOlGlwoap5neYhIMOc2wIt4kM4lU8eGHXMKw42U3HvTsXBxJQdIct3amLjpf30 wUr0Vw62nYIbrE5ycw03awUzlYRuZtsylHVQj7f3k9aefEJM1DaUNV+HPjhNa2Xn kL7vAg8mMXZfo7rA01KnIGqL+nunpcgfKebxm6dCAxzCFVgab8MkR0sMQaeyAQbT Nm8wK9eah3kb+u8aaUxs2pCd17349m7KAPt/t5+GIWxup3C9nH4xQISS4GB7AkWJ bFR74w5wKeJa9g== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudduledgleejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtne curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH 2/3] hw/block/nvme: add oacs device parameter Date: Thu, 11 Mar 2021 07:38:50 +0100 Message-Id: <20210311063851.757481-3-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210311063851.757481-1-its@irrelevant.dk> References: <20210311063851.757481-1-its@irrelevant.dk> 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.25; envelope-from=its@irrelevant.dk; helo=out1-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, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Gollu Appalanaidu , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Gollu Appalanaidu Add the 'oacs' nvme device parameter to allow optional features to be enabled/disabled explicitly. Since most of these are optional commands, make the CSE log pages dynamic to account for the value of OACS once the optional commands supported added to device. Signed-off-by: Gollu Appalanaidu --- hw/block/nvme.h | 3 +++ hw/block/nvme.c | 46 +++++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/hw/block/nvme.h b/hw/block/nvme.h index 65c80cfaef62..cebe6018a234 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -30,6 +30,7 @@ typedef struct NvmeParams { uint8_t zasl; bool legacy_cmb; uint16_t oncs; + uint16_t oacs; } NvmeParams; =20 typedef struct NvmeAsyncEvent { @@ -213,6 +214,8 @@ typedef struct NvmeCtrl { NvmeIdCtrl id_ctrl; NvmeFeatureVal features; =20 + uint32_t acs[NVME_MAX_COMMANDS]; + struct { uint32_t nvm[NVME_MAX_COMMANDS]; uint32_t zoned[NVME_MAX_COMMANDS]; diff --git a/hw/block/nvme.c b/hw/block/nvme.c index fbb578a6e669..8b8be3b5f121 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -89,6 +89,11 @@ * by the controller. To add support for the optional feature, needs to * set the corresponding support indicated bit. * + * - `oacs` + * This field indicates the optional Admin commands and features support= ed + * by the controller. To add support for the optional feature, needs to + * set the corresponding support indicated bit. + * * nvme namespace device parameters * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - `subsys` @@ -190,20 +195,6 @@ static const uint32_t nvme_feature_cap[NVME_FID_MAX] = =3D { [NVME_TIMESTAMP] =3D NVME_FEAT_CAP_CHANGE, }; =20 -static const uint32_t nvme_cse_acs[NVME_MAX_COMMANDS] =3D { - [NVME_ADM_CMD_DELETE_SQ] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_CREATE_SQ] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_GET_LOG_PAGE] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_DELETE_CQ] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_CREATE_CQ] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_IDENTIFY] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_ABORT] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_SET_FEATURES] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_GET_FEATURES] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_ASYNC_EV_REQ] =3D NVME_CMD_EFF_CSUPP, - [NVME_ADM_CMD_NS_ATTACHMENT] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= NIC, -}; - static const uint32_t nvme_cse_iocs_none[NVME_MAX_COMMANDS]; =20 static void nvme_process_sq(void *opaque); @@ -3068,7 +3059,7 @@ static uint16_t nvme_cmd_effects(NvmeCtrl *n, uint8_t= csi, uint32_t buf_len, } } =20 - memcpy(log.acs, nvme_cse_acs, sizeof(nvme_cse_acs)); + memcpy(log.acs, n->acs, sizeof(n->acs)); =20 if (src_iocs) { memcpy(log.iocs, src_iocs, sizeof(log.iocs)); @@ -4057,7 +4048,7 @@ static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeReque= st *req) trace_pci_nvme_admin_cmd(nvme_cid(req), nvme_sqid(req), req->cmd.opcod= e, nvme_adm_opc_str(req->cmd.opcode)); =20 - if (!(nvme_cse_acs[req->cmd.opcode] & NVME_CMD_EFF_CSUPP)) { + if (!(n->acs[req->cmd.opcode] & NVME_CMD_EFF_CSUPP)) { trace_pci_nvme_err_invalid_admin_opc(req->cmd.opcode); return NVME_INVALID_OPCODE | NVME_DNR; } @@ -4868,6 +4859,25 @@ static void nvme_init_cse_iocs(NvmeCtrl *n) n->iocs.zoned[NVME_CMD_ZONE_MGMT_RECV] =3D NVME_CMD_EFF_CSUPP; } =20 +static void nvme_init_cse_acs(NvmeCtrl *n) +{ + n->acs[NVME_ADM_CMD_DELETE_SQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_CREATE_SQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_GET_LOG_PAGE] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_DELETE_CQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_CREATE_CQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_IDENTIFY] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_ABORT] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_SET_FEATURES] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_GET_FEATURES] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_ASYNC_EV_REQ] =3D NVME_CMD_EFF_CSUPP; + + if (n->params.oacs & NVME_OACS_NS_MGMT) { + n->acs[NVME_ADM_CMD_NS_ATTACHMENT] =3D + NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_NIC; + } +} + static void nvme_init_state(NvmeCtrl *n) { n->num_namespaces =3D NVME_MAX_NAMESPACES; @@ -4881,6 +4891,7 @@ static void nvme_init_state(NvmeCtrl *n) n->starttime_ms =3D qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL); n->aer_reqs =3D g_new0(NvmeRequest *, n->params.aerl + 1); =20 + nvme_init_cse_acs(n); nvme_init_cse_iocs(n); } =20 @@ -5097,7 +5108,7 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pc= i_dev) =20 id->mdts =3D n->params.mdts; id->ver =3D cpu_to_le32(NVME_SPEC_VER); - id->oacs =3D cpu_to_le16(NVME_OACS_NS_MGMT); + id->oacs =3D cpu_to_le16(n->params.oacs); id->cntrltype =3D 0x1; =20 /* @@ -5272,6 +5283,7 @@ static Property nvme_props[] =3D { DEFINE_PROP_UINT16("oncs", NvmeCtrl, params.oncs, NVME_ONCS_WRITE_ZERO= ES | NVME_ONCS_TIMESTAMP | NVME_ONCS_DSM | NVME_ONCS_COMPARE | NVME_ONCS_FEATURES | NVME_ONCS_= COPY), + DEFINE_PROP_UINT16("oacs", NvmeCtrl, params.oacs, NVME_OACS_NS_MGMT), DEFINE_PROP_END_OF_LIST(), }; =20 --=20 2.30.1 From nobody Sun May 19 20:47:26 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 ARC-Seal: i=1; a=rsa-sha256; t=1615445937; cv=none; d=zohomail.com; s=zohoarc; b=nO1O8VDz1PkPj2Qkw7BlqqmoB7QvuAfbxR4jpFwhuNmVPZBO4iOPP2NKdy0+fgyKaDQRF8gNfc6pBzOvk9/Rat/PVDx/2mF6zYFHyFuLb8ijqPD8xAigkWMaQyJf6xqFscgwz8QPlvrjPfg40EVqpxeFgvQoxCddE13o0w1Z7OM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615445937; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jIrmriLD7n7uGGHBv7UG1gnryWKvPJ04VZMm+gJvINQ=; b=iiqam/hzZ9/F8oNoPLqp7RY5oxweoaO02Pv0xkuo2kyjnDSyHMPCfQWApPFToVKkeYuD9GR2WKhiLuqjm8NGMLyr80DghjrmH4N8tC1ibxyHdO1492Cbw/g/ulEied5aP7QFSmt3r5cNrBUWCoKkrFmFrX+vV2iwbQ0m5BPZEjQ= ARC-Authentication-Results: i=1; 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 1615445937029769.4979925563399; Wed, 10 Mar 2021 22:58:57 -0800 (PST) Received: from localhost ([::1]:55970 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lKFHb-0003fr-GF for importer@patchew.org; Thu, 11 Mar 2021 01:58:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:43732) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyO-0005iM-0D; Thu, 11 Mar 2021 01:39:04 -0500 Received: from new2-smtp.messagingengine.com ([66.111.4.224]:39213) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lKEyJ-0008DZ-H3; Thu, 11 Mar 2021 01:39:03 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.nyi.internal (Postfix) with ESMTP id 2CE92580BBF; Thu, 11 Mar 2021 01:38:58 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Thu, 11 Mar 2021 01:38:58 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id ADEB8108005F; Thu, 11 Mar 2021 01:38:56 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=jIrmriLD7n7uG GHBv7UG1gnryWKvPJ04VZMm+gJvINQ=; b=XCUpvZfXIjrVx/jrCOB5ZflcrfQhU LJCzBse+3zJRlt6YRvBMXgkCvfwqYzdF+tXHXUSyfPghRI4jWmhEQQByESToW2RR zLjdbHkOqaT73fubwHbAE5h61ORfWlOAJX1qhSlSnYK8ymPKCI7NguXSQtNmokG9 ixOq+of72yA6SyX5Zxq8LDgx7QMWEKYtHSKfPg2MuEaFxzIt4Vhl+pQ3Bqs3Pggr Mm0Uc+IzHBXVVw1B9qD0ms2LIercCrEtLge4yO37JEx/lpNKpIONsiL08GS9TDhi Ap8zg4TVKa9+A8lZYacfsEYnCPb908z2Ly2u6heU+yfVcuB72rB+YqIfA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=jIrmriLD7n7uGGHBv7UG1gnryWKvPJ04VZMm+gJvINQ=; b=SZsLuc36 oKWhwc5PqBTJB00zhbp0IzGOQ9KAK1IB7T6Ijk9T8lbzq01mqRboUkuS9d9igB8d c+3hEsTiglFqh1nfZJ62G6WnDYG9odQoqnVJJ/Mlg53G8LgvmOenPsn2OLuV1w0L 8YRkAZvMGm0JSYRF62u6e7G+UPlq3hR2u03HZePK7kdtRR3ituMey4OQ+5Eidk/z l1BTeyuT0iVg1VWilnhwGVCUngU7f3wbnK1SkNsf8azxz6Lfvhrs/vgmYE1nLN0A 9f4KsW5IwA62E5sTDtIoFrw1Ifv8g/WAoISD1VbBjZGHpujMhEXClEUSAhRVZ7Gj yDsR+nV4XGHpXw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudduledgleejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedtne curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH 3/3] hw/block/nvme: add administrative controller type Date: Thu, 11 Mar 2021 07:38:51 +0100 Message-Id: <20210311063851.757481-4-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210311063851.757481-1-its@irrelevant.dk> References: <20210311063851.757481-1-its@irrelevant.dk> 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.224; envelope-from=its@irrelevant.dk; helo=new2-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 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Padmakar Kalghatgi , qemu-block@nongnu.org, Klaus Jensen , Gollu Appalanaidu , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Padmakar Kalghatgi Add the 'administrative' nvme device parameter. This causes the controller to behave as an Administrative Controller. See NVM Express v1.4b, Section 7.1.2 ("Administrative Controller"). Signed-off-by: Padmakar Kalghatgi Signed-off-by: Gollu Appalanaidu Signed-off-by: Klaus Jensen --- hw/block/nvme.h | 1 + include/block/nvme.h | 8 ++++ hw/block/nvme-subsys.c | 6 ++- hw/block/nvme.c | 86 ++++++++++++++++++++++++++++++------------ 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/hw/block/nvme.h b/hw/block/nvme.h index cebe6018a234..364edb82b60e 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -31,6 +31,7 @@ typedef struct NvmeParams { bool legacy_cmb; uint16_t oncs; uint16_t oacs; + bool administrative; } NvmeParams; =20 typedef struct NvmeAsyncEvent { diff --git a/include/block/nvme.h b/include/block/nvme.h index 372d0f2799fb..907cd5a9cf62 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -586,6 +586,11 @@ enum NvmeIoCommands { NVME_CMD_ZONE_APPEND =3D 0x7d, }; =20 +enum NvmeIdCtrlCntrlType { + NVME_CNTRL_TYPE_IO =3D 0x1, + NVME_CNTRL_TYPE_ADMIN =3D 0x3, +}; + typedef struct QEMU_PACKED NvmeDeleteQ { uint8_t opcode; uint8_t flags; @@ -944,6 +949,8 @@ enum NvmeLogIdentifier { NVME_LOG_FW_SLOT_INFO =3D 0x03, NVME_LOG_CHANGED_NSLIST =3D 0x04, NVME_LOG_CMD_EFFECTS =3D 0x05, + + NVME_LID_MAX =3D 0x100, }; =20 typedef struct QEMU_PACKED NvmePSD { @@ -1165,6 +1172,7 @@ enum NvmeFeatureIds { NVME_TIMESTAMP =3D 0xe, NVME_COMMAND_SET_PROFILE =3D 0x19, NVME_SOFTWARE_PROGRESS_MARKER =3D 0x80, + NVME_FID_MAX =3D 0x100, }; =20 diff --git a/hw/block/nvme-subsys.c b/hw/block/nvme-subsys.c index af4804a819ee..051ef0f32b3f 100644 --- a/hw/block/nvme-subsys.c +++ b/hw/block/nvme-subsys.c @@ -60,7 +60,11 @@ int nvme_subsys_register_ns(NvmeNamespace *ns, Error **e= rrp) for (i =3D 0; i < ARRAY_SIZE(subsys->ctrls); i++) { n =3D subsys->ctrls[i]; =20 - if (n && nvme_register_namespace(n, ns, errp)) { + if (!n || n->params.administrative) { + continue; + } + + if (nvme_register_namespace(n, ns, errp)) { return -1; } } diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 8b8be3b5f121..f56748962e3f 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -94,6 +94,10 @@ * by the controller. To add support for the optional feature, needs to * set the corresponding support indicated bit. * + * - 'administrative' + * Set to true/on to make this an Administrative Controller. By default,= the + * controller will present itself as an I/O Controller. + * * nvme namespace device parameters * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - `subsys` @@ -186,6 +190,15 @@ static const bool nvme_feature_support[NVME_FID_MAX] = =3D { [NVME_TIMESTAMP] =3D true, }; =20 +static const bool nvme_admin_ctrl_feature_support[NVME_FID_MAX] =3D { + [NVME_POWER_MANAGEMENT] =3D true, + [NVME_TEMPERATURE_THRESHOLD] =3D true, + [NVME_INTERRUPT_COALESCING] =3D true, + [NVME_INTERRUPT_VECTOR_CONF] =3D true, + [NVME_ASYNCHRONOUS_EVENT_CONF] =3D true, + [NVME_TIMESTAMP] =3D true, +}; + static const uint32_t nvme_feature_cap[NVME_FID_MAX] =3D { [NVME_TEMPERATURE_THRESHOLD] =3D NVME_FEAT_CAP_CHANGE, [NVME_ERROR_RECOVERY] =3D NVME_FEAT_CAP_CHANGE | NVME_FEAT_C= AP_NS, @@ -3634,6 +3647,12 @@ static uint16_t nvme_get_feature_timestamp(NvmeCtrl = *n, NvmeRequest *req) return nvme_c2h(n, (uint8_t *)×tamp, sizeof(timestamp), req); } =20 +static inline bool nvme_check_fid_support(NvmeCtrl *n, uint8_t fid) +{ + return n->params.administrative ? + nvme_admin_ctrl_feature_support[fid] : nvme_feature_support[fid]; +} + static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) { NvmeCmd *cmd =3D &req->cmd; @@ -3653,7 +3672,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeReq= uest *req) =20 trace_pci_nvme_getfeat(nvme_cid(req), nsid, fid, sel, dw11); =20 - if (!nvme_feature_support[fid]) { + if (!nvme_check_fid_support(n, fid)) { return NVME_INVALID_FIELD | NVME_DNR; } =20 @@ -3831,7 +3850,7 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeReq= uest *req) return NVME_FID_NOT_SAVEABLE | NVME_DNR; } =20 - if (!nvme_feature_support[fid]) { + if (!nvme_check_fid_support(n, fid)) { return NVME_INVALID_FIELD | NVME_DNR; } =20 @@ -4829,25 +4848,27 @@ static void nvme_init_cse_iocs(NvmeCtrl *n) { uint16_t oncs =3D n->params.oncs; =20 - n->iocs.nvm[NVME_CMD_FLUSH] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC; - n->iocs.nvm[NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC; - n->iocs.nvm[NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP; + if (!n->params.administrative) { + n->iocs.nvm[NVME_CMD_FLUSH] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC; + n->iocs.nvm[NVME_CMD_WRITE] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC; + n->iocs.nvm[NVME_CMD_READ] =3D NVME_CMD_EFF_CSUPP; =20 - if (oncs & NVME_ONCS_WRITE_ZEROES) { - n->iocs.nvm[NVME_CMD_WRITE_ZEROES] =3D NVME_CMD_EFF_CSUPP | - NVME_CMD_EFF_LBCC; - } + if (oncs & NVME_ONCS_WRITE_ZEROES) { + n->iocs.nvm[NVME_CMD_WRITE_ZEROES] =3D NVME_CMD_EFF_CSUPP | + NVME_CMD_EFF_LBCC; + } =20 - if (oncs & NVME_ONCS_COMPARE) { - n->iocs.nvm[NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP; - } + if (oncs & NVME_ONCS_COMPARE) { + n->iocs.nvm[NVME_CMD_COMPARE] =3D NVME_CMD_EFF_CSUPP; + } =20 - if (oncs & NVME_ONCS_DSM) { - n->iocs.nvm[NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LB= CC; - } + if (oncs & NVME_ONCS_DSM) { + n->iocs.nvm[NVME_CMD_DSM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EF= F_LBCC; + } =20 - if (oncs & NVME_ONCS_COPY) { - n->iocs.nvm[NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_L= BCC; + if (oncs & NVME_ONCS_COPY) { + n->iocs.nvm[NVME_CMD_COPY] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_E= FF_LBCC; + } } =20 memcpy(n->iocs.zoned, n->iocs.nvm, sizeof(n->iocs.nvm)); @@ -4861,11 +4882,14 @@ static void nvme_init_cse_iocs(NvmeCtrl *n) =20 static void nvme_init_cse_acs(NvmeCtrl *n) { - n->acs[NVME_ADM_CMD_DELETE_SQ] =3D NVME_CMD_EFF_CSUPP; - n->acs[NVME_ADM_CMD_CREATE_SQ] =3D NVME_CMD_EFF_CSUPP; + if (!n->params.administrative) { + n->acs[NVME_ADM_CMD_DELETE_SQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_CREATE_SQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_DELETE_CQ] =3D NVME_CMD_EFF_CSUPP; + n->acs[NVME_ADM_CMD_CREATE_CQ] =3D NVME_CMD_EFF_CSUPP; + } + n->acs[NVME_ADM_CMD_GET_LOG_PAGE] =3D NVME_CMD_EFF_CSUPP; - n->acs[NVME_ADM_CMD_DELETE_CQ] =3D NVME_CMD_EFF_CSUPP; - n->acs[NVME_ADM_CMD_CREATE_CQ] =3D NVME_CMD_EFF_CSUPP; n->acs[NVME_ADM_CMD_IDENTIFY] =3D NVME_CMD_EFF_CSUPP; n->acs[NVME_ADM_CMD_ABORT] =3D NVME_CMD_EFF_CSUPP; n->acs[NVME_ADM_CMD_SET_FEATURES] =3D NVME_CMD_EFF_CSUPP; @@ -4913,6 +4937,12 @@ int nvme_register_namespace(NvmeCtrl *n, NvmeNamespa= ce *ns, Error **errp) { uint32_t nsid =3D nvme_nsid(ns); =20 + if (n->params.administrative) { + error_setg(errp, + "cannot attach namespace to administrative controller"); + return -1; + } + if (nsid > NVME_MAX_NAMESPACES) { error_setg(errp, "invalid namespace id (must be between 0 and %d)", NVME_MAX_NAMESPACES); @@ -5006,12 +5036,13 @@ static int nvme_init_pci(NvmeCtrl *n, PCIDevice *pc= i_dev, Error **errp) uint8_t *pci_conf =3D pci_dev->config; uint64_t bar_size, msix_table_size, msix_pba_size; unsigned msix_table_offset, msix_pba_offset; + uint8_t prog_interface =3D n->params.administrative ? 0x3 : 0x2; int ret; =20 Error *err =3D NULL; =20 pci_conf[PCI_INTERRUPT_PIN] =3D 1; - pci_config_set_prog_interface(pci_conf, 0x2); + pci_config_set_prog_interface(pci_conf, prog_interface); =20 if (n->params.use_intel_id) { pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL); @@ -5109,7 +5140,8 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pc= i_dev) id->mdts =3D n->params.mdts; id->ver =3D cpu_to_le32(NVME_SPEC_VER); id->oacs =3D cpu_to_le16(n->params.oacs); - id->cntrltype =3D 0x1; + id->cntrltype =3D n->params.administrative ? + NVME_CNTRL_TYPE_ADMIN : NVME_CNTRL_TYPE_IO; =20 /* * Because the controller always completes the Abort command immediate= ly, @@ -5159,7 +5191,12 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *p= ci_dev) id->cmic |=3D NVME_CMIC_MULTI_CTRL; } =20 - NVME_CAP_SET_MQES(n->bar.cap, 0x7ff); + if (n->params.administrative) { + NVME_CAP_SET_MQES(n->bar.cap, 0); + } else { + NVME_CAP_SET_MQES(n->bar.cap, 0x7ff); + } + NVME_CAP_SET_CQR(n->bar.cap, 1); NVME_CAP_SET_TO(n->bar.cap, 0xf); NVME_CAP_SET_CSS(n->bar.cap, NVME_CAP_CSS_NVM); @@ -5284,6 +5321,7 @@ static Property nvme_props[] =3D { NVME_ONCS_TIMESTAMP | NVME_ONCS_DSM | NVME_ONCS_COMPARE | NVME_ONCS_FEATURES | NVME_ONCS_= COPY), DEFINE_PROP_UINT16("oacs", NvmeCtrl, params.oacs, NVME_OACS_NS_MGMT), + DEFINE_PROP_BOOL("administrative", NvmeCtrl, params.administrative, fa= lse), DEFINE_PROP_END_OF_LIST(), }; =20 --=20 2.30.1