Algunos dispositivos PCIe contienen una "ROM de expansión PCI" o una "ROM de opción PCI", que almacena programas para inicializar los dispositivos.
Ahora digamos que tengo un controlador RAID PCIe, que normalmente se usa en máquinas x86. Ahora bien, si lo conecto a una máquina ARM, ¿no se inicializaría el dispositivo PCIe? En otras palabras, ¿la mayoría de los dispositivos PCIe son específicos para x86?
Respuesta1
Estos son los problemas con las ROM de opción PCI en la arquitectura ARM:
- Una ROM opcional escrita en ensamblaje x86 no será comprensible para una CPU ARM.
- Las ROM opcionales destinadas a ser ejecutadas por BIOS de PC (dichas ROM comienzan con
0x55AA
y tienen un par de bytes para suma de comprobación e información adicional) asumirán detalles de bajo nivel de la arquitectura de PC, como hardware VGA, puertos de E/S de CPU Intel, etc. - Todo el concepto de BIOS estaba estrechamente ligado a la arquitectura de CPU y PC x86 y nunca se usó para ningún sistema ARM.
Ahora ...
UEFI, el sucesor del BIOS, está diseñado para usarse en CPU distintas a x86.
La solución a los problemas anteriores fuecódigo de bytes EFI- un código de bytes que sería interpretado por un tiempo de ejecución en UEFI, haciendo que el código sea independiente de la CPU.
Los sistemas ARM que utilizan UEFI son relativamente nuevos (Surface RT podría incluso ser el único sistema de este tipo). La mayoría de los sistemas ARM utilizan CFE, U-Boot u otro firmware de arranque que no funciona como el BIOS de una PC.
Ahora bien, si lo conecto a una máquina ARM, ¿no se inicializaría el dispositivo PCIe?
Ni siquiera tendrías ninguna posibilidad a menos que el sistema ARM estuviera usando UEFI. Si así fuera, su sistema probablemente se bloquearía al arrancar. EBC no se utiliza mucho en el firmware de la ROM de arranque.
Si bien la ROM de arranque no funcionaría, un sistema operativo que se inicie más tarde aún reconocería y podría usar el hardware sin problemas.
¿Qué hace una ROM de arranque?
El antiguo BIOS anterior a UEFI implementaba una API a través del mecanismo de interrupción x86. Su programa tendría que configurar varios registros x86 como parámetros y luego emitir una INT
instrucción x86.
INT
hace que la CPU x86 busque una dirección en una tabla y luego le transfiera el control (esto se llama direccióninterrupción de software(el hardware puede provocar que esto suceda hablando con un controlador de interrupciones también conectado a la CPU).
Antes de procesar las ROM de opción, el BIOS completa esta tabla con varias direcciones que regresan al BIOS y realizan funciones API.
MS-DOS utiliza ampliamente la tabla, confiando en el BIOS para su función original: unBasicoIentrada/ohsalidaSsistema. Otros sistemas operativos no usan llamadas al BIOS una vez que tienen el control, usan sus propios controladores y mecanismos para controlar el hardware.
Dado que esta tabla de interrupciones está en la RAM, se puede modificar. Las ROM de opción podrían "conectarse" a la tabla de interrupciones (sobrescribiendo la dirección de una interrupción específica en algo en la ROM) y hacer que las llamadas a la API del BIOS vayan primero a la ROM de opción.
Una llamada a la API del BIOS que el BIOS utiliza es 13h
: esta llamada lee un sector de un dispositivo de disco. Es necesario cargar el sector 0 de un disco duro para iniciar un sistema operativo (incluso MS-DOS).
BIOS sabe cómo comunicarse con dispositivos IDE y disquetes, pero nada más. Una tarjeta SCSI tendría una ROM opcional que se reescribiría o "engancharía" 13h
y eso haría posible arrancar desde una unidad SCSI. Si el sistema operativo es MS-DOS, entonces MS-DOS podría funcionar con la unidad SCSI, ya que se utilizaría 13h
para operaciones de disco.
El arranque en red es otra situación en la que se utilizan ROM opcionales.
Si es así, ¿es posible que los controladores puedan diseñarse para encargarse de esto?
Sí, y lo hacen. Las ROM de opción de BIOS en realidad solo admiten el inicio de un sistema operativo y, opcionalmente, un menú de configuración (el mensaje "Presione Ctrl-A para ingresar a la configuración RAID" proviene de la ROM de opción y lo ve en el punto en que el BIOS llama a su código de inicialización).
IIRC Linux se encarga de enumerar los dispositivos nuevamente y prácticamente ignorará la información del BIOS x86
Windows también hace eso. El BIOS x86 (y el modo real x86) se mantuvo tanto tiempo como lo hizo para la compatibilidad con MS-DOS.
Respuesta2
La mayoría de los dispositivos PCIe que tienen firmware integrado son específicos de x86.
El firmware integrado está diseñado para funcionar junto con un entorno compatible con Intel.
Hay dispositivos fabricados para otras arquitecturas. Principalmente GPU, almacenamiento/raid y tarjetas de red. Algunos de ellos incluso permiten actualizar el firmware para cambiar de una arquitectura a otra. Otros tienen firmware dual y pueden cambiar entre arquitecturas según sea necesario.
Incluso he visto algunos controladores raid que podrían cargarse (en el momento del arranque desde el entorno UEFI) con el firmware apropiado para la arquitectura en la que se colocaron.
La mayoría de ellos son de grado de centro de datos y muy costosos. No es algo que el usuario promedio pueda encontrar jamás en la naturaleza.
Para dispositivos sin firmware integrado (o mejor dicho: firmware integrado que no interactúa con el sistema host) es posible que funcionen en cualquier arquitectura que tenga controladores para ellos.
Respuesta3
OptionROM puede tener varias imágenes de código
La especificación UEFI tiene alguna explicación sobre cuál es el propósito de dicha ROM de imágenes múltiples:
The following is a list of the image combinations that may be placed in a PCI option
ROM. This is not an exhaustive list. Instead, it provides what will likely be the most common PCI option
ROM layouts. EFI complaint system firmware must work with all of these PCI option ROM layouts, plus
any other layouts that are possible within the PCI Firmware Specification. The format of a Legacy Option
ROM image is defined in the PCI Firmware Specification.
• Legacy Option ROM image
• IA-32 UEFI driver
• x64 UEFI driver
• AArch32 UEFI driver
• AArch64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver + AArch64 UEFI driver
• x64 UEFI driver + AArch64 UEFI driver
• Itanium Processor Family UEFI driver
• EBC Driver
In addition to combinations of UEFI drivers with different processor binding, it is also possible to include
multiple drivers of different function but the same processor binding.
(https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf)
Como puede ver, OptionROM puede tener imágenes para diferentes arquitecturas. Por ejemplo, el dispositivo PCI puede tener imágenes de código tanto para ARM como para x86.
El firmware del sistema puede analizar las estructuras de encabezado de las imágenes de código en busca del tipo de máquina correcto.
Pero aunque este campo está definido en edk2: https://github.com/tianocore/edk2/blob/0ecdcb6142037dd1cdd08660a2349960bcf0270a/MdePkg/Include/IndustryStandard/Pci22.h#L845 no parece que realmente se use: https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
Actualizar:
Mira esta guíahttps://www.workofard.com/2020/12/aarch64-option-roms-for-amd-gpus/
Explica cómo agregar el controlador AMD AARCH64 Gop como otra imagen de código a la tarjeta gráfica PCI OptionROM para que la tarjeta gráfica funcione en el momento del arranque en sistemas AArch64.