Descripción general de PCI en Linux

Descripción general de PCI en Linux
La interconexión de componentes periféricos o PCI es el protocolo definido en los primeros días de la computación por Intel. Como su nombre indica, PCI se usa para conectar diferentes periféricos de la plataforma Linux. Un diagrama de bloques simple del sistema PCI se verá a continuación:

La figura anterior muestra el sistema PCI, que tiene 3 buses PCI. Bus No 0 es el bus principal del sistema, ya que la CPU está conectada a ese bus; Además, es el bus donde está presente el puente del puerto raíz o el complejo de la raíz.

Otros autobuses, yo.mi., Bus no 1 y 2, están conectados al bus primario con la ayuda de puentes PCI. El autobús no 1 está conectado al bus no 0 con puente 1. El autobús no 2 está conectado al autobús no 1 con el puente no 2. En general, todos los dispositivos están conectados y varios dispositivos D1, D2, D3, etc., están presentes en diferentes buses PCI. En cualquier sistema PCI, están presentes 3 tipos de dispositivos. Puerto de raíz o dispositivo complejo, dispositivo de puente y dispositivos de punto final. Comparación de tipos de dispositivos con nuestro diagrama de ejemplo, la CPU es el puerto raíz o el dispositivo complejo. Bridge 1, Bridge 2 son los dispositivos PCI Bridge. D1, D2, D3, etc., son los dispositivos de punto final PCI del sistema. D3 está presente en Bus No 2 y Bus No 3, el mismo dispositivo en diferentes buses.

Espacio de configuración PCI o encabezado:

Todos los dispositivos PCI tienen el espacio de configuración o el encabezado. Este es el área de memoria estándar presente en todos los dispositivos. Hay dos tipos de encabezado de configuración PCI, basado en los dos tipos (puente y punto final) de dispositivos PCI. El espacio de configuración se conoce como Tipo 0 para el dispositivo de punto final y Tipo 1 para PCI Bridges. Los campos del encabezado de configuración son especificaciones de PCI definidas.

Encabezado de configuración Tipo 0:

Encabezado de configuración tipo 1:

Enumeración de bus PCI:

Durante el arranque del sistema, el reconocimiento de todos los dispositivos PCI en el sistema se realiza y se conoce como la enumeración del bus PCI. La BIOS generalmente enumera todos los dispositivos PCI presentes en todos los autobuses y los poca en el SYSFS. Los usuarios pueden acceder a los detalles de los dispositivos PCI presentes con la ayuda de la utilidad LSPCI. Otra forma es navegar por los archivos SYSFS dentro del /SYS/BUS/PCI/dispositivos directorio. Este directorio tendrá todos los dispositivos presentes y conocidos por el núcleo de Linux.

Después de la enumeración del bus PCI, todos los dispositivos obtienen el número, el número y el número de función. Estos tres componentes son suficientes para localizar cualquier dispositivo.

La enumeración del bus PCI se realiza por BIOS (sistema de salida de entrada básica). BIOS es un software de firmware específico de la máquina/plataforma y proporcionado por el propio fabricante.

Controlador de complejo de raíz del núcleo de Linux:

En cualquier plataforma Linux basada en X86, existe un controlador PCI complejo de raíz o un subsistema PCI Linux que lee la información poblada por BIOS y exporta la información al sistema de archivos SYSFS. Todos los dispositivos PCI presentes en el sistema se pueden encontrar dentro del /SYS/BUS/PCI/dispositivos directorio. El controlador de complejos de raíz también proporciona la flexibilidad para volver a ser reproductiva o restablecer los dispositivos en cualquier bus PCI. Incluso la repaneque completa de todos los buses PCI se puede hacer a través de/sys/bus/pci/rescan.

Comandar para volver a rescatar todos los dispositivos:

echo 1>/sys/bus/pCI/rescan

Los usuarios deben tener derechos de superusuario para emitir este comando.

Para cualquier dispositivo en el directorio SYSFS podemos encontrar a continuación los detalles/información:

