Làm cách nào để thiết lập lại / chu kỳ cấp nguồn cho thiết bị PCIe?


20

Tôi có một thiết bị PCIe chỉ hoạt động chính xác khi máy tính tắt hoàn toàn sau đó bật lại. Việc ban hành một lệnh đơn giản reboothoặc reboot -plệnh dường như không làm mất nguồn cho thẻ PCIe, điều này khiến nó không hoạt động sau khi khởi động lại.

Có cách nào, từ HĐH, chuyển nguồn điện cho thiết bị trong khe PCIe không? Tôi có thể tìm thấy nó trong /sys/bus/pci/devices/0000*/, nhưng tôi không thể tìm ra cách đặt lại bảng đúng cách. Sức mạnh khó khăn dường như là cách duy nhất.

Chặn rằng, tôi có thể thay đổi cài đặt ở đâu đó sẽ gây ra chu kỳ toàn bộ năng lượng cho rebootlệnh không?

Tôi đang chạy Ubuntu 12.10.


Bạn đã thử reboot -fchưa Điều này tương tự như nhấn nút nguồn của CPU.
ktan

1
Hai năm trước, OP đã chỉ ra rằng một phần mềm rebootkhông hoạt động. Bạn reboot -fvẫn là một khởi động lại mềm.
roaima

Câu trả lời:


16

Phương pháp tiềm năng số 1

Tôi nghĩ bạn có thể làm điều đó với các lệnh sau:

vô hiệu hóa

echo 0 > /sys/bus/pci/slots/$NUMBER/power

cho phép

echo 1 > /sys/bus/pci/slots/$NUMBER/power

Trong trường hợp $NUMBERlà số lượng khe cắm PCI.

lspci -vvcó thể giúp xác định thiết bị. Đây không phải là tài liệu tốt ...

Phương pháp tiềm năng # 2

Tôi đã xem qua chủ đề này trên U & L , vấn đề tương tự: có một số câu trả lời cho câu hỏi đó nói rằng bạn có thể đặt lại bằng lệnh này:

echo "1" > /sys/bus/pci/devices/$NUMBER/reset

Tuy nhiên, tôi sẽ đọc câu trả lời ở đó! Có những điều kiện xung quanh làm theo cách này! Cụ thể tôi sẽ đọc câu trả lời này !

Phương pháp tiềm năng # 3

Có một lệnh Unix, setpcicó thể cung cấp cho bạn một phương thức để đặt lại một thiết bị trong bus PCI.

Tôi không thấy bất kỳ ví dụ cụ thể nào với lệnh này vì vậy bạn sẽ phải tìm kiếm các ví dụ trên google và xem qua trang hướng dẫn . Tôi sẽ bước đi nhẹ nhàng với lệnh này cho đến khi bạn tự tin sử dụng nó. Từ những gì tôi đã đọc về nó, nó thao túng phần cứng trực tiếp và do đó luôn có rủi ro khi tự mình làm điều đó so với việc sử dụng một công cụ phơi bày loại chức năng này!


1
Không có gì hiển thị trong các khe, mặc dù tôi đã cắm nhiều thẻ. Tôi có một thư mục nguồn /sys/bus/pci/devices/$NUMBER/. Nhưng dường như không có gì đảm bảo cài đặt 0 hoặc 1
zachd1_618

1
Tôi đã bắt gặp chủ đề này trên U & L , một vấn đề tương tự: có một số câu trả lời cho câu hỏi đó nói rằng bạn có thể đặt lại với điều này: echo "1"> / sys / bus / pci / thiết bị / $ SỐ / thiết lập lại. Đọc rằng Q mặc dù, có những điều kiện xung quanh làm theo cách đó!
slm

Cảm ơn các liên kết. Tuy nhiên, tôi đã thử điều đó và dường như không làm gì cả. Cụ thể, thiết bị không có chu kỳ điện và hệ thống vẫn biết nó ở đó. (Khi thẻ được bật và cắm, có những thiết bị trong / dev mà tôi có thể xem). Họ không biến mất khi tôi echo "1" > ....
zachd1_618

1
Bạn có đang dỡ các mô-đun hạt nhân cho thẻ đó trước khi đạp xe không? Tôi nghĩ bạn phải làm điều đó là tốt.
slm

1
Tôi nghĩ rằng tôi sẽ kiểm tra mã nguồn kernel để xem việc bật tắt có powerthực sự đưa nó vào D3 hay không.
rừng

7

removerescansẽ cho phép nhân quay vòng cấp nguồn cho thiết bị PCI mà không cần reboot:

echo "1" > /sys/bus/pci/devices/DDDD\:BB\:DD.F//remove
sleep 1
echo "1" > /sys/bus/pci/rescan

trong đó DDDD.BB.DD.F = Tên miền: Xe buýt: Thiết bị.


echo "1"> / sys / bus / pci / rescan được làm việc cho tôi trong khe cắm mini pci lenovo g560. Tôi cắm thẻ USB 3.0 minipci. Hệ thống là Ubuntu 16.04 x64
kodmanyagha

