Bagaimana cara mereset / memutar daya ke perangkat PCIe?

20

Saya memiliki perangkat PCIe yang hanya berfungsi dengan benar ketika komputer dimatikan penuh kemudian dihidupkan lagi. Mengeluarkan perintah rebootatau sederhana reboot -ptampaknya tidak memutar daya ke kartu PCIe, yang menyebabkannya tidak berfungsi setelah reboot.

Apakah ada cara untuk, dari OS, memutarkan daya ke perangkat di slot PCIe? Saya dapat menemukannya /sys/bus/pci/devices/0000*/, tetapi saya tidak tahu cara mengatur ulang papan dengan benar. Beralih kekuatan tampaknya menjadi satu-satunya cara.

Kecuali itu, dapatkah saya mengubah pengaturan di suatu tempat yang akan menyebabkan siklus daya penuh pada rebootperintah?

Omong-omong, saya menjalankan Ubuntu 12.10.

zachd1_618
sumber
Apakah kamu sudah mencoba reboot -f? Ini mirip dengan menekan tombol daya CPU.
ktan
1
Dua tahun lalu OP menunjukkan bahwa soft reboottidak berfungsi. Anda reboot -fmasih reboot lembut.
roaima

Jawaban:

16

Metode Potensial # 1

Saya pikir Anda bisa melakukannya dengan perintah ini:

nonaktifkan

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

memungkinkan

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

Di mana $NUMBERnomor slot PCI.

lspci -vvdapat membantu mengidentifikasi perangkat. Ini tidak didokumentasikan dengan sangat baik ...

Metode Potensial # 2

Saya menemukan utas ini di U&L , masalah serupa: ada beberapa jawaban untuk pertanyaan itu yang mengatakan Anda dapat mengatur ulang dengan perintah ini:

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

Namun, saya akan membaca jawabannya di sana! Ada beberapa kondisi di sekitar melakukannya dengan cara ini! Secara khusus saya akan membaca jawaban ini !

Metode Potensial # 3

Ada perintah Unix setpci,, yang dapat memberi Anda metode untuk mengatur ulang perangkat di bus PCI.

Saya tidak melihat contoh spesifik dengan perintah ini sehingga Anda harus mencari contoh di google dan melihat-lihat halaman manual . Saya akan melangkah ringan dengan perintah ini sampai Anda yakin menggunakannya. Dari apa yang saya baca tentang hal itu, itu memanipulasi perangkat keras secara langsung sehingga selalu ada risiko dalam melakukannya sendiri vs menggunakan alat yang mengekspos fungsionalitas jenis ini!

slm
sumber
1
Tidak ada yang muncul di slot, meskipun saya memiliki beberapa kartu yang terhubung. Saya memiliki direktori power di /sys/bus/pci/devices/$NUMBER/. Tapi sepertinya tidak ada yang menjamin pengaturan 0 atau 1
zachd1_618
1
Saya menemukan utas ini pada U&L , masalah yang serupa: ada beberapa jawaban untuk Q yang mengatakan Anda dapat mengatur ulang dengan ini: echo "1"> / sys / bus / pci / devices / $ NUMBER / reset. Baca Q itu, ada beberapa kondisi di sekitar melakukannya dengan cara itu!
slm
Terima kasih untuk tautannya. Namun saya sudah mencobanya dan sepertinya tidak melakukan apa-apa. Secara khusus, perangkat tidak menghidupkan daya dan sistem masih tahu itu ada. (Ketika kartu dihidupkan dan dicolokkan, ada perangkat di / dev yang bisa saya tonton). Mereka tidak menghilang saat aku echo "1" > ....
zachd1_618
1
Apakah Anda membongkar modul kernel untuk kartu itu sebelum power cycle? Saya pikir Anda harus melakukan itu juga.
slm
1
Saya pikir saya akan memeriksa kode sumber kernel untuk melihat apakah toggling powerbenar-benar memasukkannya ke D3.
forest
7

