पीसीआई एक्सप्रेस में रीसेट थोड़ा जटिल हैं। दो मुख्य प्रकार के रीसेट हैं - पारंपरिक रीसेट, और फ़ंक्शन-स्तरीय रीसेट। दो प्रकार के पारंपरिक रेजेट, मौलिक रेजेट और गैर-मौलिक रेजेट भी हैं। सभी विवरणों के लिए पीसीआई एक्सप्रेस विनिर्देश देखें।
एक 'कोल्ड रीसेट' एक मूलभूत रीसेट है जो पीसीआई डिवाइस पर लागू होने के बाद होता है। प्रतीत होता है कि कोल्ड रीसेट को ट्रिगर करने का कोई मानक तरीका नहीं है, सिस्टम को फिर से चालू करने और फिर से चालू करने के लिए सहेजें। मेरी मशीनों पर, /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 मशीन को फिर से शुरू करने का प्रयास करेगी। इस स्क्रिप्ट को केवल एकल फ़ंक्शन वाले उपकरणों पर भी परीक्षण किया गया है, इसलिए इसे कई कार्यों वाले उपकरणों के लिए कुछ रीएक्टिव की आवश्यकता हो सकती है।
reboot -f
? यह सीपीयू के पावर बटन को दबाने के समान है।