วิธีการรีเซ็ต / หมุนเวียนกำลังไปยังอุปกรณ์ PCIe


20

ฉันมีอุปกรณ์ PCIe ที่ทำงานได้อย่างถูกต้องเฉพาะเมื่อปิดและเปิดเครื่องอีกครั้ง การออกคำสั่งอย่างง่ายrebootหรือreboot -pคำสั่งไม่ปรากฏขึ้นเพื่อหมุนเวียนพลังงานไปยังการ์ด PCIe ซึ่งทำให้ไม่สามารถทำงานได้หลังจากรีบูต

มีวิธีใดบ้างที่จะหมุนเวียนพลังงานไปยังอุปกรณ์ในสล็อต PCIe ได้หรือไม่? ฉันสามารถค้นหาได้/sys/bus/pci/devices/0000*/แต่ฉันไม่สามารถหาวิธีรีเซ็ตบอร์ดได้อย่างถูกต้อง พลังที่สลับกันน่าจะเป็นหนทางเดียวเท่านั้น

นอกจากนี้ฉันสามารถเปลี่ยนการตั้งค่าที่จะทำให้เกิดรอบการใช้พลังงานเต็มในrebootคำสั่งได้หรือไม่?

ฉันใช้ Ubuntu 12.10 อยู่ดี


คุณลองreboot -fไหม คล้ายกับการกดปุ่มเปิดปิดของ CPU
ktan

1
สองปีที่ผ่านมา OP ชี้ให้เห็นว่านุ่มrebootไม่ทำงาน คุณreboot -fยังคงมีการรีบูทซอฟต์
roaima

คำตอบ:


16

ศักยภาพวิธี # 1

ฉันคิดว่าคุณสามารถทำได้ด้วยคำสั่งเหล่านี้:

ปิดการใช้งาน

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

ทำให้สามารถ

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

$NUMBERหมายเลขสล็อต PCI อยู่ที่ไหน

lspci -vvอาจช่วยระบุอุปกรณ์ เอกสารนี้ไม่ได้เป็นอย่างดี ...

ศักยภาพวิธี # 2

ฉันเจอกระทู้นี้ใน U&Lปัญหาที่คล้ายกัน: มีคำตอบบางคำถามที่บอกว่าคุณสามารถรีเซ็ตด้วยคำสั่งนี้:

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

อย่างไรก็ตามฉันจะอ่านคำตอบที่นั่น! มีเงื่อนไขว่าด้วยการทำเช่นนี้! โดยเฉพาะฉันจะอ่านคำตอบนี้ !

ศักยภาพวิธี # 3

มีคำสั่ง Unix setpciที่อาจให้วิธีการรีเซ็ตอุปกรณ์ในบัส PCI

ผมไม่ได้เห็นตัวอย่างที่เฉพาะเจาะจงใด ๆ กับคำสั่งนี้เพื่อให้คุณจะต้อง google สำหรับตัวอย่างและดูผ่านหน้าคน ฉันจะเหยียบเบา ๆ ด้วยคำสั่งนี้จนกว่าคุณจะมั่นใจในการใช้งาน จากสิ่งที่ฉันได้อ่านเกี่ยวกับมันมันจัดการฮาร์ดแวร์โดยตรงและดังนั้นจึงมีความเสี่ยงในการทำด้วยตัวคุณเองเสมอกับการใช้เครื่องมือที่แสดงการทำงานประเภทนี้!


1
ไม่มีสิ่งใดปรากฏในสล็อตแม้ว่าฉันจะเสียบการ์ดหลายการ์ด แต่ฉันมี/sys/bus/pci/devices/$NUMBER/ไดเรคทอรี่ระบบ แต่ดูเหมือนว่าจะไม่มีอะไรรับประกันการตั้งค่า 0 หรือ 1
zachd1_618

1
ฉันเจอกระทู้นี้ใน U&Lปัญหาที่คล้ายกัน: มีคำตอบบางคำถามที่บอกว่าคุณสามารถรีเซ็ตได้ด้วยสิ่งนี้: echo "1"> / sys / bus / pci / อุปกรณ์ / $ NUMBER / รีเซ็ต อ่านคำถามที่ว่ามีเงื่อนไขอยู่รอบตัวด้วยวิธีนี้!
slm

ขอบคุณสำหรับลิงค์ ฉันได้ลองแล้วและดูเหมือนจะไม่ทำอะไรเลย โดยเฉพาะอย่างยิ่งอุปกรณ์ไม่ได้ใช้พลังงานและระบบยังรู้ว่ามีอยู่ (เมื่อการ์ดเปิดและเสียบมีอุปกรณ์ใน / dev ที่ฉันสามารถดู) echo "1" > ...พวกเขาไม่ได้หายไปเมื่อฉัน
zachd1_618

1
คุณกำลังยกเลิกการโหลดโมดูลเคอร์เนลสำหรับการ์ดนั้นก่อนการหมุนเวียนพลังงานหรือไม่? ฉันคิดว่าคุณต้องทำเช่นนั้นเช่นกัน
slm

1
ฉันคิดว่าฉันจะตรวจสอบซอร์สโค้ดเคอร์เนลเพื่อดูว่าการสลับpowerนั้นวางลงใน D3 จริงหรือไม่
ป่า

7

removeและrescanจะทำให้เคอร์เนลสามารถหมุนอุปกรณ์ PCI โดยไม่ต้องreboot:

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

โดยที่ DDDD.BB.DD.F = โดเมน: Bus: Device.Function


