开源为何如此出色 – 全新SM750(Silicon Motion GPU)HDMI驱动

Hacker News Top 工具

摘要

这是一个开源的Linux DRM驱动,专为Silicon Motion SM750 GPU设计,支持高分辨率HDMI输出,并通过优化实现更流畅的性能。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/30 21:46

KodeMunkie/sm750hdmifb 来源:https://github.com/KodeMunkie/sm750hdmifb

SM750 HDMI DRM 驱动程序

将该卡推至真实的 2048 宽输出,或软件缩放的 2560x1080 超宽桌面,并采用节省带宽的颜色转换和更新优化,以实现更流畅的性能。

适用于单 HDMI 接口 SE-DP750A-HDMI PCIe 卡的 Linux 显示驱动程序。

实验性: 此驱动程序专用于特定的 SM750 板卡。可选模式可能超出已发布的 GPU 或显示器时钟限制,可能导致无信号、失真或显示不稳定。在尝试非 EDID 模式时,请保留 SSH 或其他恢复途径。

我的卡是否受支持?

经过测试的板卡以 SE-DP750A-HDMI 名义销售或标记,并具备以下所有条件:

  • Silicon Motion SM750G10-AC,版本 A1
  • PCI ID 126f:0750
  • Silicon Image/Lattice SiI9024ACNU HDMI 发送器
  • 16 MiB 显示内存
  • 一个 HDMI 输出

仅凭 PCI ID 并不足够。其他 SM750 卡可能使用 VGA、不同的发送器或不同的 GPIO 布线,目前不受支持。

安装

Ubuntu 24.04 和 Linux Mint 22 用户可以在本地构建 DKMS 包:

sudo apt update
sudo apt install build-essential dkms linux-headers-$(uname -r) libdrm-dev git
git clone https://github.com/KodeMunkie/sm750hdmifb.git
cd sm750hdmifb
make check
./build-package.sh
sudo apt install ./dist/sm750hdmifb_0.5.5_all.deb
sudo reboot

重启很重要:它允许包在 Linux 的旧 sm750fb 驱动程序接管该卡之前将其列入黑名单。该包名为 sm750hdmifb;内核模块名为 sm750hdmidrm.ko,因此不会与 sm750fb.ko 混淆。

内核兼容性

