El problema

Durante años he tenido mi monitor LG 29UB67 ultrawide (2560x1080@75Hz) conectado a un switch KVM HDMI sin ningún problema. A través de él alternaba entre tres equipos: el portátil del trabajo, un miniPC y mi portátil personal. Todo funcionaba perfectamente... hasta que llegó una actualización de Arch Linux.

Monitor LG 29UB67 UltraWide Full HD IPS LED de 29 pulgadas en formato panorámico 21:9

Con la llegada de Wayland como compositor por defecto en KDE Plasma, de repente mi monitor ultrawide dejó de funcionar correctamente a través del KVM. En lugar de la resolución nativa 2560x1080, solo detectaba 1920x1080 o resoluciones estándar inferiores.

Lo curioso es que el problema no era del KVM (que llevaba años funcionando perfectamente), sino de cómo Wayland gestiona la información EDID (Extended Display Identification Data) del monitor. Mientras X11 era más "permisivo" con EDIDs incompletos o incorrectos, Wayland es más estricto y necesita información precisa.

Switch KVM HDMI de 4 puertos con selector USB para compartir periféricos entre múltiples ordenadores

Consulté con varias IAs buscando una solución. Todas me dieron la misma respuesta: comprar un KVM nuevo con mejor soporte, preferiblemente con DisplayPort. El problema es que esos switches de calidad cuestan un pastón (200-400€ fácilmente).

Hasta que probé con Claude.ai, que me dio la solución definitiva: un par de líneas de código y un EDID override. Sin gastar un euro.

La solución: EDID override

La solución consiste en extraer el EDID correcto cuando el monitor está conectado directamente, guardarlo en el sistema, y forzar al kernel de Linux a usar ese EDID aunque el KVM envíe información incorrecta o incompleta.

Este método funciona perfectamente en Arch Linux con KDE Plasma Wayland y systemd-boot como bootloader.

Paso 1: Extraer el EDID correcto

Primero necesitas conectar el monitor directamente al PC por el cable que funcione correctamente (en mi caso, DisplayPort). Luego extrae la información EDID:

# Identifica tu salida de vídeo
ls /sys/class/drm/

# En mi caso: card1-DP-1 (DisplayPort 1)
# Extrae el EDID
sudo cat /sys/class/drm/card1-DP-1/edid > ~/monitor_ultrawide.edid

Verifica que el archivo se creó correctamente:

ls -lh ~/monitor_ultrawide.edid

Debería mostrar un archivo de aproximadamente 256-512 bytes.

Paso 2: Copiar EDID a firmware

Copia el archivo EDID extraído al directorio de firmware del sistema:

# Crear directorio si no existe
sudo mkdir -p /lib/firmware/edid

# Copiar EDID
sudo cp ~/monitor_ultrawide.edid /lib/firmware/edid/

# Verificar
ls -lh /lib/firmware/edid/

Paso 3: Configurar systemd-boot

Ahora debes añadir un parámetro al kernel para que use este EDID cuando detecte tu salida HDMI.

Localizar la configuración de systemd-boot

# Listar entradas de boot
sudo ls /efi/loader/entries/

Esto mostrará archivos con nombres como 299de72a50974f37b6a874f195dcb3d7-6.18.6-arch1-1.conf. Identifica el archivo sin el sufijo -fallback.

Editar la entrada de boot

# Edita tu entrada principal (ajusta el nombre según tu sistema)
sudo nano /efi/loader/entries/TU-ENTRADA-AQUI.conf

Busca la línea que empieza con options y añade al final (separado por un espacio):

drm.edid_firmware=HDMI-A-1:edid/monitor_ultrawide.edid

Importante: Cambia HDMI-A-1 por tu salida correcta. Para identificarla:

# Con el monitor conectado al KVM por HDMI, ejecuta:
kscreen-doctor -o

Busca el nombre de la salida (ej: HDMI-A-1, HDMI-1, etc.).

La línea options completa debería quedar algo como:

options root=PARTUUID=xxxxx rw quiet drm.edid_firmware=HDMI-A-1:edid/monitor_ultrawide.edid

Guarda el archivo (Ctrl+O, Enter, Ctrl+X).

Paso 4: Reiniciar y probar

sudo reboot

Después del reinicio:

  1. Conecta el monitor al KVM por HDMI
  2. Verifica la resolución detectada:
kscreen-doctor -o

Deberías ver ahora tu resolución nativa (2560x1080 en mi caso) entre las opciones disponibles.

Verificación adicional

Si quieres confirmar que el override está funcionando:

# Ver logs del kernel relacionados con EDID
sudo dmesg | grep -i edid

Deberías ver tu resolución nativa activa (marcada con *!).

Nota sobre dmesg con drivers NVIDIA: Si usas drivers propietarios de NVIDIA con dracut, es posible que dmesg | grep -i edid muestre errores como failed with error -2 aunque la resolución funcione perfectamente. Esto ocurre porque el driver de NVIDIA intenta cargar el EDID antes de que esté disponible en el initramfs. Sin embargo, el kernel parameter drm.edid_firmware sigue forzando la resolución correcta posteriormente. Si tu monitor muestra la resolución nativa correctamente, la solución está funcionando aunque aparezcan estos mensajes en los logs.

Reversión (si es necesario)

Si algo sale mal o quieres revertir los cambios:

# Edita la entrada de boot
sudo nano /efi/loader/entries/TU-ENTRADA-AQUI.conf

# Elimina la parte: drm.edid_firmware=HDMI-A-1:edid/monitor_ultrawide.edid
# Guarda y reinicia

También puedes arrancar con la entrada fallback desde el menú de systemd-boot, que no tendrá el parámetro modificado.

Conclusión

Con este método puedes usar switches KVM económicos sin perder resolución en monitores ultrawide u otras configuraciones no estándar. El kernel de Linux usa la información EDID correcta que extrajiste, ignorando la información incorrecta que envía el KVM.

Esta solución es especialmente útil cuando:

El método es seguro, reversible, y funciona perfectamente en Arch Linux con KDE Wayland. También debería funcionar en otras distribuciones y entornos, ajustando las rutas según el bootloader que uses (GRUB, rEFInd, etc.).

Especificaciones de mi setup

Nota: Con drivers NVIDIA y dracut, aunque dmesg muestre errores al cargar el firmware EDID, la solución funciona correctamente y la resolución se aplica sin problemas. ¿Te ha sido útil esta guía? Déjame un comentario si tienes dudas o si te funcionó con tu configuración.