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 的支援來驗證任何型別的原子狀態,並實現一個不同限制的庫。

這需要啟用一堆功能(平面合成、多個輸出……)才能有意義。