Скиньте пристрій PCI в Linux


12

Чи є загальний спосіб скинути пристрій PCI в Linux з командного рядка? Тобто, змусити шину PCI видати команду скидання.

Відповіді:


6

відповідно до http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci, ви можете скинути окремі функції пристрою, якщо це підтримується:

What:       /sys/bus/pci/devices/.../reset
Description:
            Some devices allow an individual function to be reset
            without affecting other functions in the same device.
            For devices that have this support, a file named reset
            will be present in sysfs.  Writing 1 to this file
            will perform reset.

5

Найближче, що шина PCI має відновити рівень пристрою, - це зміна стану живлення на D3 і повернення до D0. Після вивантаження драйвера (було б погано скинути обладнання з-під драйвера), ви можете використовувати setpciдля запису в регістри управління, щоб змінити стан живлення, але я вважаю, що це відбувається автоматично, коли ви вивантажуєте драйвер.


1

Оскільки загальний пристрій PCI не є гарячим підключенням, не буде способу його скинути і змусити ядро ​​його перерахувати.

Які б проблеми ви не намагалися вирішити, безумовно, є кращий спосіб, ніж просто скинути її.


4
Я імітую пристрій PCI в QEMU і мені потрібно скинути стан у міру розвитку. Я хотів це зробити зсередини гостя.
Джонатан

1
У мене є баггі-карта PCI cctv, вона працює, але іноді помирає з segfault. Після цього всю систему потрібно перезапустити, через скидання PCI цього можна уникнути ... Система стабільна, ніякої шкоди, лише вхід відео стає порожнім, тому іноді є кращим рішенням для скидання PCI, ніж перезавантаження. всю машину щодня. (особливо якщо ви знаходитесь на відстані 8000 км від цієї машини протягом 6 місяців)
Gipsz Jakab

1

Проблема з вищезазначеними рішеннями полягає в тому, що вони вимагають кооперативності пристрою; однак у більшості сценаріїв причиною її скидання є саме його некооперативність.

Однак, як це описано тут , є ще один, "складніший" спосіб його скидання на рівні PCI: ми видаляємо його з шини PCI, а потім знову вставляємо його за допомогою сканування.

Етапи:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Ми можемо знайти його ідентифікатор PCI за допомогою lspciкоманди.
  2. echo 1 >/sys/bus/pci/rescan

У мене тут пристрій з помилковою системою PCI, іноді скидання рівня PCI, іноді цей фокус, прочитаний на видалення, виправляє це. Я збираюся написати сценарій, щоб це зробити автоматично. :-)


Тьфу. Мій USB-контролер все ще помиляється, навіть після цього скидання.
Кріс

@Chris Ви впевнені, що це контролер, а не пристрій на ньому?
peterh

Так, я впевнений, що це контролер 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Я передаю його в VM через VFIO, і після перезавантаження VM мені також доведеться перезавантажити хост, щоб він знову працював, інакше будь-який USB-підключений виявлений, але зв’язок не вдається.
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.