stringtranslate.com

Espacio de configuración PCI

El espacio de configuración PCI es la forma subyacente en que los PCI convencionales , PCI-X y PCI Express realizan la configuración automática de las tarjetas insertadas en su bus.

Descripción general

Los dispositivos PCI tienen un conjunto de registros denominado espacio de configuración y PCI Express introduce un espacio de configuración extendido para los dispositivos. Los registros del espacio de configuración se asignan a ubicaciones de memoria. Los controladores de dispositivos y el software de diagnóstico deben tener acceso al espacio de configuración, y los sistemas operativos suelen utilizar API para permitir el acceso al espacio de configuración del dispositivo. Cuando el sistema operativo no tiene métodos de acceso definidos o API para solicitudes de espacio de configuración asignadas en memoria, el controlador o el software de diagnóstico tiene la carga de acceder al espacio de configuración de una manera que sea compatible con las reglas de acceso subyacentes del sistema operativo. En todos los sistemas, se recomienda a los controladores de dispositivos que 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 que tuvo el bus local PCI sobre otras arquitecturas de E/S fue su mecanismo de configuración. Además de los espacios normales de memoria asignada y de puertos de E/S, cada función de dispositivo en el bus tiene un espacio de configuración , que tiene 256 bytes de longitud, direccionable conociendo el bus PCI de ocho bits , el dispositivo de cinco bits y el bus PCI de tres bits. Números de función de bits para el dispositivo (comúnmente denominado BDF o B/D/F , abreviado de bus/device/function ). Esto permite hasta 256 buses, cada uno con hasta 32 dispositivos, cada uno con ocho funciones. Una única 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 proveedor. Algunas computadoras de alta gama admiten más de un dominio PCI (o segmento PCI); cada dominio PCI admite hasta 256 buses.

Para permitir que se estandaricen más partes del espacio de configuración sin entrar en conflicto con los usos existentes, puede haber una lista de capacidades definidas dentro de los 192 bytes restantes del espacio de configuración PCI. Cada capacidad tiene un byte que describe qué capacidad es y un byte para señalar la siguiente capacidad. La cantidad de bytes adicionales depende del ID de capacidad. Si se utilizan capacidades, se establece un bit en el registro de Estado y en el Cap se proporciona un puntero al primero de una lista vinculada de capacidades . registro puntero definido en los Registros Estandarizados.

PCI-X 2.0 y PCI Express introdujeron un espacio de configuración ampliado, hasta 4096 bytes. La única parte estandarizada del espacio de configuración extendida son los primeros cuatro bytes en 0x100 , que son el comienzo de una lista de capacidades extendidas. Las capacidades extendidas son muy parecidas a las capacidades normales excepto que pueden hacer referencia a cualquier byte en el espacio de configuración extendida (usando 12 bits en lugar de ocho), tienen un número de versión de cuatro bits y una ID de capacidad de 16 bits. Los ID de capacidad extendida se superponen con los ID de capacidad normal, pero no hay posibilidad de confusión ya que están 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) y ID de proveedor (VID) identifican el dispositivo (como un IC ) y comúnmente se denominan PCI ID . El ID de proveedor de 16 bits lo asigna PCI-SIG . Luego, el proveedor asigna la ID del dispositivo de 16 bits. Hay un proyecto inactivo para recopilar todos los ID de proveedores y dispositivos conocidos. (Consulte los enlaces externos a continuación).

El registro de estado se utiliza para informar qué funciones son compatibles y si se han producido ciertos tipos de errores. El registro de comando contiene una máscara de bits de funciones que se pueden habilitar y deshabilitar individualmente. Los valores del registro de 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 complejo raíz, conmutadores y puentes. Luego escriba 0 para los puntos finales. El registro de 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 debería 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 del subsistema (SSID) y el ID del proveedor del subsistema (SVID) diferencian el modelo específico (como una tarjeta complementaria). Mientras que el ID del proveedor es el del fabricante del chipset , el ID del proveedor del subsistema es el del fabricante de la tarjeta. La ID del subsistema la asigna el proveedor del subsistema, la ID del dispositivo la asigna el fabricante del chipset. Por ejemplo, en el caso de las tarjetas de red inalámbrica , 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 e ID de dispositivo designa qué controlador debe cargar el host para manejar el dispositivo, ya que todas las tarjetas con la misma combinación VID:DID pueden ser manejadas por el mismo controlador. La combinación ID del proveedor del subsistema e ID del subsistema identifica la tarjeta, que es el tipo de información que el conductor puede utilizar para aplicar un cambio menor específico de la tarjeta en su funcionamiento.

