¿El hotplug PCIe realmente funciona en la práctica?

20

Me metí en una discusión en los comentarios de /security/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

La pregunta es simple. ¿Alguien tiene experiencia de conectar con éxito una tarjeta PCIe? ¿Requiere placas base y tarjetas especiales, o se supone que funciona en todo el hardware del consumidor?

pjc50
fuente
1
La respuesta debe ser doble. Tanto el hardware como el software (sus controladores) deberían admitir la conexión en caliente.
jippie
No sé si esto ayuda, pero acabo de eliminar con éxito la segunda GPU transferida de una máquina de Windows KVM sin afectar la primera GPU (la pantalla parpadeó por un segundo).
feedc0de

Respuestas:

43

Solía ​​diseñar hardware PCI-Express que requería soporte completo de conexión en caliente en hardware y software, y ciertamente es posible, pero es bastante complicado y requiere un amplio soporte de software: el hardware en realidad es bastante simple. Tuve que diseñar el hardware, luego implementar BIOS (UEFI) y soporte de kernel (Linux) para conectar dispositivos arbitrarios PCIe en fibra y cobre.

Desde el punto de vista del software, uno debe recordar que PCIe continúa con el modelo de software PCI, incluidos los conceptos de bus, dispositivo y direccionamiento de funciones. Cuando se enumera el bus PCI, se realiza como una búsqueda de amplitud: Topología del bus PCI de tldp.org

La enumeración de PCIe generalmente se realiza dos veces. Primero, su BIOS (UEFI o de otro tipo) lo hará, para descubrir quién está presente y cuánta memoria necesitan. Estos datos se pueden pasar al sistema operativo host que puede tomarlos tal cual, pero Linux y Windows a menudo también realizan su propio procedimiento de enumeración. En Linux, esto se realiza a través del subsistema PCI central, que busca en el bus, aplica cualquier peculiaridad si es necesario en función de la ID del dispositivo, y luego carga un controlador que tiene una ID coincidente en su función de sonda. Un dispositivo PCI se identifica mediante una combinación de su ID de proveedor (16 bits, por ejemplo, Intel es 0x8086) e ID de dispositivo (otros 16 bits): la fuente de Internet más común está aquí: http://pcidatabase.com / .

La parte del software personalizado aparece durante este proceso de enumeración y es que debe reservar con anticipación los números de bus PCI y los segmentos de memoria para posibles dispositivos futuros; esto a veces se denomina ' relleno de bus '. Esto evita la necesidad de volver a enumerar el bus en el futuro, lo que a menudo no se puede hacer sin interrumpir el sistema. Un dispositivo PCI tiene BAR ( registros de direcciones base) que solicitan al host la cantidad y qué tipo de memoria (memoria o espacio de E / S) necesita el dispositivo; es por eso que ya no necesita puentes como ISA :) Del mismo modo, el kernel de Linux implementa la conexión en caliente PCIe a través del pciehp conductor. Windows hace cosas diferentes en función de la versión: las versiones anteriores (creo que XP) ignoran todo lo que dice el BIOS y hace su propio sondeo. Creo que las versiones más nuevas son más respetuosas con el DSDT ACPI proporcionado por el firmware del host (BIOS / EFI) e incorporarán esa información.

¡Esto puede parecer bastante complicado y lo es! Pero recuerde que cualquier computadora portátil / dispositivo con una ranura ExpressCard (que implemente PCIe ya que puede tener ExpressCards solo USB) debe hacer esto, aunque en general el relleno es bastante simple: solo un bus. Mi antiguo hardware solía ser un conmutador PCIe que tenía otros 8 dispositivos detrás, por lo que el relleno se volvió algo más complicado.

