Visão geral do PCI no Linux

Visão geral do PCI no Linux
Interconexão ou PCI de componentes periféricos é o protocolo definido nos primeiros dias da computação pela Intel. Como o nome sugere, o PCI é usado para conectar diferentes periféricos da plataforma Linux. Um diagrama de blocos simples do sistema PCI ficará abaixo:

A figura acima mostra o sistema PCI, que possui 3 barramentos PCI. O barramento nº 0 é o barramento principal do sistema, pois a CPU está conectada a esse barramento; Além disso, é o ônibus onde a ponte da porta radicular ou o complexo radicular estão presentes.

Outros ônibus, eu.e., O ônibus nº 1 e 2 estão conectados ao ônibus principal com a ajuda de pontes PCI. O ônibus nº 1 está conectado ao ônibus nº 0 com a ponte 1. O ônibus nº 2 está conectado ao ônibus nº 1 com a ponte nº 2. No geral, todos os dispositivos estão conectados e vários dispositivos D1, D2, D3, etc., estão presentes em diferentes ônibus PCI. Em qualquer sistema PCI, 3 tipos de dispositivos estão presentes. Porta raiz ou dispositivo complexo, dispositivo de ponte e dispositivos de extremidade. Comparando tipos de dispositivos com nosso diagrama de exemplo, a CPU é a porta raiz ou o dispositivo complexo. Bridge 1, Bridge 2 são os dispositivos PCI Bridge. D1, D2, D3, etc., são os dispositivos de endpoint do PCI do sistema. D3 está presente no ônibus nº 2 e no ônibus nº 3, o mesmo dispositivo em diferentes barramentos.

Espaço de configuração PCI ou cabeçalho:

Todos os dispositivos PCI têm o espaço de configuração ou cabeçalho. Esta é a área de memória padrão presente em todos os dispositivos. Existem dois tipos de cabeçalho de configuração do PCI, com base nos dois tipos (ponte e endpoint) de dispositivos PCI. O espaço de configuração é conhecido como Tipo 0 para o dispositivo de terminal e o tipo 1 para pontes PCI. Os campos do cabeçalho de configuração são especificações de PCI definidas.

Tipo 0 Cabeçalho de configuração:

Cabeçalho de configuração do tipo 1:

Enumeração de barramento PCI:

Durante a inicialização do sistema, o reconhecimento de todos os dispositivos PCI no sistema é feito e é conhecido como enumeração de barramento PCI. O BIOS geralmente enumera todos os dispositivos PCI presentes em todos os ônibus e os preenche para os SYSFs. Os usuários podem acessar os detalhes dos dispositivos PCI presentes com a ajuda do utilitário LSPCI. Outra maneira é navegar pelos arquivos SYSFS dentro do /SYS/BUS/PCI/dispositivos diretório. Este diretório terá todos os dispositivos presentes e conhecidos pelo kernel Linux.

Após a enumeração do barramento PCI, todos os dispositivos recebem o número, número e número da função. Esses três componentes são suficientes para localizar qualquer dispositivo.

A enumeração de barramento PCI é realizada pelo BIOS (sistema básico de saída de entrada). O BIOS é um software de firmware específico para a máquina/plataforma e fornecido pelo próprio fabricante.

Driver complexo radicular do kernel Linux:

Em qualquer plataforma Linux baseada em X86, existe um driver PCI complexo ou subsistema PCI Linux que lê as informações preenchidas pelo BIOS e exporta as informações para o sistema de arquivos SYSFS. Todos os dispositivos PCI presentes no sistema podem ser encontrados dentro do /SYS/BUS/PCI/dispositivos diretório. ROOT Complex Driver também oferece a flexibilidade de rescindir ou redefinir os dispositivos em qualquer barramento PCI. Mesmo o resgate completo de todos os ônibus PCI pode ser feito através de/sys/barramento/pci/rescgan.

Comando para rescanar todos os dispositivos:

ECHO 1>/SYS/BUS/PCI/Rescan

Os usuários devem ter direitos de superusuário para emitir este comando.

Para qualquer dispositivo no diretório SYSFS, podemos encontrar abaixo detalhes/informações:

