未验证 提交 2fc16ffb 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!1008 [sync] PR-941: LoongArch: fix 2k500 sfb driver not work during reboot

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/941 
 
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/1008 

Reviewed-by: Guo Dongtai <guodongtai@kylinos.cn> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
......@@ -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);
......
......@@ -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,
......
......@@ -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 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册