€•á–Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/translations/zh_CN/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/zh_TW/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/it_IT/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ja_JP/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ko_KR/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/pt_BR/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/sp_SP/gpu/vkms”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒtarget”“”)�”}”(hŒ .. _vkms:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œvkms”uh1hµh´Khhh²hh³Œ6/var/lib/git/docbuild/linux/Documentation/gpu/vkms.rst”ubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ#drm/vkms Virtual Kernel Modesetting”h]”hŒ#drm/vkms Virtual Kernel Modesetting”…”�”}”(hhËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhÆh²hh³hÃh´KubhŒ paragraph”“”)�”}”(hŒöVKMS is a software-only model of a KMS driver that is useful for testing and for running X (or similar) on headless machines. VKMS aims to enable a virtual display with no need of a hardware display capability, releasing the GPU in DRM API tests.”h]”hŒöVKMS is a software-only model of a KMS driver that is useful for testing and for running X (or similar) on headless machines. VKMS aims to enable a virtual display with no need of a hardware display capability, releasing the GPU in DRM API tests.”…”�”}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³ŒW/var/lib/git/docbuild/linux/Documentation/gpu/vkms:7: ./drivers/gpu/drm/vkms/vkms_drv.c”h´KhhÆh²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒSetup”h]”hŒSetup”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhêh²hh³hÃh´K ubhÚ)�”}”(hŒ6The VKMS driver can be setup with the following steps:”h]”hŒ6The VKMS driver can be setup with the following steps:”…”�”}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K hhêh²hubhÚ)�”}”(hŒ!To check if VKMS is loaded, run::”h]”hŒ To check if VKMS is loaded, run:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhêh²hubhŒ literal_block”“”)�”}”(hŒlsmod | grep vkms”h]”hŒlsmod | grep vkms”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jh³hÃh´Khhêh²hubhÚ)�”}”(hŒÏThis should list the VKMS driver. If no output is obtained, then you need to enable and/or load the VKMS driver. Ensure that the VKMS driver has been set as a loadable module in your kernel config file. Do::”h]”hŒÎThis should list the VKMS driver. If no output is obtained, then you need to enable and/or load the VKMS driver. Ensure that the VKMS driver has been set as a loadable module in your kernel config file. Do:”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhêh²hubj)�”}”(hŒ[make nconfig Go to `Device Drivers> Graphics support` Enable `Virtual KMS (EXPERIMENTAL)`”h]”hŒ[make nconfig Go to `Device Drivers> Graphics support` Enable `Virtual KMS (EXPERIMENTAL)`”…”�”}”hj7sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Khhêh²hubhÚ)�”}”(hŒ]Compile and build the kernel for the changes to get reflected. Now, to load the driver, use::”h]”hŒ\Compile and build the kernel for the changes to get reflected. Now, to load the driver, use:”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhêh²hubj)�”}”(hŒsudo modprobe vkms”h]”hŒsudo modprobe vkms”…”�”}”hjSsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K!hhêh²hubhÚ)�”}”(hŒ…On running the lsmod command now, the VKMS driver will appear listed. You can also observe the driver being loaded in the dmesg logs.”h]”hŒ…On running the lsmod command now, the VKMS driver will appear listed. You can also observe the driver being loaded in the dmesg logs.”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K#hhêh²hubhÚ)�”}”(hŒºThe VKMS driver has optional features to simulate different kinds of hardware, which are exposed as module options. You can use the `modinfo` command to see the module options for vkms::”h]”(hŒ„The VKMS driver has optional features to simulate different kinds of hardware, which are exposed as module options. You can use the ”…”�”}”(hjoh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `modinfo`”h]”hŒmodinfo”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjoubhŒ, command to see the module options for vkms:”…”�”}”(hjoh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K&hhêh²hubj)�”}”(hŒ modinfo vkms”h]”hŒ modinfo vkms”…”�”}”hj‘sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K*hhêh²hubhÚ)�”}”(hŒ’Module options are helpful when testing, and enabling modules can be done while loading vkms. For example, to load vkms with cursor enabled, use::”h]”hŒ‘Module options are helpful when testing, and enabling modules can be done while loading vkms. For example, to load vkms with cursor enabled, use:”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K,hhêh²hubj)�”}”(hŒ"sudo modprobe vkms enable_cursor=1”h]”hŒ"sudo modprobe vkms enable_cursor=1”…”�”}”hj­sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K0hhêh²hubhÚ)�”}”(hŒTo disable the driver, use ::”h]”hŒTo disable the driver, use”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K2hhêh²hubj)�”}”(hŒsudo modprobe -r vkms”h]”hŒsudo modprobe -r vkms”…”�”}”hjÉsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K4hhêh²hubeh}”(h]”Œsetup”ah ]”h"]”Œsetup”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒConfiguring With Configfs”h]”hŒConfiguring With Configfs”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjßh²hh³hÃh´K7ubhÚ)�”}”(hŒLIt is possible to create and configure multiple VKMS instances via configfs.”h]”hŒLIt is possible to create and configure multiple VKMS instances via configfs.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K9hjßh²hubhÚ)�”}”(hŒ-Start by mounting configfs and loading VKMS::”h]”hŒ,Start by mounting configfs and loading VKMS:”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K;hjßh²hubj)�”}”(hŒ6sudo mount -t configfs none /config sudo modprobe vkms”h]”hŒ6sudo mount -t configfs none /config sudo modprobe vkms”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K=hjßh²hubhÚ)�”}”(hŒ”Once VKMS is loaded, ``/config/vkms`` is created automatically. Each directory under ``/config/vkms`` represents a VKMS instance, create a new one::”h]”(hŒOnce VKMS is loaded, ”…”�”}”(hjh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``/config/vkms``”h]”hŒ /config/vkms”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjubhŒ0 is created automatically. Each directory under ”…”�”}”(hjh²hh³Nh´Nubj#)�”}”(hŒ``/config/vkms``”h]”hŒ /config/vkms”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjubhŒ. represents a VKMS instance, create a new one:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K@hjßh²hubj)�”}”(hŒsudo mkdir /config/vkms/my-vkms”h]”hŒsudo mkdir /config/vkms/my-vkms”…”�”}”hjNsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´KChjßh²hubhÚ)�”}”(hŒ&By default, the instance is disabled::”h]”hŒ%By default, the instance is disabled:”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KEhjßh²hubj)�”}”(hŒ"cat /config/vkms/my-vkms/enabled 0”h]”hŒ"cat /config/vkms/my-vkms/enabled 0”…”�”}”hjjsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´KGhjßh²hubhÚ)�”}”(hŒPAnd directories are created for each configurable item of the display pipeline::”h]”hŒOAnd directories are created for each configurable item of the display pipeline:”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KJhjßh²hubj)�”}”(hŒttree /config/vkms/my-vkms ├── connectors ├── crtcs ├── enabled ├── encoders └── planes”h]”hŒttree /config/vkms/my-vkms ├── connectors ├── crtcs ├── enabled ├── encoders └── planes”…”�”}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´KLhjßh²hubhÚ)�”}”(hŒ_To add items to the display pipeline, create one or more directories under the available paths.”h]”hŒ_To add items to the display pipeline, create one or more directories under the available paths.”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KShjßh²hubhÚ)�”}”(hŒ&Start by creating one or more planes::”h]”hŒ%Start by creating one or more planes:”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KVhjßh²hubj)�”}”(hŒ-sudo mkdir /config/vkms/my-vkms/planes/plane0”h]”hŒ-sudo mkdir /config/vkms/my-vkms/planes/plane0”…”�”}”hj°sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´KXhjßh²hubhÚ)�”}”(hŒ%Planes have 1 configurable attribute:”h]”hŒ%Planes have 1 configurable attribute:”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KZhjßh²hubhŒ bullet_list”“”)�”}”(hhh]”hŒ list_item”“”)�”}”(hŒrtype: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) ”h]”hÚ)�”}”(hŒqtype: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane)”h]”hŒutype: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the “typeâ€� property of a plane)”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K\hjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjÎh²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jÌh³hÃh´K\hjßh²hubhÚ)�”}”(hŒ(Continue by creating one or more CRTCs::”h]”hŒ'Continue by creating one or more CRTCs:”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K_hjßh²hubj)�”}”(hŒ+sudo mkdir /config/vkms/my-vkms/crtcs/crtc0”h]”hŒ+sudo mkdir /config/vkms/my-vkms/crtcs/crtc0”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Kahjßh²hubhÚ)�”}”(hŒ$CRTCs have 1 configurable attribute:”h]”hŒ$CRTCs have 1 configurable attribute:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kchjßh²hubjÍ)�”}”(hhh]”jÒ)�”}”(hŒKwriteback: Enable or disable writeback connector support by writing 1 or 0 ”h]”hÚ)�”}”(hŒJwriteback: Enable or disable writeback connector support by writing 1 or 0”h]”hŒJwriteback: Enable or disable writeback connector support by writing 1 or 0”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kehj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjh²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´Kehjßh²hubhÚ)�”}”(hŒ#Next, create one or more encoders::”h]”hŒ"Next, create one or more encoders:”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kghjßh²hubj)�”}”(hŒ1sudo mkdir /config/vkms/my-vkms/encoders/encoder0”h]”hŒ1sudo mkdir /config/vkms/my-vkms/encoders/encoder0”…”�”}”hjLsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Kihjßh²hubhÚ)�”}”(hŒ3Last but not least, create one or more connectors::”h]”hŒ2Last but not least, create one or more connectors:”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kkhjßh²hubj)�”}”(hŒ5sudo mkdir /config/vkms/my-vkms/connectors/connector0”h]”hŒ5sudo mkdir /config/vkms/my-vkms/connectors/connector0”…”�”}”hjhsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Kmhjßh²hubhÚ)�”}”(hŒ)Connectors have 1 configurable attribute:”h]”hŒ)Connectors have 1 configurable attribute:”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kohjßh²hubjÍ)�”}”(hhh]”jÒ)�”}”(hŒ‰status: Connection status: 1 connected, 2 disconnected, 3 unknown (same values as those exposed by the "status" property of a connector) ”h]”hÚ)�”}”(hŒˆstatus: Connection status: 1 connected, 2 disconnected, 3 unknown (same values as those exposed by the "status" property of a connector)”h]”hŒŒstatus: Connection status: 1 connected, 2 disconnected, 3 unknown (same values as those exposed by the “statusâ€� property of a connector)”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kqhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj„h²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´Kqhjßh²hubhÚ)�”}”(hŒ@To finish the configuration, link the different pipeline items::”h]”hŒ?To finish the configuration, link the different pipeline items:”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kthjßh²hubj)�”}”(hX.sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/plane0/possible_crtcs sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoders/encoder0/possible_crtcs sudo ln -s /config/vkms/my-vkms/encoders/encoder0 /config/vkms/my-vkms/connectors/connector0/possible_encoders”h]”hX.sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/planes/plane0/possible_crtcs sudo ln -s /config/vkms/my-vkms/crtcs/crtc0 /config/vkms/my-vkms/encoders/encoder0/possible_crtcs sudo ln -s /config/vkms/my-vkms/encoders/encoder0 /config/vkms/my-vkms/connectors/connector0/possible_encoders”…”�”}”hj³sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Kvhjßh²hubhÚ)�”}”(hŒOSince at least one primary plane is required, make sure to set the right type::”h]”hŒNSince at least one primary plane is required, make sure to set the right type:”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kzhjßh²hubj)�”}”(hŒ;echo "1" | sudo tee /config/vkms/my-vkms/planes/plane0/type”h]”hŒ;echo "1" | sudo tee /config/vkms/my-vkms/planes/plane0/type”…”�”}”hjÏsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K|hjßh²hubhÚ)�”}”(hŒ`_ .”h]”(hŒŠThe IGT GPU Tools is a test suite used specifically for debugging and development of the DRM drivers. The IGT Tools can be installed from ”…”�”}”(hjJh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ:`here `_”h]”hŒhere”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œhere”Œrefuri”Œ0https://gitlab.freedesktop.org/drm/igt-gpu-tools”uh1jRhjJubh¶)�”}”(hŒ3 ”h]”h}”(h]”Œhere”ah ]”h"]”Œhere”ah$]”h&]”Œrefuri”jeuh1hµŒ referenced”KhjJubhŒ .”…”�”}”(hjJh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K”hj9h²hubhÚ)�”}”(hŒlThe tests need to be run without a compositor, so you need to switch to text only mode. You can do this by::”h]”hŒkThe tests need to be run without a compositor, so you need to switch to text only mode. You can do this by:”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K™hj9h²hubj)�”}”(hŒ(sudo systemctl isolate multi-user.target”h]”hŒ(sudo systemctl isolate multi-user.target”…”�”}”hjŒsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´Kœhj9h²hubhÚ)�”}”(hŒ!To return to graphical mode, do::”h]”hŒ To return to graphical mode, do:”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kžhj9h²hubj)�”}”(hŒ'sudo systemctl isolate graphical.target”h]”hŒ'sudo systemctl isolate graphical.target”…”�”}”hj¨sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K hj9h²hubhÚ)�”}”(hŒúOnce you are in text only mode, you can run tests using the IGT_FORCE_DRIVER variable to specify the device filter for the driver we want to test. IGT_FORCE_DRIVER can also be used with the run-tests.sh script to run the tests for a specific driver::”h]”hŒùOnce you are in text only mode, you can run tests using the IGT_FORCE_DRIVER variable to specify the device filter for the driver we want to test. IGT_FORCE_DRIVER can also be used with the run-tests.sh script to run the tests for a specific driver:”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K¢hj9h²hubj)�”}”(hŒsudo IGT_FORCE_DRIVER="vkms" ./build/tests/ sudo IGT_FORCE_DRIVER="vkms" ./scripts/run-tests.sh -t ”h]”hŒsudo IGT_FORCE_DRIVER="vkms" ./build/tests/ sudo IGT_FORCE_DRIVER="vkms" ./scripts/run-tests.sh -t ”…”�”}”hjÄsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K§hj9h²hubhÚ)�”}”(hŒdFor example, to test the functionality of the writeback library, we can run the kms_writeback test::”h]”hŒcFor example, to test the functionality of the writeback library, we can run the kms_writeback test:”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kªhj9h²hubj)�”}”(hŒ}sudo IGT_FORCE_DRIVER="vkms" ./build/tests/kms_writeback sudo IGT_FORCE_DRIVER="vkms" ./scripts/run-tests.sh -t kms_writeback”h]”hŒ}sudo IGT_FORCE_DRIVER="vkms" ./build/tests/kms_writeback sudo IGT_FORCE_DRIVER="vkms" ./scripts/run-tests.sh -t kms_writeback”…”�”}”hjàsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K­hj9h²hubhÚ)�”}”(hŒEYou can also run subtests if you do not want to run the entire test::”h]”hŒDYou can also run subtests if you do not want to run the entire test:”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K°hj9h²hubj)�”}”(hŒRsudo IGT_FORCE_DRIVER="vkms" ./build/tests/kms_flip --run-subtest basic-plain-flip”h]”hŒRsudo IGT_FORCE_DRIVER="vkms" ./build/tests/kms_flip --run-subtest basic-plain-flip”…”�”}”hjüsbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K²hj9h²hubeh}”(h]”Œtesting-with-igt”ah ]”h"]”Œtesting with igt”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K’ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒTesting With KUnit”h]”hŒTesting With KUnit”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´KµubhÚ)�”}”(hŒœKUnit (Kernel unit testing framework) provides a common framework for unit tests within the Linux kernel. More information in ../dev-tools/kunit/index.rst .”h]”hŒœKUnit (Kernel unit testing framework) provides a common framework for unit tests within the Linux kernel. More information in ../dev-tools/kunit/index.rst .”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K·hjh²hubhÚ)�”}”(hŒTo run the VKMS KUnit tests::”h]”hŒTo run the VKMS KUnit tests:”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K»hjh²hubj)�”}”(hŒItools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/vkms/tests”h]”hŒItools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/vkms/tests”…”�”}”hj?sbah}”(h]”h ]”h"]”h$]”h&]”j'j(uh1jh³hÃh´K½hjh²hubeh}”(h]”Œtesting-with-kunit”ah ]”h"]”Œtesting with kunit”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KµubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒTODO”h]”hŒTODO”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjUh²hh³hÃh´KÀubhÚ)�”}”(hŒbIf you want to do any of the items listed below, please share your interest with VKMS maintainers.”h]”hŒbIf you want to do any of the items listed below, please share your interest with VKMS maintainers.”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÂhjUh²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒIGT better support”h]”hŒIGT better support”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjth²hh³hÃh´KÆubhÚ)�”}”(hŒ Debugging:”h]”hŒ Debugging:”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÈhjth²hubjÍ)�”}”(hhh]”jÒ)�”}”(hŒHkms_plane: some test cases are failing due to timeout on capturing CRC; ”h]”hÚ)�”}”(hŒGkms_plane: some test cases are failing due to timeout on capturing CRC;”h]”hŒGkms_plane: some test cases are failing due to timeout on capturing CRC;”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÊhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj“h²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´KÊhjth²hubhÚ)�”}”(hŒ$Virtual hardware (vblank-less) mode:”h]”hŒ$Virtual hardware (vblank-less) mode:”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÌhjth²hubjÍ)�”}”(hhh]”jÒ)�”}”(hXVKMS already has support for vblanks simulated via hrtimers, which can be tested with kms_flip test; in some way, we can say that VKMS already mimics the real hardware vblank. However, we also have virtual hardware that does not support vblank interrupt and completes page_flip events right away; in this case, compositor developers may end up creating a busy loop on virtual hardware. It would be useful to support Virtual Hardware behavior in VKMS because this can help compositor developers to test their features in multiple scenarios. ”h]”hÚ)�”}”(hXVKMS already has support for vblanks simulated via hrtimers, which can be tested with kms_flip test; in some way, we can say that VKMS already mimics the real hardware vblank. However, we also have virtual hardware that does not support vblank interrupt and completes page_flip events right away; in this case, compositor developers may end up creating a busy loop on virtual hardware. It would be useful to support Virtual Hardware behavior in VKMS because this can help compositor developers to test their features in multiple scenarios.”h]”hXVKMS already has support for vblanks simulated via hrtimers, which can be tested with kms_flip test; in some way, we can say that VKMS already mimics the real hardware vblank. However, we also have virtual hardware that does not support vblank interrupt and completes page_flip events right away; in this case, compositor developers may end up creating a busy loop on virtual hardware. It would be useful to support Virtual Hardware behavior in VKMS because this can help compositor developers to test their features in multiple scenarios.”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÎhjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjÂh²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´KÎhjth²hubeh}”(h]”Œigt-better-support”ah ]”h"]”Œigt better support”ah$]”h&]”uh1hÄhjUh²hh³hÃh´KÆubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAdd Plane Features”h]”hŒAdd Plane Features”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjëh²hh³hÃh´KØubhÚ)�”}”(hŒ8There's lots of plane features we could add support for:”h]”hŒ:There’s lots of plane features we could add support for:”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÚhjëh²hubjÍ)�”}”(hhh]”(jÒ)�”}”(hŒ8Add background color KMS property[Good to get started]. ”h]”hÚ)�”}”(hŒ7Add background color KMS property[Good to get started].”h]”hŒ7Add background color KMS property[Good to get started].”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÜhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj h²hh³hÃh´NubjÒ)�”}”(hŒ Scaling. ”h]”hÚ)�”}”(hŒScaling.”h]”hŒScaling.”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÞhj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj h²hh³hÃh´NubjÒ)�”}”(hŒ`Additional buffer formats. Low/high bpp RGB formats would be interesting [Good to get started]. ”h]”hÚ)�”}”(hŒ_Additional buffer formats. Low/high bpp RGB formats would be interesting [Good to get started].”h]”hŒ_Additional buffer formats. Low/high bpp RGB formats would be interesting [Good to get started].”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kàhj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj h²hh³hÃh´NubjÒ)�”}”(hŒUAsync updates (currently only possible on cursor plane using the legacy cursor api). ”h]”hÚ)�”}”(hŒTAsync updates (currently only possible on cursor plane using the legacy cursor api).”h]”hŒTAsync updates (currently only possible on cursor plane using the legacy cursor api).”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KãhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´KÜhjëh²hubhÚ)�”}”(hŒ£For all of these, we also want to review the igt test coverage and make sure all relevant igt testcases work on vkms. They are good options for internship project.”h]”hŒ£For all of these, we also want to review the igt test coverage and make sure all relevant igt testcases work on vkms. They are good options for internship project.”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kæhjëh²hubeh}”(h]”Œadd-plane-features”ah ]”h"]”Œadd plane features”ah$]”h&]”uh1hÄhjUh²hh³hÃh´KØubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒRuntime Configuration”h]”hŒRuntime Configuration”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj‰h²hh³hÃh´KëubhÚ)�”}”(hŒuWe want to be able to reconfigure vkms instance without having to reload the module through configfs. Use/Test-cases:”h]”hŒuWe want to be able to reconfigure vkms instance without having to reload the module through configfs. Use/Test-cases:”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kíhj‰h²hubjÍ)�”}”(hhh]”(jÒ)�”}”(hŒ]Hotplug/hotremove connectors on the fly (to be able to test DP MST handling of compositors). ”h]”hÚ)�”}”(hŒ\Hotplug/hotremove connectors on the fly (to be able to test DP MST handling of compositors).”h]”hŒ\Hotplug/hotremove connectors on the fly (to be able to test DP MST handling of compositors).”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kðhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj¨h²hh³hÃh´NubjÒ)�”}”(hŒ`Change output configuration: Plug/unplug screens, change EDID, allow changing the refresh rate. ”h]”hÚ)�”}”(hŒ_Change output configuration: Plug/unplug screens, change EDID, allow changing the refresh rate.”h]”hŒ_Change output configuration: Plug/unplug screens, change EDID, allow changing the refresh rate.”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KóhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj¨h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´Kðhj‰h²hubeh}”(h]”Œruntime-configuration”ah ]”h"]”Œruntime configuration”ah$]”h&]”uh1hÄhjUh²hh³hÃh´KëubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒWriteback support”h]”hŒWriteback support”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjéh²hh³hÃh´K÷ubjÍ)�”}”(hhh]”(jÒ)�”}”(hŒôThe writeback and CRC capture operations share the use of composer_enabled boolean to ensure vblanks. Probably, when these operations work together, composer_enabled needs to refcounting the composer state to proper work. [Good to get started] ”h]”hÚ)�”}”(hŒóThe writeback and CRC capture operations share the use of composer_enabled boolean to ensure vblanks. Probably, when these operations work together, composer_enabled needs to refcounting the composer state to proper work. [Good to get started]”h]”hŒóThe writeback and CRC capture operations share the use of composer_enabled boolean to ensure vblanks. Probably, when these operations work together, composer_enabled needs to refcounting the composer state to proper work. [Good to get started]”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kùhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjúh²hh³hÃh´NubjÒ)�”}”(hŒpAdd support for cloned writeback outputs and related test cases using a cloned output in the IGT kms_writeback. ”h]”hÚ)�”}”(hŒoAdd support for cloned writeback outputs and related test cases using a cloned output in the IGT kms_writeback.”h]”hŒoAdd support for cloned writeback outputs and related test cases using a cloned output in the IGT kms_writeback.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kþhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjúh²hh³hÃh´NubjÒ)�”}”(hŒ‰As a v4l device. This is useful for debugging compositors on special vkms configurations, so that developers see what's really going on. ”h]”hÚ)�”}”(hŒˆAs a v4l device. This is useful for debugging compositors on special vkms configurations, so that developers see what's really going on.”h]”hŒŠAs a v4l device. This is useful for debugging compositors on special vkms configurations, so that developers see what’s really going on.”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjúh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´Kùhjéh²hubeh}”(h]”Œwriteback-support”ah ]”h"]”Œwriteback support”ah$]”h&]”uh1hÄhjUh²hh³hÃh´K÷ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒOutput Features”h]”hŒOutput Features”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjSh²hh³hÃh´MubjÍ)�”}”(hhh]”(jÒ)�”}”(hŒÃVariable refresh rate/freesync support. This probably needs prime buffer sharing support, so that we can use vgem fences to simulate rendering in testing. Also needs support to specify the EDID. ”h]”hÚ)�”}”(hŒÂVariable refresh rate/freesync support. This probably needs prime buffer sharing support, so that we can use vgem fences to simulate rendering in testing. Also needs support to specify the EDID.”h]”hŒÂVariable refresh rate/freesync support. This probably needs prime buffer sharing support, so that we can use vgem fences to simulate rendering in testing. Also needs support to specify the EDID.”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjdh²hh³hÃh´NubjÒ)�”}”(hŒ~Add support for link status, so that compositors can validate their runtime fallbacks when e.g. a Display Port link goes bad. ”h]”hÚ)�”}”(hŒ}Add support for link status, so that compositors can validate their runtime fallbacks when e.g. a Display Port link goes bad.”h]”hŒ}Add support for link status, so that compositors can validate their runtime fallbacks when e.g. a Display Port link goes bad.”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhjdh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´MhjSh²hubeh}”(h]”Œoutput-features”ah ]”h"]”Œoutput features”ah$]”h&]”uh1hÄhjUh²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒCRC API Improvements”h]”hŒCRC API Improvements”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj¥h²hh³hÃh´MubjÍ)�”}”(hhh]”jÒ)�”}”(hŒJOptimize CRC computation ``compute_crc()`` and plane blending ``blend()`` ”h]”hÚ)�”}”(hŒIOptimize CRC computation ``compute_crc()`` and plane blending ``blend()``”h]”(hŒOptimize CRC computation ”…”�”}”(hj½h²hh³Nh´Nubj#)�”}”(hŒ``compute_crc()``”h]”hŒ compute_crc()”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj½ubhŒ and plane blending ”…”�”}”(hj½h²hh³Nh´Nubj#)�”}”(hŒ ``blend()``”h]”hŒblend()”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj½ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÑhj¶h²hh³hÃh´Nubah}”(h]”h ]”h"]”h$]”h&]”jñjòuh1jÌh³hÃh´Mhj¥h²hubeh}”(h]”Œcrc-api-improvements”ah ]”h"]”Œcrc api improvements”ah$]”h&]”uh1hÄhjUh²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAtomic Check using eBPF”h]”hŒAtomic Check using eBPF”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÿh²hh³hÃh´MubhÚ)�”}”(hXøAtomic drivers have lots of restrictions which are not exposed to userspace in any explicit form through e.g. possible property values. Userspace can only inquiry about these limits through the atomic IOCTL, possibly using the TEST_ONLY flag. Trying to add configurable code for all these limits, to allow compositors to be tested against them, would be rather futile exercise. Instead we could add support for eBPF to validate any kind of atomic state, and implement a library of different restrictions.”h]”hXøAtomic drivers have lots of restrictions which are not exposed to userspace in any explicit form through e.g. possible property values. Userspace can only inquiry about these limits through the atomic IOCTL, possibly using the TEST_ONLY flag. Trying to add configurable code for all these limits, to allow compositors to be tested against them, would be rather futile exercise. Instead we could add support for eBPF to validate any kind of atomic state, and implement a library of different restrictions.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjÿh²hubhÚ)�”}”(hŒhThis needs a bunch of features (plane compositing, multiple outputs, ...) enabled already to make sense.”h]”hŒhThis needs a bunch of features (plane compositing, multiple outputs, ...) enabled already to make sense.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjÿh²hubeh}”(h]”Œatomic-check-using-ebpf”ah ]”h"]”Œatomic check using ebpf”ah$]”h&]”uh1hÄhjUh²hh³hÃh´Mubeh}”(h]”Œtodo”ah ]”h"]”Œtodo”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KÀubeh}”(h]”(Œ#drm-vkms-virtual-kernel-modesetting”hÂeh ]”h"]”(Œ#drm/vkms virtual kernel modesetting”Œvkms”eh$]”h&]”uh1hÄhhh²hh³hÃh´KŒexpect_referenced_by_name”}”jBh·sŒexpect_referenced_by_id”}”hÂh·subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÃuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÉNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jlŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÃŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”hÂ]”h·asŒnameids”}”(jBhÂjAj>jÜjÙj6j3jj jojljRjOj9j6jèjåj†jƒjæjãjPjMj¢jŸjüjùj1j.uŒ nametypes”}”(jBˆjA‰j܉j6‰j‰joˆjR‰j9‰jè‰j†‰jæ‰jP‰j¢‰jü‰j1‰uh}”(hÂhÆj>hÆjÙhêj3jßj j9jljfjOjj6jUjåjtjƒjëjãj‰jMjéjŸjSjùj¥j.jÿuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÚ)�”}”(hhh]”hŒ*Hyperlink target "vkms" is not referenced.”…”�”}”hjÖsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjÓubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÃŒline”Kuh1jÑubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.