echo "1"> / sys / bus / pci / rescan ทำงานให้ฉันใน lenovo g560 mini pci slot ฉันเสียบการ์ด USB 3.0 minipci ระบบคือ Ubuntu 16.04 x64
kodmanyagha

มันไม่ทำงานสำหรับอุปกรณ์ทั้งหมด ฉันมีอะแดปเตอร์เครือข่าย Cavium ที่ไม่ได้ปิดการทำงานด้วยวิธีการนั้นเพราะฉันยังสามารถเข้าถึง u-boot ได้เมื่อใช้สายอนุกรม
Eric

7

การรีเซ็ตใน PCI Express นั้นซับซ้อนเล็กน้อย การรีเซ็ตมีสองประเภทหลัก - การรีเซ็ตแบบปกติและการรีเซ็ตระดับฟังก์ชั่น นอกจากนี้ยังมีการรีเซ็ตทั่วไปสองประเภทการรีเซ็ตพื้นฐานและรีเซ็ตที่ไม่ใช่พื้นฐาน ดูข้อกำหนด PCI Express สำหรับรายละเอียดทั้งหมด

'การรีเซ็ตแบบเย็น' คือการรีเซ็ตพื้นฐานที่เกิดขึ้นหลังจากใช้พลังงานกับอุปกรณ์ PCIe ดูเหมือนจะไม่มีวิธีมาตรฐานในการกระตุ้นการรีเซ็ตแบบเย็นบันทึกสำหรับการปิดระบบและเปิดใหม่อีกครั้ง บนเครื่องของฉัน/sys/bus/pci/slotsไดเรกทอรีว่างเปล่า

'การรีเซ็ตแบบวอร์ม' เป็นการรีเซ็ตพื้นฐานที่ทำงานโดยไม่ตัดการเชื่อมต่อพลังงานจากอุปกรณ์ ดูเหมือนจะไม่มีวิธีมาตรฐานในการทำให้เกิดการรีเซ็ตแบบวอร์ม

'การรีเซ็ตร้อน' คือการรีเซ็ตแบบเดิมที่เรียกใช้ผ่านลิงก์ PCI Express การรีเซ็ตร้อนจะถูกเรียกใช้เมื่อลิงก์ถูกบังคับให้อยู่ในสถานะไม่ใช้งานไฟฟ้าหรือโดยการส่งชุดที่สั่งซื้อ TS1 และ TS2 ด้วยชุดบิตรีเซ็ตร้อน ซอฟต์แวร์สามารถเริ่มต้นการรีเซ็ตร้อนโดยการตั้งค่าแล้วล้างบิตรีเซ็ตบัสรองในการลงทะเบียนตัวควบคุมบริดจ์ในพื้นที่กำหนดค่า PCI ของบริดจ์พอร์ตอัพสตรีมของอุปกรณ์

'รีเซ็ตระดับฟังก์ชั่น' (FLR) เป็นการรีเซ็ตที่ส่งผลกระทบต่อฟังก์ชั่นเดียวของอุปกรณ์ PCI Express ต้องไม่รีเซ็ตอุปกรณ์ PCIe ทั้งหมด การใช้การรีเซ็ตระดับฟังก์ชั่นนั้นไม่จำเป็นต้องใช้กับข้อกำหนด PCIe การรีเซ็ตระดับฟังก์ชั่นเริ่มต้นโดยการตั้งค่าบิตเริ่มต้นระดับฟังก์ชันในการลงทะเบียนการควบคุมอุปกรณ์ของฟังก์ชั่นในโครงสร้างความสามารถของ PCI Express ในพื้นที่กำหนดค่า PCI

ลินุกซ์ exposes /sys/bus/pci/devices/$dev/resetฟังก์ชั่นการตั้งค่าฟังก์ชั่นระดับในรูปแบบของ การเขียน 1 ไปยังไฟล์นี้จะเริ่มต้นการรีเซ็ตระดับฟังก์ชั่นในฟังก์ชั่นที่เกี่ยวข้อง โปรดทราบว่าสิ่งนี้มีผลเฉพาะกับฟังก์ชั่นเฉพาะของอุปกรณ์ไม่ใช่ทั้งอุปกรณ์และอุปกรณ์ไม่จำเป็นต้องใช้การรีเซ็ตระดับฟังก์ชั่นตามข้อกำหนด PCIe

ฉันไม่ได้ตระหนักถึงวิธี 'ดี' ใด ๆ สำหรับการเรียกใช้การรีเซ็ตร้อน (ไม่มีรายการ sysfs สำหรับที่) อย่างไรก็ตามมันเป็นไปได้ที่จะใช้ setpci ทำเช่นนั้น:

#!/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 จากนั้นคำสั่งพอร์ตสวิตช์อัปสตรีมเพื่อออกการรีเซ็ตร้อนจากนั้นลองสแกนบัส PCIe อีกครั้ง สคริปต์นี้ยังได้รับการทดสอบบนอุปกรณ์ที่มีฟังก์ชั่นเดียวเท่านั้นดังนั้นจึงอาจต้องมีการทำงานซ้ำสำหรับอุปกรณ์ที่มีฟังก์ชั่นหลายอย่าง


สคริปต์นี้ใช้งานได้กับ AMD RX480 ของฉัน บริบท: PCI ส่งต่อไปยังผู้เยี่ยมชม Win10 จากนั้นปิดหรือรีบูตแขก การเริ่มต้นแขกรับเชิญอีกครั้ง (โดยไม่ใช้สคริปต์นี้) จะหยุดทำงานหาก GPU ยังคงเชื่อมต่ออยู่ การเรียกใช้สคริปต์นี้ในระหว่างการแก้ไขปัญหา
小太郎
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.