These HMDs were made before EDID spec provided a bool to alert the driver to an HMD and therefore need to be quirked out in the kernel driver.
Please incorporate this patch into the proprietary driver to allow these HMDs to both be used and to not interfere with regular desktop activity:
As a full summary of the issue, the pimax EDID is always wrong and must be ignored when validating any of the headset data. After ignoring the EDID checksum all Pimax displays should be quirked as VR HMDs and masked off from the desktop environment in the kernel.
Both of these changes must be made to the kernel driver to successfully run Pimax on the monado branch located here
These dumped distortion parameters are needed to run the headsets as intended
Please note you must not adjust the IPD at runtime as coreforge’s branch does not yet support this and the distortion won’t account for this.
Pimax EDIDs vary greatly due to a vast number of silent hardware and firmware revisions as they were actively produced. They may appear to violate DisplayID spec in the EDID and they may also have checksums and sub-checksums which appear utterly corrupt but this is false, load the modes and they will operate. Likely EDIDs were tweaked by hand as the assembly line produced them to address various issues and no consideration was made for correcting these. PiTools does not care and neither should we.
An exhaustive list of the official display model variants we quirk out as HMD for other drivers in the Linux kernel:
- /* Pimax VR Headsets */
- EDID_QUIRK(‘O’, ‘V’, ‘R’, 0x0003, EDID_QUIRK_NON_DESKTOP),
- EDID_QUIRK(‘S’, ‘V’, ‘R’, 0x1019, EDID_QUIRK_NON_DESKTOP),
- EDID_QUIRK(‘P’, ‘V’, ‘R’, 0x1019, EDID_QUIRK_NON_DESKTOP),
- EDID_QUIRK(‘P’, ‘V’, ‘R’, 0x101a, EDID_QUIRK_NON_DESKTOP),
- EDID_QUIRK(‘P’, ‘V’, ‘R’, 0x101b, EDID_QUIRK_NON_DESKTOP),
This is taken officially from pitools on windows and is all inclusive of models that were not HMD bit enabled in EDID.
My headset (8KX/P2N) seems to work without this change, but this isn’t common, and sometimes the desktop initializes on the headset, it seems to be based on the state that the headset was in when I turned my computer off.
This is the case with both open and closed kernel modules.
I will also note that I am using the kernel patch listed above, but am unsure if it actually does anything on Nvidia.
However, I will note that dsmg does output this when Monado (OpenXR compositor) starts:
[ 8261.399018] nvidia-gpu 0000:26:00.3: i2c timeout error e0000000
[ 8265.941210] binder_linux: 116130:116130 cannot find target node
[ 8265.941215] binder_linux: 116130:116130 transaction call to 0:0 failed 1/29189/-22, size 0-0 line 3151
[ 8266.384346] nvidia-gpu 0000:26:00.3: i2c timeout error e0000000
[ 8268.015295] nvidia-gpu 0000:26:00.3: i2c timeout error e0000000
output of nvidia-smi while Monado is running:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.169 Driver Version: 570.169 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 2060 Off | 00000000:26:00.0 On | N/A |
| 0% 48C P0 38W / 170W | 1927MiB / 6144MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 1682 G ...1zp-xorg-server-21.1.16/bin/X 33MiB |
| 0 N/A N/A 2500 G ...6-kwallet-6.15.0/bin/ksecretd 2MiB |
| 0 N/A N/A 3207 G ...x-kwin-6.4.1/bin/kwin_wayland 147MiB |
| 0 N/A N/A 3436 G ...urrent-system/sw/bin/Xwayland 2MiB |
| 0 N/A N/A 3480 G ...workspace-6.4.1/bin/ksmserver 2MiB |
| 0 N/A N/A 3482 G ...skj2y29-kded-6.15.0/bin/kded6 2MiB |
| 0 N/A N/A 3540 G ...rkspace-6.4.1/bin/plasmashell 165MiB |
| 0 N/A N/A 4017 G ...sma-desktop-6.4.1/bin/kaccess 2MiB |
| 0 N/A N/A 4018 G ...it-kde-authentication-agent-1 2MiB |
| 0 N/A N/A 4926 G ...rrent-system/sw/bin/nextcloud 2MiB |
| 0 N/A N/A 4930 G ...t-kde-25.04.2/bin/kdeconnectd 2MiB |
| 0 N/A N/A 4933 G ...em/sw/bin/xwaylandvideobridge 2MiB |
| 0 N/A N/A 4934 G ...rrent-system/sw/bin/keepassxc 2MiB |
| 0 N/A N/A 4944 G ....4.1/libexec/DiscoverNotifier 2MiB |
| 0 N/A N/A 4977 G ...ibexec/xdg-desktop-portal-kde 2MiB |
| 0 N/A N/A 5528 G ...-kwallet-6.15.0/bin/kwalletd6 2MiB |
| 0 N/A N/A 7066 G ...x-profile/bin/firefox-nightly 232MiB |
| 0 N/A N/A 87834 G ...5.1/libexec/electron/electron 462MiB |
| 0 N/A N/A 88210 G ...re/firefoxpwa/runtime/firefox 130MiB |
| 0 N/A N/A 89987 G ...share/Steam/ubuntu12_32/steam 2MiB |
| 0 N/A N/A 90308 G ./steamwebhelper 29MiB |
| 0 N/A N/A 90333 G ...am/ubuntu12_64/steamwebhelper 91MiB |
| 0 N/A N/A 114873 G ...current-system/sw/bin/konsole 2MiB |
| 0 N/A N/A 116117 G ...ace-6.4.1/libexec/baloorunner 2MiB |
| 0 N/A N/A 118221 C+G ...dffd3ec4a9/bin/monado-service 386MiB |
+-----------------------------------------------------------------------------------------+