PCIe Aygıtı Gücü Nasıl Sıfırlanır / Çevrilir?


20

Yalnızca bilgisayar tamamen kapatılıp açıldığında düzgün çalışan bir PCIe aygıtım var. Basit bir komut rebootveya reboot -pkomutun verilmesi, PCIe kartın gücünü yeniden başlattıktan sonra çalışmamasına neden oluyor gibi görünmüyor.

İşletim sisteminden, PCIe yuvasındaki bir aygıta güç döngüsü yapmanın bir yolu var mı? İçinde bulabilirim /sys/bus/pci/devices/0000*/, ancak kartı düzgün bir şekilde nasıl sıfırlayacağımı anlayamıyorum. Geçiş gücü tek yol gibi görünüyor.

Bunu engellemek gerekirse, bir rebootkomutta tam güç döngüsüne neden olacak bir ayarı değiştirebilir miyim ?

Bu arada Ubuntu 12.10 kullanıyorum.


Denedin reboot -fmi Bu, CPU'nun güç düğmesine basmaya benzer.
ktan

1
İki yıl önce OP bir yazılımın rebootişe yaramadığına dikkat çekti . Sizin reboot -fhala bir yazılımdan önyükleme olduğunu.
roaima

Yanıtlar:


16

Potansiyel Yöntem # 1

Bence şu komutlarla yapabilirsiniz:

devre dışı

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

etkinleştirme

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

$NUMBERPCI yuvasının sayısı nerede .

lspci -vvcihazın tanımlanmasına yardımcı olabilir. Bu çok iyi belgelenmemiş ...

Potansiyel Yöntem # 2

Bu konuya U&L , benzer bir sorunla karşılaştım: bu soruya bu komutla sıfırlayabileceğinizi söyleyen bazı cevaplar var:

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

Ancak, cevapları orada okurdum! Bunu bu şekilde yapmak için şartlar var! Özellikle bu cevabı okurdum !

Potansiyel Yöntem # 3

setpciPCI veri yolundaki bir aygıtı sıfırlamak için bir yöntem verebilecek bir Unix komutu vardır .

Bu komutla ilgili özel bir örnek görmedim, bu yüzden örnekler için google ve man sayfasına bakmanız gerekecek . Kullanımından emin olana kadar bu komutla hafifçe basarım. Bu konuda okuduğum kadarıyla, donanımı doğrudan manipüle ediyor ve bu yüzden bu tür işlevselliği ortaya çıkaran bir araç kullanmak yerine kendiniz yapmanın her zaman riski var!


1
Takılı birden çok kartım olmasına rağmen hiçbir şey yuvalarda görünmüyor. Bir güç dizinim var /sys/bus/pci/devices/$NUMBER/. Ancak hiçbir şey 0 veya 1 ayarını gerektirmez
zachd1_618

1
U & L , benzer bir konu bu konuya rastladım : Q ile bununla sıfırlayabileceğinizi söyleyen bazı cevaplar var: echo "1"> / sys / bus / pci / Devices / $ NUMBER / reset. Yine de bu Q'yu okuyun, bu şekilde yapmak için koşullar var!
slm