Enumeración de autobuses

Para direccionar un dispositivo PCI, se debe habilitar asignándolo al espacio de direcciones del puerto de E/S del sistema o al espacio de direcciones asignado en memoria . El firmware del sistema (por ejemplo, BIOS ) o el sistema operativo programan los registros de direcciones base (comúnmente llamados BAR) para informar al dispositivo sobre la configuración de sus recursos escribiendo comandos de configuración en el controlador PCI. Debido a que todos los dispositivos PCI están en un estado inactivo al reiniciar el sistema, no tendrán direcciones asignadas mediante las cuales el sistema operativo o los controladores de dispositivos puedan comunicarse con ellos. El BIOS o el sistema operativo direccionan geográficamente 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 utilizando el por ranura o por dispositivo señales IDSEL (selección de dispositivo de inicialización).

Cuando la computadora está encendida, 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. Tenga en cuenta que el número de dispositivo, a diferencia de VID y DID, es simplemente el número secuencial de un dispositivo en ese bus. Además, después de que se detecta 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 #0 del dispositivo, el bus maestro realiza una cancelación y devuelve un valor de todos los bits activados ( FFFFFFFF en hexadecimal), que es un valor VID/DID no válido, por lo que el BIOS o el sistema operativo pueden saberlo. que la combinación especificada bus/número_dispositivo/función (B/D/F) no está presente. Entonces, cuando una lectura de una ID de función de cero para un bus/dispositivo determinado provoca que el maestro (iniciador) aborte, se debe suponer que no existe ningún dispositivo en funcionamiento en ese bus porque se requieren dispositivos para implementar la función número cero. En este caso, las lecturas de los números de funciones restantes (1 a 7) no son necesarias ya que tampoco existirán.

Cuando se realiza correctamente una lectura de 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 del dispositivo en forma codificada. El diseño implica que todos los tamaños del espacio de direcciones son una potencia de dos y están naturalmente alineados. [1]

En este punto, el BIOS o el sistema operativo programarán las direcciones asignadas en memoria y las direcciones de los puertos de E/S en los registros de configuración BAR del dispositivo. Estas direcciones siguen siendo válidas mientras el sistema permanezca encendido. Al apagarlo, estas configuraciones se pierden y el procedimiento se repite la próxima vez que se vuelva a encender el sistema. El BIOS o el sistema operativo también programará algunos otros registros del espacio de configuración PCI para cada dispositivo PCI, por ejemplo, solicitud de interrupción . Dado que todo este proceso está completamente automatizado, el usuario se ahorra la tarea de configurar manualmente cualquier hardware recién agregado cambiando los interruptores DIP en las propias tarjetas. Este descubrimiento automático de dispositivos y asignación de espacio de direcciones es la forma en que se implementa 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 luego enumerar los dispositivos en ese bus secundario. Si se encuentran más puentes PCI, el descubrimiento continúa de forma recursiva hasta que se analizan todas las combinaciones posibles de dominio/bus/dispositivo.

Cada función de dispositivo PCI sin 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 asignadas en memoria. Cada BAR describe una región [2] [1] que tiene un tamaño de 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 "Arriba de 4G" en el firmware del sistema, se pueden utilizar BAR de 64 bits. BAR redimensionable (también conocida como Re-Size BAR , AMD Smart Access Memory (SAM), [3] o ASRock Clever Access Memory (CAM)) [4] es una capacidad que un dispositivo PCIe puede utilizar para negociar un tamaño de BAR más grande. [5] Clásicamente, las BAR estaban limitadas a un tamaño de 256 MB, pero las tarjetas gráficas modernas tienen framebuffers mucho más grandes que eso. [3] Esta discrepancia provocó ineficiencias cuando la CPU accedía al framebuffer. [3] Resizable BAR permite que una CPU acceda a todo el framebuffer a la vez, mejorando así el rendimiento. [3]

Un dispositivo PCI también puede tener una ROM opcional .

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 mira la señal de selección de dispositivo de inicialización (IDSEL). Existe un método de activación único en todo el sistema para cada señal IDSEL. Se requiere que el dispositivo PCI decodifique solo los 11 bits de orden más bajo del espacio de direcciones (AD[10] a AD[0]) señales de dirección/datos, y puede ignorar la decodificación de las 21 señales A/D de orden superior (AD[31] a AD[11]) porque una implementación de acceso al Espacio de Configuración tiene el pin IDSEL de cada ranura conectado a una dirección de orden superior/línea de datos 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 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 ceros, excepto AD[ n +11], que se utilizan como señal IDSEL en una ranura/dispositivo determinado.

