Portar Linux MMU al SoC ESP32-S31 de Espressif: estado del proyecto

Fuentes: Porting MMU Linux to the ESP32-S31 SoC: project status

El repositorio GrieferPig/esp32-s31-linux documenta un intento de portar Linux con MMU a la arquitectura del SoC ESP32-S31 de Espressif, basada en el conjunto de instrucciones RISC-V RV32IMAFBCNSUX. El trabajo se ha realizado sobre la placa ESP32-S31-WROOM-3 E1H16R16V y se apoya en Linux 6.12, la última versión que mantenía soporte XIP en RISC-V antes de su eliminación del núcleo principal, ya que el sistema solo dispone de 16 MB de PSRAM y se ha modificado OpenSBI para ejecutarse directamente desde la flash y la SRAM interna.

El desarrollador tuvo que inferir el comportamiento del chip antes de que existiera el manual técnico (TRM) oficial, por lo que varias decisiones se basan en la documentación del ESP32-P4 y en pruebas de sondeo de CSRs. La mayor dificultad procede del controlador de interrupciones: el ESP32-S31 usa CLIC y CLINT en lugar del PLIC habitual de Linux, y se ha tenido que escribir un controlador CLIC propio adaptado del trabajo de disdi en linux-on-litex-vexriscv. Además, el modo supervisor del chip no es estándar, hay registros CSR no documentados (como sclicbase) y la SCLIC exige habilitar escrituras en mcliccfg.NMBITS para usar interrupciones en modo S.

El estado del soporte es desigual: el kernel arranca y se ejecuta con MMU sv32, tal como muestran los registros de cpuinfo, uname y los datos de memoria (alrededor de 15 MB disponibles). El benchmark CoreMark arroja 1058,93 iteraciones por segundo. Casi todos los periféricos (GPIO, UART, I2C, SPI, Ethernet, SDMMC, USB, DMA, caché, watchdog, timers y reloj) están sin probar o sin implementar, y el subsistema LP y PMP/APM están pendientes. SMP y USB Serial/JTAG quedan descartados al estar reservados para FreeRTOS.