Как Сбросить/Циклически повторить Питание к Устройству PCIe?

Проверьте опции монтирования, а именно, смонтировано ли это noexec.

Если это - проблема, например, на/tmp, сделать

sudo mount -o remount,exec /tmp
21
28.04.2013, 02:28
4 ответа

Потенциальный метод № 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.

Я не видел определенных примеров с этой командой, таким образом, необходимо будет погуглить для примеров и просмотреть страницу справочника. Я шагал бы слегка с этой командой, пока Вы не уверены в, он - использование. Из того, что я читал об этом, это управляет аппаратными средствами непосредственно и таким образом, всегда существуют риски в выполнении его самостоятельно по сравнению с использованием инструмента, который выставляет этот тип функциональности!

16
27.01.2020, 19:43
  • 1
    Ничто не обнаруживается в слотах, даже при том, что у меня есть несколько включенных карт. У меня действительно есть каталог питания в /sys/bus/pci/devices/$NUMBER/. Но ничто, кажется, не гарантирует установку 0 или 1 –  zachd1_618 28.04.2013, 02:30
  • 2
    я столкнулся с этим потоком на U&L, подобной проблеме: существуют некоторые ответы на это Q, которые говорят, что можно сбросить с этим: отзовитесь эхом "1">/sys/bus/pci/devices/$NUMBER/reset. Считайте, что Q, хотя, существуют условия вокруг выполнения его тот путь! –  slm♦ 28.04.2013, 02:42
  • 3
    Спасибо за ссылку. Я попробовал это однако, и это, кажется, ничего не делает. А именно, устройство не подвергает циклу включения и выключения питания, и система все еще знает, что это там. (Когда карта идет и включена, существуют устройства в/dev, который я могу наблюдать). Они не исчезают когда я echo "1" > .... –  zachd1_618 28.04.2013, 03:06
  • 4
    Вы разгружаете модули ядра для той карты до цикла включения и выключения питания? Я думаю, что необходимо сделать это также. –  slm♦ 28.04.2013, 03:33

remove и повторное сканирование будет разрешить ядру циклически включать устройство PCI без перезагрузки :

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

где DDDD.BB.DD.F = Домен: Шина: Функция устройства

7
27.01.2020, 19:43

Сбросы в PCI Express немного сложны. Существует два основных типа сброса -обычный сброс и сброс уровня -. Существует также два типа обычных сбросов: фундаментальные сбросы и неосновные сбросы -. Все подробности см. в спецификации PCI Express.

«Холодный сброс» — это фундаментальный сброс, который происходит после подачи питания на устройство PCIe. Похоже, не существует стандартного способа запуска холодного сброса, за исключением выключения и повторного включения системы. На моих машинах каталог /sys/bus/pci/slotsпуст.

«Теплый сброс» — это основной сброс, который запускается без отключения питания от устройства. Похоже, не существует стандартного способа запуска теплого сброса.

«Горячий» сброс — это обычный сброс, который запускается по каналу PCI Express. Горячий сброс запускается либо при переводе канала в режим электрического бездействия, либо при отправке упорядоченных наборов TS1 и TS2 с установленным битом горячего сброса. Программное обеспечение может инициировать горячий сброс, установив, а затем очистив бит сброса вторичной шины в регистре управления мостом в пространстве конфигурации PCI порта моста выше по течению от устройства.

«Сброс уровня функции -» (FLR )— это сброс, который влияет только на одну функцию устройства PCI Express. Он не должен сбрасывать все устройство PCIe. Реализация сброса уровня функции -не требуется спецификацией PCIe. Сброс уровня функции -инициируется установкой бита сброса уровня инициации функции -в регистре управления устройством функции в структуре возможностей PCI Express в пространстве конфигурации PCI.

Linux предоставляет функцию сброса уровня -в виде /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. Этот сценарий также тестировался только на устройствах с одной функцией, поэтому для устройств с несколькими функциями может потребоваться его доработка.

16
27.01.2020, 19:43

Создание ответа, опубликованного alex.forencich

Мне пришлось внести несколько изменений, чтобы это заработало в CentOS 7, отчасти потому, что я работаю не с правами root. Эта версия отображает выполняемые команды.

#!/bin/bash

# e.g.  $./pcie_hot_reset.sh 04:00.0

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 -e "\nRemoving $DEV"

CMD="echo 1 | sudo tee /sys/bus/pci/devices/$DEV/remove"
printf "> $CMD\n"
eval $CMD


echo -e "\nPerforming hot reset of port $PORT"

CMD="setpci -s $PORT BRIDGE_CONTROL"
printf "> $CMD\n"
BR_CTRL=$(eval $CMD)

echo "Bridge control: $BR_CTRL"

CMD="sudo setpci -s $PORT BRIDGE_CONTROL=$(printf "%04x" $((0x${BR_CTRL} | 0x40)))"
printf "> $CMD\n"
eval $CMD
sleep 0.01

CMD="sudo setpci -s $PORT BRIDGE_CONTROL=$BR_CTRL"
printf "> $CMD\n"
eval $CMD
sleep 0.5


echo -e "\nRescanning bus"

CMD="echo 1 | sudo tee /sys/bus/pci/devices/$PORT/rescan"
printf "> $CMD\n"
eval $CMD

Пример вывода:

$./pcie_hot_reset.sh 04:00.0

Removing 0000:04:00.0
> echo 1 | sudo tee /sys/bus/pci/devices/0000:04:00.0/remove
1

Performing hot reset of port 0000:00:03.0
> setpci -s 0000:00:03.0 BRIDGE_CONTROL
Bridge control: 0010
> sudo setpci -s 0000:00:03.0 BRIDGE_CONTROL=0050
> sudo setpci -s 0000:00:03.0 BRIDGE_CONTROL=0010

Rescanning bus
> echo 1 | sudo tee /sys/bus/pci/devices/0000:00:03.0/rescan
1
0
05.03.2020, 13:08

Теги

Похожие вопросы