drm/vkms 虚拟内核模式设置¶
VKMS 是 KMS 驱动程序的纯软件模型,可用于在无头机器上进行测试和运行 X(或类似程序)。VKMS 的目标是在无需硬件显示功能的情况下启用虚拟显示,从而在 DRM API 测试中释放 GPU。
设置¶
可以使用以下步骤设置 VKMS 驱动程序
要检查是否已加载 VKMS,请运行
lsmod | grep vkms
这将列出 VKMS 驱动程序。 如果没有输出,则需要启用和/或加载 VKMS 驱动程序。 确保 VKMS 驱动程序已在您的内核配置文件中设置为可加载模块。执行
make nconfig
Go to `Device Drivers> Graphics support`
Enable `Virtual KMS (EXPERIMENTAL)`
编译并构建内核以反映更改。 现在,要加载驱动程序,请使用
sudo modprobe vkms
现在运行 lsmod 命令,VKMS 驱动程序将出现在列表中。 您还可以在 dmesg 日志中观察到驱动程序已加载。
VKMS 驱动程序具有可选功能来模拟不同类型的硬件,这些功能以模块选项的形式公开。 您可以使用 modinfo 命令查看 vkms 的模块选项
modinfo vkms
模块选项在测试时很有用,可以在加载 vkms 时启用模块。 例如,要加载启用光标的 vkms,请使用
sudo modprobe vkms enable_cursor=1
要禁用驱动程序,请使用
sudo modprobe -r vkms
使用 IGT 进行测试¶
IGT GPU 工具是一个专门用于调试和开发 DRM 驱动程序的测试套件。 IGT 工具可以从此处安装。
这些测试需要在没有合成器的情况下运行,因此您需要切换到仅文本模式。您可以通过以下方式执行此操作
sudo systemctl isolate multi-user.target
要返回图形模式,请执行
sudo systemctl isolate graphical.target
进入仅文本模式后,您可以使用 --device 开关或 IGT_DEVICE 变量来指定我们要测试的驱动程序的设备筛选器。IGT_DEVICE 也可以与 run-test.sh 脚本一起使用,以运行特定驱动程序的测试
sudo ./build/tests/<name of test> --device "sys:/sys/devices/platform/vkms"
sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" ./build/tests/<name of test>
sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" ./scripts/run-tests.sh -t <name of test>
例如,要测试回写库的功能,我们可以运行 kms_writeback 测试
sudo ./build/tests/kms_writeback --device "sys:/sys/devices/platform/vkms"
sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" ./build/tests/kms_writeback
sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" ./scripts/run-tests.sh -t kms_writeback
如果您不想运行整个测试,也可以运行子测试
sudo ./build/tests/kms_flip --run-subtest basic-plain-flip --device "sys:/sys/devices/platform/vkms"
sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" ./build/tests/kms_flip --run-subtest basic-plain-flip
待办事项¶
如果您想执行下面列出的任何项目,请与 VKMS 维护者分享您的兴趣。
IGT 更好的支持¶
调试
kms_plane:由于捕获 CRC 超时,某些测试用例失败;
虚拟硬件(无 vblank)模式
VKMS 已经支持通过 hrtimer 模拟 vblank,可以使用 kms_flip 测试进行测试;在某种程度上,我们可以说 VKMS 已经模仿了真实的硬件 vblank。但是,我们也有不支持 vblank 中断并立即完成 page_flip 事件的虚拟硬件;在这种情况下,合成器开发人员可能会在虚拟硬件上最终创建一个繁忙循环。在 VKMS 中支持虚拟硬件行为将很有用,因为这可以帮助合成器开发人员在多种场景中测试其功能。
添加平面功能¶
我们可以添加很多平面功能支持
添加背景颜色 KMS 属性[入门好选择]。
缩放。
其他缓冲区格式,尤其是用于视频的 YUV 格式(如 NV12)。低/高 bpp RGB 格式也很有趣。
异步更新(目前仅在使用旧版光标 API 的光标平面上可用)。
对于所有这些,我们还希望查看 igt 测试覆盖率,并确保所有相关的 igt 测试用例都可以在 vkms 上运行。它们是实习项目的好选择。
运行时配置¶
我们希望能够在无需重新加载模块的情况下重新配置 vkms 实例。用例/测试用例
动态热插拔/热移除连接器(能够测试合成器的 DP MST 处理)。
配置平面/crtc/连接器(我们需要一些代码来首先拥有 1 个以上)。
更改输出配置:插入/拔出屏幕、更改 EDID、允许更改刷新率。
当前提出的解决方案是通过 configfs 公开 vkms 配置。所有现有的模块选项也应该通过 configfs 支持。
回写支持¶
回写和 CRC 捕获操作共享 composer_enabled 布尔值的使用,以确保 vblank。可能,当这些操作一起工作时,composer_enabled 需要引用计数 composer 状态才能正常工作。[入门好选择]
使用 IGT kms_writeback 中的克隆输出,添加对克隆回写输出和相关测试用例的支持。
作为 v4l 设备。这对于调试特殊 vkms 配置上的合成器很有用,以便开发人员了解实际情况。
输出功能¶
可变刷新率/freesync 支持。这可能需要主缓冲区共享支持,以便我们可以使用 vgem fences 来模拟测试中的渲染。还需要支持指定 EDID。
添加对链路状态的支持,以便合成器可以在例如 Display Port 链路出现故障时验证其运行时回退。
CRC API 改进¶
优化 CRC 计算
compute_crc()
和平面混合blend()
使用 eBPF 的原子检查¶
原子驱动程序有很多限制,这些限制没有以任何明确的形式通过例如可能的属性值暴露给用户空间。 用户空间只能通过原子 IOCTL 查询这些限制,可能使用 TEST_ONLY 标志。尝试为所有这些限制添加可配置的代码,以允许针对它们测试合成器,这将是徒劳的练习。相反,我们可以添加对 eBPF 的支持以验证任何类型的原子状态,并实现不同的限制库。
这需要启用大量功能(平面合成、多个输出等)才能有意义。