From nobody Sat Sep 05 00:30:07 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 4hcDkR5RbXz6qYyl for ; Sat, 05 Sep 2026 00:30:07 +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 4hcDkR3hfyz414k for ; Sat, 05 Sep 2026 00:30:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1788568207; 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=iUZ1eaW+O7TIqPfEiiq2c7Gi8chf6yTTHF4LYGTs1BM=; b=sNXW+PxCpJ+wRhYhn/sqnYDdwDZMce9dtZqIdf92OsuFpFjaNgAzcS9ASuj9lhyQ0z0fLS t9ni/JZ6maL8DdCW/z71DheGoMdLCormv3cHaoCjKiyu0kcNaXCYI8o4MBBHwHwsrfe2eD aFJ1efXQwbrZu3JNqMDKUlS33tM6wtADAZzVRMnFvdWBgZLt1h2jQRvPmvu3A7M9tT6Y3C 3V04XBqKoFzEitqzTujKms97lSX2eaxYCbOxEuCaUyCNU2FrPMVgu86aev8yDzxOvHpbfq v/p9i8enosYDV7dz5M4no9Jm6/Aq7yRZ9HuJZ6HikxDaPCRopT20R7VkoBMaUg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1788568207; a=rsa-sha256; cv=none; b=n8bZjai1JLwQfNjbFlzM7ZfGPesY3w8sx8sJKCj98xmH9Ysz1yj/K2tm++DUZsqDIgnnG8 fMs/TXZ4OvEs+G4g/BTmRI51WvH8PFJeuFVAOCLrbF5VtB+0lvAxLHcq426OGSHIz3EzS8 Kz+FKbkJTnaUar+tHDklZi5yFFYi1zcyAn5O+lNI4BCbfIWeaAe9vGana8Dj6M8Q4Cw8xN ZgNW41H2gEbXEPxHT20UeifvRctXaUYi0IboPnHW50XQJwqhvOykVsVLpc9o0KoSROMape w6gMhSpFJRRm88qV04Zp960j+OHWlGhAZ1FLiPWn+vd4LllnDQ2qsy8t2dvraA== 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=1788568207; 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=iUZ1eaW+O7TIqPfEiiq2c7Gi8chf6yTTHF4LYGTs1BM=; b=KzDAjlF5bgf22y/pJSfKJg8rKd0pk4ATVF/7ab67UtFFC3w0C9m9gVsfVCyZzhsuNXjEv5 5ci4ENBYnkooeF7nFwM06RK8EhVWXQjEQOq1tGXzi4//woROJQtf++vh8UaTFTdKmgaVgk /p9rOk7bF4qnppnJiWq2dZWD7HnGZyw2pgAMCX9m24c9uJAVJc69PUrTJyHuOJC6FlN1xr C+DsHmgo79S7ZnpCWYm13w45jlcnoDped7BZxLmG1yFaoqVl7L5cpGSlz7VM8IvTAa9Xbm 9YczqGWlriGF6uBwRH5KPOKcg+BAN+6gJg5xS0msJJSrLjJGmSTsfx6MdWIS6g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hcDkR2jZ0z7fr for ; Sat, 05 Sep 2026 00:30:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1f392 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 05 Sep 2026 00:30:07 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kevin Bowling Subject: git: 6878cf03baab - stable/15 - 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/15 X-Git-Reftype: branch X-Git-Commit: 6878cf03baab0a647bf68186333c7a6037026e30 Auto-Submitted: auto-generated Date: Sat, 05 Sep 2026 00:30:07 +0000 Message-Id: <6a9b628f.1f392.2d7e59c7@gitrepo.freebsd.org> The branch stable/15 has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=6878cf03baab0a647bf68186333c7a6037026e30 commit 6878cf03baab0a647bf68186333c7a6037026e30 Author: Kevin Bowling AuthorDate: 2026-08-21 03:08:13 +0000 Commit: Kevin Bowling CommitDate: 2026-09-05 00:29:17 +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 2c759f35cb69..e6ddbdf0e835 100644 --- a/sys/powerpc/ofw/ofw_pcibus.c +++ b/sys/powerpc/ofw/ofw_pcibus.c @@ -64,6 +64,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); @@ -80,6 +81,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 653bb83b397a..b1c20237bf15 100644 --- a/sys/powerpc/pseries/plpar_pcibus.c +++ b/sys/powerpc/pseries/plpar_pcibus.c @@ -91,6 +91,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); @@ -105,6 +106,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); }