Articulo de referencia

Espacio de configuración PCI

El espacio de configuración PCI es la forma subyacente en que las tecnologías PCI convencional , PCI-X y PCI Express realizan la autoconfiguración de las tarjetas insertadas en ...

El espacio de configuración PCI es la forma subyacente en que las tecnologías PCI convencional , PCI-X y PCI Express realizan la autoconfiguración de las tarjetas insertadas en su bus.

Descripción general

Los dispositivos PCI cuentan con un conjunto de registros denominado espacio de configuración , y PCI Express introduce un espacio de configuración extendido para estos dispositivos. Los registros del espacio de configuración se asignan a ubicaciones de memoria. Los controladores de dispositivo y el software de diagnóstico deben tener acceso al espacio de configuración, y los sistemas operativos suelen utilizar API para permitir dicho acceso. Cuando el sistema operativo no dispone de métodos de acceso definidos ni de API para las solicitudes al espacio de configuración asignado a memoria, el controlador o el software de diagnóstico deben acceder a él de forma compatible con las reglas de acceso subyacentes del sistema operativo. En todos los sistemas, se recomienda que los controladores de dispositivo utilicen las API proporcionadas por el sistema operativo para acceder al espacio de configuración del dispositivo.

Información técnica

Una de las principales mejoras del bus local PCI con respecto a otras arquitecturas de E/S fue su mecanismo de configuración. Además de los espacios normales de memoria mapeada y puertos de E/S, cada función de dispositivo en el bus tiene un espacio de configuración de 256 bytes, direccionable conociendo el bus PCI de ocho bits , el dispositivo de cinco bits y los números de función de tres bits para el dispositivo (comúnmente denominado BDF o B/D/F , abreviatura de bus/dispositivo/función ). Esto permite hasta 256 buses, cada uno con hasta 32 dispositivos, cada uno compatible con ocho funciones. Una sola tarjeta de expansión PCI puede responder como un dispositivo y debe implementar al menos la función número cero. Los primeros 64 bytes del espacio de configuración están estandarizados; el resto está disponible para fines definidos por el fabricante. Algunos ordenadores de gama alta admiten más de un dominio PCI (o segmento PCI); cada segmento PCI admite hasta 256 buses. Un segmento PCI puede denominarse puente raíz PCI .

Para permitir la estandarización de más partes del espacio de configuración sin generar conflictos con los usos existentes, se puede definir una lista de capacidades dentro de los 192 bytes restantes del espacio de configuración PCI. Cada capacidad tiene un byte que la describe y otro que apunta a la siguiente. El número de bytes adicionales depende del ID de la capacidad. Si se utilizan capacidades, se activa un bit en el registro de estado y se proporciona un puntero a la primera capacidad de una lista enlazada en el registro de punteros Cap. definido en los registros estandarizados.

PCI-X 2.0 y PCI Express introdujeron un espacio de configuración extendido de hasta 4096 bytes. La única parte estandarizada de este espacio son los cuatro primeros bytes ( 0x100) , que marcan el inicio de una lista de capacidades extendidas. Estas capacidades son muy similares a las capacidades normales, con la diferencia de que pueden hacer referencia a cualquier byte del espacio de configuración extendido (utilizando 12 bits en lugar de ocho), tienen un número de versión de cuatro bits y un ID de capacidad de 16 bits. Los ID de capacidad extendida se solapan con los ID de capacidad normales, pero no hay posibilidad de confusión, ya que se encuentran en listas separadas.

Registros estandarizados

Registros estándar del encabezado del espacio de configuración PCI Tipo 0 (sin puente)

Los registros ID de dispositivo (DID) e ID de proveedor (VID) identifican el dispositivo (como un circuito integrado ) y se conocen comúnmente como ID de PCI . El ID de proveedor de 16 bits es asignado por PCI-SIG . El ID de dispositivo de 16 bits es asignado posteriormente por el proveedor. Existe un proyecto inactivo para recopilar todos los ID de proveedor y de dispositivo conocidos. (Consulte los enlaces externos a continuación).

El registro Estado se utiliza para informar qué características son compatibles y si se han producido ciertos tipos de errores. El registro Comando contiene una máscara de bits de características que se pueden habilitar y deshabilitar individualmente. Los valores del registro Tipo de encabezado determinan los diferentes diseños de los 48 bytes restantes (64   16) del encabezado, según la función del dispositivo. Es decir, encabezados de tipo 1 para complejos raíz , conmutadores y puentes. Luego, tipo 0 para puntos finales. El registro Tamaño de línea de caché debe programarse antes de que se le indique al dispositivo que puede usar la transacción de escritura e invalidación de memoria. Normalmente, esto debe coincidir con el tamaño de la línea de caché de la CPU , pero la configuración correcta depende del sistema. Este registro no se aplica a PCI Express.

