¿Cómo se determina el dispositivo en la enumeración PCI? (bus / dispositivo / función)

8

Estoy confundido acerca de la enumeración de bus / dispositivo / función PCI. Al mirar la página de Wikipedia para la configuración PCI , veo que para un bus determinado, el maestro solicitará la identificación del proveedor y la identificación del dispositivo para todos los dispositivos que utilizan la función 0. Si se devuelven todos los 0xFF, entonces no hay ningún dispositivo y la enumeración continúa. Si se encuentra una ID de dispositivo y una ID de proveedor válidas, entonces hay una unidad PCI allí y se enumerará. No estoy seguro de cómo se determina el dispositivo en el bus.device.function.

Por ejemplo, supongamos que tengo una CPU con un bus PCI y un periférico PCI conectado. Entiendo que la CPU buscará en el bus 0 (por defecto) y verificará todos los números de dispositivos que buscan la función 0. ¿Cómo se determina el número de dispositivo del periférico?

símbolos_ simples
fuente

Respuestas:

6

En el marco PCI original ("PCI convencional") y también en PCI-X, los dispositivos correspondían a "ranuras", cada una con sus propios conectores conectados al mismo bus paralelo. Cada ranura tenía un pin de identificación único que se afirmó durante la enumeración. La enumeración esencialmente preguntaba (para cada espacio): "Oye, ¿hay algo presente en este espacio?" El dispositivo respondió conduciendo datos al bus en respuesta a esta señal. La falta de respuesta no significaba ningún dispositivo.

Un dispositivo también podría ser un "puente", lo que significaba que formaba un bus subordinado. Ese bus tendría una ID separada (asignada desde el flujo ascendente) y tendría su propio conjunto de ranuras que se enumeraron de forma independiente.

PCI-Express (PCIe) es totalmente diferente. PCIe no es realmente un bus, como en un recurso compartido entre dispositivos; en cambio, cada dispositivo tiene su propia conexión en serie punto a punto individual a su dispositivo ascendente (y a cualquier dispositivo descendente, y si tiene dispositivos descendentes, eso significa que también funciona como un puente). Piense en PCIe como una LAN. Cada puente es análogo a un conmutador, que tiene un montón de puertos conectados a otros dispositivos. Los otros dispositivos pueden ser dispositivos terminales, o pueden ser otros conmutadores (es decir, puentes PCIe).

PCIe fue diseñado de tal manera que su marco conceptual y direccionamiento (y, por lo tanto, el comportamiento proporcionado al software) es compatible con PCI y PCI-X. Sin embargo, la implementación es completamente diferente. En la enumeración de dispositivos, por ejemplo, dado que es punto a punto, la única pregunta que debe determinarse en cada punto de la enumeración es "¿hay algo allí?" Dado que cada dispositivo tiene su propio conjunto independiente de cables, las ID de los dispositivos están esencialmente codificadas (por lo tanto, cada puente, incluido el "complejo raíz" de nivel superior, le dice a cada dispositivo cuál será su ID de dispositivo).

En todos los casos, la parte de "función" del bus / dispositivo / función se maneja estrictamente dentro del periférico. Por ejemplo, un controlador NIC de doble puerto a menudo tendrá dos funciones, una para cada puerto. Se pueden configurar y operar de forma independiente, pero la ruta de datos desde la CPU a la función es la misma para ambos.

Gil Hamilton
fuente
1
La respuesta es un poco confusa: 1) en PCI "número de dispositivo" en realidad significa "número de ranura" (y tiene sentido), 2) usted dice "PCIe es totalmente diferente" y "ya que cada dispositivo tiene su propio conjunto de cables independientes" , las ID del dispositivo están esencialmente codificadas ", lo que significa que el conjunto de cables (= la ranura) tiene la ID codificada, por lo que es lo mismo que en PCI. Ahora, la pregunta es cuándo ocurre la "codificación". ¿Los interruptores / puentes reasignan las ID al reiniciar?
xealits
2
Si. Eso podría estar mejor redactado. El punto es que en PCI, la tarjeta está en un bus compartido pero "sabe" en qué ranura se encuentra y solo responde cuando se establece su pin específico de ranura. En PCIe, el puente tiene N diferentes conjuntos de "cables". Por lo tanto, el dispositivo puente tiene un número de ranura discreto para cada conjunto de cables. Desde el punto de vista del puente, esa ranura tiene un número definido; solo tiene que determinar si hay algo allí. La tarjeta en sí no sabe en qué ranura está. Una vez que el puente determina que hay algo allí, le dice a ese dispositivo cuál es su número de ranura.
Gil Hamilton