Desde el punto de vista del hardware, es mucho más fácil. Los pines GND de la tarjeta hacen contacto primero, y colocaríamos un controlador IC de intercambio en caliente de LTC o similar en la tarjeta para secuenciar la energía una vez que se realiza la conexión. En este punto, el ASIC o FPGA a bordo comienza su secuencia de encendido y comienza a intentar entrenar su enlace PCI Express. Suponiendo que el host admite la conexión en caliente y el PCI Express SLTCAP / SLTCTRLregistro (en la especificación: Registro de capacidad de ranura PCI Express, Registro de control de ranura PCI Express. También hay un 1 y 2 para esto: bits suficientes para dividir en dos registros). para ese puerto se configuró para indicar que el puerto tiene capacidad de conexión en caliente, el software puede comenzar a enumerar el nuevo dispositivo. El registro del estado de la ranura (SLTSTA, Registro de estado de la ranura PCI Express) contiene bits que el dispositivo de destino puede establecer, lo que indica fallas de alimentación, bloqueo de liberación mecánica y, por supuesto, detección de presencia + presencia cambiada.

Los registros antes mencionados se encuentran en el 'Espacio de configuración PCI (Express)', que es una pequeña región del mapa de memoria (4K para PCIe) asignada a cada bdf potencial (bus: dispositivo: función). Los registros reales generalmente residen en el dispositivo periférico.

En el lado del host, podemos usar PRSNT1 # / PRSNT2 # como simples señales de CC que alimentan la activación de un interruptor de alimentación IC, o se ejecutan a GPIO en el chipset / PCH para provocar un IRQ y activar un SW 'oye, algo se insertó , ve a buscarlo y configúralo! rutina.

Esta es una gran cantidad de información que no responde directamente a su pregunta (consulte a continuación el resumen rápido), pero es de esperar que le brinde una mejor experiencia para comprender el proceso. Si tiene alguna pregunta sobre partes específicas del proceso, hágamelo saber en un comentario aquí o envíeme un correo electrónico y puedo discutir más y actualizar esta respuesta con esa información.

Para resumir : el dispositivo periférico debe haber sido diseñado teniendo en cuenta el soporte de conexión en caliente desde un POV de hardware. Un host / ranura correctamente diseñado también es capaz de conectarse en caliente, y en una placa base de alta gama, esperaría que fuera seguro. Sin embargo, el soporte de software para esto es otra pregunta completamente y lamentablemente está en deuda con el BIOS que su OEM le ha proporcionado.

En la práctica, utiliza esta tecnología cada vez que retira / inserta una tarjeta PCIe ExpressCard de una computadora. Además, los sistemas blade de alto rendimiento (telecomunicaciones u otros) también utilizan esta tecnología regularmente.

Comentario final: guarde el PDF que se vinculó con la especificación base, PCI-SIG generalmente cobra dólares por eso :)

Krunal Desai
fuente
2
Y a rebalse superior de la discusión de seguridad, con una FPGA relativamente barato (como un ciclón IV GX) que actúa como un dispositivo PCIe, el equipo host está hecho - la FPGA puede realizar cualquier acción que quiere DMA.
Krunal Desai
Gran explicación ¿Qué sucede cuando se intercambia una tarjeta PCIe compatible con conexión en caliente? Por un lado, el sistema operativo debe enumerar la topología PCIe nuevamente, al ver que se insertó un nuevo dispositivo (no puede predecir el tamaño de BAR / cantidad de buses que podría solicitar el dispositivo recién insertado), pero por otro lado: volver a enumerar el sistema podría no ser posible sin afectar los recursos que ya estaban asignados a los dispositivos existentes en la topología ...
so.very.tired
2
Sí, se pone complicado. Entonces, usando ExpressCard (EC) como ejemplo, una forma de hacerlo fue 'rellenar' el número de buses para admitir la adición de un dispositivo que podría ramificarse a más dispositivos; la mayoría de las BIOS con una ranura EC simple solo la rellenan con un número de bus (utilizamos esa ranura para expandirnos a muchos dispositivos PCIe). Del mismo modo, puede 'rellenar' el rango de memoria posible para la asignación allí para admitir una variedad de dispositivos con un rango de direcciones contiguas, lo mismo con las IRQ. El sistema operativo (con / sin ACPI) puede hacer lo que quiera. En realidad es "simple", pero la complejidad de las capas SW en una máquina moderna lo hace más difícil.
Krunal Desai
¿No es la enumeración PCIe realmente una búsqueda profunda primero? Los registros de base y límite están configurados de tal manera que todos los dispositivos debajo de un puerto determinado deben enumerarse antes de pasar al siguiente puerto.
alex.forencich
8