El ID de subsistema (SSID) y el ID de proveedor de subsistema (SVID) diferencian modelos específicos (como tarjetas de expansión). Mientras que el ID de proveedor corresponde al fabricante del chipset , el ID de proveedor de subsistema corresponde al fabricante de la tarjeta. El ID de subsistema lo asigna el proveedor del subsistema, y ​​el ID de dispositivo lo asigna el fabricante del chipset. Por ejemplo, en el caso de las tarjetas de red inalámbricas , el fabricante del chip podría ser Intel , Broadcom o Atheros , y el fabricante de la tarjeta podría ser Netgear o Hewlett-Packard . Generalmente, la combinación ID de proveedor - ID de dispositivo indica qué controlador debe cargar el host para gestionar el dispositivo, ya que todas las tarjetas con la misma combinación VID:DID pueden ser gestionadas por el mismo controlador. La combinación ID de proveedor de subsistema - ID de subsistema identifica la tarjeta, información que el controlador puede utilizar para aplicar un pequeño cambio específico de la tarjeta en su funcionamiento.

enumeración de autobuses

Para acceder a un dispositivo PCI, este debe habilitarse asignándolo al espacio de direcciones del puerto de E/S del sistema o al espacio de direcciones asignado a la memoria . El firmware del sistema (por ejemplo, la BIOS ) o el sistema operativo programan los Registros de Dirección Base (comúnmente llamados BAR) para informar al dispositivo sobre la configuración de sus recursos mediante comandos de configuración enviados al controlador PCI. Dado que todos los dispositivos PCI se encuentran en estado inactivo al reiniciar el sistema, no tendrán direcciones asignadas que permitan la comunicación entre el sistema operativo y los controladores de dispositivos . La BIOS o el sistema operativo asignan geográficamente las direcciones a los dispositivos PCI (por ejemplo, la primera ranura PCI, la segunda ranura PCI, la tercera ranura PCI o los dispositivos PCI integrados, etc., en la placa base ) a través del controlador PCI mediante las señales IDSEL (Initialization Device Select) por ranura o por dispositivo.

Al encender el ordenador, el BIOS o el sistema operativo deben enumerar los buses PCI y los dispositivos . La enumeración de buses se realiza intentando acceder a los registros del espacio de configuración PCI para cada bus, dispositivo y función. Cabe destacar que el número de dispositivo, distinto de VID y DID, es simplemente el número secuencial de un dispositivo en ese bus. Además, tras detectar un nuevo puente, se define un nuevo número de bus y la enumeración de dispositivos se reinicia en el dispositivo número cero.

Si no se recibe respuesta de la función n.° 0 del dispositivo, el maestro del bus realiza una interrupción y devuelve un valor con todos los bits activados ( FFFFFFFF en hexadecimal ), que es un valor VID/DID no válido. De esta forma, la BIOS o el sistema operativo pueden determinar que la combinación especificada de bus/número de dispositivo/función (B/D/F) no está presente. Por lo tanto, cuando una lectura a una función con ID cero para un bus/dispositivo determinado provoca que el maestro (iniciador) interrumpa la operación, se debe presumir que no existe ningún dispositivo en funcionamiento en ese bus, ya que los dispositivos deben implementar la función n.° cero. En este caso, las lecturas a las funciones restantes (1-7 ) no son necesarias, ya que tampoco existirán.

Cuando se realiza una lectura exitosa a una combinación B/D/F específica para el registro de ID del proveedor, el firmware del sistema o el sistema operativo sabe que existe; escribe todos unos en sus BAR y lee el tamaño de memoria solicitado por el dispositivo en formato codificado. El diseño implica que todos los tamaños de espacio de direcciones son potencias de dos y están alineados de forma natural. [ 1 ]

En este punto, la BIOS o el sistema operativo programará las direcciones de memoria asignadas y las direcciones de los puertos de E/S en los registros de configuración BAR del dispositivo. Estas direcciones permanecen válidas mientras el sistema esté encendido. Al apagar el sistema, se pierden estos ajustes y el procedimiento se repite la próxima vez que se encienda. La BIOS o el sistema operativo también programará otros registros del espacio de configuración PCI para cada dispositivo PCI, por ejemplo, la solicitud de interrupción . Dado que todo este proceso está completamente automatizado, el usuario no tiene que configurar manualmente el hardware recién añadido modificando los interruptores DIP de las tarjetas. Este descubrimiento automático de dispositivos y la asignación del espacio de direcciones es la base de la funcionalidad Plug and Play .