Sushil-MACHINE $ LS/SYS/BUS/PCI/DEVICES/0000 \: 00 \: 00.0/ -l
total 0
-RW-R-R-- 1 raiz de raiz 4096 4 de outubro 17:34 Broken_parity_status
-R-R-R-- 1 Raiz Raiz 4096 2 de outubro 18:19 Classe
-RW-R-R-- 1 Raiz Raiz 4096 2 de outubro 18:19 Config
-R-R-R-- 1 raiz da raiz 4096 4 de outubro 17:34 consistente_dma_mask_bits
-RW-R-R-- 1 raiz 4096 4 de outubro 17:34 D3Cold_allowed
-R-R-R-- 1 Raiz Raiz 4096 2 18:19 Dispositivo
-R-R-R-- 1 raiz de raiz 4096 4 de outubro 17:34 DMA_MASK_BITS
LRWXRWXRWX 1 RAOTE 0 OUT 2 19:18 Driver ->… /… /… /BUS /PCI /Drivers /Agpgart -Intel
-RW-R-R-- 1 Raiz Raiz 4096 4 de outubro 17:34 Driver_override
-RW-R-R-- 1 Raiz de raiz 4096 4 de outubro 17:34 Ativar
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 IRQ
-R-R-R-- 1 Raiz Raiz 4096 4 de outubro 17:34 Local_cpulist
-R-R-R-- 1 Raiz de raiz 4096 4 de outubro 17:34 Local_cpus
-R-R-R-- 1 Raiz Raiz 4096 2 19:18 Modalias
-RW-R-R-- 1 raiz da raiz 4096 4 de outubro 17:34 msi_bus
-RW-R-R-- 1 raiz da raiz 4096 2 19:18 NUMA_NODE
drwxr-xr-x 2 raiz
--w-w ---- 1 raiz raiz 4096 4 17:34 Remover
--W-W ---- 1 Raiz Raiz 4096 4 de outubro 17:34 Rescan
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 Recurso
-R-R-R-- 1 raiz de raiz 4096 4 de outubro 17:34 Revisão
LRWXRWXRWX 1 RAOTE RAOT 0 4 de outubro 17:34 Subsistema ->… /… /… /BUS /PCI
-R-R-R-- 1 Raiz de raiz 4096 4 de outubro 17:34 Subsystem_Device
-R-R-R-- 1 raiz 4096 4 de outubro 17:34 subsystem_vendor
-RW-R-R-- 1 raiz de raiz 4096 4 de outubro 17:34 uEvent
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 Vendedor
Sushil-Machine $

Acima estão os arquivos presentes para cada dispositivo em um caminho diferente.

Leremos o conteúdo de poucos arquivos para verificar as informações:

Sushil-MACHINE $ CAT/SYS/BUS/PCI/DEVICES/0000 \: 00 \: 00.0/dispositivo
0x7190 // O arquivo de dispositivo fornece o deviceId
Sushil-MACHINE $ CAT/SYS/BUS/PCI/DEVICES/0000 \: 00 \: 00.0/fornecedor
0x8086 // O arquivo de fornecedor fornece o VendorID
Sushil-Machine $

Da mesma forma, outros arquivos fornecem outras informações.

Alguns arquivos são arquivos somente de gravação: Remover e Rescan

remover Os arquivos podem ser usados ​​para remover o dispositivo. Eco 1 para o arquivo, e você verá o LSPCI não mostrará este dispositivo.

eco 1>/sys/barramento/pci/dispositivos/0000 \: 00 \: 00.0/Remova

A recuperação do dispositivo da etapa anterior pode ser feita através do resgate do dispositivo.

Eco 1 para o Rescan Arquivo com o comando abaixo:

eco 1>/sys/barramento/pci/dispositivos/0000 \: 00 \: 00.0/Rescan

Lendo e escrevendo para o espaço de configuração:

Os comandos LSPCI e SETPCI estão disponíveis, que podem ser usados ​​para ler e escrever o espaço de configuração de qualquer dispositivo PCI. O LSPCI tem opções muito ricas para personalizar a saída conforme as necessidades do usuário. setpci é outro utilitário que também pode ser usado para acessar o espaço de configuração do dispositivo PCI.

Não discutiremos isso em detalhes aqui, pois há um artigo separado para cobrir esses dois utilitários em detalhes. Teremos apenas um exemplo dos dois comandos:

LSPCI:

Sushil -Machine $ lspci -d: 7190
00:00.0 ponte host: Intel Corporation 440bx/zx/dx - 82443bx/zx/dx ponte host (rev 01) // saída

setpci:

Sushil -Machine $ setpci -s 00:00.0 0.c
8086 // saída; Lendo uma palavra do deslocamento 0 no espaço de configuração. O ID do fornecedor é a saída.

Leitura e escrita do espaço do bar:

