FAILED: patch "[PATCH] PCI: aardvark: Fix support for PCI_BRIDGE_CTL_BUS_RESET on" failed to apply to 5.4-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From bc4fac42e5f8460af09c0a7f2f1915be09e20c71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <[email protected]>
Date: Thu, 28 Oct 2021 20:56:58 +0200
Subject: [PATCH] PCI: aardvark: Fix support for PCI_BRIDGE_CTL_BUS_RESET on
emulated bridge
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Aardvark supports PCIe Hot Reset via PCIE_CORE_CTRL1_REG.
Use it for implementing PCI_BRIDGE_CTL_BUS_RESET bit of PCI_BRIDGE_CONTROL register on emulated bridge.
With this, the function pci_reset_secondary_bus() starts working and can reset connected PCIe card. Custom userspace script [1] which uses setpci can trigger PCIe Hot Reset and reset the card manually.
[1] https://alexforencich.com/wiki/en/pcie/hot-reset-linux
drivers/pci/controller/pci-aardvark.c +27 -0
@@ -773,6 +773,22 @@ advk_pci_bridge_emul_base_conf_read(struct pci_bridge_emul *bridge, *value =advk_readl (pcie,PCIE_CORE_CMD_STATUS_REG );return PCI_BRIDGE_EMUL_HANDLED ; +case PCI_INTERRUPT_LINE : { +/* +* From the whole 32bit register we support reading from HW only +* one bit: PCI_BRIDGE_CTL_BUS_RESET. +* Other bits are retrieved only from emulated config buffer. +*/ +__le32 *cfgspace = (__le32 *)&bridge->conf; +u32 val =le32_to_cpu (cfgspace[PCI_INTERRUPT_LINE /4 ]); +if (advk_readl (pcie,PCIE_CORE_CTRL1_REG ) &HOT_RESET_GEN ) + val |=PCI_BRIDGE_CTL_BUS_RESET <<16 ; +else + val &= ~(PCI_BRIDGE_CTL_BUS_RESET <<16 ); + *value = val; +return PCI_BRIDGE_EMUL_HANDLED ; + } +default :return PCI_BRIDGE_EMUL_NOT_HANDLED ; }
@@ -789,6 +805,17 @@ advk_pci_bridge_emul_base_conf_write(struct pci_bridge_emul *bridge,advk_writel (pcie, new,PCIE_CORE_CMD_STATUS_REG );break ; +case PCI_INTERRUPT_LINE : +if (mask & (PCI_BRIDGE_CTL_BUS_RESET <<16 )) { +u32 val =advk_readl (pcie,PCIE_CORE_CTRL1_REG ); +if (new & (PCI_BRIDGE_CTL_BUS_RESET <<16 )) + val |=HOT_RESET_GEN ; +else + val &= ~HOT_RESET_GEN ; +advk_writel (pcie, val,PCIE_CORE_CTRL1_REG ); + } +break ; +default :break ; }