From nobody Fri Sep 5 23:28:55 2025 X-Original-To: dev-commits-src-main@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 4cJXbq6qFYz66Yhb; Fri, 05 Sep 2025 23:28:55 +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 4cJXbq5QJdz40PG; Fri, 05 Sep 2025 23:28:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1757114935; 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=nUIXpuDKpHu/tb3WCvxmidYRQNIfx8g4DRe8aCfeni0=; b=kbQPJJX2BPtb7SK3csK3lLd8PgZl6+GuZPyzABkrTsU62WBaPAP9uMqVHsyE7Or57+doPR jYbl71EVVzlu4jogDFSDaf3T7W5j0G4W0dNw+9A46ISOPsxRuFMh4I1t7erZI32YEUMeIb cNQ1UOZNyCluZkJDFQSwBSfEensxGT8LnaPcnEXrTBX2S2YCWEvVqecTBpzSSm6/RPxBW0 1iMKRwbq9ETjkh5hX+sg36w9zAQHNxeuN4fkPA7qa4kUW9nYHeVGEujUWkO0F6+dbCN4DD QrVV7u6GG+4nvm4vCQFnRxlUvBovmdKxQT3DcIP8S1JlnxlNlKkXF90uop1t6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1757114935; 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=nUIXpuDKpHu/tb3WCvxmidYRQNIfx8g4DRe8aCfeni0=; b=E23cV9lsH7NV8dIqaXyqYT6tJFCz/LWqM6URwZN2bPX1boTrRvQG7qVx6L3fDw0Ro50ku6 ESsPaoz74MBVOkogp7RB+40l0VKjT/wqfcPL3+j+kReX4MEO5RF3EZUUSFukU7ZjQkj3+S 22O6rJlGQiN4I7Ul6jeeu/TVjDbkEPZQTiR+suYuEytQ44zJ1Cc4x4oqnjBZoLmCXc6iHd /Vn0titzZMULQBDLzf0rtoSKINtWsguR+Q4rh3Awmt6f7t08EUwhUpI0ooPeFG7xhVmAr1 ubeVWUnmcYn+7uc+fGzJxXGJSB9UzpmR6SzdUqh3l7bWr7Tt1SuFzJzyJNk9pQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1757114935; a=rsa-sha256; cv=none; b=krJ6WSWedDwPvktHnDo+q7C682tgVS3WI5al5WeeGBjDhSRE7WvHomjZEuPQV1B3J4+F9K kbnVr7oVuG+nvVI+minwD2UApz5rfg/5L8FzV1MfWM6o40OKykGShfKKlu1BFS0KhjAefC AoKu4l1jYocsmOxiqriDdbtsMXc7XpkLBoXvlTVvpQBm9Rdvi2a9MAAruEDSPHPms5S0c/ WEySrHLS9Qt3BSNyotaZBJNU9oavhWHzUsl9WyrYkmsiz+2XZz+9lqlOOGgsnEuS+rU2CS Sldf7nABqth7D6Ayxkq081GVJxLJBv3KlVgO6ReVHqTZlzvSIRXe7eVKMQDy4Q== 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 4cJXbq51XDz18Pw; Fri, 05 Sep 2025 23:28:55 +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 585NStAu029050; Fri, 5 Sep 2025 23:28:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 585NStlC029045; Fri, 5 Sep 2025 23:28:55 GMT (envelope-from git) Date: Fri, 5 Sep 2025 23:28:55 GMT Message-Id: <202509052328.585NStlC029045@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 2f9064a5d2b5 - main - LinuxKPI: pci: implement pcim_iomap() List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2f9064a5d2b50f292cc8699d2be5c66c317f1dc7 Auto-Submitted: auto-generated The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=2f9064a5d2b50f292cc8699d2be5c66c317f1dc7 commit 2f9064a5d2b50f292cc8699d2be5c66c317f1dc7 Author: Bjoern A. Zeeb AuthorDate: 2025-07-31 17:45:26 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-09-05 23:24:13 +0000 LinuxKPI: pci: implement pcim_iomap() Like pci_iomap() add the devres version pcim_iomap() using the former to get the resource. Add a helper function to validate that the bar is within a valid range and sprinkle that check also to other related functions. Sponsored by: The FreeBSD Foundation (intially) MFC after: 3 days Reviewed by: dumbbell Differential Revision: https://reviews.freebsd.org/D52067 --- sys/compat/linuxkpi/common/include/linux/pci.h | 3 ++ sys/compat/linuxkpi/common/src/linux_pci.c | 58 +++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h index df29af87f160..49d2cd79d474 100644 --- a/sys/compat/linuxkpi/common/include/linux/pci.h +++ b/sys/compat/linuxkpi/common/include/linux/pci.h @@ -365,6 +365,7 @@ void __iomem **linuxkpi_pcim_iomap_table(struct pci_dev *pdev); void *linuxkpi_pci_iomap_range(struct pci_dev *, int, unsigned long, unsigned long); void *linuxkpi_pci_iomap(struct pci_dev *, int, unsigned long); +void *linuxkpi_pcim_iomap(struct pci_dev *, int, unsigned long); void linuxkpi_pci_iounmap(struct pci_dev *pdev, void *res); int linuxkpi_pcim_iomap_regions(struct pci_dev *pdev, uint32_t mask, const char *name); @@ -803,6 +804,8 @@ static inline void pci_disable_sriov(struct pci_dev *dev) linuxkpi_pci_iomap_range(pdev, mmio_bar, mmio_off, mmio_size) #define pci_iomap(pdev, mmio_bar, mmio_size) \ linuxkpi_pci_iomap(pdev, mmio_bar, mmio_size) +#define pcim_iomap(pdev, bar, maxlen) \ + linuxkpi_pcim_iomap(pdev, bar, maxlen) #define pci_iounmap(pdev, res) \ linuxkpi_pci_iounmap(pdev, res) diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c index 00d4a25e86ed..44024e495bb2 100644 --- a/sys/compat/linuxkpi/common/src/linux_pci.c +++ b/sys/compat/linuxkpi/common/src/linux_pci.c @@ -145,6 +145,23 @@ struct linux_dma_priv { #define DMA_PRIV_LOCK(priv) mtx_lock(&(priv)->lock) #define DMA_PRIV_UNLOCK(priv) mtx_unlock(&(priv)->lock) +static void +lkpi_set_pcim_iomap_devres(struct pcim_iomap_devres *dr, int bar, + void *res) +{ + dr->mmio_table[bar] = (void *)rman_get_bushandle(res); + dr->res_table[bar] = res; +} + +static bool +lkpi_pci_bar_id_valid(int bar) +{ + if (bar < 0 || bar > PCIR_MAX_BAR_0) + return (false); + + return (true); +} + static int linux_pdev_dma_uninit(struct pci_dev *pdev) { @@ -763,6 +780,9 @@ _lkpi_pci_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen __unused) struct pci_mmio_region *mmio, *p; int type; + if (!lkpi_pci_bar_id_valid(bar)) + return (NULL); + type = pci_resource_type(pdev, bar); if (type < 0) { device_printf(pdev->dev.bsddev, "%s: bar %d type %d\n", @@ -803,6 +823,9 @@ linuxkpi_pci_iomap_range(struct pci_dev *pdev, int bar, { struct resource *res; + if (!lkpi_pci_bar_id_valid(bar)) + return (NULL); + res = _lkpi_pci_iomap(pdev, bar, maxlen); if (res == NULL) return (NULL); @@ -816,9 +839,41 @@ linuxkpi_pci_iomap_range(struct pci_dev *pdev, int bar, void * linuxkpi_pci_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen) { + if (!lkpi_pci_bar_id_valid(bar)) + return (NULL); + return (linuxkpi_pci_iomap_range(pdev, bar, 0, maxlen)); } +void * +linuxkpi_pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen) +{ + struct pcim_iomap_devres *dr; + void *res; + + if (!lkpi_pci_bar_id_valid(bar)) + return (NULL); + + dr = lkpi_pcim_iomap_devres_find(pdev); + if (dr == NULL) + return (NULL); + + if (dr->res_table[bar] != NULL) + return (dr->res_table[bar]); + + res = linuxkpi_pci_iomap(pdev, bar, maxlen); + if (res == NULL) { + /* + * Do not free the devres in case there were + * other valid mappings before already. + */ + return (NULL); + } + lkpi_set_pcim_iomap_devres(dr, bar, res); + + return (res); +} + void linuxkpi_pci_iounmap(struct pci_dev *pdev, void *res) { @@ -870,8 +925,7 @@ linuxkpi_pcim_iomap_regions(struct pci_dev *pdev, uint32_t mask, const char *nam res = _lkpi_pci_iomap(pdev, bar, 0); if (res == NULL) goto err; - dr->mmio_table[bar] = (void *)rman_get_bushandle(res); - dr->res_table[bar] = res; + lkpi_set_pcim_iomap_devres(dr, bar, res); mappings |= (1 << bar); }