Siempre que las conexiones de monitoreo del estado de energía hayan sido expuestas al conector por el interruptor de aguas arriba, y la unidad enchufable haya expuesto estos pines y esté configurado para usarlos correctamente y (como Jippie señala) el software puede detectar el evento de conexión en caliente y responder adecuadamente, el La respuesta es sí.

En general, esta capacidad se utiliza principalmente en granjas de servidores y centros de datos para conectar discos PCIe en caliente, entre otras cosas; No estoy seguro de que el equipo de consumo sea totalmente compatible con hotplug (es, según tengo entendido, opcional en la especificación).

Tenga en cuenta que proporcionar el hardware necesario para admitir hotplug cuesta dinero (aunque la mayoría está dentro del punto final PCIe, aún debe configurarse, generalmente a través de un eeprom), por lo general no se ofrecerá en un mercado sensible al precio.

Tenga en cuenta que la actualización dinámica del mapa de direcciones PCI agrega una complejidad significativa al controlador PCI (e); si se inserta un nuevo dispositivo, debe asignarse al bus en el que vive, con las nuevas traducciones de direcciones asociadas, pero si se retira un dispositivo y luego se reemplaza con algo diferente , hace que el seguimiento de las direcciones de espacio PCI sea bastante complejo .

Sin esta complejidad, el subsistema PCI se escanea una vez (al reiniciar el sistema) y permanece estático; No se requiere más esfuerzo.

Aquí está la especificación básica PCIe v3.0 , página 514, sección 6.7 sobre soporte de conexión en caliente. Aquí se puede ver un ejemplo de una tarjeta PCIe que admite hot-plug, cortesía de iocrest . Se puede ver claramente que la traza del conector más corto se enruta: Tarjeta controladora PCI-e SATA III (6G) de 2 puertos, chipset Marvell 88SE9120

Sin embargo, en esta tarjeta Axxon , la traza más corta se puede ver claramente enrutada a la adyacente. Solo a nivel físico, esta tarjeta no puede admitir conexión en caliente: Tarjeta de E / S de puerto serie MAP / 950 1 RS232 para PCI Express (PCIe)

Peter Smith
fuente
2

Se supone que funciona en todo el hardware compatible con PCIe, si una buena pregunta es si todo el hardware del consumidor es realmente compatible, ya que no conozco las especificaciones de PCIe para conocer los requisitos de prueba e incluso entonces, ¿todos los minoristas verifican la validez del reclamo? Creo que casi nadie lo hace.

Al igual que todos los estándares de seguridad. La mitad (<-hyperbole?) De las etiquetas EE con las que tenemos puede reclamar compatibilidad, sin tener que tener todo lo que hace probar. Dado que las cosas de hotplug no ponen en peligro la vida, no puedo imaginar que las personas sean más estrictas al respecto.

Yo, por mi parte, nunca lo he probado y, dado que mi computadora portátil Clevo expulsó el escritorio por completo de mi casa, no estoy dispuesto a probarlo, ya que el módulo GPU de mi computadora portátil no tiene capacidad de conexión en caliente y es demasiado costoso sin ser Dave Jones y obtener $$$ por el video de una GPU en explosión.

Asmyldof
fuente
1

Si, funciona. Pude hacer que funcione para conectar en caliente una tarjeta de línea de chasis del enrutador (que contiene más de 10 dispositivos PCIe). El chasis tiene 16 tarjetas conectables en caliente. Cualquiera de las tarjetas puede conectarse o desconectarse aleatoriamente en tiempo de ejecución sin afectar las operaciones de tráfico en las otras tarjetas.

La complejidad para que funcione depende del entorno de la CPU. En una CPU integrada, el trabajo es simplemente configurar el mapa de recursos estáticos y manejar los eventos de cambio de conexión conectando y desconectando dispositivos PCI. En x86, está mucho más involucrado debido a la complejidad en el manejo de errores y las interacciones BIOS / OS.

xzhu70
fuente