Đặt lại thiết bị PCI trong Linux


12

Có cách nào chung để thiết lập lại thiết bị PCI trong Linux từ dòng lệnh không? Đó là, làm cho bus PCI phát lệnh thiết lập lại.

Câu trả lời:


6

theo http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci bạn có thể đặt lại các chức năng riêng lẻ của thiết bị nếu được hỗ trợ:

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

Điều gần nhất mà bus PCI có để thiết lập lại mức thiết bị là thay đổi trạng thái nguồn thành D3 và trở lại D0. Sau khi dỡ trình điều khiển (sẽ rất tệ khi đặt lại phần cứng từ bên dưới trình điều khiển), bạn có thể sử dụng setpciđể ghi vào các thanh ghi điều khiển để thay đổi trạng thái nguồn, nhưng tôi tin rằng điều này sẽ tự động xảy ra khi bạn dỡ trình điều khiển.


1

Vì một thiết bị PCI chung không thể cắm được, nên sẽ không có cách nào để thiết lập lại và yêu cầu nhân lại.

Bất kể loại vấn đề nào bạn đang cố gắng giải quyết, chắc chắn có một cách tốt hơn là chỉ đặt lại nó.


4
Tôi đang mô phỏng thiết bị PCI trong QEMU và cần thiết lập lại trạng thái của thiết bị khi tôi phát triển. Tôi muốn làm điều đó từ bên trong khách.
Jonathan

Tôi có một thẻ cctv pci lỗi, nó đang hoạt động nhưng đôi khi chết với một segfault. Sau đó, toàn bộ hệ thống cần phải được khởi động lại, vì có thể tránh được việc thiết lập lại PCI ... Hệ thống này ổn định, không gây hại, chỉ có đầu vào video bị trống, vì vậy đôi khi, đó là giải pháp tốt hơn để đặt lại PCI hơn là khởi động lại Toàn bộ máy mỗi ngày. (đặc biệt nếu bạn cách máy đó 8000km trong 6 tháng)
Gipsz Jakab

1

Vấn đề với các giải pháp trên là chúng đòi hỏi sự hợp tác của thiết bị; tuy nhiên trong hầu hết các kịch bản, lý do để thiết lập lại chính xác là sự không hợp tác của nó.

Tuy nhiên, như được mô tả ở đây , có một cách khác, "khó hơn" để đặt lại nó ở cấp độ PCI: chúng tôi xóa nó khỏi bus PCI và sau đó chèn lại bằng cách quét lại.

Các bước:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Chúng ta có thể tìm thấy ID PCI của nó bằng một lspcilệnh.
  2. echo 1 >/sys/bus/pci/rescan

Tôi có ở đây một thiết bị pci bị lỗi, đôi khi thiết lập lại mức PCI, đôi khi thủ thuật gỡ bỏ này sửa chữa nó. Tôi sắp viết một kịch bản để thực hiện nó một cách tự động. :-)


Ừ Bộ điều khiển USB của tôi vẫn bị lỗi, ngay cả sau khi thiết lập lại này.
Chris

@Chris Bạn có chắc chắn rằng đó là bộ điều khiển chứ không phải thiết bị trên đó không?
peterh - Phục hồi Monica

Vâng, tôi chắc chắn đó là bộ điều khiển 00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller. Tôi chuyển nó cho VM thông qua VFIO và sau khi VM khởi động lại, tôi cũng phải khởi động lại máy chủ để làm cho nó hoạt động trở lại, nếu không, bất kỳ USB nào được cắm vào đều bị phát hiện, nhưng giao tiếp không thành công.
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.