• H
    PCI: Add quirk for LS7A to avoid reboot failure · 7e4aee87
    Huacai Chen 提交于
    LoongArch inclusion
    category: feature
    bugzilla: https://gitee.com/openeuler/kernel/issues/I5OHOB
    
    --------------------------------
    
    cc27b735 ("PCI/portdrv: Turn off PCIe services during shutdown")
    causes poweroff/reboot failure on systems with LS7A chipset. We found
    that if we remove "pci_command &= ~PCI_COMMAND_MASTER" in do_pci_disable
    _device(), it can work well. The hardware engineer says that the root
    cause is that CPU is still accessing PCIe devices while poweroff/reboot,
    and if we disable the Bus Master Bit at this time, the PCIe controller
    doesn't forward requests to downstream devices, and also does not send
    TIMEOUT to CPU, which causes CPU wait forever (hardware deadlock). This
    behavior is a PCIe protocol violation (Bus Master should not be involved
    in CPU MMIO transactions), and it will be fixed in new revisions of
    hardware (add timeout mechanism for CPU read request, whether or not Bus
    Master bit is cleared).
    
    On some x86 platforms, radeon/amdgpu devices can cause similar problems
    [1][2]. Once before I wanted to make a single patch to solve "all of
    these problems" together, but it seems unreasonable because maybe they
    are not exactly the same problem. So, this patch add a new function
    pcie_portdrv_shutdown(), a slight modified copy of pcie_portdrv_remove()
    dedicated for the shutdown path, and then add a quirk just for LS7A to
    avoid clearing Bus Master bit in pcie_portdrv_shutdown(). Leave other
    platforms behave as before.
    
    [1] https://bugs.freedesktop.org/show_bug.cgi?id=97980
    [2] https://bugs.freedesktop.org/show_bug.cgi?id=98638Signed-off-by: NHuacai Chen <chenhuacai@loongson.cn>
    7e4aee87
pci-loongson.c 9.3 KB