कैसे एक PCIe डिवाइस के लिए रीसेट / साइकिल पावर?


20

मेरे पास एक PCIe डिवाइस है जो केवल तभी सही ढंग से काम करता है जब कंप्यूटर पूरी तरह से फिर से चालू होता है। एक साधारण rebootया reboot -pआदेश जारी करना PCIe कार्ड को शक्ति का चक्रण नहीं करता है, जिसके कारण यह रिबूट के बाद काम नहीं करता है।

वहाँ एक रास्ता है, OS से, एक PCIe स्लॉट में एक उपकरण के लिए चक्र शक्ति? मैं इसे पा सकता हूं /sys/bus/pci/devices/0000*/, लेकिन मैं यह पता नहीं लगा सकता कि बोर्ड को ठीक से कैसे रीसेट किया जाए। टॉगल करने की शक्ति ही एकमात्र रास्ता लगता है।

इस पर रोक लगाते हुए, क्या मैं कहीं एक सेटिंग बदल सकता हूं जो एक rebootकमांड पर पूर्ण शक्ति चक्र का कारण होगा ?

मैं Ubuntu 12.10 रास्ते से चल रहा हूँ।


क्या आपने कोशिश की reboot -f? यह सीपीयू के पावर बटन को दबाने के समान है।
ktan

1
दो साल पहले ओपी ने बताया कि एक नरम rebootकाम नहीं किया। आपका reboot -fअभी भी एक नरम रिबूट है।
रोइमा

जवाबों:


16

संभावित विधि # 1

मुझे लगता है कि आप इसे इन आदेशों के साथ कर सकते हैं:

अक्षम

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

सक्षम

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

$NUMBERपीसीआई स्लॉट की संख्या कहां है।

lspci -vvडिवाइस की पहचान करने में मदद कर सकता है। यह बहुत अच्छी तरह से प्रलेखित नहीं है ...

संभावित विधि # २

मैं इसी तरह के मुद्दे पर यू एंड एल पर आया था : उस प्रश्न के कुछ उत्तर हैं जो कहते हैं कि आप इस आदेश के साथ रीसेट कर सकते हैं:

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

हालाँकि, मैं वहाँ जवाब पढ़ूंगा! इस तरह से इसे करने के आसपास स्थितियां हैं! विशेष रूप से मैं इस उत्तर को पढ़ूंगा !

संभावित विधि # ३

एक यूनिक्स कमांड है, setpciजो आपको पीसीआई बस में एक डिवाइस को रीसेट करने के लिए एक विधि दे सकता है।

मैंने इस कमांड के साथ कोई विशेष उदाहरण नहीं देखा, इसलिए आपको उदाहरणों के लिए Google और मैन पेज के माध्यम से देखना होगा । जब तक आप इसके उपयोग में विश्वास नहीं करते, मैं इस आदेश के साथ हल्के ढंग से चलूंगा। मैंने इसके बारे में जो पढ़ा है, यह सीधे हार्डवेयर में हेरफेर कर रहा है और इसलिए इस प्रकार की कार्यक्षमता को उजागर करने वाले टूल का उपयोग करके इसे स्वयं करने में हमेशा जोखिम होता है!


1
स्लॉट्स में कुछ भी नहीं दिखता है, भले ही मेरे पास कई कार्ड प्लग इन हों। मेरे पास एक पावर डायरेक्टरी है /sys/bus/pci/devices/$NUMBER/। लेकिन
बजे

1
मैं इसी मुद्दे पर यू एंड एल पर आया था , इसी तरह के कुछ उत्तर हैं: क्यू कि कहते हैं कि आप इस के साथ रीसेट कर सकते हैं: इको "1"> / एसआईएस / बस / पीसी / डिवाइस / $ NUMBER / रीसेट। कि क्यू पढ़ें हालांकि, इस तरह से करने के आस-पास स्थितियां हैं!
स्लम

लिंक के लिए धन्यवाद। हालांकि मैंने कोशिश की है और यह कुछ भी करने के लिए प्रतीत नहीं होता है। विशेष रूप से, उपकरण चक्र नहीं चलाता है और सिस्टम को अभी भी पता है कि यह वहाँ है। (जब कार्ड चालू होता है और प्लग इन किया जाता है, तो ऐसे उपकरण / उपकरण होते हैं जिन्हें मैं देख सकता / सकती हूं)। वे गायब नहीं होते जब मैं echo "1" > ...
zachd1_618

1
क्या आप पावर साइकिल चलाने से पहले उस कार्ड के लिए कर्नेल मॉड्यूल उतार रहे हैं? मुझे लगता है कि आपको भी ऐसा करना होगा।
slm

1
मुझे लगता है कि मैं कर्नेल स्रोत कोड की जाँच करूँगा कि क्या powerवास्तव में इसे डी 3 में डालना है।
वन

7

removeऔर rescanपीसीआई उपकरण के बिना कर्नेल को cycler-power को अनुमति देगा reboot:

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

जहां DDDD.BB.DD.F = डोमेन: बस: डिवाइस। जंक्शन


echo "1"> / sys / बस / pci / rescan मेरे लिए lenovo g560 मिनी pci स्लॉट में काम किया है। मैंने USB 3.0 मिनीपसी कार्ड में प्लग इन किया है। सिस्टम उबंटू 16.04 x64 है
kodmanyagha

