Date: Sat, 09 Apr 2022 15:50:46 -0700 From: Ravi Pokala <rpokala@freebsd.org> To: Warner Losh <imp@FreeBSD.org>, <src-committers@FreeBSD.org>, <dev-commits-src-all@FreeBSD.org>, <dev-commits-src-main@FreeBSD.org> Subject: Re: 214df80a9cb3 - main - nvme: new define for size of host memory buffer sizes Message-ID: <3BC728DB-39BB-43BC-BECE-720FECB5B20D@panasas.com> In-Reply-To: <202204090506.239567Ag038413@gitrepo.freebsd.org> References: <202204090506.239567Ag038413@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
-----Original Message----- From: <owner-src-committers@freebsd.org> on behalf of Warner Losh <imp@Free= BSD.org> Date: 2022-04-08, Friday at 22:06 To: <src-committers@FreeBSD.org>, <dev-commits-src-all@FreeBSD.org>, <dev-c= ommits-src-main@FreeBSD.org> Subject: git: 214df80a9cb3 - main - nvme: new define for size of host memor= y buffer sizes The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=3D214df80a9cb3e95a140b13af7d= 19deec2bbfae76 commit 214df80a9cb3e95a140b13af7d19deec2bbfae76 Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2022-04-09 05:01:06 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2022-04-09 05:05:25 +0000 nvme: new define for size of host memory buffer sizes The nvme spec defines the various fields that specify sizes for hos= t memory buffers in terms of 4096 chunks. So, rather than use a bare = 4096 here, use NVME_HMB_UNITS. This is explicitly not the host page size= of 4096, nor the default memory page size (mps) of the NVMe drive, but= its own thing and needs its own define. Hi Warner, Are you sure about that?=20 NVMe-1.4, Figure 297: Host Memory Buffer =E2=80=93 Host Memory Buffer Descriptor = Entry | Buffer Size (BSIZE): Indicates the number of contiguous | memory page size (CC.MPS) units for this descriptor. |=20 | Buffer Address (BADD): Indicates the host memory address for | this descriptor aligned to the memory page size (CC.MPS).=20 | The lower bits (n:0) of this field indicate the offset | within the memory page is 0h (e.g., if the memory page size | is 4 KiB, then bits 11:00 shall be 0h; if the memory page | size is 8 KiB, then bits 12:00 shall be 0h). They both reference mps, not 4096 bytes. -Ravi (rpokala@) No functional change is intended, only the logical spelling of 4k. Sponsored by: Netflix --- sys/dev/nvme/nvme.h | 3 +++ sys/dev/nvme/nvme_ctrlr.c | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h index f2ef2467c9b1..55e94c40dd2c 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -62,6 +62,9 @@ /* Cap transfers by the maximum addressable by page-sized PRP (4KB -> = 2MB). */ #define NVME_MAX_XFER_SIZE MIN(maxphys, (PAGE_SIZE/8*PAGE_SIZE)) +/* Host memory buffer sizes are always in 4096 byte chunks */ +#define NVME_HMB_UNITS 4096 + /* Register field definitions */ #define NVME_CAP_LO_REG_MQES_SHIFT (0) #define NVME_CAP_LO_REG_MQES_MASK (0xFFFF) diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index 95a2b5c4285d..6996b3151b0d 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -936,11 +936,11 @@ nvme_ctrlr_hmb_alloc(struct nvme_controller *ctrl= r) max =3D (uint64_t)physmem * PAGE_SIZE / 20; TUNABLE_UINT64_FETCH("hw.nvme.hmb_max", &max); - min =3D (long long unsigned)ctrlr->cdata.hmmin * 4096; + min =3D (long long unsigned)ctrlr->cdata.hmmin * NVME_HMB_UNITS; if (max =3D=3D 0 || max < min) return; - pref =3D MIN((long long unsigned)ctrlr->cdata.hmpre * 4096, max); - minc =3D MAX(ctrlr->cdata.hmminds * 4096, PAGE_SIZE); + pref =3D MIN((long long unsigned)ctrlr->cdata.hmpre * NVME_HMB_UNITS, m= ax); + minc =3D MAX(ctrlr->cdata.hmminds * NVME_HMB_UNITS, PAGE_SIZE); if (min > 0 && ctrlr->cdata.hmmaxd > 0) minc =3D MAX(minc, min / ctrlr->cdata.hmmaxd); ctrlr->hmb_chunk =3D pref; @@ -1023,7 +1023,7 @@ again: for (i =3D 0; i < ctrlr->hmb_nchunks; i++) { ctrlr->hmb_desc_vaddr[i].addr =3D htole64(ctrlr->hmb_chunks[i].hmbc_paddr); - ctrlr->hmb_desc_vaddr[i].size =3D htole32(ctrlr->hmb_chunk / 4096); + ctrlr->hmb_desc_vaddr[i].size =3D htole32(ctrlr->hmb_chunk / NVME_HMB_= UNITS); } bus_dmamap_sync(ctrlr->hmb_desc_tag, ctrlr->hmb_desc_map, BUS_DMASYNC_PREWRITE);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3BC728DB-39BB-43BC-BECE-720FECB5B20D>