В начале января 2024 года для новой ветки Linux 6.7, которая находится в разработке, вышел патч против неожиданной перезагрузки ПК на AMD Ryzen при подключении устройств по FireWire. Обновление выпустил мейнтейнер компонентов ядра Linux Такаси Сакамото (Takashi Sakamoto), который планирует до 2029 года поддерживать код для устаревших компьютерных устройств, работающих по стандарту интерфейса FireWire (IEEE 1394).
К счастью, FireWire давно устарел и в настоящее время не особо распространён. Но в течение многих лет этот стандарт использовали производители оборудования и специальных систем для цифровой обработки видео и/или аудио.
В последнее время появилось несколько сообщений об ошибках, связанных с проблемами FireWire в современных версиях ядра Linux. Разработчики обнаружили, что в основном инциденты с неожиданными перезагрузками ОС касаются ПК с AMD Ryzen.
«VIA VT6306/6307/6308 обеспечивает доступ к интерфейсу PCI, совместимому со стандартом 1394 OHCI. Когда аппаратное обеспечение работает через bus bridge с Asmedia ASM1083/1085 PCIe-PCI, то при попытке получить доступ к регистру Isochronous Cycle Timer («Таймер изохронного цикла») по смещению 0xf0 в пространстве памяти PCI часто вызывает неожиданную перезагрузку системы на любом типе машины с AMD Ryzen (семейств 0x17 и 0x19). Проблема не появляется на ПК другого типа (с процессорами AMD не Ryzen или Intel) или при использовании другое оборудование OHCI 1394 (например, Texas Instruments).
Проблема явно проявляется в коммите dcadfd7f7c74 (firewire: core: use union for callback of transaction completion), добавленном в ядро Linux v6.5. Он внёс изменения в работу драйвера 1394 OHCI — получать доступ к регистру каждый раз для отправки локальной асинхронной транзакции. Однако проблема существует и в более старых версиях ядра Linux, пока она работает на машине AMD Ryzen, поскольку доступ к регистру необходим для поддержания работы параметра bus time. В итоге пользователи испытывают неожиданную перезагрузку системы при сбросе шины путём подключения каких-либо внешних устройств или попытки чтения регистра с помощью прикладных программ, учитывающих время, например, для обработки аудиосэмплов.
Этот патч подавляет неожиданную перезагрузку системы в сочетании с оборудованием. Это позволяет избежать самого доступа. В результате программный стек больше не может обеспечивать корректный доступ к аппаратному параметру таймера для работы драйверов, приложений пользовательского пространства и элементов на одной и той же шине IEEE 1394. Это приносит очевидный недостаток, поскольку некоторым прикладным программам требуется учитывать этот таймер, в то время как остальные приложения, не работающие с этим таймеров, снова доступны, например, sbp2»,
— объяснил суть проблемы Сакамото.
В апреле 2023 года Сакамото вызвался наблюдать за подсистемой FireWire для Linux в течение шести лет и будет работать над основными функциями Firewire и звуковыми драйверами для оставшихся немногих пользователей, которые взаимодействуют со своими гаджетами через этот стандарт подключения. Сакамото надеется, что его работа поможет пользователям перейти от FireWire к более современным технологическим стандартам, например, к USB 2.0.
Сакамото принял этот пост от Стефана Рихтера, который с 2022 года не вносил изменений в код ядра Linux по этому направлению. Ожидается, что поддержка FireWire в Linux прекратится не ранее 2029 года.
FireWire — один из самых древних стандартов в современной компьютерной истории. Он начал разрабатываться Apple ещё в 1986 году как решение для последовательной шины для высокоскоростной связи и работал как USB-порты, позволяя пользователям подключать внешние устройства к своим компьютерам. Но у FireWire есть несколько преимуществ по сравнению с оригинальными версиями USB, в том числе поддержка последовательной цепочки подключений, подобной Thunderbolt (до 63 устройств), а также поддержка одноранговой сети.
Первоначальная версия FireWire была выпущена в 1995 году и имела скорость передачи до 400 Мбит/с, а также возможность подавать питание на подключённые устройства.
В общей сложности стандарт FireWire претерпел пять изменений, а окончательная версия была выпущена в 2012 году и предлагала значительно более быструю пропускную способность 1,57 Гбит/с. После 2012 года поддержка FireWire была фактически прекращена, поскольку в то время Apple представила свой новый стандарт Thunderbolt. Первая итерация Thunderbolt была значительно более функциональной, чем FireWire, с пропускной способностью 20 Гбит/с и использованием 4 линий PCIe 2.0. Thunderbolt также имеет функцию DisplayPort 1.1a для управления мониторами.
Linux — последняя операционная система, которая всё ещё поддерживает FireWire. Apple прекратила поддержку этого стандарта несколько лет назад, а Microsoft прекратила поддержку FireWire в Windows 10.
Источник: habr.com