From nobody Tue Nov 04 18:16:17 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 4d1GqQ0jXFz657LV; Tue, 04 Nov 2025 18:16:18 +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 4d1GqQ03Q6z3qlq; Tue, 04 Nov 2025 18:16:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762280178; 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=ZIdlz5PSBv2eg2lkZiZVQmfIJomrTjtS7qe+mJVL+U4=; b=GhcmxdqqRkIvnU25Dm2kFuJ4dp/KQENcbncax3y/Wmm2VLwbszscOM8uGi1TRemfleDv6m 0VuJHEeECps5L7GzDm9aiNUAH7O6TR9aCSoyOUR5V4bkXQerSzm9m2tqsD77yllXD1A4g8 Pd2dyjyRUwEovvw/0WNnMOmteW8sfX2t7ZakW+296HDXso8Rx77mHr5f5F7HtTT6OEzXZd 5GVPEqjI52diN+ZumPNE7sCq3AjJUouB3sprnS7YLkSIj75fsM/EQcOAkDvZI1NFhoy0z3 xPuBZ7QUBw1/68u9XNWM/F3nOw/t/xGDrXltHBxRbrMHheF2SPEaS4R/1Jeb1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1762280178; 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=ZIdlz5PSBv2eg2lkZiZVQmfIJomrTjtS7qe+mJVL+U4=; b=OesuHTiS22KdluZ1yOarmocsaC/lJEafZRmSC3PiF6KIow/RBRPZ+UjPROmp8kpDjBjylH Fc0Azqlec9OGe/+LUB5hCPJezdLAY4uJn4aGioxCncH/OtAEtIfYeaHaZs7X9rV4444nAv i0UGE53tNL6KneeYqwgmWk+QuqlnFTQrIqVYoqxG1k1vYwSyeEoFP6H5VFCopM95tr2Yao Z66wj1u5hjrUSog+nZiNy7cCfeFzaclKXEAAoDhN2ztAwC2fOKyQqm8Vx+qzyqK0X2g0Fz ne41PxzO57e8c4QZ6vDQE+1vTBPIGVJOeS6NLHuUrACKRFCg/Y5TNTguFRYedg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1762280178; a=rsa-sha256; cv=none; b=U+nCq9iTSn18BN6a+VYG4Chm+uQHdQB5sd+aTM5No8+yl4DkkZzwaNOyJRzpgYggCUJ0ev Oy0cZw568bySHnjZmNW3JkDgk8iJTrgOJ93++vV0RoP3ASGEs7EFz3q+IOQeR6qh74DYmZ gahB/2JANnAaRY6iTTTLGTu3yXZYPotYwtBWEm8419Rg2N1QhsQK6w3XU8hrJFlycZU3VZ yZ4bxnHD5CozSfW90V1u8fxIFGYG5GA9QwG4Su4+p5PCQEZpLmHp4zdFegr4cApXhm2kfX lp6SN2HhsDWcXrdzOJmCSIEpoOhWVx3D5/wuciDjvJXvm7zOVIoSwZH0AOtxZg== 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 4d1GqP6kQYz16hc; Tue, 04 Nov 2025 18:16:17 +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 5A4IGHJt020556; Tue, 4 Nov 2025 18:16:17 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5A4IGHJL020553; Tue, 4 Nov 2025 18:16:17 GMT (envelope-from git) Date: Tue, 4 Nov 2025 18:16:17 GMT Message-Id: <202511041816.5A4IGHJL020553@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Alexander Ziaee Subject: git: dca645cd3112 - stable/14 - 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: ziaee X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: dca645cd3112feefee2dce8cab029b1b779823b8 Auto-Submitted: auto-generated The branch stable/14 has been updated by ziaee: URL: https://cgit.FreeBSD.org/src/commit/?id=dca645cd3112feefee2dce8cab029b1b779823b8 commit dca645cd3112feefee2dce8cab029b1b779823b8 Author: Jasper Tran O'Leary AuthorDate: 2025-10-28 20:43:35 +0000 Commit: Alexander Ziaee CommitDate: 2025-11-04 18:15:17 +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. 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) --- 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 6f5d6ae74add..ce203e2869fd 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1584,9 +1584,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 a78327ba0e8b..9c40c3d9f5c7 100644 --- a/sys/dev/nvme/nvme_pci.c +++ b/sys/dev/nvme/nvme_pci.c @@ -154,11 +154,15 @@ 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); } @@ -168,15 +172,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); } @@ -202,9 +223,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 36e04ceb7f31..93833672674a 100644 --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -233,8 +233,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;