Bağlantı için teşekkürler. Ancak bunu denedim ve hiçbir şey yapmıyor gibi görünüyor. Özellikle, cihaz güç çevrimini yapmaz ve sistem hala orada olduğunu bilir. (Kart açık ve takılı olduğunda, / dev'de izleyebileceğim cihazlar var). Ben olduğumda kaybolmuyorlar echo "1" > ....
zachd1_618

1
Güç döngüsünden önce söz konusu kartın çekirdek modüllerini mi boşaltıyorsunuz? Bence bunu da yapmak zorundasın.
slm

1
Geçiş yapmanın poweraslında D3'e koyup koymadığını görmek için çekirdek kaynak kodunu kontrol edeceğimi düşünüyorum .
orman

7

removeve rescançekirdeğin PCI aygıtını döngüleyiciye açmasına izin verir reboot:

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

where DDDD.BB.DD.F = Alan adı: Bus: Device.Function


echo "1"> / sys / bus / pci / rescan, lenovo g560 mini pci yuvasında benim için çalışıyor. USB 3.0 minipci kartını taktım. Sistem Ubuntu 16.04 x64
kodmanyagha

Tüm cihazlarda çalışmaz. Bir seri hat kullanırken hala u-boot'ına erişebildiğim için bu yöntemle kapanmayan bir Cavium ağ bağdaştırıcım var.
Eric

7

PCI express'teki sıfırlamalar biraz karmaşıktır. İki ana sıfırlama türü vardır: geleneksel sıfırlama ve işlev düzeyinde sıfırlama. Ayrıca iki tür geleneksel sıfırlama vardır: temel sıfırlamalar ve temel olmayan sıfırlamalar. Tüm ayrıntılar için PCI express teknik özelliklerine bakın.

'Soğuk sıfırlama', bir PCIe aygıtına güç uygulandıktan sonra gerçekleştirilen temel bir sıfırlamadır. Soğuk sıfırlamayı tetiklemenin standart bir yolu yok gibi görünüyor, sistemi kapatıp tekrar açmak için kaydedin. Makinelerimde /sys/bus/pci/slotsdizin boş.

'Sıcak sıfırlama', cihazın gücü kesilmeden tetiklenen temel bir sıfırlamadır. Sıcak sıfırlamayı tetiklemenin standart bir yolu yok gibi görünüyor.

'Çalışırken sıfırlama', PCI express bağlantısı üzerinden tetiklenen geleneksel bir sıfırlamadır. Bir bağlantı elektriksel rölantiye zorlandığında veya sıcak sıfırlama biti ayarlanmış TS1 ve TS2 sıralı setler göndererek bir sıcak sıfırlama tetiklenir. Yazılım, aygıtın üstündeki köprü bağlantı noktasının PCI yapılandırma alanındaki köprü kontrol kaydındaki ikincil veri yolu sıfırlama bitini ayarlayıp temizleyerek bir sıcak sıfırlama başlatabilir.

'İşlev düzeyinde sıfırlama' (FLR), PCI express aygıtının yalnızca tek bir işlevini etkileyen bir sıfırlamadır. Tüm PCIe aygıtını sıfırlamamalıdır. PCIe belirtimi için işlev düzeyi sıfırlamaların uygulanması gerekmez. Bir işlev düzeyinde sıfırlama, PCI yapılandırma alanındaki PCI express özellik yapısında işlevin aygıt kontrol kaydında başlatma işlev düzeyi sıfırlama bitini ayarlayarak başlatılır.

Linux, işlev düzeyinde sıfırlama işlevini /sys/bus/pci/devices/$dev/reset. Bu dosyaya 1 yazıldığında, ilgili işlevde işlev düzeyinde sıfırlama başlatılır. Bunun yalnızca aygıtın değil, aygıtın belirli bir işlevini etkilediğini ve aygıtların PCIe belirtimine göre işlev düzeyi sıfırlamaları uygulamak için gerekli olmadığını unutmayın.

Bir sıcak sıfırlama tetiklemek için herhangi bir 'güzel' yöntem farkında değilim (bunun için sysfs girişi yoktur). Ancak bunu yapmak için setpci kullanmak mümkündür:

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

Bu komut dosyasını çalıştırmadan önce tüm bağlı sürücülerin kaldırıldığından emin olun. Bu komut dosyası, PCIe aygıtını kaldırmaya çalışacak, ardından yukarı akış anahtarı bağlantı noktasına bir sıcak sıfırlama vermesini isteyecek ve ardından PCIe veri yolunu yeniden taramaya çalışacaktır. Bu komut dosyası yalnızca tek bir işlevi olan aygıtlarda da sınanmıştır, bu nedenle birden çok işlevi olan aygıtlar için yeniden işleme ihtiyaç duyulabilir.


Bu script AMD RX480'im için çalıştı. Bağlam: PCI, bir Win10 misafirine geçilir, ardından konuğu kapatır veya yeniden başlatır. GPU hala bağlıysa, konuğun yeniden başlatılması (bu komut dosyasını kullanmadan) kilitlenir. Bu komut dosyasını arasında çalıştırmak sorunu çözdü
太郎 太郎
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.