Como redefinir / ligar a energia a um dispositivo PCIe?

14

Eu tenho um dispositivo PCIe que só funciona corretamente quando o computador está totalmente desligado e ligado novamente. Emitir um comando simples reboot ou reboot -p não parece ativar a energia da placa PCIe, o que faz com que ela não funcione após a reinicialização.

Existe uma maneira de, a partir do sistema operacional, alternar a energia para um dispositivo em um slot PCIe? Eu posso encontrá-lo em /sys/bus/pci/devices/0000*/ , mas não consigo descobrir como redefinir corretamente a placa. O poder alternativo parece ser o único caminho.

Com exceção disso, posso alterar uma configuração em algum lugar que causará um ciclo de energia completo em um comando reboot ?

Estou executando o Ubuntu 12.10 pelo caminho.

    
por zachd1_618 28.04.2013 / 00:40

3 respostas

12

Método Potencial nº 1

Acho que você pode fazer isso com esses comandos:

desativar

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

ativar

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

Onde $NUMBER é o número do slot PCI.

lspci -vv pode ajudar a identificar o dispositivo. Isto não está muito bem documentado ...

Método Potencial # 2

Me deparei com este tópico sobre U & L , semelhante problema: há algumas respostas para essa pergunta que dizem que você pode redefinir com este comando:

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

No entanto, eu lia as respostas lá! Existem condições em torno de fazer assim! Especificamente, gostaria de ler esta resposta !

Método Potencial nº 3

Existe um comando Unix, setpci , que pode fornecer um método para redefinir um dispositivo no barramento PCI.

Eu não vi nenhum exemplo específico com este comando, então você terá que procurar exemplos no google e procurar na página man . Eu pisaria levemente com este comando até que você esteja confiante em seu uso. Pelo que li sobre isso, ele está manipulando o hardware diretamente e, portanto, há sempre riscos em fazer você mesmo versus usar uma ferramenta que está expondo esse tipo de funcionalidade!

    
por 28.04.2013 / 01:18
4

remove e rescan permitirão que o kernel ligue o dispositivo PCI sem reboot :

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

onde DDDD.BB.DD.F = Domínio: Bus: Device.Function

    
por 24.11.2015 / 17:35
1

As redefinições no PCI express são um pouco complexas. Existem dois tipos principais de reinicialização - reconfiguração convencional e redefinição no nível de função. Existem também dois tipos de reconfigurações convencionais, reconfigurações fundamentais e reconfigurações não fundamentais. Veja a especificação do PCI Express para todos os detalhes.

Uma 'reinicialização a frio' é uma redefinição fundamental que ocorre depois que a energia é aplicada a um dispositivo PCIe. Parece não haver nenhuma maneira padrão de acionar uma reinicialização a frio, exceto por desligar o sistema e ligá-lo novamente. Em minhas máquinas, o diretório /sys/bus/pci/slots está vazio.

Um 'warm reset' é um reset fundamental que é disparado sem desconectar a energia do dispositivo. Parece não haver uma maneira padrão de acionar uma reinicialização a quente.

Um 'hot reset' é um reset convencional que é acionado através de um link expresso PCI. Uma reinicialização a quente é acionada quando um link é forçado para a inatividade elétrica ou pelo envio de conjuntos ordenados TS1 e TS2 com o conjunto de bits de reinicialização a quente. O software pode iniciar uma reinicialização a quente definindo e, em seguida, limpando o bit de reinicialização do barramento secundário no registro de controle da ponte na porta da ponte a montante do dispositivo no espaço de configuração da PCI.

Uma 'redefinição de nível de função' (FLR) é uma redefinição que afeta apenas uma única função de um dispositivo expresso PCI. Não deve redefinir todo o dispositivo PCIe. A implementação de redefinições no nível da função não é exigida pela especificação PCIe. Uma redefinição de nível de função é iniciada configurando o bit de redefinição de nível de função inicial no registro de controle de dispositivo da função na estrutura de capacidade expressa PCI no espaço de configuração PCI.

O Linux expõe a funcionalidade de redefinição do nível de função na forma de /sys/bus/pci/devices/$dev/reset . Escrevendo um 1 para este arquivo irá iniciar uma redefinição de nível de função na função correspondente. Observe que isso afeta apenas essa função específica do dispositivo, não o dispositivo inteiro, e os dispositivos não precisam implementar redefinições no nível da função conforme a especificação PCIe.

Não estou ciente de nenhum método 'legal' para acionar uma reinicialização a quente. No entanto, é possível usar o setpci para fazer isso:

#!/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"

Certifique-se de que todos os drivers conectados estejam descarregados antes de executar este script. Este script tentará remover o dispositivo PCIe, em seguida, comandará a porta do switch upstream para emitir uma reinicialização a quente e, em seguida, tentar verificar novamente o barramento PCIe. Esse script também foi testado apenas em dispositivos com uma única função, portanto, pode ser necessário algum retrabalho para dispositivos com várias funções.

    
por 10.10.2018 / 00:35