Si se encuentra un puente PCI a PCI, el sistema debe asignar al bus PCI secundario, más allá del puente, un número de bus distinto de cero y, a continuación, enumerar los dispositivos conectados a dicho bus secundario. Si se encuentran más puentes PCI, el proceso de detección continúa de forma recursiva hasta que se hayan explorado todas las combinaciones posibles de dominio, bus y dispositivo.

Cada función de dispositivo PCI que no sea de puente puede implementar hasta 6 BAR, cada una de las cuales puede responder a diferentes direcciones en el puerto de E/S y el espacio de direcciones mapeado en memoria. Cada BAR describe una región [ 2 ] [ 1 ] que tiene un tamaño entre 16 bytes y 2 gigabytes, ubicada por debajo del límite de espacio de direcciones de 4 gigabytes. Si una plataforma admite la opción "Above 4G" en el firmware del sistema, se pueden usar BAR de 64 bits.

Un dispositivo PCI también puede tener una ROM de opciones .

BARRA redimensionable

La BAR redimensionable (también conocida como BAR redimensionable , AMD Smart Access Memory (SAM) o ASRock Clever Access Memory (CAM) [ 3 ] ) es una capacidad que un dispositivo PCIe puede usar para negociar un tamaño de BAR mayor. [ 4 ] Clásicamente, las BAR estaban limitadas a un tamaño de 256 MB, pero las tarjetas gráficas modernas tienen búferes de fotogramas mucho mayores. Esta discrepancia generaba ineficiencias cuando la CPU accedía al búfer de fotogramas. La BAR redimensionable permite que la CPU acceda a todo el búfer de fotogramas a la vez, mejorando así el rendimiento. [ 5 ]

Implementación de hardware

Al realizar un acceso al espacio de configuración , un dispositivo PCI no decodifica la dirección para determinar si debe responder, sino que examina la señal de selección de dispositivo de inicialización (IDSEL). Existe un método de activación único para cada señal IDSEL en todo el sistema. El dispositivo PCI solo necesita decodificar los 11 bits de menor orden de las señales de dirección/datos del espacio de direcciones (AD[10] a AD[0]), y puede ignorar la decodificación de las 21 señales A/D de orden superior (AD[31] a AD[11]) porque la implementación del acceso al espacio de configuración tiene el pin IDSEL de cada ranura conectado a una línea de dirección/datos de orden superior diferente (AD[11] a AD[31]). La señal IDSEL es un pin diferente para cada dispositivo/adaptador/ranura PCI.

Para configurar la tarjeta en la ranura n , el puente del bus PCI realiza un ciclo de acceso al espacio de configuración con el registro del dispositivo PCI que se va a direccionar en las líneas AD[7:2] (AD[1:0] siempre son cero ya que los registros son palabras dobles (32 bits)), y el número de función PCI especificado en los bits AD[10:8], con todos los bits de orden superior a cero excepto AD[ n +11] que se utiliza como la señal IDSEL en una ranura/dispositivo determinado.

Para reducir la carga eléctrica en el bus AD[], crítico en cuanto a temporización (y, por lo tanto, sensible a la carga eléctrica), la señal IDSEL en el conector de la ranura PCI se conecta normalmente a su pin AD[ n +11] asignado a través de una resistencia. Esto provoca que la señal IDSEL del PCI alcance su estado activo más lentamente que otras señales del bus PCI (debido a la constante de tiempo RC tanto de la resistencia como de la capacitancia de entrada del pin IDSEL). De este modo, los accesos al espacio de configuración se realizan más lentamente para dar tiempo a que la señal IDSEL alcance un nivel válido.

El escaneo del bus se realiza en la plataforma Intel mediante el acceso a dos puertos estandarizados. Estos puertos son el puerto de E/S de Dirección del Espacio de Configuración ( 0xCF8 ) y el puerto de E/S de Datos del Espacio de Configuración ( 0xCFC ). El valor escrito en el puerto de E/S de Dirección del Espacio de Configuración se crea combinando los valores B/D/F y el valor de la dirección de los registros en una palabra de 32 bits.

Implementación de software

Las lecturas y escrituras de configuración se pueden iniciar desde la CPU de dos maneras: un método heredado a través de las direcciones de E/S 0xCF8 y 0xCFC , y otro llamado configuración mapeada en memoria. [ 6 ]

El método heredado estaba presente en el PCI original y se denomina Mecanismo de Acceso a la Configuración (CAM). Permite acceder indirectamente a 256 bytes del espacio de direcciones de un dispositivo mediante dos registros de 32 bits llamados PCI CONFIG_ADDRESS y PCI CONFIG_DATA. Estos registros se encuentran en las direcciones 0xCF8 y 0xCFC en el espacio de direcciones de E/S x86 . [ 7 ] Por ejemplo, un controlador de software (firmware, núcleo del sistema operativo o controlador del núcleo) puede usar estos registros para configurar un dispositivo PCI escribiendo la dirección del registro del dispositivo en CONFIG_ADDRESS y colocando los datos que se deben escribir en el dispositivo en CONFIG_DATA. Dado que este proceso requiere escribir en un registro para escribir en el registro del dispositivo, se denomina "indirección".

