From c4f4a9983e86c0b33cee753cce79ba385704d7e9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 8 Jan 2024 13:39:39 +0100 Subject: [PATCH] 4.14-stable patches added patches: firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch --- ...chines-and-asm108x-vt630x-pcie-cards.patch | 125 ++++++++++++++++++ queue-4.14/series | 1 + 2 files changed, 126 insertions(+) create mode 100644 queue-4.14/firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch diff --git a/queue-4.14/firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch b/queue-4.14/firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch new file mode 100644 index 00000000000..9ffb9fbb549 --- /dev/null +++ b/queue-4.14/firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch @@ -0,0 +1,125 @@ +From ac9184fbb8478dab4a0724b279f94956b69be827 Mon Sep 17 00:00:00 2001 +From: Takashi Sakamoto +Date: Tue, 2 Jan 2024 20:01:50 +0900 +Subject: firewire: ohci: suppress unexpected system reboot in AMD Ryzen machines and ASM108x/VT630x PCIe cards + +From: Takashi Sakamoto + +commit ac9184fbb8478dab4a0724b279f94956b69be827 upstream. + +VIA VT6306/6307/6308 provides PCI interface compliant to 1394 OHCI. When +the hardware is combined with Asmedia ASM1083/1085 PCIe-to-PCI bus bridge, +it appears that accesses to its 'Isochronous Cycle Timer' register (offset +0xf0 on PCI memory space) often causes unexpected system reboot in any +type of AMD Ryzen machine (both 0x17 and 0x19 families). It does not +appears in the other type of machine (AMD pre-Ryzen machine, Intel +machine, at least), or in the other OHCI 1394 hardware (e.g. Texas +Instruments). + +The issue explicitly appears at a commit dcadfd7f7c74 ("firewire: core: +use union for callback of transaction completion") added to v6.5 kernel. +It changed 1394 OHCI driver to access to the register every time to +dispatch local asynchronous transaction. However, the issue exists in +older version of kernel as long as it runs in AMD Ryzen machine, since +the access to the register is required to maintain bus time. It is not +hard to imagine that users experience the unexpected system reboot when +generating bus reset by plugging any devices in, or reading the register +by time-aware application programs; e.g. audio sample processing. + +This commit suppresses the unexpected system reboot in the combination of +hardware. It avoids the access itself. As a result, the software stack can +not provide the hardware time anymore to unit drivers, userspace +applications, and nodes in the same IEEE 1394 bus. It brings apparent +disadvantage since time-aware application programs require it, while +time-unaware applications are available again; e.g. sbp2. + +Cc: stable@vger.kernel.org +Reported-by: Jiri Slaby +Closes: https://bugzilla.suse.com/show_bug.cgi?id=1215436 +Reported-by: Mario Limonciello +Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217994 +Reported-by: Tobias Gruetzmacher +Closes: https://sourceforge.net/p/linux1394/mailman/message/58711901/ +Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2240973 +Closes: https://bugs.launchpad.net/linux/+bug/2043905 +Link: https://lore.kernel.org/r/20240102110150.244475-1-o-takashi@sakamocchi.jp +Signed-off-by: Takashi Sakamoto +Signed-off-by: Greg Kroah-Hartman +--- + drivers/firewire/ohci.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +--- a/drivers/firewire/ohci.c ++++ b/drivers/firewire/ohci.c +@@ -292,6 +292,51 @@ static char ohci_driver_name[] = KBUILD_ + #define QUIRK_TI_SLLZ059 0x20 + #define QUIRK_IR_WAKE 0x40 + ++// On PCI Express Root Complex in any type of AMD Ryzen machine, VIA VT6306/6307/6308 with Asmedia ++// ASM1083/1085 brings an inconvenience that the read accesses to 'Isochronous Cycle Timer' register ++// (at offset 0xf0 in PCI I/O space) often causes unexpected system reboot. The mechanism is not ++// clear, since the read access to the other registers is enough safe; e.g. 'Node ID' register, ++// while it is probable due to detection of any type of PCIe error. ++#define QUIRK_REBOOT_BY_CYCLE_TIMER_READ 0x80000000 ++ ++#if IS_ENABLED(CONFIG_X86) ++ ++static bool has_reboot_by_cycle_timer_read_quirk(const struct fw_ohci *ohci) ++{ ++ return !!(ohci->quirks & QUIRK_REBOOT_BY_CYCLE_TIMER_READ); ++} ++ ++#define PCI_DEVICE_ID_ASMEDIA_ASM108X 0x1080 ++ ++static bool detect_vt630x_with_asm1083_on_amd_ryzen_machine(const struct pci_dev *pdev) ++{ ++ const struct pci_dev *pcie_to_pci_bridge; ++ ++ // Detect any type of AMD Ryzen machine. ++ if (!static_cpu_has(X86_FEATURE_ZEN)) ++ return false; ++ ++ // Detect VIA VT6306/6307/6308. ++ if (pdev->vendor != PCI_VENDOR_ID_VIA) ++ return false; ++ if (pdev->device != PCI_DEVICE_ID_VIA_VT630X) ++ return false; ++ ++ // Detect Asmedia ASM1083/1085. ++ pcie_to_pci_bridge = pdev->bus->self; ++ if (pcie_to_pci_bridge->vendor != PCI_VENDOR_ID_ASMEDIA) ++ return false; ++ if (pcie_to_pci_bridge->device != PCI_DEVICE_ID_ASMEDIA_ASM108X) ++ return false; ++ ++ return true; ++} ++ ++#else ++#define has_reboot_by_cycle_timer_read_quirk(ohci) false ++#define detect_vt630x_with_asm1083_on_amd_ryzen_machine(pdev) false ++#endif ++ + /* In case of multiple matches in ohci_quirks[], only the first one is used. */ + static const struct { + unsigned short vendor, device, revision, flags; +@@ -1732,6 +1777,9 @@ static u32 get_cycle_time(struct fw_ohci + s32 diff01, diff12; + int i; + ++ if (has_reboot_by_cycle_timer_read_quirk(ohci)) ++ return 0; ++ + c2 = reg_read(ohci, OHCI1394_IsochronousCycleTimer); + + if (ohci->quirks & QUIRK_CYCLE_TIMER) { +@@ -3635,6 +3683,9 @@ static int pci_probe(struct pci_dev *dev + if (param_quirks) + ohci->quirks = param_quirks; + ++ if (detect_vt630x_with_asm1083_on_amd_ryzen_machine(dev)) ++ ohci->quirks |= QUIRK_REBOOT_BY_CYCLE_TIMER_READ; ++ + /* + * Because dma_alloc_coherent() allocates at least one page, + * we save space by using a common buffer for the AR request/ diff --git a/queue-4.14/series b/queue-4.14/series index 622b01c543c..238832efcd0 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -2,3 +2,4 @@ nfc-llcp_core-hold-a-ref-to-llcp_local-dev-when-hold.patch net-sched-em_text-fix-possible-memory-leak-in-em_tex.patch net-bcmgenet-fix-fcs-generation-for-fragmented-skbuf.patch i40e-fix-use-after-free-in-i40e_aqc_add_filters.patch +firewire-ohci-suppress-unexpected-system-reboot-in-amd-ryzen-machines-and-asm108x-vt630x-pcie-cards.patch -- 2.47.3