En un sistema típico basado en PCIe, los buses PCIe se enumeran durante la inicialización del sistema y los recursos se asignan a cada dispositivo de extremo PCIe. Debido a las limitaciones del algoritmo de enumeración y asignación de recursos, la topología de PCIe se corrige una vez inicializada. Esto significa que no se pueden conectar nuevos dispositivos de punto final o conmutadores al sistema.
En un sistema típico basado en PCIe, los buses PCIe se enumeran durante la inicialización del sistema y los recursos se asignan a cada dispositivo de extremo PCIe. Debido a las limitaciones del algoritmo de enumeración y asignación de recursos, la topología de PCIe se corrige una vez inicializada. Esto significa que no se pueden conectar nuevos dispositivos de punto final o conmutadores al sistema.
El controlador IDT PCIe Hot-Swap es un módulo de Linux cargable que emplea algoritmos de detección de dispositivos, asignación de recursos y enumeración patentados de IDT para conectar y desconectar dispositivos y conmutadores de punto final PCIe hacia y desde el sistema en tiempo de ejecución. Otros dispositivos PCIe en el sistema. Con referencia a la Figura 1, si los controladores GigE duales se desconectan del sistema y luego se vuelven a conectar a los puertos en un conmutador diferente, los controladores Fibre Channel y SATA/SAS no cambiarán el estado operativo. Esto contrasta con la implementación de Windows Vista de PCIe hot plug, donde los recursos deben desactivarse, volver a enumerarse y reasignarse a todos los dispositivos que comparten el mismo puerto raíz antes de que un dispositivo recién conectado pueda funcionar. Los dispositivos se pueden conectar o desconectar del sistema de cualquier forma o, de manera más adecuada, escribiendo en un archivo en el directorio /sysfs. Escribir un 0 en el archivo /sysfs/bus/pci/slots/0000:bb:dd.f/power (donde bb es el número de bus, dd es el número de dispositivo y f es el número de función del puerto descendente) lo desactiva. Esto especifica el puerto descendente, pero escribir 1 en el mismo archivo habilita el puerto descendente. Cuando un puerto descendente está deshabilitado, todos los dispositivos conectados al puerto se eliminan del kernel de Linux y se llama a la función remove() del controlador PCI para realizar cualquier limpieza necesaria. De manera similar, cuando se habilita un puerto descendente, se detectan todos los dispositivos conectados a él, se agregan al kernel de Linux y se llama a la función probe() del controlador PCI para realizar la inicialización del dispositivo. Los puertos descendentes también se pueden habilitar o deshabilitar mediante controladores de modo kernel de terceros que utilizan las API del controlador de intercambio en caliente descritas en la sección titulada Habilitación y deshabilitación de puertos descendentes.
La Figura 2 a continuación muestra un ejemplo de los tipos de dispositivos que se pueden conectar o desconectar a un sistema que ejecuta el controlador de intercambio en caliente IDT PCIe.
La clave para habilitar este tipo de capacidad de intercambio en caliente es la capacidad de asignar números de bus y recursos de memoria adicionales no utilizados a cada puerto descendente del sistema. A medida que se conectan nuevos dispositivos al sistema, estos recursos adicionales se pueden usar para ponerlos en funcionamiento sin comprometer el estado operativo de otros dispositivos que comparten el mismo puerto raíz.
Consideraciones de interconexión del sistema
La topología de interconexión del sistema IDT que se muestra en la figura 3 es un único procesador raíz complejo (RP) basado en x86 conectado a uno o más procesadores de punto final (EP) inteligentes basados en x86 a través del conmutador PCIe de interconexión del sistema IDT. Cada EP utiliza un conmutador entre dominios IDT para conectarse a un puerto descendente del conmutador PCIe de interconexión del sistema. La combinación de esta topología con el software de interconexión del sistema IDT permite la transferencia de datos de alta velocidad entre dos pares cualesquiera del sistema.
Cuando se conecta o desconecta un nuevo EP a un sistema que utiliza este tipo de topología, el controlador de intercambio en caliente trata al EP como un dispositivo de punto final normal. Sin embargo, existe una diferencia en cómo se manejan los RP cuando están conectados al sistema y cuando están desconectados del sistema.
Normalmente, cuando se desconecta un puerto ascendente de un conmutador PCIe como se muestra en la Figura 4, el conmutador emite un restablecimiento en caliente para todos los puertos descendentes. Esta función no es deseable en las topologías de interconexión del sistema, ya que los EP no podrán comunicarse entre sí cuando el RP esté desconectado del sistema. El controlador de intercambio en caliente resuelve este problema al detectar el interruptor de interconexión del sistema PCIe de IDT y deshabilitar la capacidad de generar un restablecimiento en caliente cuando el puerto ascendente está desconectado. Esta función se puede deshabilitar en el controlador de intercambio en caliente configurando el parámetro del módulo linkDownHotReset en un valor distinto de cero.
El controlador Hot Swap también tiene un algoritmo de asignación de recursos pasivo. Utilizado principalmente en topologías de interconexión de sistemas IDT, este algoritmo permite que los RP se conecten a sistemas operativos con una interrupción mínima del sistema. Normalmente, cuando un dispositivo de punto final se conecta a un complejo raíz, es el complejo raíz el que asigna los recursos de memoria al dispositivo. Con la asignación pasiva de recursos, es el complejo raíz el que asigna los recursos de memoria a los dispositivos. Para la asignación pasiva de recursos, depende del complejo raíz qué recurso de memoria usar. Esta función está habilitada de forma predeterminada en el controlador de intercambio en caliente, pero se puede deshabilitar configurando el parámetro del módulo pasivaAlubicaciónDisable.