একটি PCIe ডিভাইসে কীভাবে / সাইকেল শক্তি রিসেট করবেন?


20

আমার কাছে একটি পিসিআই ডিভাইস রয়েছে যা কেবল তখনই কম্পিউটারের পুরোপুরি চালিত হয় আবার ঠিক তখনই সঠিকভাবে কাজ করে। একটি সাধারণ rebootবা reboot -pকমান্ড জারি করা পিসিআই কার্ডে পাওয়ারটিকে চক্র হিসাবে দেখা যায় না, যার ফলে এটি পুনরায় বুটের পরে কাজ না করে।

ওএস, চক্র শক্তি থেকে পিসিআই স্লটে কোনও ডিভাইসে যাওয়ার কোনও উপায় আছে? আমি এটি সন্ধান করতে পারি /sys/bus/pci/devices/0000*/, তবে কীভাবে বোর্ডটিকে পুনরায় সেট করতে হবে তা আমি বুঝতে পারি না। টোগলিং পাওয়ার একমাত্র উপায় বলে মনে হচ্ছে।

তা বাদ দিয়ে, আমি কি এমন কোনও সেটিং পরিবর্তন করতে পারি যা rebootকমান্ডের উপর একটি সম্পূর্ণ পাওয়ার চক্র তৈরি করবে ?

আমি পথে উবুন্টু 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ডিভাইস সনাক্ত করতে সহায়তা করতে পারে। এটি খুব ভাল নথিভুক্ত নয় ...

সম্ভাব্য পদ্ধতি # 2

অনুরূপ ইস্যুতে আমি এই থ্রেডটি পেরিয়ে এসেছি : সেই প্রশ্নের কিছু উত্তর রয়েছে যা বলে যে আপনি এই আদেশটি দিয়ে পুনরায় সেট করতে পারেন:

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

তবে, আমি সেখানে উত্তর পড়তে হবে! এইভাবে এটি করার চারপাশে শর্ত আছে! বিশেষত আমি এই উত্তরটি পড়তাম !

সম্ভাব্য পদ্ধতি # 3

একটি ইউনিক্স কমান্ড রয়েছে, setpciএটি আপনাকে পিসিআই বাসে একটি ডিভাইস পুনরায় সেট করার জন্য একটি পদ্ধতি দিতে পারে।

আমি এই কমান্ডের সাথে কোনও নির্দিষ্ট উদাহরণ দেখিনি তাই আপনাকে উদাহরণগুলির জন্য গুগল করতে হবে এবং ম্যান পৃষ্ঠাটি সন্ধান করতে হবে । যতক্ষণ না আপনি এটির ব্যবহারের বিষয়ে আত্মবিশ্বাসী হন ততক্ষণ আমি এই আদেশটি দিয়ে হালকাভাবে চলব। আমি এটি সম্পর্কে যা পড়েছি তা থেকে, এটি সরাসরি হার্ডওয়্যারকে ম্যানিপুলেট করে এবং তাই এটি নিজেই তৈরির ক্ষেত্রে সর্বদা ঝুঁকি থাকে। এমন সরঞ্জাম ব্যবহার করে যা এই ধরণের কার্যকারিতাটি প্রকাশ করে!


1
আমার একাধিক কার্ড প্লাগ ইন করা সত্ত্বেও স্লটে কিছুই দেখা যাচ্ছে না I আমার একটি পাওয়ার ডিরেক্টরি আছে /sys/bus/pci/devices/$NUMBER/। তবে কোনও কিছুই 0 বা 1
zachd1_618

1
আমি অনুরূপ ইস্যুতে এই থ্রেডটি জুড়ে এসেছি : সেই কিউয়ের কিছু উত্তর রয়েছে যা বলে যে আপনি এটি দিয়ে পুনরায় সেট করতে পারেন: প্রতিধ্বনি "1"> / sys / bus / pci / ডিভাইস / $ NUMBER / পুনরায় সেট করুন। প্রশ্নটি পড়ুন যদিও, এটি এমনভাবে করার মতো শর্ত রয়েছে!
SLM

লিঙ্কের জন্য ধন্যবাদ। আমি চেষ্টা করেছি তবে কিছুই করার মনে হচ্ছে না। বিশেষত, ডিভাইসটি চক্রটি চালিত করে না এবং সিস্টেমটি এখনও এটি জানে it (কার্ডটি চালু এবং প্লাগ ইন করা অবস্থায়, / dev এ থাকা ডিভাইসগুলি থাকে যা আমি দেখতে পারি)) আমি যখন তারা অদৃশ্য হয় না echo "1" > ...
zachd1_618

