পিসিআই এক্সপ্রেসে রিসেটগুলি কিছুটা জটিল। দুটি মূল ধরণের রিসেট রয়েছে - প্রচলিত রিসেট এবং ফাংশন-স্তর পুনরায় সেট। প্রচলিত পুনরায় সেট দুটি ধরণের রয়েছে, মৌলিক পুনরায় সেট এবং অ-মৌলিক পুনরায় সেটগুলি। সমস্ত বিবরণের জন্য পিসিআই এক্সপ্রেস স্পেসিফিকেশন দেখুন।
একটি 'কোল্ড রিসেট' একটি পিসিআই ডিভাইসে পাওয়ার প্রয়োগ করার পরে ঘটে যাওয়া একটি মৌলিক রিসেট। শীতল রিসেটটি ট্রিগার করার কোনও মানক উপায় নেই বলে মনে হয়, সিস্টেমটি আবার চালু করার জন্য এবং পুনরায় চালু করার জন্য সংরক্ষণ করুন। আমার মেশিনে /sys/bus/pci/slots
ডিরেক্টরিটি খালি রয়েছে।
একটি 'উষ্ণ পুনরায় সেট' একটি মৌলিক রিসেট যা ডিভাইস থেকে পাওয়ার সংযোগ বিচ্ছিন্ন না করে ট্রিগার করা হয়। উষ্ণ রিসেটটি ট্রিগার করার কোনও মানক উপায় নেই বলে মনে হয়।
একটি 'হট রিসেট' একটি প্রচলিত রিসেট যা একটি পিসিআই এক্সপ্রেস লিঙ্ক জুড়ে ট্রিগার করা হয়। কোনও লিঙ্ককে বৈদ্যুতিক নিষ্ক্রিয় করতে বাধ্য করা হলে বা টিএস 1 এবং টিএস 2 অর্ডারযুক্ত সেটগুলি হট রিসেট বিট সেট সহ প্রেরণ করেই একটি গরম রিসেট ট্রিগার করা হয়। সফ্টওয়্যারটি ডিভাইসটির ব্রিজ পোর্টের পিসিআই কনফিগারেশন স্পেসে ব্রিজ কন্ট্রোল রেজিস্ট্রারে সেকেন্ডারি বাস রিসেট বিট সেট করে এবং তারপরে একটি গরম রিসেট শুরু করতে পারে।
একটি 'ফাংশন-লেভেল রিসেট' (এফএলআর) এমন রিসেট যা কেবলমাত্র পিসিআই এক্সপ্রেস ডিভাইসের একক ফাংশনকে প্রভাবিত করে। এটি অবশ্যই পুরো পিসিআই ডিভাইসটি পুনরায় সেট করবে না। ফাংশন-স্তরের পুনরায় সেটগুলি প্রয়োগের জন্য পিসিআই স্পেসিফিকেশন প্রয়োজন হয় না। পিসিআই কনফিগারেশন স্পেসে পিসিআই এক্সপ্রেস সক্ষমতার কাঠামোতে ফাংশনের ডিভাইস নিয়ন্ত্রণ রেজিস্টারে ফাংশন-স্তরের পুনরায় সেট বিট সেট করে একটি ফাংশন-লেভেল রিসেট শুরু করা হয়।
লিনাক্স রূপে ফাংশন-স্তরের রিসেট কার্যকারিতাটি প্রকাশ করে /sys/bus/pci/devices/$dev/reset
। এই ফাইলে 1 লিখলে সংশ্লিষ্ট ফাংশনটিতে একটি কার্য-স্তরের পুনরায় সেট শুরু হবে। নোট করুন যে এটি কেবলমাত্র ডিভাইসের সেই নির্দিষ্ট ফাংশনকেই প্রভাবিত করে, পুরো ডিভাইস নয়, এবং ডিভাইসগুলিকে পিসিআই স্পেসিফিকেশন অনুযায়ী ফাংশন-স্তরের পুনরায় সেটগুলি প্রয়োগ করতে হবে না।
গরম রিসেটটি ট্রিগার করার জন্য আমি কোনও 'দুর্দান্ত' পদ্ধতি সম্পর্কে অবগত নই (তার জন্য কোনও সিএসএফএস এন্ট্রি নেই)। তবে সেটপিসি ব্যবহারের জন্য এটি করা সম্ভব:
#!/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"
নিশ্চিত করুন যে এই স্ক্রিপ্টটি চালানোর আগে সমস্ত সংযুক্ত চালকগুলি আনলোড করা হয়েছে। এই স্ক্রিপ্টটি পিসিআই ডিভাইসটি সরিয়ে ফেলার চেষ্টা করবে, তারপরে একটি উষ্ণ পুনরায় সেট করার জন্য আপস্ট্রিম স্যুইচ পোর্টকে কমান্ড করবে, এবং তারপরে পিসিআই বাসটিকে পুনরায় উদ্ধার করার চেষ্টা করবে। এই স্ক্রিপ্টটি কেবলমাত্র একটি একক ফাংশনযুক্ত ডিভাইসে পরীক্ষা করা হয়েছে, সুতরাং এটি একাধিক ফাংশনযুক্ত ডিভাইসগুলির জন্য কিছু পুনরায় কাজ করার প্রয়োজন হতে পারে।
reboot -f
? এটি সিপিইউর পাওয়ার বোতাম টিপানোর অনুরূপ।