Đặ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/slots
thư 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.
reboot -f
chưa Điều này tương tự như nhấn nút nguồn của CPU.