开源为何如此出色 – 全新SM750(Silicon Motion GPU)HDMI驱动
摘要
这是一个开源的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
SiI9024ACNUHDMI 发送器 - 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 模式 | 刷新率 | 输出和风险 |
|---|---|---|
2048x864 | 59.94, 60, 70, 72, 75 Hz | 原生或显示器缩放。实验性:不受 EDID 限制 |
2048x1024 | 59.94, 60, 70, 72 Hz | 原生或显示器缩放。实验性:不受 EDID 限制 |
2048x1080 | 50, 59.94, 60, 70, 72, 75 Hz | 原生或显示器缩放。实验性:高刷新率可能超出规格 |
2048x1152 | 59.94, 60 Hz | 原生或显示器缩放。实验性:不受 EDID 限制 |
softscale_wide=1 添加两个更宽的逻辑桌面。两者都需要物理 2560x1080 超宽显示器,并在屏幕菜单中启用 FULL WIDESCREEN STRETCH:
| 逻辑桌面 | 物理显示器 | 宽度比 | HDMI 和显示器路径 |
|---|---|---|---|
2464x1080 | 2560x1080 | 77:6416.9% 压缩 | 2048x1080 -> 2560x1080 拉伸 |
2560x1080 | 2560x1080 | 5:420% 压缩 | 2048x1080 -> 2560x1080 拉伸 |
| 模式 | 刷新率 | 指导 |
|---|---|---|
2464x1080 | 50, 59.94, 60, 70, 72, 75 Hz | 推荐: 细节更多,响应性更好;启用 sharpen=1 |
2560x1080 | 50, 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 选项。测试和实时重新加载指南在 测试和恢复 中。
开发者
- 硬件和功能比较
- 模块参数
- 模式和时钟风险
- 来源和许可证审计
- 测试和恢复
- 手动 CI 构建 (https://github.com/KodeMunkie/sm750hdmifb/actions/workflows/build.yml)
官方 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驱动程序
Cody Ho和Niklas通过洁净室逆向工程,在一个月内为M4 Mac Mini构建了一个完全符合OpenGL ES 3.0标准的GPU驱动程序,使得Linux能够以高帧率运行如Minecraft等图形密集型应用程序。
Apex Compute 正为其硬件开发开源 Mesa Vulkan 驱动
Apex Compute 正在为自家 AI 硬件开发开源的 Mesa Vulkan 驱动,使其加速器平台能够原生支持开源图形软件。
用于AMD MI350X的Qwen3.6-35B-A3B开源内核:在8块GPU上实现78,498输出tok/s
本文介绍了为在AMD MI350X GPU上运行Qwen3.6-35B-A3B大语言模型所做的优化,实现了高输出令牌吞吐量,并开源了内核以提升性能。
用于 Linux 的 Asus ZenVision 盖板 OLED 逆向工程用户空间驱动
这是一个针对 ASUS ZenVision 盖板 OLED 屏幕的逆向工程开源 Linux 用户空间驱动,允许用户在这块 256×64 的面板上显示图片和动画——而 ASUS 官方仅支持 Windows 平台。USB 协议通过 Ghidra 对 MyASUS 应用进行逆向分析后还原。
AMD ROCm 7.14 "TheRock" 技术预览已发布,针对最新 AMD GPU 计算堆栈
AMD 发布了 ROCm 7.14 'TheRock' 技术预览,带来了AI训练增强、针对Comfy UI等特定AI工作负载的性能提升高达16%,以及对开源GPU计算堆栈的持续Windows支持。