Silicon Motion SM750: вышел open-source Linux-драйвер с поддержкой ultrawide

Silicon Motion SM750: вышел open-source Linux-драйвер с поддержкой ultrawide

Разработчик, известный на GitHub под ником KodeMunkie, опубликовал sm750hdmifb, открытый (лицензия GPL-2.0-only) Linux-драйвер для одной конкретной модели видеокарты на устаревшем встраиваемом чипе Silicon Motion SM750: платы SE-DP750A-HDMI с одним HDMI-выходом. Тестовая плата описана предельно точно, ревизия SM750G10-AC A1, PCI ID 126f:0750, HDMI-передатчик Silicon Image/Lattice SiI9024ACNUHDMI, 16 МиБ видеопамяти, и автор отдельно предупреждает, что другие карты на SM750 с VGA-выходом, другим передатчиком или другой разводкой GPIO этим драйвером не поддерживаются, даже если у них тот же PCI ID.

Штатно карта описывается как поддерживающая до 1920 пикселей по горизонтали, но драйвер с параметром edid_only=0 открывает реальные аппаратные режимы шириной до 2048 пикселей, это физический предел самой платы: у графического блока SM750 11-битное поле для правого края кадра, и сузить его нельзя даже уменьшением высоты. Поверх этого лимита параметр softscale_wide=1 добавляет два программных ultrawide-режима, 2464×1080 и 2560×1080, для физических мониторов 2560×1080 с включённой в их экранном меню функцией растяжения на весь экран (full widescreen stretch). В режиме 2560×1080 драйвер сжимает логический стол на 20% до 2048 пикселей, а монитор затем растягивает сигнал обратно на 25%, до полных 2560 точек панели. Режим 2464×1080, компромисс: он даёт на 3,75% меньше пикселей логического стола, сжимает изображение перед выводом всего на 16,9%, но итоговая картинка получается примерно на 3,9% шире своей логической геометрии; автор считает этот режим более отзывчивым и часто визуально резче, поэтому рекомендует его для физических мониторов 2560×1080. В обоих ultrawide-режимах можно включить дополнительную компенсацию резкости, фиксированные 8% контрастного повышения чёткости после сжатия.

Из-за того что фреймбуфер SM750 подключён по узкой шине PCIe 1.1 x1, драйвер по умолчанию выводит изображение не в 32-битном формате XRGB8888 (4 байта на пиксель), а в дизерованном 16-битном RGB565 (2 байта на пиксель), это вдвое снижает трафик к карте при сохранении большей части видимой цветовой детализации. Для этого автор разработал собственный упорядоченный 8×8-дизер с настраиваемой 94%-й коррекцией зелёного канала, привязанный к координатам экрана, чтобы узор дизера не «плыл» при частичных обновлениях. Обновлённые области экрана загружаются пакетами по восемь строк через DMA, с аппаратным курсором и безопасным откатом, если DMA не срабатывает.

Драйвер собирается локально через DKMS на Ubuntu 24.04 и Linux Mint 22 и требует ядра Linux версии 6.17 или новее, более старые ядра DKMS сознательно отвергает, поскольку в них нет нужных интерфейсов DRM; после установки нужна перезагрузка, чтобы пакет успел заблокировать старый штатный драйвер sm750fb до того, как тот захватит карту. Проект целиком под лицензией GPL-2.0-only, без проприетарных блобов или бинарных объектов Silicon Motion, файлы, унаследованные от заводского DDK, взяты из открытого staging-драйвера sm750fb самого ядра Linux. Автор прямо пишет, что проект создан во многом с помощью ИИ, в духе «vibe coding» (интуитивной разработки с ИИ-подсказками): он лично сформулировал требования и протестировал поведение на реальном железе, спроектировал собственный дизер, но не заявляет, что обладает достаточной экспертизой в Linux DRM, KMS, DKMS или ядерных фреймворках, чтобы самостоятельно поручиться за каждую деталь реализации, и приглашает специалистов проверить код. Отдельно он отмечает, что официальная спецификация SM750 ошибочна как минимум в одной аппаратно проверенной границе частичного обновления экрана, соответствующие обходные пути задокументированы в исходниках и не должны удаляться только потому, что «идеальная» модель или спецификация считает их лишними.

Экспериментальные режимы явно помечены как рискованные: конфигурация с отключённым EDID и включёнными широкими режимами может выйти за паспортные частоты платы, передатчика или монитора и привести к потере сигнала, искажениям или нестабильности картинки, поэтому автор советует держать под рукой SSH или другой способ восстановить доступ при экспериментах.