Pode haver um total de 6 barra de 32 bits ou 3 barra de 64 bits. O espaço de configuração do tipo 0 pode ser referido para obter os detalhes de deslocamento da barra.

Vamos dar um exemplo de dispositivo com a saída abaixo:

03:00.0 Controlador Ethernet: VMware VMXNET3 Ethernet Controller (Rev 01)
Subsistema: VMware VMXNET3 Controlador Ethernet
Slot físico: 160
Controle: E/O+ Mem+ Busmaster+ Speccycle- Memwinv- Vgasnoop- parerr-EXTEPING- serr- fastb2b- Disintx+
Status: CAP+ 66MHz- udf- fastb2b- parerr- devsel = fast> tabort- -RW-R-R-- 1 raiz da raiz 4096 4 de outubro 18:01 Driver_Override
-RW-R-R-- 1 Raiz de raiz 4096 4 de outubro 18:01 Ativar
LRWXRWXRWX 1 raiz 1 de outubro 4 18:01 firmware_node ->…/…/…/lnxsystm: 00/lnxSybus: 00/pnp0a03: 00/dispositivo: 89/dispositivo: 8a
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 IRQ
-r-r-r-- 1 raiz de raiz 4096 4 17:57 Label
-R-R-R-- 1 Raiz Raiz 4096 4 de outubro 18:01 LOCAL_CPULIST
-R-R-R-- 1 Raiz Raiz 4096 4 de outubro 18:01 Local_cpus
-R-R-R-- 1 raiz 4096 4 de outubro 18:01 max_link_speed
-R-R-R-- 1 raiz 4096 4 de outubro 18:01 max_link_width
-R-R-R-- 1 raiz de raiz 4096 4 de outubro 17:57 Modalias
-RW-R-R-- 1 raiz da raiz 4096 4 de outubro 18:01 msi_bus
DRWXR-XR-X 2 RAOTE RAOT 0 4 de outubro 18:01 MSI_IRQS
drwxr-xr-x 3 raiz raiz 0 de julho 22 06:53 rede
-RW-R-R-- 1 raiz da raiz 4096 4 de outubro 17:57 NUMA_NODE
drwxr-xr-x 2 raiz
--w-w ---- 1 raiz raiz 4096 4 de outubro 18:01 Remover
--W-W ---- 1 Raiz Raiz 4096 4 de outubro 18:01 Rescan
--W ------- 1 raiz da raiz 4096 4 de outubro 18:01 Reset
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 Recurso
-RW ------- 1 raiz raiz 4096 4 de outubro 18:01 Resource0
-RW ------- 1 raiz raiz 4096 4 de outubro 18:01 Resource1
-RW ------- 1 raiz raiz 8192 4 de outubro 18:01 Resource2
-RW ------- 1 raiz raiz 16 out 4 18:01 Resource3
-R-R-R-- 1 raiz de raiz 4096 4 de outubro 18:01 Revisão
-RW ------- 1 raiz da raiz 65536 4 de outubro 18:01 ROM
LRWXRWXRWX 1 RAOTE RAOTE 0 OUT 4 18:01 Subsistema ->… /… /… /… /… /… /… /… /… /… /… /… /… /… ”
-R-R-R-- 1 raiz 4096 4 de outubro 18:01 subsystem_device
-R-R-R-- 1 raiz 4096 4 de outubro 18:01 subsystem_vendor
-RW-R-R-- 1 Raiz de raiz 4096 4 de outubro 18:01 uEvent
-R-R-R-- 1 raiz de raiz 4096 2 de outubro 18:19 Vendedor
Sushil-Machine $

Arquivos adicionais com nomes recursos [0-3] estão presentes; Estes são os arquivos que podem ser usados ​​para acessar a memória mapeada a essas regiões. Por exemplo, para acessar o espaço 4K mapeado para a região 0, o arquivo Resource0 pode ser mapeado para o espaço do usuário com a função mmap (). Depois de mapear a região0 para o espaço do usuário, o espaço 4K pode ser acessado de acordo com a necessidade/requisito.

Conclusão:

O subsistema PCI Linux enumera e preenche os dispositivos PCI. Os dispositivos LSPCI e SETPCI podem ser usados ​​para obter as informações dos dispositivos. ROOT Complex Driver of Linux também fornece todas as informações de dispositivos PCI nos arquivos SYSFS. Há uma disposição para redefinir, rescindir e remover os dispositivos dos arquivos SYSFS. O BIOS executa o processo de enumeração, e o driver Linux analisa as informações e preenche todas as informações do dispositivo de acordo. Com essa discussão, vamos concluir este tópico.