From nobody Thu Sep 24 14:20:33 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hrGFs2FKwz6sSxY for ; Thu, 24 Sep 2026 14:20:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hrGFs1hygz4BrD for ; Thu, 24 Sep 2026 14:20:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790259633; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pn47/BxHLsY751eIn2YOkNUnwXvHnX4j9c+Ai9poeIA=; b=HXIVcLviWFfPifw/S+5cVay+iuUhgJLvrD/tVazu7e2JQAr84JSQdfg0bxIKSjWHGX3Cv1 B+msnzNvvt3er8pnfeB2m0R0xxxQS7Mrd5WsrUQ98vnXeJOIzZiEE4HyZhru3iqCIRLa0X o0rIio0DX8NnrdXpU+tUNyd8Sy9q8PLwP3IJFMoxo6SHlKoFZANIKzjCPIqQWwl46PCPr6 jDUTq+VBgL3E/pyYuOdPijzBuHJOE/27MJnSVMtiOSKxU/cmfKhv0RzZixNll2Cw7tZZJT qi/tvoELuK31oeg2D8FLQYRzOlJ9sgU2WScsaOTPjDrQn+o7YZxKlCZE4+CG5g== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790259633; b=UGDpqfPG+I7os1GDAX5KAS5y8VRuJeZr5+gtZpAU6/+EqfsgrxoxY3IalWQc7pKCXZHiWL 4BkS+nQePz1cnbAiaUqcS+JGh8nKZDl2UHuGjVmVQQ5Fh0L43XUHYnQkDF+nGHzBt3rpHk Ny69Dw2JDyN2SN3GigWwjLprYa+T3NuO5KAbkpb9yLPM3Bpqm1mltMFCyBXGJyjPfujGRE tPNyfOJ1Kb+KksaYo0p34gMRmzX6vQN2fNh82RpiWYPw9rUFfyCaaSYt8Cisf6iD9kbjjE n5PjClxgCwX9BUfNOPSnu8AzyQZY9TWFiYK+05/pi3F/Fd1qxC1odsHsuHUBwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790259633; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pn47/BxHLsY751eIn2YOkNUnwXvHnX4j9c+Ai9poeIA=; b=Tso016shZ6qeW7fmdPCXGTPhBgI2BJOz16lfeFpUQBdjGaYpL/ydJ832CwSKWcXvGvN5S1 LSORhk8JBKomoTV4YIEprRsXBrVcN7T1rl9Q125CG4wIcap1QmHM9f76EIN/O2VjiYZfJY 0hJmUs0ZmXJGHASi5zh88XpHl3MMP8sUnU+MdSQosEn3jZC2O9pmr2IatThpNLLjaA3y38 CeFtWfZBPgCMVcCVtJcy2Af7BEdWf1vsufgpyipDwu2fl1fsQBuURNRvbdGnsrjiJSe43k fwgAYGEW7Nv+qMwaAGrfNF/Eklir4ZzW44D66q+3lYOVGuqWF07041JQ+RwKpQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hrGFs0mn7zRHJ for ; Thu, 24 Sep 2026 14:20:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 39ecb by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 24 Sep 2026 14:20:33 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Abdelkader Boudih Subject: git: 2c41f7d8a034 - main - nvme: honor FLBAS Format Index Upper when selecting the LBA format List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: seuros X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2c41f7d8a034ee64a0aaa69a1aa5cb07748a1a32 Auto-Submitted: auto-generated Date: Thu, 24 Sep 2026 14:20:33 +0000 Message-Id: <6ab531b1.39ecb.31ce1534@gitrepo.freebsd.org> The branch main has been updated by seuros: URL: https://cgit.FreeBSD.org/src/commit/?id=2c41f7d8a034ee64a0aaa69a1aa5cb07748a1a32 commit 2c41f7d8a034ee64a0aaa69a1aa5cb07748a1a32 Author: Abdelkader Boudih AuthorDate: 2026-09-24 14:19:51 +0000 Commit: Abdelkader Boudih CommitDate: 2026-09-24 14:19:51 +0000 nvme: honor FLBAS Format Index Upper when selecting the LBA format Added nvme_ns_data_format_index() in the nvme, nda, and nvmf host paths as well as nvmecontrol and camdd. Reviewed by: imp, adrian Differential Revision: https://reviews.freebsd.org/D59627 --- sbin/nvmecontrol/devlist.c | 2 +- sbin/nvmecontrol/format.c | 2 +- sbin/nvmecontrol/identify.c | 2 +- sys/cam/nvme/nvme_da.c | 2 +- sys/dev/nvme/nvme.h | 18 ++++++++++++++++++ sys/dev/nvme/nvme_ns.c | 4 ++-- sys/dev/nvmf/host/nvmf_ns.c | 4 ++-- usr.sbin/camdd/camdd.c | 2 +- 8 files changed, 27 insertions(+), 9 deletions(-) diff --git a/sbin/nvmecontrol/devlist.c b/sbin/nvmecontrol/devlist.c index ff492591197c..9fa8d27014e6 100644 --- a/sbin/nvmecontrol/devlist.c +++ b/sbin/nvmecontrol/devlist.c @@ -86,7 +86,7 @@ ns_get_sector_size(struct nvme_namespace_data *nsdata) { uint8_t flbas_fmt, lbads; - flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsdata->flbas); + flbas_fmt = nvme_ns_data_format_index(nsdata); lbads = NVMEV(NVME_NS_DATA_LBAF_LBADS, nsdata->lbaf[flbas_fmt]); return (1 << lbads); diff --git a/sbin/nvmecontrol/format.c b/sbin/nvmecontrol/format.c index 16699605ea8c..f339acc6e305 100644 --- a/sbin/nvmecontrol/format.c +++ b/sbin/nvmecontrol/format.c @@ -177,7 +177,7 @@ format(const struct cmd *f, int argc, char *argv[]) if (read_namespace_data(fd, nsid, &nsd)) errx(EX_IOERR, "Identify request failed"); if (lbaf < 0) - lbaf = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsd.flbas); + lbaf = nvme_ns_data_format_index(&nsd); if (lbaf > nsd.nlbaf) errx(EX_USAGE, "LBA format is out of range"); if (ms < 0) diff --git a/sbin/nvmecontrol/identify.c b/sbin/nvmecontrol/identify.c index 98a3141bf9ad..be5a343806ff 100644 --- a/sbin/nvmecontrol/identify.c +++ b/sbin/nvmecontrol/identify.c @@ -68,7 +68,7 @@ print_namespace(struct nvme_namespace_data *nsdata) thin_prov = NVMEV(NVME_NS_DATA_NSFEAT_THIN_PROV, nsdata->nsfeat); - flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsdata->flbas); + flbas_fmt = nvme_ns_data_format_index(nsdata); printf("Size: %lld blocks\n", (long long)nsdata->nsze); diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c index 31bb7c4b7d3c..e1831331f8f3 100644 --- a/sys/cam/nvme/nvme_da.c +++ b/sys/cam/nvme/nvme_da.c @@ -310,7 +310,7 @@ ndasetgeom(struct nda_softc *softc, struct cam_periph *periph) */ flags = disk->d_flags & DISKFLAG_UNMAPPED_BIO; /* Need to preserve */ - flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsd->flbas); + flbas_fmt = nvme_ns_data_format_index(nsd); lbads = NVMEV(NVME_NS_DATA_LBAF_LBADS, nsd->lbaf[flbas_fmt]); disk->d_sectorsize = 1 << lbads; disk->d_mediasize = (off_t)(disk->d_sectorsize * nsd->nsze); diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h index b7e82e83a13f..25e2bd67f258 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -559,6 +559,11 @@ enum nvme_psdt { #define NVME_NS_DATA_FLBAS_FORMAT_MASK (0xF) #define NVME_NS_DATA_FLBAS_EXTENDED_SHIFT (4) #define NVME_NS_DATA_FLBAS_EXTENDED_MASK (0x1) +#define NVME_NS_DATA_FLBAS_FORMAT_MSB_SHIFT (5) +#define NVME_NS_DATA_FLBAS_FORMAT_MSB_MASK (0x3) +/* FIDXL width, and the format count below which FIDXU is reserved. */ +#define NVME_NS_DATA_FLBAS_FIDXL_BITS (4) +#define NVME_NS_DATA_LBAF_BASE_COUNT (16) /** metadata capabilities */ /* metadata can be transferred as part of data prp list */ @@ -2083,6 +2088,19 @@ extern int nvme_use_nvd; #endif /* _KERNEL */ +static inline uint8_t +nvme_ns_data_format_index(const struct nvme_namespace_data *nsdata) +{ + uint8_t fmt; + + fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsdata->flbas); + /* FIDXU is valid only above the base count; NLBAF is 0's based. */ + if (nsdata->nlbaf + 1 > NVME_NS_DATA_LBAF_BASE_COUNT) + fmt |= NVMEV(NVME_NS_DATA_FLBAS_FORMAT_MSB, nsdata->flbas) << + NVME_NS_DATA_FLBAS_FIDXL_BITS; + return (fmt); +} + /* Endianess conversion functions for NVMe structs */ static inline void nvme_completion_swapbytes(struct nvme_completion *s __unused) diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c index f52e75bfa243..1124aaa4cad9 100644 --- a/sys/dev/nvme/nvme_ns.c +++ b/sys/dev/nvme/nvme_ns.c @@ -192,7 +192,7 @@ nvme_ns_get_sector_size(struct nvme_namespace *ns) { uint8_t flbas_fmt, lbads; - flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, ns->data.flbas); + flbas_fmt = nvme_ns_data_format_index(&ns->data); lbads = NVMEV(NVME_NS_DATA_LBAF_LBADS, ns->data.lbaf[flbas_fmt]); return (1 << lbads); @@ -568,7 +568,7 @@ nvme_ns_construct(struct nvme_namespace *ns, uint32_t id, * Check the validity of the format specified. Note: format is a 0-based * value, so > is appropriate here, not >=. */ - flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, ns->data.flbas); + flbas_fmt = nvme_ns_data_format_index(&ns->data); if (flbas_fmt > ns->data.nlbaf) { nvme_printf(ctrlr, "nsid %d lba format %d invalid (> %d)\n", id, flbas_fmt, ns->data.nlbaf + 1); diff --git a/sys/dev/nvmf/host/nvmf_ns.c b/sys/dev/nvmf/host/nvmf_ns.c index d57280e19d41..572649870e05 100644 --- a/sys/dev/nvmf/host/nvmf_ns.c +++ b/sys/dev/nvmf/host/nvmf_ns.c @@ -353,7 +353,7 @@ nvmf_init_ns(struct nvmf_softc *sc, uint32_t id, goto fail; } - lbaf = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, data->flbas); + lbaf = nvme_ns_data_format_index(data); if (lbaf > data->nlbaf) { ns_printf(ns, "Invalid LBA format index\n"); goto fail; @@ -505,7 +505,7 @@ nvmf_update_ns(struct nvmf_namespace *ns, return (false); } - lbaf = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, data->flbas); + lbaf = nvme_ns_data_format_index(data); if (lbaf > data->nlbaf) { ns_printf(ns, "Invalid LBA format index\n"); return (false); diff --git a/usr.sbin/camdd/camdd.c b/usr.sbin/camdd/camdd.c index 1f067113c562..3f36704646e3 100644 --- a/usr.sbin/camdd/camdd.c +++ b/usr.sbin/camdd/camdd.c @@ -1430,7 +1430,7 @@ camdd_probe_pass_nvme(struct cam_device *cam_dev, union ccb *ccb, *maxsector = nsdata.nsze; /* The LBA Data Size (LBADS) is reported as a power of 2 */ - format = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, nsdata.flbas); + format = nvme_ns_data_format_index(&nsdata); lbads = NVMEV(NVME_NS_DATA_LBAF_LBADS, nsdata.lbaf[format]); *block_len = 1 << lbads;