Ключевые факты

  • Разработчик под ником KodeMunkie выпустил открытый (GPL-2.0-only) Linux-драйвер sm750hdmifb для одной конкретной модели видеокарты, SE-DP750A-HDMI на чипе Silicon Motion SM750G10-AC (PCI ID 126f:0750, 16 МиБ видеопамяти).
  • Аппаратный предел карты, 2048 пикселей по горизонтали (11-битное поле правого края кадра), но программным масштабированием драйвер создаёт ultrawide-рабочие столы 2464×1080 и 2560×1080 для мониторов с функцией растяжения на весь экран.
  • Из-за узкой шины PCIe 1.1 x1 по умолчанию используется дизеринг RGB565 (2 байта на пиксель вместо 4 у XRGB8888), что вдвое снижает трафик к карте; автор разработал собственный 8×8-дизер с 94%-й коррекцией зелёного канала.
  • Драйвер собирается через DKMS на Ubuntu 24.04 и Linux Mint 22 и требует ядра Linux 6.17 или новее; экспериментальные режимы могут превышать паспортные частоты и приводить к потере сигнала, автор прямо предупреждает об этом.
  • Автор открыто говорит, что проект написан во многом с помощью ИИ («vibe coding»), лично протестировал поведение на реальном железе, но не утверждает, что обладает глубокой экспертизой в Linux DRM/KMS/DKMS, и приглашает специалистов проверить код.

Почему это важно

Новость, не про громкую модель ИИ, а про то, как выглядит здоровый инженерный опенсорс: одна конкретная плата, дословно задокументированное железо, честно очерченные границы поддержки и физические пределы (тот самый 11-битный предел в 2048 пикселей), а не маркетинговые обещания. Показателен и метод: автор открыто называет проект «vibe coding», созданным с активной помощью ИИ, но при этом лично протестированным на реальном железе и выложенным именно для экспертной проверки, а не как готовый эталон качества. Это пример того, как ИИ-ассистированная разработка добирается до низкоуровневого системного кода, драйверов ядра Linux, а не только до прикладных сервисов.

Кому это важно

В первую очередь, владельцам конкретной платы SE-DP750A-HDMI на SM750G10-AC: встраиваемые GPU этого семейства часто стоят в серверах, тонких клиентах, IPMI/BMC-модулях и промышленных системах, где штатный видеовыход слабый или ограниченный. Также, линуксоидам и энтузиастам ретро-железа, которые хотят получить из старой платы ultrawide-рабочий стол на 2560×1080. И разработчикам drm/kms-драйверов ядра Linux, которым интересен пример вскрытия недокументированных аппаратных пределов и обхода ошибок официальной спецификации.

Как это применить

Нужны Ubuntu 24.04 или Linux Mint 22, ядро Linux 6.17+ и пакеты build-essential, dkms, linux-headers, libdrm-dev, git. Дальше, клонировать репозиторий sm750hdmifb, собрать .deb через ./build-package.sh, поставить пакет и перезагрузиться (перезагрузка обязательна, чтобы новый драйвер успел заблокировать старый sm750fb). По умолчанию используются безопасные EDID-режимы монитора; для реальных 2048-пиксельных и ultrawide-режимов (2464×1080 или 2560×1080) нужно явно включить параметры ядра edid_only=0 и softscale_wide=1 через GRUB, а на мониторе 2560×1080 включить в его собственном экранном меню функцию полного растяжения на весь экран. Перед экспериментами с нестандартными частотами стоит держать под рукой SSH-доступ или запасную загрузочную запись ядра на случай пропажи сигнала.

Можно ли доверять

Да, с оговорками, которые автор сам и формулирует. Плюсы: код полностью открыт под GPL-2.0-only без проприетарных бинарников; аппаратные предположения задокументированы предельно конкретно, вплоть до 11-битного поля кадра и точного PCI ID; автор лично физически тестировал поведение на реальной плате и разработал собственный алгоритм дизеринга. Оговорка: значительная часть кода написана с помощью ИИ («vibe coding»), и автор прямо пишет, что не обладает достаточной экспертизой в Linux DRM/KMS/DKMS, чтобы гарантировать каждую деталь реализации, поэтому явно просит независимой экспертной проверки, а не выдаёт проект за готовое решение уровня апстрима ядра. У проекта нет фиксированного верхнего потолка версий ядра в диапазоне 6.17+, хотя новые ядра могут потребовать доработки исходников.

Риски и подводные камни

Драйвер работает строго с одной конкретной аппаратной конфигурацией, платой SE-DP750A-HDMI с передатчиком SiI9024ACNUHDMI; одного совпадения PCI ID 126f:0750 недостаточно, другие SM750-платы с VGA-выходом, другим передатчиком или другой разводкой GPIO не поддерживаются вовсе. Ядра старше 6.17 не работают в принципе, DKMS их отклоняет. Экспериментальные режимы (отключённый EDID, широкие режимы, повышенные частоты) официально не гарантированы: они могут превысить паспортные ограничения платы, передатчика или монитора и привести к пропаданию сигнала, искажениям или нестабильности изображения, без SSH или другого пути восстановления это может закончиться потерей доступа к рабочему столу. Ultrawide-режимы всегда идут с компромиссом: 2560×1080 сжимает и потом растягивает изображение, немного размывая мелкие детали, а 2464×1080 при меньшей потере детализации даёт заметное искажение пропорций примерно на 3,9%. Наконец, часть кода написана с помощью ИИ, и сам автор не даёт полной гарантии за каждую деталь реализации на уровне ядра.

«Я определил требования и лично протестировал поведение драйвера, а также разработал собственный алгоритм дизеринга, но не претендую на достаточную экспертизу в Linux DRM, KMS, DKMS или ядерных фреймворках, чтобы самостоятельно гарантировать каждую деталь реализации.»

— KodeMunkie, автор драйвера sm750hdmifb