Sushil-Machine $ ls/sys/bus/pci/dispositivos/0000 \: 00 \: 00.0/ -L
Total 0
-rw-r-r-- 1 raíz de raíz 4096 4 de octubre 17:34 broken_parity_status
-r-r-r-- 1 raíz 4096 2 de octubre 18:19 Clase
-RW-R-R-- 1 raíz de raíz 4096 2 de octubre 18:19 Configuración
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 consistente_dma_mask_bits
-rw-r-r-- 1 raíz 4096 4 de octubre 17:34 d3cold_allowed
-r-r-r-1 raíz de raíz 4096 2 de octubre 18:19 Dispositivo
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 dma_mask_bits
LRWXRWXRWX 1 raíz de raíz 0 oct
-RW-R-R-- 1 raíz de raíz 4096 4 de octubre 17:34 Driver_override
-rw-r-r-- 1 raíz de raíz 4096 4 de octubre 17:34 Habilitar
-r-r-r-- 1 raíz 4096 2 de octubre 18:19 IRQ
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 Local_cpulist
-r-r-r-- 1 raíz de raíz 4096 4 de octubre 17:34 Local_cpus
-r-r-r-1 raíz de raíz 4096 2 de octubre 19:18 Modalias
-rw-r-r-- 1 raíz raíz 4096 4 de octubre 17:34 msi_bus
-RW-R-R-- 1 raíz de raíz 4096 2 de octubre 19:18 NUMA_NODE
DRWXR-XR-X 2 Raíz Raíz 0 Oct 4 17:34 Potencia
--w-w ---- 1 raíz raíz 4096 4 de octubre 17:34 Eliminar
--W-W ---- 1 raíz de raíz 4096 4 de octubre 17:34 Vuelva a colocar
-r-r-r-1 raíz de raíz 4096 2 de octubre 18:19 Recurso
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 Revisión
LRWXRWXRWX 1 Raíz Root 0 Oct 4 17:34 Subsistema ->… /... /... /Bus /PCI
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 subsystem_device
-r-r-r-- 1 raíz 4096 4 de octubre 17:34 subsystem_vendor
-rw-r-r-- 1 raíz de raíz 4096 4 de octubre 17:34 Uevent
-r-r-r-- 1 raíz 4096 2 de octubre 18:19 Vendor
Sushil-Machine $

Arriba están los archivos presentes para cada dispositivo en una ruta diferente.

Leeremos el contenido de pocos archivos para verificar la información:

Sushil-Machine $ Cat/Sys/Bus/PCI/Devices/0000 \: 00 \: 00.0/dispositivo
0x7190 // El archivo de dispositivo proporciona el dispositivo de dispositivos
Sushil-Machine $ Cat/Sys/Bus/PCI/Devices/0000 \: 00 \: 00.0/proveedor
0x8086 // El archivo del proveedor proporciona el proveedor
Sushil-Machine $

Del mismo modo, otros archivos proporcionan otra información.

Algunos archivos son archivos de solo escritura: eliminar y volver a rescatar

eliminar Se pueden usar archivos para eliminar el dispositivo. Echo 1 al archivo, y verá que LSPCI no mostrará este dispositivo.

echo 1>/sys/bus/pCI/dispositivos/0000 \: 00 \: 00.0/eliminar

La recuperación del dispositivo del paso anterior se puede hacer reescanendo el dispositivo.

Echo 1 al reescantar Archivo con el siguiente comando:

echo 1>/sys/bus/pCI/dispositivos/0000 \: 00 \: 00.0/rescatar

Lectura y escritura en el espacio de configuración:

Los comandos LSPCI y SETPCI están disponibles, que se pueden usar para leer y escribir el espacio de configuración de cualquier dispositivo PCI. LSPCI tiene opciones muy ricas para personalizar la salida según las necesidades del usuario. SETPCI es otra utilidad que también se puede utilizar para acceder al espacio de configuración del dispositivo PCI.

No discutiremos esto en detalle aquí, ya que hay un artículo separado para cubrir ambas utilidades en detalle. Solo tendremos un ejemplo de ambos comandos:

LSPCI:

Sushil -Machine $ LSPCI -D: 7190
00:00.0 Host Bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Puente host (Rev 01) // Salida

SETPCI:

Sushil -Machine $ setpci -s 00:00.0 0.w
8086 // Salida; Leer una palabra de Offset 0 en el espacio de configuración. La identificación del proveedor es la salida.

Lectura y escritura del espacio del bar:

