Espacio de configuración PCI


De Wikipedia, la enciclopedia libre
  (Redirigido desde el registro de direcciones base )
Saltar a navegación Saltar a búsqueda

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

Visión general

Los dispositivos PCI tienen un conjunto de registros denominado espacio de configuración y PCI Express introduce un espacio de configuración extendidopara dispositivos. Los registros de 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 mapeadas 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 asignados a la memoria y el puerto I / O normales, cada función de dispositivo en el bus tiene un espacio de configuración , que es de 256 bytes de largo, direccionable por conocer la PCI de ocho bits bus , el dispositivo de cinco bits, y tres números de función de bit para el dispositivo (comúnmente conocido como 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 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 propósitos definidos por el proveedor.

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. El número de bytes adicionales depende del ID de capacidad. Si se están utilizando capacidades, se establece un bit en el registro de estado y en el Cap se proporciona un puntero al primero en una lista vinculada de capacidades . registro de puntero definido en los Registros estandarizados.

PCI-X 2.0 y PCI Express introdujeron un espacio de configuración extendido, 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 capacidad extendida. Las capacidades extendidas son muy parecidas a las capacidades normales, excepto que pueden hacer referencia a cualquier byte en el 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 superponen con los ID de capacidad normales, pero no hay posibilidad de confusión ya que están en listas separadas.

Registros estandarizados

Registros estándar de encabezado de espacio de configuración PCI tipo 0 (no puente)

Los registros de ID de dispositivo (DID) e ID de proveedor (VID) identifican el dispositivo (como un IC ) y se denominan comúnmente ID de PCI . El ID de proveedor de 16 bits es asignado por PCI-SIG . A continuación, el proveedor asigna el ID del dispositivo de 16 bits. Hay un proyecto inactivo para recopilar todos los ID de dispositivos y proveedores 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 características que se pueden habilitar y deshabilitar individualmente. Los valores del registro del 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 el 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. Esto normalmente debería coincidir con el caché de la CPUtamaño de línea, 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. El proveedor del subsistema asigna el ID del subsistema desde el mismo espacio numérico que el ID del dispositivo. Por ejemplo, en el caso de las tarjetas de red inalámbrica , el fabricante del chipset podría ser Broadcom o Atheros , y el fabricante de la tarjeta podría ser Netgear o D-Link . Generalmente, la combinación de ID de proveedor e ID de dispositivo designa qué controladorel host debe cargarse para poder 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 de ID de proveedor de subsistema e ID de subsistema identifica la tarjeta, que es el tipo de información que el conductor puede usar para aplicar un cambio menor específico de la tarjeta en su operación.

Enumeración de bus

Para direccionar un dispositivo PCI, 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, los controladores de dispositivo o el sistema operativo programan los registros de direcciones base (comúnmente llamados BAR) para informar al dispositivo de su asignación de direcciones 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 por las cuales el sistema operativo o los controladores de dispositivos puedan comunicarse con ellos. El BIOS o el sistema operativo se dirigen geográficamente a las ranuras PCI (por ejemplo, la primera ranura PCI, la segunda ranura PCI o la tercera ranura PCI, etc., en elplaca base ) a través del controlador PCI utilizando las señales IDSEL (selección de dispositivo de inicialización) por ranura.

Dado que no existe un método directo para que el BIOS o el sistema operativo determine qué ranuras PCI tienen dispositivos instalados (ni para determinar qué funciones implementa el dispositivo), se deben enumerar los buses PCI . La enumeración de bus se realiza al intentar leer el registro de ID de proveedor y de ID de dispositivo (VID / DID) para cada combinación de número de bus y número de dispositivo en la función # 0 del dispositivo. Tenga en cuenta que el número de dispositivo, diferente de 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 número de dispositivo cero.

Si no se recibe respuesta de la función # 0 del dispositivo, el bus maestro realiza un aborto y devuelve un valor de todos los bits activados ( FFFFFFFF en hexadecimal), que es un valor VID / DID no válido, por lo que un controlador de dispositivo puede indicar que el bus de combinación / número_dispositivo / función especificada (B / D / F) no está presente. Entonces, cuando una lectura de un ID de función de cero para un bus / dispositivo dado hace que el maestro (iniciador) aborte, se debe suponer que no existe ningún dispositivo en funcionamiento en ese bus porque se requiere que los dispositivos implementen la función número cero. En este caso, las lecturas de los números de funciones restantes (1–7) no son necesarias ya que tampoco existirán.

Cuando se realiza una lectura de una combinación B / D / F específica para el registro de ID de proveedor, un controlador de dispositivo sabe que existe; escribe todos unos en sus BAR y vuelve a leer el tamaño de memoria solicitado del dispositivo en una forma codificada. El diseño implica que todos los tamaños de espacio de direcciones son una potencia de dos y están alineados de forma natural. [1]

En este punto, el BIOS o el sistema operativo programarán las direcciones de los puertos de E / S y asignadas en memoria en el registro de configuración BAR del dispositivo. Estas direcciones siguen siendo válidas mientras el sistema permanezca encendido. Al apagar, todos estos ajustes se pierden y el procedimiento se repite la próxima vez que se enciende el sistema. 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 escanean todas las combinaciones posibles de dominio / bus / dispositivo.

Cada función de dispositivo PCI no puente puede implementar hasta 6 BAR, cada uno de los cuales puede responder a diferentes direcciones en el puerto de E / S y en el espacio de direcciones mapeado 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 "Por encima de 4G" en el firmware del sistema, se pueden utilizar barras de 64 bits.

Un dispositivo PCI también puede tener una ROM opcional que puede contener el código del controlador o la información de configuración.

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 / línea de datos de orden superior diferente AD [11] a AD [31]. La señal IDSEL es un pin diferente para cada ranura de dispositivo / adaptador PCI.

Para configurar la tarjeta en la ranura n , el puente de bus PCI realiza un ciclo de acceso al espacio de configuración con el registro del dispositivo PCI para ser direccionado en las líneas AD [7: 2] (AD [1: 0] son ​​siempre 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 determinada.

Para reducir la carga eléctrica del bus AD [] crítico de sincronización (y por lo tanto sensible a la carga eléctrica), la señal IDSEL en el conector de 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 de PCI alcance su condición activa más lentamente que otras señales de 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 la 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 de asignación de memoria. [3]

El método heredado estaba presente en el PCI original y se denomina Mecanismo de acceso a la configuración (CAM). Permite que 256 bytes del espacio de direcciones de un dispositivo sean alcanzados indirectamente 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. [4] 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 una escritura en un registro para poder escribir el registro del dispositivo, se denomina "indirección".

El formato de CONFIG_ADDRESS es el siguiente:

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

Como se explicó anteriormente, el direccionamiento de un dispositivo a través de 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. [5]

Cuando se usa 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: [6] [7]

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

El segundo método fue creado para PCI Express. Se llama Mecanismo de acceso a la configuración mejorada (ECAM). Extiende el espacio de configuración del dispositivo a 4 KB, con los 256 bytes inferiores superpuestos al espacio de configuración original (heredado) en PCI. La sección del espacio direccionable se "roba" para que los accesos de 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 firmware determina la dirección base para esta región de dirección "robada" y la comunica al complejo raíz y al sistema operativo. Este método de comunicación es específico de la implementación y no está definido en la especificación PCI Express.

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 de dev[bus][device][function]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. [8]

Ver también

  • PCI
  • Tarjeta de PC
  • Complejo de raíces

Referencias

  1. ^ a b "Registros de direcciones base" . PCI . osdev.org. 2013-12-24 . Consultado el 17 de abril de 2014 .
  2. ^ "Métodos de configuración PCI" . cs.ucla.edu. 2011-11-22 . Consultado el 17 de abril de 2014 .
  3. ^ "Acceso a los registros de configuración de PCI Express * mediante conjuntos de chips Intel" (PDF) . Intel Corporation . Consultado el 27 de septiembre de 2018 .
  4. ^ "Mecanismo de configuración PCI n. ° 1" . osdev.org . 2015-01-01 . Consultado el 1 de enero de 2015 .
  5. ^ "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 .
  6. ^ "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 .
  7. ^ Richter, Robert. "x86: agregue acceso al espacio de configuración extendido PCI para AMD Barcelona" . kernel.org . Consultado el 26 de septiembre de 2018 .
  8. ^ "XSDT - OSDev Wiki" . Consultado el 30 de abril de 2017 .

enlaces externos

  • Listas de dispositivos y proveedores de PCI
  • El repositorio de ID de PCI , un proyecto para recopilar todas las ID conocidas
  • Descripción del uso del puerto IO para la configuración PCI
  • Archivo de encabezado del kernel de Linux con definiciones de registro de espacio de configuración
Obtenido de " https://en.wikipedia.org/w/index.php?title=PCI_configuration_space&oldid=1023723987#Bus_enumeration "