]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: rcar-host: Drop PMSR spinlock
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Tue, 21 Oct 2025 18:46:28 +0000 (14:46 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Oct 2025 13:03:15 +0000 (14:03 +0100)
[ Upstream commit 0a8f173d9dad13930d5888505dc4c4fd6a1d4262 ]

The pmsr_lock spinlock used to be necessary to synchronize access to the
PMSR register, because that access could have been triggered from either
config space access in rcar_pcie_config_access() or an exception handler
rcar_pcie_aarch32_abort_handler().

The rcar_pcie_aarch32_abort_handler() case is no longer applicable since
commit 6e36203bc14c ("PCI: rcar: Use PCI_SET_ERROR_RESPONSE after read
which triggered an exception"), which performs more accurate, controlled
invocation of the exception, and a fixup.

This leaves rcar_pcie_config_access() as the only call site from which
rcar_pcie_wakeup() is called. The rcar_pcie_config_access() can only be
called from the controller struct pci_ops .read and .write callbacks,
and those are serialized in drivers/pci/access.c using raw spinlock
'pci_lock' . It should be noted that CONFIG_PCI_LOCKLESS_CONFIG is never
set on this platform.

Since the 'pci_lock' is a raw spinlock , and the 'pmsr_lock' is not a
raw spinlock, this constellation triggers 'BUG: Invalid wait context'
with CONFIG_PROVE_RAW_LOCK_NESTING=y .

Remove the pmsr_lock to fix the locking.

Fixes: a115b1bd3af0 ("PCI: rcar: Add L1 link state fix into data abort hook")
Reported-by: Duy Nguyen <duy.nguyen.rh@renesas.com>
Reported-by: Thuan Nguyen <thuan.nguyen-hong@banvien.com.vn>
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20250909162707.13927-1-marek.vasut+renesas@mailbox.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pci/controller/pcie-rcar-host.c

index 0e34848efc7150e2b09eba7526d86267003905e3..e4569c6f8fb2a85c394c6b4dcc0a295ba1ea6d03 100644 (file)
@@ -67,20 +67,13 @@ struct rcar_pcie_host {
        int                     (*phy_init_fn)(struct rcar_pcie_host *host);
 };
 
-static DEFINE_SPINLOCK(pmsr_lock);
-
 static int rcar_pcie_wakeup(struct device *pcie_dev, void __iomem *pcie_base)
 {
-       unsigned long flags;
        u32 pmsr, val;
        int ret = 0;
 
-       spin_lock_irqsave(&pmsr_lock, flags);
-
-       if (!pcie_base || pm_runtime_suspended(pcie_dev)) {
-               ret = -EINVAL;
-               goto unlock_exit;
-       }
+       if (!pcie_base || pm_runtime_suspended(pcie_dev))
+               return -EINVAL;
 
        pmsr = readl(pcie_base + PMSR);
 
@@ -98,8 +91,6 @@ static int rcar_pcie_wakeup(struct device *pcie_dev, void __iomem *pcie_base)
                writel(L1FAEG | PMEL1RX, pcie_base + PMSR);
        }
 
-unlock_exit:
-       spin_unlock_irqrestore(&pmsr_lock, flags);
        return ret;
 }