Cada dispositivo PCI (cuando escribo PCI, me refiero a PCI 3.0, a diferencia de PCIe) tiene dos "rangos": rango de configuración (CFG) y rango "entrada-salida asignada en memoria" (MMIO). No profundizaré en los conceptos de espacios de direcciones y MMIO porque hará que la respuesta sea demasiado larga y complicada. Busca en Google si no te son familiares. En resumen: el rango CFG es un conjunto estándar de registros utilizados para configurar el dispositivo PCI; El rango MMIO es un conjunto habitual de registros. En otras palabras: los rangos de CFG son los mismos en todos los dispositivos PCI (puede haber pequeñas diferencias, pero la mayoría de los registros son estándar); Los rangos de MMIO son específicos del dispositivo (NOTA: mientras que los términos "rango" y "espacio" no son sinónimos, existe un consenso para llamar a un rango de MMIO del espacio MMIO del dispositivo. Los usaré indistintamente)
Ahora, el tamaño del espacio CFG es estándar: hay un límite superior en el número de registros que puede contener el espacio CFG y es el mismo para cada dispositivo PCI. Por lo general, el número real de registros en el espacio CFG es mucho más pequeño que el máximo. El tamaño del espacio MMIO, por otro lado, no es constante. ¿Por qué? Bueno, diferentes dispositivos necesitan diferente número de registros para la comunicación.
Ahora piénselo por un momento: si el tamaño del espacio MMIO no es constante, entonces debemos proporcionar la información sobre este tamaño de un dispositivo en particular a la computadora de alguna manera, ¿verdad? Una opción sería definir manualmente estos parámetros para cada dispositivo. Es la forma en que funcionaban las primeras computadoras: realmente tenía que configurar manualmente cada dispositivo que conecta a una computadora. Hoy somos flojos y deseamos la funcionalidad "plug-and-play": la computadora debe obtener esta información por sí misma en el momento en que se agregue un nuevo dispositivo.
Para permitir el "plug-and-play" en dispositivos PCI, se introdujo el concepto de MMIO Base Access Registers (MMIO BAR). Estos registros residen en el espacio CFG de cada dispositivo (creo que se permiten hasta cinco BAR por espacio CFG). El flujo es el siguiente:
- una computadora sabe que debe buscar estos registros durante un inicio
- una computadora lee los BAR para entender qué tamaños de rangos de MMIO requiere este dispositivo
- una computadora asigna los espacios MMIO del dispositivo, que se convierten en rangos MMIO estándar en el espacio MMIO global
- una computadora escribe de nuevo en MMIO BAR las direcciones asignadas para el rango MMIO de cada dispositivo en el espacio MMIO global.
Las 4 etapas anteriores se conocen como "enumeración" del dispositivo; creo que generalmente es el BIOS quien realiza la enumeración de los dispositivos durante el inicio.
A excepción de los BAR, el espacio CFG de un dispositivo contiene muchos más registros. Todas las demás escrituras en el espacio CFG, que no forman parte del flujo de "enumeración", se denominan "configuración" del dispositivo. Esto incluye configuraciones de tiempo de ejecución tales como: selección de interrupciones, vectores y direcciones MSI, estados de energía del dispositivo y muchos más.
En resumen: "enumeración" es el flujo ejecutado en el inicio que asigna rangos MMIO a todos los dispositivos. "configuración" es todas las demás escrituras en el espacio CFG del dispositivo (en general, "enumeración" se incluye en "configuración").
NOTA: esta descripción está simplificada. Hay más aspectos tanto para la "enumeración" como para la "configuración".
Offtopic:
Parece que eres nuevo en PCIe y quieres obtener una introducción rápida. Si bien su deseo es totalmente comprensible (le llevará más tiempo entender la PCIe si no hace preguntas), creo que nada puede reemplazar la especificación original. El problema es que la especificación de PCIe está escrita de manera que se asume que estás familiarizado con la PCI (al menos me pareció así), primero debes leerla. Entonces, comienza por googlear PCI 3.0 specification
y PCIe 2.1 specification
. Estos documentos son frustrantemente largos, pero se convertirán en su biblia si realmente va a trabajar con dispositivos PCIe.