From nobody Sat Feb 17 21:33:16 2024 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 4Tchqc6jVHz59kvn; Sat, 17 Feb 2024 21:33:16 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Tchqc59v9z4hv9; Sat, 17 Feb 2024 21:33:16 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708205596; 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=Xh/ow6ekjZzrrWAZM8dU7dtcWaYdJCskyJO8VFYteyQ=; b=hCUiNaBb1+99vn4xT1/Zkwma24qLMTEbsOfdgZ+5HO2vWQ0bQw4KJlgI8uBDlZ7rO2yRN/ oELTckE60vwHDojxij/1Ai4Rmfs1WDiaRU7jcDjzK3fiiermTdl11ws1uOyZVP7fpNZtXz 2sV9yZ4I+xOqUXtrCZEjFR1xR+ygH/ZsYaEzyqKd5u79zd/YKIN60K47wpnrCOUMFZ4SBe Rs77Xsz0hzmXocC/CG5evIhir+ygp+nS7SqVj6E+XNar46OE15ZO5LZVyRplxrPJCsHALU IiiWdZFYEBWLUBkGP2j9nHTkq5sD4tmJj4mSyOmJkEoXjp1Ah6Vun1Ha6Jfq+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708205596; 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=Xh/ow6ekjZzrrWAZM8dU7dtcWaYdJCskyJO8VFYteyQ=; b=WQBrVeX0Kxm+KZwaHWspXYgqgFR3DgCQ8OM8ciXe0//o/oyBp8zl5WLWkmTqJhkrG4n0yR CrEamqBc/xlfRgc2M7I5dwEgJ+zT8nJ8GMB2jhUAYtlJKvWcA987uOoOlQ5TS5MrIoIF83 o+VdHcanAMW144LotM7bARdk3iM0r2jgRlVPZRuDVbDSCVUnB2VY2DzP6pIOKA8dN9Zqrp SYkXrJ4NuolHfb2ofqYSbsWezEnjOMqY94WMdIvrVEj11XTasBfXb4cV82oImzVu9Cuwl0 QOQyJ0L/r+mb7nhPHdJGreBCkiwOVxePTPb7n6ay5Z6blmkvuuVB1JXBSb9mdA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708205596; a=rsa-sha256; cv=none; b=FoafB7lANWq1q4wZN/787pgek76FFj3NKnBj8WZHMqLHIefwTGrAmiee5wiBVf/2yakXgl GihvyIequKekc1xM4po4uFuaLKsqgM9oELo/aMIjMK3bmxkUxlrG//aalwS4f1Nm9wHog6 LbCQfxu12IcU9Uv1RUl0G5fnDQAkRqDeaDdgk3iyOIJJ+EmHthbYkP0POLXfTagbAA6sg7 XPLgmolIAFsN6tf2avw8E3TA1gsDxlAHBdFsF9ljHRgwPWdGqbrIot2TD3QJkLQNtnry4P 0Rvz/F7ZyFfBB7CNtzh72JoOr+jVU0LBG0bS9CzdSK2RGyxnBBbucos1UWUDNw== 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 4Tchqc4GSyzPMJ; Sat, 17 Feb 2024 21:33:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41HLXGFh021445; Sat, 17 Feb 2024 21:33:16 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41HLXGkr021442; Sat, 17 Feb 2024 21:33:16 GMT (envelope-from git) Date: Sat, 17 Feb 2024 21:33:16 GMT Message-Id: <202402172133.41HLXGkr021442@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Vladimir Kondratyev Subject: git: a87884e34ec1 - stable/14 - LinuxKPI: Add pcie_capability_clear_and_set_word() function 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: wulf X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: a87884e34ec10a498f8857f6337d65620a68476e Auto-Submitted: auto-generated The branch stable/14 has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=a87884e34ec10a498f8857f6337d65620a68476e commit a87884e34ec10a498f8857f6337d65620a68476e Author: Vladimir Kondratyev AuthorDate: 2023-12-24 08:20:00 +0000 Commit: Vladimir Kondratyev CommitDate: 2024-02-17 20:58:39 +0000 LinuxKPI: Add pcie_capability_clear_and_set_word() function It does a Read-Modify-Write operation using clear and set bitmasks on PCI Express Capability Register at pos. As certain PCI Express Capability Registers are accessed concurrently in RMW fashion, hence require locking which is handled transparently to the caller. Sponsored by: Serenity CyberSecurity, LLC Reviewed by: manu, bz MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D42821 (cherry picked from commit 808ae4e29b6b9c9acc7eab013c5045370df8182a) --- sys/compat/linuxkpi/common/include/linux/pci.h | 36 ++++++++++++++------------ sys/compat/linuxkpi/common/src/linux_pci.c | 3 +++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h index aa99b050ffd9..174599d06141 100644 --- a/sys/compat/linuxkpi/common/include/linux/pci.h +++ b/sys/compat/linuxkpi/common/include/linux/pci.h @@ -349,6 +349,7 @@ struct pci_dev { char *path_name; TAILQ_HEAD(, pci_mmio_region) mmio; + spinlock_t pcie_cap_lock; }; int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name); @@ -1012,35 +1013,38 @@ pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val) } static inline int -pcie_capability_set_word(struct pci_dev *dev, int pos, uint16_t val) +pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos, + uint16_t clear, uint16_t set) { int error; uint16_t v; + if (pos == PCI_EXP_LNKCTL || pos == PCI_EXP_RTCTL) + spin_lock(&dev->pcie_cap_lock); + error = pcie_capability_read_word(dev, pos, &v); - if (error != 0) - return (error); + if (error == 0) { + v &= ~clear; + v |= set; + error = pcie_capability_write_word(dev, pos, v); + } - v |= val; + if (pos == PCI_EXP_LNKCTL || pos == PCI_EXP_RTCTL) + spin_unlock(&dev->pcie_cap_lock); - error = pcie_capability_write_word(dev, pos, v); return (error); } static inline int -pcie_capability_clear_word(struct pci_dev *dev, int pos, uint16_t val) +pcie_capability_set_word(struct pci_dev *dev, int pos, uint16_t val) { - int error; - uint16_t v; - - error = pcie_capability_read_word(dev, pos, &v); - if (error != 0) - return (error); - - v &= ~val; + return (pcie_capability_clear_and_set_word(dev, pos, 0, val)); +} - error = pcie_capability_write_word(dev, pos, v); - return (error); +static inline int +pcie_capability_clear_word(struct pci_dev *dev, int pos, uint16_t val) +{ + return (pcie_capability_clear_and_set_word(dev, pos, val, 0)); } static inline int pcie_get_minimum_link(struct pci_dev *dev, diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c index 4e6cc92f3615..551b924d6f5e 100644 --- a/sys/compat/linuxkpi/common/src/linux_pci.c +++ b/sys/compat/linuxkpi/common/src/linux_pci.c @@ -526,6 +526,7 @@ linux_pci_attach_device(device_t dev, struct pci_driver *pdrv, goto out_dma_init; TAILQ_INIT(&pdev->mmio); + spin_lock_init(&pdev->pcie_cap_lock); spin_lock(&pci_lock); list_add(&pdev->links, &pci_devices); @@ -540,6 +541,7 @@ linux_pci_attach_device(device_t dev, struct pci_driver *pdrv, out_probe: free(pdev->bus, M_DEVBUF); + spin_lock_destroy(&pdev->pcie_cap_lock); linux_pdev_dma_uninit(pdev); out_dma_init: spin_lock(&pci_lock); @@ -580,6 +582,7 @@ linux_pci_detach_device(struct pci_dev *pdev) spin_lock(&pci_lock); list_del(&pdev->links); spin_unlock(&pci_lock); + spin_lock_destroy(&pdev->pcie_cap_lock); put_device(&pdev->dev); return (0);