removedan rescanakan memungkinkan kernel untuk menggerakkan daya perangkat PCI tanpa reboot:

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

di mana DDDD.BB.DD.F = Domain: Bus: Device.Function

dunia maya
sumber
gema "1"> / sys / bus / pci / rescan bekerja untuk saya di slot mini lciovo g560. Saya terhubung dengan kartu USB 3.0 minipci.
Sistemnya
Itu tidak berfungsi untuk semua perangkat. Saya punya adaptor jaringan Cavium yang tidak dimatikan dengan metode itu karena saya masih dapat mengakses boot-u-nya saat menggunakan jalur serial.
Eric
7

Reset di PCI express agak rumit. Ada dua jenis utama pengaturan ulang - reset konvensional, dan reset level fungsi. Ada juga dua jenis pengaturan ulang konvensional, pengaturan dasar dan pengaturan non-fundamental. Lihat spesifikasi PCI express untuk semua detailnya.

'Cold reset' adalah reset mendasar yang terjadi setelah daya diterapkan ke perangkat PCIe. Tampaknya tidak ada cara standar untuk memicu reset dingin, kecuali mematikan sistem dan menyalakan kembali. Di komputer saya, /sys/bus/pci/slotsdirektori kosong.

'Warm reset' adalah reset mendasar yang dipicu tanpa memutus daya dari perangkat. Tampaknya tidak ada cara standar untuk memicu reset hangat.

'Hot reset' adalah pengaturan ulang konvensional yang dipicu pada tautan PCI express. Reset panas dipicu baik ketika tautan dipaksa ke idle listrik atau dengan mengirim set memerintahkan TS1 dan TS2 dengan set bit reset panas. Perangkat lunak dapat memulai reset panas dengan mengatur dan kemudian membersihkan bit reset bus sekunder di register kontrol jembatan di ruang konfigurasi PCI port jembatan hulu perangkat.

'Reset tingkat fungsi' (FLR) adalah pengaturan ulang yang hanya memengaruhi satu fungsi perangkat PCI express. Itu tidak boleh mereset seluruh perangkat PCIe. Menerapkan pengaturan tingkat fungsi tidak diperlukan oleh spesifikasi PCIe. Reset level fungsi dimulai dengan mengatur bit reset level fungsi mulai pada register kontrol perangkat fungsi dalam struktur kemampuan PCI express di ruang konfigurasi PCI.

Linux memperlihatkan fungsi reset level fungsi dalam bentuk /sys/bus/pci/devices/$dev/reset. Menulis 1 ke file ini akan memulai reset tingkat fungsi pada fungsi yang sesuai. Perhatikan bahwa ini hanya memengaruhi fungsi spesifik perangkat tersebut, bukan keseluruhan perangkat, dan perangkat tidak diharuskan untuk mengimplementasikan pengaturan level fungsi sesuai dengan spesifikasi PCIe.

Saya tidak mengetahui adanya metode 'bagus' untuk memicu reset panas (tidak ada entri sysfs untuk itu). Namun, dimungkinkan untuk menggunakan setpci untuk melakukannya:

#!/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"

Pastikan semua driver yang terpasang diturunkan sebelum menjalankan skrip ini. Script ini akan mencoba untuk menghapus perangkat PCIe, kemudian memerintahkan port switch hulu untuk mengeluarkan reset panas, kemudian mencoba untuk memindai ulang bus PCIe. Skrip ini juga hanya diuji pada perangkat dengan fungsi tunggal, sehingga mungkin perlu pengerjaan ulang untuk perangkat dengan banyak fungsi.

alex.forencich
sumber
Skrip ini berfungsi untuk AMD RX480 saya. Konteks: PCI beralih ke tamu Win10, lalu mematikan atau me-reboot tamu. Memulai lagi tamu (tanpa menggunakan skrip ini) akan hang jika GPU masih terpasang. Menjalankan skrip ini di sela memperbaiki masalah
小 太郎