From nobody Sat Sep 05 00:31:19 2026 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 4hcDlr1BFNz6qZ98 for ; Sat, 05 Sep 2026 00:31:20 +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 4hcDlr0Nybz42KD for ; Sat, 05 Sep 2026 00:31:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1788568280; 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=ccA0mU0SBhREhpnKPavxYnrfBsaiMGrel4GSbr7dGew=; b=uy4GEB/Y8dXTUfNLMKKmKKb7rNcRYvsB9V74ubntSF473Mwc+ou7L8a8j2d4sUNaORJqS+ KwkcgJOk/zlBiW5REsrbWhFU40gJEou/1uTB8lrWfFehw0Nbk5HIigF5IVoSp2N6efuDEM teWwWobVW+Zcpre6K56JYtFEkQb7HZxfDdWopdU/DriamdqgiNhaONoCDn6BUm2vey/8nV MpeC1VTth5c2iZwXhqdM/F8+Tvc4LtlxBRm5TcNUPrmSVMOv0gHHES72qKkN1tZL6+9ucb l21WRbNsr2XDbcFAYOhWZvHBUkfEV8arcgxSafRtTXaYssWmL9NDzZn7UkUsEA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1788568280; a=rsa-sha256; cv=none; b=ivEBlhjI7F8JCxo/kfEQIUy4pjZ8ma9tJWLYVh/yyAF+w3I7Kkn9lQZzFnqS9KZLpIYRug hUyNo9MPsQgRzLyfA4yZGN86mr3pArIw4AP0Ch8HRVHAdIOwmjXmoxOzpJUCMnZYgIaBaA nlRZ54yzjOWeC8TTqNY+XbrWaQOzzGGWmtmDdEK0RJ+TT1CXiVXxEqsCIVtVzcxLzVd4BI +2lkZodnMbzTlt1Q+sJ76lhChLXzk8KhDQNZFQ/PuCwCS1JC1p8+n7dkhkN0wj1eJzZIqJ QrjooK7y1gMm8QtE+6A6CtNQTyIJAeiudwxuTQbZsyl8XQwve5JCkhD3iELoSQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1788568280; 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=ccA0mU0SBhREhpnKPavxYnrfBsaiMGrel4GSbr7dGew=; b=FhcDB2Qb+pfr4BLBgoqO+wUya/CTIDZ+oNMtgIZnbZs4zi5v1jgY35GJdU2PnbLJjjxsAC ujhszHrgXWNL7UXcduTew2qjpUmY1N/oHZZwDPXSjQJbRpt7lKTR+ougcQgCTTgQlzs3Rl Xd4FDmKTa00Qq5kyAIkJtB66MGZEc0uJPKBNFxGe40n7tjYO3StcbKcK32XqOUgKefJakE t2HuYwxEc5+JI1hWc4tlQQ6hrr/JM4stsLXPF+mmDr6Eh8CYSyYNGku9pLDGV2Xs1I1D22 +gBfXHxMdHN++LpOJmt7mYbPr+KzRrIFBjwo0jaTErrZnvHvC3PflPbYXInpdQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hcDlq6J5jz7JY for ; Sat, 05 Sep 2026 00:31:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1f43a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 05 Sep 2026 00:31:19 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kevin Bowling Subject: git: ac364c3b368c - stable/14 - ofw_pcibus: Honor device proximity for DMA tags 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 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: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: ac364c3b368c520930328d3a363f3aa921519b6c Auto-Submitted: auto-generated Date: Sat, 05 Sep 2026 00:31:19 +0000 Message-Id: <6a9b62d7.1f43a.77e16732@gitrepo.freebsd.org> The branch stable/14 has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=ac364c3b368c520930328d3a363f3aa921519b6c commit ac364c3b368c520930328d3a363f3aa921519b6c Author: Kevin Bowling AuthorDate: 2026-08-21 03:08:13 +0000 Commit: Kevin Bowling CommitDate: 2026-09-05 00:30:37 +0000 ofw_pcibus: Honor device proximity for DMA tags BUS_GET_DOMAIN can report a PCI function's firmware locality, including an SR-IOV VF's inherited PF locality, but ordinary OFW PCI functions still use the shared bus DMA tag. Consequently, busdma metadata and coherent memory can be allocated from the bus's domain instead of the function's domain. Create and cache a child tag for each function that requests a DMA tag and apply its reported domain without modifying the shared parent tag. Apply the same domain to the private IOMMU tag already created by the pSeries PCI bus. Destroy cached tags when PCI children are removed so VF create and destroy cycles do not leak them. Reviewed by: PowerPC (jhibbits) Sponsored by: BBOX.io Differential Revision: https://reviews.freebsd.org/D59065 (cherry picked from commit df6bbc9b17dcb75e220b9ab44f5a6483b47c562e) --- sys/powerpc/ofw/ofw_pcibus.c | 31 +++++++++++++++++++++++++++++++ sys/powerpc/pseries/plpar_pcibus.c | 3 +++ 2 files changed, 34 insertions(+) diff --git a/sys/powerpc/ofw/ofw_pcibus.c b/sys/powerpc/ofw/ofw_pcibus.c index cd1f0bd09483..9c2f09f24d75 100644 --- a/sys/powerpc/ofw/ofw_pcibus.c +++ b/sys/powerpc/ofw/ofw_pcibus.c @@ -65,6 +65,7 @@ static pci_alloc_devinfo_t ofw_pcibus_alloc_devinfo; static pci_assign_interrupt_t ofw_pcibus_assign_interrupt; static ofw_bus_get_devinfo_t ofw_pcibus_get_devinfo; static bus_child_deleted_t ofw_pcibus_child_deleted; +static bus_get_dma_tag_t ofw_pcibus_get_dma_tag; static int ofw_pcibus_child_pnpinfo_method(device_t cbdev, device_t child, struct sbuf *sb); @@ -81,6 +82,7 @@ static device_method_t ofw_pcibus_methods[] = { DEVMETHOD(bus_child_pnpinfo, ofw_pcibus_child_pnpinfo_method), DEVMETHOD(bus_rescan, bus_null_rescan), DEVMETHOD(bus_get_cpus, ofw_pcibus_get_cpus), + DEVMETHOD(bus_get_dma_tag, ofw_pcibus_get_dma_tag), DEVMETHOD(bus_get_domain, ofw_pcibus_get_domain), /* PCI interface */ @@ -293,10 +295,39 @@ ofw_pcibus_child_deleted(device_t dev, device_t child) struct ofw_pcibus_devinfo *dinfo; dinfo = device_get_ivars(child); + if (dinfo->opd_dma_tag != NULL) + bus_dma_tag_destroy(dinfo->opd_dma_tag); ofw_bus_gen_destroy_devinfo(&dinfo->opd_obdinfo); pci_child_deleted(dev, child); } +static bus_dma_tag_t +ofw_pcibus_get_dma_tag(device_t bus, device_t child) +{ + struct ofw_pcibus_devinfo *dinfo; + bus_dma_tag_t parent, tag; + int domain, error; + + if (device_get_parent(child) != bus) + return (pci_get_dma_tag(bus, child)); + dinfo = device_get_ivars(child); + if (dinfo->opd_dma_tag != NULL) + return (dinfo->opd_dma_tag); + + parent = pci_get_dma_tag(bus, child); + if (parent == NULL) + return (NULL); + error = bus_dma_tag_create(parent, 1, 0, BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE, + BUS_SPACE_UNRESTRICTED, BUS_SPACE_MAXSIZE, 0, NULL, NULL, &tag); + if (error != 0) + return (parent); + if (bus_get_domain(child, &domain) == 0) + (void)bus_dma_tag_set_domain(tag, domain); + dinfo->opd_dma_tag = tag; + return (tag); +} + static int ofw_pcibus_child_pnpinfo_method(device_t cbdev, device_t child, struct sbuf *sb) { diff --git a/sys/powerpc/pseries/plpar_pcibus.c b/sys/powerpc/pseries/plpar_pcibus.c index 60f4e0ec8785..e9360ae0871a 100644 --- a/sys/powerpc/pseries/plpar_pcibus.c +++ b/sys/powerpc/pseries/plpar_pcibus.c @@ -92,6 +92,7 @@ static bus_dma_tag_t plpar_pcibus_get_dma_tag(device_t dev, device_t child) { struct ofw_pcibus_devinfo *dinfo; + int domain; while (device_get_parent(child) != dev) child = device_get_parent(child); @@ -106,6 +107,8 @@ plpar_pcibus_get_dma_tag(device_t dev, device_t child) NULL, NULL, BUS_SPACE_MAXSIZE, BUS_SPACE_UNRESTRICTED, BUS_SPACE_MAXSIZE, 0, NULL, NULL, &dinfo->opd_dma_tag); phyp_iommu_set_dma_tag(dev, child, dinfo->opd_dma_tag); + if (bus_get_domain(child, &domain) == 0) + (void)bus_dma_tag_set_domain(dinfo->opd_dma_tag, domain); return (dinfo->opd_dma_tag); }