यह सभी उपकरणों के लिए काम नहीं करता है। मुझे एक कैवियम नेटवर्क अडैप्टर मिला है जो उस विधि से पावर-ऑफ नहीं है क्योंकि मैं अभी भी सीरियल लाइन का उपयोग करते समय इसके यू-बूट को एक्सेस कर सकता हूं।
एरिक

7

पीसीआई एक्सप्रेस में रीसेट थोड़ा जटिल हैं। दो मुख्य प्रकार के रीसेट हैं - पारंपरिक रीसेट, और फ़ंक्शन-स्तरीय रीसेट। दो प्रकार के पारंपरिक रेजेट, मौलिक रेजेट और गैर-मौलिक रेजेट भी हैं। सभी विवरणों के लिए पीसीआई एक्सप्रेस विनिर्देश देखें।

एक 'कोल्ड रीसेट' एक मूलभूत रीसेट है जो पीसीआई डिवाइस पर लागू होने के बाद होता है। प्रतीत होता है कि कोल्ड रीसेट को ट्रिगर करने का कोई मानक तरीका नहीं है, सिस्टम को फिर से चालू करने और फिर से चालू करने के लिए सहेजें। मेरी मशीनों पर, /sys/bus/pci/slotsनिर्देशिका खाली है।

'वार्म रीसेट' एक मूलभूत रीसेट है जिसे डिवाइस से बिजली काटे बिना ट्रिगर किया जाता है। प्रतीत होता है कि गर्म रीसेट को ट्रिगर करने का कोई मानक तरीका नहीं है।

एक 'हॉट रीसेट' एक पारंपरिक रीसेट है जो कि पीसीआई एक्सप्रेस लिंक के आर-पार होता है। जब किसी लिंक को विद्युत निष्क्रिय में या TS1 और TS2 के सेट हॉट हॉट सेट सेट के साथ भेजने के लिए मजबूर किया जाता है, तो एक गर्म रीसेट चालू हो जाता है। सॉफ्टवेयर सेटिंग द्वारा एक गर्म रीसेट शुरू कर सकता है और फिर डिवाइस के ब्रिज पोर्ट के अपस्ट्रीम पीसीआई कॉन्फ़िगरेशन स्पेस में ब्रिज कंट्रोल रजिस्टर में सेकेंडरी बस रीसेट बिट को क्लीयर कर सकता है।

एक 'फंक्शन-लेवल रिसेट' (FLR) एक रिसेट है जो पीसीआई एक्सप्रेस डिवाइस के केवल एक फंक्शन को प्रभावित करता है। यह पूरे PCIe डिवाइस को रीसेट नहीं करना चाहिए। PCIe विनिर्देशन द्वारा फ़ंक्शन-स्तरीय रीसेट को लागू करना आवश्यक नहीं है। PCI कॉन्फ़िगरेशन स्थान में PCI एक्सप्रेस क्षमता संरचना में फ़ंक्शन के डिवाइस नियंत्रण रजिस्टर में फ़ंक्शन फ़ंक्शन-स्तर रीसेट बिट को सेट करके एक फ़ंक्शन-स्तरीय रीसेट शुरू किया जाता है।

लिनक्स फ़ंक्शन-स्तर रीसेट कार्यक्षमता को उजागर करता है /sys/bus/pci/devices/$dev/reset। इस फ़ाइल में 1 लिखने से संबंधित फ़ंक्शन पर फ़ंक्शन-स्तर रीसेट शुरू हो जाएगा। ध्यान दें कि यह केवल डिवाइस के उस विशिष्ट फ़ंक्शन को प्रभावित करता है, न कि पूरे डिवाइस को, और पीसीआई विनिर्देश के अनुसार फ़ंक्शन-स्तरीय रीसेट को लागू करने के लिए उपकरणों की आवश्यकता नहीं होती है।

मुझे हॉट रीसेट को चालू करने के लिए किसी भी 'अच्छे' तरीके की जानकारी नहीं है (इसके लिए कोई sysfs प्रविष्टि नहीं है)। हालांकि, ऐसा करने के लिए सेटपसी का उपयोग करना संभव है:

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

सुनिश्चित करें कि इस स्क्रिप्ट को चलाने से पहले सभी संलग्न ड्राइवर अनलोड हैं। यह स्क्रिप्ट PCIe डिवाइस को हटाने का प्रयास करेगी, फिर एक गर्म रीसेट जारी करने के लिए अपस्ट्रीम स्विच पोर्ट को कमांड करेगी, फिर PCI मशीन को फिर से शुरू करने का प्रयास करेगी। इस स्क्रिप्ट को केवल एकल फ़ंक्शन वाले उपकरणों पर भी परीक्षण किया गया है, इसलिए इसे कई कार्यों वाले उपकरणों के लिए कुछ रीएक्टिव की आवश्यकता हो सकती है।


इस स्क्रिप्ट ने मेरे AMD RX480 के लिए काम किया। संदर्भ: पीसीआई ने एक Win10 अतिथि के लिए passthrough किया, फिर अतिथि को बंद कर रहा है या रिबूट कर रहा है। यदि GPU अभी भी संलग्न था, तो अतिथि को फिर से शुरू करना (इस स्क्रिप्ट का उपयोग किए बिना) लटकाएगा। समस्या का समाधान हो के बीच में इस स्क्रिप्ट चल रहा है
小太郎
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.