Pimax EDID quirks required to not initalize desktop on HMD

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 |
+-----------------------------------------------------------------------------------------+