Setel Ulang Perangkat PCI di Linux

12

Apakah ada cara umum untuk mereset perangkat PCI di Linux dari baris perintah? Artinya, menyebabkan bus PCI mengeluarkan perintah reset.

Jonathan
sumber

Jawaban:

6

menurut http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci Anda dapat mengatur ulang fungsi masing-masing perangkat jika itu didukung:

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.
Andre Holzner
sumber
5

Hal terdekat yang dimiliki bus PCI ke reset level perangkat adalah mengubah status daya ke D3 dan kembali ke D0. Setelah membongkar driver (akan menjadi buruk untuk mengatur ulang perangkat keras dari bawah driver), Anda dapat menggunakan setpciuntuk menulis ke register kontrol untuk mengubah status daya, tetapi saya percaya ini terjadi secara otomatis ketika Anda membongkar driver.

psusi
sumber
1

Karena perangkat PCI generik tidak hotpluggable, tidak akan ada cara untuk mengatur ulang dan meminta kernel untuk menghitung ulang.

Apa pun jenis masalah yang Anda coba selesaikan, pasti ada cara yang lebih baik daripada hanya meresetnya.


sumber
4
Saya mensimulasikan perangkat PCI di QEMU dan perlu mengatur ulang statusnya saat saya mengembangkan. Saya ingin melakukannya dari dalam tamu.
Jonathan
Saya memiliki kartu cctv kereta kereta, itu berfungsi tetapi kadang-kadang mati dengan segfault. Setelah itu, seluruh sistem perlu di-restart, dengan reset PCI ini bisa dihindari ... Sistem ini stabil, tidak ada salahnya, hanya input video yang kosong, jadi kadang-kadang itu adalah solusi yang lebih baik untuk mengatur ulang PCI daripada memulai kembali Seluruh mesin setiap hari. (terutama jika Anda berada 8.000 km dari mesin itu selama 6 bulan)
Gipsz Jakab
1

Masalah dengan solusi di atas adalah mereka membutuhkan kooperatifitas perangkat; Namun dalam sebagian besar skenario alasan untuk mengatur ulang itu justru karena tidak kooperatif.

Namun, seperti yang dijelaskan di sini , ada cara lain yang "lebih sulit" untuk meresetnya pada tingkat PCI: kami menghapusnya dari bus PCI dan kemudian memasukkannya kembali dengan pemindaian ulang.

Langkah langkah:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Kita dapat menemukan PCI ID-nya dengan sebuah lspciperintah.
  2. echo 1 >/sys/bus/pci/rescan

Di sini saya punya perangkat pci buggy, kadang-kadang reset level PCI, kadang-kadang trik penghapusan-readd memperbaikinya. Saya akan menulis naskah untuk melakukannya secara otomatis. :-)

peterh - Pasang kembali Monica
sumber
Ugh. Kontroler USB saya masih bermasalah, bahkan setelah reset ini.
Chris
@ Chris Apakah Anda yakin itu adalah pengontrol, dan bukan perangkat di dalamnya?
peterh
Ya, saya yakin itu pengontrolnya 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Saya meneruskannya ke VM melalui VFIO dan setelah VM reboot saya juga harus me-reboot host untuk membuatnya berfungsi lagi, jika tidak USB yang terhubung terdeteksi, tetapi komunikasi gagal.
Chris