1
আপনি কি পাওয়ার সাইক্লিংয়ের আগে সেই কার্ডটির জন্য কার্নেল মডিউলগুলি আনলোড করছেন? আমার মনে হয় আপনারও এটি করতে হবে।
SLM

1
আমি মনে করি যে টগলিং powerআসলে এটি ডি 3-এ রাখে কিনা তা দেখার জন্য আমি কার্নেল উত্স কোডটি যাচাই করব ।
বন

7

removeএবং rescanকার্নেলটিকে পিসিআই ডিভাইসটি ছাড়াই সাইকেল-চালিত করার অনুমতি দেবে reboot:

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

যেখানে DDDD.BB.DD.F = ডোমেন: বাস: ডিভাইস। ফাংশন


প্রতিধ্বনি "1"> আমার জন্য লেএনভো জি 560 মিনি পিসি স্লটে কাজ করা হয়েছে s আমি ইউএসবি 3.0 মিনিপসি কার্ডে প্লাগ করেছি ged সিস্টেমটি উবুন্টু 16.04 x64
কোডম্যান্যঘা

এটি সমস্ত ডিভাইসের জন্য কাজ করে না। আমি একটি ক্যাভিম নেটওয়ার্ক অ্যাডাপ্টার পেয়েছি যা সেই পদ্ধতির দ্বারা পাওয়ার-অফ হয় না কারণ সিরিয়াল লাইনটি ব্যবহার করার সময় আমি এখনও এর ইউ-বুট অ্যাক্সেস করতে পারি।
এরিক

7

পিসিআই এক্সপ্রেসে রিসেটগুলি কিছুটা জটিল। দুটি মূল ধরণের রিসেট রয়েছে - প্রচলিত রিসেট এবং ফাংশন-স্তর পুনরায় সেট। প্রচলিত পুনরায় সেট দুটি ধরণের রয়েছে, মৌলিক পুনরায় সেট এবং অ-মৌলিক পুনরায় সেটগুলি। সমস্ত বিবরণের জন্য পিসিআই এক্সপ্রেস স্পেসিফিকেশন দেখুন।

একটি 'কোল্ড রিসেট' একটি পিসিআই ডিভাইসে পাওয়ার প্রয়োগ করার পরে ঘটে যাওয়া একটি মৌলিক রিসেট। শীতল রিসেটটি ট্রিগার করার কোনও মানক উপায় নেই বলে মনে হয়, সিস্টেমটি আবার চালু করার জন্য এবং পুনরায় চালু করার জন্য সংরক্ষণ করুন। আমার মেশিনে /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"

নিশ্চিত করুন যে এই স্ক্রিপ্টটি চালানোর আগে সমস্ত সংযুক্ত চালকগুলি আনলোড করা হয়েছে। এই স্ক্রিপ্টটি পিসিআই ডিভাইসটি সরিয়ে ফেলার চেষ্টা করবে, তারপরে একটি উষ্ণ পুনরায় সেট করার জন্য আপস্ট্রিম স্যুইচ পোর্টকে কমান্ড করবে, এবং তারপরে পিসিআই বাসটিকে পুনরায় উদ্ধার করার চেষ্টা করবে। এই স্ক্রিপ্টটি কেবলমাত্র একটি একক ফাংশনযুক্ত ডিভাইসে পরীক্ষা করা হয়েছে, সুতরাং এটি একাধিক ফাংশনযুক্ত ডিভাইসগুলির জন্য কিছু পুনরায় কাজ করার প্রয়োজন হতে পারে।


এই স্ক্রিপ্টটি আমার AMD RX480 এর জন্য কাজ করেছে। প্রসঙ্গ: পিসিআই উইন 10 অতিথির কাছে পাসথ্রু, তারপরে গেস্টটি বন্ধ করে বা পুনরায় চালু করা হবে। অতিথির আবার শুরু করা (এই স্ক্রিপ্টটি ব্যবহার না করে) জিপিইউ সংযুক্ত থাকলে hang সমস্যা সংশোধন মধ্যে এই স্ক্রিপ্টের চলমান
小太郎
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.