Para reducir la carga eléctrica del bus AD[] crítico en la sincronización (y, por lo tanto, sensible a la carga eléctrica), la señal IDSEL en el conector de la ranura PCI generalmente se conecta a su pin AD[ n +11] asignado a través de una resistencia. Esto hace que la señal IDSEL del PCI alcance su condición activa 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). Por lo tanto, 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 en el bus se realiza en la plataforma Intel accediendo a dos puertos estandarizados definidos. Estos puertos son el puerto de E/S de dirección de espacio de configuración ( 0xCF8 ) y el puerto de E/S de datos de 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 asignada en memoria. [6]

El método heredado estaba presente en el PCI original y se llama Mecanismo de acceso a la configuración (CAM). Permite alcanzar indirectamente 256 bytes del espacio de direcciones de un dispositivo a través de 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, kernel del sistema operativo o controlador del kernel) 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 supone que deben escribirse en el dispositivo en CONFIG_DATA. Dado que este proceso requiere escribir en un registro para poder escribir el registro del dispositivo, se denomina "indirección".

El formato de CONFIG_ADDRESS es el siguiente:

0x80000000 | autobús << 16 | dispositivo << 11 | función << 8 | compensar              

Como se explicó anteriormente, direccionar un dispositivo a través de Bus, Dispositivo y Función (BDF) también se denomina "direccionar un dispositivo geográficamente". Consulte arch/x86/pci/early.cel código del kernel de Linux para ver un ejemplo de código que utiliza direcciones geográficas. [8]

Cuando se utiliza 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 | ( desplazamiento y 0xf00 ) << 16 | autobús << 16 | dispositivo << 11 | función << 8 | ( desplazamiento y 0xff )                      

El segundo método fue creado para PCI Express. Se llama Mecanismo de acceso a configuración mejorado (ECAM). Extiende el espacio de configuración del dispositivo a 4 KB, y los 256 bytes inferiores se superponen al espacio de configuración original (heredado) en PCI. La sección del espacio direccionable es "robada" para que los accesos desde la CPU no vayan a la memoria sino que lleguen a un dispositivo determinado en la estructura PCI Express. Durante la inicialización del sistema, el BIOS determina la dirección base para esta región de direcciones "robadas" y la comunica al complejo raíz y al sistema operativo.

Cada dispositivo tiene su propio espacio de 4 KB y se puede acceder a la información de cada dispositivo a través de una matriz simple, dev[bus][device][function]de modo que se "roban" 256 MB de espacio físico contiguo para este uso (256 buses × 32 dispositivos × 8 funciones × 4 KB = 256 MB). No se especifica la dirección física base de esta matriz. Por ejemplo, en los sistemas x86 modernos, las tablas ACPI contienen la información necesaria. [11]

Ver también

Referencias

  1. ^ ab "Registros de direcciones base". PCI . osdev.org. 24 de diciembre de 2013 . Consultado el 17 de abril de 2014 .
  2. ^ "Métodos de configuración PCI". leer.seas.hardvard.edu. 2011-11-22 . Consultado el 27 de septiembre de 2021 .
  3. ^ abcd Archer, James (7 de diciembre de 2021). "¿Qué es Resizable BAR y debería usarlo?". Escopeta de papel piedra . Consultado el 26 de marzo de 2024 .
  4. ^ Señor Raeven (4 de diciembre de 2020). "ASRock implementa CAM (memoria de acceso inteligente) en la placa base Intel Z490 Taichi". TechPowerUp . Consultado el 26 de marzo de 2024 .
  5. ^ "¿Qué es Resizable BAR y cómo lo habilito?". intel.com . Corporación Intel. 2023-04-18 . Consultado el 26 de marzo de 2024 .
  6. ^ "Acceso a registros de configuración PCI Express* mediante chipsets Intel" (PDF) . Corporación Intel . Consultado el 27 de septiembre de 2018 .
  7. ^ "Mecanismo de configuración PCI n.º 1". osdev.org . 2015-01-01 . 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: agregue acceso al espacio de configuración extendido PCI para AMD Barcelona". kernel.org . Consultado el 26 de septiembre de 2018 .
  11. ^ "XSDT - Wiki OSDev" . Consultado el 30 de abril de 2017 .

enlaces externos