Unverified Commit 38ded397 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!941 LoongArch: fix 2k500 sfb driver not work during reboot

Merge Pull Request from: @Hongchen_Zhang 
 
LS7A Root Ports have a hardware defect: clearing PCI_COMMAND_MASTER *also*
prevents the bridge from forwarding CPU MMIO requests in the downstream
direction, and these MMIO accesses to devices below the bridge happen even
after .shutdown(), e.g., to print console messages.  LS7A neither forwards
the requests nor sends an unsuccessful completion to the CPU, so the CPU
waits forever, resulting in the hang.

After apply this PR,the machine which has 2k500 bmc connected to the LS7A bridge can reboot normally. 
 
Link:https://gitee.com/openeuler/kernel/pulls/941

 

Reviewed-by: default avatarGuo Dongtai <guodongtai@kylinos.cn>
Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 01c71a7b cb7f300f
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -115,23 +115,6 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
			DEV_PCIE_PORT_2, loongson_mrrs_quirk);

static void loongson_bmaster_quirk(struct pci_dev *pdev)
{
	/*
	 * Some Loongson PCIe ports will cause CPU deadlock if disable
	 * the Bus Master bit during poweroff/reboot.
	 */
	struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus);

	bridge->no_dis_bmaster = 1;
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
			DEV_PCIE_PORT_0, loongson_bmaster_quirk);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
			DEV_PCIE_PORT_1, loongson_bmaster_quirk);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
			DEV_PCIE_PORT_2, loongson_bmaster_quirk);

static void loongson_pci_pin_quirk(struct pci_dev *pdev)
{
	pdev->pin = 1 + (PCI_FUNC(pdev->devfn) & 3);
+0 −5
Original line number Diff line number Diff line
@@ -154,8 +154,6 @@ static void pcie_portdrv_remove(struct pci_dev *dev)

static void pcie_portdrv_shutdown(struct pci_dev *dev)
{
	struct pci_host_bridge *bridge = pci_find_host_bridge(dev->bus);

	if (pci_bridge_d3_possible(dev)) {
		pm_runtime_forbid(&dev->dev);
		pm_runtime_get_noresume(&dev->dev);
@@ -163,9 +161,6 @@ static void pcie_portdrv_shutdown(struct pci_dev *dev)
	}

	pcie_port_device_remove(dev);

	if (!bridge->no_dis_bmaster)
		pci_disable_device(dev);
}

static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,
+0 −1
Original line number Diff line number Diff line
@@ -575,7 +575,6 @@ struct pci_host_bridge {
	unsigned int	ignore_reset_delay:1;	/* For entire hierarchy */
	unsigned int	no_ext_tags:1;		/* No Extended Tags */
	unsigned int	no_inc_mrrs:1;		/* No Increase MRRS */
	unsigned int	no_dis_bmaster:1;	/* No Disable Bus Master */
	unsigned int	native_aer:1;		/* OS may use PCIe AER */
	unsigned int	native_pcie_hotplug:1;	/* OS may use PCIe hotplug */
	unsigned int	native_shpc_hotplug:1;	/* OS may use SHPC hotplug */