From nobody Tue Apr 29 18:30:31 2025 X-Original-To: dev-commits-src-all@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 4Zn8550l0cz5vN8T; Tue, 29 Apr 2025 18:30:33 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zn854128zz4HZB; Tue, 29 Apr 2025 18:30:32 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745951432; 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=5TEtfLoGvIETe+JeGvobcKXzUfJ2rgiz4oN7/LXg+9I=; b=uOvag5ZgYcJkd3pOlkYrw2FgI6nKvNmvEoKKOTHm+wbnv9ttxX/iBeSycKykkL8k2cuiHD vOm34+wpvx9u03PYYU+lLCzf6Seq63vFRhSN7Nrbuzz2ScxElHr6ZkzEoVWZ0bt/yU2UKq AVPVZosYyodnDV0wT7D/1c4Puf/EzcdxbjYOdNWKyWvwIVcFNmjk29gsO6t/mDRC6g/Hci kFkfh9B3RqipjKy5LPB/ohfHGspLIjk01TQpvjI+MzMyMU4JidgOXCjIuMkw8CfqO2+4rO u3LBFmpPjwSrzznJguehQ4O3pxJvnepBAlWKDHmQYRMoAVRCcSTScdV08+/d/g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745951432; a=rsa-sha256; cv=none; b=qln+81wsTemUhzQaHsYQ8x8/iB5ZIGc0kxkEO+0nrL2csqtQZcbsDFu7mJrX59UAu6zWhL La4qVgIiVhzEJ56RRKgBKKNyWWyg8PnGAGk4q9xHUUga/JOPIey68Ej8xWT3pVIVcetjE6 R0DpQ7NZXJ5zlvDeM6Y6taAHr2EnSkpIoUKMryMhmsm1+QmrH1LpsrRMrRJMCLl5Rpd6k/ ZTmQAMHDE9ipitm6/7bjF/hokjH7qEBInRiGkwAfbPX4gCyWXOheidxwu5MicZjLlwjcKy jHEYdYUAvTSgI4t5PTte696j4ckegCkTbYkmZWFe0a4v+A5QsEpcnXdYjQ/jTw== 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=1745951432; 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=5TEtfLoGvIETe+JeGvobcKXzUfJ2rgiz4oN7/LXg+9I=; b=XzsyPU9CyQuPT1ji70s8OhlNoNe32+DBz8zPsJFk4Gm9Jn2CxKJAFuust+DoFMLqLC+haK abNEb09+uGsNnatiSlUk2+htZ2gVC059eJ/k/jyqjEye/RVV4nZjL+mdlysE7ILk5nTmNb Vi3jHOBXqM2/MqxI6fotrOPTOZgTzxQr/GgtF9kMAxC+vU++bBngRMy+3L7wHg3aJpDE0n tT1m+mrDr3An+zkqYZQcVEYFCsfMG8kaXiASkKwCmuTlEGX2IFcEbynymd5FtvFiQZYMCe QIqYrCrDxsBit/13q45Yf/l9Y7+jRXrfX4gU/AZEswI3iQAdMNaJEqop5rPcLQ== 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 4Zn8540ZXbzXRL; Tue, 29 Apr 2025 18:30:32 +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 53TIUVgK022377; Tue, 29 Apr 2025 18:30:31 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53TIUVkW022373; Tue, 29 Apr 2025 18:30:31 GMT (envelope-from git) Date: Tue, 29 Apr 2025 18:30:31 GMT Message-Id: <202504291830.53TIUVkW022373@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 34f9dca1917b - stable/14 - pci: avoid accidental clobbering of regs on some fdt platforms List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 34f9dca1917b7837f7d1f5475b2e0d7be2ced717 Auto-Submitted: auto-generated The branch stable/14 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=34f9dca1917b7837f7d1f5475b2e0d7be2ced717 commit 34f9dca1917b7837f7d1f5475b2e0d7be2ced717 Author: Kyle Evans AuthorDate: 2024-12-29 03:57:03 +0000 Commit: John Baldwin CommitDate: 2025-04-29 14:17:50 +0000 pci: avoid accidental clobbering of regs on some fdt platforms Most pci controllers will just have a single reg for the config space, but others (e.g., on Apple Silicon) may have more following that to describe, e.g., controller port space. Bump the "ranges" rid space up to avoid overriding these other memory resources. Reviewed by: jhb Differential Revision: https://reviews.freebsd.org/D43921 (cherry picked from commit b313229969cc56a057dfea28506784fd5468c6f3) --- sys/dev/pci/pci_host_generic.c | 22 +++++++++++++++++----- sys/dev/pci/pci_host_generic.h | 1 + sys/dev/pci/pci_host_generic_acpi.c | 1 + sys/dev/pci/pci_host_generic_fdt.c | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c index ff8d222e3fd3..2552dc6cc599 100644 --- a/sys/dev/pci/pci_host_generic.c +++ b/sys/dev/pci/pci_host_generic.c @@ -59,6 +59,12 @@ #define PCI_RF_FLAGS 0 #endif +/* + * We allocate "ranges" specified mappings higher up in the rid space to avoid + * conflicts with various definitions in the wild that may have other registers + * attributed to the controller besides just the config space. + */ +#define RANGE_RID(idx) ((idx) + 100) /* Forward prototypes */ @@ -173,7 +179,7 @@ pci_host_generic_core_attach(device_t dev) phys_base = sc->ranges[tuple].phys_base; pci_base = sc->ranges[tuple].pci_base; size = sc->ranges[tuple].size; - rid = tuple + 1; + rid = RANGE_RID(tuple); if (size == 0) continue; /* empty range element */ switch (FLAG_TYPE(sc->ranges[tuple].flags)) { @@ -210,6 +216,7 @@ pci_host_generic_core_attach(device_t dev) error); continue; } + sc->ranges[tuple].rid = rid; sc->ranges[tuple].res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE | RF_UNMAPPED | flags); if (sc->ranges[tuple].res == NULL) { @@ -246,7 +253,7 @@ int pci_host_generic_core_detach(device_t dev) { struct generic_pcie_core_softc *sc; - int error, tuple, type; + int error, rid, tuple, type; sc = device_get_softc(dev); @@ -255,8 +262,13 @@ pci_host_generic_core_detach(device_t dev) return (error); for (tuple = 0; tuple < MAX_RANGES_TUPLES; tuple++) { - if (sc->ranges[tuple].size == 0) + rid = sc->ranges[tuple].rid; + if (sc->ranges[tuple].size == 0) { + MPASS(sc->ranges[tuple].res == NULL); continue; /* empty range element */ + } + + MPASS(rid != -1); switch (FLAG_TYPE(sc->ranges[tuple].flags)) { case FLAG_TYPE_PMEM: case FLAG_TYPE_MEM: @@ -269,9 +281,9 @@ pci_host_generic_core_detach(device_t dev) continue; } if (sc->ranges[tuple].res != NULL) - bus_release_resource(dev, type, tuple + 1, + bus_release_resource(dev, type, rid, sc->ranges[tuple].res); - bus_delete_resource(dev, type, tuple + 1); + bus_delete_resource(dev, type, rid); } rman_fini(&sc->io_rman); rman_fini(&sc->mem_rman); diff --git a/sys/dev/pci/pci_host_generic.h b/sys/dev/pci/pci_host_generic.h index 65f69fc05314..2d15f06890db 100644 --- a/sys/dev/pci/pci_host_generic.h +++ b/sys/dev/pci/pci_host_generic.h @@ -64,6 +64,7 @@ struct pcie_range { #define FLAG_TYPE_MEM 0x2 #define FLAG_TYPE_PMEM 0x3 struct resource *res; + int rid; }; struct generic_pcie_core_softc { diff --git a/sys/dev/pci/pci_host_generic_acpi.c b/sys/dev/pci/pci_host_generic_acpi.c index 992e8b5c8b8d..e309684a3603 100644 --- a/sys/dev/pci/pci_host_generic_acpi.c +++ b/sys/dev/pci/pci_host_generic_acpi.c @@ -182,6 +182,7 @@ pci_host_generic_acpi_parse_resource(ACPI_RESOURCE *res, void *arg) /* Save detected ranges */ if (res->Data.Address.ResourceType == ACPI_MEMORY_RANGE || res->Data.Address.ResourceType == ACPI_IO_RANGE) { + sc->base.ranges[r].rid = -1; sc->base.ranges[r].pci_base = min; sc->base.ranges[r].phys_base = min + off; sc->base.ranges[r].size = max - min + 1; diff --git a/sys/dev/pci/pci_host_generic_fdt.c b/sys/dev/pci/pci_host_generic_fdt.c index 854ec0be8dfa..05e77f46032f 100644 --- a/sys/dev/pci/pci_host_generic_fdt.c +++ b/sys/dev/pci/pci_host_generic_fdt.c @@ -214,6 +214,7 @@ parse_pci_mem_ranges(device_t dev, struct generic_pcie_core_softc *sc) sc->ranges[i].flags |= FLAG_TYPE_MEM; } + sc->ranges[i].rid = -1; sc->ranges[i].pci_base = 0; for (k = 0; k < (pci_addr_cells - 1); k++) { sc->ranges[i].pci_base <<= 32;