El formato de CONFIG_ADDRESS es el siguiente:

0x80000000 | bus << 16 | dispositivo << 11 | función << 8 | desplazamiento

Como se explicó anteriormente, el direccionamiento de un dispositivo mediante Bus, Dispositivo y Función (BDF) también se conoce como "direccionamiento geográfico de un dispositivo". Consulte arch/x86/pci/early.cel código del kernel de Linux para ver un ejemplo de código que utiliza direccionamiento geográfico. [ 8 ]

Cuando se utiliza un espacio de configuración extendido en algunas CPU AMD, los bits adicionales 11:8 del desplazamiento se escriben en los bits 27:24 del registro CONFIG_ADDRESS: [ 9 ] [ 10 ]

0x80000000 | ( offset & 0xf00 ) << 16 | bus << 16 | dispositivo << 11 | función << 8 | ( offset & 0xff )

El segundo método se creó para PCI Express. Se denomina Mecanismo de Acceso a la Configuración Mejorado (ECAM). Extiende el espacio de configuración de cada función a 4  KiB, con los 256 bytes inferiores superponiéndose al espacio de configuración original (heredado) de PCI. Esta sección del espacio direccionable se "reserva" para que los accesos desde la CPU no se dirijan a la memoria, sino a un dispositivo específico en la estructura PCI Express. Durante la inicialización del sistema, la BIOS determina la dirección base de esta región de direcciones reservada y la comunica al complejo raíz y al sistema operativo.

Cada función tiene su propio  espacio de 4 KiB y la información de cada función es accesible a través de una matriz simple, dev[bus][device][function]de modo que se "roban" 256  MiB de espacio físico contiguo para este uso (256 buses × 32 dispositivos × 8 funciones × 4  KiB = 256  MiB). La dirección física base de esta matriz no está especificada. Por ejemplo, en los sistemas x86 modernos, las tablas ACPI contienen la información necesaria. [ 11 ]

Véase también

Referencias

  1. 1 2 "Registros de direcciones base" . PCI . osdev.org. 2013-12-24 . Recuperado el 2014-04-17 .
  2. "Métodos de configuración de PCI" . read.seas.harvard.edu. 22/11/2011 . Consultado el 27/09/2021 .
  3. Raevenlord (04/12/2020). "ASRock implementa CAM (Clever Access Memory) en la placa base Intel Z490 Taichi" . TechPowerUp . Consultado el 26/03/2024 .
  4. "¿Qué es la BAR redimensionable y cómo la habilito?" . intel.com . Intel Corporation. 18 de abril de 2023 . Consultado el 26 de marzo de 2024 .
  5. Archer, James (2021-12-07). "¿Qué es Resizable BAR y deberías usarlo?" . Rock Paper Shotgun . Recuperado el 26-03-2024 .
  6. "Acceso a los registros de configuración de PCI Express* mediante chipsets Intel" (PDF) . Intel Corporation. Archivado del original (PDF) el 27 de septiembre de 2018. Consultado el 27 de septiembre de 2018 .
  7. "Mecanismo de configuración PCI n.° 1" . osdev.org . 1 de enero de 2015. Consultado el 1 de enero de 2015 .
  8. "kernel/git/stable/linux-stable.git: arch/x86/pci/early.c (árbol estable del kernel de Linux, versión 3.12.7)" . kernel.org . Consultado el 10 de enero de 2014 .
  9. "kernel/git/stable/linux-stable.git: arch/x86/pci/direct.c (árbol estable del kernel de Linux, versión 3.12.7)" . kernel.org . Consultado el 11 de septiembre de 2017 .
  10. Richter, Robert. "x86: agregar acceso al espacio de configuración extendido PCI para AMD Barcelona" . kernel.org . Consultado el 26 de septiembre de 2018 .
  11. "XSDT - OSDev Wiki" . Consultado el 30 de abril de 2017 .
  • Listas de proveedores y dispositivos PCI
  • El repositorio de identificadores PCI , un proyecto para recopilar todos los identificadores conocidos.
  • Descripción del uso del puerto de E/S para la configuración PCI
  • Archivo de cabecera del kernel de Linux con definiciones de registros del espacio de configuración
Obtenido de " https://en.wikipedia.org/w/index.php?title=PCI_configuration_space&oldid=1360330303#DEVICE-FUNCTIONS "