Commit c879b2f1 authored by Ming Wang's avatar Ming Wang Committed by Hongchen Zhang
Browse files

LoongArch: prevent LS7A Bus Master clearing on kexec

LoongArch inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAZ3M1



--------------------------------

This is similar to
commit 62b6dee1 ("PCI/portdrv: Prevent LS7A Bus Master clearing on shutdown"),
which prevents LS7A Bus Master clearing on kexec.

The key point of this is to work around the LS7A defect that clearing
PCI_COMMAND_MASTER prevents MMIO requests from going downstream, and
we may need to do that even after .shutdown(), e.g., to print console
messages. And in this case we rely on .shutdown() for the downstream
devices to disable interrupts and DMA.

Only skip Bus Master clearing on bridges because endpoint devices still
need it.

Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
Signed-off-by: default avatarMing Wang <wangming01@loongson.cn>
parent 118ae39e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -526,7 +526,11 @@ static void pci_device_shutdown(struct device *dev)
	 * If it is not a kexec reboot, firmware will hit the PCI
	 * devices with big hammer and stop their DMA any way.
	 */
#ifdef CONFIG_LOONGARCH
	if (kexec_in_progress && !pci_is_bridge(pci_dev) && (pci_dev->current_state <= PCI_D3hot))
#else
	if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot))
#endif
		pci_clear_master(pci_dev);
}