Nó không hoạt động cho tất cả các thiết bị. Tôi đã có một bộ điều hợp mạng Cavium không tắt nguồn bằng phương pháp đó vì tôi vẫn có thể truy cập u-boot của nó khi sử dụng một dòng nối tiếp.
Eric

7

Đặt lại trong PCI express là một chút phức tạp. Có hai loại thiết lập lại chính - đặt lại thông thường và đặt lại cấp chức năng. Ngoài ra còn có hai loại đặt lại thông thường, đặt lại cơ bản và đặt lại không cơ bản. Xem thông số kỹ thuật của PCI express để biết tất cả các chi tiết.

'Thiết lập lại lạnh' là thiết lập lại cơ bản diễn ra sau khi cấp nguồn cho thiết bị PCIe. Dường như không có cách nào để kích hoạt thiết lập lại lạnh, tiết kiệm cho việc tắt hệ thống và bật lại. Trên máy của tôi, /sys/bus/pci/slotsthư mục trống.

'Cài đặt lại ấm' là thiết lập lại cơ bản được kích hoạt mà không ngắt kết nối nguồn khỏi thiết bị. Dường như không có cách nào để kích hoạt thiết lập lại ấm áp.

'Thiết lập lại nóng' là thiết lập lại thông thường được kích hoạt qua liên kết PCI Express. Thiết lập lại nóng được kích hoạt khi liên kết bị buộc ở chế độ chờ điện hoặc bằng cách gửi các bộ được đặt hàng TS1 và TS2 với bộ bit thiết lập lại nóng. Phần mềm có thể bắt đầu thiết lập lại nóng bằng cách cài đặt và sau đó xóa bit thiết lập lại bus thứ cấp trong thanh ghi điều khiển cầu trong không gian cấu hình PCI của cổng cầu nối ngược của thiết bị.

Reset Thiết lập lại mức chức năng '(FLR) là thiết lập lại chỉ ảnh hưởng đến một chức năng duy nhất của thiết bị PCI Express. Nó không được thiết lập lại toàn bộ thiết bị PCIe. Việc cài đặt lại mức chức năng không được yêu cầu bởi đặc tả PCIe. Thiết lập lại cấp độ chức năng được bắt đầu bằng cách đặt bit thiết lập lại cấp độ chức năng trong thanh ghi điều khiển thiết bị của chức năng trong cấu trúc khả năng thể hiện PCI trong không gian cấu hình PCI.

Linux trưng ra chức năng thiết lập lại mức chức năng ở dạng /sys/bus/pci/devices/$dev/reset. Viết 1 vào tệp này sẽ bắt đầu thiết lập lại cấp độ chức năng trên chức năng tương ứng. Lưu ý rằng điều này chỉ ảnh hưởng đến chức năng cụ thể của thiết bị, không phải toàn bộ thiết bị và các thiết bị không bắt buộc phải thực hiện đặt lại cấp chức năng theo thông số kỹ thuật của PCIe.

Tôi không biết về bất kỳ phương pháp 'đẹp' nào để kích hoạt thiết lập lại nóng (không có mục sysfs nào cho việc đó). Tuy nhiên, có thể sử dụng setpci để làm như vậy:

#!/bin/bash

dev=$1

if [ -z "$dev" ]; then
    echo "Error: no device specified"
    exit 1
fi

if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
    dev="0000:$dev"
fi

if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
    echo "Error: device $dev not found"
    exit 1
fi

port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev")))

if [ ! -e "/sys/bus/pci/devices/$port" ]; then
    echo "Error: device $port not found"
    exit 1
fi

echo "Removing $dev..."

echo 1 > "/sys/bus/pci/devices/$dev/remove"

echo "Performing hot reset of port $port..."

bc=$(setpci -s $port BRIDGE_CONTROL)

echo "Bridge control:" $bc

setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $(("0x$bc" | 0x40)))
sleep 0.01
setpci -s $port BRIDGE_CONTROL=$bc
sleep 0.5

echo "Rescanning bus..."

echo 1 > "/sys/bus/pci/devices/$port/rescan"

Đảm bảo rằng tất cả các trình điều khiển đính kèm được dỡ tải trước khi chạy tập lệnh này. Tập lệnh này sẽ cố gắng loại bỏ thiết bị PCIe, sau đó ra lệnh cho cổng chuyển đổi ngược dòng phát hành thiết lập lại nóng, sau đó thử quét lại bus PCIe. Kịch bản này cũng chỉ được thử nghiệm trên các thiết bị có một chức năng duy nhất, vì vậy nó có thể cần một số thao tác lại cho các thiết bị có nhiều chức năng.


Kịch bản này hoạt động cho AMD RX480 của tôi. Bối cảnh: PCI thông qua một khách Win10, sau đó tắt hoặc khởi động lại khách. Bắt đầu lại khách (không sử dụng tập lệnh này) sẽ bị treo nếu GPU vẫn được gắn. Chạy tập lệnh này ở giữa đã khắc phục sự cố
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.