Puede haber un total de 6 bares de 32 bits o 3 bares de 64 bits. Se puede mencionar el espacio de configuración de Tipo 0 para obtener los detalles de compensación de la barra.

Tomemos un ejemplo de un dispositivo con la salida a continuación:

03:00.0 Controlador Ethernet: VMware VMXNET3 Controlador Ethernet (Rev 01)
Subsistema: VMWARE VMXNET3 CONTROLADOR ETHERNET
Ranura física: 160
Control: I/O+ MEM+ Busmaster+ Speccycle- MEMWINV- VGASNOOP- PARERR- PESPING- SERR- FASTB2B- Disintx+
Estado: CAP+ 66MHz- UDF- FASTB2B- PARERR- Devsel = Fast> Tabort- -RW-R-R-- 1 raíz de raíz 4096 4 de octubre 18:01 Driver_override
-RW-R-R-- 1 raíz de raíz 4096 4 de octubre 18:01 Habilitar
LRWXRWXRWX 1 raíz de raíz 0 oct
-r-r-r-- 1 raíz 4096 2 de octubre 18:19 IRQ
-r-r-r-- 1 raíz 4096 4 de octubre 17:57 Etiqueta
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 Local_cpulist
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 Local_cpus
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 max_link_speed
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 max_link_width
-r-r-r-1 raíz de raíz 4096 4 de octubre 17:57 modalias
-RW-R-R-- 1 raíz de raíz 4096 4 de octubre 18:01 MSI_BUS
DRWXR-XR-X 2 Root Root 0 Oct 4 18:01 MSI_IRQS
DRWXR-XR-X 3 Root Root 0 Jul 22 06:53 Net
-RW-R-R-- 1 raíz de raíz 4096 4 de octubre 17:57 NUMA_NODE
DRWXR-XR-X 2 Raíz Root 0 Oct 4 18:01 Potencia
--w-w ---- 1 raíz raíz 4096 4 de octubre 18:01 Eliminar
--W-W ---- 1 raíz de raíz 4096 4 de octubre 18:01 RESCAN
--w ------- 1 raíz raíz 4096 4 de octubre 18:01 Restablecer
-r-r-r-1 raíz de raíz 4096 2 de octubre 18:19 Recurso
-RW ------- 1 raíz raíz 4096 4 de octubre 18:01 recursos0
-RW ------- 1 raíz de raíz 4096 4 de octubre 18:01 Resource1
-RW ------- 1 raíz de la raíz 8192 4 de octubre 18:01 Resource2
-RW ------- 1 raíz raíz 16 4 de octubre 18:01 recursos3
-r-r-r-1 raíz de raíz 4096 4 de octubre 18:01 Revisión
-RW ------- 1 raíz de raíz 65536 4 de octubre 18:01 ROM
LRWXRWXRWX 1 Raíz Root 0 Oct 4 18:01 Subsistema -> ... /... /... /... /bus /PCI
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 Subsystem_device
-r-r-r-- 1 raíz 4096 4 de octubre 18:01 subsystem_vendor
-rw-r-r-- 1 raíz de raíz 4096 4 de octubre 18:01 Uevent
-r-r-r-- 1 raíz 4096 2 de octubre 18:19 Vendor
Sushil-Machine $

Están presentes archivos adicionales con nombres de recursos [0-3]; Estos son los archivos que se pueden usar para acceder a la memoria asignada a estas regiones. Por ejemplo, para acceder al espacio 4K asignado a la Región 0, el archivo Resource0 se puede asignar al espacio de usuario con la función MMAP (). Después de mapear la región0 al espacio del usuario, se puede acceder a un espacio 4K según la necesidad/requisito.

Conclusión:

El subsistema PCI Linux enumera y poca los dispositivos PCI. Los dispositivos LSPCI y SETPCI se pueden usar para obtener la información de los dispositivos. El controlador de complejo raíz de Linux también proporciona toda la información de dispositivos PCI en los archivos SYSFS. Hay una disposición para restablecer, volver a repitir y eliminar los dispositivos de los archivos SYSFS. El BIOS realiza el proceso de enumeración, y el controlador de Linux analiza la información y llena toda la información del dispositivo en consecuencia. Con esta gran discusión, concluyamos este tema.