From nobody Tue Nov 04 00:30:04 2025 X-Original-To: dev-commits-src-branches@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 4d0q9913L2z6G5dQ; Tue, 04 Nov 2025 00:30:05 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4d0q9874DGz3r8S; Tue, 04 Nov 2025 00:30:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762216205; 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=kAFV6uErMF/Vw1kGj4BFfLKY1L9jJ6YzDlD5WZCf9O8=; b=dLZ1quLXWloz50OqAs2QW6hcrbZ2U7Nabh+1BSHeGsS9TlluDaWRfDryU3VHDoyxw5hl+J GH7VqGjxaRx9ouyGBC6pmmbPErsO4cbLCxP/UCy05FU+t91c2m36G26DTBPmjZAPtl24CY /KO19yVf1FNBEYc7QWBwQeLLF5QcnFkChryk14EkN6baPo6yjdFc+gqTg8iZQOyYhSiebs jFiV5icIbJIpGtOVxyHLB3X91o4GIKN/1+EkQ/33M6HszxfTsP4I0LM1mB4WBBJX9/2R+D 0rrkx6US2KKwiYVQ8UdtWTyD7IYg0Kx1qIH2KaRroBk89el1nCY+7+gyqT9ACw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762216205; 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=kAFV6uErMF/Vw1kGj4BFfLKY1L9jJ6YzDlD5WZCf9O8=; b=JKX6Q7zvdU6ae7HS4WC2WK5DOIx+zVUNrEmmrALCmh42Fof31SGh4aODMydOgHvzUE3B+X D79sVfmRws9BPtg/04kRFbuECS9m2rQJotMkCa6Kffqit26ScmQ9wiQazM9IeWWXIlZHCU qAMbGoA6R850fHuai4FDJmDI3Z3QsRxgUqUHJX0nwh4S3uhJmJLjeCP7pD+qB8wH6ZzR6I RGUrZYXroxWsfObPVp3mjB4o4X/nbkXLsk09v31hDxnuu1dEiFEEPYvA70JpThGUOeqeQM UxhXRbjj4Rcjgnl8rofpNNVyguK34ILYEOdK86WvCSeCkPtm5VnHmOuZABgEHg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1762216205; a=rsa-sha256; cv=none; b=h8Ea466vWzQskUjMrXyCkCiZLyrZFo8TDjOVrS9VuoDiltT+yLagFwSjV3X2ogZGKnJWYZ iqcpoa+z5daIjAizPIpaweWr3uK6EJ1wBSiaER9iO5sEMPtlzRBzeD0Dbnrwzdmwd+DVdp WeWubYLCwlo4ci24f2UQ57kzcXgHhpLCt5zJ/ADKi7aNclFo4SbBjTfQ20PgSWJrq1EpPy rd1Y5BIzFur1vAG04fD/frf88xm1Nn7YrSgWaB9cyuPkfVTeKJlJ5banBnsw/KRVSPSuAN iqCpMb0Lk9oKzgamO9v6sOGAK6fHlb98QARmY9qR6Q3xyAGbyOBhhQ5sQIjzeA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4d0q986GnZzZkG; Tue, 04 Nov 2025 00:30:04 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5A40U4Oo005497; Tue, 4 Nov 2025 00:30:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5A40U4Zg005492; Tue, 4 Nov 2025 00:30:04 GMT (envelope-from git) Date: Tue, 4 Nov 2025 00:30:04 GMT Message-Id: <202511040030.5A40U4Zg005492@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Colin Percival Subject: git: 144529148065 - releng/15.0 - nvme: Add handling for bar5 List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cperciva X-Git-Repository: src X-Git-Refname: refs/heads/releng/15.0 X-Git-Reftype: branch X-Git-Commit: 1445291480651dc5ee53217632dbdcc0d7eaad66 Auto-Submitted: auto-generated The branch releng/15.0 has been updated by cperciva: URL: https://cgit.FreeBSD.org/src/commit/?id=1445291480651dc5ee53217632dbdcc0d7eaad66 commit 1445291480651dc5ee53217632dbdcc0d7eaad66 Author: Jasper Tran O'Leary AuthorDate: 2025-10-28 20:43:35 +0000 Commit: Colin Percival CommitDate: 2025-11-04 00:29:52 +0000 nvme: Add handling for bar5 The NVMe spec allows the Table BIR (TBIR) and PBA DIR (PBIR) to be 0, 4, or 5. The existing NVMe driver basically only has support for 4, perhaps under the assumption that BAR4 is 64-bit and also occupies BAR5. This change adds support for BAR5, covering the case where BAR4 and BAR5 might both be present and 32-bit, where the Table BIR might be 4 and the PBA BIR might be 5, or vice versa. The NVMe spec (in the SR-IOV section) also permits VFs to use BIR=2, so I haven't added stricter checks on which BIR will be permitted by the driver. This enables FreeBSD on Google Compute Engine C4 Machines. Approved by: re (cperciva) MFC after: 3 days Reviewed by: imp Sponsored by: Google Co-authored-by: Matt Delco Signed-off-by: Jasper Tran O'Leary Differential Revision: https://reviews.freebsd.org/D53140 (cherry picked from commit 7b32f4f0a7fe9b1b2f5a3905ca15f656713255ad) (cherry picked from commit 6c321dc15d5234742c6452e975f41f4a24b52e1d) --- sys/dev/nvme/nvme_ctrlr.c | 9 +++++++-- sys/dev/nvme/nvme_pci.c | 48 ++++++++++++++++++++++++++++++++++----------- sys/dev/nvme/nvme_private.h | 6 ++++-- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index fc912c1342f4..6ed9cb33f991 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1746,9 +1746,14 @@ noadminq: bus_release_resource(ctrlr->dev, SYS_RES_IRQ, rman_get_rid(ctrlr->res), ctrlr->res); - if (ctrlr->bar4_resource != NULL) { + if (ctrlr->msix_table_resource != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, - ctrlr->bar4_resource_id, ctrlr->bar4_resource); + ctrlr->msix_table_resource_id, ctrlr->msix_table_resource); + } + + if (ctrlr->msix_pba_resource != NULL) { + bus_release_resource(dev, SYS_RES_MEMORY, + ctrlr->msix_pba_resource_id, ctrlr->msix_pba_resource); } bus_release_resource(dev, SYS_RES_MEMORY, diff --git a/sys/dev/nvme/nvme_pci.c b/sys/dev/nvme/nvme_pci.c index c07a68d2f0dc..cecb05ca0a92 100644 --- a/sys/dev/nvme/nvme_pci.c +++ b/sys/dev/nvme/nvme_pci.c @@ -152,11 +152,15 @@ static int nvme_ctrlr_allocate_bar(struct nvme_controller *ctrlr) { ctrlr->resource_id = PCIR_BAR(0); + ctrlr->msix_table_resource_id = -1; + ctrlr->msix_table_resource = NULL; + ctrlr->msix_pba_resource_id = -1; + ctrlr->msix_pba_resource = NULL; ctrlr->resource = bus_alloc_resource_any(ctrlr->dev, SYS_RES_MEMORY, &ctrlr->resource_id, RF_ACTIVE); - if(ctrlr->resource == NULL) { + if (ctrlr->resource == NULL) { nvme_printf(ctrlr, "unable to allocate pci resource\n"); return (ENOMEM); } @@ -166,15 +170,32 @@ nvme_ctrlr_allocate_bar(struct nvme_controller *ctrlr) ctrlr->regs = (struct nvme_registers *)ctrlr->bus_handle; /* - * The NVMe spec allows for the MSI-X table to be placed behind - * BAR 4/5, separate from the control/doorbell registers. Always - * try to map this bar, because it must be mapped prior to calling - * pci_alloc_msix(). If the table isn't behind BAR 4/5, - * bus_alloc_resource() will just return NULL which is OK. + * The NVMe spec allows for the MSI-X tables to be placed behind + * BAR 4 and/or 5, separate from the control/doorbell registers. */ - ctrlr->bar4_resource_id = PCIR_BAR(4); - ctrlr->bar4_resource = bus_alloc_resource_any(ctrlr->dev, SYS_RES_MEMORY, - &ctrlr->bar4_resource_id, RF_ACTIVE); + + ctrlr->msix_table_resource_id = pci_msix_table_bar(ctrlr->dev); + ctrlr->msix_pba_resource_id = pci_msix_pba_bar(ctrlr->dev); + + if (ctrlr->msix_table_resource_id >= 0 && + ctrlr->msix_table_resource_id != ctrlr->resource_id) { + ctrlr->msix_table_resource = bus_alloc_resource_any(ctrlr->dev, + SYS_RES_MEMORY, &ctrlr->msix_table_resource_id, RF_ACTIVE); + if (ctrlr->msix_table_resource == NULL) { + nvme_printf(ctrlr, "unable to allocate msi-x table resource\n"); + return (ENOMEM); + } + } + if (ctrlr->msix_pba_resource_id >= 0 && + ctrlr->msix_pba_resource_id != ctrlr->resource_id && + ctrlr->msix_pba_resource_id != ctrlr->msix_table_resource_id) { + ctrlr->msix_pba_resource = bus_alloc_resource_any(ctrlr->dev, + SYS_RES_MEMORY, &ctrlr->msix_pba_resource_id, RF_ACTIVE); + if (ctrlr->msix_pba_resource == NULL) { + nvme_printf(ctrlr, "unable to allocate msi-x pba resource\n"); + return (ENOMEM); + } + } return (0); } @@ -200,9 +221,14 @@ bad: ctrlr->resource_id, ctrlr->resource); } - if (ctrlr->bar4_resource != NULL) { + if (ctrlr->msix_table_resource != NULL) { + bus_release_resource(dev, SYS_RES_MEMORY, + ctrlr->msix_table_resource_id, ctrlr->msix_table_resource); + } + + if (ctrlr->msix_pba_resource != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, - ctrlr->bar4_resource_id, ctrlr->bar4_resource); + ctrlr->msix_pba_resource_id, ctrlr->msix_pba_resource); } if (ctrlr->tag) diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h index 52e9fcbbebcd..a425a6a5ad62 100644 --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -235,8 +235,10 @@ struct nvme_controller { * separate from the control registers which are in BAR 0/1. These * members track the mapping of BAR 4/5 for that reason. */ - int bar4_resource_id; - struct resource *bar4_resource; + int msix_table_resource_id; + struct resource *msix_table_resource; + int msix_pba_resource_id; + struct resource *msix_pba_resource; int msi_count; uint32_t enable_aborts;