该驱动程序旨在用于 Linux 6.17 及更高版本。DKMS 会故意拒绝较旧的内核,因为本项目不支持所需的 DRM 接口。源代码包含适用于 Linux 6.17 至 6.x 系列以及 Linux 7.0 及更高版本的兼容性路径。目前,它在 6.17 和 7.0 Ubuntu 内核上构建并能通过完整测试套件;手动 CI 工作流也在 Ubuntu 24.04 的 6.17 内核头文件上进行构建。没有固定的上限版本,但未来内核可能会更改内部 DRM API。由于这是树外驱动程序,即使新的内核版本属于预期的 6.17+ 范围,也可能需要更新源代码。预构建包(如果可用)发布在 GitHub Releases (https://github.com/KodeMunkie/sm750hdmifb/releases) 下。建议在本地构建,因为 DKMS 会针对已安装的内核头文件进行编译。

常规使用

默认情况下,驱动程序:

  • 使用显示器 EDID 模式
  • 使用带抖动的 16 位 RGB565 扫描输出
  • 使用硬件光标
  • 在工作线程上合并更新
  • 使用 DMA 上传八行批次
  • 如果 DMA 失败则安全回退

应用程序仍以 32 位颜色渲染。在上传之前,驱动程序会将更改的屏幕区域转换为 RGB565,并应用 KodeMunkie 的有序抖动(具有 94% 的绿色通道校正)。这是默认设置,因为 SM750 帧缓冲区通过 PCIe 1.1 x1 链路连接。在较高分辨率下,该链路无法提供响应性的全屏 32 位更新:XRGB8888 每个输出像素发送四个字节,而 RGB565 发送两个字节。因此,抖动的 RGB565 在保留大部分可见色彩细节的同时,将设备传输的像素数据量减半。

常见的内核或 GRUB 选项是:

下表省略了常见的 sm750hdmidrm. 前缀以保持可读性。例如,在 GRUB 中输入 enable_dma=0 应为 sm750hdmidrm.enable_dma=0。

选项及默认值何时指定效果和权衡
scanout_format=rgb565-bbdither
默认值:rgb565-bbdither
无需指定;这是推荐的默认值带绿色校正的抖动 16 位扫描输出
scanout_format=xrgb8888
默认值:rgb565-bbdither
仅用于 32 位扫描输出禁用 RGB565、抖动和绿色校正;上传流量加倍,在高分辨率下可能滞后
scanout_format=rgb565
默认值:rgb565-bbdither
仅用于普通 RGB565禁用抖动和绿色校正,降低色彩质量
dither_green_gain=94
默认值:94
无需指定;校正默认开启在抖动时启用调优的绿色校正
dither_green_gain=100
默认值:94
用于关闭绿色校正保留抖动,但可能产生更偏绿的色彩平衡
enable_dma=1
默认值:1
无需指定;DMA 默认开启经过验证的八行 DMA 上传,具有自动 CPU 回退功能
enable_dma=0
默认值:1
用于禁用 DMA强制 CPU 上传,通常更新性能较低
disable_hardware_cursor=1
默认值:0
用于软件光标回退禁用硬件光标,可能降低光标响应性
edid_only=0
默认值:1
驱动程序目录和超宽模式需要危险:停止 EDID 限制,可能使用显示器不支持的模式和时钟
softscale_wide=1
默认值:0
2464x1080 和 2560x1080 所需;同时设置 edid_only=0危险/实验性:启用宽压缩,需要显示器拉伸
sharpen=1
默认值:0
推荐与超宽模式一起使用压缩后添加固定的 8% 对比度锐化
double_shadow=1
默认值:0
推荐用于避免冗余上传添加源和输出比较快照;跳过未更改的像素但使用更多系统内存。这不是前/后页面翻转
async_updates=1
默认值:1
无需指定;默认启用仅保留最新的待处理更新,而不是排队过时的帧

将选项添加到 /etc/default/grub 中现有的 GRUB_CMDLINE_LINUX_DEFAULT 值,然后使用以下命令应用:

sudo update-grub
sudo reboot

每个选项及其默认值列于 模块参数 中。

超宽缩放

该设备通常被描述为支持最大 1920 像素水平宽度。设置 edid_only=0 后,驱动程序还暴露以下真实的 2048 宽硬件模式:

桌面和 HDMI 模式刷新率输出和风险
2048x86459.94, 60, 70, 72, 75 Hz原生或显示器缩放。实验性:不受 EDID 限制
2048x102459.94, 60, 70, 72 Hz原生或显示器缩放。实验性:不受 EDID 限制
2048x108050, 59.94, 60, 70, 72, 75 Hz原生或显示器缩放。实验性:高刷新率可能超出规格
2048x115259.94, 60 Hz原生或显示器缩放。实验性:不受 EDID 限制

softscale_wide=1 添加两个更宽的逻辑桌面。两者都需要物理 2560x1080 超宽显示器,并在屏幕菜单中启用 FULL WIDESCREEN STRETCH:

逻辑桌面物理显示器宽度比HDMI 和显示器路径
2464x10802560x108077:64
16.9% 压缩
2048x1080 -> 2560x1080 拉伸
2560x10802560x10805:4
20% 压缩
2048x1080 -> 2560x1080 拉伸
模式刷新率指导
2464x108050, 59.94, 60, 70, 72, 75 Hz推荐: 细节更多,响应性更好;启用 sharpen=1
2560x108050, 59.94, 60, 70, 72, 75 Hz细节较少,性能较低,因为压缩了更多宽度;参见 推理

对于这两种模式,HDMI 信号从 2048x1080 拉伸到物理 2560x1080 像素的 2K 超宽显示器。

2048 像素是该卡硬件能产生的最高真实宽度。

SM750 主要图形平面具有 11 位右边缘字段,因此其物理扫描输出宽度不能超过 2048 像素。这是一个硬件限制;减少高度不会释放更多的水平位数。

2464 和 2560 模式在软件中创建更宽的工作区,但该卡仍仅输出 2048 像素宽的信号。需要支持全宽或全宽拉伸选项的超宽显示器才能达到预期效果。

完整路径是:

逻辑桌面 -> 驱动程序压缩 -> 2048x1080 HDMI -> 显示器拉伸到 2560x1080 物理像素

显示器的拉伸设置在空间上将压缩的 2048 像素 HDMI 图像扩展到所有 2560 个物理面板像素。它并非在恢复丢失的源数据,而是恢复了预期的超宽屏幕覆盖范围,并大致恢复了预期的宽高比。看起来“正确”是主观的,因为 2464 模式故意保留了一小的宽高差异。

为何推荐 2464x1080

对于 2560x1080,驱动程序执行从 2560 到 2048 像素的优化 5:4 缩减,即 20% 的水平压缩。2560 宽的显示器随后将 2048 像素信号扩展 25%,覆盖其整个面板。这提供了真正的 2560x1080 大小的工作区,但第一步必然会合并一些精细的水平细节,并且必须渲染和处理更多源像素。

对于物理 2560x1080 显示器,2464x1080 是推荐的、性能更高且通常更清晰的模式。它从少 3.75% 的桌面像素开始,仅将宽度压缩 16.9%,然后发送相同的 2048x1080 信号。显示器仍将该信号扩展到 2560 个面板像素,因此驱动程序丢弃的源细节更少,但最终图像比其逻辑几何形状宽约 3.9%。这种轻微的宽高失真通常难以察觉,是为了提高响应性和感知清晰度而做的权衡。

建议启用 sm750hdmidrm.sharpen=1。两种宽模式都可以在压缩后应用小的固定 8% 对比度锐化。它恢复了因滤波而丢失的一些边缘定义;它不会重新创建丢弃的像素。抖动和绿色通道校正应用于最终的 RGB565 转换过程中,然后在 2048 宽扫描输出上传之前。

此测试配置文件启用了驱动程序模式目录和宽缩放:

警告:此配置文件禁用了 EDID 模式限制,并暴露了实验性或超规格的时钟。列出的模式可能导致屏幕变黑、显示不稳定,或超出 GPU、发送器或显示器的限制。

sm750hdmidrm.edid_only=0
sm750hdmidrm.softscale_wide=1
sm750hdmidrm.sharpen=1
sm750hdmidrm.scanout_format=rgb565-bbdither
sm750hdmidrm.double_shadow=1
sm750hdmidrm.enable_dma=1

一些目录刷新率会使 SM750 DVO 路径或显示器超出其已发布限制。某个模式被列出并不保证每个显示器、电缆、KVM 或适配器都能接受它。在尝试之前,请参阅 模式和时钟风险。

自定义桌面抖动

rgb565-bbdither 使用 KodeMunkie 专为该卡上的桌面使用而构思和调优的 8x8 有序抖动。它包括可调整的绿色通道校正,并将图案锚定到屏幕坐标,因此小范围的更新不会使图案爬行或留下不匹配的斑块。

截图

下面的三张图片可视化了完整的超宽转换过程。单击任何预览可打开原始图像。逻辑桌面和物理照片显示为页面宽度的 50%。压缩预览显示为 41.56%,保留了 2048 / 2464 的宽度缩减,而不是将两个数字阶段都拉伸到相同的预览宽度。

1. 逻辑桌面

驱动程序接收到这个原始的 2464x1080 逻辑桌面。

2. 压缩的 HDMI 扫描输出

上面的图像故意看起来水平压扁。它再现了将 2464x1080 逻辑桌面压缩到 SM750 硬件宽度限制后生成的 2048x1080 HDMI 扫描输出。

3. 物理显示器结果

拍摄的照片结果在 75 Hz 下填充了显示器的 2560x1080 物理像素,使用了驱动程序的 16 位 rgb565-bbdither 抖动扫描输出。显示器的 FULL WIDESCREEN STRETCH 选项将该信号扩展到其物理 2560x1080 面板上。

因此,完整的路径是: 逻辑桌面 -> SM750 硬件扫描输出 -> 物理面板,由显示器拉伸。

故障排除

检查绑定和最近的驱动程序消息:

lspci -nnk -d 126f:0750
journalctl -k -b | grep -iE 'sm750|sii902'

如果实验模式无信号,请引导进入较旧的内核条目,或从恢复访问中移除添加的 sm750hdmidrm.* GRUB 选项。测试和实时重新加载指南在 测试和恢复 中。

开发者

官方 SM750 规范已知对于至少一个硬件观察到的部分更新边界是错误的。经验验证的解决方法在源代码中有记录,仅因为理想的模型或规范表明它们不必要就不得将其移除。

许可证和声明

该项目为 GPL-2.0-only。DDK 派生文件来自 Linux 的 GPL-2.0 staging sm750fb 驱动程序。未包含或链接任何专有的 Silicon Motion 驱动程序、二进制对象、固件 Blob 或封闭库。详情请参见 来源审计。

此项目是通过广泛的 AI 辅助或“氛围编码”创建的。我已指定并实际测试了该行为,并设计了自定义抖动,但不声称拥有足够的 Linux DRM、KMS、DKMS 或内核框架专业知识来独立保证每个实现细节。发布源代码是为了审查和改进,而不是作为上游内核质量的声明。欢迎专家审查。

您使用此实验性驱动程序以及任何非 EDID 或超规格模式完全由您自行承担风险。您负责恢复访问、备份、模式选择和硬件兼容性。作者和贡献者不对任何显示、数据、时间、硬件、收入或其他直接或间接损失负责。

该软件按“原样”提供,不附带任何保证。请参见 许可证。

相似文章

在一个月内为M4 Mac Mini开发Linux GPU驱动程序

Hacker News Top

Cody Ho和Niklas通过洁净室逆向工程,在一个月内为M4 Mac Mini构建了一个完全符合OpenGL ES 3.0标准的GPU驱动程序,使得Linux能够以高帧率运行如Minecraft等图形密集型应用程序。

用于 Linux 的 Asus ZenVision 盖板 OLED 逆向工程用户空间驱动

Hacker News Top

这是一个针对 ASUS ZenVision 盖板 OLED 屏幕的逆向工程开源 Linux 用户空间驱动,允许用户在这块 256×64 的面板上显示图片和动画——而 ASUS 官方仅支持 Windows 平台。USB 协议通过 Ghidra 对 MyASUS 应用进行逆向分析后还原。