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 Tools 是一套专门用于调试和开发 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>

例如,要测试 writeback 库的功能,我们可以运行 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 中支持虚拟硬件行为将很有用,因为这可以帮助合成器开发人员在多种场景中测试他们的功能。

添加 Plane 功能

我们可以添加支持很多 plane 功能

  • 添加背景颜色 KMS 属性 [非常适合入门]。

  • 缩放。

  • 其他缓冲区格式,特别是用于视频的 YUV 格式(如 NV12)。 低/高 bpp RGB 格式也很有趣。

  • 异步更新(目前只能使用旧光标 api 在光标 plane 上进行)。

对于所有这些,我们还希望查看 igt 测试覆盖率,并确保所有相关的 igt 测试用例都可以在 vkms 上运行。 它们是实习项目的不错选择。

运行时配置

我们希望能够在不重新加载模块的情况下重新配置 vkms 实例。 用例/测试用例

  • 动态热插拔/热移除连接器(能够测试合成器的 DP MST 处理)。

  • 配置 planes/crtcs/连接器(我们需要一些代码才能拥有超过 1 个)。

  • 更改输出配置:插入/拔出屏幕、更改 EDID、允许更改刷新率。

目前提出的解决方案是通过 configfs 公开 vkms 配置。 所有现有的模块选项都应该通过 configfs 支持。

Writeback 支持

  • writeback 和 CRC 捕获操作共享 composer_enabled 布尔值的使用,以确保 vblank。 可能,当这些操作协同工作时,composer_enabled 需要引用计数合成器状态才能正常工作。 [非常适合入门]

  • 添加对克隆 writeback 输出和相关测试用例的支持,方法是在 IGT kms_writeback 中使用克隆输出。

  • 作为 v4l 设备。 这对于在特殊的 vkms 配置上调试合成器很有用,以便开发人员了解真正发生的事情。

输出功能

  • 可变刷新率/freesync 支持。 这可能需要 prime 缓冲区共享支持,以便我们可以使用 vgem fences 来模拟测试中的渲染。 还需要支持指定 EDID。

  • 添加对链路状态的支持,以便合成器可以在例如 Display Port 链路出现故障时验证其运行时回退。

CRC API 改进

  • 优化 CRC 计算 compute_crc() 和平面混合 blend()

使用 eBPF 的原子检查

原子驱动程序有很多限制,这些限制没有以任何显式形式通过例如可能的属性值公开给用户空间。 用户空间只能通过原子 IOCTL 查询这些限制,可能使用 TEST_ONLY 标志。 尝试为所有这些限制添加可配置代码,以允许针对它们测试合成器,这将是一项徒劳的练习。 相反,我们可以添加对 eBPF 的支持来验证任何类型的原子状态,并实现一个不同限制的库。

这需要启用一堆功能(平面合成、多个输出……)才能有意义。