sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget /translations/zh_CN/gpu/drm-uapimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/zh_TW/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/it_IT/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ja_JP/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ko_KR/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/pt_BR/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/sp_SP/gpu/drm-uapimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h$Copyright 2020 DisplayLink (UK) Ltd.h]h$Copyright 2020 DisplayLink (UK) Ltd.}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh:/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi.rsthKubhsection)}(hhh](htitle)}(hUserland interfacesh]hUserland interfaces}(hhhhhNhNubah}(h]h ]h"]h$]h&]refidid3uh1hhhhhhhhKubh paragraph)}(hXThe DRM core exports several interfaces to applications, generally intended to be used through corresponding libdrm wrapper functions. In addition, drivers export device-specific interfaces for use by userspace drivers & device-aware applications through ioctls and sysfs files.h]hXThe DRM core exports several interfaces to applications, generally intended to be used through corresponding libdrm wrapper functions. In addition, drivers export device-specific interfaces for use by userspace drivers & device-aware applications through ioctls and sysfs files.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hExternal interfaces include: memory mapping, context management, DMA operations, AGP management, vblank control, fence management, memory management, and output management.h]hExternal interfaces include: memory mapping, context management, DMA operations, AGP management, vblank control, fence management, memory management, and output management.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hpCover generic ioctls and sysfs layout here. We only need high-level info, since man pages should cover the rest.h]hpCover generic ioctls and sysfs layout here. We only need high-level info, since man pages should cover the rest.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtopic)}(h Contents h](h)}(hContentsh]hContents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh bullet_list)}(hhh]h list_item)}(hhh](h)}(hhh]h reference)}(hhh]hUserland interfaces}(hj.hhhNhNubah}(h]hah ]h"]h$]h&]refiduserland-interfacesuh1j,hj)ubah}(h]h ]h"]h$]h&]uh1hhj&ubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]hlibdrm Device Lookup}(hjLhhhNhNubah}(h]id4ah ]h"]h$]h&]refidlibdrm-device-lookupuh1j,hjIubah}(h]h ]h"]h$]h&]uh1hhjFubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]h,Primary Nodes, DRM Master and Authentication}(hjnhhhNhNubah}(h]id5ah ]h"]h$]h&]refid+primary-nodes-drm-master-and-authenticationuh1j,hjkubah}(h]h ]h"]h$]h&]uh1hhjhubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]hDRM Display Resource Leasing}(hjhhhNhNubah}(h]id6ah ]h"]h$]h&]refiddrm-display-resource-leasinguh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]h"Open-Source Userspace Requirements}(hjhhhNhNubah}(h]id7ah ]h"]h$]h&]refid"open-source-userspace-requirementsuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]h Render nodes}(hjhhhNhNubah}(h]id8ah ]h"]h$]h&]refid render-nodesuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]hDevice Hot-Unplug}(hjhhhNhNubah}(h]id9ah ]h"]h$]h&]refiddevice-hot-unpluguh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]hRequirements for KMS UAPI}(hjhhhNhNubah}(h]id10ah ]h"]h$]h&]refidrequirements-for-kms-uapiuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hj ubj%)}(hhh]h)}(hhh]j-)}(hhh]h-Requirements for Render and Cross-Device UAPI}(hj7hhhNhNubah}(h]id11ah ]h"]h$]h&]refid-requirements-for-render-and-cross-device-uapiuh1j,hj4ubah}(h]h ]h"]h$]h&]uh1hhj1ubah}(h]h ]h"]h$]h&]uh1j$hj ubj%)}(hhh]h)}(hhh]j-)}(hhh]hRequirements for Memory Maps}(hjYhhhNhNubah}(h]id12ah ]h"]h$]h&]refidrequirements-for-memory-mapsuh1j,hjVubah}(h]h ]h"]h$]h&]uh1hhjSubah}(h]h ]h"]h$]h&]uh1j$hj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]h Device reset}(hjhhhNhNubah}(h]id13ah ]h"]h$]h&]refid device-resetuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]hKernel Mode Driver}(hjhhhNhNubah}(h]id14ah ]h"]h$]h&]refidkernel-mode-driveruh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hUser Mode Driver}(hjhhhNhNubah}(h]id15ah ]h"]h$]h&]refiduser-mode-driveruh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh](h)}(hhh]j-)}(hhh]h Robustness}(hjhhhNhNubah}(h]id16ah ]h"]h$]h&]refid robustnessuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]hOpenGL}(hj hhhNhNubah}(h]id17ah ]h"]h$]h&]refidopengluh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hVulkan}(hj+hhhNhNubah}(h]id18ah ]h"]h$]h&]refidid1uh1j,hj(ubah}(h]h ]h"]h$]h&]uh1hhj%ubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hReporting causes of resets}(hjYhhhNhNubah}(h]id19ah ]h"]h$]h&]refidreporting-causes-of-resetsuh1j,hjVubah}(h]h ]h"]h$]h&]uh1hhjSubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]hDevice Wedging}(hjhhhNhNubah}(h]id20ah ]h"]h$]h&]refiddevice-wedginguh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]hDriver prerequisites}(hjhhhNhNubah}(h]id21ah ]h"]h$]h&]refiddriver-prerequisitesuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hRecovery}(hjhhhNhNubah}(h]id22ah ]h"]h$]h&]refidrecoveryuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]h No Recovery}(hjhhhNhNubah}(h]id23ah ]h"]h$]h&]refid no-recoveryuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hVendor Specific Recovery}(hj hhhNhNubah}(h]id24ah ]h"]h$]h&]refidvendor-specific-recoveryuh1j,hj ubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hTask information}(hj.hhhNhNubah}(h]id25ah ]h"]h$]h&]refidtask-informationuh1j,hj+ubah}(h]h ]h"]h$]h&]uh1hhj(ubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hConsumer prerequisites}(hjPhhhNhNubah}(h]id26ah ]h"]h$]h&]refidconsumer-prerequisitesuh1j,hjMubah}(h]h ]h"]h$]h&]uh1hhjJubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]hExample - rebind}(hjrhhhNhNubah}(h]id27ah ]h"]h$]h&]refidexample-rebinduh1j,hjoubah}(h]h ]h"]h$]h&]uh1hhjlubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hhh]h)}(hhh]j-)}(hhh]h Customization}(hjhhhNhNubah}(h]id28ah ]h"]h$]h&]refid customizationuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]hIOCTL Support on Device Nodes}(hjhhhNhNubah}(h]id29ah ]h"]h$]h&]refidioctl-support-on-device-nodesuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh]j%)}(hhh]h)}(hhh]j-)}(hhh]hRecommended IOCTL Return Values}(hjhhhNhNubah}(h]id30ah ]h"]h$]h&]refidrecommended-ioctl-return-valuesuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]hTesting and validation}(hjhhhNhNubah}(h]id31ah ]h"]h$]h&]refidtesting-and-validationuh1j,hj ubah}(h]h ]h"]h$]h&]uh1hhj ubj )}(hhh](j%)}(hhh]h)}(hhh]j-)}(hhh]h&Testing Requirements for userspace API}(hj.hhhNhNubah}(h]id32ah ]h"]h$]h&]refid&testing-requirements-for-userspace-apiuh1j,hj+ubah}(h]h ]h"]h$]h&]uh1hhj(ubah}(h]h ]h"]h$]h&]uh1j$hj%ubj%)}(hhh]h)}(hhh]j-)}(hhh]hValidating changes with IGT}(hjPhhhNhNubah}(h]id33ah ]h"]h$]h&]refidvalidating-changes-with-igtuh1j,hjMubah}(h]h ]h"]h$]h&]uh1hhjJubah}(h]h ]h"]h$]h&]uh1j$hj%ubj%)}(hhh]h)}(hhh]j-)}(hhh]hUsing VKMS to test DRM API}(hjrhhhNhNubah}(h]id34ah ]h"]h$]h&]refidusing-vkms-to-test-drm-apiuh1j,hjoubah}(h]h ]h"]h$]h&]uh1hhjlubah}(h]h ]h"]h$]h&]uh1j$hj%ubj%)}(hhh]h)}(hhh]j-)}(hhh]hDisplay CRC Support}(hjhhhNhNubah}(h]id35ah ]h"]h$]h&]refiddisplay-crc-supportuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hj%ubj%)}(hhh]h)}(hhh]j-)}(hhh]hDebugfs Support}(hjhhhNhNubah}(h]id36ah ]h"]h$]h&]refiddebugfs-supportuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hj%ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]h Sysfs Support}(hjhhhNhNubah}(h]id37ah ]h"]h$]h&]refid sysfs-supportuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]hVBlank event handling}(hjhhhNhNubah}(h]id38ah ]h"]h$]h&]refidvblank-event-handlinguh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]hUserspace API Structures}(hj(hhhNhNubah}(h]id39ah ]h"]h$]h&]refiduserspace-api-structuresuh1j,hj%ubah}(h]h ]h"]h$]h&]uh1hhj"ubj )}(hhh]j%)}(hhh]h)}(hhh]j-)}(hhh]h CRTC index}(hjGhhhNhNubah}(h]id40ah ]h"]h$]h&]refid crtc-indexuh1j,hjDubah}(h]h ]h"]h$]h&]uh1hhjAubah}(h]h ]h"]h$]h&]uh1j$hj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh]h)}(hhh]j-)}(hhh]hdma-buf interoperability}(hjuhhhNhNubah}(h]id41ah ]h"]h$]h&]refiddma-buf-interoperabilityuh1j,hjrubah}(h]h ]h"]h$]h&]uh1hhjoubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(hhh](h)}(hhh]j-)}(hhh]h Trace events}(hjhhhNhNubah}(h]id42ah ]h"]h$]h&]refid trace-eventsuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubj )}(hhh]j%)}(hhh]h)}(hhh]j-)}(hhh]hStable uAPI events}(hjhhhNhNubah}(h]id43ah ]h"]h$]h&]refidstable-uapi-eventsuh1j,hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j$hjCubeh}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1j$hj!ubah}(h]h ]h"]h$]h&]uh1jhj hhhNhNubeh}(h]contentsah ]contentsah"]contentsah$]h&]uh1j hhhKhhhhubh)}(hhh](h)}(hlibdrm Device Lookuph]hlibdrm Device Lookup}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjUuh1hhjhhhhhKubh)}(h'BEWARE THE DRAGONS! MIND THE TRAPDOORS!h]h'BEWARE THE DRAGONS! MIND THE TRAPDOORS!}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK/hjhhubh)}(hIn an attempt to warn anyone else who's trying to figure out what's going on here, I'll try to summarize the story. First things first, let's clear up the names, because the kernel internals, libdrm and the ioctls are all named differently:h]hIn an attempt to warn anyone else who’s trying to figure out what’s going on here, I’ll try to summarize the story. First things first, let’s clear up the names, because the kernel internals, libdrm and the ioctls are all named differently:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK1hjhhubh block_quote)}(hX- GET_UNIQUE ioctl, implemented by drm_getunique is wrapped up in libdrm through the drmGetBusid function. - The libdrm drmSetBusid function is backed by the SET_UNIQUE ioctl. All that code is nerved in the kernel with drm_invalid_op(). - The internal set_busid kernel functions and driver callbacks are exclusively use by the SET_VERSION ioctl, because only drm 1.0 (which is nerved) allowed userspace to set the busid through the above ioctl. - Other ioctls and functions involved are named consistently. h]j )}(hhh](j%)}(hhGET_UNIQUE ioctl, implemented by drm_getunique is wrapped up in libdrm through the drmGetBusid function.h]h)}(hhGET_UNIQUE ioctl, implemented by drm_getunique is wrapped up in libdrm through the drmGetBusid function.h]hhGET_UNIQUE ioctl, implemented by drm_getunique is wrapped up in libdrm through the drmGetBusid function.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK6hj1ubah}(h]h ]h"]h$]h&]uh1j$hj.ubj%)}(hThe libdrm drmSetBusid function is backed by the SET_UNIQUE ioctl. All that code is nerved in the kernel with drm_invalid_op().h]h)}(hThe libdrm drmSetBusid function is backed by the SET_UNIQUE ioctl. All that code is nerved in the kernel with drm_invalid_op().h]hThe libdrm drmSetBusid function is backed by the SET_UNIQUE ioctl. All that code is nerved in the kernel with drm_invalid_op().}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK8hjJubah}(h]h ]h"]h$]h&]uh1j$hj.ubj%)}(hThe internal set_busid kernel functions and driver callbacks are exclusively use by the SET_VERSION ioctl, because only drm 1.0 (which is nerved) allowed userspace to set the busid through the above ioctl.h]h)}(hThe internal set_busid kernel functions and driver callbacks are exclusively use by the SET_VERSION ioctl, because only drm 1.0 (which is nerved) allowed userspace to set the busid through the above ioctl.h]hThe internal set_busid kernel functions and driver callbacks are exclusively use by the SET_VERSION ioctl, because only drm 1.0 (which is nerved) allowed userspace to set the busid through the above ioctl.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK:hjcubah}(h]h ]h"]h$]h&]uh1j$hj.ubj%)}(hubah}(h]h ]h"]h$]h&]uh1j$hj"ubj%)}(hXTCall GET_UNIQUE, and check whether the unique name has length zero (by checking that the first byte in the string is 0). If that's not the case libdrm skips and proceeds to the next device node. Probably this is just copypasta from drm 1.0 times where a set unique name meant that the driver was in use already, but that's just conjecture. h]h)}(hXSCall GET_UNIQUE, and check whether the unique name has length zero (by checking that the first byte in the string is 0). If that's not the case libdrm skips and proceeds to the next device node. Probably this is just copypasta from drm 1.0 times where a set unique name meant that the driver was in use already, but that's just conjecture.h]hXWCall GET_UNIQUE, and check whether the unique name has length zero (by checking that the first byte in the string is 0). If that’s not the case libdrm skips and proceeds to the next device node. Probably this is just copypasta from drm 1.0 times where a set unique name meant that the driver was in use already, but that’s just conjecture.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chKWhjVubah}(h]h ]h"]h$]h&]uh1j$hj"ubeh}(h]h ]h"]h$]h&]j jjhjjuh1jhjhhhjhNubh)}(hXLong story short: To keep the open by name logic working, GET_UNIQUE must _not_ return a unique string when SET_VERSION hasn't been called yet, otherwise libdrm breaks. Even when that unique string can't ever change, and is totally irrelevant for actually opening the device because runtime assignable device instances were only support in drm 1.0, which is long dead. But the libdrm code in drmOpenByName somehow survived, hence this can't be broken.h]hXLong story short: To keep the open by name logic working, GET_UNIQUE must _not_ return a unique string when SET_VERSION hasn’t been called yet, otherwise libdrm breaks. Even when that unique string can’t ever change, and is totally irrelevant for actually opening the device because runtime assignable device instances were only support in drm 1.0, which is long dead. But the libdrm code in drmOpenByName somehow survived, hence this can’t be broken.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:24: ./drivers/gpu/drm/drm_ioctl.chK]hjhhubhtarget)}(h.. _drm_primary_node:h]h}(h]h ]h"]h$]h&]h݌drm-primary-nodeuh1jhKhjhhhhubeh}(h]j[ah ]h"]libdrm device lookupah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h,Primary Nodes, DRM Master and Authenticationh]h,Primary Nodes, DRM Master and Authentication}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjwuh1hhjhhhhhKubh)}(hX':c:type:`struct drm_master ` is used to track groups of clients with open primary device nodes. For every :c:type:`struct drm_file ` which has had at least once successfully became the device master (either through the SET_MASTER IOCTL, or implicitly through opening the primary device node when no one else is the current master that time) there exists one :c:type:`drm_master`. This is noted in :c:type:`drm_file.is_master `. All other clients have just a pointer to the :c:type:`drm_master` they are associated with.h](h)}(h(:c:type:`struct drm_master `h]hliteral)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](xrefcc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoc gpu/drm-uapi refdomainjreftypetype refexplicitrefwarn reftarget drm_masteruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:33: ./drivers/gpu/drm/drm_auth.chK+hjubhN is used to track groups of clients with open primary device nodes. For every }(hjhhhNhNubh)}(h$:c:type:`struct drm_file `h]j)}(hjh]hstruct drm_file}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjdrm_fileuh1hhjhK+hjubh which has had at least once successfully became the device master (either through the SET_MASTER IOCTL, or implicitly through opening the primary device node when no one else is the current master that time) there exists one }(hjhhhNhNubh)}(h:c:type:`drm_master`h]j)}(hjh]h drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnj drm_masteruh1hhjhK+hjubh. This is noted in }(hjhhhNhNubh)}(h':c:type:`drm_file.is_master `h]j)}(hj h]hdrm_file.is_master}(hj! hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjdrm_fileuh1hhjhK+hjubh/. All other clients have just a pointer to the }(hjhhhNhNubh)}(h:c:type:`drm_master`h]j)}(hjB h]h drm_master}(hjD hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj@ ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnj drm_masteruh1hhjhK+hjubh they are associated with.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK+hjhhubh)}(hXIn addition only one :c:type:`drm_master` can be the current master for a :c:type:`drm_device`. It can be switched through the DROP_MASTER and SET_MASTER IOCTL, or implicitly through closing/opening the primary device node. See also drm_is_current_master().h](hIn addition only one }(hji hhhNhNubh)}(h:c:type:`drm_master`h]j)}(hjs h]h drm_master}(hju hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnj drm_masteruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:33: ./drivers/gpu/drm/drm_auth.chK3hji ubh! can be the current master for a }(hji hhhNhNubh)}(h:c:type:`drm_device`h]j)}(hj h]h drm_device}(hj hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnj drm_deviceuh1hhj hK3hji ubh. It can be switched through the DROP_MASTER and SET_MASTER IOCTL, or implicitly through closing/opening the primary device node. See also drm_is_current_master().}(hji hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hK3hjhhubh)}(hClients can authenticate against the current master (if it matches their own) using the GETMAGIC and AUTHMAGIC IOCTLs. Together with exchanging masters, this allows controlled access to the device for an entire group of mutually trusted clients.h]hClients can authenticate against the current master (if it matches their own) using the GETMAGIC and AUTHMAGIC IOCTLs. Together with exchanging masters, this allows controlled access to the device for an entire group of mutually trusted clients.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:33: ./drivers/gpu/drm/drm_auth.chK8hjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](single"drm_is_current_master (C function)c.drm_is_current_masterhNtauh1j hjhhhNhNubhdesc)}(hhh](hdesc_signature)}(h3bool drm_is_current_master (struct drm_file *fpriv)h]hdesc_signature_line)}(h2bool drm_is_current_master(struct drm_file *fpriv)h](hdesc_sig_keyword_type)}(hboolh]hbool}(hj hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j hj hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKIubhdesc_sig_space)}(h h]h }(hj hhhNhNubah}(h]h ]wah"]h$]h&]uh1j hj hhhj hKIubh desc_name)}(hdrm_is_current_masterh]h desc_sig_name)}(hdrm_is_current_masterh]hdrm_is_current_master}(hj hhhNhNubah}(h]h ]nah"]h$]h&]uh1j hj ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j hj hhhj hKIubhdesc_parameterlist)}(h(struct drm_file *fpriv)h]hdesc_parameter)}(hstruct drm_file *fprivh](hdesc_sig_keyword)}(hstructh]hstruct}(hj? hhhNhNubah}(h]h ]kah"]h$]h&]uh1j= hj9 ubj )}(h h]h }(hjN hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj9 ubh)}(hhh]j )}(hdrm_fileh]hdrm_file}(hj_ hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj\ ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetja modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jz ASTIdentifier)}ju j sbc.drm_is_current_masterasbuh1hhj9 ubj )}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj9 ubhdesc_sig_punctuation)}(h*h]h*}(hj hhhNhNubah}(h]h ]pah"]h$]h&]uh1j hj9 ubj )}(hfprivh]hfpriv}(hj hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj9 ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj3 ubah}(h]h ]h"]h$]h&]hhuh1j1 hj hhhj hKIubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1j sphinx_line_type declaratorhj hhhj hKIubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j hj hKIhj hhubh desc_content)}(hhh]h)}(h-checks whether **priv** is the current masterh](hchecks whether }(hj hhhNhNubhstrong)}(h**priv**h]hpriv}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh is the current master}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKIhj hhubah}(h]h ]h"]h$]h&]uh1j hj hhhj hKIubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypej desctypej noindex noindexentrynocontentsentryuh1j hhhjhNhNubh container)}(hXe**Parameters** ``struct drm_file *fpriv`` DRM file private **Description** Checks whether **fpriv** is current master on its device. This decides whether a client is allowed to run DRM_MASTER IOCTLs. Most of the modern IOCTL which require DRM_MASTER are for kernel modesetting - the current master is assumed to own the non-shareable display hardware.h](h)}(h**Parameters**h]j )}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKMhj ubhdefinition_list)}(hhh]hdefinition_list_item)}(h,``struct drm_file *fpriv`` DRM file private h](hterm)}(h``struct drm_file *fpriv``h]j)}(hj= h]hstruct drm_file *fpriv}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj; ubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKJhj5 ubh definition)}(hhh]h)}(hDRM file privateh]hDRM file private}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR hKJhjU ubah}(h]h ]h"]h$]h&]uh1jS hj5 ubeh}(h]h ]h"]h$]h&]uh1j3 hjR hKJhj0 ubah}(h]h ]h"]h$]h&]uh1j. hj ubh)}(h**Description**h]j )}(hjz h]h Description}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjx ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKLhj ubh)}(h|Checks whether **fpriv** is current master on its device. This decides whether a client is allowed to run DRM_MASTER IOCTLs.h](hChecks whether }(hj hhhNhNubj )}(h **fpriv**h]hfpriv}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhd is current master on its device. This decides whether a client is allowed to run DRM_MASTER IOCTLs.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKKhj ubh)}(hMost of the modern IOCTL which require DRM_MASTER are for kernel modesetting - the current master is assumed to own the non-shareable display hardware.h]hMost of the modern IOCTL which require DRM_MASTER are for kernel modesetting - the current master is assumed to own the non-shareable display hardware.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chKNhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_master_get (C function)c.drm_master_gethNtauh1j hjhhhNhNubj )}(hhh](j )}(h>struct drm_master * drm_master_get (struct drm_master *master)h]j )}(h )}(hjA h]hstruct}(hj hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMnubj )}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hMnubh)}(hhh]j )}(h drm_masterh]h drm_master}(hj hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj modnameN classnameNjy j| )}j ]j )}ju drm_master_getsbc.drm_master_getasbuh1hhj hhhj hMnubj )}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hMnubj )}(hj h]h*}(hj. hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hMnubj )}(hdrm_master_geth]j )}(hj h]hdrm_master_get}(hj? hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj; ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj hhhj hMnubj2 )}(h(struct drm_master *master)h]j8 )}(hstruct drm_master *masterh](j> )}(hjA h]hstruct}(hjZ hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjV ubj )}(h h]h }(hjg hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjV ubh)}(hhh]j )}(h drm_masterh]h drm_master}(hjx hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hju ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjz modnameN classnameNjy j| )}j ]j c.drm_master_getasbuh1hhjV ubj )}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjV ubj )}(hj h]h*}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjV ubj )}(hmasterh]hmaster}(hj hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjV ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjR ubah}(h]h ]h"]h$]h&]hhuh1j1 hj hhhj hMnubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj hhhj hMnubah}(h]j ah ](j j eh"]h$]h&]j j )j huh1j hj hMnhj hhubj )}(hhh]h)}(hreference a master pointerh]hreference a master pointer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMnhj hhubah}(h]h ]h"]h$]h&]uh1j hj hhhj hMnubeh}(h]h ](jfunctioneh"]h$]h&]j jj j j j j j j uh1j hhhjhNhNubj )}(h**Parameters** ``struct drm_master *master`` :c:type:`struct drm_master ` **Description** Increments the reference count of **master** and returns a pointer to **master**.h](h)}(h**Parameters**h]j )}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMrhj ubj/ )}(hhh]j4 )}(hG``struct drm_master *master`` :c:type:`struct drm_master ` h](j: )}(h``struct drm_master *master``h]j)}(hj h]hstruct drm_master *master}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMohj ubjT )}(hhh]h)}(h(:c:type:`struct drm_master `h]h)}(hj7 h]j)}(hj7 h]hstruct drm_master}(hj< hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj9 ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]sbj drm_masteruh1hhj1 hMohj5 ubah}(h]h ]h"]h$]h&]uh1hhj1 hMohj2 ubah}(h]h ]h"]h$]h&]uh1jS hj ubeh}(h]h ]h"]h$]h&]uh1j3 hj1 hMohj ubah}(h]h ]h"]h$]h&]uh1j. hj ubh)}(h**Description**h]j )}(hjt h]h Description}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjr ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMqhj ubh)}(hQIncrements the reference count of **master** and returns a pointer to **master**.h](h"Increments the reference count of }(hj hhhNhNubj )}(h **master**h]hmaster}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh and returns a pointer to }(hj hhhNhNubj )}(h **master**h]hmaster}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMphj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_file_get_master (C function)c.drm_file_get_masterhNtauh1j hjhhhNhNubj )}(hhh](j )}(hDstruct drm_master * drm_file_get_master (struct drm_file *file_priv)h]j )}(hBstruct drm_master *drm_file_get_master(struct drm_file *file_priv)h](j> )}(hjA h]hstruct}(hj hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj hhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chM{ubj )}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hM{ubh)}(hhh]j )}(h drm_masterh]h drm_master}(hj hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj modnameN classnameNjy j| )}j ]j )}ju drm_file_get_mastersbc.drm_file_get_masterasbuh1hhj hhhj hM{ubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hM{ubj )}(hj h]h*}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj hhhj hM{ubj )}(hdrm_file_get_masterh]j )}(hjh]hdrm_file_get_master}(hj<hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj8ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj hhhj hM{ubj2 )}(h(struct drm_file *file_priv)h]j8 )}(hstruct drm_file *file_privh](j> )}(hjA h]hstruct}(hjWhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjSubj )}(h h]h }(hjdhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubh)}(hhh]j )}(hdrm_fileh]hdrm_file}(hjuhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjrubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjwmodnameN classnameNjy j| )}j ]jc.drm_file_get_masterasbuh1hhjSubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(h file_privh]h file_priv}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjOubah}(h]h ]h"]h$]h&]hhuh1j1 hj hhhj hM{ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj hhhj hM{ubah}(h]j ah ](j j eh"]h$]h&]j j )j huh1j hj hM{hj hhubj )}(hhh]h)}(h?reference :c:type:`drm_file.master ` of **file_priv**h](h reference }(hjhhhNhNubh)}(h$:c:type:`drm_file.master `h]j)}(hjh]hdrm_file.master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]jc.drm_file_get_masterasbjdrm_fileuh1hhj hKIhjubh of }(hjhhhNhNubj )}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chM{hjhhubah}(h]h ]h"]h$]h&]uh1j hj hhhj hM{ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j&j j&j j j uh1j hhhjhNhNubj )}(hX**Parameters** ``struct drm_file *file_priv`` DRM file private **Description** Increments the reference count of **file_priv**'s :c:type:`drm_file.master ` and returns the :c:type:`drm_file.master `. If **file_priv** has no :c:type:`drm_file.master `, returns NULL. Master pointers returned from this function should be unreferenced using drm_master_put().h](h)}(h**Parameters**h]j )}(hj0h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhj*ubj/ )}(hhh]j4 )}(h0``struct drm_file *file_priv`` DRM file private h](j: )}(h``struct drm_file *file_priv``h]j)}(hjOh]hstruct drm_file *file_priv}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chM|hjIubjT )}(hhh]h)}(hDRM file privateh]hDRM file private}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhM|hjeubah}(h]h ]h"]h$]h&]uh1jS hjIubeh}(h]h ]h"]h$]h&]uh1j3 hjdhM|hjFubah}(h]h ]h"]h$]h&]uh1j. hj*ubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chM~hj*ubh)}(hIncrements the reference count of **file_priv**'s :c:type:`drm_file.master ` and returns the :c:type:`drm_file.master `. If **file_priv** has no :c:type:`drm_file.master `, returns NULL.h](h"Increments the reference count of }(hjhhhNhNubj )}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh’s }(hjhhhNhNubh)}(h$:c:type:`drm_file.master `h]j)}(hjh]hdrm_file.master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chM}hjubh and returns the }(hjhhhNhNubh)}(h$:c:type:`drm_file.master `h]j)}(hjh]hdrm_file.master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_fileuh1hhjhM}hjubh. If }(hjhhhNhNubj )}(h **file_priv**h]h file_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh has no }(hjhhhNhNubh)}(h$:c:type:`drm_file.master `h]j)}(hjh]hdrm_file.master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_fileuh1hhjhM}hjubh, returns NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM}hj*ubh)}(hZMaster pointers returned from this function should be unreferenced using drm_master_put().h]hZMaster pointers returned from this function should be unreferenced using drm_master_put().}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_master_put (C function)c.drm_master_puthNtauh1j hjhhhNhNubj )}(hhh](j )}(h0void drm_master_put (struct drm_master **master)h]j )}(h/void drm_master_put(struct drm_master **master)h](j )}(hvoidh]hvoid}(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjghhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMubj )}(h h]h }(hjzhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjghhhjyhMubj )}(hdrm_master_puth]j )}(hdrm_master_puth]hdrm_master_put}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjghhhjyhMubj2 )}(h(struct drm_master **master)h]j8 )}(hstruct drm_master **masterh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubh)}(hhh]j )}(h drm_masterh]h drm_master}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjmodnameN classnameNjy j| )}j ]j )}ju jsbc.drm_master_putasbuh1hhjubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj )}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjubah}(h]h ]h"]h$]h&]hhuh1j1 hjghhhjyhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjchhhjyhMubah}(h]j^ah ](j j eh"]h$]h&]j j )j huh1j hjyhMhj`hhubj )}(hhh]h)}(h&unreference and clear a master pointerh]h&unreference and clear a master pointer}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhj5hhubah}(h]h ]h"]h$]h&]uh1j hj`hhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jPj jPj j j uh1j hhhjhNhNubj )}(h**Parameters** ``struct drm_master **master`` pointer to a pointer of :c:type:`struct drm_master ` **Description** This decrements the :c:type:`drm_master` behind **master** and sets it to NULL.h](h)}(h**Parameters**h]j )}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjXubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhjTubj/ )}(hhh]j4 )}(h```struct drm_master **master`` pointer to a pointer of :c:type:`struct drm_master ` h](j: )}(h``struct drm_master **master``h]j)}(hjyh]hstruct drm_master **master}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhjsubjT )}(hhh]h)}(h@pointer to a pointer of :c:type:`struct drm_master `h](hpointer to a pointer of }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjsubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjpubah}(h]h ]h"]h$]h&]uh1j. hjTubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhjTubh)}(hOThis decrements the :c:type:`drm_master` behind **master** and sets it to NULL.h](hThis decrements the }(hjhhhNhNubh)}(h:c:type:`drm_master`h]j)}(hjh]h drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:36: ./drivers/gpu/drm/drm_auth.chMhjubh behind }(hjhhhNhNubj )}(h **master**h]hmaster}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and sets it to NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_master (C struct) c.drm_masterhNtauh1j hjhhhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhNubj )}(hhh](j )}(h drm_masterh]j )}(hstruct drm_masterh](j> )}(hjA h]hstruct}(hjNhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjJhhhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKubj )}(h h]h }(hj\hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjJhhhj[hKubj )}(h drm_masterh]j )}(hjHh]h drm_master}(hjnhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjJhhhj[hKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjFhhhj[hKubah}(h]j@ah ](j j eh"]h$]h&]j j )j huh1j hj[hKhjChhubj )}(hhh]h)}(hdrm master structureh]hdrm master structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK&hjhhubah}(h]h ]h"]h$]h&]uh1j hjChhhj[hKubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjhjBhNubj )}(hXB **Definition**:: struct drm_master { struct kref refcount; struct drm_device *dev; char *unique; int unique_len; struct idr magic_map; void *driver_priv; struct drm_master *lessor; int lessee_id; struct list_head lessee_list; struct list_head lessees; struct idr leases; struct idr lessee_idr; }; **Members** ``refcount`` Refcount for this master object. ``dev`` Link back to the DRM device ``unique`` Unique identifier: e.g. busid. Protected by :c:type:`drm_device.master_mutex `. ``unique_len`` Length of unique field. Protected by :c:type:`drm_device.master_mutex `. ``magic_map`` Map of used authentication tokens. Protected by :c:type:`drm_device.master_mutex `. ``driver_priv`` Pointer to driver-private information. ``lessor`` Lease grantor, only set if this :c:type:`struct drm_master ` represents a lessee holding a lease of objects from **lessor**. Full owners of the device have this set to NULL. The lessor does not change once it's set in drm_lease_create(), and each lessee holds a reference to its lessor that it releases upon being destroyed in drm_lease_destroy(). See also the :ref:`section on display resource leasing `. ``lessee_id`` ID for lessees. Owners (i.e. **lessor** is NULL) always have ID 0. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. ``lessee_list`` List entry of lessees of **lessor**, where they are linked to **lessees**. Not used for owners. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. ``lessees`` List of drm_masters leasing from this one. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. This list is empty if no leases have been granted, or if all lessees have been destroyed. Since lessors are referenced by all their lessees, this master cannot be destroyed unless the list is empty. ``leases`` Objects leased to this drm_master. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. Objects are leased all together in drm_lease_create(), and are removed all together when the lease is revoked. ``lessee_idr`` All lessees under this owner (only used where **lessor** is NULL). Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK*hjubh literal_block)}(hXGstruct drm_master { struct kref refcount; struct drm_device *dev; char *unique; int unique_len; struct idr magic_map; void *driver_priv; struct drm_master *lessor; int lessee_id; struct list_head lessee_list; struct list_head lessees; struct idr leases; struct idr lessee_idr; };h]hXGstruct drm_master { struct kref refcount; struct drm_device *dev; char *unique; int unique_len; struct idr magic_map; void *driver_priv; struct drm_master *lessor; int lessee_id; struct list_head lessee_list; struct list_head lessees; struct idr leases; struct idr lessee_idr; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK,hjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK;hjubj/ )}(hhh](j4 )}(h.``refcount`` Refcount for this master object. h](j: )}(h ``refcount``h]j)}(hjh]hrefcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK)hjubjT )}(hhh]h)}(h Refcount for this master object.h]h Refcount for this master object.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK)hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhK)hjubj4 )}(h$``dev`` Link back to the DRM device h](j: )}(h``dev``h]j)}(hj8h]hdev}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK*hj2ubjT )}(hhh]h)}(hLink back to the DRM deviceh]hLink back to the DRM device}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhK*hjNubah}(h]h ]h"]h$]h&]uh1jS hj2ubeh}(h]h ]h"]h$]h&]uh1j3 hjMhK*hjubj4 )}(hg``unique`` Unique identifier: e.g. busid. Protected by :c:type:`drm_device.master_mutex `. h](j: )}(h ``unique``h]j)}(hjqh]hunique}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK5hjkubjT )}(hhh]h)}(h[Unique identifier: e.g. busid. Protected by :c:type:`drm_device.master_mutex `.h](h,Unique identifier: e.g. busid. Protected by }(hjhhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjh]hdrm_device.master_mutex}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK4hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK4hjubah}(h]h ]h"]h$]h&]uh1jS hjkubeh}(h]h ]h"]h$]h&]uh1j3 hjhK5hjubj4 )}(hd``unique_len`` Length of unique field. Protected by :c:type:`drm_device.master_mutex `. h](j: )}(h``unique_len``h]j)}(hjh]h unique_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK:hjubjT )}(hhh]h)}(hTLength of unique field. Protected by :c:type:`drm_device.master_mutex `.h](h%Length of unique field. Protected by }(hjhhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjh]hdrm_device.master_mutex}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK9hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK9hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhK:hjubj4 )}(hn``magic_map`` Map of used authentication tokens. Protected by :c:type:`drm_device.master_mutex `. h](j: )}(h ``magic_map``h]j)}(hj+h]h magic_map}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK?hj%ubjT )}(hhh]h)}(h_Map of used authentication tokens. Protected by :c:type:`drm_device.master_mutex `.h](h0Map of used authentication tokens. Protected by }(hjDhhhNhNubh)}(h.:c:type:`drm_device.master_mutex `h]j)}(hjNh]hdrm_device.master_mutex}(hjPhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK>hjDubh.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjkhK>hjAubah}(h]h ]h"]h$]h&]uh1jS hj%ubeh}(h]h ]h"]h$]h&]uh1j3 hj@hK?hjubj4 )}(h7``driver_priv`` Pointer to driver-private information. h](j: )}(h``driver_priv``h]j)}(hjh]h driver_priv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK+hjubjT )}(hhh]h)}(h&Pointer to driver-private information.h]h&Pointer to driver-private information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK+hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhK+hjubj4 )}(hX``lessor`` Lease grantor, only set if this :c:type:`struct drm_master ` represents a lessee holding a lease of objects from **lessor**. Full owners of the device have this set to NULL. The lessor does not change once it's set in drm_lease_create(), and each lessee holds a reference to its lessor that it releases upon being destroyed in drm_lease_destroy(). See also the :ref:`section on display resource leasing `. h](j: )}(h ``lessor``h]j)}(hjh]hlessor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKNhjubjT )}(hhh](h)}(hLease grantor, only set if this :c:type:`struct drm_master ` represents a lessee holding a lease of objects from **lessor**. Full owners of the device have this set to NULL.h](h Lease grantor, only set if this }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKEhjubh5 represents a lessee holding a lease of objects from }(hjhhhNhNubj )}(h **lessor**h]hlessor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh2. Full owners of the device have this set to NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKEhjubh)}(hThe lessor does not change once it's set in drm_lease_create(), and each lessee holds a reference to its lessor that it releases upon being destroyed in drm_lease_destroy().h]hThe lessor does not change once it’s set in drm_lease_create(), and each lessee holds a reference to its lessor that it releases upon being destroyed in drm_lease_destroy().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKIhjubh)}(hFSee also the :ref:`section on display resource leasing `.h](h See also the }(hj-hhhNhNubh)}(h8:ref:`section on display resource leasing `h]hinline)}(hj7h]h#section on display resource leasing}(hj;hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj5ubah}(h]h ]h"]h$]h&]refdocj refdomainjEreftyperef refexplicitrefwarnj drm_leasinguh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKMhj-ubh.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjWhKMhjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKNhjubj4 )}(h``lessee_id`` ID for lessees. Owners (i.e. **lessor** is NULL) always have ID 0. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. h](j: )}(h ``lessee_id``h]j)}(hjth]h lessee_id}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKVhjnubjT )}(hhh]h)}(hID for lessees. Owners (i.e. **lessor** is NULL) always have ID 0. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](hID for lessees. Owners (i.e. }(hjhhhNhNubj )}(h **lessor**h]hlessor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh) is NULL) always have ID 0. Protected by }(hjhhhNhNubh)}(h-:c:type:`drm_device.mode_config `h]j)}(hjh]hdrm_device.mode_config}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKUhjubh’s }(hjhhhNhNubh)}(h5:c:type:`drm_mode_config.idr_mutex `h]j)}(hjh]hdrm_mode_config.idr_mutex}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_configuh1hhjhKUhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKUhjubah}(h]h ]h"]h$]h&]uh1jS hjnubeh}(h]h ]h"]h$]h&]uh1j3 hjhKVhjubj4 )}(h``lessee_list`` List entry of lessees of **lessor**, where they are linked to **lessees**. Not used for owners. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. h](j: )}(h``lessee_list``h]j)}(hjh]h lessee_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK_hjubjT )}(hhh]h)}(hList entry of lessees of **lessor**, where they are linked to **lessees**. Not used for owners. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](hList entry of lessees of }(hjhhhNhNubj )}(h **lessor**h]hlessor}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, where they are linked to }(hjhhhNhNubj )}(h **lessees**h]hlessees}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh$. Not used for owners. Protected by }(hjhhhNhNubh)}(h-:c:type:`drm_device.mode_config `h]j)}(hjMh]hdrm_device.mode_config}(hjOhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK]hjubh’s }(hjhhhNhNubh)}(h5:c:type:`drm_mode_config.idr_mutex `h]j)}(hjqh]hdrm_mode_config.idr_mutex}(hjshhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_configuh1hhjjhK]hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjjhK]hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhK_hjubj4 )}(hXs``lessees`` List of drm_masters leasing from this one. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. This list is empty if no leases have been granted, or if all lessees have been destroyed. Since lessors are referenced by all their lessees, this master cannot be destroyed unless the list is empty. h](j: )}(h ``lessees``h]j)}(hjh]hlessees}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKkhjubjT )}(hhh](h)}(hList of drm_masters leasing from this one. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](h8List of drm_masters leasing from this one. Protected by }(hjhhhNhNubh)}(h-:c:type:`drm_device.mode_config `h]j)}(hjh]hdrm_device.mode_config}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKfhjubh’s }(hjhhhNhNubh)}(h5:c:type:`drm_mode_config.idr_mutex `h]j)}(hjh]hdrm_mode_config.idr_mutex}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_configuh1hhjhKfhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKfhjubh)}(hThis list is empty if no leases have been granted, or if all lessees have been destroyed. Since lessors are referenced by all their lessees, this master cannot be destroyed unless the list is empty.h]hThis list is empty if no leases have been granted, or if all lessees have been destroyed. Since lessors are referenced by all their lessees, this master cannot be destroyed unless the list is empty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKihjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKkhjubj4 )}(hX``leases`` Objects leased to this drm_master. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `. Objects are leased all together in drm_lease_create(), and are removed all together when the lease is revoked. h](j: )}(h ``leases``h]j)}(hj9h]hleases}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKvhj3ubjT )}(hhh](h)}(hObjects leased to this drm_master. Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](h0Objects leased to this drm_master. Protected by }(hjRhhhNhNubh)}(h-:c:type:`drm_device.mode_config `h]j)}(hj\h]hdrm_device.mode_config}(hj^hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKrhjRubh’s }(hjRhhhNhNubh)}(h5:c:type:`drm_mode_config.idr_mutex `h]j)}(hjh]hdrm_mode_config.idr_mutex}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_configuh1hhjyhKrhjRubh.}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjyhKrhjOubh)}(hnObjects are leased all together in drm_lease_create(), and are removed all together when the lease is revoked.h]hnObjects are leased all together in drm_lease_create(), and are removed all together when the lease is revoked.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKuhjOubeh}(h]h ]h"]h$]h&]uh1jS hj3ubeh}(h]h ]h"]h$]h&]uh1j3 hjNhKvhjubj4 )}(h``lessee_idr`` All lessees under this owner (only used where **lessor** is NULL). Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](j: )}(h``lessee_idr``h]j)}(hjh]h lessee_idr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK}hjubjT )}(hhh]h)}(hAll lessees under this owner (only used where **lessor** is NULL). Protected by :c:type:`drm_device.mode_config `'s :c:type:`drm_mode_config.idr_mutex `.h](h.All lessees under this owner (only used where }(hjhhhNhNubj )}(h **lessor**h]hlessor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh is NULL). Protected by }(hjhhhNhNubh)}(h-:c:type:`drm_device.mode_config `h]j)}(hjh]hdrm_device.mode_config}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhjhK}hjubh’s }(hjhhhNhNubh)}(h5:c:type:`drm_mode_config.idr_mutex `h]j)}(hj h]hdrm_mode_config.idr_mutex}(hj"hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_configuh1hhjhK}hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK}hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhK}hjubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhjBhNubh)}(h**Description**h]j )}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj`ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhKhjhhubh)}(hNote that master structures are only relevant for the legacy/primary device nodes, hence there can only be one per device, not one per drm_minor.h]hNote that master structures are only relevant for the legacy/primary device nodes, hence there can only be one per device, not one per drm_minor.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:39: ./include/drm/drm_auth.hhK+hjhhubj)}(h.. _drm_leasing:h]h}(h]h ]h"]h$]h&]h݌ drm-leasinguh1jhK+hjhhhhubeh}(h](j}jeh ]h"](,primary nodes, drm master and authenticationdrm_primary_nodeeh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jjsexpect_referenced_by_id}jjsubh)}(hhh](h)}(hDRM Display Resource Leasingh]hDRM Display Resource Leasing}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhK.ubh)}(hDRM leases provide information about whether a DRM master may control a DRM mode setting object. This enables the creation of multiple DRM masters that manage subsets of display resources.h]hDRM leases provide information about whether a DRM master may control a DRM mode setting object. This enables the creation of multiple DRM masters that manage subsets of display resources.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chKhjhhubh)}(hXIThe original DRM master of a device 'owns' the available drm resources. It may create additional DRM masters and 'lease' resources which it controls to the new DRM master. This gives the new DRM master control over the leased resources until the owner revokes the lease, or the new DRM master is closed. Some helpful terminology:h]hXQThe original DRM master of a device ‘owns’ the available drm resources. It may create additional DRM masters and ‘lease’ resources which it controls to the new DRM master. This gives the new DRM master control over the leased resources until the owner revokes the lease, or the new DRM master is closed. Some helpful terminology:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chKhjhhubj )}(hhh](j%)}(hX2An 'owner' is a :c:type:`struct drm_master ` that is not leasing objects from another :c:type:`struct drm_master `, and hence 'owns' the objects. The owner can be identified as the :c:type:`struct drm_master ` for which :c:type:`drm_master.lessor ` is NULL. h]h)}(hX1An 'owner' is a :c:type:`struct drm_master ` that is not leasing objects from another :c:type:`struct drm_master `, and hence 'owns' the objects. The owner can be identified as the :c:type:`struct drm_master ` for which :c:type:`drm_master.lessor ` is NULL.h](hAn ‘owner’ is a }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chKhjubh* that is not leasing objects from another }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhKhjubhG, and hence ‘owns’ the objects. The owner can be identified as the }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hj%h]hstruct drm_master}(hj'hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhKhjubh for which }(hjhhhNhNubh)}(h(:c:type:`drm_master.lessor `h]j)}(hjHh]hdrm_master.lessor}(hjJhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhKhjubh is NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hA 'lessor' is a :c:type:`struct drm_master ` which is leasing objects to one or more other :c:type:`struct drm_master `. Currently, lessees are not allowed to create sub-leases, hence the lessor is the same as the owner. h]h)}(hA 'lessor' is a :c:type:`struct drm_master ` which is leasing objects to one or more other :c:type:`struct drm_master `. Currently, lessees are not allowed to create sub-leases, hence the lessor is the same as the owner.h](hA ‘lessor’ is a }(hjyhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK!hjyubh/ which is leasing objects to one or more other }(hjyhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhK!hjyubhe. Currently, lessees are not allowed to create sub-leases, hence the lessor is the same as the owner.}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK!hjuubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hXVA 'lessee' is a :c:type:`struct drm_master ` which is leasing objects from some other :c:type:`struct drm_master `. Each lessee only leases resources from a single lessor recorded in :c:type:`drm_master.lessor `, and holds the set of objects that it is leasing in :c:type:`drm_master.leases `. h]h)}(hXUA 'lessee' is a :c:type:`struct drm_master ` which is leasing objects from some other :c:type:`struct drm_master `. Each lessee only leases resources from a single lessor recorded in :c:type:`drm_master.lessor `, and holds the set of objects that it is leasing in :c:type:`drm_master.leases `.h](hA ‘lessee’ is a }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK%hjubh* which is leasing objects from some other }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhK%hjubhE. Each lessee only leases resources from a single lessor recorded in }(hjhhhNhNubh)}(h(:c:type:`drm_master.lessor `h]j)}(hj)h]hdrm_master.lessor}(hj+hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhK%hjubh5, and holds the set of objects that it is leasing in }(hjhhhNhNubh)}(h(:c:type:`drm_master.leases `h]j)}(hjLh]hdrm_master.leases}(hjNhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhjhK%hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK%hjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(hXA 'lease' is a contract between the lessor and lessee that identifies which resources may be controlled by the lessee. All of the resources that are leased must be owned by or leased to the lessor, and lessors are not permitted to lease the same object to multiple lessees. h]h)}(hXA 'lease' is a contract between the lessor and lessee that identifies which resources may be controlled by the lessee. All of the resources that are leased must be owned by or leased to the lessor, and lessors are not permitted to lease the same object to multiple lessees.h]hXA ‘lease’ is a contract between the lessor and lessee that identifies which resources may be controlled by the lessee. All of the resources that are leased must be owned by or leased to the lessor, and lessors are not permitted to lease the same object to multiple lessees.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK*hjyubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjhhubh)}(hThe set of objects any :c:type:`struct drm_master ` 'controls' is limited to the set of objects it leases (for lessees) or all objects (for owners).h](hThe set of objects any }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK/hjubhe ‘controls’ is limited to the set of objects it leases (for lessees) or all objects (for owners).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK/hjhhubh)}(hXSObjects not controlled by a :c:type:`struct drm_master ` cannot be modified through the various state manipulating ioctls, and any state reported back to user space will be edited to make them appear idle and/or unusable. For instance, connectors always report 'disconnected', while encoders report no possible crtcs or clones.h](hObjects not controlled by a }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK2hjubhX cannot be modified through the various state manipulating ioctls, and any state reported back to user space will be edited to make them appear idle and/or unusable. For instance, connectors always report ‘disconnected’, while encoders report no possible crtcs or clones.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK2hjhhubh)}(hXSince each lessee may lease objects from a single lessor, display resource leases form a tree of :c:type:`struct drm_master `. As lessees are currently not allowed to create sub-leases, the tree depth is limited to 1. All of these get activated simultaneously when the top level device owner changes through the SETMASTER or DROPMASTER IOCTL, so :c:type:`drm_device.master ` points to the owner at the top of the lease tree (i.e. the :c:type:`struct drm_master ` for which :c:type:`drm_master.lessor ` is NULL). The full list of lessees that are leasing objects from the owner can be searched via the owner's :c:type:`drm_master.lessee_idr `.h](haSince each lessee may lease objects from a single lessor, display resource leases form a tree of }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjh]hstruct drm_master}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhX/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:48: ./drivers/gpu/drm/drm_lease.chK8hjubh. As lessees are currently not allowed to create sub-leases, the tree depth is limited to 1. All of these get activated simultaneously when the top level device owner changes through the SETMASTER or DROPMASTER IOCTL, so }(hjhhhNhNubh)}(h(:c:type:`drm_device.master `h]j)}(hj*h]hdrm_device.master}(hj,hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhj#hK8hjubh< points to the owner at the top of the lease tree (i.e. the }(hjhhhNhNubh)}(h(:c:type:`struct drm_master `h]j)}(hjMh]hstruct drm_master}(hjOhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhj#hK8hjubh for which }(hjhhhNhNubh)}(h(:c:type:`drm_master.lessor `h]j)}(hjph]hdrm_master.lessor}(hjrhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhj#hK8hjubhn is NULL). The full list of lessees that are leasing objects from the owner can be searched via the owner’s }(hjhhhNhNubh)}(h,:c:type:`drm_master.lessee_idr `h]j)}(hjh]hdrm_master.lessee_idr}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_masteruh1hhj#hK8hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj#hK8hjhhubeh}(h](jjeh ]h"](drm display resource leasing drm_leasingeh$]h&]uh1hhhhhhhhK.j}jjsj}jjsubh)}(hhh](h)}(h"Open-Source Userspace Requirementsh]h"Open-Source Userspace Requirements}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhK4ubh)}(hThe DRM subsystem has stricter requirements than most other kernel subsystems on what the userspace side for new uAPI needs to look like. This section here explains what exactly those requirements are, and why they exist.h]hThe DRM subsystem has stricter requirements than most other kernel subsystems on what the userspace side for new uAPI needs to look like. This section here explains what exactly those requirements are, and why they exist.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubh)}(hThe short summary is that any addition of DRM uAPI requires corresponding open-sourced userspace patches, and those patches must be reviewed and ready for merging into a suitable and canonical upstream project.h]hThe short summary is that any addition of DRM uAPI requires corresponding open-sourced userspace patches, and those patches must be reviewed and ready for merging into a suitable and canonical upstream project.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubh)}(hXXGFX devices (both display and render/GPU side) are really complex bits of hardware, with userspace and kernel by necessity having to work together really closely. The interfaces, for rendering and modesetting, must be extremely wide and flexible, and therefore it is almost always impossible to precisely define them for every possible corner case. This in turn makes it really practically infeasible to differentiate between behaviour that's required by userspace, and which must not be changed to avoid regressions, and behaviour which is only an accidental artifact of the current implementation.h]hXZGFX devices (both display and render/GPU side) are really complex bits of hardware, with userspace and kernel by necessity having to work together really closely. The interfaces, for rendering and modesetting, must be extremely wide and flexible, and therefore it is almost always impossible to precisely define them for every possible corner case. This in turn makes it really practically infeasible to differentiate between behaviour that’s required by userspace, and which must not be changed to avoid regressions, and behaviour which is only an accidental artifact of the current implementation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hjhhubh)}(hXeWithout access to the full source code of all userspace users that means it becomes impossible to change the implementation details, since userspace could depend upon the accidental behaviour of the current implementation in minute details. And debugging such regressions without access to source code is pretty much impossible. As a consequence this means:h]hXeWithout access to the full source code of all userspace users that means it becomes impossible to change the implementation details, since userspace could depend upon the accidental behaviour of the current implementation in minute details. And debugging such regressions without access to source code is pretty much impossible. As a consequence this means:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjhhubj )}(hhh](j%)}(hX~The Linux kernel's "no regression" policy holds in practice only for open-source userspace of the DRM subsystem. DRM developers are perfectly fine if closed-source blob drivers in userspace use the same uAPI as the open drivers, but they must do so in the exact same way as the open drivers. Creative (ab)use of the interfaces will, and in the past routinely has, lead to breakage. h]h)}(hX}The Linux kernel's "no regression" policy holds in practice only for open-source userspace of the DRM subsystem. DRM developers are perfectly fine if closed-source blob drivers in userspace use the same uAPI as the open drivers, but they must do so in the exact same way as the open drivers. Creative (ab)use of the interfaces will, and in the past routinely has, lead to breakage.h]hXThe Linux kernel’s “no regression” policy holds in practice only for open-source userspace of the DRM subsystem. DRM developers are perfectly fine if closed-source blob drivers in userspace use the same uAPI as the open drivers, but they must do so in the exact same way as the open drivers. Creative (ab)use of the interfaces will, and in the past routinely has, lead to breakage.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjubah}(h]h ]h"]h$]h&]uh1j$hj hhhhhNubj%)}(h^Any new userspace interface must have an open-source implementation as demonstration vehicle. h]h)}(h]Any new userspace interface must have an open-source implementation as demonstration vehicle.h]h]Any new userspace interface must have an open-source implementation as demonstration vehicle.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThj(ubah}(h]h ]h"]h$]h&]uh1j$hj hhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhKMhjhhubh)}(hX`The other reason for requiring open-source userspace is uAPI review. Since the kernel and userspace parts of a GFX stack must work together so closely, code review can only assess whether a new interface achieves its goals by looking at both sides. Making sure that the interface indeed covers the use-case fully leads to a few additional requirements:h]hX`The other reason for requiring open-source userspace is uAPI review. Since the kernel and userspace parts of a GFX stack must work together so closely, code review can only assess whether a new interface achieves its goals by looking at both sides. Making sure that the interface indeed covers the use-case fully leads to a few additional requirements:}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjhhubj )}(hhh](j%)}(hXThe open-source userspace must not be a toy/test application, but the real thing. Specifically it needs to handle all the usual error and corner cases. These are often the places where new uAPI falls apart and hence essential to assess the fitness of a proposed interface. h]h)}(hXThe open-source userspace must not be a toy/test application, but the real thing. Specifically it needs to handle all the usual error and corner cases. These are often the places where new uAPI falls apart and hence essential to assess the fitness of a proposed interface.h]hXThe open-source userspace must not be a toy/test application, but the real thing. Specifically it needs to handle all the usual error and corner cases. These are often the places where new uAPI falls apart and hence essential to assess the fitness of a proposed interface.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjWubah}(h]h ]h"]h$]h&]uh1j$hjThhhhhNubj%)}(hXThe userspace side must be fully reviewed and tested to the standards of that userspace project. For e.g. mesa this means piglit testcases and review on the mailing list. This is again to ensure that the new interface actually gets the job done. The userspace-side reviewer should also provide an Acked-by on the kernel uAPI patch indicating that they believe the proposed uAPI is sound and sufficiently documented and validated for userspace's consumption. h]h)}(hXThe userspace side must be fully reviewed and tested to the standards of that userspace project. For e.g. mesa this means piglit testcases and review on the mailing list. This is again to ensure that the new interface actually gets the job done. The userspace-side reviewer should also provide an Acked-by on the kernel uAPI patch indicating that they believe the proposed uAPI is sound and sufficiently documented and validated for userspace's consumption.h]hXThe userspace side must be fully reviewed and tested to the standards of that userspace project. For e.g. mesa this means piglit testcases and review on the mailing list. This is again to ensure that the new interface actually gets the job done. The userspace-side reviewer should also provide an Acked-by on the kernel uAPI patch indicating that they believe the proposed uAPI is sound and sufficiently documented and validated for userspace’s consumption.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjoubah}(h]h ]h"]h$]h&]uh1j$hjThhhhhNubj%)}(hThe userspace patches must be against the canonical upstream, not some vendor fork. This is to make sure that no one cheats on the review and testing requirements by doing a quick fork. h]h)}(hThe userspace patches must be against the canonical upstream, not some vendor fork. This is to make sure that no one cheats on the review and testing requirements by doing a quick fork.h]hThe userspace patches must be against the canonical upstream, not some vendor fork. This is to make sure that no one cheats on the review and testing requirements by doing a quick fork.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjubah}(h]h ]h"]h$]h&]uh1j$hjThhhhhNubj%)}(hX2The kernel patch can only be merged after all the above requirements are met, but it **must** be merged to either drm-next or drm-misc-next **before** the userspace patches land. uAPI always flows from the kernel, doing things the other way round risks divergence of the uAPI definitions and header files. h]h)}(hX1The kernel patch can only be merged after all the above requirements are met, but it **must** be merged to either drm-next or drm-misc-next **before** the userspace patches land. uAPI always flows from the kernel, doing things the other way round risks divergence of the uAPI definitions and header files.h](hUThe kernel patch can only be merged after all the above requirements are met, but it }(hjhhhNhNubj )}(h**must**h]hmust}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/ be merged to either drm-next or drm-misc-next }(hjhhhNhNubj )}(h **before**h]hbefore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh the userspace patches land. uAPI always flows from the kernel, doing things the other way round risks divergence of the uAPI definitions and header files.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhjubah}(h]h ]h"]h$]h&]uh1j$hjThhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhK]hjhhubh)}(hXVThese are fairly steep requirements, but have grown out from years of shared pain and experience with uAPI added hastily, and almost always regretted about just as fast. GFX devices change really fast, requiring a paradigm shift and entire new set of uAPI interfaces every few years at least. Together with the Linux kernel's guarantee to keep existing userspace running for 10+ years this is already rather painful for the DRM subsystem, with multiple different uAPIs for the same thing co-existing. If we add a few more complete mistakes into the mix every year it would be entirely unmanageable.h]hXXThese are fairly steep requirements, but have grown out from years of shared pain and experience with uAPI added hastily, and almost always regretted about just as fast. GFX devices change really fast, requiring a paradigm shift and entire new set of uAPI interfaces every few years at least. Together with the Linux kernel’s guarantee to keep existing userspace running for 10+ years this is already rather painful for the DRM subsystem, with multiple different uAPIs for the same thing co-existing. If we add a few more complete mistakes into the mix every year it would be entirely unmanageable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjhhubh)}(hThe DRM subsystem has however no concern with independent closed-source userspace implementations. To officialize that position, the DRM uAPI headers are covered by the MIT license.h]hThe DRM subsystem has however no concern with independent closed-source userspace implementations. To officialize that position, the DRM uAPI headers are covered by the MIT license.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjhhubj)}(h.. _drm_render_node:h]h}(h]h ]h"]h$]h&]h݌drm-render-nodeuh1jhKhjhhhhubeh}(h]jah ]h"]"open-source userspace requirementsah$]h&]uh1hhhhhhhhK4ubh)}(hhh](h)}(h Render nodesh]h Render nodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhKubh)}(hXBDRM core provides multiple character-devices for user-space to use. Depending on which device is opened, user-space can perform a different set of operations (mainly ioctls). The primary node is always created and called card. Additionally, a currently unused control node, called controlD is also created. The primary node provides all legacy operations and historically was the only interface used by userspace. With KMS, the control node was introduced. However, the planned KMS control interface has never been written and so the control node stays unused to date.h]hXBDRM core provides multiple character-devices for user-space to use. Depending on which device is opened, user-space can perform a different set of operations (mainly ioctls). The primary node is always created and called card. Additionally, a currently unused control node, called controlD is also created. The primary node provides all legacy operations and historically was the only interface used by userspace. With KMS, the control node was introduced. However, the planned KMS control interface has never been written and so the control node stays unused to date.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXWith the increased use of offscreen renderers and GPGPU applications, clients no longer require running compositors or graphics servers to make use of a GPU. But the DRM API required unprivileged clients to authenticate to a DRM-Master prior to getting GPU access. To avoid this step and to grant clients GPU access without authenticating, render nodes were introduced. Render nodes solely serve render clients, that is, no modesetting or privileged ioctls can be issued on render nodes. Only non-global rendering commands are allowed. If a driver supports render nodes, it must advertise it via the DRIVER_RENDER DRM driver capability. If not supported, the primary node must be used for render clients together with the legacy drmAuth authentication procedure.h]hXWith the increased use of offscreen renderers and GPGPU applications, clients no longer require running compositors or graphics servers to make use of a GPU. But the DRM API required unprivileged clients to authenticate to a DRM-Master prior to getting GPU access. To avoid this step and to grant clients GPU access without authenticating, render nodes were introduced. Render nodes solely serve render clients, that is, no modesetting or privileged ioctls can be issued on render nodes. Only non-global rendering commands are allowed. If a driver supports render nodes, it must advertise it via the DRIVER_RENDER DRM driver capability. If not supported, the primary node must be used for render clients together with the legacy drmAuth authentication procedure.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX If a driver advertises render node support, DRM core will create a separate render node called renderD. There will be one render node per device. No ioctls except PRIME-related ioctls will be allowed on this node. Especially GEM_OPEN will be explicitly prohibited. For a complete list of driver-independent ioctls that can be used on render nodes, see the ioctls marked DRM_RENDER_ALLOW in drm_ioctl.c Render nodes are designed to avoid the buffer-leaks, which occur if clients guess the flink names or mmap offsets on the legacy interface. Additionally to this basic interface, drivers must mark their driver-dependent render-only ioctls as DRM_RENDER_ALLOW so render clients can use them. Driver authors must be careful not to allow any privileged ioctls on render nodes.h]hX If a driver advertises render node support, DRM core will create a separate render node called renderD. There will be one render node per device. No ioctls except PRIME-related ioctls will be allowed on this node. Especially GEM_OPEN will be explicitly prohibited. For a complete list of driver-independent ioctls that can be used on render nodes, see the ioctls marked DRM_RENDER_ALLOW in drm_ioctl.c Render nodes are designed to avoid the buffer-leaks, which occur if clients guess the flink names or mmap offsets on the legacy interface. Additionally to this basic interface, drivers must mark their driver-dependent render-only ioctls as DRM_RENDER_ALLOW so render clients can use them. Driver authors must be careful not to allow any privileged ioctls on render nodes.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXWith render nodes, user-space can now control access to the render node via basic file-system access-modes. A running graphics server which authenticates clients on the privileged primary/legacy node is no longer required. Instead, a client can open the render node and is immediately granted GPU access. Communication between clients (or servers) is done via PRIME. FLINK from render node to legacy node is not supported. New clients must not use the insecure FLINK interface.h]hXWith render nodes, user-space can now control access to the render node via basic file-system access-modes. A running graphics server which authenticates clients on the privileged primary/legacy node is no longer required. Instead, a client can open the render node and is immediately granted GPU access. Communication between clients (or servers) is done via PRIME. FLINK from render node to legacy node is not supported. New clients must not use the insecure FLINK interface.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX Besides dropping all modeset/global ioctls, render nodes also drop the DRM-Master concept. There is no reason to associate render clients with a DRM-Master as they are independent of any graphics server. Besides, they must work without any running master, anyway. Drivers must be able to run without a master object if they support render nodes. If, on the other hand, a driver requires shared state between clients which is visible to user-space and accessible beyond open-file boundaries, they cannot support render nodes.h]hX Besides dropping all modeset/global ioctls, render nodes also drop the DRM-Master concept. There is no reason to associate render clients with a DRM-Master as they are independent of any graphics server. Besides, they must work without any running master, anyway. Drivers must be able to run without a master object if they support render nodes. If, on the other hand, a driver requires shared state between clients which is visible to user-space and accessible beyond open-file boundaries, they cannot support render nodes.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h](jjeh ]h"]( render nodesdrm_render_nodeeh$]h&]uh1hhhhhhhhKj}jkjsj}jjsubh)}(hhh](h)}(hDevice Hot-Unplugh]hDevice Hot-Unplug}(hjshhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjphhhhhKubhnote)}(hFThe following is the plan. Implementation is not there yet (2020 May).h]h)}(hFThe following is the plan. Implementation is not there yet (2020 May).h]hFThe following is the plan. Implementation is not there yet (2020 May).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjphhhhhNubh)}(hXGraphics devices (display and/or render) may be connected via USB (e.g. display adapters or docking stations) or Thunderbolt (e.g. eGPU). An end user is able to hot-unplug this kind of devices while they are being used, and expects that the very least the machine does not crash. Any damage from hot-unplugging a DRM device needs to be limited as much as possible and userspace must be given the chance to handle it if it wants to. Ideally, unplugging a DRM device still lets a desktop continue to run, but that is going to need explicit support throughout the whole graphics stack: from kernel and userspace drivers, through display servers, via window system protocols, and in applications and libraries.h]hXGraphics devices (display and/or render) may be connected via USB (e.g. display adapters or docking stations) or Thunderbolt (e.g. eGPU). An end user is able to hot-unplug this kind of devices while they are being used, and expects that the very least the machine does not crash. Any damage from hot-unplugging a DRM device needs to be limited as much as possible and userspace must be given the chance to handle it if it wants to. Ideally, unplugging a DRM device still lets a desktop continue to run, but that is going to need explicit support throughout the whole graphics stack: from kernel and userspace drivers, through display servers, via window system protocols, and in applications and libraries.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hOther scenarios that should lead to the same are: unrecoverable GPU crash, PCI device disappearing off the bus, or forced unbind of a driver from the physical device.h]hOther scenarios that should lead to the same are: unrecoverable GPU crash, PCI device disappearing off the bus, or forced unbind of a driver from the physical device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hXoIn other words, from userspace perspective everything needs to keep on working more or less, until userspace stops using the disappeared DRM device and closes it completely. Userspace will learn of the device disappearance from the device removed uevent, ioctls returning ENODEV (or driver-specific ioctls returning driver-specific things), or open() returning ENXIO.h]hXoIn other words, from userspace perspective everything needs to keep on working more or less, until userspace stops using the disappeared DRM device and closes it completely. Userspace will learn of the device disappearance from the device removed uevent, ioctls returning ENODEV (or driver-specific ioctls returning driver-specific things), or open() returning ENXIO.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hXOnly after userspace has closed all relevant DRM device and dmabuf file descriptors and removed all mmaps, the DRM driver can tear down its instance for the device that no longer exists. If the same physical device somehow comes back in the mean time, it shall be a new DRM device.h]hXOnly after userspace has closed all relevant DRM device and dmabuf file descriptors and removed all mmaps, the DRM driver can tear down its instance for the device that no longer exists. If the same physical device somehow comes back in the mean time, it shall be a new DRM device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hSimilar to PIDs, chardev minor numbers are not recycled immediately. A new DRM device always picks the next free minor number compared to the previous one allocated, and wraps around when minor numbers are exhausted.h]hSimilar to PIDs, chardev minor numbers are not recycled immediately. A new DRM device always picks the next free minor number compared to the previous one allocated, and wraps around when minor numbers are exhausted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hOThe goal raises at least the following requirements for the kernel and drivers.h]hOThe goal raises at least the following requirements for the kernel and drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubh)}(hhh](h)}(hRequirements for KMS UAPIh]hRequirements for KMS UAPI}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhKubj )}(hhh](j%)}(h9KMS connectors must change their status to disconnected. h]h)}(h8KMS connectors must change their status to disconnected.h]h8KMS connectors must change their status to disconnected.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hLegacy modesets and pageflips, and atomic commits, both real and TEST_ONLY, and any other ioctls either fail with ENODEV or fake success. h]h)}(hLegacy modesets and pageflips, and atomic commits, both real and TEST_ONLY, and any other ioctls either fail with ENODEV or fake success.h]hLegacy modesets and pageflips, and atomic commits, both real and TEST_ONLY, and any other ioctls either fail with ENODEV or fake success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hPending non-blocking KMS operations deliver the DRM events userspace is expecting. This applies also to ioctls that faked success. h]h)}(hPending non-blocking KMS operations deliver the DRM events userspace is expecting. This applies also to ioctls that faked success.h]hPending non-blocking KMS operations deliver the DRM events userspace is expecting. This applies also to ioctls that faked success.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj3ubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hVopen() on a device node whose underlying device has disappeared will fail with ENXIO. h]h)}(hUopen() on a device node whose underlying device has disappeared will fail with ENXIO.h]hUopen() on a device node whose underlying device has disappeared will fail with ENXIO.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjKubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hAttempting to create a DRM lease on a disappeared DRM device will fail with ENODEV. Existing DRM leases remain and work as listed above. h]h)}(hAttempting to create a DRM lease on a disappeared DRM device will fail with ENODEV. Existing DRM leases remain and work as listed above.h]hAttempting to create a DRM lease on a disappeared DRM device will fail with ENODEV. Existing DRM leases remain and work as listed above.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjcubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]j$ah ]h"]requirements for kms uapiah$]h&]uh1hhjphhhhhKubh)}(hhh](h)}(h-Requirements for Render and Cross-Device UAPIh]h-Requirements for Render and Cross-Device UAPI}(hjhhhNhNubah}(h]h ]h"]h$]h&]hj@uh1hhjhhhhhKubj )}(hhh](j%)}(hAll GPU jobs that can no longer run must have their fences force-signalled to avoid inflicting hangs on userspace. The associated error code is ENODEV. h]h)}(hAll GPU jobs that can no longer run must have their fences force-signalled to avoid inflicting hangs on userspace. The associated error code is ENODEV.h]hAll GPU jobs that can no longer run must have their fences force-signalled to avoid inflicting hangs on userspace. The associated error code is ENODEV.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hXaSome userspace APIs already define what should happen when the device disappears (OpenGL, GL ES: `GL_KHR_robustness`_; `Vulkan`_: VK_ERROR_DEVICE_LOST; etc.). DRM drivers are free to implement this behaviour the way they see best, e.g. returning failures in driver-specific ioctls and handling those in userspace drivers, or rely on uevents, and so on. h]h)}(hX`Some userspace APIs already define what should happen when the device disappears (OpenGL, GL ES: `GL_KHR_robustness`_; `Vulkan`_: VK_ERROR_DEVICE_LOST; etc.). DRM drivers are free to implement this behaviour the way they see best, e.g. returning failures in driver-specific ioctls and handling those in userspace drivers, or rely on uevents, and so on.h](haSome userspace APIs already define what should happen when the device disappears (OpenGL, GL ES: }(hjhhhNhNubj-)}(h`GL_KHR_robustness`_h]hGL_KHR_robustness}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameGL_KHR_robustnessrefuriIhttps://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_robustness.txtuh1j,hjresolvedKubh; }(hjhhhNhNubj-)}(h `Vulkan`_h]hVulkan}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameVulkanjhttps://www.khronos.org/vulkan/uh1j,hjjKubh: VK_ERROR_DEVICE_LOST; etc.). DRM drivers are free to implement this behaviour the way they see best, e.g. returning failures in driver-specific ioctls and handling those in userspace drivers, or rely on uevents, and so on.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hdmabuf which point to memory that has disappeared will either fail to import with ENODEV or continue to be successfully imported if it would have succeeded before the disappearance. See also about memory maps below for already imported dmabufs. h]h)}(hdmabuf which point to memory that has disappeared will either fail to import with ENODEV or continue to be successfully imported if it would have succeeded before the disappearance. See also about memory maps below for already imported dmabufs.h]hdmabuf which point to memory that has disappeared will either fail to import with ENODEV or continue to be successfully imported if it would have succeeded before the disappearance. See also about memory maps below for already imported dmabufs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hAttempting to import a dmabuf to a disappeared device will either fail with ENODEV or succeed if it would have succeeded without the disappearance. h]h)}(hAttempting to import a dmabuf to a disappeared device will either fail with ENODEV or succeed if it would have succeeded without the disappearance.h]hAttempting to import a dmabuf to a disappeared device will either fail with ENODEV or succeed if it would have succeeded without the disappearance.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hVopen() on a device node whose underlying device has disappeared will fail with ENXIO. h]h)}(hUopen() on a device node whose underlying device has disappeared will fail with ENXIO.h]hUopen() on a device node whose underlying device has disappeared will fail with ENXIO.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj(ubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubj)}(h`.. _GL_KHR_robustness: https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_robustness.txth]h}(h]gl-khr-robustnessah ]h"]gl_khr_robustnessah$]h&]jjuh1jhMhjhhhhnj referencedKubj)}(h+.. _Vulkan: https://www.khronos.org/vulkan/h]h}(h]vulkanah ]h"]vulkanah$]h&]jjuh1jhMhjhhhhjRKubeh}(h]jFah ]h"]-requirements for render and cross-device uapiah$]h&]uh1hhjphhhhhKubh)}(hhh](h)}(hRequirements for Memory Mapsh]hRequirements for Memory Maps}(hjihhhNhNubah}(h]h ]h"]h$]h&]hjbuh1hhjfhhhhhMubh)}(hXMemory maps have further requirements that apply to both existing maps and maps created after the device has disappeared. If the underlying memory disappears, the map is created or modified such that reads and writes will still complete successfully but the result is undefined. This applies to both userspace mmap()'d memory and memory pointed to by dmabuf which might be mapped to other devices (cross-device dmabuf imports).h]hXMemory maps have further requirements that apply to both existing maps and maps created after the device has disappeared. If the underlying memory disappears, the map is created or modified such that reads and writes will still complete successfully but the result is undefined. This applies to both userspace mmap()’d memory and memory pointed to by dmabuf which might be mapped to other devices (cross-device dmabuf imports).}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjfhhubh)}(hXRaising SIGBUS is not an option, because userspace cannot realistically handle it. Signal handlers are global, which makes them extremely difficult to use correctly from libraries like those that Mesa produces. Signal handlers are not composable, you can't have different handlers for GPU1 and GPU2 from different vendors, and a third handler for mmapped regular files. Threads cause additional pain with signal handling as well.h]hXRaising SIGBUS is not an option, because userspace cannot realistically handle it. Signal handlers are global, which makes them extremely difficult to use correctly from libraries like those that Mesa produces. Signal handlers are not composable, you can’t have different handlers for GPU1 and GPU2 from different vendors, and a third handler for mmapped regular files. Threads cause additional pain with signal handling as well.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjfhhubeh}(h]jhah ]h"]requirements for memory mapsah$]h&]uh1hhjphhhhhMubeh}(h]jah ]h"]device hot-unplugah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Device reseth]h Device reset}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhM'ubh)}(hX^The GPU stack is really complex and is prone to errors, from hardware bugs, faulty applications and everything in between the many layers. Some errors require resetting the device in order to make the device usable again. This section describes the expectations for DRM and usermode drivers when a device resets and how to propagate the reset status.h]hX^The GPU stack is really complex and is prone to errors, from hardware bugs, faulty applications and everything in between the many layers. Some errors require resetting the device in order to make the device usable again. This section describes the expectations for DRM and usermode drivers when a device resets and how to propagate the reset status.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hjhhubh)}(hXDevice resets can not be disabled without tainting the kernel, which can lead to hanging the entire kernel through shrinkers/mmu_notifiers. Userspace role in device resets is to propagate the message to the application and apply any special policy for blocking guilty applications, if any. Corollary is that debugging a hung GPU context require hardware support to be able to preempt such a GPU context while it's stopped.h]hXDevice resets can not be disabled without tainting the kernel, which can lead to hanging the entire kernel through shrinkers/mmu_notifiers. Userspace role in device resets is to propagate the message to the application and apply any special policy for blocking guilty applications, if any. Corollary is that debugging a hung GPU context require hardware support to be able to preempt such a GPU context while it’s stopped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM/hjhhubh)}(hhh](h)}(hKernel Mode Driverh]hKernel Mode Driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjhhhhhM7ubh)}(hThe KMD is responsible for checking if the device needs a reset, and to perform it as needed. Usually a hang is detected when a job gets stuck executing.h]hThe KMD is responsible for checking if the device needs a reset, and to perform it as needed. Usually a hang is detected when a job gets stuck executing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM9hjhhubh)}(hXPropagation of errors to userspace has proven to be tricky since it goes in the opposite direction of the usual flow of commands. Because of this vendor independent error handling was added to the &dma_fence object, this way drivers can add an error code to their fences before signaling them. See function dma_fence_set_error() on how to do this and for examples of error codes to use.h]hXPropagation of errors to userspace has proven to be tricky since it goes in the opposite direction of the usual flow of commands. Because of this vendor independent error handling was added to the &dma_fence object, this way drivers can add an error code to their fences before signaling them. See function dma_fence_set_error() on how to do this and for examples of error codes to use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hjhhubh)}(hXThe DRM scheduler also allows setting error codes on all pending fences when hardware submissions are restarted after an reset. Error codes are also forwarded from the hardware fence to the scheduler fence to bubble up errors to the higher levels of the stack and eventually userspace.h]hXThe DRM scheduler also allows setting error codes on all pending fences when hardware submissions are restarted after an reset. Error codes are also forwarded from the hardware fence to the scheduler fence to bubble up errors to the higher levels of the stack and eventually userspace.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjhhubh)}(hFence errors can be queried by userspace through the generic SYNC_IOC_FILE_INFO IOCTL as well as through driver specific interfaces.h]hFence errors can be queried by userspace through the generic SYNC_IOC_FILE_INFO IOCTL as well as through driver specific interfaces.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhjhhubh)}(hXAdditional to setting fence errors drivers should also keep track of resets per context, the DRM scheduler provides the drm_sched_entity_error() function as helper for this use case. After a reset, KMD should reject new command submissions for affected contexts.h]hXAdditional to setting fence errors drivers should also keep track of resets per context, the DRM scheduler provides the drm_sched_entity_error() function as helper for this use case. After a reset, KMD should reject new command submissions for affected contexts.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjhhubeh}(h]jah ]h"]kernel mode driverah$]h&]uh1hhjhhhhhM7ubh)}(hhh](h)}(hUser Mode Driverh]hUser Mode Driver}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj, hhhhhMPubh)}(hXAfter command submission, UMD should check if the submission was accepted or rejected. After a reset, KMD should reject submissions, and UMD can issue an ioctl to the KMD to check the reset status, and this can be checked more often if the UMD requires it. After detecting a reset, UMD will then proceed to report it to the application using the appropriate API error code, as explained in the section below about robustness.h]hXAfter command submission, UMD should check if the submission was accepted or rejected. After a reset, KMD should reject submissions, and UMD can issue an ioctl to the KMD to check the reset status, and this can be checked more often if the UMD requires it. After detecting a reset, UMD will then proceed to report it to the application using the appropriate API error code, as explained in the section below about robustness.}(hj= hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhj, hhubeh}(h]jah ]h"]user mode driverah$]h&]uh1hhjhhhhhMPubh)}(hhh](h)}(h Robustnessh]h Robustness}(hjU hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjR hhhhhMZubh)}(hThe only way to try to keep a graphical API context working after a reset is if it complies with the robustness aspects of the graphical API that it is using.h]hThe only way to try to keep a graphical API context working after a reset is if it complies with the robustness aspects of the graphical API that it is using.}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hjR hhubh)}(hXGraphical APIs provide ways to applications to deal with device resets. However, there is no guarantee that the app will use such features correctly, and a userspace that doesn't support robust interfaces (like a non-robust OpenGL context or API without any robustness support like libva) leave the robustness handling entirely to the userspace driver. There is no strong community consensus on what the userspace driver should do in that case, since all reasonable approaches have some clear downsides.h]hXGraphical APIs provide ways to applications to deal with device resets. However, there is no guarantee that the app will use such features correctly, and a userspace that doesn’t support robust interfaces (like a non-robust OpenGL context or API without any robustness support like libva) leave the robustness handling entirely to the userspace driver. There is no strong community consensus on what the userspace driver should do in that case, since all reasonable approaches have some clear downsides.}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM_hjR hhubh)}(hhh](h)}(hOpenGLh]hOpenGL}(hj hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj hhhhhMhubh)}(hX`Apps using OpenGL should use the available robust interfaces, like the extension ``GL_ARB_robustness`` (or ``GL_EXT_robustness`` for OpenGL ES). This interface tells if a reset has happened, and if so, all the context state is considered lost and the app proceeds by creating new ones. There's no consensus on what to do to if robustness is not in use.h](hQApps using OpenGL should use the available robust interfaces, like the extension }(hj hhhNhNubj)}(h``GL_ARB_robustness``h]hGL_ARB_robustness}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh (or }(hj hhhNhNubj)}(h``GL_EXT_robustness``h]hGL_EXT_robustness}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh for OpenGL ES). This interface tells if a reset has happened, and if so, all the context state is considered lost and the app proceeds by creating new ones. There’s no consensus on what to do to if robustness is not in use.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMjhj hhubeh}(h]jah ]h"]openglah$]h&]uh1hhjR hhhhhMhubh)}(hhh](h)}(hVulkanh]hVulkan}(hj hhhNhNubah}(h]h ]h"]h$]h&]hj4uh1hhj hhhhhMqubh)}(hApps using Vulkan should check for ``VK_ERROR_DEVICE_LOST`` for submissions. This error code means, among other things, that a device reset has happened and it needs to recreate the contexts to keep going.h](h#Apps using Vulkan should check for }(hj hhhNhNubj)}(h``VK_ERROR_DEVICE_LOST``h]hVK_ERROR_DEVICE_LOST}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh for submissions. This error code means, among other things, that a device reset has happened and it needs to recreate the contexts to keep going.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMshj hhubeh}(h]j:ah ]h"]h$]vulkanah&]uh1hhjR hhhhhMqjRKubeh}(h]jah ]h"] robustnessah$]h&]uh1hhjhhhhhMZubh)}(hhh](h)}(hReporting causes of resetsh]hReporting causes of resets}(hj !hhhNhNubah}(h]h ]h"]h$]h&]hjbuh1hhj!hhhhhMxubh)}(hXApart from propagating the reset through the stack so apps can recover, it's really useful for driver developers to learn more about what caused the reset in the first place. For this, drivers can make use of devcoredump to store relevant information about the reset and send device wedged event with ``none`` recovery method (as explained in "Device Wedging" chapter) to notify userspace, so this information can be collected and added to user bug reports.h](hX/Apart from propagating the reset through the stack so apps can recover, it’s really useful for driver developers to learn more about what caused the reset in the first place. For this, drivers can make use of devcoredump to store relevant information about the reset and send device wedged event with }(hj!hhhNhNubj)}(h``none``h]hnone}(hj!!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh recovery method (as explained in “Device Wedging” chapter) to notify userspace, so this information can be collected and added to user bug reports.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMzhj!hhubeh}(h]jhah ]h"]reporting causes of resetsah$]h&]uh1hhjhhhhhMxubeh}(h]jah ]h"] device resetah$]h&]uh1hhhhhhhhM'ubh)}(hhh](h)}(hDevice Wedgingh]hDevice Wedging}(hjJ!hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjG!hhhhhMubh)}(hXsDrivers can optionally make use of device wedged event (implemented as drm_dev_wedged_event() in DRM subsystem), which notifies userspace of 'wedged' (hanged/unusable) state of the DRM device through a uevent. This is useful especially in cases where the device is no longer operating as expected and has become unrecoverable from driver context. Purpose of this implementation is to provide drivers a generic way to recover the device with the help of userspace intervention, without taking any drastic measures (like resetting or re-enumerating the full bus, on which the underlying physical device is sitting) in the driver.h]hXwDrivers can optionally make use of device wedged event (implemented as drm_dev_wedged_event() in DRM subsystem), which notifies userspace of ‘wedged’ (hanged/unusable) state of the DRM device through a uevent. This is useful especially in cases where the device is no longer operating as expected and has become unrecoverable from driver context. Purpose of this implementation is to provide drivers a generic way to recover the device with the help of userspace intervention, without taking any drastic measures (like resetting or re-enumerating the full bus, on which the underlying physical device is sitting) in the driver.}(hjX!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjG!hhubh)}(hXA 'wedged' device is basically a device that is declared dead by the driver after exhausting all possible attempts to recover it from driver context. The uevent is the notification that is sent to userspace along with a hint about what could possibly be attempted to recover the device from userspace and bring it back to usable state. Different drivers may have different ideas of a 'wedged' device depending on hardware implementation of the underlying physical device, and hence the vendor agnostic nature of the event. It is up to the drivers to decide when they see the need for device recovery and how they want to recover from the available methods.h]hXA ‘wedged’ device is basically a device that is declared dead by the driver after exhausting all possible attempts to recover it from driver context. The uevent is the notification that is sent to userspace along with a hint about what could possibly be attempted to recover the device from userspace and bring it back to usable state. Different drivers may have different ideas of a ‘wedged’ device depending on hardware implementation of the underlying physical device, and hence the vendor agnostic nature of the event. It is up to the drivers to decide when they see the need for device recovery and how they want to recover from the available methods.}(hjf!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjG!hhubh)}(hhh](h)}(hDriver prerequisitesh]hDriver prerequisites}(hjw!hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjt!hhhhhMubh)}(hXSThe driver, before opting for recovery, needs to make sure that the 'wedged' device doesn't harm the system as a whole by taking care of the prerequisites. Necessary actions must include disabling DMA to system memory as well as any communication channels with other devices. Further, the driver must ensure that all dma_fences are signalled and any device state that the core kernel might depend on is cleaned up. All existing mmaps should be invalidated and page faults should be redirected to a dummy page. Once the event is sent, the device must be kept in 'wedged' state until the recovery is performed. New accesses to the device (IOCTLs) should be rejected, preferably with an error code that resembles the type of failure the device has encountered. This will signify the reason for wedging, which can be reported to the application if needed.h]hX]The driver, before opting for recovery, needs to make sure that the ‘wedged’ device doesn’t harm the system as a whole by taking care of the prerequisites. Necessary actions must include disabling DMA to system memory as well as any communication channels with other devices. Further, the driver must ensure that all dma_fences are signalled and any device state that the core kernel might depend on is cleaned up. All existing mmaps should be invalidated and page faults should be redirected to a dummy page. Once the event is sent, the device must be kept in ‘wedged’ state until the recovery is performed. New accesses to the device (IOCTLs) should be rejected, preferably with an error code that resembles the type of failure the device has encountered. This will signify the reason for wedging, which can be reported to the application if needed.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjt!hhubeh}(h]jah ]h"]driver prerequisitesah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(hRecoveryh]hRecovery}(hj!hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj!hhhhhMubh)}(hXCurrent implementation defines four recovery methods, out of which, drivers can use any one, multiple or none. Method(s) of choice will be sent in the uevent environment as ``WEDGED=[,..,]`` in order of less to more side-effects. See the section `Vendor Specific Recovery`_ for ``WEDGED=vendor-specific``. If driver is unsure about recovery or method is unknown, ``WEDGED=unknown`` will be sent instead.h](hCurrent implementation defines four recovery methods, out of which, drivers can use any one, multiple or none. Method(s) of choice will be sent in the uevent environment as }(hj!hhhNhNubj)}(h#``WEDGED=[,..,]``h]hWEDGED=[,..,]}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh8 in order of less to more side-effects. See the section }(hj!hhhNhNubj-)}(h`Vendor Specific Recovery`_h]hVendor Specific Recovery}(hj!hhhNhNubah}(h]h ]h"]h$]h&]nameVendor Specific Recoveryhjuh1j,hj!jKubh for }(hj!hhhNhNubj)}(h``WEDGED=vendor-specific``h]hWEDGED=vendor-specific}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh;. If driver is unsure about recovery or method is unknown, }(hj!hhhNhNubj)}(h``WEDGED=unknown``h]hWEDGED=unknown}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh will be sent instead.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj!hhubh)}(h`Userspace consumers can parse this event and attempt recovery as per the following expectations.h]h`Userspace consumers can parse this event and attempt recovery as per the following expectations.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!hhubj))}(hX=============== ======================================== Recovery method Consumer expectations =============== ======================================== none optional telemetry collection rebind unbind + bind driver bus-reset unbind + bus reset/re-enumeration + bind vendor-specific vendor specific recovery method unknown consumer policy =============== ======================================== h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j"hj"ubj ")}(hhh]h}(h]h ]h"]h$]h&]colwidthK(uh1j"hj"ubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hRecovery methodh]hRecovery method}(hjD"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjA"ubah}(h]h ]h"]h$]h&]uh1j?"hj<"ubj@")}(hhh]h)}(hConsumer expectationsh]hConsumer expectations}(hj["hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjX"ubah}(h]h ]h"]h$]h&]uh1j?"hj<"ubeh}(h]h ]h"]h$]h&]uh1j:"hj7"ubah}(h]h ]h"]h$]h&]uh1j5"hj"ubhtbody)}(hhh](j;")}(hhh](j@")}(hhh]h)}(hnoneh]hnone}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubj@")}(hhh]h)}(hoptional telemetry collectionh]hoptional telemetry collection}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubeh}(h]h ]h"]h$]h&]uh1j:"hj}"ubj;")}(hhh](j@")}(hhh]h)}(hrebindh]hrebind}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubj@")}(hhh]h)}(hunbind + bind driverh]hunbind + bind driver}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubeh}(h]h ]h"]h$]h&]uh1j:"hj}"ubj;")}(hhh](j@")}(hhh]h)}(h bus-reseth]h bus-reset}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubj@")}(hhh]h)}(h(unbind + bus reset/re-enumeration + bindh]h(unbind + bus reset/re-enumeration + bind}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#ubah}(h]h ]h"]h$]h&]uh1j?"hj"ubeh}(h]h ]h"]h$]h&]uh1j:"hj}"ubj;")}(hhh](j@")}(hhh]h)}(hvendor-specifich]hvendor-specific}(hj+#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(#ubah}(h]h ]h"]h$]h&]uh1j?"hj%#ubj@")}(hhh]h)}(hvendor specific recovery methodh]hvendor specific recovery method}(hjB#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj?#ubah}(h]h ]h"]h$]h&]uh1j?"hj%#ubeh}(h]h ]h"]h$]h&]uh1j:"hj}"ubj;")}(hhh](j@")}(hhh]h)}(hunknownh]hunknown}(hjb#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj_#ubah}(h]h ]h"]h$]h&]uh1j?"hj\#ubj@")}(hhh]h)}(hconsumer policyh]hconsumer policy}(hjy#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjv#ubah}(h]h ]h"]h$]h&]uh1j?"hj\#ubeh}(h]h ]h"]h$]h&]uh1j:"hj}"ubeh}(h]h ]h"]h$]h&]uh1j{"hj"ubeh}(h]h ]h"]h$]h&]colsKuh1j"hj"ubah}(h]h ]h"]h$]h&]uh1j"hj"ubah}(h]h ]h"]h$]h&]uh1j(hhhMhj!hhubeh}(h]jah ]h"]recoveryah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(h No Recoveryh]h No Recovery}(hj#hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj#hhhhhMubh)}(hXOHere ``WEDGED=none`` signifies that no recovery is expected from the consumer but it can still try to gather telemetry information (devcoredump, syslog) for debug purpose in order to root cause the hang. This is useful because the first hang is usually the most critical one which can result in consequential hangs or complete wedging.h](hHere }(hj#hhhNhNubj)}(h``WEDGED=none``h]h WEDGED=none}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubhX; signifies that no recovery is expected from the consumer but it can still try to gather telemetry information (devcoredump, syslog) for debug purpose in order to root cause the hang. This is useful because the first hang is usually the most critical one which can result in consequential hangs or complete wedging.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubeh}(h]jah ]h"] no recoveryah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(hVendor Specific Recoveryh]hVendor Specific Recovery}(hj#hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj#hhhhhMubh)}(hWhen ``WEDGED=vendor-specific`` is sent, it indicates that the device requires a recovery procedure specific to the hardware vendor and is not one of the standardized approaches.h](hWhen }(hj#hhhNhNubj)}(h``WEDGED=vendor-specific``h]hWEDGED=vendor-specific}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh is sent, it indicates that the device requires a recovery procedure specific to the hardware vendor and is not one of the standardized approaches.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hXx``WEDGED=vendor-specific`` may be used to indicate different cases within a single vendor driver, each requiring a distinct recovery procedure. In such scenarios, the vendor driver must provide comprehensive documentation that describes each case, include additional hints to identify specific case and outline the corresponding recovery procedure. The documentation includes:h](j)}(h``WEDGED=vendor-specific``h]hWEDGED=vendor-specific}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubhX^ may be used to indicate different cases within a single vendor driver, each requiring a distinct recovery procedure. In such scenarios, the vendor driver must provide comprehensive documentation that describes each case, include additional hints to identify specific case and outline the corresponding recovery procedure. The documentation includes:}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hUCase - A list of all cases that sends the ``WEDGED=vendor-specific`` recovery method.h](h*Case - A list of all cases that sends the }(hj8$hhhNhNubj)}(h``WEDGED=vendor-specific``h]hWEDGED=vendor-specific}(hj@$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8$ubh recovery method.}(hj8$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hHints - Additional Information to assist the userspace consumer in identifying and differentiating between different cases. This can be exposed through sysfs, debugfs, traces, dmesg etc.h]hHints - Additional Information to assist the userspace consumer in identifying and differentiating between different cases. This can be exposed through sysfs, debugfs, traces, dmesg etc.}(hjX$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hRecovery Procedure - Clear instructions and guidance for recovering each case. This may include userspace scripts, tools needed for the recovery procedure.h]hRecovery Procedure - Clear instructions and guidance for recovering each case. This may include userspace scripts, tools needed for the recovery procedure.}(hjf$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hIt is the responsibility of the admin/userspace consumer to identify the case and verify additional identification hints before attempting a recovery procedure.h]hIt is the responsibility of the admin/userspace consumer to identify the case and verify additional identification hints before attempting a recovery procedure.}(hjt$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubh)}(hExample: If the device uses the Xe driver, then userspace consumer should refer to :ref:`Xe Device Wedging ` for the detailed documentation.h](hSExample: If the device uses the Xe driver, then userspace consumer should refer to }(hj$hhhNhNubh)}(h,:ref:`Xe Device Wedging `h]j:)}(hj$h]hXe Device Wedging}(hj$hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj$ubah}(h]h ]h"]h$]h&]refdocj refdomainj$reftyperef refexplicitrefwarnjxe-device-wedginguh1hhhhMhj$ubh for the detailed documentation.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj#hhubeh}(h]jah ]h"]vendor specific recoveryah$]h&]uh1hhjG!hhhhhMjRKubh)}(hhh](h)}(hTask informationh]hTask information}(hj$hhhNhNubah}(h]h ]h"]h$]h&]hj7uh1hhj$hhhhhMubh)}(hX#The information about which application (if any) was involved in the device wedging is useful for userspace if they want to notify the user about what happened (e.g. the compositor display a message to the user "The caused a graphical error and the system recovered") or to implement policies (e.g. the daemon may "ban" an task that keeps resetting the device). If the task information is available, the uevent will display as ``PID=`` and ``TASK=``. Otherwise, ``PID`` and ``TASK`` will not appear in the event string.h](hXThe information about which application (if any) was involved in the device wedging is useful for userspace if they want to notify the user about what happened (e.g. the compositor display a message to the user “The caused a graphical error and the system recovered”) or to implement policies (e.g. the daemon may “ban” an task that keeps resetting the device). If the task information is available, the uevent will display as }(hj$hhhNhNubj)}(h ``PID=``h]h PID=}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh and }(hj$hhhNhNubj)}(h``TASK=``h]hTASK=}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh . Otherwise, }(hj$hhhNhNubj)}(h``PID``h]hPID}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh and }(hj$hhhNhNubj)}(h``TASK``h]hTASK}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh% will not appear in the event string.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj$hhubh)}(hXThe reliability of this information is driver and hardware specific, and should be taken with a caution regarding it's precision. To have a big picture of what really happened, the devcoredump file provides much more detailed information about the device state and about the event.h]hXThe reliability of this information is driver and hardware specific, and should be taken with a caution regarding it’s precision. To have a big picture of what really happened, the devcoredump file provides much more detailed information about the device state and about the event.}(hj"%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$hhubeh}(h]j=ah ]h"]task informationah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(hConsumer prerequisitesh]hConsumer prerequisites}(hj:%hhhNhNubah}(h]h ]h"]h$]h&]hjYuh1hhj7%hhhhhMubh)}(hXIt is the responsibility of the consumer to make sure that the device or its resources are not in use by any process before attempting recovery. With IOCTLs erroring out, all device memory should be unmapped and file descriptors should be closed to prevent leaks or undefined behaviour. The idea here is to clear the device of all user context beforehand and set the stage for a clean recovery.h]hXIt is the responsibility of the consumer to make sure that the device or its resources are not in use by any process before attempting recovery. With IOCTLs erroring out, all device memory should be unmapped and file descriptors should be closed to prevent leaks or undefined behaviour. The idea here is to clear the device of all user context beforehand and set the stage for a clean recovery.}(hjH%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj7%hhubh)}(hFor ``WEDGED=vendor-specific`` recovery method, it is the responsibility of the consumer to check the driver documentation and the usecase before attempting a recovery.h](hFor }(hjV%hhhNhNubj)}(h``WEDGED=vendor-specific``h]hWEDGED=vendor-specific}(hj^%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV%ubh recovery method, it is the responsibility of the consumer to check the driver documentation and the usecase before attempting a recovery.}(hjV%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj7%hhubeh}(h]j_ah ]h"]consumer prerequisitesah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(hExample - rebindh]hExample - rebind}(hj%hhhNhNubah}(h]h ]h"]h$]h&]hj{uh1hhj}%hhhhhMubh)}(h Udev rule::h]h Udev rule:}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj}%hhubj)}(hlSUBSYSTEM=="drm", ENV{WEDGED}=="rebind", DEVPATH=="*/drm/card[0-9]", RUN+="/path/to/rebind.sh $env{DEVPATH}"h]hlSUBSYSTEM=="drm", ENV{WEDGED}=="rebind", DEVPATH=="*/drm/card[0-9]", RUN+="/path/to/rebind.sh $env{DEVPATH}"}hj%sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj}%hhubh)}(hRecovery script::h]hRecovery script:}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj}%hhubj)}(h#!/bin/sh DEVPATH=$(readlink -f /sys/$1/device) DEVICE=$(basename $DEVPATH) DRIVER=$(readlink -f $DEVPATH/driver) echo -n $DEVICE > $DRIVER/unbind echo -n $DEVICE > $DRIVER/bindh]h#!/bin/sh DEVPATH=$(readlink -f /sys/$1/device) DEVICE=$(basename $DEVPATH) DRIVER=$(readlink -f $DEVPATH/driver) echo -n $DEVICE > $DRIVER/unbind echo -n $DEVICE > $DRIVER/bind}hj%sbah}(h]h ]h"]h$]h&]hhuh1jhhhM hj}%hhubeh}(h]jah ]h"]example - rebindah$]h&]uh1hhjG!hhhhhMubh)}(hhh](h)}(h Customizationh]h Customization}(hj%hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj%hhhhhMubh)}(hXAlthough basic recovery is possible with a simple script, consumers can define custom policies around recovery. For example, if the driver supports multiple recovery methods, consumers can opt for the suitable one depending on scenarios like repeat offences or vendor specific failures. Consumers can also choose to have the device available for debugging or telemetry collection and base their recovery decision on the findings. This is useful especially when the driver is unsure about recovery or method is unknown.h]hXAlthough basic recovery is possible with a simple script, consumers can define custom policies around recovery. For example, if the driver supports multiple recovery methods, consumers can opt for the suitable one depending on scenarios like repeat offences or vendor specific failures. Consumers can also choose to have the device available for debugging or telemetry collection and base their recovery decision on the findings. This is useful especially when the driver is unsure about recovery or method is unknown.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%hhubj)}(h.. _drm_driver_ioctl:h]h}(h]h ]h"]h$]h&]h݌drm-driver-ioctluh1jhM hj%hhhhubeh}(h]jah ]h"] customizationah$]h&]uh1hhjG!hhhhhMubeh}(h]jah ]h"]device wedgingah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hIOCTL Support on Device Nodesh]hIOCTL Support on Device Nodes}(hj&hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj&hhhhhM#ubh)}(hX6First things first, driver private IOCTLs should only be needed for drivers supporting rendering. Kernel modesetting is all standardized, and extended through properties. There are a few exceptions in some existing drivers, which define IOCTL for use by the display DRM master, but they all predate properties.h]hX6First things first, driver private IOCTLs should only be needed for drivers supporting rendering. Kernel modesetting is all standardized, and extended through properties. There are a few exceptions in some existing drivers, which define IOCTL for use by the display DRM master, but they all predate properties.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubh)}(hNow if you do have a render driver you always have to support it through driver private properties. There's a few steps needed to wire all the things up.h]hNow if you do have a render driver you always have to support it through driver private properties. There’s a few steps needed to wire all the things up.}(hj%&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubh)}(hFirst you need to define the structure for your IOCTL in your driver private UAPI header in ``include/uapi/drm/my_driver_drm.h``::h](h\First you need to define the structure for your IOCTL in your driver private UAPI header in }(hj4&hhhNhNubj)}(h$``include/uapi/drm/my_driver_drm.h``h]h include/uapi/drm/my_driver_drm.h}(hj<&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4&ubh:}(hj4&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubj)}(hRstruct my_driver_operation { u32 some_thing; u32 another_thing; };h]hRstruct my_driver_operation { u32 some_thing; u32 another_thing; };}hjU&sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubh)}(hX Please make sure that you follow all the best practices from ``Documentation/process/botching-up-ioctls.rst``. Note that drm_ioctl() automatically zero-extends structures, hence make sure you can add more stuff at the end, i.e. don't put a variable sized array there.h](h=Please make sure that you follow all the best practices from }(hjd&hhhNhNubj)}(h0``Documentation/process/botching-up-ioctls.rst``h]h,Documentation/process/botching-up-ioctls.rst}(hjl&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd&ubh. Note that drm_ioctl() automatically zero-extends structures, hence make sure you can add more stuff at the end, i.e. don’t put a variable sized array there.}(hjd&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubh)}(hThen you need to define your IOCTL number, using one of DRM_IO(), DRM_IOR(), DRM_IOW() or DRM_IOWR(). It must start with the DRM_IOCTL\_ prefix::h]hThen you need to define your IOCTL number, using one of DRM_IO(), DRM_IOR(), DRM_IOW() or DRM_IOWR(). It must start with the DRM_IOCTL_ prefix:}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubj)}(hb##define DRM_IOCTL_MY_DRIVER_OPERATION \ DRM_IOW(DRM_COMMAND_BASE, struct my_driver_operation)h]hb##define DRM_IOCTL_MY_DRIVER_OPERATION \ DRM_IOW(DRM_COMMAND_BASE, struct my_driver_operation)}hj&sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chM hj&hhubh)}(hDRM driver private IOCTL must be in the range from DRM_COMMAND_BASE to DRM_COMMAND_END. Finally you need an array of :c:type:`struct drm_ioctl_desc ` to wire up the handlers and set the access rights::h](huDRM driver private IOCTL must be in the range from DRM_COMMAND_BASE to DRM_COMMAND_END. Finally you need an array of }(hj&hhhNhNubh)}(h0:c:type:`struct drm_ioctl_desc `h]j)}(hj&h]hstruct drm_ioctl_desc}(hj&hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_descuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&ubh3 to wire up the handlers and set the access rights:}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&hMhj&hhubj)}(hstatic const struct drm_ioctl_desc my_driver_ioctls[] = { DRM_IOCTL_DEF_DRV(MY_DRIVER_OPERATION, my_driver_operation, DRM_AUTH|DRM_RENDER_ALLOW), };h]hstatic const struct drm_ioctl_desc my_driver_ioctls[] = { DRM_IOCTL_DEF_DRV(MY_DRIVER_OPERATION, my_driver_operation, DRM_AUTH|DRM_RENDER_ALLOW), };}hj&sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&hhubh)}(hdAnd then assign this to the :c:type:`drm_driver.ioctls ` field in your driver structure.h](hAnd then assign this to the }(hj&hhhNhNubh)}(h(:c:type:`drm_driver.ioctls `h]j)}(hj&h]hdrm_driver.ioctls}(hj&hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_driveruh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj&ubh field in your driver structure.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj 'hMhj&hhubh)}(htSee the separate chapter on :ref:`file operations` for how the driver-specific IOCTLs are wired up.h](hSee the separate chapter on }(hj'hhhNhNubh)}(h':ref:`file operations`h]j:)}(hj 'h]hfile operations}(hj"'hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj'ubah}(h]h ]h"]h$]h&]refdocj refdomainj,'reftyperef refexplicitrefwarnjdrm_driver_fopsuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:549: ./drivers/gpu/drm/drm_ioctl.chMhj'ubh1 for how the driver-specific IOCTLs are wired up.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj>'hMhj&hhubh)}(hhh](h)}(hRecommended IOCTL Return Valuesh]hRecommended IOCTL Return Values}(hjL'hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjI'hhhhhM)ubh)}(hIn theory a driver's IOCTL callback is only allowed to return very few error codes. In practice it's good to abuse a few more. This section documents common practice within the DRM subsystem:h]hIn theory a driver’s IOCTL callback is only allowed to return very few error codes. In practice it’s good to abuse a few more. This section documents common practice within the DRM subsystem:}(hjZ'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjI'hhubj/ )}(hhh](j4 )}(hENOENT: Strictly this should only be used when a file doesn't exist e.g. when calling the open() syscall. We reuse that to signal any kind of object lookup failure, e.g. for unknown GEM buffer object handles, unknown KMS object handles and similar cases. h](j: )}(hENOENT:h]hENOENT:}(hjo'hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhM3hjk'ubjT )}(hhh]h)}(hStrictly this should only be used when a file doesn't exist e.g. when calling the open() syscall. We reuse that to signal any kind of object lookup failure, e.g. for unknown GEM buffer object handles, unknown KMS object handles and similar cases.h]hStrictly this should only be used when a file doesn’t exist e.g. when calling the open() syscall. We reuse that to signal any kind of object lookup failure, e.g. for unknown GEM buffer object handles, unknown KMS object handles and similar cases.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj}'ubah}(h]h ]h"]h$]h&]uh1jS hjk'ubeh}(h]h ]h"]h$]h&]uh1j3 hhhM3hjh'ubj4 )}(hXENOSPC: Some drivers use this to differentiate "out of kernel memory" from "out of VRAM". Sometimes also applies to other limited gpu resources used for rendering (e.g. when you have a special limited compression buffer). Sometimes resource allocation/reservation issues in command submission IOCTLs are also signalled through EDEADLK. Simply running out of kernel/system memory is signalled through ENOMEM. h](j: )}(hENOSPC:h]hENOSPC:}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhM<hj'ubjT )}(hhh](h)}(hXGSome drivers use this to differentiate "out of kernel memory" from "out of VRAM". Sometimes also applies to other limited gpu resources used for rendering (e.g. when you have a special limited compression buffer). Sometimes resource allocation/reservation issues in command submission IOCTLs are also signalled through EDEADLK.h]hXOSome drivers use this to differentiate “out of kernel memory” from “out of VRAM”. Sometimes also applies to other limited gpu resources used for rendering (e.g. when you have a special limited compression buffer). Sometimes resource allocation/reservation issues in command submission IOCTLs are also signalled through EDEADLK.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM6hj'ubh)}(hGSimply running out of kernel/system memory is signalled through ENOMEM.h]hGSimply running out of kernel/system memory is signalled through ENOMEM.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hj'ubeh}(h]h ]h"]h$]h&]uh1jS hj'ubeh}(h]h ]h"]h$]h&]uh1j3 hhhM<hjh'hhubj4 )}(hEPERM/EACCES: Returned for an operation that is valid, but needs more privileges. E.g. root-only or much more common, DRM master-only operations return this when called by unprivileged clients. There's no clear difference between EACCES and EPERM. h](j: )}(h EPERM/EACCES:h]h EPERM/EACCES:}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMBhj'ubjT )}(hhh]h)}(hReturned for an operation that is valid, but needs more privileges. E.g. root-only or much more common, DRM master-only operations return this when called by unprivileged clients. There's no clear difference between EACCES and EPERM.h]hReturned for an operation that is valid, but needs more privileges. E.g. root-only or much more common, DRM master-only operations return this when called by unprivileged clients. There’s no clear difference between EACCES and EPERM.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hj'ubah}(h]h ]h"]h$]h&]uh1jS hj'ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMBhjh'hhubj4 )}(hKENODEV: The device is not present anymore or is not yet fully initialized. h](j: )}(hENODEV:h]hENODEV:}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMEhj(ubjT )}(hhh]h)}(hBThe device is not present anymore or is not yet fully initialized.h]hBThe device is not present anymore or is not yet fully initialized.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMEhj(ubah}(h]h ]h"]h$]h&]uh1jS hj(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMEhjh'hhubj4 )}(hSEOPNOTSUPP: Feature (like PRIME, modesetting, GEM) is not supported by the driver. h](j: )}(h EOPNOTSUPP:h]h EOPNOTSUPP:}(hj9(hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMHhj5(ubjT )}(hhh]h)}(hFFeature (like PRIME, modesetting, GEM) is not supported by the driver.h]hFFeature (like PRIME, modesetting, GEM) is not supported by the driver.}(hjJ(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMHhjG(ubah}(h]h ]h"]h$]h&]uh1jS hj5(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMHhjh'hhubj4 )}(hENXIO: Remote failure, either a hardware transaction (like i2c), but also used when the exporting driver of a shared dma-buf or fence doesn't support a feature needed. h](j: )}(hENXIO:h]hENXIO:}(hjh(hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMMhjd(ubjT )}(hhh]h)}(hRemote failure, either a hardware transaction (like i2c), but also used when the exporting driver of a shared dma-buf or fence doesn't support a feature needed.h]hRemote failure, either a hardware transaction (like i2c), but also used when the exporting driver of a shared dma-buf or fence doesn’t support a feature needed.}(hjy(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhjv(ubah}(h]h ]h"]h$]h&]uh1jS hjd(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMMhjh'hhubj4 )}(hEINTR: DRM drivers assume that userspace restarts all IOCTLs. Any DRM IOCTL can return EINTR and in such a case should be restarted with the IOCTL parameters left unchanged. h](j: )}(hEINTR:h]hEINTR:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMRhj(ubjT )}(hhh]h)}(hDRM drivers assume that userspace restarts all IOCTLs. Any DRM IOCTL can return EINTR and in such a case should be restarted with the IOCTL parameters left unchanged.h]hDRM drivers assume that userspace restarts all IOCTLs. Any DRM IOCTL can return EINTR and in such a case should be restarted with the IOCTL parameters left unchanged.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhj(ubah}(h]h ]h"]h$]h&]uh1jS hj(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMRhjh'hhubj4 )}(hEIO: The GPU died and couldn't be resurrected through a reset. Modesetting hardware failures are signalled through the "link status" connector property. h](j: )}(hEIO:h]hEIO:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhMWhj(ubjT )}(hhh]h)}(hThe GPU died and couldn't be resurrected through a reset. Modesetting hardware failures are signalled through the "link status" connector property.h]hThe GPU died and couldn’t be resurrected through a reset. Modesetting hardware failures are signalled through the “link status” connector property.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhj(ubah}(h]h ]h"]h$]h&]uh1jS hj(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhMWhjh'hhubj4 )}(hZEINVAL: Catch-all for anything that is an invalid argument combination which cannot work. h](j: )}(hEINVAL:h]hEINVAL:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hhhM[hj(ubjT )}(hhh]h)}(hQCatch-all for anything that is an invalid argument combination which cannot work.h]hQCatch-all for anything that is an invalid argument combination which cannot work.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhj)ubah}(h]h ]h"]h$]h&]uh1jS hj(ubeh}(h]h ]h"]h$]h&]uh1j3 hhhM[hjh'hhubeh}(h]h ]h"]h$]h&]uh1j. hjI'hhhhhNubh)}(hX.IOCTL also use other error codes like ETIME, EFAULT, EBUSY, ENOTTY but their usage is in line with the common meanings. The above list tries to just document DRM specific patterns. Note that ENOTTY has the slightly unintuitive meaning of "this IOCTL does not exist", and is used exactly as such in DRM.h]hX2IOCTL also use other error codes like ETIME, EFAULT, EBUSY, ENOTTY but their usage is in line with the common meanings. The above list tries to just document DRM specific patterns. Note that ENOTTY has the slightly unintuitive meaning of “this IOCTL does not exist”, and is used exactly as such in DRM.}(hj&)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hjI'hhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl_t (C macro) c.drm_ioctl_thNtauh1j hjI'hhhNhNubj )}(hhh](j )}(h drm_ioctl_th]j )}(h drm_ioctl_th]j )}(h drm_ioctl_th]j )}(hjG)h]h drm_ioctl_t}(hjQ)hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjM)ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjI)hhhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK-ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjE)hhhjd)hK-ubah}(h]j@)ah ](j j eh"]h$]h&]j j )j huh1j hjd)hK-hjB)hhubj )}(hhh]h)}(h%**Typedef**: DRM ioctl function type.h](j )}(h **Typedef**h]hTypedef}(hjx)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjt)ubh: DRM ioctl function type.}(hjt)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK/hjq)hhubah}(h]h ]h"]h$]h&]uh1j hjB)hhhjd)hK-ubeh}(h]h ](jmacroeh"]h$]h&]j jj j)j j)j j j uh1j hhhjI'hNhNubh)}(h **Syntax**h]j )}(hj)h]hSyntax}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK2hjI'hhubj))}(h]``typedef int drm_ioctl_t (struct drm_device *dev, void *data, struct drm_file *file_priv)`` h]h)}(h\``typedef int drm_ioctl_t (struct drm_device *dev, void *data, struct drm_file *file_priv)``h]j)}(hj)h]hXtypedef int drm_ioctl_t (struct drm_device *dev, void *data, struct drm_file *file_priv)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK4hj)ubah}(h]h ]h"]h$]h&]uh1j(hj)hK4hjI'hhubj )}(hX**Parameters** ``struct drm_device *dev`` DRM device inode ``void *data`` private pointer of the ioctl call ``struct drm_file *file_priv`` DRM file this ioctl was made on **Description** This is the DRM ioctl typedef. Note that drm_ioctl() has alrady copied **data** into kernel-space, and will also copy it back, depending upon the read/write settings in the ioctl command code.h](h)}(h**Parameters**h]j )}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK8hj)ubj/ )}(hhh](j4 )}(h,``struct drm_device *dev`` DRM device inode h](j: )}(h``struct drm_device *dev``h]j)}(hj)h]hstruct drm_device *dev}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK.hj)ubjT )}(hhh]h)}(hDRM device inodeh]hDRM device inode}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hK.hj*ubah}(h]h ]h"]h$]h&]uh1jS hj)ubeh}(h]h ]h"]h$]h&]uh1j3 hj*hK.hj)ubj4 )}(h1``void *data`` private pointer of the ioctl call h](j: )}(h``void *data``h]j)}(hj6*h]h void *data}(hj8*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4*ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK/hj0*ubjT )}(hhh]h)}(h!private pointer of the ioctl callh]h!private pointer of the ioctl call}(hjO*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK*hK/hjL*ubah}(h]h ]h"]h$]h&]uh1jS hj0*ubeh}(h]h ]h"]h$]h&]uh1j3 hjK*hK/hj)ubj4 )}(h?``struct drm_file *file_priv`` DRM file this ioctl was made on h](j: )}(h``struct drm_file *file_priv``h]j)}(hjo*h]hstruct drm_file *file_priv}(hjq*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm*ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK0hji*ubjT )}(hhh]h)}(hDRM file this ioctl was made onh]hDRM file this ioctl was made on}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hK0hj*ubah}(h]h ]h"]h$]h&]uh1jS hji*ubeh}(h]h ]h"]h$]h&]uh1j3 hj*hK0hj)ubeh}(h]h ]h"]h$]h&]uh1j. hj)ubh)}(h**Description**h]j )}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK2hj)ubh)}(hThis is the DRM ioctl typedef. Note that drm_ioctl() has alrady copied **data** into kernel-space, and will also copy it back, depending upon the read/write settings in the ioctl command code.h](hGThis is the DRM ioctl typedef. Note that drm_ioctl() has alrady copied }(hj*hhhNhNubj )}(h**data**h]hdata}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*ubhq into kernel-space, and will also copy it back, depending upon the read/write settings in the ioctl command code.}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK1hj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl_compat_t (C macro)c.drm_ioctl_compat_thNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hdrm_ioctl_compat_th]j )}(hdrm_ioctl_compat_th]j )}(hdrm_ioctl_compat_th]j )}(hj*h]hdrm_ioctl_compat_t}(hj+hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj+ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj*hhhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK:ubah}(h]h ]h"]h$]h&]hhj uh1j j j hj*hhhj+hK:ubah}(h]j*ah ](j j eh"]h$]h&]j j )j huh1j hj+hK:hj*hhubj )}(hhh]h)}(h3**Typedef**: compatibility DRM ioctl function type.h](j )}(h **Typedef**h]hTypedef}(hj,+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj(+ubh(: compatibility DRM ioctl function type.}(hj(+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl_flags (C enum)c.drm_ioctl_flagshNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hdrm_ioctl_flagsh]j )}(henum drm_ioctl_flagsh](j> )}(henumh]henum}(hj,hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj,hhhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKEubj )}(h h]h }(hj,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj,hhhj,hKEubj )}(hdrm_ioctl_flagsh]j )}(hj,h]hdrm_ioctl_flags}(hj,hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj,ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj,hhhj,hKEubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj,hhhj,hKEubah}(h]j,ah ](j j eh"]h$]h&]j j )j huh1j hj,hKEhj,hhubj )}(hhh]h)}(hDRM ioctl flagsh]hDRM ioctl flags}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKKhj,hhubah}(h]h ]h"]h$]h&]uh1j hj,hhhj,hKEubeh}(h]h ](jenumeh"]h$]h&]j jj j,j j,j j j uh1j hhhjI'hNhNubj )}(hX**Constants** ``DRM_AUTH`` This is for ioctl which are used for rendering, and require that the file descriptor is either for a render node, or if it's a legacy/primary node, then it must be authenticated. ``DRM_MASTER`` This must be set for any ioctl which can change the modeset or display state. Userspace must call the ioctl through a primary node, while it is the active master. Note that read-only modeset ioctl can also be called by unauthenticated clients, or when a master is not the currently active one. ``DRM_ROOT_ONLY`` Anything that could potentially wreak a master file descriptor needs to have this flag set. Current that's only for the SETMASTER and DROPMASTER ioctl, which e.g. logind can call to force a non-behaving master (display compositor) into compliance. This is equivalent to callers with the SYSADMIN capability. ``DRM_RENDER_ALLOW`` This is used for all ioctl needed for rendering only, for drivers which support render nodes. This should be all new render drivers, and hence it should be always set for any ioctl with DRM_AUTH set. Note though that read-only query ioctl might have this set, but have not set DRM_AUTH because they do not require authentication.h](h)}(h **Constants**h]j )}(hj-h]h Constants}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKOhj-ubj/ )}(hhh](j4 )}(h``DRM_AUTH`` This is for ioctl which are used for rendering, and require that the file descriptor is either for a render node, or if it's a legacy/primary node, then it must be authenticated. h](j: )}(h ``DRM_AUTH``h]j)}(hj'-h]hDRM_AUTH}(hj)-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%-ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKThj!-ubjT )}(hhh]h)}(hThis is for ioctl which are used for rendering, and require that the file descriptor is either for a render node, or if it's a legacy/primary node, then it must be authenticated.h]hThis is for ioctl which are used for rendering, and require that the file descriptor is either for a render node, or if it’s a legacy/primary node, then it must be authenticated.}(hj@-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKRhj=-ubah}(h]h ]h"]h$]h&]uh1jS hj!-ubeh}(h]h ]h"]h$]h&]uh1j3 hj<-hKThj-ubj4 )}(hX6``DRM_MASTER`` This must be set for any ioctl which can change the modeset or display state. Userspace must call the ioctl through a primary node, while it is the active master. Note that read-only modeset ioctl can also be called by unauthenticated clients, or when a master is not the currently active one. h](j: )}(h``DRM_MASTER``h]j)}(hja-h]h DRM_MASTER}(hjc-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_-ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK]hj[-ubjT )}(hhh](h)}(hThis must be set for any ioctl which can change the modeset or display state. Userspace must call the ioctl through a primary node, while it is the active master.h]hThis must be set for any ioctl which can change the modeset or display state. Userspace must call the ioctl through a primary node, while it is the active master.}(hjz-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKWhjw-ubh)}(hNote that read-only modeset ioctl can also be called by unauthenticated clients, or when a master is not the currently active one.h]hNote that read-only modeset ioctl can also be called by unauthenticated clients, or when a master is not the currently active one.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK[hjw-ubeh}(h]h ]h"]h$]h&]uh1jS hj[-ubeh}(h]h ]h"]h$]h&]uh1j3 hjv-hK]hj-ubj4 )}(hXG``DRM_ROOT_ONLY`` Anything that could potentially wreak a master file descriptor needs to have this flag set. Current that's only for the SETMASTER and DROPMASTER ioctl, which e.g. logind can call to force a non-behaving master (display compositor) into compliance. This is equivalent to callers with the SYSADMIN capability. h](j: )}(h``DRM_ROOT_ONLY``h]j)}(hj-h]h DRM_ROOT_ONLY}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKehj-ubjT )}(hhh](h)}(hAnything that could potentially wreak a master file descriptor needs to have this flag set. Current that's only for the SETMASTER and DROPMASTER ioctl, which e.g. logind can call to force a non-behaving master (display compositor) into compliance.h]hAnything that could potentially wreak a master file descriptor needs to have this flag set. Current that’s only for the SETMASTER and DROPMASTER ioctl, which e.g. logind can call to force a non-behaving master (display compositor) into compliance.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK`hj-ubh)}(h;This is equivalent to callers with the SYSADMIN capability.h]h;This is equivalent to callers with the SYSADMIN capability.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hKehj-ubeh}(h]h ]h"]h$]h&]uh1jS hj-ubeh}(h]h ]h"]h$]h&]uh1j3 hj-hKehj-ubj4 )}(hX^``DRM_RENDER_ALLOW`` This is used for all ioctl needed for rendering only, for drivers which support render nodes. This should be all new render drivers, and hence it should be always set for any ioctl with DRM_AUTH set. Note though that read-only query ioctl might have this set, but have not set DRM_AUTH because they do not require authentication.h](j: )}(h``DRM_RENDER_ALLOW``h]j)}(hj-h]hDRM_RENDER_ALLOW}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKkhj-ubjT )}(hhh]h)}(hXIThis is used for all ioctl needed for rendering only, for drivers which support render nodes. This should be all new render drivers, and hence it should be always set for any ioctl with DRM_AUTH set. Note though that read-only query ioctl might have this set, but have not set DRM_AUTH because they do not require authentication.h]hXIThis is used for all ioctl needed for rendering only, for drivers which support render nodes. This should be all new render drivers, and hence it should be always set for any ioctl with DRM_AUTH set. Note though that read-only query ioctl might have this set, but have not set DRM_AUTH because they do not require authentication.}(hj .hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhhj.ubah}(h]h ]h"]h$]h&]uh1jS hj-ubeh}(h]h ]h"]h$]h&]uh1j3 hj.hKkhj-ubeh}(h]h ]h"]h$]h&]uh1j. hj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubh)}(h**Description**h]j )}(hj5.h]h Description}(hj7.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3.ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKnhjI'hhubh)}(hVarious flags that can be set in :c:type:`drm_ioctl_desc.flags ` to control how userspace can use a given ioctl.h](h!Various flags that can be set in }(hjK.hhhNhNubh)}(h/:c:type:`drm_ioctl_desc.flags `h]j)}(hjU.h]hdrm_ioctl_desc.flags}(hjW.hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjS.ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_descuh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKLhjK.ubh0 to control how userspace can use a given ioctl.}(hjK.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjr.hKLhjI'hhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl_desc (C struct)c.drm_ioctl_deschNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hdrm_ioctl_desch]j )}(hstruct drm_ioctl_desch](j> )}(hjA h]hstruct}(hj.hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj.hhhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKRubj )}(h h]h }(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj.hhhj.hKRubj )}(hdrm_ioctl_desch]j )}(hj.h]hdrm_ioctl_desc}(hj.hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj.ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj.hhhj.hKRubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj.hhhj.hKRubah}(h]j.ah ](j j eh"]h$]h&]j j )j huh1j hj.hKRhj.hhubj )}(hhh]h)}(hDRM driver ioctl entryh]hDRM driver ioctl entry}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhK}hj.hhubah}(h]h ]h"]h$]h&]uh1j hj.hhhj.hKRubeh}(h]h ](jstructeh"]h$]h&]j jj j.j j.j j j uh1j hhhjI'hNhNubj )}(hXu**Definition**:: struct drm_ioctl_desc { unsigned int cmd; enum drm_ioctl_flags flags; drm_ioctl_t *func; const char *name; }; **Members** ``cmd`` ioctl command number, without flags ``flags`` a bitmask of :c:type:`enum drm_ioctl_flags ` ``func`` handler for this ioctl ``name`` user-readable name for debug outputh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubh:}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj.ubj)}(h}struct drm_ioctl_desc { unsigned int cmd; enum drm_ioctl_flags flags; drm_ioctl_t *func; const char *name; };h]h}struct drm_ioctl_desc { unsigned int cmd; enum drm_ioctl_flags flags; drm_ioctl_t *func; const char *name; };}hj/sbah}(h]h ]h"]h$]h&]hhuh1jhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj.ubh)}(h **Members**h]j )}(hj&/h]hMembers}(hj(/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$/ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj.ubj/ )}(hhh](j4 )}(h,``cmd`` ioctl command number, without flags h](j: )}(h``cmd``h]j)}(hjE/h]hcmd}(hjG/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC/ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj?/ubjT )}(hhh]h)}(h#ioctl command number, without flagsh]h#ioctl command number, without flags}(hj^/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZ/hKhj[/ubah}(h]h ]h"]h$]h&]uh1jS hj?/ubeh}(h]h ]h"]h$]h&]uh1j3 hjZ/hKhj` h](j: )}(h ``flags``h]j)}(hj~/h]hflags}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|/ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhjx/ubjT )}(hhh]h)}(h=a bitmask of :c:type:`enum drm_ioctl_flags `h](h a bitmask of }(hj/hhhNhNubh)}(h0:c:type:`enum drm_ioctl_flags `h]j)}(hj/h]henum drm_ioctl_flags}(hj/hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_flagsuh1hhj/hKhj/ubeh}(h]h ]h"]h$]h&]uh1hhj/hKhj/ubah}(h]h ]h"]h$]h&]uh1jS hjx/ubeh}(h]h ]h"]h$]h&]uh1j3 hj/hKhj` h]h)}(hKhelper macro to fill out a :c:type:`struct drm_ioctl_desc `h](hhelper macro to fill out a }(hj0hhhNhNubh)}(h0:c:type:`struct drm_ioctl_desc `h]j)}(hj0h]hstruct drm_ioctl_desc}(hj0hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_descuh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj0ubeh}(h]h ]h"]h$]h&]uh1hhj1hKhj0ubah}(h]h ]h"]h$]h&]uh1j(hj1hKhjI'hhubj )}(hXr**Parameters** ``ioctl`` ioctl command suffix ``_func`` handler for the ioctl ``_flags`` a bitmask of :c:type:`enum drm_ioctl_flags ` **Description** Small helper macro to create a :c:type:`struct drm_ioctl_desc ` entry. The ioctl command number is constructed by prepending ``DRM_IOCTL\_`` and passing that to DRM_IOCTL_NR().h](h)}(h**Parameters**h]j )}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj1ubj/ )}(hhh](j4 )}(h``ioctl`` ioctl command suffix h](j: )}(h ``ioctl``h]j)}(hj91h]hioctl}(hj;1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj71ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj31ubjT )}(hhh]h)}(hioctl command suffixh]hioctl command suffix}(hjR1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN1hKhjO1ubah}(h]h ]h"]h$]h&]uh1jS hj31ubeh}(h]h ]h"]h$]h&]uh1j3 hjN1hKhj01ubj4 )}(h ``_func`` handler for the ioctl h](j: )}(h ``_func``h]j)}(hjr1h]h_func}(hjt1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp1ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhjl1ubjT )}(hhh]h)}(hhandler for the ioctlh]hhandler for the ioctl}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hKhj1ubah}(h]h ]h"]h$]h&]uh1jS hjl1ubeh}(h]h ]h"]h$]h&]uh1j3 hj1hKhj01ubj4 )}(hI``_flags`` a bitmask of :c:type:`enum drm_ioctl_flags ` h](j: )}(h ``_flags``h]j)}(hj1h]h_flags}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j9 hU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj1ubjT )}(hhh]h)}(h=a bitmask of :c:type:`enum drm_ioctl_flags `h](h a bitmask of }(hj1hhhNhNubh)}(h0:c:type:`enum drm_ioctl_flags `h]j)}(hj1h]henum drm_ioctl_flags}(hj1hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_flagsuh1hhj1hKhj1ubeh}(h]h ]h"]h$]h&]uh1hhj1hKhj1ubah}(h]h ]h"]h$]h&]uh1jS hj1ubeh}(h]h ]h"]h$]h&]uh1j3 hj1hKhj01ubeh}(h]h ]h"]h$]h&]uh1j. hj1ubh)}(h**Description**h]j )}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&]uh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj1ubh)}(hSmall helper macro to create a :c:type:`struct drm_ioctl_desc ` entry. The ioctl command number is constructed by prepending ``DRM_IOCTL\_`` and passing that to DRM_IOCTL_NR().h](hSmall helper macro to create a }(hj2hhhNhNubh)}(h0:c:type:`struct drm_ioctl_desc `h]j)}(hj%2h]hstruct drm_ioctl_desc}(hj'2hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj#2ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_ioctl_descuh1hhU/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:610: ./include/drm/drm_ioctl.hhKhj2ubh> entry. The ioctl command number is constructed by prepending }(hj2hhhNhNubj)}(h``DRM_IOCTL\_``h]h DRM_IOCTL\_}(hjG2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh$ and passing that to DRM_IOCTL_NR().}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjB2hKhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_noop (C function) c.drm_noophNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hMint drm_noop (struct drm_device *dev, void *data, struct drm_file *file_priv)h]j )}(hLint drm_noop(struct drm_device *dev, void *data, struct drm_file *file_priv)h](j )}(hinth]hint}(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj{2hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMubj )}(h h]h }(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj{2hhhj2hMubj )}(hdrm_nooph]j )}(hdrm_nooph]hdrm_noop}(hj2hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj2ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj{2hhhj2hMubj2 )}(h@(struct drm_device *dev, void *data, struct drm_file *file_priv)h](j8 )}(hstruct drm_device *devh](j> )}(hjA h]hstruct}(hj2hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj2ubj )}(h h]h }(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj2ubh)}(hhh]j )}(h drm_deviceh]h drm_device}(hj2hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj2modnameN classnameNjy j| )}j ]j )}ju j2sb c.drm_noopasbuh1hhj2ubj )}(h h]h }(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj2ubj )}(hj h]h*}(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj2ubj )}(hdevh]hdev}(hj3hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj2ubj8 )}(h void *datah](j )}(hvoidh]hvoid}(hj.3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*3ubj )}(h h]h }(hj<3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*3ubj )}(hj h]h*}(hjJ3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*3ubj )}(hdatah]hdata}(hjW3hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj*3ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj2ubj8 )}(hstruct drm_file *file_privh](j> )}(hjA h]hstruct}(hjp3hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjl3ubj )}(h h]h }(hj}3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl3ubh)}(hhh]j )}(hdrm_fileh]hdrm_file}(hj3hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj3ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj3modnameN classnameNjy j| )}j ]j2 c.drm_noopasbuh1hhjl3ubj )}(h h]h }(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl3ubj )}(hj h]h*}(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl3ubj )}(h file_privh]h file_priv}(hj3hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjl3ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj2ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj{2hhhj2hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjw2hhhj2hMubah}(h]jr2ah ](j j eh"]h$]h&]j j )j huh1j hj2hMhjt2hhubj )}(hhh]h)}(hDRM no-op ioctl implementationh]hDRM no-op ioctl implementation}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj3hhubah}(h]h ]h"]h$]h&]uh1j hjt2hhhj2hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j 4j j 4j j j uh1j hhhjI'hNhNubj )}(hX**Parameters** ``struct drm_device *dev`` DRM device for the ioctl ``void *data`` data pointer for the ioctl ``struct drm_file *file_priv`` DRM file for the ioctl call **Description** This no-op implementation for drm ioctls is useful for deprecated functionality where we can't return a failure code because existing userspace checks the result of the ioctl, but doesn't care about the action. Always returns successfully with 0.h](h)}(h**Parameters**h]j )}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj 4ubj/ )}(hhh](j4 )}(h4``struct drm_device *dev`` DRM device for the ioctl h](j: )}(h``struct drm_device *dev``h]j)}(hj24h]hstruct drm_device *dev}(hj44hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj04ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj,4ubjT )}(hhh]h)}(hDRM device for the ioctlh]hDRM device for the ioctl}(hjK4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG4hMhjH4ubah}(h]h ]h"]h$]h&]uh1jS hj,4ubeh}(h]h ]h"]h$]h&]uh1j3 hjG4hMhj)4ubj4 )}(h*``void *data`` data pointer for the ioctl h](j: )}(h``void *data``h]j)}(hjk4h]h void *data}(hjm4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji4ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhje4ubjT )}(hhh]h)}(hdata pointer for the ioctlh]hdata pointer for the ioctl}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jS hje4ubeh}(h]h ]h"]h$]h&]uh1j3 hj4hMhj)4ubj4 )}(h;``struct drm_file *file_priv`` DRM file for the ioctl call h](j: )}(h``struct drm_file *file_priv``h]j)}(hj4h]hstruct drm_file *file_priv}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj4ubjT )}(hhh]h)}(hDRM file for the ioctl callh]hDRM file for the ioctl call}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jS hj4ubeh}(h]h ]h"]h$]h&]uh1j3 hj4hMhj)4ubeh}(h]h ]h"]h$]h&]uh1j. hj 4ubh)}(h**Description**h]j )}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj 4ubh)}(hThis no-op implementation for drm ioctls is useful for deprecated functionality where we can't return a failure code because existing userspace checks the result of the ioctl, but doesn't care about the action.h]hThis no-op implementation for drm ioctls is useful for deprecated functionality where we can’t return a failure code because existing userspace checks the result of the ioctl, but doesn’t care about the action.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj 4ubh)}(h#Always returns successfully with 0.h]h#Always returns successfully with 0.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj 4ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_invalid_op (C function)c.drm_invalid_ophNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hSint drm_invalid_op (struct drm_device *dev, void *data, struct drm_file *file_priv)h]j )}(hRint drm_invalid_op(struct drm_device *dev, void *data, struct drm_file *file_priv)h](j )}(hinth]hint}(hj35hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/5hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMubj )}(h h]h }(hjB5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/5hhhjA5hMubj )}(hdrm_invalid_oph]j )}(hdrm_invalid_oph]hdrm_invalid_op}(hjT5hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjP5ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj/5hhhjA5hMubj2 )}(h@(struct drm_device *dev, void *data, struct drm_file *file_priv)h](j8 )}(hstruct drm_device *devh](j> )}(hjA h]hstruct}(hjp5hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjl5ubj )}(h h]h }(hj}5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl5ubh)}(hhh]j )}(h drm_deviceh]h drm_device}(hj5hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj5ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj5modnameN classnameNjy j| )}j ]j )}ju jV5sbc.drm_invalid_opasbuh1hhjl5ubj )}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl5ubj )}(hj h]h*}(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjl5ubj )}(hdevh]hdev}(hj5hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjl5ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjh5ubj8 )}(h void *datah](j )}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj5ubj )}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj5ubj )}(hj h]h*}(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj5ubj )}(hdatah]hdata}(hj 6hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjh5ubj8 )}(hstruct drm_file *file_privh](j> )}(hjA h]hstruct}(hj$6hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj 6ubj )}(h h]h }(hj16hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 6ubh)}(hhh]j )}(hdrm_fileh]hdrm_file}(hjB6hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj?6ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjD6modnameN classnameNjy j| )}j ]j5c.drm_invalid_opasbuh1hhj 6ubj )}(h h]h }(hj`6hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 6ubj )}(hj h]h*}(hjn6hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 6ubj )}(h file_privh]h file_priv}(hj{6hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj 6ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjh5ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj/5hhhjA5hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj+5hhhjA5hMubah}(h]j&5ah ](j j eh"]h$]h&]j j )j huh1j hjA5hMhj(5hhubj )}(hhh]h)}(h DRM invalid ioctl implementationh]h DRM invalid ioctl implementation}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6hhubah}(h]h ]h"]h$]h&]uh1j hj(5hhhjA5hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j6j j6j j j uh1j hhhjI'hNhNubj )}(hXp**Parameters** ``struct drm_device *dev`` DRM device for the ioctl ``void *data`` data pointer for the ioctl ``struct drm_file *file_priv`` DRM file for the ioctl call **Description** This no-op implementation for drm ioctls is useful for deprecated functionality where we really don't want to allow userspace to call the ioctl any more. This is the case for old ums interfaces for drivers that transitioned to kms gradually and so kept the old legacy tables around. This only applies to radeon and i915 kms drivers, other drivers shouldn't need to use this function. Always fails with a return value of -EINVAL.h](h)}(h**Parameters**h]j )}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6ubj/ )}(hhh](j4 )}(h4``struct drm_device *dev`` DRM device for the ioctl h](j: )}(h``struct drm_device *dev``h]j)}(hj6h]hstruct drm_device *dev}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6ubjT )}(hhh]h)}(hDRM device for the ioctlh]hDRM device for the ioctl}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jS hj6ubeh}(h]h ]h"]h$]h&]uh1j3 hj6hMhj6ubj4 )}(h*``void *data`` data pointer for the ioctl h](j: )}(h``void *data``h]j)}(hj7h]h void *data}(hj!7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj7ubjT )}(hhh]h)}(hdata pointer for the ioctlh]hdata pointer for the ioctl}(hj87hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj47hMhj57ubah}(h]h ]h"]h$]h&]uh1jS hj7ubeh}(h]h ]h"]h$]h&]uh1j3 hj47hMhj6ubj4 )}(h;``struct drm_file *file_priv`` DRM file for the ioctl call h](j: )}(h``struct drm_file *file_priv``h]j)}(hjX7h]hstruct drm_file *file_priv}(hjZ7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV7ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhjR7ubjT )}(hhh]h)}(hDRM file for the ioctl callh]hDRM file for the ioctl call}(hjq7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm7hMhjn7ubah}(h]h ]h"]h$]h&]uh1jS hjR7ubeh}(h]h ]h"]h$]h&]uh1j3 hjm7hMhj6ubeh}(h]h ]h"]h$]h&]uh1j. hj6ubh)}(h**Description**h]j )}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj7ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6ubh)}(hXThis no-op implementation for drm ioctls is useful for deprecated functionality where we really don't want to allow userspace to call the ioctl any more. This is the case for old ums interfaces for drivers that transitioned to kms gradually and so kept the old legacy tables around. This only applies to radeon and i915 kms drivers, other drivers shouldn't need to use this function.h]hXThis no-op implementation for drm ioctls is useful for deprecated functionality where we really don’t want to allow userspace to call the ioctl any more. This is the case for old ums interfaces for drivers that transitioned to kms gradually and so kept the old legacy tables around. This only applies to radeon and i915 kms drivers, other drivers shouldn’t need to use this function.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6ubh)}(h,Always fails with a return value of -EINVAL.h]h,Always fails with a return value of -EINVAL.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl (C function) c.drm_ioctlhNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hGlong drm_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)h]j )}(hFlong drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)h](j )}(hlongh]hlong}(hj7hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj7hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM6ubj )}(h h]h }(hj7hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj7hhhj7hM6ubj )}(h drm_ioctlh]j )}(h drm_ioctlh]h drm_ioctl}(hj8hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj8ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj7hhhj7hM6ubj2 )}(h8(struct file *filp, unsigned int cmd, unsigned long arg)h](j8 )}(hstruct file *filph](j> )}(hjA h]hstruct}(hj$8hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj 8ubj )}(h h]h }(hj18hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 8ubh)}(hhh]j )}(hfileh]hfile}(hjB8hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj?8ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjD8modnameN classnameNjy j| )}j ]j )}ju j 8sb c.drm_ioctlasbuh1hhj 8ubj )}(h h]h }(hjb8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 8ubj )}(hj h]h*}(hjp8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj 8ubj )}(hfilph]hfilp}(hj}8hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj 8ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj8ubj8 )}(hunsigned int cmdh](j )}(hunsignedh]hunsigned}(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(hinth]hint}(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(hcmdh]hcmd}(hj8hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj8ubj8 )}(hunsigned long argh](j )}(hunsignedh]hunsigned}(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(hlongh]hlong}(hj9hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(h h]h }(hj9hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj8ubj )}(hargh]harg}(hj9hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj8ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj7hhhj7hM6ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj7hhhj7hM6ubah}(h]j7ah ](j j eh"]h$]h&]j j )j huh1j hj7hM6hj7hhubj )}(hhh]h)}(h-ioctl callback implementation for DRM driversh]h-ioctl callback implementation for DRM drivers}(hjI9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM6hjF9hhubah}(h]h ]h"]h$]h&]uh1j hj7hhhj7hM6ubeh}(h]h ](jfunctioneh"]h$]h&]j jj ja9j ja9j j j uh1j hhhjI'hNhNubj )}(hX**Parameters** ``struct file *filp`` file this ioctl is called on ``unsigned int cmd`` ioctl cmd number ``unsigned long arg`` user argument **Description** Looks up the ioctl function in the DRM core and the driver dispatch table, stored in :c:type:`drm_driver.ioctls `. It checks for necessary permission by calling drm_ioctl_permit(), and dispatches to the respective function. **Return** Zero on success, negative error code on failure.h](h)}(h**Parameters**h]j )}(hjk9h]h Parameters}(hjm9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hji9ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM:hje9ubj/ )}(hhh](j4 )}(h3``struct file *filp`` file this ioctl is called on h](j: )}(h``struct file *filp``h]j)}(hj9h]hstruct file *filp}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM7hj9ubjT )}(hhh]h)}(hfile this ioctl is called onh]hfile this ioctl is called on}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM7hj9ubah}(h]h ]h"]h$]h&]uh1jS hj9ubeh}(h]h ]h"]h$]h&]uh1j3 hj9hM7hj9ubj4 )}(h&``unsigned int cmd`` ioctl cmd number h](j: )}(h``unsigned int cmd``h]j)}(hj9h]hunsigned int cmd}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM8hj9ubjT )}(hhh]h)}(hioctl cmd numberh]hioctl cmd number}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hM8hj9ubah}(h]h ]h"]h$]h&]uh1jS hj9ubeh}(h]h ]h"]h$]h&]uh1j3 hj9hM8hj9ubj4 )}(h$``unsigned long arg`` user argument h](j: )}(h``unsigned long arg``h]j)}(hj9h]hunsigned long arg}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM9hj9ubjT )}(hhh]h)}(h user argumenth]h user argument}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hM9hj:ubah}(h]h ]h"]h$]h&]uh1jS hj9ubeh}(h]h ]h"]h$]h&]uh1j3 hj:hM9hj9ubeh}(h]h ]h"]h$]h&]uh1j. hje9ubh)}(h**Description**h]j )}(hj7:h]h Description}(hj9:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5:ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM;hje9ubh)}(hLooks up the ioctl function in the DRM core and the driver dispatch table, stored in :c:type:`drm_driver.ioctls `. It checks for necessary permission by calling drm_ioctl_permit(), and dispatches to the respective function.h](hULooks up the ioctl function in the DRM core and the driver dispatch table, stored in }(hjM:hhhNhNubh)}(h(:c:type:`drm_driver.ioctls `h]j)}(hjW:h]hdrm_driver.ioctls}(hjY:hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjU:ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_driveruh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM:hjM:ubhn. It checks for necessary permission by calling drm_ioctl_permit(), and dispatches to the respective function.}(hjM:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjt:hM:hje9ubh)}(h **Return**h]j )}(hj:h]hReturn}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj:ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM>hje9ubh)}(h0Zero on success, negative error code on failure.h]h0Zero on success, negative error code on failure.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chM?hje9ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_ioctl_flags (C function)c.drm_ioctl_flagshNtauh1j hjI'hhhNhNubj )}(hhh](j )}(h;bool drm_ioctl_flags (unsigned int nr, unsigned int *flags)h]j )}(h:bool drm_ioctl_flags(unsigned int nr, unsigned int *flags)h](j )}(hj h]hbool}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMubj )}(h h]h }(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:hhhj:hMubj )}(hdrm_ioctl_flagsh]j )}(hdrm_ioctl_flagsh]hdrm_ioctl_flags}(hj:hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj:ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj:hhhj:hMubj2 )}(h&(unsigned int nr, unsigned int *flags)h](j8 )}(hunsigned int nrh](j )}(hunsignedh]hunsigned}(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubj )}(h h]h }(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubj )}(hinth]hint}(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubj )}(h h]h }(hj,;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubj )}(hnrh]hnr}(hj:;hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj:ubj8 )}(hunsigned int *flagsh](j )}(hunsignedh]hunsigned}(hjS;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjO;ubj )}(h h]h }(hja;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjO;ubj )}(hinth]hint}(hjo;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjO;ubj )}(h h]h }(hj};hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjO;ubj )}(hj h]h*}(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjO;ubj )}(hflagsh]hflags}(hj;hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjO;ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj:ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj:hhhj:hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj:hhhj:hMubah}(h]h ](j j eh"]h$]h&]j j )j huh1j hj:hMhj:hhubj )}(hhh]h)}(h6Check for core ioctl and return ioctl permission flagsh]h6Check for core ioctl and return ioctl permission flags}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;hhubah}(h]h ]h"]h$]h&]uh1j hj:hhhj:hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j;j j;j j j uh1j hhhjI'hNhNubj )}(hX**Parameters** ``unsigned int nr`` ioctl number ``unsigned int *flags`` where to return the ioctl permission flags **Description** This ioctl is only used by the vmwgfx driver to augment the access checks done by the drm core and insofar a pretty decent layering violation. This shouldn't be used by any drivers. **Return** True if the **nr** corresponds to a DRM core ioctl number, false otherwise.h](h)}(h**Parameters**h]j )}(hj;h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubj/ )}(hhh](j4 )}(h!``unsigned int nr`` ioctl number h](j: )}(h``unsigned int nr``h]j)}(hj<h]hunsigned int nr}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubjT )}(hhh]h)}(h ioctl numberh]h ioctl number}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jS hj;ubeh}(h]h ]h"]h$]h&]uh1j3 hj<hMhj;ubj4 )}(hC``unsigned int *flags`` where to return the ioctl permission flags h](j: )}(h``unsigned int *flags``h]j)}(hj<<h]hunsigned int *flags}(hj><hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:<ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj6<ubjT )}(hhh]h)}(h*where to return the ioctl permission flagsh]h*where to return the ioctl permission flags}(hjU<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ<hMhjR<ubah}(h]h ]h"]h$]h&]uh1jS hj6<ubeh}(h]h ]h"]h$]h&]uh1j3 hjQ<hMhj;ubeh}(h]h ]h"]h$]h&]uh1j. hj;ubh)}(h**Description**h]j )}(hjw<h]h Description}(hjy<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hju<ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubh)}(hThis ioctl is only used by the vmwgfx driver to augment the access checks done by the drm core and insofar a pretty decent layering violation. This shouldn't be used by any drivers.h]hThis ioctl is only used by the vmwgfx driver to augment the access checks done by the drm core and insofar a pretty decent layering violation. This shouldn’t be used by any drivers.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubh)}(h **Return**h]j )}(hj<h]hReturn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj<ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubh)}(hKTrue if the **nr** corresponds to a DRM core ioctl number, false otherwise.h](h True if the }(hj<hhhNhNubj )}(h**nr**h]hnr}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj<ubh9 corresponds to a DRM core ioctl number, false otherwise.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:613: ./drivers/gpu/drm/drm_ioctl.chMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_compat_ioctl (C function)c.drm_compat_ioctlhNtauh1j hjI'hhhNhNubj )}(hhh](j )}(hNlong drm_compat_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)h]j )}(hMlong drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)h](j )}(hlongh]hlong}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj<hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chM^ubj )}(h h]h }(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj<hhhj=hM^ubj )}(hdrm_compat_ioctlh]j )}(hdrm_compat_ioctlh]hdrm_compat_ioctl}(hj=hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj=ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj<hhhj=hM^ubj2 )}(h8(struct file *filp, unsigned int cmd, unsigned long arg)h](j8 )}(hstruct file *filph](j> )}(hjA h]hstruct}(hj2=hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj.=ubj )}(h h]h }(hj?=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj.=ubh)}(hhh]j )}(hfileh]hfile}(hjP=hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjM=ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjR=modnameN classnameNjy j| )}j ]j )}ju j=sbc.drm_compat_ioctlasbuh1hhj.=ubj )}(h h]h }(hjp=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj.=ubj )}(hj h]h*}(hj~=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj.=ubj )}(hfilph]hfilp}(hj=hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj.=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj*=ubj8 )}(hunsigned int cmdh](j )}(hunsignedh]hunsigned}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(h h]h }(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(hinth]hint}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(h h]h }(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(hcmdh]hcmd}(hj=hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj*=ubj8 )}(hunsigned long argh](j )}(hunsignedh]hunsigned}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(h h]h }(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(hlongh]hlong}(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(h h]h }(hj>hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(hargh]harg}(hj->hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj*=ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj<hhhj=hM^ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj<hhhj=hM^ubah}(h]j<ah ](j j eh"]h$]h&]j j )j huh1j hj=hM^hj<hhubj )}(hhh]h)}(h132bit IOCTL compatibility handler for DRM driversh]h132bit IOCTL compatibility handler for DRM drivers}(hjW>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chM^hjT>hhubah}(h]h ]h"]h$]h&]uh1j hj<hhhj=hM^ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jo>j jo>j j j uh1j hhhjI'hNhNubj )}(hX**Parameters** ``struct file *filp`` file this ioctl is called on ``unsigned int cmd`` ioctl cmd number ``unsigned long arg`` user argument **Description** Compatibility handler for 32 bit userspace running on 64 kernels. All actual IOCTL handling is forwarded to drm_ioctl(), while marshalling structures as appropriate. Note that this only handles DRM core IOCTLs, if the driver has botched IOCTL itself, it must handle those by wrapping this function. **Return** Zero on success, negative error code on failure.h](h)}(h**Parameters**h]j )}(hjy>h]h Parameters}(hj{>hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjw>ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMbhjs>ubj/ )}(hhh](j4 )}(h3``struct file *filp`` file this ioctl is called on h](j: )}(h``struct file *filp``h]j)}(hj>h]hstruct file *filp}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chM_hj>ubjT )}(hhh]h)}(hfile this ioctl is called onh]hfile this ioctl is called on}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hM_hj>ubah}(h]h ]h"]h$]h&]uh1jS hj>ubeh}(h]h ]h"]h$]h&]uh1j3 hj>hM_hj>ubj4 )}(h&``unsigned int cmd`` ioctl cmd number h](j: )}(h``unsigned int cmd``h]j)}(hj>h]hunsigned int cmd}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chM`hj>ubjT )}(hhh]h)}(hioctl cmd numberh]hioctl cmd number}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hM`hj>ubah}(h]h ]h"]h$]h&]uh1jS hj>ubeh}(h]h ]h"]h$]h&]uh1j3 hj>hM`hj>ubj4 )}(h$``unsigned long arg`` user argument h](j: )}(h``unsigned long arg``h]j)}(hj ?h]hunsigned long arg}(hj ?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMahj?ubjT )}(hhh]h)}(h user argumenth]h user argument}(hj#?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hMahj ?ubah}(h]h ]h"]h$]h&]uh1jS hj?ubeh}(h]h ]h"]h$]h&]uh1j3 hj?hMahj>ubeh}(h]h ]h"]h$]h&]uh1j. hjs>ubh)}(h**Description**h]j )}(hjE?h]h Description}(hjG?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjC?ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMchjs>ubh)}(hX*Compatibility handler for 32 bit userspace running on 64 kernels. All actual IOCTL handling is forwarded to drm_ioctl(), while marshalling structures as appropriate. Note that this only handles DRM core IOCTLs, if the driver has botched IOCTL itself, it must handle those by wrapping this function.h]hX*Compatibility handler for 32 bit userspace running on 64 kernels. All actual IOCTL handling is forwarded to drm_ioctl(), while marshalling structures as appropriate. Note that this only handles DRM core IOCTLs, if the driver has botched IOCTL itself, it must handle those by wrapping this function.}(hj[?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMbhjs>ubh)}(h **Return**h]j )}(hjl?h]hReturn}(hjn?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjj?ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMghjs>ubh)}(h0Zero on success, negative error code on failure.h]h0Zero on success, negative error code on failure.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:616: ./drivers/gpu/drm/drm_ioc32.chMhhjs>ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjI'hhhNhNubeh}(h]jah ]h"]recommended ioctl return valuesah$]h&]uh1hhj&hhhhhM)ubeh}(h](jj%eh ]h"](ioctl support on device nodesdrm_driver_ioctleh$]h&]uh1hhhhhhhhM#j}j?j%sj}j%j%subh)}(hhh](h)}(hTesting and validationh]hTesting and validation}(hj?hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj?hhhhhMlubh)}(hhh](h)}(h&Testing Requirements for userspace APIh]h&Testing Requirements for userspace API}(hj?hhhNhNubah}(h]h ]h"]h$]h&]hj7uh1hhj?hhhhhMoubh)}(hXNew cross-driver userspace interface extensions, like new IOCTL, new KMS properties, new files in sysfs or anything else that constitutes an API change should have driver-agnostic testcases in IGT for that feature, if such a test can be reasonably made using IGT for the target hardware.h]hXNew cross-driver userspace interface extensions, like new IOCTL, new KMS properties, new files in sysfs or anything else that constitutes an API change should have driver-agnostic testcases in IGT for that feature, if such a test can be reasonably made using IGT for the target hardware.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhj?hhubeh}(h]j=ah ]h"]&testing requirements for userspace apiah$]h&]uh1hhj?hhhhhMoubh)}(hhh](h)}(hValidating changes with IGTh]hValidating changes with IGT}(hj?hhhNhNubah}(h]h ]h"]h$]h&]hjYuh1hhj?hhhhhMwubh)}(hXSThere's a collection of tests that aims to cover the whole functionality of DRM drivers and that can be used to check that changes to DRM drivers or the core don't regress existing functionality. This test suite is called IGT and its code and instructions to build and run can be found in https://gitlab.freedesktop.org/drm/igt-gpu-tools/.h](hX%There’s a collection of tests that aims to cover the whole functionality of DRM drivers and that can be used to check that changes to DRM drivers or the core don’t regress existing functionality. This test suite is called IGT and its code and instructions to build and run can be found in }(hj?hhhNhNubj-)}(h1https://gitlab.freedesktop.org/drm/igt-gpu-tools/h]h1https://gitlab.freedesktop.org/drm/igt-gpu-tools/}(hj?hhhNhNubah}(h]h ]h"]h$]h&]refurij?uh1j,hj?ubh.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMyhj?hhubeh}(h]j_ah ]h"]validating changes with igtah$]h&]uh1hhj?hhhhhMwubh)}(hhh](h)}(hUsing VKMS to test DRM APIh]hUsing VKMS to test DRM API}(hj@hhhNhNubah}(h]h ]h"]h$]h&]hj{uh1hhj@hhhhhMubh)}(hXVKMS is a software-only model of a KMS driver that is useful for testing and for running compositors. VKMS aims to enable a virtual display without the need for a hardware display capability. These characteristics made VKMS a perfect tool for validating the DRM core behavior and also support the compositor developer. VKMS makes it possible to test DRM functions in a virtual machine without display, simplifying the validation of some of the core changes.h]hXVKMS is a software-only model of a KMS driver that is useful for testing and for running compositors. VKMS aims to enable a virtual display without the need for a hardware display capability. These characteristics made VKMS a perfect tool for validating the DRM core behavior and also support the compositor developer. VKMS makes it possible to test DRM functions in a virtual machine without display, simplifying the validation of some of the core changes.}(hj*@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubh)}(hXBTo Validate changes in DRM API with VKMS, start setting the kernel: make sure to enable VKMS module; compile the kernel with the VKMS enabled and install it in the target machine. VKMS can be run in a Virtual Machine (QEMU, virtme or similar). It's recommended the use of KVM with the minimum of 1GB of RAM and four cores.h]hXDTo Validate changes in DRM API with VKMS, start setting the kernel: make sure to enable VKMS module; compile the kernel with the VKMS enabled and install it in the target machine. VKMS can be run in a Virtual Machine (QEMU, virtme or similar). It’s recommended the use of KVM with the minimum of 1GB of RAM and four cores.}(hj8@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubh)}(h7It's possible to run the IGT-tests in a VM in two ways:h]h9It’s possible to run the IGT-tests in a VM in two ways:}(hjF@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubj))}(he1. Use IGT inside a VM 2. Use IGT from the host machine and write the results in a shared directory. h]j)}(hhh](j%)}(hUse IGT inside a VMh]h)}(hj]@h]hUse IGT inside a VM}(hj_@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj[@ubah}(h]h ]h"]h$]h&]uh1j$hjX@ubj%)}(hKUse IGT from the host machine and write the results in a shared directory. h]h)}(hJUse IGT from the host machine and write the results in a shared directory.h]hJUse IGT from the host machine and write the results in a shared directory.}(hjv@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjr@ubah}(h]h ]h"]h$]h&]uh1j$hjX@ubeh}(h]h ]h"]h$]h&]j jjhjjuh1jhjT@ubah}(h]h ]h"]h$]h&]uh1j(hhhMhj@hhubh)}(hFollowing is an example of using a VM with a shared directory with the host machine to run igt-tests. This example uses virtme::h]hFollowing is an example of using a VM with a shared directory with the host machine to run igt-tests. This example uses virtme:}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubj)}(hV$ virtme-run --rwdir /path/for/shared_dir --kdir=path/for/kernel/directory --mods=autoh]hV$ virtme-run --rwdir /path/for/shared_dir --kdir=path/for/kernel/directory --mods=auto}hj@sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj@hhubh)}(hPRun the igt-tests in the guest machine. This example runs the 'kms_flip' tests::h]hSRun the igt-tests in the guest machine. This example runs the ‘kms_flip’ tests:}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubj)}(hG$ /path/for/igt-gpu-tools/scripts/run-tests.sh -p -s -t "kms_flip.*" -vh]hG$ /path/for/igt-gpu-tools/scripts/run-tests.sh -p -s -t "kms_flip.*" -v}hj@sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj@hhubh)}(hIn this example, instead of building the igt_runner, Piglit is used (-p option). It creates an HTML summary of the test results and saves them in the folder "igt-gpu-tools/results". It executes only the igt-tests matching the -t option.h]hIn this example, instead of building the igt_runner, Piglit is used (-p option). It creates an HTML summary of the test results and saves them in the folder “igt-gpu-tools/results”. It executes only the igt-tests matching the -t option.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@hhubeh}(h]jah ]h"]using vkms to test drm apiah$]h&]uh1hhj?hhhhhMubh)}(hhh](h)}(hDisplay CRC Supporth]hDisplay CRC Support}(hj@hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhj@hhhhhMubh)}(hDRM device drivers can provide to userspace CRC information of each frame as it reached a given hardware component (a CRC sampling "source").h]hDRM device drivers can provide to userspace CRC information of each frame as it reached a given hardware component (a CRC sampling “source”).}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chK,hj@hhubh)}(hXOUserspace can control generation of CRCs in a given CRTC by writing to the file dri/0/crtc-N/crc/control in debugfs, with N being the :ref:`index of the CRTC`. Accepted values are source names (which are driver-specific) and the "auto" keyword, which will let the driver select a default source of frame CRCs for this CRTC.h](hUserspace can control generation of CRCs in a given CRTC by writing to the file dri/0/crtc-N/crc/control in debugfs, with N being the }(hjAhhhNhNubh)}(h$:ref:`index of the CRTC`h]j:)}(hj Ah]hindex of the CRTC}(hjAhhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj Aubah}(h]h ]h"]h$]h&]refdocj refdomainjAreftyperef refexplicitrefwarnj crtc_indexuh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chK/hjAubh. Accepted values are source names (which are driver-specific) and the “auto” keyword, which will let the driver select a default source of frame CRCs for this CRTC.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj+AhK/hj@hhubh)}(hXMOnce frame CRC generation is enabled, userspace can capture them by reading the dri/0/crtc-N/crc/data file. Each line in that file contains the frame number in the first field and then a number of unsigned integer fields containing the CRC data. Fields are separated by a single space and the number of CRC fields is source-specific.h]hXMOnce frame CRC generation is enabled, userspace can capture them by reading the dri/0/crtc-N/crc/data file. Each line in that file contains the frame number in the first field and then a number of unsigned integer fields containing the CRC data. Fields are separated by a single space and the number of CRC fields is source-specific.}(hj6AhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chK5hj@hhubh)}(hX Note that though in some cases the CRC is computed in a specified way and on the frame contents as supplied by userspace (eDP 1.3), in general the CRC computation is performed in an unspecified way and on frame contents that have been already processed in also an unspecified way and thus userspace cannot rely on being able to generate matching CRC values for the frame contents that it submits. In this general case, the maximum userspace can do is to compare the reported CRCs of frames that should have the same contents.h]hX Note that though in some cases the CRC is computed in a specified way and on the frame contents as supplied by userspace (eDP 1.3), in general the CRC computation is performed in an unspecified way and on frame contents that have been already processed in also an unspecified way and thus userspace cannot rely on being able to generate matching CRC values for the frame contents that it submits. In this general case, the maximum userspace can do is to compare the reported CRCs of frames that should have the same contents.}(hjEAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chK;hj@hhubh)}(hXOn the driver side the implementation effort is minimal, drivers only need to implement :c:type:`drm_crtc_funcs.set_crc_source ` and :c:type:`drm_crtc_funcs.verify_crc_source `. The debugfs files are automatically set up if those vfuncs are set. CRC samples need to be captured in the driver by calling drm_crtc_add_crc_entry(). Depending on the driver and HW requirements, :c:type:`drm_crtc_funcs.set_crc_source ` may result in a commit (even a full modeset).h](hXOn the driver side the implementation effort is minimal, drivers only need to implement }(hjTAhhhNhNubh)}(h8:c:type:`drm_crtc_funcs.set_crc_source `h]j)}(hj^Ah]hdrm_crtc_funcs.set_crc_source}(hj`AhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj\Aubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_crtc_funcsuh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chKChjTAubh and }(hjTAhhhNhNubh)}(h;:c:type:`drm_crtc_funcs.verify_crc_source `h]j)}(hjAh]h drm_crtc_funcs.verify_crc_source}(hjAhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_crtc_funcsuh1hhj{AhKChjTAubh. The debugfs files are automatically set up if those vfuncs are set. CRC samples need to be captured in the driver by calling drm_crtc_add_crc_entry(). Depending on the driver and HW requirements, }(hjTAhhhNhNubh)}(h8:c:type:`drm_crtc_funcs.set_crc_source `h]j)}(hjAh]hdrm_crtc_funcs.set_crc_source}(hjAhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_crtc_funcsuh1hhj{AhKChjTAubh. may result in a commit (even a full modeset).}(hjTAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{AhKChj@hhubh)}(hXCRC results must be reliable across non-full-modeset atomic commits, so if a commit via DRM_IOCTL_MODE_ATOMIC would disable or otherwise interfere with CRC generation, then the driver must mark that commit as a full modeset (drm_atomic_crtc_needs_modeset() should return true). As a result, to ensure consistent results, generic userspace must re-setup CRC generation after a legacy SETCRTC or an atomic commit with DRM_MODE_ATOMIC_ALLOW_MODESET.h]hXCRC results must be reliable across non-full-modeset atomic commits, so if a commit via DRM_IOCTL_MODE_ATOMIC would disable or otherwise interfere with CRC generation, then the driver must mark that commit as a full modeset (drm_atomic_crtc_needs_modeset() should return true). As a result, to ensure consistent results, generic userspace must re-setup CRC generation after a legacy SETCRTC or an atomic commit with DRM_MODE_ATOMIC_ALLOW_MODESET.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:679: ./drivers/gpu/drm/drm_debugfs_crc.chKJhj@hhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j #drm_crtc_add_crc_entry (C function)c.drm_crtc_add_crc_entryhNtauh1j hj@hhhNhNubj )}(hhh](j )}(hbint drm_crtc_add_crc_entry (struct drm_crtc *crtc, bool has_frame, uint32_t frame, uint32_t *crcs)h]j )}(haint drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, uint32_t frame, uint32_t *crcs)h](j )}(hinth]hint}(hjAhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjAhhh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMubj )}(h h]h }(hjBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjAhhhjBhMubj )}(hdrm_crtc_add_crc_entryh]j )}(hdrm_crtc_add_crc_entryh]hdrm_crtc_add_crc_entry}(hjBhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjBubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjAhhhjBhMubj2 )}(hG(struct drm_crtc *crtc, bool has_frame, uint32_t frame, uint32_t *crcs)h](j8 )}(hstruct drm_crtc *crtch](j> )}(hjA h]hstruct}(hj1BhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj-Bubj )}(h h]h }(hj>BhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-Bubh)}(hhh]j )}(hdrm_crtch]hdrm_crtc}(hjOBhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjLBubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjQBmodnameN classnameNjy j| )}j ]j )}ju jBsbc.drm_crtc_add_crc_entryasbuh1hhj-Bubj )}(h h]h }(hjoBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-Bubj )}(hj h]h*}(hj}BhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-Bubj )}(hcrtch]hcrtc}(hjBhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj-Bubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj)Bubj8 )}(hbool has_frameh](j )}(hj h]hbool}(hjBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjBubj )}(h h]h }(hjBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjBubj )}(h has_frameh]h has_frame}(hjBhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjBubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj)Bubj8 )}(huint32_t frameh](h)}(hhh]j )}(huint32_th]huint32_t}(hjBhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjBubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjBmodnameN classnameNjy j| )}j ]jkBc.drm_crtc_add_crc_entryasbuh1hhjBubj )}(h h]h }(hjBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjBubj )}(hframeh]hframe}(hjChhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjBubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj)Bubj8 )}(huint32_t *crcsh](h)}(hhh]j )}(huint32_th]huint32_t}(hj"ChhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjCubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj$CmodnameN classnameNjy j| )}j ]jkBc.drm_crtc_add_crc_entryasbuh1hhjCubj )}(h h]h }(hj@ChhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjCubj )}(hj h]h*}(hjNChhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjCubj )}(hcrcsh]hcrcs}(hj[ChhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjCubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj)Bubeh}(h]h ]h"]h$]h&]hhuh1j1 hjAhhhjBhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjAhhhjBhMubah}(h]jAah ](j j eh"]h$]h&]j j )j huh1j hjBhMhjAhhubj )}(hhh]h)}(h*Add entry with CRC information for a frameh]h*Add entry with CRC information for a frame}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjChhubah}(h]h ]h"]h$]h&]uh1j hjAhhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jCj jCj j j uh1j hhhj@hNhNubj )}(hX**Parameters** ``struct drm_crtc *crtc`` CRTC to which the frame belongs ``bool has_frame`` whether this entry has a frame number to go with ``uint32_t frame`` number of the frame these CRCs are about ``uint32_t *crcs`` array of CRC values, with length matching #drm_crtc_crc.values_cnt **Description** For each frame, the driver polls the source of CRCs for new data and calls this function to add them to the buffer from where userspace reads.h](h)}(h**Parameters**h]j )}(hjCh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j hjCubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjCubj/ )}(hhh](j4 )}(h:``struct drm_crtc *crtc`` CRTC to which the frame belongs h](j: )}(h``struct drm_crtc *crtc``h]j)}(hjCh]hstruct drm_crtc *crtc}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1j9 h_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjCubjT )}(hhh]h)}(hCRTC to which the frame belongsh]hCRTC to which the frame belongs}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1jS hjCubeh}(h]h ]h"]h$]h&]uh1j3 hjChMhjCubj4 )}(hD``bool has_frame`` whether this entry has a frame number to go with h](j: )}(h``bool has_frame``h]j)}(hjCh]hbool has_frame}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1j9 h_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjCubjT )}(hhh]h)}(h0whether this entry has a frame number to go withh]h0whether this entry has a frame number to go with}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jS hjCubeh}(h]h ]h"]h$]h&]uh1j3 hjDhMhjCubj4 )}(h<``uint32_t frame`` number of the frame these CRCs are about h](j: )}(h``uint32_t frame``h]j)}(hj8Dh]huint32_t frame}(hj:DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6Dubah}(h]h ]h"]h$]h&]uh1j9 h_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhj2DubjT )}(hhh]h)}(h(number of the frame these CRCs are abouth]h(number of the frame these CRCs are about}(hjQDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMDhMhjNDubah}(h]h ]h"]h$]h&]uh1jS hj2Dubeh}(h]h ]h"]h$]h&]uh1j3 hjMDhMhjCubj4 )}(hV``uint32_t *crcs`` array of CRC values, with length matching #drm_crtc_crc.values_cnt h](j: )}(h``uint32_t *crcs``h]j)}(hjqDh]huint32_t *crcs}(hjsDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoDubah}(h]h ]h"]h$]h&]uh1j9 h_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjkDubjT )}(hhh]h)}(hBarray of CRC values, with length matching #drm_crtc_crc.values_cnth]hBarray of CRC values, with length matching #drm_crtc_crc.values_cnt}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jS hjkDubeh}(h]h ]h"]h$]h&]uh1j3 hjDhMhjCubeh}(h]h ]h"]h$]h&]uh1j. hjCubh)}(h**Description**h]j )}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjDubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjCubh)}(hFor each frame, the driver polls the source of CRCs for new data and calls this function to add them to the buffer from where userspace reads.h]hFor each frame, the driver polls the source of CRCs for new data and calls this function to add them to the buffer from where userspace reads.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh_/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:682: ./drivers/gpu/drm/drm_debugfs_crc.chMhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj@hhhNhNubeh}(h]jah ]h"]display crc supportah$]h&]uh1hhj?hhhhhMubh)}(hhh](h)}(hDebugfs Supporth]hDebugfs Support}(hjDhhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjDhhhhhMubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_DEBUGFS_GPUVA_INFO (C macro)c.DRM_DEBUGFS_GPUVA_INFOhNtauh1j hjDhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhNubj )}(hhh](j )}(hDRM_DEBUGFS_GPUVA_INFOh]j )}(hDRM_DEBUGFS_GPUVA_INFOh]j )}(hDRM_DEBUGFS_GPUVA_INFOh]j )}(hjEh]hDRM_DEBUGFS_GPUVA_INFO}(hjEhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj Eubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjEhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK)ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjEhhhj!EhK)ubah}(h]jDah ](j j eh"]h$]h&]j j )j huh1j hj!EhK)hjDhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjDhhhj!EhK)ubeh}(h]h ](jmacroeh"]h$]h&]j jj j:Ej j:Ej j j uh1j hhhjDhjDhNubh)}(h'``DRM_DEBUGFS_GPUVA_INFO (show, data)``h]j)}(hj@Eh]h#DRM_DEBUGFS_GPUVA_INFO (show, data)}(hjBEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>Eubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK+hjDhhubj))}(h5:c:type:`drm_info_list` entry to dump a GPU VA space h]h)}(h4:c:type:`drm_info_list` entry to dump a GPU VA spaceh](h)}(h:c:type:`drm_info_list`h]j)}(hj`Eh]h drm_info_list}(hjbEhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj^Eubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK)hjZEubh entry to dump a GPU VA space}(hjZEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj}EhK)hjVEubah}(h]h ]h"]h$]h&]uh1j(hj}EhK)hjDhhubj )}(hXs**Parameters** ``show`` the :c:type:`drm_info_list`'s show callback ``data`` driver private data **Description** Drivers should use this macro to define a :c:type:`drm_info_list` entry to provide a debugfs file for dumping the GPU VA space regions and mappings. For each DRM GPU VA space drivers should call drm_debugfs_gpuva_info() from their **show** callback.h](h)}(h**Parameters**h]j )}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjEubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK-hjEubj/ )}(hhh](j4 )}(h5``show`` the :c:type:`drm_info_list`'s show callback h](j: )}(h``show``h]j)}(hjEh]hshow}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK*hjEubjT )}(hhh]h)}(h+the :c:type:`drm_info_list`'s show callbackh](hthe }(hjEhhhNhNubh)}(h:c:type:`drm_info_list`h]j)}(hjEh]h drm_info_list}(hjEhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hhjEhK*hjEubh’s show callback}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjEhK*hjEubah}(h]h ]h"]h$]h&]uh1jS hjEubeh}(h]h ]h"]h$]h&]uh1j3 hjEhK*hjEubj4 )}(h``data`` driver private data h](j: )}(h``data``h]j)}(hjFh]hdata}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Fubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK+hj FubjT )}(hhh]h)}(hdriver private datah]hdriver private data}(hj(FhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$FhK+hj%Fubah}(h]h ]h"]h$]h&]uh1jS hj Fubeh}(h]h ]h"]h$]h&]uh1j3 hj$FhK+hjEubeh}(h]h ]h"]h$]h&]uh1j. hjEubh)}(h**Description**h]j )}(hjJFh]h Description}(hjLFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHFubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK-hjEubh)}(hDrivers should use this macro to define a :c:type:`drm_info_list` entry to provide a debugfs file for dumping the GPU VA space regions and mappings.h](h*Drivers should use this macro to define a }(hj`FhhhNhNubh)}(h:c:type:`drm_info_list`h]j)}(hjjFh]h drm_info_list}(hjlFhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjhFubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK,hj`FubhS entry to provide a debugfs file for dumping the GPU VA space regions and mappings.}(hj`FhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjFhK,hjEubh)}(hdFor each DRM GPU VA space drivers should call drm_debugfs_gpuva_info() from their **show** callback.h](hRFor each DRM GPU VA space drivers should call drm_debugfs_gpuva_info() from their }(hjFhhhNhNubj )}(h**show**h]hshow}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjFubh callback.}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK/hjEubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhjDhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_info_list (C struct)c.drm_info_listhNtauh1j hjDhhhjDhNubj )}(hhh](j )}(h drm_info_listh]j )}(hstruct drm_info_listh](j> )}(hjA h]hstruct}(hjFhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjFhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK5ubj )}(h h]h }(hjFhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjFhhhjFhK5ubj )}(h drm_info_listh]j )}(hjFh]h drm_info_list}(hjFhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjFubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjFhhhjFhK5ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjFhhhjFhK5ubah}(h]jFah ](j j eh"]h$]h&]j j )j huh1j hjFhK5hjFhhubj )}(hhh]h)}(hdebugfs info list entryh]hdebugfs info list entry}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK6hjGhhubah}(h]h ]h"]h$]h&]uh1j hjFhhhjFhK5ubeh}(h]h ](jstructeh"]h$]h&]j jj j-Gj j-Gj j j uh1j hhhjDhjDhNubj )}(hX(**Definition**:: struct drm_info_list { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; }; **Members** ``name`` file name ``show`` Show callback. :c:type:`seq_file->private ` will be set to the :c:type:`struct drm_info_node ` corresponding to the instance of this info on a given :c:type:`struct drm_minor `. ``driver_features`` Required driver features for this entry ``data`` Driver-private data, should not be device-specific.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj9GhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5Gubh:}(hj5GhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK:hj1Gubj)}(hstruct drm_info_list { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; };h]hstruct drm_info_list { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; };}hjRGsbah}(h]h ]h"]h$]h&]hhuh1jhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKprivate ` will be set to the :c:type:`struct drm_info_node ` corresponding to the instance of this info on a given :c:type:`struct drm_minor `. h](j: )}(h``show``h]j)}(hjGh]hshow}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKBhjGubjT )}(hhh]h)}(hShow callback. :c:type:`seq_file->private ` will be set to the :c:type:`struct drm_info_node ` corresponding to the instance of this info on a given :c:type:`struct drm_minor `.h](hShow callback. }(hjGhhhNhNubh)}(h&:c:type:`seq_file->private `h]j)}(hjGh]hseq_file->private}(hjGhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jseq_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK@hjGubh will be set to the }(hjGhhhNhNubh)}(h.:c:type:`struct drm_info_node `h]j)}(hjHh]hstruct drm_info_node}(hjHhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_nodeuh1hhjGhK@hjGubh7 corresponding to the instance of this info on a given }(hjGhhhNhNubh)}(h&:c:type:`struct drm_minor `h]j)}(hj%Hh]hstruct drm_minor}(hj'HhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj#Hubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_minoruh1hhjGhK@hjGubh.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjGhK@hjGubah}(h]h ]h"]h$]h&]uh1jS hjGubeh}(h]h ]h"]h$]h&]uh1j3 hjGhKBhjyGubj4 )}(h<``driver_features`` Required driver features for this entry h](j: )}(h``driver_features``h]j)}(hj^Hh]hdriver_features}(hj`HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\Hubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKGhjXHubjT )}(hhh]h)}(h'Required driver features for this entryh]h'Required driver features for this entry}(hjwHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjsHhKGhjtHubah}(h]h ]h"]h$]h&]uh1jS hjXHubeh}(h]h ]h"]h$]h&]uh1j3 hjsHhKGhjyGubj4 )}(h<``data`` Driver-private data, should not be device-specific.h](j: )}(h``data``h]j)}(hjHh]hdata}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKHhjHubjT )}(hhh]h)}(h3Driver-private data, should not be device-specific.h]h3Driver-private data, should not be device-specific.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKIhjHubah}(h]h ]h"]h$]h&]uh1jS hjHubeh}(h]h ]h"]h$]h&]uh1j3 hjHhKHhjyGubeh}(h]h ]h"]h$]h&]uh1j. hj1Gubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhjDhNubh)}(h**Description**h]j )}(hjHh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKLhjDhhubh)}(hGThis structure represents a debugfs file to be created by the drm core.h]hGThis structure represents a debugfs file to be created by the drm core.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK7hjDhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_info_node (C struct)c.drm_info_nodehNtauh1j hjDhhhjDhNubj )}(hhh](j )}(h drm_info_nodeh]j )}(hstruct drm_info_nodeh](j> )}(hjA h]hstruct}(hjIhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjIhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK=ubj )}(h h]h }(hj&IhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjIhhhj%IhK=ubj )}(h drm_info_nodeh]j )}(hjIh]h drm_info_node}(hj8IhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj4Iubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjIhhhj%IhK=ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjIhhhj%IhK=ubah}(h]j Iah ](j j eh"]h$]h&]j j )j huh1j hj%IhK=hj Ihhubj )}(hhh]h)}(h Per-minor debugfs node structureh]h Per-minor debugfs node structure}(hjZIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKMhjWIhhubah}(h]h ]h"]h$]h&]uh1j hj Ihhhj%IhK=ubeh}(h]h ](jstructeh"]h$]h&]j jj jrIj jrIj j j uh1j hhhjDhjDhNubj )}(h**Definition**:: struct drm_info_node { struct drm_minor *minor; const struct drm_info_list *info_ent; }; **Members** ``minor`` :c:type:`struct drm_minor ` for this node. ``info_ent`` template for this node.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj~IhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjzIubh:}(hjzIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKQhjvIubj)}(h`struct drm_info_node { struct drm_minor *minor; const struct drm_info_list *info_ent; };h]h`struct drm_info_node { struct drm_minor *minor; const struct drm_info_list *info_ent; };}hjIsbah}(h]h ]h"]h$]h&]hhuh1jhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKShjvIubh)}(h **Members**h]j )}(hjIh]hMembers}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjIubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKXhjvIubj/ )}(hhh](j4 )}(h@``minor`` :c:type:`struct drm_minor ` for this node. h](j: )}(h ``minor``h]j)}(hjIh]hminor}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKZhjIubjT )}(hhh]h)}(h5:c:type:`struct drm_minor ` for this node.h](h)}(h&:c:type:`struct drm_minor `h]j)}(hjIh]hstruct drm_minor}(hjIhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_minoruh1hhjIhKZhjIubh for this node.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjIhKZhjIubah}(h]h ]h"]h$]h&]uh1jS hjIubeh}(h]h ]h"]h$]h&]uh1j3 hjIhKZhjIubj4 )}(h$``info_ent`` template for this node.h](j: )}(h ``info_ent``h]j)}(hjJh]hinfo_ent}(hj!JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK[hjJubjT )}(hhh]h)}(htemplate for this node.h]htemplate for this node.}(hj8JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK\hj5Jubah}(h]h ]h"]h$]h&]uh1jS hjJubeh}(h]h ]h"]h$]h&]uh1j3 hj4JhK[hjIubeh}(h]h ]h"]h$]h&]uh1j. hjvIubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhjDhNubh)}(h**Description**h]j )}(hjbJh]h Description}(hjdJhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj`Jubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK_hjDhhubh)}(hThis structure represents a debugfs file, as an instantiation of a :c:type:`struct drm_info_list ` on a :c:type:`struct drm_minor `.h](hCThis structure represents a debugfs file, as an instantiation of a }(hjxJhhhNhNubh)}(h.:c:type:`struct drm_info_list `h]j)}(hjJh]hstruct drm_info_list}(hjJhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKNhjxJubh on a }(hjxJhhhNhNubh)}(h&:c:type:`struct drm_minor `h]j)}(hjJh]hstruct drm_minor}(hjJhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_minoruh1hhjJhKNhjxJubh.}(hjxJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjJhKNhjDhhubh)}(hFIXME:h]hFIXME:}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKQhjDhhubh)}(hNo it doesn't make a hole lot of sense that we duplicate debugfs entries for both the render and the primary nodes, but that's how this has organically grown. It should probably be fixed, with a compatibility link, if needed.h]hNo it doesn’t make a hole lot of sense that we duplicate debugfs entries for both the render and the primary nodes, but that’s how this has organically grown. It should probably be fixed, with a compatibility link, if needed.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKShjDhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_debugfs_info (C struct)c.drm_debugfs_infohNtauh1j hjDhhhjDhNubj )}(hhh](j )}(hdrm_debugfs_infoh]j )}(hstruct drm_debugfs_infoh](j> )}(hjA h]hstruct}(hjKhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjKhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKZubj )}(h h]h }(hjKhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjKhhhjKhKZubj )}(hdrm_debugfs_infoh]j )}(hjJh]hdrm_debugfs_info}(hj$KhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj Kubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjKhhhjKhKZubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjJhhhjKhKZubah}(h]jJah ](j j eh"]h$]h&]j j )j huh1j hjKhKZhjJhhubj )}(hhh]h)}(hdebugfs info list entryh]hdebugfs info list entry}(hjFKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKchjCKhhubah}(h]h ]h"]h$]h&]uh1j hjJhhhjKhKZubeh}(h]h ](jstructeh"]h$]h&]j jj j^Kj j^Kj j j uh1j hhhjDhjDhNubj )}(hX6**Definition**:: struct drm_debugfs_info { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; }; **Members** ``name`` File name ``show`` Show callback. :c:type:`seq_file->private ` will be set to the :c:type:`struct drm_debugfs_entry ` corresponding to the instance of this info on a given :c:type:`struct drm_device `. ``driver_features`` Required driver features for this entry. ``data`` Driver-private data, should not be device-specific.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjfKubh:}(hjfKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKghjbKubj)}(hstruct drm_debugfs_info { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; };h]hstruct drm_debugfs_info { const char *name; int (*show)(struct seq_file*, void*); u32 driver_features; void *data; };}hjKsbah}(h]h ]h"]h$]h&]hhuh1jhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKihjbKubh)}(h **Members**h]j )}(hjKh]hMembers}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjKubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKphjbKubj/ )}(hhh](j4 )}(h``name`` File name h](j: )}(h``name``h]j)}(hjKh]hname}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKjhjKubjT )}(hhh]h)}(h File nameh]h File name}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhKjhjKubah}(h]h ]h"]h$]h&]uh1jS hjKubeh}(h]h ]h"]h$]h&]uh1j3 hjKhKjhjKubj4 )}(h``show`` Show callback. :c:type:`seq_file->private ` will be set to the :c:type:`struct drm_debugfs_entry ` corresponding to the instance of this info on a given :c:type:`struct drm_device `. h](j: )}(h``show``h]j)}(hjKh]hshow}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKphjKubjT )}(hhh]h)}(hShow callback. :c:type:`seq_file->private ` will be set to the :c:type:`struct drm_debugfs_entry ` corresponding to the instance of this info on a given :c:type:`struct drm_device `.h](hShow callback. }(hjLhhhNhNubh)}(h&:c:type:`seq_file->private `h]j)}(hjLh]hseq_file->private}(hjLhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj Lubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jseq_fileuh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKnhjLubh will be set to the }(hjLhhhNhNubh)}(h6:c:type:`struct drm_debugfs_entry `h]j)}(hj3Lh]hstruct drm_debugfs_entry}(hj5LhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj1Lubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_debugfs_entryuh1hhj,LhKnhjLubh7 corresponding to the instance of this info on a given }(hjLhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjVLh]hstruct drm_device}(hjXLhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjTLubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhj,LhKnhjLubh.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,LhKnhjLubah}(h]h ]h"]h$]h&]uh1jS hjKubeh}(h]h ]h"]h$]h&]uh1j3 hjLhKphjKubj4 )}(h=``driver_features`` Required driver features for this entry. h](j: )}(h``driver_features``h]j)}(hjLh]hdriver_features}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKvhjLubjT )}(hhh]h)}(h(Required driver features for this entry.h]h(Required driver features for this entry.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhKvhjLubah}(h]h ]h"]h$]h&]uh1jS hjLubeh}(h]h ]h"]h$]h&]uh1j3 hjLhKvhjKubj4 )}(h<``data`` Driver-private data, should not be device-specific.h](j: )}(h``data``h]j)}(hjLh]hdata}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKxhjLubjT )}(hhh]h)}(h3Driver-private data, should not be device-specific.h]h3Driver-private data, should not be device-specific.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKyhjLubah}(h]h ]h"]h$]h&]uh1jS hjLubeh}(h]h ]h"]h$]h&]uh1j3 hjLhKxhjKubeh}(h]h ]h"]h$]h&]uh1j. hjbKubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhjDhNubh)}(h**Description**h]j )}(hj Mh]h Description}(hj MhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj Mubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK|hjDhhubh)}(hGThis structure represents a debugfs file to be created by the drm core.h]hGThis structure represents a debugfs file to be created by the drm core.}(hj!MhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKdhjDhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_debugfs_entry (C struct)c.drm_debugfs_entryhNtauh1j hjDhhhjDhNubj )}(hhh](j )}(hdrm_debugfs_entryh]j )}(hstruct drm_debugfs_entryh](j> )}(hjA h]hstruct}(hjIMhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjEMhhhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKjubj )}(h h]h }(hjWMhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjEMhhhjVMhKjubj )}(hdrm_debugfs_entryh]j )}(hjCMh]hdrm_debugfs_entry}(hjiMhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjeMubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjEMhhhjVMhKjubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjAMhhhjVMhKjubah}(h]jMhhubj )}(hhh]h)}(h!Per-device debugfs node structureh]h!Per-device debugfs node structure}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK}hjMhhubah}(h]h ]h"]h$]h&]uh1j hj>MhhhjVMhKjubeh}(h]h ](jstructeh"]h$]h&]j jj jMj jMj j j uh1j hhhjDhjDhNubj )}(hX3**Definition**:: struct drm_debugfs_entry { struct drm_device *dev; struct drm_debugfs_info file; struct list_head list; }; **Members** ``dev`` :c:type:`struct drm_device ` for this node. ``file`` Template for this node. ``list`` Linked list of all device nodes.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjMubh:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjMubj)}(hvstruct drm_debugfs_entry { struct drm_device *dev; struct drm_debugfs_info file; struct list_head list; };h]hvstruct drm_debugfs_entry { struct drm_device *dev; struct drm_debugfs_info file; struct list_head list; };}hjMsbah}(h]h ]h"]h$]h&]hhuh1jhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjMubh)}(h **Members**h]j )}(hjMh]hMembers}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjMubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjMubj/ )}(hhh](j4 )}(h@``dev`` :c:type:`struct drm_device ` for this node. h](j: )}(h``dev``h]j)}(hjMh]hdev}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjMubjT )}(hhh]h)}(h7:c:type:`struct drm_device ` for this node.h](h)}(h(:c:type:`struct drm_device `h]j)}(hjNh]hstruct drm_device}(hjNhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhj NhKhjNubh for this node.}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj NhKhjNubah}(h]h ]h"]h$]h&]uh1jS hjMubeh}(h]h ]h"]h$]h&]uh1j3 hj NhKhjMubj4 )}(h!``file`` Template for this node. h](j: )}(h``file``h]j)}(hjPNh]hfile}(hjRNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNNubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjJNubjT )}(hhh]h)}(hTemplate for this node.h]hTemplate for this node.}(hjiNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjeNhKhjfNubah}(h]h ]h"]h$]h&]uh1jS hjJNubeh}(h]h ]h"]h$]h&]uh1j3 hjeNhKhjMubj4 )}(h)``list`` Linked list of all device nodes.h](j: )}(h``list``h]j)}(hjNh]hlist}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1j9 hW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjNubjT )}(hhh]h)}(h Linked list of all device nodes.h]h Linked list of all device nodes.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjNubah}(h]h ]h"]h$]h&]uh1jS hjNubeh}(h]h ]h"]h$]h&]uh1j3 hjNhKhjMubeh}(h]h ]h"]h$]h&]uh1j. hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhjDhNubh)}(h**Description**h]j )}(hjNh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjNubah}(h]h ]h"]h$]h&]uh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhKhjDhhubh)}(hThis structure represents a debugfs file, as an instantiation of a :c:type:`struct drm_debugfs_info ` on a :c:type:`struct drm_device `.h](hCThis structure represents a debugfs file, as an instantiation of a }(hjNhhhNhNubh)}(h4:c:type:`struct drm_debugfs_info `h]j)}(hjNh]hstruct drm_debugfs_info}(hjNhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_debugfs_infouh1hhW/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:688: ./include/drm/drm_debugfs.hhK~hjNubh on a }(hjNhhhNhNubh)}(h(:c:type:`struct drm_device `h]j)}(hjOh]hstruct drm_device}(hjOhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhj OhK~hjNubh.}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj OhK~hjDhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j #drm_debugfs_gpuva_info (C function)c.drm_debugfs_gpuva_infohNtauh1j hjDhhhNhNubj )}(hhh](j )}(hHint drm_debugfs_gpuva_info (struct seq_file *m, struct drm_gpuvm *gpuvm)h]j )}(hGint drm_debugfs_gpuva_info(struct seq_file *m, struct drm_gpuvm *gpuvm)h](j )}(hinth]hint}(hjPOhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjLOhhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKubj )}(h h]h }(hj_OhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjLOhhhj^OhKubj )}(hdrm_debugfs_gpuva_infoh]j )}(hdrm_debugfs_gpuva_infoh]hdrm_debugfs_gpuva_info}(hjqOhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjmOubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjLOhhhj^OhKubj2 )}(h-(struct seq_file *m, struct drm_gpuvm *gpuvm)h](j8 )}(hstruct seq_file *mh](j> )}(hjA h]hstruct}(hjOhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjOubj )}(h h]h }(hjOhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubh)}(hhh]j )}(hseq_fileh]hseq_file}(hjOhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjOubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjOmodnameN classnameNjy j| )}j ]j )}ju jsOsbc.drm_debugfs_gpuva_infoasbuh1hhjOubj )}(h h]h }(hjOhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubj )}(hj h]h*}(hjOhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubj )}(hmh]hm}(hjOhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjOubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjOubj8 )}(hstruct drm_gpuvm *gpuvmh](j> )}(hjA h]hstruct}(hjOhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjOubj )}(h h]h }(hj PhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubh)}(hhh]j )}(h drm_gpuvmh]h drm_gpuvm}(hjPhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjPubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjPmodnameN classnameNjy j| )}j ]jOc.drm_debugfs_gpuva_infoasbuh1hhjOubj )}(h h]h }(hj;PhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubj )}(hj h]h*}(hjIPhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjOubj )}(hgpuvmh]hgpuvm}(hjVPhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjOubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjOubeh}(h]h ]h"]h$]h&]hhuh1j1 hjLOhhhj^OhKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjHOhhhj^OhKubah}(h]jCOah ](j j eh"]h$]h&]j j )j huh1j hj^OhKhjEOhhubj )}(hhh]h)}(hdump the given DRM GPU VA spaceh]hdump the given DRM GPU VA space}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhj}Phhubah}(h]h ]h"]h$]h&]uh1j hjEOhhhj^OhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jPj jPj j j uh1j hhhjDhNhNubj )}(hX**Parameters** ``struct seq_file *m`` pointer to the :c:type:`seq_file` to write ``struct drm_gpuvm *gpuvm`` the :c:type:`drm_gpuvm` representing the GPU VA space **Description** Dumps the GPU VA mappings of a given DRM GPU VA manager. For each DRM GPU VA space drivers should call this function from their :c:type:`drm_info_list`'s show callback. **Return** 0 on success, -ENODEV if the :c:type:`gpuvm` is not initializedh](h)}(h**Parameters**h]j )}(hjPh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjPubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjPubj/ )}(hhh](j4 )}(hB``struct seq_file *m`` pointer to the :c:type:`seq_file` to write h](j: )}(h``struct seq_file *m``h]j)}(hjPh]hstruct seq_file *m}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjPubjT )}(hhh]h)}(h*pointer to the :c:type:`seq_file` to writeh](hpointer to the }(hjPhhhNhNubh)}(h:c:type:`seq_file`h]j)}(hjPh]hseq_file}(hjPhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jseq_fileuh1hhjPhKhjPubh to write}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjPhKhjPubah}(h]h ]h"]h$]h&]uh1jS hjPubeh}(h]h ]h"]h$]h&]uh1j3 hjPhKhjPubj4 )}(hR``struct drm_gpuvm *gpuvm`` the :c:type:`drm_gpuvm` representing the GPU VA space h](j: )}(h``struct drm_gpuvm *gpuvm``h]j)}(hjQh]hstruct drm_gpuvm *gpuvm}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjQubjT )}(hhh]h)}(h5the :c:type:`drm_gpuvm` representing the GPU VA spaceh](hthe }(hj6QhhhNhNubh)}(h:c:type:`drm_gpuvm`h]j)}(hj@Qh]h drm_gpuvm}(hjBQhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj>Qubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_gpuvmuh1hhj2QhKhj6Qubh representing the GPU VA space}(hj6QhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj2QhKhj3Qubah}(h]h ]h"]h$]h&]uh1jS hjQubeh}(h]h ]h"]h$]h&]uh1j3 hj2QhKhjPubeh}(h]h ]h"]h$]h&]uh1j. hjPubh)}(h**Description**h]j )}(hj{Qh]h Description}(hj}QhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjyQubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjPubh)}(h8Dumps the GPU VA mappings of a given DRM GPU VA manager.h]h8Dumps the GPU VA mappings of a given DRM GPU VA manager.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjPubh)}(hoFor each DRM GPU VA space drivers should call this function from their :c:type:`drm_info_list`'s show callback.h](hGFor each DRM GPU VA space drivers should call this function from their }(hjQhhhNhNubh)}(h:c:type:`drm_info_list`h]j)}(hjQh]h drm_info_list}(hjQhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjQubh’s show callback.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjQhKhjPubh)}(h **Return**h]j )}(hjQh]hReturn}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjQubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjPubh)}(h?0 on success, -ENODEV if the :c:type:`gpuvm` is not initializedh](h0 on success, -ENODEV if the }(hjQhhhNhNubh)}(h:c:type:`gpuvm`h]j)}(hjQh]hgpuvm}(hjQhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jgpuvmuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjQubh is not initialized}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjRhKhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j %drm_debugfs_create_files (C function)c.drm_debugfs_create_fileshNtauh1j hjDhhhNhNubj )}(hhh](j )}(hzvoid drm_debugfs_create_files (const struct drm_info_list *files, int count, struct dentry *root, struct drm_minor *minor)h]j )}(hyvoid drm_debugfs_create_files(const struct drm_info_list *files, int count, struct dentry *root, struct drm_minor *minor)h](j )}(hvoidh]hvoid}(hj )}(hconsth]hconst}(hjyRhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjuRubj )}(h h]h }(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjuRubj> )}(hjA h]hstruct}(hjRhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjuRubj )}(h h]h }(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjuRubh)}(hhh]j )}(h drm_info_listh]h drm_info_list}(hjRhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjRubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjRmodnameN classnameNjy j| )}j ]j )}ju j_Rsbc.drm_debugfs_create_filesasbuh1hhjuRubj )}(h h]h }(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjuRubj )}(hj h]h*}(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjuRubj )}(hfilesh]hfiles}(hjRhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjuRubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjqRubj8 )}(h int counth](j )}(hinth]hint}(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(hcounth]hcount}(hj#ShhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjqRubj8 )}(hstruct dentry *rooth](j> )}(hjA h]hstruct}(hj )}(hjA h]hstruct}(hjShhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjSubj )}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubh)}(hhh]j )}(h drm_minorh]h drm_minor}(hjShhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjSubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjSmodnameN classnameNjy j| )}j ]jRc.drm_debugfs_create_filesasbuh1hhjSubj )}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(hj h]h*}(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjSubj )}(hminorh]hminor}(hjThhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjqRubeh}(h]h ]h"]h$]h&]hhuh1j1 hj8RhhhjJRhKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj4RhhhjJRhKubah}(h]j/Rah ](j j eh"]h$]h&]j j )j huh1j hjJRhKhj1Rhhubj )}(hhh]h)}(h5Initialize a given set of debugfs files for DRM minorh]h5Initialize a given set of debugfs files for DRM minor}(hj-ThhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhj*Thhubah}(h]h ]h"]h$]h&]uh1j hj1RhhhjJRhKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jETj jETj j j uh1j hhhjDhNhNubj )}(hX**Parameters** ``const struct drm_info_list *files`` The array of files to create ``int count`` The number of files given ``struct dentry *root`` DRI debugfs dir entry. ``struct drm_minor *minor`` device minor number **Description** Create a given set of debugfs files represented by an array of :c:type:`struct drm_info_list ` in the given root directory. These files will be removed automatically on drm_debugfs_dev_fini().h](h)}(h**Parameters**h]j )}(hjOTh]h Parameters}(hjQThhhNhNubah}(h]h ]h"]h$]h&]uh1j hjMTubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjITubj/ )}(hhh](j4 )}(hC``const struct drm_info_list *files`` The array of files to create h](j: )}(h%``const struct drm_info_list *files``h]j)}(hjnTh]h!const struct drm_info_list *files}(hjpThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlTubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjhTubjT )}(hhh]h)}(hThe array of files to createh]hThe array of files to create}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjTubah}(h]h ]h"]h$]h&]uh1jS hjhTubeh}(h]h ]h"]h$]h&]uh1j3 hjThKhjeTubj4 )}(h(``int count`` The number of files given h](j: )}(h ``int count``h]j)}(hjTh]h int count}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjTubjT )}(hhh]h)}(hThe number of files givenh]hThe number of files given}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjTubah}(h]h ]h"]h$]h&]uh1jS hjTubeh}(h]h ]h"]h$]h&]uh1j3 hjThKhjeTubj4 )}(h/``struct dentry *root`` DRI debugfs dir entry. h](j: )}(h``struct dentry *root``h]j)}(hjTh]hstruct dentry *root}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjTubjT )}(hhh]h)}(hDRI debugfs dir entry.h]hDRI debugfs dir entry.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjTubah}(h]h ]h"]h$]h&]uh1jS hjTubeh}(h]h ]h"]h$]h&]uh1j3 hjThKhjeTubj4 )}(h0``struct drm_minor *minor`` device minor number h](j: )}(h``struct drm_minor *minor``h]j)}(hjUh]hstruct drm_minor *minor}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjUubjT )}(hhh]h)}(hdevice minor numberh]hdevice minor number}(hj2UhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.UhKhj/Uubah}(h]h ]h"]h$]h&]uh1jS hjUubeh}(h]h ]h"]h$]h&]uh1j3 hj.UhKhjeTubeh}(h]h ]h"]h$]h&]uh1j. hjITubh)}(h**Description**h]j )}(hjTUh]h Description}(hjVUhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjRUubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjITubh)}(hCreate a given set of debugfs files represented by an array of :c:type:`struct drm_info_list ` in the given root directory. These files will be removed automatically on drm_debugfs_dev_fini().h](h?Create a given set of debugfs files represented by an array of }(hjjUhhhNhNubh)}(h.:c:type:`struct drm_info_list `h]j)}(hjtUh]hstruct drm_info_list}(hjvUhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjrUubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_info_listuh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chKhjjUubhb in the given root directory. These files will be removed automatically on drm_debugfs_dev_fini().}(hjjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjUhKhjITubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !drm_debugfs_add_file (C function)c.drm_debugfs_add_filehNtauh1j hjDhhhNhNubj )}(hhh](j )}(hvvoid drm_debugfs_add_file (struct drm_device *dev, const char *name, int (*show)(struct seq_file*, void*), void *data)h]j )}(huvoid drm_debugfs_add_file(struct drm_device *dev, const char *name, int (*show)(struct seq_file*, void*), void *data)h](j )}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjUhhh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMubj )}(h h]h }(hjUhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjUhhhjUhMubj )}(hdrm_debugfs_add_fileh]j )}(hdrm_debugfs_add_fileh]hdrm_debugfs_add_file}(hjUhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjUubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjUhhhjUhMubj2 )}(h\(struct drm_device *dev, const char *name, int (*show)(struct seq_file*, void*), void *data)h](j8 )}(hstruct drm_device *devh](j> )}(hjA h]hstruct}(hjUhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjUubj )}(h h]h }(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjUubh)}(hhh]j )}(h drm_deviceh]h drm_device}(hjVhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjVubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjVmodnameN classnameNjy j| )}j ]j )}ju jUsbc.drm_debugfs_add_fileasbuh1hhjUubj )}(h h]h }(hj7VhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjUubj )}(hj h]h*}(hjEVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjUubj )}(hdevh]hdev}(hjRVhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjUubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjUubj8 )}(hconst char *nameh](j> )}(hj{Rh]hconst}(hjkVhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjgVubj )}(h h]h }(hjxVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjgVubj )}(hcharh]hchar}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjgVubj )}(h h]h }(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjgVubj )}(hj h]h*}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjgVubj )}(hnameh]hname}(hjVhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjgVubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjUubj8 )}(h$int (*show)(struct seq_file*, void*)h](j )}(hinth]hint}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(h h]h }(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(h(h]h(}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hj h]h*}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hshowh]hshow}(hjVhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjVubj )}(h)h]h)}(hj WhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hjVh]h(}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj> )}(hjA h]hstruct}(hj(WhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjVubj )}(h h]h }(hj5WhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubh)}(hhh]j )}(hseq_fileh]hseq_file}(hjFWhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjCWubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjHWmodnameN classnameNjy j| )}j ]j3Vc.drm_debugfs_add_fileasbuh1hhjVubj )}(hj h]h*}(hjdWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(h,h]h,}(hjqWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(h h]h }(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hj h]h*}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubj )}(hjWh]h)}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjVubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjUubj8 )}(h void *datah](j )}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjWubj )}(h h]h }(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjWubj )}(hj h]h*}(hjWhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjWubj )}(hdatah]hdata}(hjWhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjWubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjUubeh}(h]h ]h"]h$]h&]hhuh1j1 hjUhhhjUhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjUhhhjUhMubah}(h]jUah ](j j eh"]h$]h&]j j )j huh1j hjUhMhjUhhubj )}(hhh]h)}(h4Add a given file to the DRM device debugfs file listh]h4Add a given file to the DRM device debugfs file list}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjXhhubah}(h]h ]h"]h$]h&]uh1j hjUhhhjUhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j+Xj j+Xj j j uh1j hhhjDhNhNubj )}(hX^**Parameters** ``struct drm_device *dev`` drm device for the ioctl ``const char *name`` debugfs file name ``int (*show)(struct seq_file*, void*)`` show callback ``void *data`` driver-private data, should not be device-specific **Description** Add a given file entry to the DRM device debugfs file list to be created on drm_debugfs_init.h](h)}(h**Parameters**h]j )}(hj5Xh]h Parameters}(hj7XhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3Xubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhj/Xubj/ )}(hhh](j4 )}(h4``struct drm_device *dev`` drm device for the ioctl h](j: )}(h``struct drm_device *dev``h]j)}(hjTXh]hstruct drm_device *dev}(hjVXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRXubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjNXubjT )}(hhh]h)}(hdrm device for the ioctlh]hdrm device for the ioctl}(hjmXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiXhMhjjXubah}(h]h ]h"]h$]h&]uh1jS hjNXubeh}(h]h ]h"]h$]h&]uh1j3 hjiXhMhjKXubj4 )}(h'``const char *name`` debugfs file name h](j: )}(h``const char *name``h]j)}(hjXh]hconst char *name}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjXubjT )}(hhh]h)}(hdebugfs file nameh]hdebugfs file name}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjXubah}(h]h ]h"]h$]h&]uh1jS hjXubeh}(h]h ]h"]h$]h&]uh1j3 hjXhMhjKXubj4 )}(h7``int (*show)(struct seq_file*, void*)`` show callback h](j: )}(h(``int (*show)(struct seq_file*, void*)``h]j)}(hjXh]h$int (*show)(struct seq_file*, void*)}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjXubjT )}(hhh]h)}(h show callbackh]h show callback}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXhMhjXubah}(h]h ]h"]h$]h&]uh1jS hjXubeh}(h]h ]h"]h$]h&]uh1j3 hjXhMhjKXubj4 )}(hB``void *data`` driver-private data, should not be device-specific h](j: )}(h``void *data``h]j)}(hjXh]h void *data}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjXubjT )}(hhh]h)}(h2driver-private data, should not be device-specifich]h2driver-private data, should not be device-specific}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jS hjXubeh}(h]h ]h"]h$]h&]uh1j3 hjYhMhjKXubeh}(h]h ]h"]h$]h&]uh1j. hj/Xubh)}(h**Description**h]j )}(hj:Yh]h Description}(hj )}(hjA h]hstruct}(hjYhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjYubj )}(h h]h }(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjYubh)}(hhh]j )}(h drm_deviceh]h drm_device}(hjYhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjYubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjYmodnameN classnameNjy j| )}j ]j )}ju jYsbc.drm_debugfs_add_filesasbuh1hhjYubj )}(h h]h }(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjYubj )}(hj h]h*}(hjZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjYubj )}(hdevh]hdev}(hjZhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjYubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjYubj8 )}(h$const struct drm_debugfs_info *filesh](j> )}(hj{Rh]hconst}(hj.ZhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj*Zubj )}(h h]h }(hj;ZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*Zubj> )}(hjA h]hstruct}(hjIZhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj*Zubj )}(h h]h }(hjVZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*Zubh)}(hhh]j )}(hdrm_debugfs_infoh]hdrm_debugfs_info}(hjgZhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjdZubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjiZmodnameN classnameNjy j| )}j ]jYc.drm_debugfs_add_filesasbuh1hhj*Zubj )}(h h]h }(hjZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*Zubj )}(hj h]h*}(hjZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*Zubj )}(hfilesh]hfiles}(hjZhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj*Zubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjYubj8 )}(h int counth](j )}(hinth]hint}(hjZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjZubj )}(h h]h }(hjZhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjZubj )}(hcounth]hcount}(hjZhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjZubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjYubeh}(h]h ]h"]h$]h&]hhuh1j1 hj{YhhhjYhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjwYhhhjYhMubah}(h]jrYah ](j j eh"]h$]h&]j j )j huh1j hjYhMhjtYhhubj )}(hhh]h)}(h9Add an array of files to the DRM device debugfs file listh]h9Add an array of files to the DRM device debugfs file list}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjZhhubah}(h]h ]h"]h$]h&]uh1j hjtYhhhjYhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j[j j[j j j uh1j hhhjDhNhNubj )}(hXa**Parameters** ``struct drm_device *dev`` drm device for the ioctl ``const struct drm_debugfs_info *files`` The array of files to create ``int count`` The number of files given **Description** Add a given set of debugfs files represented by an array of :c:type:`struct drm_debugfs_info ` in the DRM device debugfs file list.h](h)}(h**Parameters**h]j )}(hj![h]h Parameters}(hj#[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj[ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjbj/ )}(hhh](j4 )}(h4``struct drm_device *dev`` drm device for the ioctl h](j: )}(h``struct drm_device *dev``h]j)}(hj@[h]hstruct drm_device *dev}(hjB[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>[ubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhj:[ubjT )}(hhh]h)}(hdrm device for the ioctlh]hdrm device for the ioctl}(hjY[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU[hMhjV[ubah}(h]h ]h"]h$]h&]uh1jS hj:[ubeh}(h]h ]h"]h$]h&]uh1j3 hjU[hMhj7[ubj4 )}(hF``const struct drm_debugfs_info *files`` The array of files to create h](j: )}(h(``const struct drm_debugfs_info *files``h]j)}(hjy[h]h$const struct drm_debugfs_info *files}(hj{[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw[ubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjs[ubjT )}(hhh]h)}(hThe array of files to createh]hThe array of files to create}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1jS hjs[ubeh}(h]h ]h"]h$]h&]uh1j3 hj[hMhj7[ubj4 )}(h(``int count`` The number of files given h](j: )}(h ``int count``h]j)}(hj[h]h int count}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1j9 h[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhj[ubjT )}(hhh]h)}(hThe number of files givenh]hThe number of files given}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj[ubah}(h]h ]h"]h$]h&]uh1jS hj[ubeh}(h]h ]h"]h$]h&]uh1j3 hj[hMhj7[ubeh}(h]h ]h"]h$]h&]uh1j. hjbh)}(h**Description**h]j )}(hj[h]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj[ubah}(h]h ]h"]h$]h&]uh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhjbh)}(hAdd a given set of debugfs files represented by an array of :c:type:`struct drm_debugfs_info ` in the DRM device debugfs file list.h](h`h]j)}(hj \h]hstruct drm_debugfs_info}(hj\hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj \ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_debugfs_infouh1hh[/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:691: ./drivers/gpu/drm/drm_debugfs.chMhj\ubh% in the DRM device debugfs file list.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj*\hMhjbeh}(h]h ] kernelindentah"]h$]h&]uh1j hjDhhhNhNubeh}(h]jah ]h"]debugfs supportah$]h&]uh1hhj?hhhhhMubeh}(h]jah ]h"]testing and validationah$]h&]uh1hhhhhhhhMlubh)}(hhh](h)}(h Sysfs Supporth]h Sysfs Support}(hjM\hhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjJ\hhhhhMubh)}(hX.DRM provides very little additional support to drivers for sysfs interactions, beyond just all the standard stuff. Drivers who want to expose additional sysfs properties and property groups can attach them at either :c:type:`drm_device.dev ` or :c:type:`drm_connector.kdev `.h](hDRM provides very little additional support to drivers for sysfs interactions, beyond just all the standard stuff. Drivers who want to expose additional sysfs properties and property groups can attach them at either }(hj[\hhhNhNubh)}(h%:c:type:`drm_device.dev `h]j)}(hje\h]hdrm_device.dev}(hjg\hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjc\ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_deviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:697: ./drivers/gpu/drm/drm_sysfs.chK+hj[\ubh or }(hj[\hhhNhNubh)}(h,:c:type:`drm_connector.kdev `h]j)}(hj\h]hdrm_connector.kdev}(hj\hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_connectoruh1hhj\hK+hj[\ubh.}(hj[\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj\hK+hjJ\hhubh)}(hRegistration is automatically handled when calling drm_dev_register(), or drm_connector_register() in case of hot-plugged connectors. Unregistration is also automatically handled by drm_dev_unregister() and drm_connector_unregister().h]hRegistration is automatically handled when calling drm_dev_register(), or drm_connector_register() in case of hot-plugged connectors. Unregistration is also automatically handled by drm_dev_unregister() and drm_connector_unregister().}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:697: ./drivers/gpu/drm/drm_sysfs.chK0hjJ\hhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j $drm_sysfs_hotplug_event (C function)c.drm_sysfs_hotplug_eventhNtauh1j hjJ\hhhNhNubj )}(hhh](j )}(h5void drm_sysfs_hotplug_event (struct drm_device *dev)h]j )}(h4void drm_sysfs_hotplug_event(struct drm_device *dev)h](j )}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj\hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMubj )}(h h]h }(hj\hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj\hhhj\hMubj )}(hdrm_sysfs_hotplug_eventh]j )}(hdrm_sysfs_hotplug_eventh]hdrm_sysfs_hotplug_event}(hj\hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj\ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj\hhhj\hMubj2 )}(h(struct drm_device *dev)h]j8 )}(hstruct drm_device *devh](j> )}(hjA h]hstruct}(hj]hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj]ubj )}(h h]h }(hj"]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj]ubh)}(hhh]j )}(h drm_deviceh]h drm_device}(hj3]hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj0]ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj5]modnameN classnameNjy j| )}j ]j )}ju j\sbc.drm_sysfs_hotplug_eventasbuh1hhj]ubj )}(h h]h }(hjS]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj]ubj )}(hj h]h*}(hja]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj]ubj )}(hdevh]hdev}(hjn]hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj ]ubah}(h]h ]h"]h$]h&]hhuh1j1 hj\hhhj\hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj\hhhj\hMubah}(h]j\ah ](j j eh"]h$]h&]j j )j huh1j hj\hMhj\hhubj )}(hhh]h)}(hgenerate a DRM ueventh]hgenerate a DRM uevent}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]hhubah}(h]h ]h"]h$]h&]uh1j hj\hhhj\hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j]j j]j j j uh1j hhhjJ\hNhNubj )}(hXh**Parameters** ``struct drm_device *dev`` DRM device **Description** Send a uevent for the DRM device specified by **dev**. Currently we only set HOTPLUG=1 in the uevent environment, but this could be expanded to deal with other types of events. Any new uapi should be using the drm_sysfs_connector_status_event() for uevents on connector status change.h](h)}(h**Parameters**h]j )}(hj]h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj]ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]ubj/ )}(hhh]j4 )}(h&``struct drm_device *dev`` DRM device h](j: )}(h``struct drm_device *dev``h]j)}(hj]h]hstruct drm_device *dev}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]ubjT )}(hhh]h)}(h DRM deviceh]h DRM device}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hMhj]ubah}(h]h ]h"]h$]h&]uh1jS hj]ubeh}(h]h ]h"]h$]h&]uh1j3 hj]hMhj]ubah}(h]h ]h"]h$]h&]uh1j. hj]ubh)}(h**Description**h]j )}(hj^h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]ubh)}(hSend a uevent for the DRM device specified by **dev**. Currently we only set HOTPLUG=1 in the uevent environment, but this could be expanded to deal with other types of events.h](h.Send a uevent for the DRM device specified by }(hj*^hhhNhNubj )}(h**dev**h]hdev}(hj2^hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*^ubh|. Currently we only set HOTPLUG=1 in the uevent environment, but this could be expanded to deal with other types of events.}(hj*^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]ubh)}(hkAny new uapi should be using the drm_sysfs_connector_status_event() for uevents on connector status change.h]hkAny new uapi should be using the drm_sysfs_connector_status_event() for uevents on connector status change.}(hjK^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjJ\hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j .drm_sysfs_connector_hotplug_event (C function)#c.drm_sysfs_connector_hotplug_eventhNtauh1j hjJ\hhhNhNubj )}(hhh](j )}(hHvoid drm_sysfs_connector_hotplug_event (struct drm_connector *connector)h]j )}(hGvoid drm_sysfs_connector_hotplug_event(struct drm_connector *connector)h](j )}(hvoidh]hvoid}(hjz^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjv^hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMubj )}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjv^hhhj^hMubj )}(h!drm_sysfs_connector_hotplug_eventh]j )}(h!drm_sysfs_connector_hotplug_eventh]h!drm_sysfs_connector_hotplug_event}(hj^hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj^ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjv^hhhj^hMubj2 )}(h!(struct drm_connector *connector)h]j8 )}(hstruct drm_connector *connectorh](j> )}(hjA h]hstruct}(hj^hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj^ubj )}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^ubh)}(hhh]j )}(h drm_connectorh]h drm_connector}(hj^hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj^ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj^modnameN classnameNjy j| )}j ]j )}ju j^sb#c.drm_sysfs_connector_hotplug_eventasbuh1hhj^ubj )}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^ubj )}(hj h]h*}(hj_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^ubj )}(h connectorh]h connector}(hj_hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hj^ubah}(h]h ]h"]h$]h&]hhuh1j1 hjv^hhhj^hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjr^hhhj^hMubah}(h]jm^ah ](j j eh"]h$]h&]j j )j huh1j hj^hMhjo^hhubj )}(hhh]h)}(h.generate a DRM uevent for any connector changeh]h.generate a DRM uevent for any connector change}(hj:_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj7_hhubah}(h]h ]h"]h$]h&]uh1j hjo^hhhj^hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jR_j jR_j j j uh1j hhhjJ\hNhNubj )}(h**Parameters** ``struct drm_connector *connector`` connector which has changed **Description** Send a uevent for the DRM connector specified by **connector**. This will send a uevent with the properties HOTPLUG=1 and CONNECTOR.h](h)}(h**Parameters**h]j )}(hj\_h]h Parameters}(hj^_hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjZ_ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjV_ubj/ )}(hhh]j4 )}(h@``struct drm_connector *connector`` connector which has changed h](j: )}(h#``struct drm_connector *connector``h]j)}(hj{_h]hstruct drm_connector *connector}(hj}_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy_ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhju_ubjT )}(hhh]h)}(hconnector which has changedh]hconnector which has changed}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1jS hju_ubeh}(h]h ]h"]h$]h&]uh1j3 hj_hMhjr_ubah}(h]h ]h"]h$]h&]uh1j. hjV_ubh)}(h**Description**h]j )}(hj_h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj_ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjV_ubh)}(hSend a uevent for the DRM connector specified by **connector**. This will send a uevent with the properties HOTPLUG=1 and CONNECTOR.h](h1Send a uevent for the DRM connector specified by }(hj_hhhNhNubj )}(h **connector**h]h connector}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj_ubhF. This will send a uevent with the properties HOTPLUG=1 and CONNECTOR.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjV_ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjJ\hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j /drm_sysfs_connector_property_event (C function)$c.drm_sysfs_connector_property_eventhNtauh1j hjJ\hhhNhNubj )}(hhh](j )}(hhvoid drm_sysfs_connector_property_event (struct drm_connector *connector, struct drm_property *property)h]j )}(hgvoid drm_sysfs_connector_property_event(struct drm_connector *connector, struct drm_property *property)h](j )}(hvoidh]hvoid}(hj `hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj `hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMubj )}(h h]h }(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj `hhhj`hMubj )}(h"drm_sysfs_connector_property_eventh]j )}(h"drm_sysfs_connector_property_eventh]h"drm_sysfs_connector_property_event}(hj.`hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj*`ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj `hhhj`hMubj2 )}(h@(struct drm_connector *connector, struct drm_property *property)h](j8 )}(hstruct drm_connector *connectorh](j> )}(hjA h]hstruct}(hjJ`hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjF`ubj )}(h h]h }(hjW`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjF`ubh)}(hhh]j )}(h drm_connectorh]h drm_connector}(hjh`hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hje`ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjj`modnameN classnameNjy j| )}j ]j )}ju j0`sb$c.drm_sysfs_connector_property_eventasbuh1hhjF`ubj )}(h h]h }(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjF`ubj )}(hj h]h*}(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjF`ubj )}(h connectorh]h connector}(hj`hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjF`ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjB`ubj8 )}(hstruct drm_property *propertyh](j> )}(hjA h]hstruct}(hj`hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj`ubj )}(h h]h }(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj`ubh)}(hhh]j )}(h drm_propertyh]h drm_property}(hj`hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj`ubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj`modnameN classnameNjy j| )}j ]j`$c.drm_sysfs_connector_property_eventasbuh1hhj`ubj )}(h h]h }(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj`ubj )}(hj h]h*}(hjahhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj`ubj )}(hpropertyh]hproperty}(hjahhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjB`ubeh}(h]h ]h"]h$]h&]hhuh1j1 hj `hhhj`hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj`hhhj`hMubah}(h]j`ah ](j j eh"]h$]h&]j j )j huh1j hj`hMhj`hhubj )}(hhh]h)}(h3generate a DRM uevent for connector property changeh]h3generate a DRM uevent for connector property change}(hj=ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhj:ahhubah}(h]h ]h"]h$]h&]uh1j hj`hhhj`hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jUaj jUaj j j uh1j hhhjJ\hNhNubj )}(hXZ**Parameters** ``struct drm_connector *connector`` connector on which property changed ``struct drm_property *property`` connector property which has changed. **Description** Send a uevent for the specified DRM connector and property. Currently we set HOTPLUG=1 and connector id along with the attached property id related to the change.h](h)}(h**Parameters**h]j )}(hj_ah]h Parameters}(hjaahhhNhNubah}(h]h ]h"]h$]h&]uh1j hj]aubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjYaubj/ )}(hhh](j4 )}(hH``struct drm_connector *connector`` connector on which property changed h](j: )}(h#``struct drm_connector *connector``h]j)}(hj~ah]hstruct drm_connector *connector}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|aubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjxaubjT )}(hhh]h)}(h#connector on which property changedh]h#connector on which property changed}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjaubah}(h]h ]h"]h$]h&]uh1jS hjxaubeh}(h]h ]h"]h$]h&]uh1j3 hjahMhjuaubj4 )}(hH``struct drm_property *property`` connector property which has changed. h](j: )}(h!``struct drm_property *property``h]j)}(hjah]hstruct drm_property *property}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjaubjT )}(hhh]h)}(h%connector property which has changed.h]h%connector property which has changed.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjaubah}(h]h ]h"]h$]h&]uh1jS hjaubeh}(h]h ]h"]h$]h&]uh1j3 hjahMhjuaubeh}(h]h ]h"]h$]h&]uh1j. hjYaubh)}(h**Description**h]j )}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j hjaubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjYaubh)}(hSend a uevent for the specified DRM connector and property. Currently we set HOTPLUG=1 and connector id along with the attached property id related to the change.h]hSend a uevent for the specified DRM connector and property. Currently we set HOTPLUG=1 and connector id along with the attached property id related to the change.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhjYaubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjJ\hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j &drm_class_device_register (C function)c.drm_class_device_registerhNtauh1j hjJ\hhhNhNubj )}(hhh](j )}(h2int drm_class_device_register (struct device *dev)h]j )}(h1int drm_class_device_register(struct device *dev)h](j )}(hinth]hint}(hj7bhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj3bhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMRubj )}(h h]h }(hjFbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj3bhhhjEbhMRubj )}(hdrm_class_device_registerh]j )}(hdrm_class_device_registerh]hdrm_class_device_register}(hjXbhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjTbubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj3bhhhjEbhMRubj2 )}(h(struct device *dev)h]j8 )}(hstruct device *devh](j> )}(hjA h]hstruct}(hjtbhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjpbubj )}(h h]h }(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjpbubh)}(hhh]j )}(hdeviceh]hdevice}(hjbhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjbubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetjbmodnameN classnameNjy j| )}j ]j )}ju jZbsbc.drm_class_device_registerasbuh1hhjpbubj )}(h h]h }(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjpbubj )}(hj h]h*}(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjpbubj )}(hdevh]hdev}(hjbhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjpbubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjlbubah}(h]h ]h"]h$]h&]hhuh1j1 hj3bhhhjEbhMRubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj/bhhhjEbhMRubah}(h]j*bah ](j j eh"]h$]h&]j j )j huh1j hjEbhMRhj,bhhubj )}(hhh]h)}(h,register new device with the DRM sysfs classh]h,register new device with the DRM sysfs class}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMRhjbhhubah}(h]h ]h"]h$]h&]uh1j hj,bhhhjEbhMRubeh}(h]h ](jfunctioneh"]h$]h&]j jj jcj jcj j j uh1j hhhjJ\hNhNubj )}(h**Parameters** ``struct device *dev`` device to register **Description** Registers a new :c:type:`struct device ` within the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.h](h)}(h**Parameters**h]j )}(hjch]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j hjcubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMVhjcubj/ )}(hhh]j4 )}(h*``struct device *dev`` device to register h](j: )}(h``struct device *dev``h]j)}(hj8ch]hstruct device *dev}(hj:chhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6cubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMShj2cubjT )}(hhh]h)}(hdevice to registerh]hdevice to register}(hjQchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMchMShjNcubah}(h]h ]h"]h$]h&]uh1jS hj2cubeh}(h]h ]h"]h$]h&]uh1j3 hjMchMShj/cubah}(h]h ]h"]h$]h&]uh1j. hjcubh)}(h**Description**h]j )}(hjsch]h Description}(hjuchhhNhNubah}(h]h ]h"]h$]h&]uh1j hjqcubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMUhjcubh)}(hRegisters a new :c:type:`struct device ` within the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.h](hRegisters a new }(hjchhhNhNubh)}(h :c:type:`struct device `h]j)}(hjch]h struct device}(hjchhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdeviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMThjcubh within the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjchMThjcubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjJ\hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j (drm_class_device_unregister (C function)c.drm_class_device_unregisterhNtauh1j hjJ\hhhNhNubj )}(hhh](j )}(h5void drm_class_device_unregister (struct device *dev)h]j )}(h4void drm_class_device_unregister(struct device *dev)h](j )}(hvoidh]hvoid}(hjchhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjchhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMdubj )}(h h]h }(hjchhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjchhhjchMdubj )}(hdrm_class_device_unregisterh]j )}(hdrm_class_device_unregisterh]hdrm_class_device_unregister}(hjchhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjcubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjchhhjchMdubj2 )}(h(struct device *dev)h]j8 )}(hstruct device *devh](j> )}(hjA h]hstruct}(hjdhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjdubj )}(h h]h }(hj%dhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjdubh)}(hhh]j )}(hdeviceh]hdevice}(hj6dhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj3dubah}(h]h ]h"]h$]h&] refdomainjreftypeju reftargetj8dmodnameN classnameNjy j| )}j ]j )}ju jcsbc.drm_class_device_unregisterasbuh1hhjdubj )}(h h]h }(hjVdhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjdubj )}(hj h]h*}(hjddhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjdubj )}(hdevh]hdev}(hjqdhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjdubeh}(h]h ]h"]h$]h&]noemphhhuh1j7 hjdubah}(h]h ]h"]h$]h&]hhuh1j1 hjchhhjchMdubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjchhhjchMdubah}(h]jcah ](j j eh"]h$]h&]j j )j huh1j hjchMdhjchhubj )}(hhh]h)}(h*unregister device with the DRM sysfs classh]h*unregister device with the DRM sysfs class}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMdhjdhhubah}(h]h ]h"]h$]h&]uh1j hjchhhjchMdubeh}(h]h ](jfunctioneh"]h$]h&]j jj jdj jdj j j uh1j hhhjJ\hNhNubj )}(h**Parameters** ``struct device *dev`` device to unregister **Description** Unregisters a :c:type:`struct device ` from the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.h](h)}(h**Parameters**h]j )}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjdubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMhhjdubj/ )}(hhh]j4 )}(h,``struct device *dev`` device to unregister h](j: )}(h``struct device *dev``h]j)}(hjdh]hstruct device *dev}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMehjdubjT )}(hhh]h)}(hdevice to unregisterh]hdevice to unregister}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMehjdubah}(h]h ]h"]h$]h&]uh1jS hjdubeh}(h]h ]h"]h$]h&]uh1j3 hjdhMehjdubah}(h]h ]h"]h$]h&]uh1j. hjdubh)}(h**Description**h]j )}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j hjeubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMghjdubh)}(hUnregisters a :c:type:`struct device ` from the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.h](hUnregisters a }(hj-ehhhNhNubh)}(h :c:type:`struct device `h]j)}(hj7eh]h struct device}(hj9ehhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj5eubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdeviceuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:700: ./drivers/gpu/drm/drm_sysfs.chMfhj-eubh from the DRM sysfs class. Essentially only used by ttm to have a place for its global settings. Drivers should never use this.}(hj-ehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjTehMfhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjJ\hhhNhNubeh}(h]jah ]h"] sysfs supportah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hVBlank event handlingh]hVBlank event handling}(hjpehhhNhNubah}(h]h ]h"]h$]h&]hjuh1hhjmehhhhhMubh)}(h7The DRM core exposes two vertical blank related ioctls:h]h7The DRM core exposes two vertical blank related ioctls:}(hj~ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjmehhubj/ )}(hhh](j4 )}(h:c:macro:`DRM_IOCTL_WAIT_VBLANK` This takes a struct drm_wait_vblank structure as its argument, and it is used to block or request a signal when a specified vblank event occurs. h](j: )}(h :c:macro:`DRM_IOCTL_WAIT_VBLANK`h]h)}(hjeh]j)}(hjeh]hDRM_IOCTL_WAIT_VBLANK}(hjehhhNhNubah}(h]h ](jjc-macroeh"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypemacro refexplicitrefwarnjy jV jDRM_IOCTL_WAIT_VBLANKuh1hhhhMhjeubah}(h]h ]h"]h$]h&]uh1j9 hhhMhjeubjT )}(hhh]h)}(hThis takes a struct drm_wait_vblank structure as its argument, and it is used to block or request a signal when a specified vblank event occurs.h]hThis takes a struct drm_wait_vblank structure as its argument, and it is used to block or request a signal when a specified vblank event occurs.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjeubah}(h]h ]h"]h$]h&]uh1jS hjeubeh}(h]h ]h"]h$]h&]uh1j3 hhhMhjeubj4 )}(hXl:c:macro:`DRM_IOCTL_MODESET_CTL` This was only used for user-mode-settind drivers around modesetting changes to allow the kernel to update the vblank interrupt after mode setting, since on many devices the vertical blank counter is reset to 0 at some point during modeset. Modern drivers should not call this any more since with kernel mode setting it is a no-op. h](j: )}(h :c:macro:`DRM_IOCTL_MODESET_CTL`h]h)}(hjeh]j)}(hjeh]hDRM_IOCTL_MODESET_CTL}(hjehhhNhNubah}(h]h ](jjc-macroeh"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypemacro refexplicitrefwarnjy jV jDRM_IOCTL_MODESET_CTLuh1hhhhMhjeubah}(h]h ]h"]h$]h&]uh1j9 hhhMhjeubjT )}(hhh]h)}(hXJThis was only used for user-mode-settind drivers around modesetting changes to allow the kernel to update the vblank interrupt after mode setting, since on many devices the vertical blank counter is reset to 0 at some point during modeset. Modern drivers should not call this any more since with kernel mode setting it is a no-op.h]hXJThis was only used for user-mode-settind drivers around modesetting changes to allow the kernel to update the vblank interrupt after mode setting, since on many devices the vertical blank counter is reset to 0 at some point during modeset. Modern drivers should not call this any more since with kernel mode setting it is a no-op.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjfubah}(h]h ]h"]h$]h&]uh1jS hjeubeh}(h]h ]h"]h$]h&]uh1j3 hhhMhjehhubeh}(h]h ]h"]h$]h&]uh1j. hjmehhhhhNubeh}(h]jah ]h"]vblank event handlingah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hUserspace API Structuresh]hUserspace API Structures}(hj1fhhhNhNubah}(h]h ]h"]h$]h&]hj1uh1hhj.fhhhhhMubh)}(hDRM exposes many UAPI and structure definitions to have a consistent and standardized interface with users. Userspace can refer to these structure definitions and UAPI formats to communicate to drivers.h]hDRM exposes many UAPI and structure definitions to have a consistent and standardized interface with users. Userspace can refer to these structure definitions and UAPI formats to communicate to drivers.}(hj?fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:724: ./include/uapi/drm/drm_mode.hhKhj.fhhubj)}(h.. _crtc_index:h]h}(h]h ]h"]h$]h&]hjVuh1jhMhj.fhhhhubh)}(hhh](h)}(h CRTC indexh]h CRTC index}(hj[fhhhNhNubah}(h]h ]h"]h$]h&]hjPuh1hhjXfhhhhhMubh)}(hXCRTC's have both an object ID and an index, and they are not the same thing. The index is used in cases where a densely packed identifier for a CRTC is needed, for instance a bitmask of CRTC's. The member possible_crtcs of struct drm_mode_get_plane is an example.h]hX CRTC’s have both an object ID and an index, and they are not the same thing. The index is used in cases where a densely packed identifier for a CRTC is needed, for instance a bitmask of CRTC’s. The member possible_crtcs of struct drm_mode_get_plane is an example.}(hjifhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjXfhhubh)}(h:c:macro:`DRM_IOCTL_MODE_GETRESOURCES` populates a structure with an array of CRTC ID's, and the CRTC index is its position in this array.h](h)}(h&:c:macro:`DRM_IOCTL_MODE_GETRESOURCES`h]j)}(hj}fh]hDRM_IOCTL_MODE_GETRESOURCES}(hjfhhhNhNubah}(h]h ](jjc-macroeh"]h$]h&]uh1jhj{fubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypemacro refexplicitrefwarnjy jV jDRM_IOCTL_MODE_GETRESOURCESuh1hhhhMhjwfubhf populates a structure with an array of CRTC ID’s, and the CRTC index is its position in this array.}(hjwfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_gem_close (C struct)c.drm_gem_closehNtauh1j hjXfhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhNubj )}(hhh](j )}(h drm_gem_closeh]j )}(hstruct drm_gem_closeh](j> )}(hjA h]hstruct}(hjfhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjfhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhKubj )}(h h]h }(hjfhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjfhhhjfhKubj )}(h drm_gem_closeh]j )}(hjfh]h drm_gem_close}(hjfhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjfubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjfhhhjfhKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjfhhhjfhKubah}(h]jfah ](j j eh"]h$]h&]j j )j huh1j hjfhKhjfhhubj )}(hhh]h)}(h1Argument for :c:type:`DRM_IOCTL_GEM_CLOSE` ioctl.h](h Argument for }(hjghhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_CLOSE`h]j)}(hj gh]hDRM_IOCTL_GEM_CLOSE}(hj ghhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]j )}ju jfsbc.drm_gem_closeasbjDRM_IOCTL_GEM_CLOSEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhKhjgubh ioctl.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMGhjfhhubah}(h]h ]h"]h$]h&]uh1j hjfhhhjfhKubeh}(h]h ](jstructeh"]h$]h&]j jj jCgj jCgj j j uh1j hhhjXfhjfhNubj )}(h**Definition**:: struct drm_gem_close { __u32 handle; __u32 pad; }; **Members** ``handle`` Handle of the object to be closed. ``pad`` Padding.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjOghhhNhNubah}(h]h ]h"]h$]h&]uh1j hjKgubh:}(hjKghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMKhjGgubj)}(h:struct drm_gem_close { __u32 handle; __u32 pad; };h]h:struct drm_gem_close { __u32 handle; __u32 pad; };}hjhgsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMMhjGgubh)}(h **Members**h]j )}(hjygh]hMembers}(hj{ghhhNhNubah}(h]h ]h"]h$]h&]uh1j hjwgubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMRhjGgubj/ )}(hhh](j4 )}(h.``handle`` Handle of the object to be closed. h](j: )}(h ``handle``h]j)}(hjgh]hhandle}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMIhjgubjT )}(hhh]h)}(h"Handle of the object to be closed.h]h"Handle of the object to be closed.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMIhjgubah}(h]h ]h"]h$]h&]uh1jS hjgubeh}(h]h ]h"]h$]h&]uh1j3 hjghMIhjgubj4 )}(h``pad`` Padding.h](j: )}(h``pad``h]j)}(hjgh]hpad}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMIhjgubjT )}(hhh]h)}(hPadding.h]hPadding.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMJhjgubah}(h]h ]h"]h$]h&]uh1jS hjgubeh}(h]h ]h"]h$]h&]uh1j3 hjghMIhjgubeh}(h]h ]h"]h$]h&]uh1j. hjGgubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hjhh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMMhjXfhhubh)}(h$Releases the handle to an mm object.h]h$Releases the handle to an mm object.}(hj*hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMJhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_gem_flink (C struct)c.drm_gem_flinkhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h drm_gem_flinkh]j )}(hstruct drm_gem_flinkh](j> )}(hjA h]hstruct}(hjRhhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjNhhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMOubj )}(h h]h }(hj`hhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjNhhhhj_hhMOubj )}(h drm_gem_flinkh]j )}(hjLhh]h drm_gem_flink}(hjrhhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjnhubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjNhhhhj_hhMOubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjJhhhhj_hhMOubah}(h]jEhah ](j j eh"]h$]h&]j j )j huh1j hj_hhMOhjGhhhubj )}(hhh]h)}(h1Argument for :c:type:`DRM_IOCTL_GEM_FLINK` ioctl.h](h Argument for }(hjhhhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_FLINK`h]j)}(hjhh]hDRM_IOCTL_GEM_FLINK}(hjhhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]j )}ju jLhsbc.drm_gem_flinkasbjDRM_IOCTL_GEM_FLINKuh1hhj.ghKhjhubh ioctl.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMShjhhhubah}(h]h ]h"]h$]h&]uh1j hjGhhhhj_hhMOubeh}(h]h ](jstructeh"]h$]h&]j jj jhj jhj j j uh1j hhhjXfhjfhNubj )}(h**Definition**:: struct drm_gem_flink { __u32 handle; __u32 name; }; **Members** ``handle`` Handle for the object being named. ``name`` Returned global name.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhubh:}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMWhjhubj)}(h;struct drm_gem_flink { __u32 handle; __u32 name; };h]h;struct drm_gem_flink { __u32 handle; __u32 name; };}hjhsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjhubh)}(h **Members**h]j )}(hj ih]hMembers}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j hj iubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM^hjhubj/ )}(hhh](j4 )}(h.``handle`` Handle for the object being named. h](j: )}(h ``handle``h]j)}(hj+ih]hhandle}(hj-ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)iubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMUhj%iubjT )}(hhh]h)}(h"Handle for the object being named.h]h"Handle for the object being named.}(hjDihhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@ihMUhjAiubah}(h]h ]h"]h$]h&]uh1jS hj%iubeh}(h]h ]h"]h$]h&]uh1j3 hj@ihMUhj"iubj4 )}(h``name`` Returned global name.h](j: )}(h``name``h]j)}(hjdih]hname}(hjfihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbiubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMUhj^iubjT )}(hhh]h)}(hReturned global name.h]hReturned global name.}(hj}ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMVhjziubah}(h]h ]h"]h$]h&]uh1jS hj^iubeh}(h]h ]h"]h$]h&]uh1j3 hjyihMUhj"iubeh}(h]h ]h"]h$]h&]uh1j. hjhubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hjih]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j hjiubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjXfhhubh)}(h7Create a global name for an object, returning the name.h]h7Create a global name for an object, returning the name.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMVhjXfhhubh)}(h[Note that the name does not hold a reference; when the object is freed, the name goes away.h]h[Note that the name does not hold a reference; when the object is freed, the name goes away.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMXhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_gem_open (C struct)c.drm_gem_openhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h drm_gem_openh]j )}(hstruct drm_gem_openh](j> )}(hjA h]hstruct}(hjihhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjihhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM^ubj )}(h h]h }(hjjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjihhhjjhM^ubj )}(h drm_gem_openh]j )}(hjih]h drm_gem_open}(hjjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjihhhjjhM^ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjihhhjjhM^ubah}(h]jiah ](j j eh"]h$]h&]j j )j huh1j hjjhM^hjihhubj )}(hhh]h)}(h0Argument for :c:type:`DRM_IOCTL_GEM_OPEN` ioctl.h](h Argument for }(hj6jhhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_OPEN`h]j)}(hj@jh]hDRM_IOCTL_GEM_OPEN}(hjBjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj>jubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]j )}ju jisbc.drm_gem_openasbjDRM_IOCTL_GEM_OPENuh1hhj.ghKhj6jubh ioctl.}(hj6jhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMbhj3jhhubah}(h]h ]h"]h$]h&]uh1j hjihhhjjhM^ubeh}(h]h ](jstructeh"]h$]h&]j jj jxjj jxjj j j uh1j hhhjXfhjfhNubj )}(h**Definition**:: struct drm_gem_open { __u32 name; __u32 handle; __u64 size; }; **Members** ``name`` Name of object being opened. ``handle`` Returned handle for the object. ``size`` Returned size of the objecth](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjjubh:}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMfhj|jubj)}(hJstruct drm_gem_open { __u32 name; __u32 handle; __u64 size; };h]hJstruct drm_gem_open { __u32 name; __u32 handle; __u64 size; };}hjjsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhhj|jubh)}(h **Members**h]j )}(hjjh]hMembers}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMnhj|jubj/ )}(hhh](j4 )}(h&``name`` Name of object being opened. h](j: )}(h``name``h]j)}(hjjh]hname}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMdhjjubjT )}(hhh]h)}(hName of object being opened.h]hName of object being opened.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMdhjjubah}(h]h ]h"]h$]h&]uh1jS hjjubeh}(h]h ]h"]h$]h&]uh1j3 hjjhMdhjjubj4 )}(h+``handle`` Returned handle for the object. h](j: )}(h ``handle``h]j)}(hjkh]hhandle}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMehjkubjT )}(hhh]h)}(hReturned handle for the object.h]hReturned handle for the object.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMehjkubah}(h]h ]h"]h$]h&]uh1jS hjkubeh}(h]h ]h"]h$]h&]uh1j3 hjkhMehjjubj4 )}(h$``size`` Returned size of the objecth](j: )}(h``size``h]j)}(hj?kh]hsize}(hjAkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=kubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMehj9kubjT )}(hhh]h)}(hReturned size of the objecth]hReturned size of the object}(hjXkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMfhjUkubah}(h]h ]h"]h$]h&]uh1jS hj9kubeh}(h]h ]h"]h$]h&]uh1j3 hjTkhMehjjubeh}(h]h ]h"]h$]h&]uh1j. hj|jubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hjkh]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjkubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMihjXfhhubh)}(hFOpen an object using the global name, returning a handle and the size.h]hFOpen an object using the global name, returning a handle and the size.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMfhjXfhhubh)}(htThis handle (of course) holds a reference to the object, so the object will not go away until the handle is deleted.h]htThis handle (of course) holds a reference to the object, so the object will not go away until the handle is deleted.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_gem_change_handle (C struct)c.drm_gem_change_handlehNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hdrm_gem_change_handleh]j )}(hstruct drm_gem_change_handleh](j> )}(hjA h]hstruct}(hjkhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjkhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMnubj )}(h h]h }(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjkhhhjkhMnubj )}(hdrm_gem_change_handleh]j )}(hjkh]hdrm_gem_change_handle}(hjkhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjkubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjkhhhjkhMnubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjkhhhjkhMnubah}(h]jkah ](j j eh"]h$]h&]j j )j huh1j hjkhMnhjkhhubj )}(hhh]h)}(h9Argument for :c:type:`DRM_IOCTL_GEM_CHANGE_HANDLE` ioctl.h](h Argument for }(hjlhhhNhNubh)}(h%:c:type:`DRM_IOCTL_GEM_CHANGE_HANDLE`h]j)}(hjlh]hDRM_IOCTL_GEM_CHANGE_HANDLE}(hjlhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy j| )}j ]j )}ju jksbc.drm_gem_change_handleasbjDRM_IOCTL_GEM_CHANGE_HANDLEuh1hhj.ghKhjlubh ioctl.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMshjlhhubah}(h]h ]h"]h$]h&]uh1j hjkhhhjkhMnubeh}(h]h ](jstructeh"]h$]h&]j jj jSlj jSlj j j uh1j hhhjXfhjfhNubj )}(h**Definition**:: struct drm_gem_change_handle { __u32 handle; __u32 new_handle; }; **Members** ``handle`` The handle of a gem object. ``new_handle`` An available gem handle.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj_lhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj[lubh:}(hj[lhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMwhjWlubj)}(hIstruct drm_gem_change_handle { __u32 handle; __u32 new_handle; };h]hIstruct drm_gem_change_handle { __u32 handle; __u32 new_handle; };}hjxlsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMyhjWlubh)}(h **Members**h]j )}(hjlh]hMembers}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjWlubj/ )}(hhh](j4 )}(h'``handle`` The handle of a gem object. h](j: )}(h ``handle``h]j)}(hjlh]hhandle}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMuhjlubjT )}(hhh]h)}(hThe handle of a gem object.h]hThe handle of a gem object.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMuhjlubah}(h]h ]h"]h$]h&]uh1jS hjlubeh}(h]h ]h"]h$]h&]uh1j3 hjlhMuhjlubj4 )}(h'``new_handle`` An available gem handle.h](j: )}(h``new_handle``h]j)}(hjlh]h new_handle}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMuhjlubjT )}(hhh]h)}(hAn available gem handle.h]hAn available gem handle.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMvhjlubah}(h]h ]h"]h$]h&]uh1jS hjlubeh}(h]h ]h"]h$]h&]uh1j3 hjlhMuhjlubeh}(h]h ]h"]h$]h&]uh1j. hjWlubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hj$mh]h Description}(hj&mhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"mubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMyhjXfhhubh)}(hXThis ioctl changes the handle of a GEM object to the specified one. The new handle must be unused. On success the old handle is closed and all further IOCTL should refer to the new handle only. Calls to DRM_IOCTL_PRIME_FD_TO_HANDLE will return the new handle.h]hXThis ioctl changes the handle of a GEM object to the specified one. The new handle must be unused. On success the old handle is closed and all further IOCTL should refer to the new handle only. Calls to DRM_IOCTL_PRIME_FD_TO_HANDLE will return the new handle.}(hj:mhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMvhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_CAP_DUMB_BUFFER (C macro)c.DRM_CAP_DUMB_BUFFERhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_DUMB_BUFFERh]j )}(hDRM_CAP_DUMB_BUFFERh]j )}(hDRM_CAP_DUMB_BUFFERh]j )}(hj\mh]hDRM_CAP_DUMB_BUFFER}(hjfmhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjbmubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj^mhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjZmhhhjymhMubah}(h]jUmah ](j j eh"]h$]h&]j j )j huh1j hjymhMhjWmhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjWmhhhjymhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jmj jmj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_DUMB_BUFFER``h]j)}(hjmh]hDRM_CAP_DUMB_BUFFER}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(h}**Description** If set to 1, the driver supports creating dumb buffers via the :c:type:`DRM_IOCTL_MODE_CREATE_DUMB` ioctl. h](h)}(h**Description**h]j )}(hjmh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjmubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjmubh)}(hjIf set to 1, the driver supports creating dumb buffers via the :c:type:`DRM_IOCTL_MODE_CREATE_DUMB` ioctl.h](h?If set to 1, the driver supports creating dumb buffers via the }(hjmhhhNhNubh)}(h$:c:type:`DRM_IOCTL_MODE_CREATE_DUMB`h]j)}(hjmh]hDRM_IOCTL_MODE_CREATE_DUMB}(hjmhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_CREATE_DUMBuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjmubh ioctl.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjmhMhjmubeh}(h]h ]h"]h$]h&]uh1j(hjmhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_CAP_VBLANK_HIGH_CRTC (C macro)c.DRM_CAP_VBLANK_HIGH_CRTChNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_VBLANK_HIGH_CRTCh]j )}(hDRM_CAP_VBLANK_HIGH_CRTCh]j )}(hDRM_CAP_VBLANK_HIGH_CRTCh]j )}(hjnh]hDRM_CAP_VBLANK_HIGH_CRTC}(hjnhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjnubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjnhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjnhhhj2nhMubah}(h]jnah ](j j eh"]h$]h&]j j )j huh1j hj2nhMhjnhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjnhhhj2nhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jKnj jKnj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_VBLANK_HIGH_CRTC``h]j)}(hjQnh]hDRM_CAP_VBLANK_HIGH_CRTC}(hjSnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOnubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(h**Description** If set to 1, the kernel supports specifying a :ref:`CRTC index` in the high bits of :c:type:`drm_wait_vblank_request.type `. Starting kernel version 2.6.39, this capability is always set to 1. h](h)}(h**Description**h]j )}(hjmnh]h Description}(hjonhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjknubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjgnubh)}(hIf set to 1, the kernel supports specifying a :ref:`CRTC index` in the high bits of :c:type:`drm_wait_vblank_request.type `.h](h.If set to 1, the kernel supports specifying a }(hjnhhhNhNubh)}(h:ref:`CRTC index`h]j:)}(hjnh]h CRTC index}(hjnhhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hjnubah}(h]h ]h"]h$]h&]refdocj refdomainjnreftyperef refexplicitrefwarnj crtc_indexuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjnubh in the high bits of }(hjnhhhNhNubh)}(h@:c:type:`drm_wait_vblank_request.type `h]j)}(hjnh]hdrm_wait_vblank_request.type}(hjnhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_wait_vblank_requestuh1hhjnhMhjnubh.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjnhMhjgnubh)}(hCStarting kernel version 2.6.39, this capability is always set to 1.h]hCStarting kernel version 2.6.39, this capability is always set to 1.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjgnubeh}(h]h ]h"]h$]h&]uh1j(hjnhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j &DRM_CAP_DUMB_PREFERRED_DEPTH (C macro)c.DRM_CAP_DUMB_PREFERRED_DEPTHhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_DUMB_PREFERRED_DEPTHh]j )}(hDRM_CAP_DUMB_PREFERRED_DEPTHh]j )}(hDRM_CAP_DUMB_PREFERRED_DEPTHh]j )}(hjoh]hDRM_CAP_DUMB_PREFERRED_DEPTH}(hj ohhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjoubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjohhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjnhhhjohMubah}(h]jnah ](j j eh"]h$]h&]j j )j huh1j hjohMhjnhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjnhhhjohMubeh}(h]h ](jmacroeh"]h$]h&]j jj j7oj j7oj j j uh1j hhhjXfhjfhNubh)}(h ``DRM_CAP_DUMB_PREFERRED_DEPTH``h]j)}(hj=oh]hDRM_CAP_DUMB_PREFERRED_DEPTH}(hj?ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;oubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hX**Description** The preferred bit depth for dumb buffers. The bit depth is the number of bits used to indicate the color of a single pixel excluding any padding. This is different from the number of bits per pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per pixel. Note that this preference only applies to dumb buffers, it's irrelevant for other types of buffers. h](h)}(h**Description**h]j )}(hjYoh]h Description}(hj[ohhhNhNubah}(h]h ]h"]h$]h&]uh1j hjWoubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjSoubh)}(h)The preferred bit depth for dumb buffers.h]h)The preferred bit depth for dumb buffers.}(hjoohhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjSoubh)}(hThe bit depth is the number of bits used to indicate the color of a single pixel excluding any padding. This is different from the number of bits per pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per pixel.h]hThe bit depth is the number of bits used to indicate the color of a single pixel excluding any padding. This is different from the number of bits per pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per pixel.}(hj~ohhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjSoubh)}(hcNote that this preference only applies to dumb buffers, it's irrelevant for other types of buffers.h]heNote that this preference only applies to dumb buffers, it’s irrelevant for other types of buffers.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjSoubeh}(h]h ]h"]h$]h&]uh1j(hjnohMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j $DRM_CAP_DUMB_PREFER_SHADOW (C macro)c.DRM_CAP_DUMB_PREFER_SHADOWhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_DUMB_PREFER_SHADOWh]j )}(hDRM_CAP_DUMB_PREFER_SHADOWh]j )}(hDRM_CAP_DUMB_PREFER_SHADOWh]j )}(hjoh]hDRM_CAP_DUMB_PREFER_SHADOW}(hjohhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjoubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjohhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjohhhjohMubah}(h]joah ](j j eh"]h$]h&]j j )j huh1j hjohMhjohhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjohhhjohMubeh}(h]h ](jmacroeh"]h$]h&]j jj joj joj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_DUMB_PREFER_SHADOW``h]j)}(hjoh]hDRM_CAP_DUMB_PREFER_SHADOW}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hX_**Description** If set to 1, the driver prefers userspace to render to a shadow buffer instead of directly rendering to a dumb buffer. For best speed, userspace should do streaming ordered memory copies into the dumb buffer and never read from it. Note that this preference only applies to dumb buffers, it's irrelevant for other types of buffers. h](h)}(h**Description**h]j )}(hj ph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j hj pubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubh)}(hIf set to 1, the driver prefers userspace to render to a shadow buffer instead of directly rendering to a dumb buffer. For best speed, userspace should do streaming ordered memory copies into the dumb buffer and never read from it.h]hIf set to 1, the driver prefers userspace to render to a shadow buffer instead of directly rendering to a dumb buffer. For best speed, userspace should do streaming ordered memory copies into the dumb buffer and never read from it.}(hj#phhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubh)}(hcNote that this preference only applies to dumb buffers, it's irrelevant for other types of buffers.h]heNote that this preference only applies to dumb buffers, it’s irrelevant for other types of buffers.}(hj2phhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubeh}(h]h ]h"]h$]h&]uh1j(hj"phMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_CAP_PRIME (C macro)c.DRM_CAP_PRIMEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h DRM_CAP_PRIMEh]j )}(h DRM_CAP_PRIMEh]j )}(h DRM_CAP_PRIMEh]j )}(hjZph]h DRM_CAP_PRIME}(hjdphhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj`pubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj\phhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjXphhhjwphMubah}(h]jSpah ](j j eh"]h$]h&]j j )j huh1j hjwphMhjUphhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjUphhhjwphMubeh}(h]h ](jmacroeh"]h$]h&]j jj jpj jpj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_PRIME``h]j)}(hjph]h DRM_CAP_PRIME}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hXe**Description** Bitfield of supported PRIME sharing capabilities. See :c:type:`DRM_PRIME_CAP_IMPORT` and :c:type:`DRM_PRIME_CAP_EXPORT`. Starting from kernel version 6.6, both :c:type:`DRM_PRIME_CAP_IMPORT` and :c:type:`DRM_PRIME_CAP_EXPORT` are always advertised. PRIME buffers are exposed as dma-buf file descriptors. See :ref:`prime_buffer_sharing`. h](h)}(h**Description**h]j )}(hjph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j hjpubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubh)}(hxBitfield of supported PRIME sharing capabilities. See :c:type:`DRM_PRIME_CAP_IMPORT` and :c:type:`DRM_PRIME_CAP_EXPORT`.h](h6Bitfield of supported PRIME sharing capabilities. See }(hjphhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_IMPORT`h]j)}(hjph]hDRM_PRIME_CAP_IMPORT}(hjphhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_IMPORTuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubh and }(hjphhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_EXPORT`h]j)}(hjph]hDRM_PRIME_CAP_EXPORT}(hjphhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_EXPORTuh1hhjphMhjpubh.}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjphMhjpubh)}(hStarting from kernel version 6.6, both :c:type:`DRM_PRIME_CAP_IMPORT` and :c:type:`DRM_PRIME_CAP_EXPORT` are always advertised.h](h'Starting from kernel version 6.6, both }(hjqhhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_IMPORT`h]j)}(hj'qh]hDRM_PRIME_CAP_IMPORT}(hj)qhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj%qubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_IMPORTuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjqubh and }(hjqhhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_EXPORT`h]j)}(hjKqh]hDRM_PRIME_CAP_EXPORT}(hjMqhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjIqubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_EXPORTuh1hhjDqhMhjqubh are always advertised.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjDqhMhjpubh)}(hWPRIME buffers are exposed as dma-buf file descriptors. See :ref:`prime_buffer_sharing`.h](h;PRIME buffers are exposed as dma-buf file descriptors. See }(hjrqhhhNhNubh)}(h:ref:`prime_buffer_sharing`h]j:)}(hj|qh]hprime_buffer_sharing}(hj~qhhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hjzqubah}(h]h ]h"]h$]h&]refdocj refdomainjqreftyperef refexplicitrefwarnjprime_buffer_sharinguh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjrqubh.}(hjrqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjqhMhjpubeh}(h]h ]h"]h$]h&]uh1j(hjphMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_PRIME_CAP_IMPORT (C macro)c.DRM_PRIME_CAP_IMPORThNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_PRIME_CAP_IMPORTh]j )}(hDRM_PRIME_CAP_IMPORTh]j )}(hDRM_PRIME_CAP_IMPORTh]j )}(hjqh]hDRM_PRIME_CAP_IMPORT}(hjqhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjqubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjqhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjqhhhjqhMubah}(h]jqah ](j j eh"]h$]h&]j j )j huh1j hjqhMhjqhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjqhhhjqhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jqj jqj j j uh1j hhhjXfhjfhNubh)}(h``DRM_PRIME_CAP_IMPORT``h]j)}(hjqh]hDRM_PRIME_CAP_IMPORT}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(h**Description** If this bit is set in :c:type:`DRM_CAP_PRIME`, the driver supports importing PRIME buffers via the :c:type:`DRM_IOCTL_PRIME_FD_TO_HANDLE` ioctl. Starting from kernel version 6.6, this bit is always set in :c:type:`DRM_CAP_PRIME`. h](h)}(h**Description**h]j )}(hjrh]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjrubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjrubh)}(hIf this bit is set in :c:type:`DRM_CAP_PRIME`, the driver supports importing PRIME buffers via the :c:type:`DRM_IOCTL_PRIME_FD_TO_HANDLE` ioctl.h](hIf this bit is set in }(hj,rhhhNhNubh)}(h:c:type:`DRM_CAP_PRIME`h]j)}(hj6rh]h DRM_CAP_PRIME}(hj8rhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj4rubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j DRM_CAP_PRIMEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj,rubh6, the driver supports importing PRIME buffers via the }(hj,rhhhNhNubh)}(h&:c:type:`DRM_IOCTL_PRIME_FD_TO_HANDLE`h]j)}(hjZrh]hDRM_IOCTL_PRIME_FD_TO_HANDLE}(hj\rhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjXrubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_PRIME_FD_TO_HANDLEuh1hhjSrhMhj,rubh ioctl.}(hj,rhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjSrhMhjrubh)}(hTStarting from kernel version 6.6, this bit is always set in :c:type:`DRM_CAP_PRIME`.h](h` for the :c:type:`DRM_IOCTL_MODE_PAGE_FLIP` ioctl. h](h)}(h**Description**h]j )}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjwubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjwubh)}(hX If set to 1, the driver supports the :c:type:`DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE` and :c:type:`DRM_MODE_PAGE_FLIP_TARGET_RELATIVE` flags in :c:type:`drm_mode_crtc_page_flip_target.flags ` for the :c:type:`DRM_IOCTL_MODE_PAGE_FLIP` ioctl.h](h%If set to 1, the driver supports the }(hjxhhhNhNubh)}(h,:c:type:`DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE`h]j)}(hj!xh]h"DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE}(hj#xhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j"DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjxubh and }(hjxhhhNhNubh)}(h,:c:type:`DRM_MODE_PAGE_FLIP_TARGET_RELATIVE`h]j)}(hjExh]h"DRM_MODE_PAGE_FLIP_TARGET_RELATIVE}(hjGxhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjCxubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j"DRM_MODE_PAGE_FLIP_TARGET_RELATIVEuh1hhj>xhMhjxubh flags in }(hjxhhhNhNubh)}(hO:c:type:`drm_mode_crtc_page_flip_target.flags `h]j)}(hjhxh]h$drm_mode_crtc_page_flip_target.flags}(hjjxhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjfxubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_crtc_page_flip_targetuh1hhj>xhMhjxubh for the }(hjxhhhNhNubh)}(h":c:type:`DRM_IOCTL_MODE_PAGE_FLIP`h]j)}(hjxh]hDRM_IOCTL_MODE_PAGE_FLIP}(hjxhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_PAGE_FLIPuh1hhj>xhMhjxubh ioctl.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj>xhMhjwubeh}(h]h ]h"]h$]h&]uh1j(hjxhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j &DRM_CAP_CRTC_IN_VBLANK_EVENT (C macro)c.DRM_CAP_CRTC_IN_VBLANK_EVENThNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_CRTC_IN_VBLANK_EVENTh]j )}(hDRM_CAP_CRTC_IN_VBLANK_EVENTh]j )}(hDRM_CAP_CRTC_IN_VBLANK_EVENTh]j )}(hjxh]hDRM_CAP_CRTC_IN_VBLANK_EVENT}(hjxhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjxubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjxhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjxhhhjxhMubah}(h]jxah ](j j eh"]h$]h&]j j )j huh1j hjxhMhjxhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjxhhhjxhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jyj jyj j j uh1j hhhjXfhjfhNubh)}(h ``DRM_CAP_CRTC_IN_VBLANK_EVENT``h]j)}(hjyh]hDRM_CAP_CRTC_IN_VBLANK_EVENT}(hj yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hX**Description** If set to 1, the kernel supports reporting the CRTC ID in :c:type:`drm_event_vblank.crtc_id ` for the :c:type:`DRM_EVENT_VBLANK` and :c:type:`DRM_EVENT_FLIP_COMPLETE` events. Starting kernel version 4.12, this capability is always set to 1. h](h)}(h**Description**h]j )}(hj#yh]h Description}(hj%yhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj!yubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjyubh)}(hIf set to 1, the kernel supports reporting the CRTC ID in :c:type:`drm_event_vblank.crtc_id ` for the :c:type:`DRM_EVENT_VBLANK` and :c:type:`DRM_EVENT_FLIP_COMPLETE` events.h](h:If set to 1, the kernel supports reporting the CRTC ID in }(hj9yhhhNhNubh)}(h5:c:type:`drm_event_vblank.crtc_id `h]j)}(hjCyh]hdrm_event_vblank.crtc_id}(hjEyhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjAyubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_event_vblankuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj9yubh for the }(hj9yhhhNhNubh)}(h:c:type:`DRM_EVENT_VBLANK`h]j)}(hjgyh]hDRM_EVENT_VBLANK}(hjiyhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjeyubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_VBLANKuh1hhj`yhMhj9yubh and }(hj9yhhhNhNubh)}(h!:c:type:`DRM_EVENT_FLIP_COMPLETE`h]j)}(hjyh]hDRM_EVENT_FLIP_COMPLETE}(hjyhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_FLIP_COMPLETEuh1hhj`yhMhj9yubh events.}(hj9yhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj`yhMhjyubh)}(hAStarting kernel version 4.12, this capability is always set to 1.h]hAStarting kernel version 4.12, this capability is always set to 1.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjyubeh}(h]h ]h"]h$]h&]uh1j(hj8yhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_CAP_SYNCOBJ (C macro)c.DRM_CAP_SYNCOBJhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_SYNCOBJh]j )}(hDRM_CAP_SYNCOBJh]j )}(hDRM_CAP_SYNCOBJh]j )}(hjyh]hDRM_CAP_SYNCOBJ}(hjyhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjyubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjyhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjyhhhjyhM ubah}(h]jyah ](j j eh"]h$]h&]j j )j huh1j hjyhM hjyhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjyhhhjyhM ubeh}(h]h ](jmacroeh"]h$]h&]j jj jzj jzj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_SYNCOBJ``h]j)}(hjzh]hDRM_CAP_SYNCOBJ}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM hjXfhhubj))}(h^**Description** If set to 1, the driver supports sync objects. See :ref:`drm_sync_objects`. h](h)}(h**Description**h]j )}(hj1zh]h Description}(hj3zhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/zubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM hj+zubh)}(hKIf set to 1, the driver supports sync objects. See :ref:`drm_sync_objects`.h](h3If set to 1, the driver supports sync objects. See }(hjGzhhhNhNubh)}(h:ref:`drm_sync_objects`h]j:)}(hjQzh]hdrm_sync_objects}(hjSzhhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hjOzubah}(h]h ]h"]h$]h&]refdocj refdomainj]zreftyperef refexplicitrefwarnjdrm_sync_objectsuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM hjGzubh.}(hjGzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjozhM hj+zubeh}(h]h ]h"]h$]h&]uh1j(hjFzhM hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_CAP_SYNCOBJ_TIMELINE (C macro)c.DRM_CAP_SYNCOBJ_TIMELINEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_SYNCOBJ_TIMELINEh]j )}(hDRM_CAP_SYNCOBJ_TIMELINEh]j )}(hDRM_CAP_SYNCOBJ_TIMELINEh]j )}(hjzh]hDRM_CAP_SYNCOBJ_TIMELINE}(hjzhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjzubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjzhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjzhhhjzhMubah}(h]jzah ](j j eh"]h$]h&]j j )j huh1j hjzhMhjzhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjzhhhjzhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jzj jzj j j uh1j hhhjXfhjfhNubh)}(h``DRM_CAP_SYNCOBJ_TIMELINE``h]j)}(hjzh]hDRM_CAP_SYNCOBJ_TIMELINE}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hu**Description** If set to 1, the driver supports timeline operations on sync objects. See :ref:`drm_sync_objects`. h](h)}(h**Description**h]j )}(hjzh]h Description}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjzubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjzubh)}(hbIf set to 1, the driver supports timeline operations on sync objects. See :ref:`drm_sync_objects`.h](hJIf set to 1, the driver supports timeline operations on sync objects. See }(hj{hhhNhNubh)}(h:ref:`drm_sync_objects`h]j:)}(hj {h]hdrm_sync_objects}(hj {hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj {ubah}(h]h ]h"]h$]h&]refdocj refdomainj{reftyperef refexplicitrefwarnjdrm_sync_objectsuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj){hMhjzubeh}(h]h ]h"]h$]h&]uh1j(hj{hMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j (DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP (C macro) c.DRM_CAP_ATOMIC_ASYNC_PAGE_FLIPhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CAP_ATOMIC_ASYNC_PAGE_FLIPh]j )}(hDRM_CAP_ATOMIC_ASYNC_PAGE_FLIPh]j )}(hDRM_CAP_ATOMIC_ASYNC_PAGE_FLIPh]j )}(hjM{h]hDRM_CAP_ATOMIC_ASYNC_PAGE_FLIP}(hjW{hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjS{ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjO{hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjK{hhhjj{hMubah}(h]jF{ah ](j j eh"]h$]h&]j j )j huh1j hjj{hMhjH{hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjH{hhhjj{hMubeh}(h]h ](jmacroeh"]h$]h&]j jj j{j j{j j j uh1j hhhjXfhjfhNubh)}(h"``DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP``h]j)}(hj{h]hDRM_CAP_ATOMIC_ASYNC_PAGE_FLIP}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hj**Description** If set to 1, the driver supports :c:type:`DRM_MODE_PAGE_FLIP_ASYNC` for atomic commits. h](h)}(h**Description**h]j )}(hj{h]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj{ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj{ubh)}(hWIf set to 1, the driver supports :c:type:`DRM_MODE_PAGE_FLIP_ASYNC` for atomic commits.h](h!If set to 1, the driver supports }(hj{hhhNhNubh)}(h":c:type:`DRM_MODE_PAGE_FLIP_ASYNC`h]j)}(hj{h]hDRM_MODE_PAGE_FLIP_ASYNC}(hj{hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PAGE_FLIP_ASYNCuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj{ubh for atomic commits.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubeh}(h]h ]h"]h$]h&]uh1j(hj{hMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_CLIENT_CAP_STEREO_3D (C macro)c.DRM_CLIENT_CAP_STEREO_3DhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CLIENT_CAP_STEREO_3Dh]j )}(hDRM_CLIENT_CAP_STEREO_3Dh]j )}(hDRM_CLIENT_CAP_STEREO_3Dh]j )}(hj|h]hDRM_CLIENT_CAP_STEREO_3D}(hj|hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj |ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj|hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM%ubah}(h]h ]h"]h$]h&]hhj uh1j j j hj|hhhj#|hM%ubah}(h]j{ah ](j j eh"]h$]h&]j j )j huh1j hj#|hM%hj|hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj|hhhj#|hM%ubeh}(h]h ](jmacroeh"]h$]h&]j jj j<|j j<|j j j uh1j hhhjXfhjfhNubh)}(h``DRM_CLIENT_CAP_STEREO_3D``h]j)}(hjB|h]hDRM_CLIENT_CAP_STEREO_3D}(hjD|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@|ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM'hjXfhhubj))}(hX(**Description** If set to 1, the DRM core will expose the stereo 3D capabilities of the monitor by advertising the supported 3D layouts in the flags of struct drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``. This capability is always supported for all drivers starting from kernel version 3.13. h](h)}(h**Description**h]j )}(hj^|h]h Description}(hj`|hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\|ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM'hjX|ubh)}(hIf set to 1, the DRM core will expose the stereo 3D capabilities of the monitor by advertising the supported 3D layouts in the flags of struct drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``.h](hIf set to 1, the DRM core will expose the stereo 3D capabilities of the monitor by advertising the supported 3D layouts in the flags of struct drm_mode_modeinfo. See }(hjt|hhhNhNubj)}(h``DRM_MODE_FLAG_3D_*``h]hDRM_MODE_FLAG_3D_*}(hj||hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt|ubh.}(hjt|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM&hjX|ubh)}(hVThis capability is always supported for all drivers starting from kernel version 3.13.h]hVThis capability is always supported for all drivers starting from kernel version 3.13.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM*hjX|ubeh}(h]h ]h"]h$]h&]uh1j(hjs|hM'hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j )DRM_CLIENT_CAP_UNIVERSAL_PLANES (C macro)!c.DRM_CLIENT_CAP_UNIVERSAL_PLANEShNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CLIENT_CAP_UNIVERSAL_PLANESh]j )}(hDRM_CLIENT_CAP_UNIVERSAL_PLANESh]j )}(hDRM_CLIENT_CAP_UNIVERSAL_PLANESh]j )}(hj|h]hDRM_CLIENT_CAP_UNIVERSAL_PLANES}(hj|hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj|ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj|hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM1ubah}(h]h ]h"]h$]h&]hhj uh1j j j hj|hhhj|hM1ubah}(h]j|ah ](j j eh"]h$]h&]j j )j huh1j hj|hM1hj|hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj|hhhj|hM1ubeh}(h]h ](jmacroeh"]h$]h&]j jj j|j j|j j j uh1j hhhjXfhjfhNubh)}(h#``DRM_CLIENT_CAP_UNIVERSAL_PLANES``h]j)}(hj|h]hDRM_CLIENT_CAP_UNIVERSAL_PLANES}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM3hjXfhhubj))}(hX**Description** If set to 1, the DRM core will expose all planes (overlay, primary, and cursor) to userspace. This capability has been introduced in kernel version 3.15. Starting from kernel version 3.17, this capability is always supported for all drivers. h](h)}(h**Description**h]j )}(hj}h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj}ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM3hj}ubh)}(h]If set to 1, the DRM core will expose all planes (overlay, primary, and cursor) to userspace.h]h]If set to 1, the DRM core will expose all planes (overlay, primary, and cursor) to userspace.}(hj+}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM2hj}ubh)}(hThis capability has been introduced in kernel version 3.15. Starting from kernel version 3.17, this capability is always supported for all drivers.h]hThis capability has been introduced in kernel version 3.15. Starting from kernel version 3.17, this capability is always supported for all drivers.}(hj:}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM5hj}ubeh}(h]h ]h"]h$]h&]uh1j(hj*}hM3hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_CLIENT_CAP_ATOMIC (C macro)c.DRM_CLIENT_CAP_ATOMIChNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CLIENT_CAP_ATOMICh]j )}(hDRM_CLIENT_CAP_ATOMICh]j )}(hDRM_CLIENT_CAP_ATOMICh]j )}(hjb}h]hDRM_CLIENT_CAP_ATOMIC}(hjl}hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjh}ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjd}hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM<ubah}(h]h ]h"]h$]h&]hhj uh1j j j hj`}hhhj}hM<ubah}(h]j[}ah ](j j eh"]h$]h&]j j )j huh1j hj}hM<hj]}hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj]}hhhj}hM<ubeh}(h]h ](jmacroeh"]h$]h&]j jj j}j j}j j j uh1j hhhjXfhjfhNubh)}(h``DRM_CLIENT_CAP_ATOMIC``h]j)}(hj}h]hDRM_CLIENT_CAP_ATOMIC}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM>hjXfhhubj))}(hX**Description** If set to 1, the DRM core will expose atomic properties to userspace. This implicitly enables :c:type:`DRM_CLIENT_CAP_UNIVERSAL_PLANES` and :c:type:`DRM_CLIENT_CAP_ASPECT_RATIO`. If the driver doesn't support atomic mode-setting, enabling this capability will fail with -EOPNOTSUPP. This capability has been introduced in kernel version 4.0. Starting from kernel version 4.2, this capability is always supported for atomic-capable drivers. h](h)}(h**Description**h]j )}(hj}h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj}ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM>hj}ubh)}(hIf set to 1, the DRM core will expose atomic properties to userspace. This implicitly enables :c:type:`DRM_CLIENT_CAP_UNIVERSAL_PLANES` and :c:type:`DRM_CLIENT_CAP_ASPECT_RATIO`.h](h^If set to 1, the DRM core will expose atomic properties to userspace. This implicitly enables }(hj}hhhNhNubh)}(h):c:type:`DRM_CLIENT_CAP_UNIVERSAL_PLANES`h]j)}(hj}h]hDRM_CLIENT_CAP_UNIVERSAL_PLANES}(hj}hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_UNIVERSAL_PLANESuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM=hj}ubh and }(hj}hhhNhNubh)}(h%:c:type:`DRM_CLIENT_CAP_ASPECT_RATIO`h]j)}(hj}h]hDRM_CLIENT_CAP_ASPECT_RATIO}(hj~hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_ASPECT_RATIOuh1hhj}hM=hj}ubh.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj}hM=hj}ubh)}(hgIf the driver doesn't support atomic mode-setting, enabling this capability will fail with -EOPNOTSUPP.h]hiIf the driver doesn’t support atomic mode-setting, enabling this capability will fail with -EOPNOTSUPP.}(hj%~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMAhj}ubh)}(hThis capability has been introduced in kernel version 4.0. Starting from kernel version 4.2, this capability is always supported for atomic-capable drivers.h]hThis capability has been introduced in kernel version 4.0. Starting from kernel version 4.2, this capability is always supported for atomic-capable drivers.}(hj4~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMDhj}ubeh}(h]h ]h"]h$]h&]uh1j(hj}hM>hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j %DRM_CLIENT_CAP_ASPECT_RATIO (C macro)c.DRM_CLIENT_CAP_ASPECT_RATIOhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_CLIENT_CAP_ASPECT_RATIOh]j )}(hDRM_CLIENT_CAP_ASPECT_RATIOh]j )}(hDRM_CLIENT_CAP_ASPECT_RATIOh]j )}(hj\~h]hDRM_CLIENT_CAP_ASPECT_RATIO}(hjf~hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjb~ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj^~hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMLubah}(h]h ]h"]h$]h&]hhj uh1j j j hjZ~hhhjy~hMLubah}(h]jU~ah ](j j eh"]h$]h&]j j )j huh1j hjy~hMLhjW~hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjW~hhhjy~hMLubeh}(h]h ](jmacroeh"]h$]h&]j jj j~j j~j j j uh1j hhhjXfhjfhNubh)}(h``DRM_CLIENT_CAP_ASPECT_RATIO``h]j)}(hj~h]hDRM_CLIENT_CAP_ASPECT_RATIO}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMNhjXfhhubj))}(h**Description** If set to 1, the DRM core will provide aspect ratio information in modes. See ``DRM_MODE_FLAG_PIC_AR_*``. This capability is always supported for all drivers starting from kernel version 4.18. h](h)}(h**Description**h]j )}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj~ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMNhj~ubh)}(hiIf set to 1, the DRM core will provide aspect ratio information in modes. See ``DRM_MODE_FLAG_PIC_AR_*``.h](hNIf set to 1, the DRM core will provide aspect ratio information in modes. See }(hj~hhhNhNubj)}(h``DRM_MODE_FLAG_PIC_AR_*``h]hDRM_MODE_FLAG_PIC_AR_*}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMMhj~ubh)}(hVThis capability is always supported for all drivers starting from kernel version 4.18.h]hVThis capability is always supported for all drivers starting from kernel version 4.18.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMPhj~ubeh}(h]h ]h"]h$]h&]uh1j(hj~hMNhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j -DRM_CLIENT_CAP_WRITEBACK_CONNECTORS (C macro)%c.DRM_CLIENT_CAP_WRITEBACK_CONNECTORShNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h#DRM_CLIENT_CAP_WRITEBACK_CONNECTORSh]j )}(h#DRM_CLIENT_CAP_WRITEBACK_CONNECTORSh]j )}(h#DRM_CLIENT_CAP_WRITEBACK_CONNECTORSh]j )}(hjh]h#DRM_CLIENT_CAP_WRITEBACK_CONNECTORS}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMWubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj0hMWubah}(h]j ah ](j j eh"]h$]h&]j j )j huh1j hj0hMWhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj0hMWubeh}(h]h ](jmacroeh"]h$]h&]j jj jIj jIj j j uh1j hhhjXfhjfhNubh)}(h'``DRM_CLIENT_CAP_WRITEBACK_CONNECTORS``h]j)}(hjOh]h#DRM_CLIENT_CAP_WRITEBACK_CONNECTORS}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjXfhhubj))}(hX1**Description** If set to 1, the DRM core will expose special connectors to be used for writing back to memory the scene setup in the commit. The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first. This capability is always supported for atomic-capable drivers starting from kernel version 4.19. h](h)}(h**Description**h]j )}(hjkh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjiubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjeubh)}(hIf set to 1, the DRM core will expose special connectors to be used for writing back to memory the scene setup in the commit. The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first.h](hIf set to 1, the DRM core will expose special connectors to be used for writing back to memory the scene setup in the commit. The client must enable }(hjhhhNhNubh)}(h:c:type:`DRM_CLIENT_CAP_ATOMIC`h]j)}(hjh]hDRM_CLIENT_CAP_ATOMIC}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_ATOMICuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMXhjubh first.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMXhjeubh)}(haThis capability is always supported for atomic-capable drivers starting from kernel version 4.19.h]haThis capability is always supported for atomic-capable drivers starting from kernel version 4.19.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM\hjeubeh}(h]h ]h"]h$]h&]uh1j(hjhMYhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j -DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT (C macro)%c.DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOThNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h#DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOTh]j )}(h#DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOTh]j )}(h#DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOTh]j )}(hjh]h#DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMcubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMcubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMchjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMcubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h'``DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT``h]j)}(hjh]h#DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMehjXfhhubj))}(hX **Description** Drivers for para-virtualized hardware (e.g. vmwgfx, qxl, virtio and virtualbox) have additional restrictions for cursor planes (thus making cursor planes on those drivers not truly universal,) e.g. they need cursor planes to act like one would expect from a mouse cursor and have correctly set hotspot properties. If this client cap is not set the DRM core will hide cursor plane on those virtualized drivers because not setting it implies that the client is not capable of dealing with those extra restictions. Clients which do set cursor hotspot and treat the cursor plane like a mouse cursor should set this property. The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first. Setting this property on drivers which do not special case cursor planes (i.e. non-virtualized drivers) will return EOPNOTSUPP, which can be used by userspace to gauge requirements of the hardware/drivers they're running on. This capability is always supported for atomic-capable virtualized drivers starting from kernel version 6.6. h](h)}(h**Description**h]j )}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMehj-ubh)}(hXDrivers for para-virtualized hardware (e.g. vmwgfx, qxl, virtio and virtualbox) have additional restrictions for cursor planes (thus making cursor planes on those drivers not truly universal,) e.g. they need cursor planes to act like one would expect from a mouse cursor and have correctly set hotspot properties. If this client cap is not set the DRM core will hide cursor plane on those virtualized drivers because not setting it implies that the client is not capable of dealing with those extra restictions. Clients which do set cursor hotspot and treat the cursor plane like a mouse cursor should set this property. The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first.h](hXDrivers for para-virtualized hardware (e.g. vmwgfx, qxl, virtio and virtualbox) have additional restrictions for cursor planes (thus making cursor planes on those drivers not truly universal,) e.g. they need cursor planes to act like one would expect from a mouse cursor and have correctly set hotspot properties. If this client cap is not set the DRM core will hide cursor plane on those virtualized drivers because not setting it implies that the client is not capable of dealing with those extra restictions. Clients which do set cursor hotspot and treat the cursor plane like a mouse cursor should set this property. The client must enable }(hjIhhhNhNubh)}(h:c:type:`DRM_CLIENT_CAP_ATOMIC`h]j)}(hjSh]hDRM_CLIENT_CAP_ATOMIC}(hjUhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_ATOMICuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMdhjIubh first.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjphMdhj-ubh)}(hSetting this property on drivers which do not special case cursor planes (i.e. non-virtualized drivers) will return EOPNOTSUPP, which can be used by userspace to gauge requirements of the hardware/drivers they're running on.h]hSetting this property on drivers which do not special case cursor planes (i.e. non-virtualized drivers) will return EOPNOTSUPP, which can be used by userspace to gauge requirements of the hardware/drivers they’re running on.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMphj-ubh)}(hlThis capability is always supported for atomic-capable virtualized drivers starting from kernel version 6.6.h]hlThis capability is always supported for atomic-capable virtualized drivers starting from kernel version 6.6.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMuhj-ubeh}(h]h ]h"]h$]h&]uh1j(hjHhMehjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j -DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE (C macro)%c.DRM_CLIENT_CAP_PLANE_COLOR_PIPELINEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h#DRM_CLIENT_CAP_PLANE_COLOR_PIPELINEh]j )}(h#DRM_CLIENT_CAP_PLANE_COLOR_PIPELINEh]j )}(h#DRM_CLIENT_CAP_PLANE_COLOR_PIPELINEh]j )}(hjh]h#DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM|ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjπhM|ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjπhM|hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjπhM|ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h'``DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE``h]j)}(hjh]h#DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjXfhhubj))}(hXH**Description** If set to 1 the DRM core will allow setting the COLOR_PIPELINE property on a :c:type:`drm_plane`, as well as drm_colorop properties. Setting of these plane properties will be rejected when this client cap is set: - COLOR_ENCODING - COLOR_RANGE The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first. h](h)}(h**Description**h]j )}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjubh)}(hIf set to 1 the DRM core will allow setting the COLOR_PIPELINE property on a :c:type:`drm_plane`, as well as drm_colorop properties.h](hMIf set to 1 the DRM core will allow setting the COLOR_PIPELINE property on a }(hj hhhNhNubh)}(h:c:type:`drm_plane`h]j)}(hj*h]h drm_plane}(hj,hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_planeuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM}hj ubh$, as well as drm_colorop properties.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjGhM}hjubh)}(hnSetting of these plane properties will be rejected when this client cap is set: - COLOR_ENCODING - COLOR_RANGEh]hnSetting of these plane properties will be rejected when this client cap is set: - COLOR_ENCODING - COLOR_RANGE}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(h=The client must enable :c:type:`DRM_CLIENT_CAP_ATOMIC` first.h](hThe client must enable }(hjahhhNhNubh)}(h:c:type:`DRM_CLIENT_CAP_ATOMIC`h]j)}(hjkh]hDRM_CLIENT_CAP_ATOMIC}(hjmhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_ATOMICuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjaubh first.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1j(hjhM~hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_syncobj_eventfd (C struct)c.drm_syncobj_eventfdhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hdrm_syncobj_eventfdh]j )}(hstruct drm_syncobj_eventfdh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMubj )}(hdrm_syncobj_eventfdh]j )}(hjh]hdrm_syncobj_eventfd}(hjҁhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj΁ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubj )}(hX**Definition**:: struct drm_syncobj_eventfd { __u32 handle; __u32 flags; __u64 point; __s32 fd; __u32 pad; }; **Members** ``handle`` syncobj handle. ``flags`` Zero to wait for the point to be signalled, or :c:type:`DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE` to wait for a fence to be available for the point. ``point`` syncobj timeline point (set to zero for binary syncobjs). ``fd`` Existing eventfd to sent events to. ``pad`` Must be zero.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubj)}(hpstruct drm_syncobj_eventfd { __u32 handle; __u32 flags; __u64 point; __s32 fd; __u32 pad; };h]hpstruct drm_syncobj_eventfd { __u32 handle; __u32 flags; __u64 point; __s32 fd; __u32 pad; };}hj"sbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(h **Members**h]j )}(hj3h]hMembers}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubj/ )}(hhh](j4 )}(h``handle`` syncobj handle. h](j: )}(h ``handle``h]j)}(hjRh]hhandle}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjLubjT )}(hhh]h)}(hsyncobj handle.h]hsyncobj handle.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjhubah}(h]h ]h"]h$]h&]uh1jS hjLubeh}(h]h ]h"]h$]h&]uh1j3 hjghMhjIubj4 )}(h``flags`` Zero to wait for the point to be signalled, or :c:type:`DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE` to wait for a fence to be available for the point. h](j: )}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubjT )}(hhh]h)}(hZero to wait for the point to be signalled, or :c:type:`DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE` to wait for a fence to be available for the point.h](h/Zero to wait for the point to be signalled, or }(hjhhhNhNubh)}(h/:c:type:`DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE`h]j)}(hjh]h%DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j%DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh3 to wait for a fence to be available for the point.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj˂hMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjIubj4 )}(hD``point`` syncobj timeline point (set to zero for binary syncobjs). h](j: )}(h ``point``h]j)}(hjh]hpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubjT )}(hhh]h)}(h9syncobj timeline point (set to zero for binary syncobjs).h]h9syncobj timeline point (set to zero for binary syncobjs).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjIubj4 )}(h+``fd`` Existing eventfd to sent events to. h](j: )}(h``fd``h]j)}(hj!h]hfd}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubjT )}(hhh]h)}(h#Existing eventfd to sent events to.h]h#Existing eventfd to sent events to.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj6hMhjIubj4 )}(h``pad`` Must be zero.h](j: )}(h``pad``h]j)}(hjZh]hpad}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjTubjT )}(hhh]h)}(h Must be zero.h]h Must be zero.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjpubah}(h]h ]h"]h$]h&]uh1jS hjTubeh}(h]h ]h"]h$]h&]uh1j3 hjohMhjIubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubh)}(haRegister an eventfd to be signalled by a syncobj. The eventfd counter will be incremented by one.h]haRegister an eventfd to be signalled by a syncobj. The eventfd counter will be incremented by one.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_IOCTL_GEM_CLOSE (C macro)c.DRM_IOCTL_GEM_CLOSEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_GEM_CLOSEh]j )}(hDRM_IOCTL_GEM_CLOSEh]j )}(hDRM_IOCTL_GEM_CLOSEh]j )}(hjՃh]hDRM_IOCTL_GEM_CLOSE}(hj߃hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjۃubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj׃hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMDubah}(h]h ]h"]h$]h&]hhj uh1j j j hjӃhhhjhMDubah}(h]j΃ah ](j j eh"]h$]h&]j j )j huh1j hjhMDhjЃhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjЃhhhjhMDubeh}(h]h ](jmacroeh"]h$]h&]j jj j j j j j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_GEM_CLOSE``h]j)}(hjh]hDRM_IOCTL_GEM_CLOSE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMFhjXfhhubj))}(hX Close a GEM handle. **Description** GEM handles are not reference-counted by the kernel. User-space is responsible for managing their lifetime. For example, if user-space imports the same memory object twice on the same DRM file description, the same GEM handle is returned by both imports, and user-space needs to ensure :c:type:`DRM_IOCTL_GEM_CLOSE` is performed once only. The same situation can happen when a memory object is allocated, then exported and imported again on the same DRM file description. The :c:type:`DRM_IOCTL_MODE_GETFB2` IOCTL is an exception and always returns fresh new GEM handles even if an existing GEM handle already refers to the same memory object before the IOCTL is performed. h](j))}(hClose a GEM handle. h]h)}(hClose a GEM handle.h]hClose a GEM handle.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMDhj+ubah}(h]h ]h"]h$]h&]uh1j(hj=hMDhj'ubh)}(h**Description**h]j )}(hjFh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjDubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMFhj'ubh)}(hXGEM handles are not reference-counted by the kernel. User-space is responsible for managing their lifetime. For example, if user-space imports the same memory object twice on the same DRM file description, the same GEM handle is returned by both imports, and user-space needs to ensure :c:type:`DRM_IOCTL_GEM_CLOSE` is performed once only. The same situation can happen when a memory object is allocated, then exported and imported again on the same DRM file description. The :c:type:`DRM_IOCTL_MODE_GETFB2` IOCTL is an exception and always returns fresh new GEM handles even if an existing GEM handle already refers to the same memory object before the IOCTL is performed.h](hXGEM handles are not reference-counted by the kernel. User-space is responsible for managing their lifetime. For example, if user-space imports the same memory object twice on the same DRM file description, the same GEM handle is returned by both imports, and user-space needs to ensure }(hj\hhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_CLOSE`h]j)}(hjfh]hDRM_IOCTL_GEM_CLOSE}(hjhhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_GEM_CLOSEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMEhj\ubh is performed once only. The same situation can happen when a memory object is allocated, then exported and imported again on the same DRM file description. The }(hj\hhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_GETFB2`h]j)}(hjh]hDRM_IOCTL_MODE_GETFB2}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_GETFB2uh1hhjhMEhj\ubh IOCTL is an exception and always returns fresh new GEM handles even if an existing GEM handle already refers to the same memory object before the IOCTL is performed.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMEhj'ubeh}(h]h ]h"]h$]h&]uh1j(hj=hMDhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j &DRM_IOCTL_PRIME_HANDLE_TO_FD (C macro)c.DRM_IOCTL_PRIME_HANDLE_TO_FDhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_PRIME_HANDLE_TO_FDh]j )}(hDRM_IOCTL_PRIME_HANDLE_TO_FDh]j )}(hDRM_IOCTL_PRIME_HANDLE_TO_FDh]j )}(hjʄh]hDRM_IOCTL_PRIME_HANDLE_TO_FD}(hjԄhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjЄubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj̄hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMyubah}(h]h ]h"]h$]h&]hhj uh1j j j hjȄhhhjhMyubah}(h]jÄah ](j j eh"]h$]h&]j j )j huh1j hjhMyhjńhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjńhhhjhMyubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h ``DRM_IOCTL_PRIME_HANDLE_TO_FD``h]j)}(hjh]hDRM_IOCTL_PRIME_HANDLE_TO_FD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM{hjXfhhubj))}(hX Convert a GEM handle to a DMA-BUF FD. **Description** User-space sets :c:type:`drm_prime_handle.handle ` with the GEM handle to export and :c:type:`drm_prime_handle.flags `, and gets back a DMA-BUF file descriptor in :c:type:`drm_prime_handle.fd `. The export can fail for any driver-specific reason, e.g. because export is not supported for this specific GEM handle (but might be for others). Support for exporting DMA-BUFs is advertised via :c:type:`DRM_PRIME_CAP_EXPORT`. h](j))}(h&Convert a GEM handle to a DMA-BUF FD. h]h)}(h%Convert a GEM handle to a DMA-BUF FD.h]h%Convert a GEM handle to a DMA-BUF FD.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMyhj ubah}(h]h ]h"]h$]h&]uh1j(hj2hMyhjubh)}(h**Description**h]j )}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj9ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM{hjubh)}(hUser-space sets :c:type:`drm_prime_handle.handle ` with the GEM handle to export and :c:type:`drm_prime_handle.flags `, and gets back a DMA-BUF file descriptor in :c:type:`drm_prime_handle.fd `.h](hUser-space sets }(hjQhhhNhNubh)}(h4:c:type:`drm_prime_handle.handle `h]j)}(hj[h]hdrm_prime_handle.handle}(hj]hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMzhjQubh# with the GEM handle to export and }(hjQhhhNhNubh)}(h3:c:type:`drm_prime_handle.flags `h]j)}(hjh]hdrm_prime_handle.flags}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhjxhMzhjQubh-, and gets back a DMA-BUF file descriptor in }(hjQhhhNhNubh)}(h0:c:type:`drm_prime_handle.fd `h]j)}(hjh]hdrm_prime_handle.fd}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhjxhMzhjQubh.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjxhMzhjubh)}(hThe export can fail for any driver-specific reason, e.g. because export is not supported for this specific GEM handle (but might be for others).h]hThe export can fail for any driver-specific reason, e.g. because export is not supported for this specific GEM handle (but might be for others).}(hjɅhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjubh)}(hPSupport for exporting DMA-BUFs is advertised via :c:type:`DRM_PRIME_CAP_EXPORT`.h](h1Support for exporting DMA-BUFs is advertised via }(hj؅hhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_EXPORT`h]j)}(hjh]hDRM_PRIME_CAP_EXPORT}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_EXPORTuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj؅ubh.}(hj؅hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1j(hj2hMyhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j &DRM_IOCTL_PRIME_FD_TO_HANDLE (C macro)c.DRM_IOCTL_PRIME_FD_TO_HANDLEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_PRIME_FD_TO_HANDLEh]j )}(hDRM_IOCTL_PRIME_FD_TO_HANDLEh]j )}(hDRM_IOCTL_PRIME_FD_TO_HANDLEh]j )}(hj#h]hDRM_IOCTL_PRIME_FD_TO_HANDLE}(hj-hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj)ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj%hhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hj!hhhj@hMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj@hMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj@hMubeh}(h]h ](jmacroeh"]h$]h&]j jj jYj jYj j j uh1j hhhjXfhjfhNubh)}(h ``DRM_IOCTL_PRIME_FD_TO_HANDLE``h]j)}(hj_h]hDRM_IOCTL_PRIME_FD_TO_HANDLE}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hXP Convert a DMA-BUF FD to a GEM handle. **Description** User-space sets :c:type:`drm_prime_handle.fd ` with a DMA-BUF file descriptor to import, and gets back a GEM handle in :c:type:`drm_prime_handle.handle `. :c:type:`drm_prime_handle.flags ` is unused. If an existing GEM handle refers to the memory object backing the DMA-BUF, that GEM handle is returned. Therefore user-space which needs to handle arbitrary DMA-BUFs must have a user-space lookup data structure to manually reference-count duplicated GEM handles. For more information see :c:type:`DRM_IOCTL_GEM_CLOSE`. The import can fail for any driver-specific reason, e.g. because import is only supported for DMA-BUFs allocated on this DRM device. Support for importing DMA-BUFs is advertised via :c:type:`DRM_PRIME_CAP_IMPORT`. h](j))}(h&Convert a DMA-BUF FD to a GEM handle. h]h)}(h%Convert a DMA-BUF FD to a GEM handle.h]h%Convert a DMA-BUF FD to a GEM handle.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjyubah}(h]h ]h"]h$]h&]uh1j(hjhMhjuubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjuubh)}(hUser-space sets :c:type:`drm_prime_handle.fd ` with a DMA-BUF file descriptor to import, and gets back a GEM handle in :c:type:`drm_prime_handle.handle `. :c:type:`drm_prime_handle.flags ` is unused.h](hUser-space sets }(hjhhhNhNubh)}(h0:c:type:`drm_prime_handle.fd `h]j)}(hjh]hdrm_prime_handle.fd}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubhI with a DMA-BUF file descriptor to import, and gets back a GEM handle in }(hjhhhNhNubh)}(h4:c:type:`drm_prime_handle.handle `h]j)}(hj؆h]hdrm_prime_handle.handle}(hjچhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjֆubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhjцhMhjubh. }(hjhhhNhNubh)}(h3:c:type:`drm_prime_handle.flags `h]j)}(hjh]hdrm_prime_handle.flags}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_prime_handleuh1hhjцhMhjubh is unused.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjцhMhjuubh)}(hX>If an existing GEM handle refers to the memory object backing the DMA-BUF, that GEM handle is returned. Therefore user-space which needs to handle arbitrary DMA-BUFs must have a user-space lookup data structure to manually reference-count duplicated GEM handles. For more information see :c:type:`DRM_IOCTL_GEM_CLOSE`.h](hX If an existing GEM handle refers to the memory object backing the DMA-BUF, that GEM handle is returned. Therefore user-space which needs to handle arbitrary DMA-BUFs must have a user-space lookup data structure to manually reference-count duplicated GEM handles. For more information see }(hj"hhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_CLOSE`h]j)}(hj,h]hDRM_IOCTL_GEM_CLOSE}(hj.hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_GEM_CLOSEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj"ubh.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjIhMhjuubh)}(hThe import can fail for any driver-specific reason, e.g. because import is only supported for DMA-BUFs allocated on this DRM device.h]hThe import can fail for any driver-specific reason, e.g. because import is only supported for DMA-BUFs allocated on this DRM device.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjuubh)}(hPSupport for importing DMA-BUFs is advertised via :c:type:`DRM_PRIME_CAP_IMPORT`.h](h1Support for importing DMA-BUFs is advertised via }(hjchhhNhNubh)}(h:c:type:`DRM_PRIME_CAP_IMPORT`h]j)}(hjmh]hDRM_PRIME_CAP_IMPORT}(hjohhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_PRIME_CAP_IMPORTuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjcubh.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjuubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_IOCTL_MODE_RMFB (C macro)c.DRM_IOCTL_MODE_RMFBhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_MODE_RMFBh]j )}(hDRM_IOCTL_MODE_RMFBh]j )}(hDRM_IOCTL_MODE_RMFBh]j )}(hjh]hDRM_IOCTL_MODE_RMFB}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjˇhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjˇhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjˇhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_MODE_RMFB``h]j)}(hjh]hDRM_IOCTL_MODE_RMFB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hXO Remove a framebuffer. **Description** This removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID. Warning: removing a framebuffer currently in-use on an enabled plane will disable that plane. The CRTC the plane is linked to may also be disabled (depending on driver capabilities). h](j))}(hRemove a framebuffer. h]h)}(hRemove a framebuffer.h]hRemove a framebuffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubah}(h]h ]h"]h$]h&]uh1j(hjhMhjubh)}(h**Description**h]j )}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(hlThis removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID.h]hlThis removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(hWarning: removing a framebuffer currently in-use on an enabled plane will disable that plane. The CRTC the plane is linked to may also be disabled (depending on driver capabilities).h]hWarning: removing a framebuffer currently in-use on an enabled plane will disable that plane. The CRTC the plane is linked to may also be disabled (depending on driver capabilities).}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j $DRM_IOCTL_MODE_CREATE_DUMB (C macro)c.DRM_IOCTL_MODE_CREATE_DUMBhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_MODE_CREATE_DUMBh]j )}(hDRM_IOCTL_MODE_CREATE_DUMBh]j )}(hDRM_IOCTL_MODE_CREATE_DUMBh]j )}(hjlh]hDRM_IOCTL_MODE_CREATE_DUMB}(hjvhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjrubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjnhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjjhhhjhMubah}(h]jeah ](j j eh"]h$]h&]j j )j huh1j hjhMhjghhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjghhhjhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_MODE_CREATE_DUMB``h]j)}(hjh]hDRM_IOCTL_MODE_CREATE_DUMB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hXk Create a new dumb buffer object. **Description** KMS dumb buffers provide a very primitive way to allocate a buffer object suitable for scanout and map it for software rendering. KMS dumb buffers are not suitable for hardware-accelerated rendering nor video decoding. KMS dumb buffers are not suitable to be displayed on any other device than the KMS device where they were allocated from. Also see :ref:`kms_dumb_buffer_objects`. The IOCTL argument is a struct drm_mode_create_dumb. User-space is expected to create a KMS dumb buffer via this IOCTL, then add it as a KMS framebuffer via :c:type:`DRM_IOCTL_MODE_ADDFB` and map it via :c:type:`DRM_IOCTL_MODE_MAP_DUMB`. :c:type:`DRM_CAP_DUMB_BUFFER` indicates whether this IOCTL is supported. :c:type:`DRM_CAP_DUMB_PREFERRED_DEPTH` and :c:type:`DRM_CAP_DUMB_PREFER_SHADOW` indicate driver preferences for dumb buffers. h](j))}(h!Create a new dumb buffer object. h]h)}(h Create a new dumb buffer object.h]h Create a new dumb buffer object.}(hjƈhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjˆubah}(h]h ]h"]h$]h&]uh1j(hjԈhMhjubh)}(h**Description**h]j )}(hj݈h]h Description}(hj߈hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjۈubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(hX}KMS dumb buffers provide a very primitive way to allocate a buffer object suitable for scanout and map it for software rendering. KMS dumb buffers are not suitable for hardware-accelerated rendering nor video decoding. KMS dumb buffers are not suitable to be displayed on any other device than the KMS device where they were allocated from. Also see :ref:`kms_dumb_buffer_objects`.h](hX^KMS dumb buffers provide a very primitive way to allocate a buffer object suitable for scanout and map it for software rendering. KMS dumb buffers are not suitable for hardware-accelerated rendering nor video decoding. KMS dumb buffers are not suitable to be displayed on any other device than the KMS device where they were allocated from. Also see }(hjhhhNhNubh)}(h:ref:`kms_dumb_buffer_objects`h]j:)}(hjh]hkms_dumb_buffer_objects}(hjhhhNhNubah}(h]h ](jstdstd-refeh"q]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&]refdocj refdomainj reftyperef refexplicitrefwarnjkms_dumb_buffer_objectsuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(h4The IOCTL argument is a struct drm_mode_create_dumb.h]h4The IOCTL argument is a struct drm_mode_create_dumb.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(hUser-space is expected to create a KMS dumb buffer via this IOCTL, then add it as a KMS framebuffer via :c:type:`DRM_IOCTL_MODE_ADDFB` and map it via :c:type:`DRM_IOCTL_MODE_MAP_DUMB`.h](hhUser-space is expected to create a KMS dumb buffer via this IOCTL, then add it as a KMS framebuffer via }(hj5hhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_ADDFB`h]j)}(hj?h]hDRM_IOCTL_MODE_ADDFB}(hjAhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_ADDFBuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj5ubh and map it via }(hj5hhhNhNubh)}(h!:c:type:`DRM_IOCTL_MODE_MAP_DUMB`h]j)}(hjch]hDRM_IOCTL_MODE_MAP_DUMB}(hjehhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_MAP_DUMBuh1hhj\hMhj5ubh.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj\hMhjubh)}(h:c:type:`DRM_CAP_DUMB_BUFFER` indicates whether this IOCTL is supported. :c:type:`DRM_CAP_DUMB_PREFERRED_DEPTH` and :c:type:`DRM_CAP_DUMB_PREFER_SHADOW` indicate driver preferences for dumb buffers.h](h)}(h:c:type:`DRM_CAP_DUMB_BUFFER`h]j)}(hjh]hDRM_CAP_DUMB_BUFFER}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CAP_DUMB_BUFFERuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh, indicates whether this IOCTL is supported. }(hjhhhNhNubh)}(h&:c:type:`DRM_CAP_DUMB_PREFERRED_DEPTH`h]j)}(hjh]hDRM_CAP_DUMB_PREFERRED_DEPTH}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CAP_DUMB_PREFERRED_DEPTHuh1hhjhMhjubh and }(hjhhhNhNubh)}(h$:c:type:`DRM_CAP_DUMB_PREFER_SHADOW`h]j)}(hj׉h]hDRM_CAP_DUMB_PREFER_SHADOW}(hjىhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjՉubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CAP_DUMB_PREFER_SHADOWuh1hhjhMhjubh. indicate driver preferences for dumb buffers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1j(hjԈhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_IOCTL_MODE_GETFB2 (C macro)c.DRM_IOCTL_MODE_GETFB2hNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_MODE_GETFB2h]j )}(hDRM_IOCTL_MODE_GETFB2h]j )}(hDRM_IOCTL_MODE_GETFB2h]j )}(hjh]hDRM_IOCTL_MODE_GETFB2}(hj!hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj4hMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj4hMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj4hMubeh}(h]h ](jmacroeh"]h$]h&]j jj jMj jMj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_MODE_GETFB2``h]j)}(hjSh]hDRM_IOCTL_MODE_GETFB2}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(hXn Get framebuffer metadata. **Description** This queries metadata about a framebuffer. User-space fills :c:type:`drm_mode_fb_cmd2.fb_id ` as the input, and the kernels fills the rest of the struct as the output. If the client is DRM master or has :c:type:`CAP_SYS_ADMIN`, :c:type:`drm_mode_fb_cmd2.handles ` will be filled with GEM buffer handles. Fresh new GEM handles are always returned, even if another GEM handle referring to the same memory object already exists on the DRM file description. The caller is responsible for removing the new handles, e.g. via the :c:type:`DRM_IOCTL_GEM_CLOSE` IOCTL. The same new handle will be returned for multiple planes in case they use the same memory object. Planes are valid until one has a zero handle -- this can be used to compute the number of planes. Otherwise, :c:type:`drm_mode_fb_cmd2.handles ` will be zeroed and planes are valid until one has a zero :c:type:`drm_mode_fb_cmd2.pitches `. If the framebuffer has a format modifier, :c:type:`DRM_MODE_FB_MODIFIERS` will be set in :c:type:`drm_mode_fb_cmd2.flags ` and :c:type:`drm_mode_fb_cmd2.modifier ` will contain the modifier. Otherwise, user-space must ignore :c:type:`drm_mode_fb_cmd2.modifier `. To obtain DMA-BUF FDs for each plane without leaking GEM handles, user-space can export each handle via :c:type:`DRM_IOCTL_PRIME_HANDLE_TO_FD`, then immediately close each unique handle via :c:type:`DRM_IOCTL_GEM_CLOSE`, making sure to not double-close handles which are specified multiple times in the array. h](j))}(hGet framebuffer metadata. h]h)}(hGet framebuffer metadata.h]hGet framebuffer metadata.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjmubah}(h]h ]h"]h$]h&]uh1j(hjhMhjiubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjiubh)}(hThis queries metadata about a framebuffer. User-space fills :c:type:`drm_mode_fb_cmd2.fb_id ` as the input, and the kernels fills the rest of the struct as the output.h](h`h]j)}(hjh]hdrm_mode_fb_cmd2.fb_id}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubhJ as the input, and the kernels fills the rest of the struct as the output.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjŊhMhjiubh)}(hX]If the client is DRM master or has :c:type:`CAP_SYS_ADMIN`, :c:type:`drm_mode_fb_cmd2.handles ` will be filled with GEM buffer handles. Fresh new GEM handles are always returned, even if another GEM handle referring to the same memory object already exists on the DRM file description. The caller is responsible for removing the new handles, e.g. via the :c:type:`DRM_IOCTL_GEM_CLOSE` IOCTL. The same new handle will be returned for multiple planes in case they use the same memory object. Planes are valid until one has a zero handle -- this can be used to compute the number of planes.h](h#If the client is DRM master or has }(hjЊhhhNhNubh)}(h:c:type:`CAP_SYS_ADMIN`h]j)}(hjڊh]h CAP_SYS_ADMIN}(hj܊hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj؊ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j CAP_SYS_ADMINuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjЊubh, }(hjЊhhhNhNubh)}(h5:c:type:`drm_mode_fb_cmd2.handles `h]j)}(hjh]hdrm_mode_fb_cmd2.handles}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhjhMhjЊubhX will be filled with GEM buffer handles. Fresh new GEM handles are always returned, even if another GEM handle referring to the same memory object already exists on the DRM file description. The caller is responsible for removing the new handles, e.g. via the }(hjЊhhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_CLOSE`h]j)}(hj!h]hDRM_IOCTL_GEM_CLOSE}(hj#hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_GEM_CLOSEuh1hhjhMhjЊubh IOCTL. The same new handle will be returned for multiple planes in case they use the same memory object. Planes are valid until one has a zero handle -- this can be used to compute the number of planes.}(hjЊhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjiubh)}(hOtherwise, :c:type:`drm_mode_fb_cmd2.handles ` will be zeroed and planes are valid until one has a zero :c:type:`drm_mode_fb_cmd2.pitches `.h](h Otherwise, }(hjHhhhNhNubh)}(h5:c:type:`drm_mode_fb_cmd2.handles `h]j)}(hjRh]hdrm_mode_fb_cmd2.handles}(hjThhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM hjHubh: will be zeroed and planes are valid until one has a zero }(hjHhhhNhNubh)}(h5:c:type:`drm_mode_fb_cmd2.pitches `h]j)}(hjvh]hdrm_mode_fb_cmd2.pitches}(hjxhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhjohM hjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjohM hjiubh)}(hX<If the framebuffer has a format modifier, :c:type:`DRM_MODE_FB_MODIFIERS` will be set in :c:type:`drm_mode_fb_cmd2.flags ` and :c:type:`drm_mode_fb_cmd2.modifier ` will contain the modifier. Otherwise, user-space must ignore :c:type:`drm_mode_fb_cmd2.modifier `.h](h*If the framebuffer has a format modifier, }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_FB_MODIFIERS`h]j)}(hjh]hDRM_MODE_FB_MODIFIERS}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_FB_MODIFIERSuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh will be set in }(hjhhhNhNubh)}(h3:c:type:`drm_mode_fb_cmd2.flags `h]j)}(hjˋh]hdrm_mode_fb_cmd2.flags}(hj͋hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjɋubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhjċhMhjubh and }(hjhhhNhNubh)}(h6:c:type:`drm_mode_fb_cmd2.modifier `h]j)}(hjh]hdrm_mode_fb_cmd2.modifier}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhjċhMhjubh> will contain the modifier. Otherwise, user-space must ignore }(hjhhhNhNubh)}(h6:c:type:`drm_mode_fb_cmd2.modifier `h]j)}(hjh]hdrm_mode_fb_cmd2.modifier}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_fb_cmd2uh1hhjċhMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjċhMhjiubh)}(hX5To obtain DMA-BUF FDs for each plane without leaking GEM handles, user-space can export each handle via :c:type:`DRM_IOCTL_PRIME_HANDLE_TO_FD`, then immediately close each unique handle via :c:type:`DRM_IOCTL_GEM_CLOSE`, making sure to not double-close handles which are specified multiple times in the array.h](hhTo obtain DMA-BUF FDs for each plane without leaking GEM handles, user-space can export each handle via }(hj8hhhNhNubh)}(h&:c:type:`DRM_IOCTL_PRIME_HANDLE_TO_FD`h]j)}(hjBh]hDRM_IOCTL_PRIME_HANDLE_TO_FD}(hjDhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_PRIME_HANDLE_TO_FDuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhj8ubh0, then immediately close each unique handle via }(hj8hhhNhNubh)}(h:c:type:`DRM_IOCTL_GEM_CLOSE`h]j)}(hjfh]hDRM_IOCTL_GEM_CLOSE}(hjhhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_GEM_CLOSEuh1hhj_hMhj8ubhZ, making sure to not double-close handles which are specified multiple times in the array.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj_hMhjiubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j #DRM_IOCTL_SYNCOBJ_EVENTFD (C macro)c.DRM_IOCTL_SYNCOBJ_EVENTFDhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_SYNCOBJ_EVENTFDh]j )}(hDRM_IOCTL_SYNCOBJ_EVENTFDh]j )}(hDRM_IOCTL_SYNCOBJ_EVENTFDh]j )}(hjh]hDRM_IOCTL_SYNCOBJ_EVENTFD}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjÌhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjÌhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjÌhMubeh}(h]h ](jmacroeh"]h$]h&]j jj j܌j j܌j j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_SYNCOBJ_EVENTFD``h]j)}(hjh]hDRM_IOCTL_SYNCOBJ_EVENTFD}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjXfhhubj))}(h Register an eventfd to be signalled by a syncobj. **Description** This can be used to integrate a syncobj in an event loop. The IOCTL argument is a struct drm_syncobj_eventfd. h](j))}(h2Register an eventfd to be signalled by a syncobj. h]h)}(h1Register an eventfd to be signalled by a syncobj.h]h1Register an eventfd to be signalled by a syncobj.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubah}(h]h ]h"]h$]h&]uh1j(hjhMhjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(h9This can be used to integrate a syncobj in an event loop.h]h9This can be used to integrate a syncobj in an event loop.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjubh)}(h3The IOCTL argument is a struct drm_syncobj_eventfd.h]h3The IOCTL argument is a struct drm_syncobj_eventfd.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM hjubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_IOCTL_MODE_CLOSEFB (C macro)c.DRM_IOCTL_MODE_CLOSEFBhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_MODE_CLOSEFBh]j )}(hDRM_IOCTL_MODE_CLOSEFBh]j )}(hDRM_IOCTL_MODE_CLOSEFBh]j )}(hjdh]hDRM_IOCTL_MODE_CLOSEFB}(hjnhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjfhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM&ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjbhhhjhM&ubah}(h]j]ah ](j j eh"]h$]h&]j j )j huh1j hjhM&hj_hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj_hhhjhM&ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_MODE_CLOSEFB``h]j)}(hjh]hDRM_IOCTL_MODE_CLOSEFB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM(hjXfhhubj))}(hX Close a framebuffer. **Description** This closes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID. This IOCTL is similar to :c:type:`DRM_IOCTL_MODE_RMFB`, except it doesn't disable planes and CRTCs. As long as the framebuffer is used by a plane, it's kept alive. When the plane no longer uses the framebuffer (because the framebuffer is replaced with another one, or the plane is disabled), the framebuffer is cleaned up. This is useful to implement flicker-free transitions between two processes. Depending on the threat model, user-space may want to ensure that the framebuffer doesn't expose any sensitive user information: closed framebuffers attached to a plane can be read back by the next DRM master. h](j))}(hClose a framebuffer. h]h)}(hClose a framebuffer.h]hClose a framebuffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM&hjubah}(h]h ]h"]h$]h&]uh1j(hj̍hM&hjubh)}(h**Description**h]j )}(hjՍh]h Description}(hj׍hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjӍubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM(hjubh)}(hkThis closes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID.h]hkThis closes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL argument is a framebuffer object ID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM'hjubh)}(hXBThis IOCTL is similar to :c:type:`DRM_IOCTL_MODE_RMFB`, except it doesn't disable planes and CRTCs. As long as the framebuffer is used by a plane, it's kept alive. When the plane no longer uses the framebuffer (because the framebuffer is replaced with another one, or the plane is disabled), the framebuffer is cleaned up.h](hThis IOCTL is similar to }(hjhhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_RMFB`h]j)}(hjh]hDRM_IOCTL_MODE_RMFB}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_RMFBuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM*hjubhX, except it doesn’t disable planes and CRTCs. As long as the framebuffer is used by a plane, it’s kept alive. When the plane no longer uses the framebuffer (because the framebuffer is replaced with another one, or the plane is disabled), the framebuffer is cleaned up.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj!hM*hjubh)}(hKThis is useful to implement flicker-free transitions between two processes.h]hKThis is useful to implement flicker-free transitions between two processes.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM0hjubh)}(hDepending on the threat model, user-space may want to ensure that the framebuffer doesn't expose any sensitive user information: closed framebuffers attached to a plane can be read back by the next DRM master.h]hDepending on the threat model, user-space may want to ensure that the framebuffer doesn’t expose any sensitive user information: closed framebuffers attached to a plane can be read back by the next DRM master.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM2hjubeh}(h]h ]h"]h$]h&]uh1j(hj̍hM&hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j #DRM_IOCTL_SET_CLIENT_NAME (C macro)c.DRM_IOCTL_SET_CLIENT_NAMEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_SET_CLIENT_NAMEh]j )}(hDRM_IOCTL_SET_CLIENT_NAMEh]j )}(hDRM_IOCTL_SET_CLIENT_NAMEh]j )}(hjch]hDRM_IOCTL_SET_CLIENT_NAME}(hjmhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjiubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjehhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM:ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjahhhjhM:ubah}(h]j\ah ](j j eh"]h$]h&]j j )j huh1j hjhM:hj^hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj^hhhjhM:ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_SET_CLIENT_NAME``h]j)}(hjh]hDRM_IOCTL_SET_CLIENT_NAME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM<hjXfhhubj))}(hX  Attach a name to a drm_file **Description** Having a name allows for easier tracking and debugging. The length of the name (without null ending char) must be <= DRM_CLIENT_NAME_MAX_LEN. The call will fail if the name contains whitespaces or non-printable chars. h](j))}(hAttach a name to a drm_file h]h)}(hAttach a name to a drm_fileh]hAttach a name to a drm_file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM:hjubah}(h]h ]h"]h$]h&]uh1j(hjˎhM:hjubh)}(h**Description**h]j )}(hjԎh]h Description}(hj֎hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjҎubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM<hjubh)}(hHaving a name allows for easier tracking and debugging. The length of the name (without null ending char) must be <= DRM_CLIENT_NAME_MAX_LEN. The call will fail if the name contains whitespaces or non-printable chars.h]hHaving a name allows for easier tracking and debugging. The length of the name (without null ending char) must be <= DRM_CLIENT_NAME_MAX_LEN. The call will fail if the name contains whitespaces or non-printable chars.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM;hjubeh}(h]h ]h"]h$]h&]uh1j(hjˎhM:hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j %DRM_IOCTL_GEM_CHANGE_HANDLE (C macro)c.DRM_IOCTL_GEM_CHANGE_HANDLEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_IOCTL_GEM_CHANGE_HANDLEh]j )}(hDRM_IOCTL_GEM_CHANGE_HANDLEh]j )}(hDRM_IOCTL_GEM_CHANGE_HANDLEh]j )}(hjh]hDRM_IOCTL_GEM_CHANGE_HANDLE}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMDubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj/hMDubah}(h]j ah ](j j eh"]h$]h&]j j )j huh1j hj/hMDhj hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj hhhj/hMDubeh}(h]h ](jmacroeh"]h$]h&]j jj jHj jHj j j uh1j hhhjXfhjfhNubh)}(h``DRM_IOCTL_GEM_CHANGE_HANDLE``h]j)}(hjNh]hDRM_IOCTL_GEM_CHANGE_HANDLE}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMFhjXfhhubj))}(h Move an object to a different handle **Description** Some applications (notably CRIU) need objects to have specific gem handles. This ioctl changes the object at one gem handle to use a new gem handle. h](j))}(h%Move an object to a different handle h]h)}(h$Move an object to a different handleh]h$Move an object to a different handle}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMDhjhubah}(h]h ]h"]h$]h&]uh1j(hjzhMDhjdubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMFhjdubh)}(hSome applications (notably CRIU) need objects to have specific gem handles. This ioctl changes the object at one gem handle to use a new gem handle.h]hSome applications (notably CRIU) need objects to have specific gem handles. This ioctl changes the object at one gem handle to use a new gem handle.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMEhjdubeh}(h]h ]h"]h$]h&]uh1j(hjzhMDhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_event (C struct) c.drm_eventhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(h drm_eventh]j )}(hstruct drm_eventh](j> )}(hjA h]hstruct}(hjǏhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjÏhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMKubj )}(h h]h }(hjՏhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjÏhhhjԏhMKubj )}(h drm_eventh]j )}(hjh]h drm_event}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjÏhhhjԏhMKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjԏhMKubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjԏhMKhjhhubj )}(hhh]h)}(hHeader for DRM eventsh]hHeader for DRM events}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMWhjhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjԏhMKubeh}(h]h ](jstructeh"]h$]h&]j jj j!j j!j j j uh1j hhhjXfhjfhNubj )}(h**Definition**:: struct drm_event { __u32 type; __u32 length; }; **Members** ``type`` event type. ``length`` total number of payload bytes (including header).h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubh:}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM[hj%ubj)}(h7struct drm_event { __u32 type; __u32 length; };h]h7struct drm_event { __u32 type; __u32 length; };}hjFsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM]hj%ubh)}(h **Members**h]j )}(hjWh]hMembers}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjUubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMbhj%ubj/ )}(hhh](j4 )}(h``type`` event type. h](j: )}(h``type``h]j)}(hjvh]htype}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjpubjT )}(hhh]h)}(h event type.h]h event type.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMYhjubah}(h]h ]h"]h$]h&]uh1jS hjpubeh}(h]h ]h"]h$]h&]uh1j3 hjhMYhjmubj4 )}(h<``length`` total number of payload bytes (including header).h](j: )}(h ``length``h]j)}(hjh]hlength}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMYhjubjT )}(hhh]h)}(h1total number of payload bytes (including header).h]h1total number of payload bytes (including header).}(hjȐhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMZhjŐubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjĐhMYhjmubeh}(h]h ]h"]h$]h&]uh1j. hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhjfhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM]hjXfhhubh)}(hThis struct is a header for events written back to user-space on the DRM FD. A read on the DRM FD will always only return complete events: e.g. if the read buffer is 100 bytes large and there are two 64 byte events pending, only one will be returned.h]hThis struct is a header for events written back to user-space on the DRM FD. A read on the DRM FD will always only return complete events: e.g. if the read buffer is 100 bytes large and there are two 64 byte events pending, only one will be returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMZhjXfhhubh)}(hEvent types 0 - 0x7fffffff are generic DRM events, 0x80000000 and up are chipset specific. Generic DRM events include :c:type:`DRM_EVENT_VBLANK`, :c:type:`DRM_EVENT_FLIP_COMPLETE` and :c:type:`DRM_EVENT_CRTC_SEQUENCE`.h](hvEvent types 0 - 0x7fffffff are generic DRM events, 0x80000000 and up are chipset specific. Generic DRM events include }(hjhhhNhNubh)}(h:c:type:`DRM_EVENT_VBLANK`h]j)}(hj!h]hDRM_EVENT_VBLANK}(hj#hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_VBLANKuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM_hjubh, }(hjhhhNhNubh)}(h!:c:type:`DRM_EVENT_FLIP_COMPLETE`h]j)}(hjEh]hDRM_EVENT_FLIP_COMPLETE}(hjGhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_FLIP_COMPLETEuh1hhj>hM_hjubh and }(hjhhhNhNubh)}(h!:c:type:`DRM_EVENT_CRTC_SEQUENCE`h]j)}(hjhh]hDRM_EVENT_CRTC_SEQUENCE}(hjjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_CRTC_SEQUENCEuh1hhj>hM_hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj>hM_hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_EVENT_VBLANK (C macro)c.DRM_EVENT_VBLANKhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_EVENT_VBLANKh]j )}(hDRM_EVENT_VBLANKh]j )}(hDRM_EVENT_VBLANKh]j )}(hjh]hDRM_EVENT_VBLANK}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMjubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMjubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMjhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMjubeh}(h]h ](jmacroeh"]h$]h&]j jj jؑj jؑj j j uh1j hhhjXfhjfhNubh)}(h``DRM_EVENT_VBLANK``h]j)}(hjޑh]hDRM_EVENT_VBLANK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܑubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMlhjXfhhubj))}(h vertical blanking event **Description** This event is sent in response to :c:type:`DRM_IOCTL_WAIT_VBLANK` with the :c:type:`_DRM_VBLANK_EVENT` flag set. The event payload is a struct drm_event_vblank. h](j))}(hvertical blanking event h]h)}(hvertical blanking eventh]hvertical blanking event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMjhjubah}(h]h ]h"]h$]h&]uh1j(hj hMjhjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMlhjubh)}(hpThis event is sent in response to :c:type:`DRM_IOCTL_WAIT_VBLANK` with the :c:type:`_DRM_VBLANK_EVENT` flag set.h](h"This event is sent in response to }(hj)hhhNhNubh)}(h:c:type:`DRM_IOCTL_WAIT_VBLANK`h]j)}(hj3h]hDRM_IOCTL_WAIT_VBLANK}(hj5hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_WAIT_VBLANKuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMkhj)ubh with the }(hj)hhhNhNubh)}(h:c:type:`_DRM_VBLANK_EVENT`h]j)}(hjWh]h_DRM_VBLANK_EVENT}(hjYhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j_DRM_VBLANK_EVENTuh1hhjPhMkhj)ubh flag set.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjPhMkhjubh)}(h/The event payload is a struct drm_event_vblank.h]h/The event payload is a struct drm_event_vblank.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMnhjubeh}(h]h ]h"]h$]h&]uh1j(hj hMjhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !DRM_EVENT_FLIP_COMPLETE (C macro)c.DRM_EVENT_FLIP_COMPLETEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_EVENT_FLIP_COMPLETEh]j )}(hDRM_EVENT_FLIP_COMPLETEh]j )}(hDRM_EVENT_FLIP_COMPLETEh]j )}(hjh]hDRM_EVENT_FLIP_COMPLETE}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMsubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjÒhMsubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjÒhMshjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjÒhMsubeh}(h]h ](jmacroeh"]h$]h&]j jj jܒj jܒj j j uh1j hhhjXfhjfhNubh)}(h``DRM_EVENT_FLIP_COMPLETE``h]j)}(hjh]hDRM_EVENT_FLIP_COMPLETE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMuhjXfhhubj))}(h page-flip completion event **Description** This event is sent in response to an atomic commit or legacy page-flip with the :c:type:`DRM_MODE_PAGE_FLIP_EVENT` flag set. The event payload is a struct drm_event_vblank. h](j))}(hpage-flip completion event h]h)}(hpage-flip completion eventh]hpage-flip completion event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMshjubah}(h]h ]h"]h$]h&]uh1j(hjhMshjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMuhjubh)}(h|This event is sent in response to an atomic commit or legacy page-flip with the :c:type:`DRM_MODE_PAGE_FLIP_EVENT` flag set.h](hPThis event is sent in response to an atomic commit or legacy page-flip with the }(hj-hhhNhNubh)}(h":c:type:`DRM_MODE_PAGE_FLIP_EVENT`h]j)}(hj7h]hDRM_MODE_PAGE_FLIP_EVENT}(hj9hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PAGE_FLIP_EVENTuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMthj-ubh flag set.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjThMthjubh)}(h/The event payload is a struct drm_event_vblank.h]h/The event payload is a struct drm_event_vblank.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMwhjubeh}(h]h ]h"]h$]h&]uh1j(hjhMshjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !DRM_EVENT_CRTC_SEQUENCE (C macro)c.DRM_EVENT_CRTC_SEQUENCEhNtauh1j hjXfhhhjfhNubj )}(hhh](j )}(hDRM_EVENT_CRTC_SEQUENCEh]j )}(hDRM_EVENT_CRTC_SEQUENCEh]j )}(hDRM_EVENT_CRTC_SEQUENCEh]j )}(hjh]hDRM_EVENT_CRTC_SEQUENCE}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM|ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhM|ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhM|hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhM|ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhjfhNubh)}(h``DRM_EVENT_CRTC_SEQUENCE``h]j)}(hjÓh]hDRM_EVENT_CRTC_SEQUENCE}(hjœhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjXfhhubj))}(h CRTC sequence event **Description** This event is sent in response to :c:type:`DRM_IOCTL_CRTC_QUEUE_SEQUENCE`. The event payload is a struct drm_event_crtc_sequence. h](j))}(hCRTC sequence event h]h)}(hCRTC sequence eventh]hCRTC sequence event}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM|hjݓubah}(h]h ]h"]h$]h&]uh1j(hjhM|hjٓubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM~hjٓubh)}(hJThis event is sent in response to :c:type:`DRM_IOCTL_CRTC_QUEUE_SEQUENCE`.h](h"This event is sent in response to }(hjhhhNhNubh)}(h':c:type:`DRM_IOCTL_CRTC_QUEUE_SEQUENCE`h]j)}(hjh]hDRM_IOCTL_CRTC_QUEUE_SEQUENCE}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_CRTC_QUEUE_SEQUENCEuh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhM}hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5hM}hjٓubh)}(h6The event payload is a struct drm_event_crtc_sequence.h]h6The event payload is a struct drm_event_crtc_sequence.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:740: ./include/uapi/drm/drm.hhMhjٓubeh}(h]h ]h"]h$]h&]uh1j(hjhM|hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_modeinfo (C struct)c.drm_mode_modeinfohNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_modeinfoh]j )}(hstruct drm_mode_modeinfoh](j> )}(hjA h]hstruct}(hjnhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKubj )}(h h]h }(hj|hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjjhhhj{hKubj )}(hdrm_mode_modeinfoh]j )}(hjhh]hdrm_mode_modeinfo}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjjhhhj{hKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjfhhhj{hKubah}(h]jaah ](j j eh"]h$]h&]j j )j huh1j hj{hKhjchhubj )}(hhh]h)}(hDisplay mode information.h]hDisplay mode information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j hjchhhj{hKubeh}(h]h ](jstructeh"]h$]h&]j jj jȔj jȔj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_modeinfo { __u32 clock; __u16 hdisplay; __u16 hsync_start; __u16 hsync_end; __u16 htotal; __u16 hskew; __u16 vdisplay; __u16 vsync_start; __u16 vsync_end; __u16 vtotal; __u16 vscan; __u32 vrefresh; __u32 flags; __u32 type; char name[DRM_DISPLAY_MODE_LEN]; }; **Members** ``clock`` pixel clock in kHz ``hdisplay`` horizontal display size ``hsync_start`` horizontal sync start ``hsync_end`` horizontal sync end ``htotal`` horizontal total size ``hskew`` horizontal skew ``vdisplay`` vertical display size ``vsync_start`` vertical sync start ``vsync_end`` vertical sync end ``vtotal`` vertical total size ``vscan`` vertical scan ``vrefresh`` approximate vertical refresh rate in Hz ``flags`` bitmask of misc. flags, see DRM_MODE_FLAG_* defines ``type`` bitmask of type flags, see DRM_MODE_TYPE_* defines ``name`` string describing the mode resolutionh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjԔhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjДubh:}(hjДhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj̔ubj)}(hXNstruct drm_mode_modeinfo { __u32 clock; __u16 hdisplay; __u16 hsync_start; __u16 hsync_end; __u16 htotal; __u16 hskew; __u16 vdisplay; __u16 vsync_start; __u16 vsync_end; __u16 vtotal; __u16 vscan; __u32 vrefresh; __u32 flags; __u32 type; char name[DRM_DISPLAY_MODE_LEN]; };h]hXNstruct drm_mode_modeinfo { __u32 clock; __u16 hdisplay; __u16 hsync_start; __u16 hsync_end; __u16 htotal; __u16 hskew; __u16 vdisplay; __u16 vsync_start; __u16 vsync_end; __u16 vtotal; __u16 vscan; __u32 vrefresh; __u32 flags; __u32 type; char name[DRM_DISPLAY_MODE_LEN]; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj̔ubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj̔ubj/ )}(hhh](j4 )}(h``clock`` pixel clock in kHz h](j: )}(h ``clock``h]j)}(hjh]hclock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(hpixel clock in kHzh]hpixel clock in kHz}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hKhj3ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj2hKhjubj4 )}(h%``hdisplay`` horizontal display size h](j: )}(h ``hdisplay``h]j)}(hjVh]hhdisplay}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjPubjT )}(hhh]h)}(hhorizontal display sizeh]hhorizontal display size}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhKhjlubah}(h]h ]h"]h$]h&]uh1jS hjPubeh}(h]h ]h"]h$]h&]uh1j3 hjkhKhjubj4 )}(h&``hsync_start`` horizontal sync start h](j: )}(h``hsync_start``h]j)}(hjh]h hsync_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(hhorizontal sync starth]hhorizontal sync start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h"``hsync_end`` horizontal sync end h](j: )}(h ``hsync_end``h]j)}(hjȕh]h hsync_end}(hjʕhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƕubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj•ubjT )}(hhh]h)}(hhorizontal sync endh]hhorizontal sync end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjݕhKhjޕubah}(h]h ]h"]h$]h&]uh1jS hj•ubeh}(h]h ]h"]h$]h&]uh1j3 hjݕhKhjubj4 )}(h!``htotal`` horizontal total size h](j: )}(h ``htotal``h]j)}(hjh]hhtotal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(hhorizontal total sizeh]hhorizontal total size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h``hskew`` horizontal skew h](j: )}(h ``hskew``h]j)}(hj:h]hhskew}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj4ubjT )}(hhh]h)}(hhorizontal skewh]hhorizontal skew}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhKhjPubah}(h]h ]h"]h$]h&]uh1jS hj4ubeh}(h]h ]h"]h$]h&]uh1j3 hjOhKhjubj4 )}(h#``vdisplay`` vertical display size h](j: )}(h ``vdisplay``h]j)}(hjsh]hvdisplay}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjmubjT )}(hhh]h)}(hvertical display sizeh]hvertical display size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjmubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h$``vsync_start`` vertical sync start h](j: )}(h``vsync_start``h]j)}(hjh]h vsync_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(hvertical sync starth]hvertical sync start}(hjŖhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj–ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h ``vsync_end`` vertical sync end h](j: )}(h ``vsync_end``h]j)}(hjh]h vsync_end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjߖubjT )}(hhh]h)}(hvertical sync endh]hvertical sync end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjߖubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h``vtotal`` vertical total size h](j: )}(h ``vtotal``h]j)}(hjh]hvtotal}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(hvertical total sizeh]hvertical total size}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKhj4ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj3hKhjubj4 )}(h``vscan`` vertical scan h](j: )}(h ``vscan``h]j)}(hjWh]hvscan}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjQubjT )}(hhh]h)}(h vertical scanh]h vertical scan}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhKhjmubah}(h]h ]h"]h$]h&]uh1jS hjQubeh}(h]h ]h"]h$]h&]uh1j3 hjlhKhjubj4 )}(h5``vrefresh`` approximate vertical refresh rate in Hz h](j: )}(h ``vrefresh``h]j)}(hjh]hvrefresh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(h'approximate vertical refresh rate in Hzh]h'approximate vertical refresh rate in Hz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h>``flags`` bitmask of misc. flags, see DRM_MODE_FLAG_* defines h](j: )}(h ``flags``h]j)}(hjɗh]hflags}(hj˗hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǗubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj×ubjT )}(hhh]h)}(h3bitmask of misc. flags, see DRM_MODE_FLAG_* definesh]h3bitmask of misc. flags, see DRM_MODE_FLAG_* defines}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjޗhKhjߗubah}(h]h ]h"]h$]h&]uh1jS hj×ubeh}(h]h ]h"]h$]h&]uh1j3 hjޗhKhjubj4 )}(h<``type`` bitmask of type flags, see DRM_MODE_TYPE_* defines h](j: )}(h``type``h]j)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(h2bitmask of type flags, see DRM_MODE_TYPE_* definesh]h2bitmask of type flags, see DRM_MODE_TYPE_* defines}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h.``name`` string describing the mode resolutionh](j: )}(h``name``h]j)}(hj;h]hname}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhj5ubjT )}(hhh]h)}(h%string describing the mode resolutionh]h%string describing the mode resolution}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjQubah}(h]h ]h"]h$]h&]uh1jS hj5ubeh}(h]h ]h"]h$]h&]uh1j3 hjPhKhjubeh}(h]h ]h"]h$]h&]uh1j. hj̔ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj|ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjXfhhubh)}(hrThis is the user-space API display mode information structure. For the kernel version see struct drm_display_mode.h]hrThis is the user-space API display mode information structure. For the kernel version see struct drm_display_mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_get_plane (C struct)c.drm_mode_get_planehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_get_planeh]j )}(hstruct drm_mode_get_planeh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKubj )}(h h]h }(hjʘhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjɘhKubj )}(hdrm_mode_get_planeh]j )}(hjh]hdrm_mode_get_plane}(hjܘhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjؘubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjɘhKubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjɘhKubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjɘhKhjhhubj )}(hhh]h)}(hGet plane metadata.h]hGet plane metadata.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM2hjhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjɘhKubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX[**Definition**:: struct drm_mode_get_plane { __u32 plane_id; __u32 crtc_id; __u32 fb_id; __u32 possible_crtcs; __u32 gamma_size; __u32 count_format_types; __u64 format_type_ptr; }; **Members** ``plane_id`` Object ID of the plane whose information should be retrieved. Set by caller. ``crtc_id`` Object ID of the current CRTC. ``fb_id`` Object ID of the current fb. ``possible_crtcs`` Bitmask of CRTC's compatible with the plane. CRTC's are created and they receive an index, which corresponds to their position in the bitmask. Bit N corresponds to :ref:`CRTC index` N. ``gamma_size`` Never used. ``count_format_types`` Number of formats. ``format_type_ptr`` Pointer to ``__u32`` array of formats that are supported by the plane. These formats do not require modifiers.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM6hjubj)}(hstruct drm_mode_get_plane { __u32 plane_id; __u32 crtc_id; __u32 fb_id; __u32 possible_crtcs; __u32 gamma_size; __u32 count_format_types; __u64 format_type_ptr; };h]hstruct drm_mode_get_plane { __u32 plane_id; __u32 crtc_id; __u32 fb_id; __u32 possible_crtcs; __u32 gamma_size; __u32 count_format_types; __u64 format_type_ptr; };}hj;sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM8hjubh)}(h **Members**h]j )}(hjLh]hMembers}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMBhjubj/ )}(hhh](j4 )}(hZ``plane_id`` Object ID of the plane whose information should be retrieved. Set by caller. h](j: )}(h ``plane_id``h]j)}(hjkh]hplane_id}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMChjeubjT )}(hhh]h)}(hLObject ID of the plane whose information should be retrieved. Set by caller.h]hLObject ID of the plane whose information should be retrieved. Set by caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMBhjubah}(h]h ]h"]h$]h&]uh1jS hjeubeh}(h]h ]h"]h$]h&]uh1j3 hjhMChjbubj4 )}(h+``crtc_id`` Object ID of the current CRTC. h](j: )}(h ``crtc_id``h]j)}(hjh]hcrtc_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMGhjubjT )}(hhh]h)}(hObject ID of the current CRTC.h]hObject ID of the current CRTC.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMGhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMGhjbubj4 )}(h'``fb_id`` Object ID of the current fb. h](j: )}(h ``fb_id``h]j)}(hjޙh]hfb_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܙubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMIhjؙubjT )}(hhh]h)}(hObject ID of the current fb.h]hObject ID of the current fb.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMIhjubah}(h]h ]h"]h$]h&]uh1jS hjؙubeh}(h]h ]h"]h$]h&]uh1j3 hjhMIhjbubj4 )}(h``possible_crtcs`` Bitmask of CRTC's compatible with the plane. CRTC's are created and they receive an index, which corresponds to their position in the bitmask. Bit N corresponds to :ref:`CRTC index` N. h](j: )}(h``possible_crtcs``h]j)}(hjh]hpossible_crtcs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMPhjubjT )}(hhh]h)}(hBitmask of CRTC's compatible with the plane. CRTC's are created and they receive an index, which corresponds to their position in the bitmask. Bit N corresponds to :ref:`CRTC index` N.h](hBitmask of CRTC’s compatible with the plane. CRTC’s are created and they receive an index, which corresponds to their position in the bitmask. Bit N corresponds to }(hj0hhhNhNubh)}(h:ref:`CRTC index`h]j:)}(hj:h]h CRTC index}(hj<hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j9hj8ubah}(h]h ]h"]h$]h&]refdocj refdomainjFreftyperef refexplicitrefwarnj crtc_indexuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMMhj0ubh N.}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjXhMMhj-ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj,hMPhjbubj4 )}(h``gamma_size`` Never used. h](j: )}(h``gamma_size``h]j)}(hjuh]h gamma_size}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMShjoubjT )}(hhh]h)}(h Never used.h]h Never used.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1jS hjoubeh}(h]h ]h"]h$]h&]uh1j3 hjhMShjbubj4 )}(h*``count_format_types`` Number of formats. h](j: )}(h``count_format_types``h]j)}(hjh]hcount_format_types}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMVhjubjT )}(hhh]h)}(hNumber of formats.h]hNumber of formats.}(hjǚhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjÚhMVhjĚubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjÚhMVhjbubj4 )}(h``format_type_ptr`` Pointer to ``__u32`` array of formats that are supported by the plane. These formats do not require modifiers.h](j: )}(h``format_type_ptr``h]j)}(hjh]hformat_type_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMYhjubjT )}(hhh]h)}(hnPointer to ``__u32`` array of formats that are supported by the plane. These formats do not require modifiers.h](h Pointer to }(hjhhhNhNubj)}(h ``__u32``h]h__u32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhZ array of formats that are supported by the plane. These formats do not require modifiers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMYhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMYhjbubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj9ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM]hjXfhhubh)}(hMUserspace can perform a GETPLANE ioctl to retrieve information about a plane.h]hMUserspace can perform a GETPLANE ioctl to retrieve information about a plane.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM3hjXfhhubh)}(hTo retrieve the number of formats supported, set **count_format_types** to zero and call the ioctl. **count_format_types** will be updated with the value.h](h1To retrieve the number of formats supported, set }(hj`hhhNhNubj )}(h**count_format_types**h]hcount_format_types}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj`ubh to zero and call the ioctl. }(hj`hhhNhNubj )}(h**count_format_types**h]hcount_format_types}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj`ubh will be updated with the value.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM6hjXfhhubh)}(hXTo retrieve these formats, allocate an array with the memory needed to store **count_format_types** formats. Point **format_type_ptr** to this array and call the ioctl again (with **count_format_types** still set to the value returned in the first ioctl call).h](hMTo retrieve these formats, allocate an array with the memory needed to store }(hjhhhNhNubj )}(h**count_format_types**h]hcount_format_types}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh formats. Point }(hjhhhNhNubj )}(h**format_type_ptr**h]hformat_type_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh. to this array and call the ioctl again (with }(hjhhhNhNubj )}(h**count_format_types**h]hcount_format_types}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh: still set to the value returned in the first ioctl call).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM9hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !drm_mode_get_connector (C struct)c.drm_mode_get_connectorhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_get_connectorh]j )}(hstruct drm_mode_get_connectorh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMAubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMAubj )}(hdrm_mode_get_connectorh]j )}(hjh]hdrm_mode_get_connector}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMAubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMAubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMAhjhhubj )}(hhh]h)}(hGet connector metadata.h]hGet connector metadata.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj0hhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhMAubeh}(h]h ](jstructeh"]h$]h&]j jj jKj jKj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_get_connector { __u64 encoders_ptr; __u64 modes_ptr; __u64 props_ptr; __u64 prop_values_ptr; __u32 count_modes; __u32 count_props; __u32 count_encoders; __u32 encoder_id; __u32 connector_id; __u32 connector_type; __u32 connector_type_id; __u32 connection; __u32 mm_width; __u32 mm_height; __u32 subpixel; __u32 pad; }; **Members** ``encoders_ptr`` Pointer to ``__u32`` array of object IDs. ``modes_ptr`` Pointer to struct drm_mode_modeinfo array. ``props_ptr`` Pointer to ``__u32`` array of property IDs. ``prop_values_ptr`` Pointer to ``__u64`` array of property values. ``count_modes`` Number of modes. ``count_props`` Number of properties. ``count_encoders`` Number of encoders. ``encoder_id`` Object ID of the current encoder. ``connector_id`` Object ID of the connector. ``connector_type`` Type of the connector. See DRM_MODE_CONNECTOR_* defines. ``connector_type_id`` Type-specific connector number. This is not an object ID. This is a per-type connector number. Each (type, type_id) combination is unique across all connectors of a DRM device. The (type, type_id) combination is not a stable identifier: the type_id can change depending on the driver probe order. ``connection`` Status of the connector. See enum drm_connector_status. ``mm_width`` Width of the connected sink in millimeters. ``mm_height`` Height of the connected sink in millimeters. ``subpixel`` Subpixel order of the connected sink. See enum subpixel_order. ``pad`` Padding, must be zero.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjSubh:}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjOubj)}(hXstruct drm_mode_get_connector { __u64 encoders_ptr; __u64 modes_ptr; __u64 props_ptr; __u64 prop_values_ptr; __u32 count_modes; __u32 count_props; __u32 count_encoders; __u32 encoder_id; __u32 connector_id; __u32 connector_type; __u32 connector_type_id; __u32 connection; __u32 mm_width; __u32 mm_height; __u32 subpixel; __u32 pad; };h]hXstruct drm_mode_get_connector { __u64 encoders_ptr; __u64 modes_ptr; __u64 props_ptr; __u64 prop_values_ptr; __u32 count_modes; __u32 count_props; __u32 count_encoders; __u32 encoder_id; __u32 connector_id; __u32 connector_type; __u32 connector_type_id; __u32 connection; __u32 mm_width; __u32 mm_height; __u32 subpixel; __u32 pad; };}hjpsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjOubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjOubj/ )}(hhh](j4 )}(h;``encoders_ptr`` Pointer to ``__u32`` array of object IDs. h](j: )}(h``encoders_ptr``h]j)}(hjh]h encoders_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h)Pointer to ``__u32`` array of object IDs.h](h Pointer to }(hjhhhNhNubj)}(h ``__u32``h]h__u32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh array of object IDs.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h9``modes_ptr`` Pointer to struct drm_mode_modeinfo array. h](j: )}(h ``modes_ptr``h]j)}(hjh]h modes_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h*Pointer to struct drm_mode_modeinfo array.h]h*Pointer to struct drm_mode_modeinfo array.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h:``props_ptr`` Pointer to ``__u32`` array of property IDs. h](j: )}(h ``props_ptr``h]j)}(hj$h]h props_ptr}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h+Pointer to ``__u32`` array of property IDs.h](h Pointer to }(hj=hhhNhNubj)}(h ``__u32``h]h__u32}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh array of property IDs.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj9hMhj:ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj9hMhjubj4 )}(hC``prop_values_ptr`` Pointer to ``__u64`` array of property values. h](j: )}(h``prop_values_ptr``h]j)}(hjoh]hprop_values_ptr}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjiubjT )}(hhh]h)}(h.Pointer to ``__u64`` array of property values.h](h Pointer to }(hjhhhNhNubj)}(h ``__u64``h]h__u64}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh array of property values.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjiubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h!``count_modes`` Number of modes. h](j: )}(h``count_modes``h]j)}(hjh]h count_modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hNumber of modes.h]hNumber of modes.}(hjӝhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjϝhMhjНubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjϝhMhjubj4 )}(h&``count_props`` Number of properties. h](j: )}(h``count_props``h]j)}(hjh]h count_props}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hNumber of properties.h]hNumber of properties.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h'``count_encoders`` Number of encoders. h](j: )}(h``count_encoders``h]j)}(hj,h]hcount_encoders}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj&ubjT )}(hhh]h)}(hNumber of encoders.h]hNumber of encoders.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMhjBubah}(h]h ]h"]h$]h&]uh1jS hj&ubeh}(h]h ]h"]h$]h&]uh1j3 hjAhMhjubj4 )}(h1``encoder_id`` Object ID of the current encoder. h](j: )}(h``encoder_id``h]j)}(hjeh]h encoder_id}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj_ubjT )}(hhh]h)}(h!Object ID of the current encoder.h]h!Object ID of the current encoder.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1jS hj_ubeh}(h]h ]h"]h$]h&]uh1j3 hjzhMhjubj4 )}(h-``connector_id`` Object ID of the connector. h](j: )}(h``connector_id``h]j)}(hjh]h connector_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hObject ID of the connector.h]hObject ID of the connector.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(hM``connector_type`` Type of the connector. See DRM_MODE_CONNECTOR_* defines. h](j: )}(h``connector_type``h]j)}(hjמh]hconnector_type}(hjٞhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj՞ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjўubjT )}(hhh](h)}(hType of the connector.h]hType of the connector.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h!See DRM_MODE_CONNECTOR_* defines.h]h!See DRM_MODE_CONNECTOR_* defines.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjўubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(hXA``connector_type_id`` Type-specific connector number. This is not an object ID. This is a per-type connector number. Each (type, type_id) combination is unique across all connectors of a DRM device. The (type, type_id) combination is not a stable identifier: the type_id can change depending on the driver probe order. h](j: )}(h``connector_type_id``h]j)}(hjh]hconnector_type_id}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh](h)}(hType-specific connector number.h]hType-specific connector number.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj5ubh)}(hThis is not an object ID. This is a per-type connector number. Each (type, type_id) combination is unique across all connectors of a DRM device.h]hThis is not an object ID. This is a per-type connector number. Each (type, type_id) combination is unique across all connectors of a DRM device.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj5ubh)}(hwThe (type, type_id) combination is not a stable identifier: the type_id can change depending on the driver probe order.h]hwThe (type, type_id) combination is not a stable identifier: the type_id can change depending on the driver probe order.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj5ubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj4hMhjubj4 )}(hH``connection`` Status of the connector. See enum drm_connector_status. h](j: )}(h``connection``h]j)}(hjwh]h connection}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjqubjT )}(hhh](h)}(hStatus of the connector.h]hStatus of the connector.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hSee enum drm_connector_status.h]hSee enum drm_connector_status.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjqubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h9``mm_width`` Width of the connected sink in millimeters. h](j: )}(h ``mm_width``h]j)}(hjh]hmm_width}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h+Width of the connected sink in millimeters.h]h+Width of the connected sink in millimeters.}(hj؟hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjԟhMhj՟ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjԟhMhjubj4 )}(h;``mm_height`` Height of the connected sink in millimeters. h](j: )}(h ``mm_height``h]j)}(hjh]h mm_height}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h,Height of the connected sink in millimeters.h]h,Height of the connected sink in millimeters.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj hMhjubj4 )}(hM``subpixel`` Subpixel order of the connected sink. See enum subpixel_order. h](j: )}(h ``subpixel``h]j)}(hj1h]hsubpixel}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj+ubjT )}(hhh](h)}(h%Subpixel order of the connected sink.h]h%Subpixel order of the connected sink.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjGubh)}(hSee enum subpixel_order.h]hSee enum subpixel_order.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMhjGubeh}(h]h ]h"]h$]h&]uh1jS hj+ubeh}(h]h ]h"]h$]h&]uh1j3 hjFhMhjubj4 )}(h``pad`` Padding, must be zero.h](j: )}(h``pad``h]j)}(hjyh]hpad}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjsubjT )}(hhh]h)}(hPadding, must be zero.h]hPadding, must be zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjsubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j. hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hX)User-space can perform a GETCONNECTOR ioctl to retrieve information about a connector. User-space is expected to retrieve encoders, modes and properties by performing this ioctl at least twice: the first time to retrieve the number of elements, the second time to retrieve the elements themselves.h]hX)User-space can perform a GETCONNECTOR ioctl to retrieve information about a connector. User-space is expected to retrieve encoders, modes and properties by performing this ioctl at least twice: the first time to retrieve the number of elements, the second time to retrieve the elements themselves.}(hjҠhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hTo retrieve the number of elements, set **count_props** and **count_encoders** to zero, set **count_modes** to 1, and set **modes_ptr** to a temporary struct drm_mode_modeinfo element.h](h(To retrieve the number of elements, set }(hjhhhNhNubj )}(h**count_props**h]h count_props}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and }(hjhhhNhNubj )}(h**count_encoders**h]hcount_encoders}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh to zero, set }(hjhhhNhNubj )}(h**count_modes**h]h count_modes}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh to 1, and set }(hjhhhNhNubj )}(h **modes_ptr**h]h modes_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh1 to a temporary struct drm_mode_modeinfo element.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hTo retrieve the elements, allocate arrays for **encoders_ptr**, **modes_ptr**, **props_ptr** and **prop_values_ptr**, then set **count_modes**, **count_props** and **count_encoders** to their capacity.h](h.To retrieve the elements, allocate arrays for }(hj8hhhNhNubj )}(h**encoders_ptr**h]h encoders_ptr}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh, }(hj8hhhNhNubj )}(h **modes_ptr**h]h modes_ptr}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh, }(hj8hhhNhNubj )}(h **props_ptr**h]h props_ptr}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh and }(hj8hhhNhNubj )}(h**prop_values_ptr**h]hprop_values_ptr}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh , then set }(hj8hhhNhNubj )}(h**count_modes**h]h count_modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh, }hj8sbj )}(h**count_props**h]h count_props}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh and }(hj8hhhNhNubj )}(h**count_encoders**h]hcount_encoders}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubh to their capacity.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hX$Performing the ioctl only twice may be racy: the number of elements may have changed with a hotplug event in-between the two ioctls. User-space is expected to retry the last ioctl until the number of elements stabilizes. The kernel won't fill any array which doesn't have the expected length.h]hX(Performing the ioctl only twice may be racy: the number of elements may have changed with a hotplug event in-between the two ioctls. User-space is expected to retry the last ioctl until the number of elements stabilizes. The kernel won’t fill any array which doesn’t have the expected length.}(hjšhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(h**Force-probing a connector**h]j )}(hj֡h]hForce-probing a connector}(hjءhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjԡubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hXIf the **count_modes** field is set to zero and the DRM client is the current DRM master, the kernel will perform a forced probe on the connector to refresh the connector status, modes and EDID. A forced-probe can be slow, might cause flickering and the ioctl will block.h](hIf the }(hjhhhNhNubj )}(h**count_modes**h]h count_modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh field is set to zero and the DRM client is the current DRM master, the kernel will perform a forced probe on the connector to refresh the connector status, modes and EDID. A forced-probe can be slow, might cause flickering and the ioctl will block.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hXUser-space needs to force-probe connectors to ensure their metadata is up-to-date at startup and after receiving a hot-plug event. User-space may perform a forced-probe when the user explicitly requests it. User-space shouldn't perform a forced-probe in other situations.h]hXUser-space needs to force-probe connectors to ensure their metadata is up-to-date at startup and after receiving a hot-plug event. User-space may perform a forced-probe when the user explicitly requests it. User-space shouldn’t perform a forced-probe in other situations.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !drm_mode_property_enum (C struct)c.drm_mode_property_enumhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_property_enumh]j )}(hstruct drm_mode_property_enumh](j> )}(hjA h]hstruct}(hj5hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj1hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjChhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj1hhhjBhMubj )}(hdrm_mode_property_enumh]j )}(hj/h]hdrm_mode_property_enum}(hjUhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjQubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj1hhhjBhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj-hhhjBhMubah}(h]j(ah ](j j eh"]h$]h&]j j )j huh1j hjBhMhj*hhubj )}(hhh]h)}(h'Description for an enum/bitfield entry.h]h'Description for an enum/bitfield entry.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjthhubah}(h]h ]h"]h$]h&]uh1j hj*hhhjBhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(h**Definition**:: struct drm_mode_property_enum { __u64 value; char name[DRM_PROP_NAME_LEN]; }; **Members** ``value`` numeric value for this enum entry. ``name`` symbolic name for this enum entry.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(hUstruct drm_mode_property_enum { __u64 value; char name[DRM_PROP_NAME_LEN]; };h]hUstruct drm_mode_property_enum { __u64 value; char name[DRM_PROP_NAME_LEN]; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hjubh)}(h **Members**h]j )}(hjŢh]hMembers}(hjǢhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjâubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM%hjubj/ )}(hhh](j4 )}(h-``value`` numeric value for this enum entry. h](j: )}(h ``value``h]j)}(hjh]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjޢubjT )}(hhh]h)}(h"numeric value for this enum entry.h]h"numeric value for this enum entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjޢubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjۢubj4 )}(h+``name`` symbolic name for this enum entry.h](j: )}(h``name``h]j)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h"symbolic name for this enum entry.h]h"symbolic name for this enum entry.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj3ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj2hMhjۢubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hjXfhhubh)}(h)See struct drm_property_enum for details.h]h)See struct drm_property_enum for details.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_get_property (C struct)c.drm_mode_get_propertyhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_get_propertyh]j )}(hstruct drm_mode_get_propertyh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM"ubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhM"ubj )}(hdrm_mode_get_propertyh]j )}(hjh]hdrm_mode_get_property}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhM"ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhM"ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhM"hjhhubj )}(hhh]h)}(hGet property metadata.h]hGet property metadata.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM&hjݣhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhM"ubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX"**Definition**:: struct drm_mode_get_property { __u64 values_ptr; __u64 enum_blob_ptr; __u32 prop_id; __u32 flags; char name[DRM_PROP_NAME_LEN]; __u32 count_values; __u32 count_enum_blobs; }; **Members** ``values_ptr`` Pointer to a ``__u64`` array. ``enum_blob_ptr`` Pointer to a struct drm_mode_property_enum array. ``prop_id`` Object ID of the property which should be retrieved. Set by the caller. ``flags`` ``DRM_MODE_PROP_*`` bitfield. See :c:type:`drm_property.flags ` for a definition of the flags. ``name`` Symbolic property name. User-space should use this field to recognize properties. ``count_values`` Number of elements in **values_ptr**. ``count_enum_blobs`` Number of elements in **enum_blob_ptr**.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM*hjubj)}(hstruct drm_mode_get_property { __u64 values_ptr; __u64 enum_blob_ptr; __u32 prop_id; __u32 flags; char name[DRM_PROP_NAME_LEN]; __u32 count_values; __u32 count_enum_blobs; };h]hstruct drm_mode_get_property { __u64 values_ptr; __u64 enum_blob_ptr; __u32 prop_id; __u32 flags; char name[DRM_PROP_NAME_LEN]; __u32 count_values; __u32 count_enum_blobs; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM,hjubh)}(h **Members**h]j )}(hj.h]hMembers}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM6hjubj/ )}(hhh](j4 )}(h-``values_ptr`` Pointer to a ``__u64`` array. h](j: )}(h``values_ptr``h]j)}(hjMh]h values_ptr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMFhjGubjT )}(hhh]h)}(hPointer to a ``__u64`` array.h](h Pointer to a }(hjfhhhNhNubj)}(h ``__u64``h]h__u64}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh array.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjbhMFhjcubah}(h]h ]h"]h$]h&]uh1jS hjGubeh}(h]h ]h"]h$]h&]uh1j3 hjbhMFhjDubj4 )}(hD``enum_blob_ptr`` Pointer to a struct drm_mode_property_enum array. h](j: )}(h``enum_blob_ptr``h]j)}(hjh]h enum_blob_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMHhjubjT )}(hhh]h)}(h1Pointer to a struct drm_mode_property_enum array.h]h1Pointer to a struct drm_mode_property_enum array.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMHhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMHhjDubj4 )}(hT``prop_id`` Object ID of the property which should be retrieved. Set by the caller. h](j: )}(h ``prop_id``h]j)}(hjѤh]hprop_id}(hjӤhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjϤubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMMhjˤubjT )}(hhh]h)}(hGObject ID of the property which should be retrieved. Set by the caller.h]hGObject ID of the property which should be retrieved. Set by the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMLhjubah}(h]h ]h"]h$]h&]uh1jS hjˤubeh}(h]h ]h"]h$]h&]uh1j3 hjhMMhjDubj4 )}(hw``flags`` ``DRM_MODE_PROP_*`` bitfield. See :c:type:`drm_property.flags ` for a definition of the flags. h](j: )}(h ``flags``h]j)}(hj h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMRhjubjT )}(hhh]h)}(hl``DRM_MODE_PROP_*`` bitfield. See :c:type:`drm_property.flags ` for a definition of the flags.h](j)}(h``DRM_MODE_PROP_*``h]hDRM_MODE_PROP_*}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh bitfield. See }(hj$hhhNhNubh)}(h+:c:type:`drm_property.flags `h]j)}(hj<h]hdrm_property.flags}(hj>hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_propertyuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMQhj$ubh for a definition of the flags.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjYhMQhj!ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj hMRhjDubj4 )}(h[``name`` Symbolic property name. User-space should use this field to recognize properties. h](j: )}(h``name``h]j)}(hjvh]hname}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMWhjpubjT )}(hhh]h)}(hQSymbolic property name. User-space should use this field to recognize properties.h]hQSymbolic property name. User-space should use this field to recognize properties.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMVhjubah}(h]h ]h"]h$]h&]uh1jS hjpubeh}(h]h ]h"]h$]h&]uh1j3 hjhMWhjDubj4 )}(h7``count_values`` Number of elements in **values_ptr**. h](j: )}(h``count_values``h]j)}(hjh]h count_values}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM[hjubjT )}(hhh]h)}(h%Number of elements in **values_ptr**.h](hNumber of elements in }(hjɥhhhNhNubj )}(h**values_ptr**h]h values_ptr}(hjѥhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjɥubh.}(hjɥhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjťhM[hjƥubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjťhM[hjDubj4 )}(h=``count_enum_blobs`` Number of elements in **enum_blob_ptr**.h](j: )}(h``count_enum_blobs``h]j)}(hjh]hcount_enum_blobs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM\hjubjT )}(hhh]h)}(h(Number of elements in **enum_blob_ptr**.h](hNumber of elements in }(hjhhhNhNubj )}(h**enum_blob_ptr**h]h enum_blob_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM]hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhM\hjDubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjPh]h Description}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM`hjXfhhubh)}(hUser-space can perform a GETPROPERTY ioctl to retrieve information about a property. The same property may be attached to multiple objects, see "Modeset Base Object Abstraction".h]hUser-space can perform a GETPROPERTY ioctl to retrieve information about a property. The same property may be attached to multiple objects, see “Modeset Base Object Abstraction”.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM'hjXfhhubh)}(hThe meaning of the **values_ptr** field changes depending on the property type. See :c:type:`drm_property.flags ` for more details.h](hThe meaning of the }(hjuhhhNhNubj )}(h**values_ptr**h]h values_ptr}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh3 field changes depending on the property type. See }(hjuhhhNhNubh)}(h+:c:type:`drm_property.flags `h]j)}(hjh]hdrm_property.flags}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_propertyuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM+hjuubh for more details.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM+hjXfhhubh)}(hXThe **enum_blob_ptr** and **count_enum_blobs** fields are only meaningful when the property has the type :c:type:`DRM_MODE_PROP_ENUM` or :c:type:`DRM_MODE_PROP_BITMASK`. For backwards compatibility, the kernel will always set **count_enum_blobs** to zero when the property has the type :c:type:`DRM_MODE_PROP_BLOB`. User-space must ignore these two fields if the property has a different type.h](hThe }(hjhhhNhNubj )}(h**enum_blob_ptr**h]h enum_blob_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and }(hjhhhNhNubj )}(h**count_enum_blobs**h]hcount_enum_blobs}(hjӦhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh; fields are only meaningful when the property has the type }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_ENUM`h]j)}(hjh]hDRM_MODE_PROP_ENUM}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_ENUMuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM.hjubh or }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_BITMASK`h]j)}(hj h]hDRM_MODE_PROP_BITMASK}(hj hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_BITMASKuh1hhjhM.hjubh:. For backwards compatibility, the kernel will always set }(hjhhhNhNubj )}(h**count_enum_blobs**h]hcount_enum_blobs}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh( to zero when the property has the type }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_BLOB`h]j)}(hj@h]hDRM_MODE_PROP_BLOB}(hjBhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_BLOBuh1hhjhM.hjubhO. User-space must ignore these two fields if the property has a different type.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM.hjXfhhubh)}(hUser-space is expected to retrieve values and enums by performing this ioctl at least twice: the first time to retrieve the number of elements, the second time to retrieve the elements themselves.h]hUser-space is expected to retrieve values and enums by performing this ioctl at least twice: the first time to retrieve the number of elements, the second time to retrieve the elements themselves.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM4hjXfhhubh)}(hX9To retrieve the number of elements, set **count_values** and **count_enum_blobs** to zero, then call the ioctl. **count_values** will be updated with the number of elements. If the property has the type :c:type:`DRM_MODE_PROP_ENUM` or :c:type:`DRM_MODE_PROP_BITMASK`, **count_enum_blobs** will be updated as well.h](h(To retrieve the number of elements, set }(hjvhhhNhNubj )}(h**count_values**h]h count_values}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjvubh and }(hjvhhhNhNubj )}(h**count_enum_blobs**h]hcount_enum_blobs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjvubh to zero, then call the ioctl. }(hjvhhhNhNubj )}(h**count_values**h]h count_values}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjvubhK will be updated with the number of elements. If the property has the type }(hjvhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_ENUM`h]j)}(hjh]hDRM_MODE_PROP_ENUM}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_ENUMuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM8hjvubh or }(hjvhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_BITMASK`h]j)}(hjڧh]hDRM_MODE_PROP_BITMASK}(hjܧhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjاubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_BITMASKuh1hhjӧhM8hjvubh, }(hjvhhhNhNubj )}(h**count_enum_blobs**h]hcount_enum_blobs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjvubh will be updated as well.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjӧhM8hjXfhhubh)}(hXUTo retrieve the elements themselves, allocate an array for **values_ptr** and set **count_values** to its capacity. If the property has the type :c:type:`DRM_MODE_PROP_ENUM` or :c:type:`DRM_MODE_PROP_BITMASK`, allocate an array for **enum_blob_ptr** and set **count_enum_blobs** to its capacity. Calling the ioctl again will fill the arrays.h](h;To retrieve the elements themselves, allocate an array for }(hjhhhNhNubj )}(h**values_ptr**h]h values_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and set }(hjhhhNhNubj )}(h**count_values**h]h count_values}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/ to its capacity. If the property has the type }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_ENUM`h]j)}(hjAh]hDRM_MODE_PROP_ENUM}(hjChhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_ENUMuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM=hjubh or }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_PROP_BITMASK`h]j)}(hjeh]hDRM_MODE_PROP_BITMASK}(hjghhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_PROP_BITMASKuh1hhj^hM=hjubh, allocate an array for }(hjhhhNhNubj )}(h**enum_blob_ptr**h]h enum_blob_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and set }(hjhhhNhNubj )}(h**count_enum_blobs**h]hcount_enum_blobs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh? to its capacity. Calling the ioctl again will fill the arrays.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj^hM=hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_fb_cmd2 (C struct)c.drm_mode_fb_cmd2hNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_fb_cmd2h]j )}(hstruct drm_mode_fb_cmd2h](j> )}(hjA h]hstruct}(hjɨhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjŨhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMFubj )}(h h]h }(hjרhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjŨhhhj֨hMFubj )}(hdrm_mode_fb_cmd2h]j )}(hjèh]hdrm_mode_fb_cmd2}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjŨhhhj֨hMFubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj֨hMFubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj֨hMFhjhhubj )}(hhh]h)}(hFrame-buffer metadata.h]hFrame-buffer metadata.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjhhhj֨hMFubeh}(h]h ](jstructeh"]h$]h&]j jj j#j j#j j j uh1j hhhjXfhNhNubj )}(hX(**Definition**:: struct drm_mode_fb_cmd2 { __u32 fb_id; __u32 width; __u32 height; __u32 pixel_format; __u32 flags; __u32 handles[4]; __u32 pitches[4]; __u32 offsets[4]; __u64 modifier[4]; }; **Members** ``fb_id`` Object ID of the frame-buffer. ``width`` Width of the frame-buffer. ``height`` Height of the frame-buffer. ``pixel_format`` FourCC format code, see ``DRM_FORMAT_*`` constants in ``drm_fourcc.h``. ``flags`` Frame-buffer flags (see :c:type:`DRM_MODE_FB_INTERLACED` and :c:type:`DRM_MODE_FB_MODIFIERS`). ``handles`` GEM buffer handle, one per plane. Set to 0 if the plane is unused. The same handle can be used for multiple planes. ``pitches`` Pitch (aka. stride) in bytes, one per plane. ``offsets`` Offset into the buffer in bytes, one per plane. ``modifier`` Format modifier, one per plane. See ``DRM_FORMAT_MOD_*`` constants in ``drm_fourcc.h``. All planes must use the same modifier. Ignored unless :c:type:`DRM_MODE_FB_MODIFIERS` is set in **flags**.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj+ubh:}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj'ubj)}(hstruct drm_mode_fb_cmd2 { __u32 fb_id; __u32 width; __u32 height; __u32 pixel_format; __u32 flags; __u32 handles[4]; __u32 pitches[4]; __u32 offsets[4]; __u64 modifier[4]; };h]hstruct drm_mode_fb_cmd2 { __u32 fb_id; __u32 width; __u32 height; __u32 pixel_format; __u32 flags; __u32 handles[4]; __u32 pitches[4]; __u32 offsets[4]; __u64 modifier[4]; };}hjHsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj'ubh)}(h **Members**h]j )}(hjYh]hMembers}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjWubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj'ubj/ )}(hhh](j4 )}(h)``fb_id`` Object ID of the frame-buffer. h](j: )}(h ``fb_id``h]j)}(hjxh]hfb_id}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjrubjT )}(hhh]h)}(hObject ID of the frame-buffer.h]hObject ID of the frame-buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjrubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjoubj4 )}(h%``width`` Width of the frame-buffer. h](j: )}(h ``width``h]j)}(hjh]hwidth}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hWidth of the frame-buffer.h]hWidth of the frame-buffer.}(hjʩhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjƩhMhjǩubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjƩhMhjoubj4 )}(h'``height`` Height of the frame-buffer. h](j: )}(h ``height``h]j)}(hjh]hheight}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hHeight of the frame-buffer.h]hHeight of the frame-buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjoubj4 )}(hY``pixel_format`` FourCC format code, see ``DRM_FORMAT_*`` constants in ``drm_fourcc.h``. h](j: )}(h``pixel_format``h]j)}(hj#h]h pixel_format}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hGFourCC format code, see ``DRM_FORMAT_*`` constants in ``drm_fourcc.h``.h](hFourCC format code, see }(hj<hhhNhNubj)}(h``DRM_FORMAT_*``h]h DRM_FORMAT_*}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh constants in }(hj<hhhNhNubj)}(h``drm_fourcc.h``h]h drm_fourcc.h}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj9ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj8hMhjoubj4 )}(hi``flags`` Frame-buffer flags (see :c:type:`DRM_MODE_FB_INTERLACED` and :c:type:`DRM_MODE_FB_MODIFIERS`). h](j: )}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj{ubjT )}(hhh]h)}(h^Frame-buffer flags (see :c:type:`DRM_MODE_FB_INTERLACED` and :c:type:`DRM_MODE_FB_MODIFIERS`).h](hFrame-buffer flags (see }(hjhhhNhNubh)}(h :c:type:`DRM_MODE_FB_INTERLACED`h]j)}(hjh]hDRM_MODE_FB_INTERLACED}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_FB_INTERLACEDuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh and }(hjhhhNhNubh)}(h:c:type:`DRM_MODE_FB_MODIFIERS`h]j)}(hjȪh]hDRM_MODE_FB_MODIFIERS}(hjʪhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjƪubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_FB_MODIFIERSuh1hhjhMhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hj{ubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjoubj4 )}(h``handles`` GEM buffer handle, one per plane. Set to 0 if the plane is unused. The same handle can be used for multiple planes. h](j: )}(h ``handles``h]j)}(hjh]hhandles}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hsGEM buffer handle, one per plane. Set to 0 if the plane is unused. The same handle can be used for multiple planes.h]hsGEM buffer handle, one per plane. Set to 0 if the plane is unused. The same handle can be used for multiple planes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjoubj4 )}(h9``pitches`` Pitch (aka. stride) in bytes, one per plane. h](j: )}(h ``pitches``h]j)}(hj;h]hpitches}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj5ubjT )}(hhh]h)}(h,Pitch (aka. stride) in bytes, one per plane.h]h,Pitch (aka. stride) in bytes, one per plane.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjQubah}(h]h ]h"]h$]h&]uh1jS hj5ubeh}(h]h ]h"]h$]h&]uh1j3 hjPhMhjoubj4 )}(h<``offsets`` Offset into the buffer in bytes, one per plane. h](j: )}(h ``offsets``h]j)}(hjth]hoffsets}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjnubjT )}(hhh]h)}(h/Offset into the buffer in bytes, one per plane.h]h/Offset into the buffer in bytes, one per plane.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjnubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjoubj4 )}(h``modifier`` Format modifier, one per plane. See ``DRM_FORMAT_MOD_*`` constants in ``drm_fourcc.h``. All planes must use the same modifier. Ignored unless :c:type:`DRM_MODE_FB_MODIFIERS` is set in **flags**.h](j: )}(h ``modifier``h]j)}(hjh]hmodifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hFormat modifier, one per plane. See ``DRM_FORMAT_MOD_*`` constants in ``drm_fourcc.h``. All planes must use the same modifier. Ignored unless :c:type:`DRM_MODE_FB_MODIFIERS` is set in **flags**.h](h$Format modifier, one per plane. See }(hjƫhhhNhNubj)}(h``DRM_FORMAT_MOD_*``h]hDRM_FORMAT_MOD_*}(hjΫhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƫubh constants in }(hjƫhhhNhNubj)}(h``drm_fourcc.h``h]h drm_fourcc.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƫubh8. All planes must use the same modifier. Ignored unless }(hjƫhhhNhNubh)}(h:c:type:`DRM_MODE_FB_MODIFIERS`h]j)}(hjh]hDRM_MODE_FB_MODIFIERS}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_FB_MODIFIERSuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjƫubh is set in }(hjƫhhhNhNubj )}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjƫubh.}(hjƫhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjëubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj«hMhjoubeh}(h]h ]h"]h$]h&]uh1j. hj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h;**Description**h]j )}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjGubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hFThis struct holds frame-buffer metadata. There are two ways to use it:h]hFThis struct holds frame-buffer metadata. There are two ways to use it:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh](j%)}(hUser-space can fill this struct and perform a :c:type:`DRM_IOCTL_MODE_ADDFB2` ioctl to register a new frame-buffer. The new frame-buffer object ID will be set by the kernel in **fb_id**.h]h)}(hUser-space can fill this struct and perform a :c:type:`DRM_IOCTL_MODE_ADDFB2` ioctl to register a new frame-buffer. The new frame-buffer object ID will be set by the kernel in **fb_id**.h](h.User-space can fill this struct and perform a }(hjuhhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_ADDFB2`h]j)}(hjh]hDRM_IOCTL_MODE_ADDFB2}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_ADDFB2uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjuubhc ioctl to register a new frame-buffer. The new frame-buffer object ID will be set by the kernel in }(hjuhhhNhNubj )}(h **fb_id**h]hfb_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjqubah}(h]h ]h"]h$]h&]uh1j$hjnubj%)}(hUser-space can set **fb_id** and perform a :c:type:`DRM_IOCTL_MODE_GETFB2` ioctl to fetch metadata about an existing frame-buffer. h]h)}(hUser-space can set **fb_id** and perform a :c:type:`DRM_IOCTL_MODE_GETFB2` ioctl to fetch metadata about an existing frame-buffer.h](hUser-space can set }(hjìhhhNhNubj )}(h **fb_id**h]hfb_id}(hjˬhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjìubh and perform a }(hjìhhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_GETFB2`h]j)}(hj߬h]hDRM_IOCTL_MODE_GETFB2}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjݬubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_GETFB2uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjìubh8 ioctl to fetch metadata about an existing frame-buffer.}(hjìhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjnubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhjXfhhubh)}(hIn case of planar formats, this struct allows up to 4 buffer objects with offsets and pitches per plane. The pitch and offset order are dictated by the format FourCC as defined by ``drm_fourcc.h``, e.g. NV12 is described as:h](hIn case of planar formats, this struct allows up to 4 buffer objects with offsets and pitches per plane. The pitch and offset order are dictated by the format FourCC as defined by }(hjhhhNhNubj)}(h``drm_fourcc.h``h]h drm_fourcc.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, e.g. NV12 is described as:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj))}(hYUV 4:2:0 image with a plane of 8-bit Y samples followed by an interleaved U/V plane containing 8-bit 2x2 subsampled colour difference samples. h]h)}(hYUV 4:2:0 image with a plane of 8-bit Y samples followed by an interleaved U/V plane containing 8-bit 2x2 subsampled colour difference samples.h]hYUV 4:2:0 image with a plane of 8-bit Y samples followed by an interleaved U/V plane containing 8-bit 2x2 subsampled colour difference samples.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj4ubah}(h]h ]h"]h$]h&]uh1j(hjFhMhjXfhhubh)}(hTSo it would consist of a Y plane at ``offsets[0]`` and a UV plane at ``offsets[1]``.h](h$So it would consist of a Y plane at }(hjMhhhNhNubj)}(h``offsets[0]``h]h offsets[0]}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh and a UV plane at }(hjMhhhNhNubj)}(h``offsets[1]``h]h offsets[1]}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hXzTo accommodate tiled, compressed, etc formats, a modifier can be specified. For more information see the "Format Modifiers" section. Note that even though it looks like we have a modifier per-plane, we in fact do not. The modifier for each plane must be identical. Thus all combinations of different data layouts for multi-plane formats must be enumerated as separate modifiers.h]hX~To accommodate tiled, compressed, etc formats, a modifier can be specified. For more information see the “Format Modifiers” section. Note that even though it looks like we have a modifier per-plane, we in fact do not. The modifier for each plane must be identical. Thus all combinations of different data layouts for multi-plane formats must be enumerated as separate modifiers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hX>All of the entries in **handles**, **pitches**, **offsets** and **modifier** must be zero when unused. Warning, for **offsets** and **modifier** zero can't be used to figure out whether the entry is used or not since it's a valid value (a zero offset is common, and a zero modifier is :c:type:`DRM_FORMAT_MOD_LINEAR`).h](hAll of the entries in }(hjhhhNhNubj )}(h **handles**h]hhandles}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }(hjhhhNhNubj )}(h **pitches**h]hpitches}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }hjsbj )}(h **offsets**h]hoffsets}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and }(hjhhhNhNubj )}(h **modifier**h]hmodifier}(hjͭhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh( must be zero when unused. Warning, for }(hjhhhNhNubj )}(h **offsets**h]hoffsets}(hj߭hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh and }hjsbj )}(h **modifier**h]hmodifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh zero can’t be used to figure out whether the entry is used or not since it’s a valid value (a zero offset is common, and a zero modifier is }(hjhhhNhNubh)}(h:c:type:`DRM_FORMAT_MOD_LINEAR`h]j)}(hjh]hDRM_FORMAT_MOD_LINEAR}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_FORMAT_MOD_LINEARuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj"hMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_colorop_type (C enum)c.drm_colorop_typehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_colorop_typeh]j )}(henum drm_colorop_typeh](j> )}(hj,h]henum}(hjFhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjBhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjThhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjBhhhjShMubj )}(hdrm_colorop_typeh]j )}(hj@h]hdrm_colorop_type}(hjfhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjbubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjBhhhjShMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj>hhhjShMubah}(h]j9ah ](j j eh"]h$]h&]j j )j huh1j hjShMhj;hhubj )}(hhh]h)}(hType of color operationh]hType of color operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMnhjhhubah}(h]h ]h"]h$]h&]uh1j hj;hhhjShMubeh}(h]h ](jenumeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX$**Constants** ``DRM_COLOROP_1D_CURVE`` enum string "1D Curve" A 1D curve that is being applied to all color channels. The curve is specified via the CURVE_1D_TYPE colorop property. ``DRM_COLOROP_1D_LUT`` enum string "1D LUT" A simple 1D LUT of uniformly spaced :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property. The DATA blob is an array of struct drm_color_lut32 with size of "size". ``DRM_COLOROP_CTM_3X4`` enum string "3x4 Matrix" A 3x4 matrix. Its values are specified via the :c:type:`drm_color_ctm_3x4` struct provided via the DATA property. The DATA blob is a float[12]: out matrix in | R | | 0 1 2 3 | | R | | G | = | 4 5 6 7 | x | G | | B | | 8 9 10 12 | | B | ``DRM_COLOROP_MULTIPLIER`` enum string "Multiplier" A simple multiplier, applied to all color values. The multiplier is specified as a S31.32 via the MULTIPLIER property. ``DRM_COLOROP_3D_LUT`` enum string "3D LUT" A 3D LUT of :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property, i.e., a 3D LUT with 17x17x17 entries will have SIZE set to 17. The DATA blob is a 3D array of struct drm_color_lut32 with dimension length of "size". The LUT elements are traversed like so: for B in range 0..n for G in range 0..n for R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h](h)}(h **Constants**h]j )}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMrhjubj/ )}(hhh](j4 )}(h``DRM_COLOROP_1D_CURVE`` enum string "1D Curve" A 1D curve that is being applied to all color channels. The curve is specified via the CURVE_1D_TYPE colorop property. h](j: )}(h``DRM_COLOROP_1D_CURVE``h]j)}(hjɮh]hDRM_COLOROP_1D_CURVE}(hjˮhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǮubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMxhjîubjT )}(hhh](h)}(henum string "1D Curve"h]henum string “1D Curve”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMuhj߮ubh)}(hvA 1D curve that is being applied to all color channels. The curve is specified via the CURVE_1D_TYPE colorop property.h]hvA 1D curve that is being applied to all color channels. The curve is specified via the CURVE_1D_TYPE colorop property.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMwhj߮ubeh}(h]h ]h"]h$]h&]uh1jS hjîubeh}(h]h ]h"]h$]h&]uh1j3 hjޮhMxhjubj4 )}(hX,``DRM_COLOROP_1D_LUT`` enum string "1D LUT" A simple 1D LUT of uniformly spaced :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property. The DATA blob is an array of struct drm_color_lut32 with size of "size". h](j: )}(h``DRM_COLOROP_1D_LUT``h]j)}(hjh]hDRM_COLOROP_1D_LUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj ubjT )}(hhh](h)}(henum string "1D LUT"h]henum string “1D LUT”}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM{hj(ubh)}(hA simple 1D LUT of uniformly spaced :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property.h](h$A simple 1D LUT of uniformly spaced }(hj:hhhNhNubh)}(h:c:type:`drm_color_lut32`h]j)}(hjDh]hdrm_color_lut32}(hjFhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_color_lut32uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM}hj:ubhy entries, packed into a blob via the DATA property. The driver’s expected LUT size is advertised via the SIZE property.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjahM}hj(ubh)}(hHThe DATA blob is an array of struct drm_color_lut32 with size of "size".h]hLThe DATA blob is an array of struct drm_color_lut32 with size of “size”.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj(ubeh}(h]h ]h"]h$]h&]uh1jS hj ubeh}(h]h ]h"]h$]h&]uh1j3 hj'hMhjubj4 )}(hX<``DRM_COLOROP_CTM_3X4`` enum string "3x4 Matrix" A 3x4 matrix. Its values are specified via the :c:type:`drm_color_ctm_3x4` struct provided via the DATA property. The DATA blob is a float[12]: out matrix in | R | | 0 1 2 3 | | R | | G | = | 4 5 6 7 | x | G | | B | | 8 9 10 12 | | B | h](j: )}(h``DRM_COLOROP_CTM_3X4``h]j)}(hjh]hDRM_COLOROP_CTM_3X4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh](h)}(henum string "3x4 Matrix"h]henum string “3x4 Matrix”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hqA 3x4 matrix. Its values are specified via the :c:type:`drm_color_ctm_3x4` struct provided via the DATA property.h](h/A 3x4 matrix. Its values are specified via the }(hjhhhNhNubh)}(h:c:type:`drm_color_ctm_3x4`h]j)}(hjh]hdrm_color_ctm_3x4}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_color_ctm_3x4uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh' struct provided via the DATA property.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjܯhMhjubh)}(hThe DATA blob is a float[12]: out matrix in | R | | 0 1 2 3 | | R | | G | = | 4 5 6 7 | x | G | | B | | 8 9 10 12 | | B |h]hThe DATA blob is a float[12]: out matrix in | R | | 0 1 2 3 | | R | | G | = | 4 5 6 7 | x | G | | B | | 8 9 10 12 | | B |}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h``DRM_COLOROP_MULTIPLIER`` enum string "Multiplier" A simple multiplier, applied to all color values. The multiplier is specified as a S31.32 via the MULTIPLIER property. h](j: )}(h``DRM_COLOROP_MULTIPLIER``h]j)}(hjh]hDRM_COLOROP_MULTIPLIER}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh](h)}(henum string "Multiplier"h]henum string “Multiplier”}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hvA simple multiplier, applied to all color values. The multiplier is specified as a S31.32 via the MULTIPLIER property.h]hvA simple multiplier, applied to all color values. The multiplier is specified as a S31.32 via the MULTIPLIER property.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(hX``DRM_COLOROP_3D_LUT`` enum string "3D LUT" A 3D LUT of :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property, i.e., a 3D LUT with 17x17x17 entries will have SIZE set to 17. The DATA blob is a 3D array of struct drm_color_lut32 with dimension length of "size". The LUT elements are traversed like so: for B in range 0..n for G in range 0..n for R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h](j: )}(h``DRM_COLOROP_3D_LUT``h]j)}(hjQh]hDRM_COLOROP_3D_LUT}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjKubjT )}(hhh](h)}(henum string "3D LUT"h]henum string “3D LUT”}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjgubh)}(hA 3D LUT of :c:type:`drm_color_lut32` entries, packed into a blob via the DATA property. The driver's expected LUT size is advertised via the SIZE property, i.e., a 3D LUT with 17x17x17 entries will have SIZE set to 17.h](h A 3D LUT of }(hjyhhhNhNubh)}(h:c:type:`drm_color_lut32`h]j)}(hjh]hdrm_color_lut32}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_color_lut32uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjyubh entries, packed into a blob via the DATA property. The driver’s expected LUT size is advertised via the SIZE property, i.e., a 3D LUT with 17x17x17 entries will have SIZE set to 17.}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjgubh)}(h~The DATA blob is a 3D array of struct drm_color_lut32 with dimension length of "size". The LUT elements are traversed like so:h]hThe DATA blob is a 3D array of struct drm_color_lut32 with dimension length of “size”. The LUT elements are traversed like so:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjgubj))}(h}for B in range 0..n for G in range 0..n for R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h]j/ )}(hhh]j4 )}(hufor B in range 0..n for G in range 0..n for R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h](j: )}(hfor B in range 0..nh]hfor B in range 0..n}(hjŰhhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hjfhMhjubjT )}(hhh]j/ )}(hhh]j4 )}(h[for G in range 0..n for R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h](j: )}(hfor G in range 0..nh]hfor G in range 0..n}(hjݰhhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hjfhMhjٰubjT )}(hhh]j/ )}(hhh]j4 )}(hEfor R in range 0..n index = R + n * (G + n * B) color = lut3d[index]h](j: )}(hfor R in range 0..nh]hfor R in range 0..n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hjfhMhjubjT )}(hhh]j/ )}(hhh]j4 )}(h0index = R + n * (G + n * B) color = lut3d[index]h](j: )}(hindex = R + n * (G + n * B)h]hindex = R + n * (G + n * B)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9 hjfhMhj ubjT )}(hhh]h)}(hcolor = lut3d[index]h]hcolor = lut3d[index]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hj ubeh}(h]h ]h"]h$]h&]uh1j3 hjfhMhjubah}(h]h ]h"]h$]h&]uh1j. hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjfhMhjubah}(h]h ]h"]h$]h&]uh1j. hjubah}(h]h ]h"]h$]h&]uh1jS hjٰubeh}(h]h ]h"]h$]h&]uh1j3 hjfhMhjְubah}(h]h ]h"]h$]h&]uh1j. hjӰubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjfhMhjubah}(h]h ]h"]h$]h&]uh1j. hjubah}(h]h ]h"]h$]h&]uh1j(hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjgubeh}(h]h ]h"]h$]h&]uh1jS hjKubeh}(h]h ]h"]h$]h&]uh1j3 hjfhMhjubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hdrm_colorops can be of many different types. Each type behaves differently and defines a different set of properties. This enum defines all types and gives a high-level description.h]hdrm_colorops can be of many different types. Each type behaves differently and defines a different set of properties. This enum defines all types and gives a high-level description.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMohjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j -drm_colorop_lut3d_interpolation_type (C enum)&c.drm_colorop_lut3d_interpolation_typehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(h$drm_colorop_lut3d_interpolation_typeh]j )}(h)enum drm_colorop_lut3d_interpolation_typeh](j> )}(hj,h]henum}(hjձhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjѱhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMvubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjѱhhhjhMvubj )}(h$drm_colorop_lut3d_interpolation_typeh]j )}(hjϱh]h$drm_colorop_lut3d_interpolation_type}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjѱhhhjhMvubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjͱhhhjhMvubah}(h]jȱah ](j j eh"]h$]h&]j j )j huh1j hjhMvhjʱhhubj )}(hhh]h)}(htype of 3DLUT interpolationh]htype of 3DLUT interpolation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjʱhhhjhMvubeh}(h]h ](jenumeh"]h$]h&]j jj j/j j/j j j uh1j hhhjXfhNhNubj )}(h`**Constants** ``DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL`` Tetrahedral 3DLUT interpolationh](h)}(h **Constants**h]j )}(hj9h]h Constants}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj7ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj3ubj/ )}(hhh]j4 )}(hO``DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL`` Tetrahedral 3DLUT interpolationh](j: )}(h/``DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL``h]j)}(hjXh]h+DRM_COLOROP_LUT3D_INTERPOLATION_TETRAHEDRAL}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjRubjT )}(hhh]h)}(hTetrahedral 3DLUT interpolationh]hTetrahedral 3DLUT interpolation}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjnubah}(h]h ]h"]h$]h&]uh1jS hjRubeh}(h]h ]h"]h$]h&]uh1j3 hjmhMhjOubah}(h]h ]h"]h$]h&]uh1j. hj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j -drm_colorop_lut1d_interpolation_type (C enum)&c.drm_colorop_lut1d_interpolation_typehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(h$drm_colorop_lut1d_interpolation_typeh]j )}(h)enum drm_colorop_lut1d_interpolation_typeh](j> )}(hj,h]henum}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMubj )}(h$drm_colorop_lut1d_interpolation_typeh]j )}(hjh]h$drm_colorop_lut1d_interpolation_type}(hjҲhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjβubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h)}(h!type of interpolation for 1D LUTsh]h!type of interpolation for 1D LUTs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jenumeh"]h$]h&]j jj j j j j j j uh1j hhhjXfhNhNubj )}(h**Constants** ``DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR`` Linear interpolation. Values between points of the LUT will be linearly interpolated.h](h)}(h **Constants**h]j )}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh]j4 )}(h``DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR`` Linear interpolation. Values between points of the LUT will be linearly interpolated.h](j: )}(h*``DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR``h]j)}(hj5h]h&DRM_COLOROP_LUT1D_INTERPOLATION_LINEAR}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj/ubjT )}(hhh]h)}(hULinear interpolation. Values between points of the LUT will be linearly interpolated.h]hULinear interpolation. Values between points of the LUT will be linearly interpolated.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjKubah}(h]h ]h"]h$]h&]uh1jS hj/ubeh}(h]h ]h"]h$]h&]uh1j3 hjJhMhj,ubah}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_plane_size_hint (C struct)c.drm_plane_size_hinthNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_plane_size_hinth]j )}(hstruct drm_plane_size_hinth](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMubj )}(hdrm_plane_size_hinth]j )}(hjh]hdrm_plane_size_hint}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h)}(hPlane size hintsh]hPlane size hints}(hjгhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjͳhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(h**Definition**:: struct drm_plane_size_hint { __u16 width; __u16 height; }; **Members** ``width`` The width of the plane in pixel ``height`` The height of the plane in pixelh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(hBstruct drm_plane_size_hint { __u16 width; __u16 height; };h]hBstruct drm_plane_size_hint { __u16 width; __u16 height; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjh]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh](j4 )}(h*``width`` The width of the plane in pixel h](j: )}(h ``width``h]j)}(hj=h]hwidth}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj7ubjT )}(hhh]h)}(hThe width of the plane in pixelh]hThe width of the plane in pixel}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1jS hj7ubeh}(h]h ]h"]h$]h&]uh1j3 hjRhMhj4ubj4 )}(h+``height`` The height of the plane in pixelh](j: )}(h ``height``h]j)}(hjvh]hheight}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjpubjT )}(hhh]h)}(h The height of the plane in pixelh]h The height of the plane in pixel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjpubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhj4ubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hSThe plane SIZE_HINTS property blob contains an array of struct drm_plane_size_hint.h]hSThe plane SIZE_HINTS property blob contains an array of struct drm_plane_size_hint.}(hjϴhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !hdr_metadata_infoframe (C struct)c.hdr_metadata_infoframehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hhdr_metadata_infoframeh]j )}(hstruct hdr_metadata_infoframeh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMubj )}(hhdr_metadata_infoframeh]j )}(hjh]hhdr_metadata_infoframe}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h)}(hHDR Metadata Infoframe Data.h]hHDR Metadata Infoframe Data.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj6hhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]j jj jQj jQj j j uh1j hhhjXfhNhNubj )}(hXv**Definition**:: struct hdr_metadata_infoframe { __u8 eotf; __u8 metadata_type; struct { __u16 x, y; } display_primaries[3]; struct { __u16 x, y; } white_point; __u16 max_display_mastering_luminance; __u16 min_display_mastering_luminance; __u16 max_cll; __u16 max_fall; }; **Members** ``eotf`` Electro-Optical Transfer Function (EOTF) used in the stream. ``metadata_type`` Static_Metadata_Descriptor_ID. ``display_primaries`` Color Primaries of the Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. **display_primaries.x**: X coordinate of color primary. **display_primaries.y**: Y coordinate of color primary. ``white_point`` White Point of Colorspace Data. These are coded as unsigned 16-bit values in units of 0.00002, where 0x0000 represents zero and 0xC350 represents 1.0000. **white_point.x**: X coordinate of whitepoint of color primary. **white_point.y**: Y coordinate of whitepoint of color primary. ``max_display_mastering_luminance`` Max Mastering Display Luminance. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. ``min_display_mastering_luminance`` Min Mastering Display Luminance. This value is coded as an unsigned 16-bit value in units of 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF represents 6.5535 cd/m2. ``max_cll`` Max Content Light Level. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2. ``max_fall`` Max Frame Average Light Level. This value is coded as an unsigned 16-bit value in units of 1 cd/m2, where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjYubh:}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjUubj)}(hX7struct hdr_metadata_infoframe { __u8 eotf; __u8 metadata_type; struct { __u16 x, y; } display_primaries[3]; struct { __u16 x, y; } white_point; __u16 max_display_mastering_luminance; __u16 min_display_mastering_luminance; __u16 max_cll; __u16 max_fall; };h]hX7struct hdr_metadata_infoframe { __u8 eotf; __u8 metadata_type; struct { __u16 x, y; } display_primaries[3]; struct { __u16 x, y; } white_point; __u16 max_display_mastering_luminance; __u16 min_display_mastering_luminance; __u16 max_cll; __u16 max_fall; };}hjvsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjUubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjUubj/ )}(hhh](j4 )}(hF``eotf`` Electro-Optical Transfer Function (EOTF) used in the stream. h](j: )}(h``eotf``h]j)}(hjh]heotf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hj!hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhj hMubj )}(hhdr_output_metadatah]j )}(hj h]hhdr_output_metadata}(hj3hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj/ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj hhhj hMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj hMhjhhubj )}(hhh]h)}(hHDR output metadatah]hHDR output metadata}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM*hjRhhubah}(h]h ]h"]h$]h&]uh1j hjhhhj hMubeh}(h]h ](jstructeh"]h$]h&]j jj jmj jmj j j uh1j hhhjXfhNhNubj )}(hX9**Definition**:: struct hdr_output_metadata { __u32 metadata_type; union { struct hdr_metadata_infoframe hdmi_metadata_type1; }; }; **Members** ``metadata_type`` Static_Metadata_Descriptor_ID. ``{unnamed_union}`` anonymous ``hdmi_metadata_type1`` HDR Metadata Infoframe.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh:}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM.hjqubj)}(hstruct hdr_output_metadata { __u32 metadata_type; union { struct hdr_metadata_infoframe hdmi_metadata_type1; }; };h]hstruct hdr_output_metadata { __u32 metadata_type; union { struct hdr_metadata_infoframe hdmi_metadata_type1; }; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM0hjqubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM7hjqubj/ )}(hhh](j4 )}(h1``metadata_type`` Static_Metadata_Descriptor_ID. h](j: )}(h``metadata_type``h]j)}(hj¸h]h metadata_type}(hjĸhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM1hjubjT )}(hhh]h)}(hStatic_Metadata_Descriptor_ID.h]hStatic_Metadata_Descriptor_ID.}(hj۸hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj׸hM1hjظubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj׸hM1hjubj4 )}(h``{unnamed_union}`` anonymous h](j: )}(h``{unnamed_union}``h]j)}(hjh]h{unnamed_union}}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhKhjubjT )}(hhh]h)}(h anonymoush]h anonymous}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhKhjubj4 )}(h/``hdmi_metadata_type1`` HDR Metadata Infoframe.h](j: )}(h``hdmi_metadata_type1``h]j)}(hj4h]hhdmi_metadata_type1}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM4hj.ubjT )}(hhh]h)}(hHDR Metadata Infoframe.h]hHDR Metadata Infoframe.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM5hjJubah}(h]h ]h"]h$]h&]uh1jS hj.ubeh}(h]h ]h"]h$]h&]uh1j3 hjIhM4hjubeh}(h]h ]h"]h$]h&]uh1j. hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjwh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM8hjXfhhubh)}(h0Metadata Information to be passed from userspaceh]h0Metadata Information to be passed from userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM+hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_MODE_PAGE_FLIP_EVENT (C macro)c.DRM_MODE_PAGE_FLIP_EVENThNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_PAGE_FLIP_EVENTh]j )}(hDRM_MODE_PAGE_FLIP_EVENTh]j )}(hDRM_MODE_PAGE_FLIP_EVENTh]j )}(hjh]hDRM_MODE_PAGE_FLIP_EVENT}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM<ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj̹hM<ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj̹hM<hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj̹hM<ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_PAGE_FLIP_EVENT``h]j)}(hjh]hDRM_MODE_PAGE_FLIP_EVENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM>hjXfhhubj))}(hX|**Description** Request that the kernel sends back a vblank event (see struct drm_event_vblank) with the :c:type:`DRM_EVENT_FLIP_COMPLETE` type when the page-flip is done. When used with atomic uAPI, one event will be delivered per CRTC included in the atomic commit. A CRTC is included in an atomic commit if one of its properties is set, or if a property is set on a connector or plane linked via the CRTC_ID property to the CRTC. At least one CRTC must be included, and all pulled in CRTCs must be either previously or newly powered on (in other words, a powered off CRTC which stays off cannot be included in the atomic commit). h](h)}(h**Description**h]j )}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM>hjubh)}(hRequest that the kernel sends back a vblank event (see struct drm_event_vblank) with the :c:type:`DRM_EVENT_FLIP_COMPLETE` type when the page-flip is done.h](hYRequest that the kernel sends back a vblank event (see struct drm_event_vblank) with the }(hjhhhNhNubh)}(h!:c:type:`DRM_EVENT_FLIP_COMPLETE`h]j)}(hj'h]hDRM_EVENT_FLIP_COMPLETE}(hj)hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_EVENT_FLIP_COMPLETEuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM=hjubh! type when the page-flip is done.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjDhM=hjubh)}(hXWhen used with atomic uAPI, one event will be delivered per CRTC included in the atomic commit. A CRTC is included in an atomic commit if one of its properties is set, or if a property is set on a connector or plane linked via the CRTC_ID property to the CRTC. At least one CRTC must be included, and all pulled in CRTCs must be either previously or newly powered on (in other words, a powered off CRTC which stays off cannot be included in the atomic commit).h]hXWhen used with atomic uAPI, one event will be delivered per CRTC included in the atomic commit. A CRTC is included in an atomic commit if one of its properties is set, or if a property is set on a connector or plane linked via the CRTC_ID property to the CRTC. At least one CRTC must be included, and all pulled in CRTCs must be either previously or newly powered on (in other words, a powered off CRTC which stays off cannot be included in the atomic commit).}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMAhjubeh}(h]h ]h"]h$]h&]uh1j(hjhM>hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_MODE_PAGE_FLIP_ASYNC (C macro)c.DRM_MODE_PAGE_FLIP_ASYNChNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_PAGE_FLIP_ASYNCh]j )}(hDRM_MODE_PAGE_FLIP_ASYNCh]j )}(hDRM_MODE_PAGE_FLIP_ASYNCh]j )}(hjwh]hDRM_MODE_PAGE_FLIP_ASYNC}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj}ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjyhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMLubah}(h]h ]h"]h$]h&]hhj uh1j j j hjuhhhjhMLubah}(h]jpah ](j j eh"]h$]h&]j j )j huh1j hjhMLhjrhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjrhhhjhMLubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_PAGE_FLIP_ASYNC``h]j)}(hjh]hDRM_MODE_PAGE_FLIP_ASYNC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMNhjXfhhubj))}(hXw**Description** Request that the page-flip is performed as soon as possible, ie. with no delay due to waiting for vblank. This may cause tearing to be visible on the screen. When used with atomic uAPI, the driver will return an error if the hardware doesn't support performing an asynchronous page-flip for this update. User-space should handle this, e.g. by falling back to a regular page-flip. Note, some hardware might need to perform one last synchronous page-flip before being able to switch to asynchronous page-flips. As an exception, the driver will return success even though that first page-flip is not asynchronous. h](h)}(h**Description**h]j )}(hjϺh]h Description}(hjѺhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjͺubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMNhjɺubh)}(hRequest that the page-flip is performed as soon as possible, ie. with no delay due to waiting for vblank. This may cause tearing to be visible on the screen.h]hRequest that the page-flip is performed as soon as possible, ie. with no delay due to waiting for vblank. This may cause tearing to be visible on the screen.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMMhjɺubh)}(hWhen used with atomic uAPI, the driver will return an error if the hardware doesn't support performing an asynchronous page-flip for this update. User-space should handle this, e.g. by falling back to a regular page-flip.h]hWhen used with atomic uAPI, the driver will return an error if the hardware doesn’t support performing an asynchronous page-flip for this update. User-space should handle this, e.g. by falling back to a regular page-flip.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMQhjɺubh)}(hNote, some hardware might need to perform one last synchronous page-flip before being able to switch to asynchronous page-flips. As an exception, the driver will return success even though that first page-flip is not asynchronous.h]hNote, some hardware might need to perform one last synchronous page-flip before being able to switch to asynchronous page-flips. As an exception, the driver will return success even though that first page-flip is not asynchronous.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMUhjɺubeh}(h]h ]h"]h$]h&]uh1j(hjhMNhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_MODE_PAGE_FLIP_FLAGS (C macro)c.DRM_MODE_PAGE_FLIP_FLAGShNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_PAGE_FLIP_FLAGSh]j )}(hDRM_MODE_PAGE_FLIP_FLAGSh]j )}(hDRM_MODE_PAGE_FLIP_FLAGSh]j )}(hj+h]hDRM_MODE_PAGE_FLIP_FLAGS}(hj5hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj1ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj-hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMaubah}(h]h ]h"]h$]h&]hhj uh1j j j hj)hhhjHhMaubah}(h]j$ah ](j j eh"]h$]h&]j j )j huh1j hjHhMahj&hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj&hhhjHhMaubeh}(h]h ](jmacroeh"]h$]h&]j jj jaj jaj j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_PAGE_FLIP_FLAGS``h]j)}(hjgh]hDRM_MODE_PAGE_FLIP_FLAGS}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMchjXfhhubj))}(h**Description** Bitmask of flags suitable for :c:type:`drm_mode_crtc_page_flip_target.flags `. h](h)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.h-hMchj}ubh)}(hnBitmask of flags suitable for :c:type:`drm_mode_crtc_page_flip_target.flags `.h](hBitmask of flags suitable for }(hjhhhNhNubh)}(hO:c:type:`drm_mode_crtc_page_flip_target.flags `h]j)}(hjh]h$drm_mode_crtc_page_flip_target.flags}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_crtc_page_flip_targetuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMbhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMbhj}ubeh}(h]h ]h"]h$]h&]uh1j(hjhMchjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_create_dumb (C struct)c.drm_mode_create_dumbhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_create_dumbh]j )}(hstruct drm_mode_create_dumbh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMgubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMgubj )}(hdrm_mode_create_dumbh]j )}(hjh]hdrm_mode_create_dumb}(hj hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMgubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMgubah}(h]jݻah ](j j eh"]h$]h&]j j )j huh1j hjhMghj߻hhubj )}(hhh]h)}(h%Create a KMS dumb buffer for scanout.h]h%Create a KMS dumb buffer for scanout.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj)hhubah}(h]h ]h"]h$]h&]uh1j hj߻hhhjhMgubeh}(h]h ](jstructeh"]h$]h&]j jj jDj jDj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_create_dumb { __u32 height; __u32 width; __u32 bpp; __u32 flags; __u32 handle; __u32 pitch; __u64 size; }; **Members** ``height`` buffer height in pixels ``width`` buffer width in pixels ``bpp`` color mode ``flags`` must be zero ``handle`` buffer object handle ``pitch`` number of bytes between two consecutive lines ``size`` size of the whole buffer in bytesh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjLubh:}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjHubj)}(hstruct drm_mode_create_dumb { __u32 height; __u32 width; __u32 bpp; __u32 flags; __u32 handle; __u32 pitch; __u64 size; };h]hstruct drm_mode_create_dumb { __u32 height; __u32 width; __u32 bpp; __u32 flags; __u32 handle; __u32 pitch; __u64 size; };}hjisbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjHubh)}(h **Members**h]j )}(hjzh]hMembers}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjxubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjHubj/ )}(hhh](j4 )}(h#``height`` buffer height in pixels h](j: )}(h ``height``h]j)}(hjh]hheight}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hbuffer height in pixelsh]hbuffer height in pixels}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h!``width`` buffer width in pixels h](j: )}(h ``width``h]j)}(hjҼh]hwidth}(hjԼhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjмubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj̼ubjT )}(hhh]h)}(hbuffer width in pixelsh]hbuffer width in pixels}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hj̼ubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h``bpp`` color mode h](j: )}(h``bpp``h]j)}(hj h]hbpp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h color modeh]h color mode}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj hMhjubj4 )}(h``flags`` must be zero h](j: )}(h ``flags``h]j)}(hjDh]hflags}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj>ubjT )}(hhh]h)}(h must be zeroh]h must be zero}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjZubah}(h]h ]h"]h$]h&]uh1jS hj>ubeh}(h]h ]h"]h$]h&]uh1j3 hjYhMhjubj4 )}(h ``handle`` buffer object handle h](j: )}(h ``handle``h]j)}(hj}h]hhandle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjwubjT )}(hhh]h)}(hbuffer object handleh]hbuffer object handle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjwubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubj4 )}(h8``pitch`` number of bytes between two consecutive lines h](j: )}(h ``pitch``h]j)}(hjh]hpitch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h-number of bytes between two consecutive linesh]h-number of bytes between two consecutive lines}(hjϽhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj˽hMhj̽ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj˽hMhjubj4 )}(h*``size`` size of the whole buffer in bytesh](j: )}(h``size``h]j)}(hjh]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h!size of the whole buffer in bytesh]h!size of the whole buffer in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j. hjHubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hUser-space fills **height**, **width**, **bpp** and **flags**. If the IOCTL succeeds, the kernel fills **handle**, **pitch** and **size**.h](hUser-space fills }(hjHhhhNhNubj )}(h **height**h]hheight}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh, }(hjHhhhNhNubj )}(h **width**h]hwidth}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh, }hjHsbj )}(h**bpp**h]hbpp}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh and }(hjHhhhNhNubj )}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh*. If the IOCTL succeeds, the kernel fills }(hjHhhhNhNubj )}(h **handle**h]hhandle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh, }hjHsbj )}(h **pitch**h]hpitch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh and }hjHsbj )}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hXEThe value of **bpp** is a color-mode number describing a specific format or a variant thereof. The value often corresponds to the number of bits per pixel for most modes, although there are exceptions. Each color mode maps to a DRM format plus a number of modes with similar pixel layout. Framebuffer layout is always linear.h](h The value of }(hjվhhhNhNubj )}(h**bpp**h]hbpp}(hjݾhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjվubhX1 is a color-mode number describing a specific format or a variant thereof. The value often corresponds to the number of bits per pixel for most modes, although there are exceptions. Each color mode maps to a DRM format plus a number of modes with similar pixel layout. Framebuffer layout is always linear.}(hjվhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hX"Support for all modes and formats is optional. Even if dumb-buffer creation with a certain color mode succeeds, it is not guaranteed that the DRM driver supports any of the related formats. Most drivers support a color mode of 32 with a format of DRM_FORMAT_XRGB8888 on their primary plane.h]hX"Support for all modes and formats is optional. Even if dumb-buffer creation with a certain color mode succeeds, it is not guaranteed that the DRM driver supports any of the related formats. Most drivers support a color mode of 32 with a format of DRM_FORMAT_XRGB8888 on their primary plane.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj")}(hhh]j")}(hhh](j ")}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1j"hjubj ")}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j"hjubj ")}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j"hjubj6")}(hhh]j;")}(hhh](j@")}(hhh]h)}(h Color modeh]h Color mode}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj/ubah}(h]h ]h"]h$]h&]uh1j?"hj,ubj@")}(hhh]h)}(hFramebuffer formath]hFramebuffer format}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhjGubah}(h]h ]h"]h$]h&]uh1j?"hj,ubj@")}(hhh]h)}(hCompatible formatsh]hCompatible formats}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hMhj^ubah}(h]h ]h"]h$]h&]uh1j?"hj,ubeh}(h]h ]h"]h$]h&]uh1j:"hj)ubah}(h]h ]h"]h$]h&]uh1j5"hjubj|")}(hhh](j;")}(hhh](j@")}(hhh]h)}(h32h]h32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_XRGB8888 h]h)}(hDRM_FORMAT_XRGB8888h]hDRM_FORMAT_XRGB8888}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh](j%)}(hDRM_FORMAT_BGRX8888h]h)}(hjѿh]hDRM_FORMAT_BGRX8888}(hjӿhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjϿubah}(h]h ]h"]h$]h&]uh1j$hj̿ubj%)}(hDRM_FORMAT_RGBX8888h]h)}(hjh]hDRM_FORMAT_RGBX8888}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hj̿ubj%)}(hDRM_FORMAT_XBGR8888h]h)}(hjh]hDRM_FORMAT_XBGR8888}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hj̿ubeh}(h]h ]h"]h$]h&]jj uh1jhjhMhjɿubah}(h]h ]h"]h$]h&]uh1j?"hjubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h24h]h24}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj+ubah}(h]h ]h"]h$]h&]uh1j?"hj(ubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_RGB888h]h)}(hjKh]hDRM_FORMAT_RGB888}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhjIubah}(h]h ]h"]h$]h&]uh1j$hjFubah}(h]h ]h"]h$]h&]jj uh1jhj<hMhjCubah}(h]h ]h"]h$]h&]uh1j?"hj(ubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_BGR888h]h)}(hjth]hDRM_FORMAT_BGR888}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhjrubah}(h]h ]h"]h$]h&]uh1j$hjoubah}(h]h ]h"]h$]h&]jj uh1jhj<hMhjlubah}(h]h ]h"]h$]h&]uh1j?"hj(ubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h16h]h16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_RGB565h]h)}(hjh]hDRM_FORMAT_RGB565}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_BGR565h]h)}(hjh]hDRM_FORMAT_BGR565}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h15h]h15}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_XRGB1555 h]h)}(hDRM_FORMAT_XRGB1555h]hDRM_FORMAT_XRGB1555}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj/ubah}(h]h ]h"]h$]h&]uh1j$hj,ubah}(h]h ]h"]h$]h&]jj uh1jhj"hMhj)ubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh](j%)}(hDRM_FORMAT_BGRX1555h]h)}(hj[h]hDRM_FORMAT_BGRX1555}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhjYubah}(h]h ]h"]h$]h&]uh1j$hjVubj%)}(hDRM_FORMAT_RGBX1555h]h)}(hjrh]hDRM_FORMAT_RGBX1555}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjpubah}(h]h ]h"]h$]h&]uh1j$hjVubj%)}(hDRM_FORMAT_XBGR1555h]h)}(hjh]hDRM_FORMAT_XBGR1555}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hjVubeh}(h]h ]h"]h$]h&]jj uh1jhj"hMhjSubah}(h]h ]h"]h$]h&]uh1j?"hjubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h8h]h8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_C8 h]h)}(h DRM_FORMAT_C8h]h DRM_FORMAT_C8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh](j%)}(h DRM_FORMAT_D8h]h)}(hjh]h DRM_FORMAT_D8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(h DRM_FORMAT_R8h]h)}(hjh]h DRM_FORMAT_R8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h4h]h4}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjAubah}(h]h ]h"]h$]h&]uh1j?"hj>ubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_C4 h]h)}(h DRM_FORMAT_C4h]h DRM_FORMAT_C4}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhj_ubah}(h]h ]h"]h$]h&]uh1j$hj\ubah}(h]h ]h"]h$]h&]jj uh1jhjRhMhjYubah}(h]h ]h"]h$]h&]uh1j?"hj>ubj@")}(hhh]j )}(hhh](j%)}(h DRM_FORMAT_D4h]h)}(hjh]h DRM_FORMAT_D4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(h DRM_FORMAT_R4h]h)}(hjh]h DRM_FORMAT_R4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]jj uh1jhjRhMhjubah}(h]h ]h"]h$]h&]uh1j?"hj>ubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h2h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_C2 h]h)}(h DRM_FORMAT_C2h]h DRM_FORMAT_C2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubah}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubj@")}(hhh]j )}(hhh](j%)}(h DRM_FORMAT_D2h]h)}(hjh]h DRM_FORMAT_D2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(h DRM_FORMAT_R2h]h)}(hj.h]h DRM_FORMAT_R2}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj,ubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]jj uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjubeh}(h]h ]h"]h$]h&]uh1j:"hjubj;")}(hhh](j@")}(hhh]h)}(h1h]h1}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjYubah}(h]h ]h"]h$]h&]uh1j?"hjVubj@")}(hhh]j )}(hhh]j%)}(hDRM_FORMAT_C1 h]h)}(h DRM_FORMAT_C1h]h DRM_FORMAT_C1}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjwubah}(h]h ]h"]h$]h&]uh1j$hjtubah}(h]h ]h"]h$]h&]jj uh1jhjjhMhjqubah}(h]h ]h"]h$]h&]uh1j?"hjVubj@")}(hhh]j )}(hhh](j%)}(h DRM_FORMAT_D1h]h)}(hjh]h DRM_FORMAT_D1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubj%)}(h DRM_FORMAT_R1h]h)}(hjh]h DRM_FORMAT_R1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1j$hjubeh}(h]h ]h"]h$]h&]jj uh1jhjjhMhjubah}(h]h ]h"]h$]h&]uh1j?"hjVubeh}(h]h ]h"]h$]h&]uh1j:"hjubeh}(h]h ]h"]h$]h&]uh1j{"hjubeh}(h]h ]h"]h$]h&]colsKuh1j"hjubah}(h]h ]h"]h$]h&]uh1j"hjXfhhhNhNubh)}(hColor modes of 10, 12, 15, 30 and 64 are only supported for use by legacy user space. Please don't use them in new code. Other modes are not support.h]hColor modes of 10, 12, 15, 30 and 64 are only supported for use by legacy user space. Please don’t use them in new code. Other modes are not support.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hDo not attempt to allocate anything but linear framebuffer memory with single-plane RGB data. Allocation of other framebuffer layouts requires dedicated ioctls in the respective DRM driver.h]hDo not attempt to allocate anything but linear framebuffer memory with single-plane RGB data. Allocation of other framebuffer layouts requires dedicated ioctls in the respective DRM driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j #DRM_MODE_ATOMIC_TEST_ONLY (C macro)c.DRM_MODE_ATOMIC_TEST_ONLYhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_ATOMIC_TEST_ONLYh]j )}(hDRM_MODE_ATOMIC_TEST_ONLYh]j )}(hDRM_MODE_ATOMIC_TEST_ONLYh]j )}(hj&h]hDRM_MODE_ATOMIC_TEST_ONLY}(hj0hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hj,ubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj(hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hj$hhhjChMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjChMhj!hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj!hhhjChMubeh}(h]h ](jmacroeh"]h$]h&]j jj j\j j\j j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_ATOMIC_TEST_ONLY``h]j)}(hjbh]hDRM_MODE_ATOMIC_TEST_ONLY}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj))}(h**Description** Do not apply the atomic commit, instead check whether the hardware supports this configuration. See :c:type:`drm_mode_config_funcs.atomic_check ` for more details on test-only commits. h](h)}(h**Description**h]j )}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj|ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjxubh)}(h_Do not apply the atomic commit, instead check whether the hardware supports this configuration.h]h_Do not apply the atomic commit, instead check whether the hardware supports this configuration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjxubh)}(hoSee :c:type:`drm_mode_config_funcs.atomic_check ` for more details on test-only commits.h](hSee }(hjhhhNhNubh)}(hD:c:type:`drm_mode_config_funcs.atomic_check `h]j)}(hjh]h"drm_mode_config_funcs.atomic_check}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_config_funcsuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh' for more details on test-only commits.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjxubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "DRM_MODE_ATOMIC_NONBLOCK (C macro)c.DRM_MODE_ATOMIC_NONBLOCKhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_ATOMIC_NONBLOCKh]j )}(hDRM_MODE_ATOMIC_NONBLOCKh]j )}(hDRM_MODE_ATOMIC_NONBLOCKh]j )}(hjh]hDRM_MODE_ATOMIC_NONBLOCK}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj hM ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj hM hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj hM ubeh}(h]h ](jmacroeh"]h$]h&]j jj j$j j$j j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_ATOMIC_NONBLOCK``h]j)}(hj*h]hDRM_MODE_ATOMIC_NONBLOCK}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hjXfhhubj))}(hX**Description** Do not block while applying the atomic commit. The :c:type:`DRM_IOCTL_MODE_ATOMIC` IOCTL returns immediately instead of waiting for the changes to be applied in hardware. Note, the driver will still check that the update can be applied before retuning. h](h)}(h**Description**h]j )}(hjFh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjDubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hj@ubh)}(hDo not block while applying the atomic commit. The :c:type:`DRM_IOCTL_MODE_ATOMIC` IOCTL returns immediately instead of waiting for the changes to be applied in hardware. Note, the driver will still check that the update can be applied before retuning.h](h3Do not block while applying the atomic commit. The }(hj\hhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_ATOMIC`h]j)}(hjfh]hDRM_IOCTL_MODE_ATOMIC}(hjhhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_ATOMICuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hj\ubh IOCTL returns immediately instead of waiting for the changes to be applied in hardware. Note, the driver will still check that the update can be applied before retuning.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hj@ubeh}(h]h ]h"]h$]h&]uh1j(hj[hM hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j 'DRM_MODE_ATOMIC_ALLOW_MODESET (C macro)c.DRM_MODE_ATOMIC_ALLOW_MODESEThNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_ATOMIC_ALLOW_MODESETh]j )}(hDRM_MODE_ATOMIC_ALLOW_MODESETh]j )}(hDRM_MODE_ATOMIC_ALLOW_MODESETh]j )}(hjh]hDRM_MODE_ATOMIC_ALLOW_MODESET}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubh)}(h!``DRM_MODE_ATOMIC_ALLOW_MODESET``h]j)}(hjh]hDRM_MODE_ATOMIC_ALLOW_MODESET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj))}(hX**Description** Allow the update to result in temporary or transient visible artifacts while the update is being applied. Applying the update may also take significantly more time than a page flip. All visual artifacts will disappear by the time the update is completed, as signalled through the vblank event's timestamp (see struct drm_event_vblank). This flag must be set when the KMS update might cause visible artifacts. Without this flag such KMS update will return a EINVAL error. What kind of update may cause visible artifacts depends on the driver and the hardware. User-space that needs to know beforehand if an update might cause visible artifacts can use :c:type:`DRM_MODE_ATOMIC_TEST_ONLY` without :c:type:`DRM_MODE_ATOMIC_ALLOW_MODESET` to see if it fails. To the best of the driver's knowledge, visual artifacts are guaranteed to not appear when this flag is not set. Some sinks might display visual artifacts outside of the driver's control. h](h)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hXOAllow the update to result in temporary or transient visible artifacts while the update is being applied. Applying the update may also take significantly more time than a page flip. All visual artifacts will disappear by the time the update is completed, as signalled through the vblank event's timestamp (see struct drm_event_vblank).h]hXQAllow the update to result in temporary or transient visible artifacts while the update is being applied. Applying the update may also take significantly more time than a page flip. All visual artifacts will disappear by the time the update is completed, as signalled through the vblank event’s timestamp (see struct drm_event_vblank).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hXThis flag must be set when the KMS update might cause visible artifacts. Without this flag such KMS update will return a EINVAL error. What kind of update may cause visible artifacts depends on the driver and the hardware. User-space that needs to know beforehand if an update might cause visible artifacts can use :c:type:`DRM_MODE_ATOMIC_TEST_ONLY` without :c:type:`DRM_MODE_ATOMIC_ALLOW_MODESET` to see if it fails.h](hX;This flag must be set when the KMS update might cause visible artifacts. Without this flag such KMS update will return a EINVAL error. What kind of update may cause visible artifacts depends on the driver and the hardware. User-space that needs to know beforehand if an update might cause visible artifacts can use }(hj$hhhNhNubh)}(h#:c:type:`DRM_MODE_ATOMIC_TEST_ONLY`h]j)}(hj.h]hDRM_MODE_ATOMIC_TEST_ONLY}(hj0hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_ATOMIC_TEST_ONLYuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj$ubh without }(hj$hhhNhNubh)}(h':c:type:`DRM_MODE_ATOMIC_ALLOW_MODESET`h]j)}(hjRh]hDRM_MODE_ATOMIC_ALLOW_MODESET}(hjThhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_MODE_ATOMIC_ALLOW_MODESETuh1hhjKhMhj$ubh to see if it fails.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjKhMhjubh)}(hTo the best of the driver's knowledge, visual artifacts are guaranteed to not appear when this flag is not set. Some sinks might display visual artifacts outside of the driver's control.h]hTo the best of the driver’s knowledge, visual artifacts are guaranteed to not appear when this flag is not set. Some sinks might display visual artifacts outside of the driver’s control.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM hjubeh}(h]h ]h"]h$]h&]uh1j(hjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j DRM_MODE_ATOMIC_FLAGS (C macro)c.DRM_MODE_ATOMIC_FLAGShNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hDRM_MODE_ATOMIC_FLAGSh]j )}(hDRM_MODE_ATOMIC_FLAGSh]j )}(hDRM_MODE_ATOMIC_FLAGSh]j )}(hjh]hDRM_MODE_ATOMIC_FLAGS}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM(ubah}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhM(ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhM(hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhM(ubeh}(h]h ](jmacroeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubh)}(h``DRM_MODE_ATOMIC_FLAGS``h]j)}(hjh]hDRM_MODE_ATOMIC_FLAGS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM*hjXfhhubj))}(h**Description** Bitfield of flags accepted by the :c:type:`DRM_IOCTL_MODE_ATOMIC` IOCTL in :c:type:`drm_mode_atomic.flags `. h](h)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM*hjubh)}(h}Bitfield of flags accepted by the :c:type:`DRM_IOCTL_MODE_ATOMIC` IOCTL in :c:type:`drm_mode_atomic.flags `.h](h"Bitfield of flags accepted by the }(hjhhhNhNubh)}(h:c:type:`DRM_IOCTL_MODE_ATOMIC`h]j)}(hjh]hDRM_IOCTL_MODE_ATOMIC}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_IOCTL_MODE_ATOMICuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM)hjubh IOCTL in }(hjhhhNhNubh)}(h1:c:type:`drm_mode_atomic.flags `h]j)}(hj=h]hdrm_mode_atomic.flags}(hj?hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_mode_atomicuh1hhj6hM)hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj6hM)hjubeh}(h]h ]h"]h$]h&]uh1j(hjhM*hjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_create_blob (C struct)c.drm_mode_create_blobhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_create_blobh]j )}(hstruct drm_mode_create_blobh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM/ubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhM/ubj )}(hdrm_mode_create_blobh]j )}(hj}h]hdrm_mode_create_blob}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhM/ubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj{hhhjhM/ubah}(h]jvah ](j j eh"]h$]h&]j j )j huh1j hjhM/hjxhhubj )}(hhh]h)}(hCreate New blob propertyh]hCreate New blob property}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMrhjhhubah}(h]h ]h"]h$]h&]uh1j hjxhhhjhM/ubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(h**Definition**:: struct drm_mode_create_blob { __u64 data; __u32 length; __u32 blob_id; }; **Members** ``data`` Pointer to data to copy. ``length`` Length of data to copy. ``blob_id`` Return: new property ID.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMvhjubj)}(hUstruct drm_mode_create_blob { __u64 data; __u32 length; __u32 blob_id; };h]hUstruct drm_mode_create_blob { __u64 data; __u32 length; __u32 blob_id; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMxhjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM~hjubj/ )}(hhh](j4 )}(h"``data`` Pointer to data to copy. h](j: )}(h``data``h]j)}(hj2h]hdata}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMyhj,ubjT )}(hhh]h)}(hPointer to data to copy.h]hPointer to data to copy.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMyhjHubah}(h]h ]h"]h$]h&]uh1jS hj,ubeh}(h]h ]h"]h$]h&]uh1j3 hjGhMyhj)ubj4 )}(h#``length`` Length of data to copy. h](j: )}(h ``length``h]j)}(hjkh]hlength}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM{hjeubjT )}(hhh]h)}(hLength of data to copy.h]hLength of data to copy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1jS hjeubeh}(h]h ]h"]h$]h&]uh1j3 hjhM{hj)ubj4 )}(h$``blob_id`` Return: new property ID.h](j: )}(h ``blob_id``h]j)}(hjh]hblob_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM|hjubjT )}(hhh]h)}(hReturn: new property ID.h]hReturn: new property ID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhM}hjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhM|hj)ubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(heCreate a new 'blob' data property, copying length bytes from data pointer, and returning new blob ID.h]hiCreate a new ‘blob’ data property, copying length bytes from data pointer, and returning new blob ID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMshjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_destroy_blob (C struct)c.drm_mode_destroy_blobhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_destroy_blobh]j )}(hstruct drm_mode_destroy_blobh](j> )}(hjA h]hstruct}(hj%hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj!hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMyubj )}(h h]h }(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj!hhhj2hMyubj )}(hdrm_mode_destroy_blobh]j )}(hjh]hdrm_mode_destroy_blob}(hjEhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjAubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj!hhhj2hMyubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhj2hMyubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hj2hMyhjhhubj )}(hhh]h)}(hDestroy user blobh]hDestroy user blob}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjdhhubah}(h]h ]h"]h$]h&]uh1j hjhhhj2hMyubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(h{**Definition**:: struct drm_mode_destroy_blob { __u32 blob_id; }; **Members** ``blob_id`` blob_id to destroyh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(h4struct drm_mode_destroy_blob { __u32 blob_id; };h]h4struct drm_mode_destroy_blob { __u32 blob_id; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh]j4 )}(h``blob_id`` blob_id to destroyh](j: )}(h ``blob_id``h]j)}(hjh]hblob_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hblob_id to destroyh]hblob_id to destroy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubah}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(h%Destroy a user-created blob property.h]h%Destroy a user-created blob property.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hXDUser-space can release blobs as soon as they do not need to refer to them by their blob object ID. For instance, if you are using a MODE_ID blob in an atomic commit and you will not make another commit re-using the same ID, you can destroy the blob as soon as the commit has been issued, without waiting for it to complete.h]hXDUser-space can release blobs as soon as they do not need to refer to them by their blob object ID. For instance, if you are using a MODE_ID blob in an atomic commit and you will not make another commit re-using the same ID, you can destroy the blob as soon as the commit has been issued, without waiting for it to complete.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_create_lease (C struct)c.drm_mode_create_leasehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_create_leaseh]j )}(hstruct drm_mode_create_leaseh](j> )}(hjA h]hstruct}(hjdhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj`hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjrhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj`hhhjqhMubj )}(hdrm_mode_create_leaseh]j )}(hj^h]hdrm_mode_create_lease}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj`hhhjqhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj\hhhjqhMubah}(h]jWah ](j j eh"]h$]h&]j j )j huh1j hjqhMhjYhhubj )}(hhh]h)}(h Create leaseh]h Create lease}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjYhhhjqhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_create_lease { __u64 object_ids; __u32 object_count; __u32 flags; __u32 lessee_id; __u32 fd; }; **Members** ``object_ids`` Pointer to array of object ids (__u32) ``object_count`` Number of object ids ``flags`` flags for new FD (O_CLOEXEC, etc) ``lessee_id`` Return: unique identifier for lessee. ``fd`` Return: file descriptor to new drm_master fileh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(hstruct drm_mode_create_lease { __u64 object_ids; __u32 object_count; __u32 flags; __u32 lessee_id; __u32 fd; };h]hstruct drm_mode_create_lease { __u64 object_ids; __u32 object_count; __u32 flags; __u32 lessee_id; __u32 fd; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh](j4 )}(h6``object_ids`` Pointer to array of object ids (__u32) h](j: )}(h``object_ids``h]j)}(hjh]h object_ids}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj ubjT )}(hhh]h)}(h&Pointer to array of object ids (__u32)h]h&Pointer to array of object ids (__u32)}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jS hj ubeh}(h]h ]h"]h$]h&]uh1j3 hj(hMhj ubj4 )}(h&``object_count`` Number of object ids h](j: )}(h``object_count``h]j)}(hjLh]h object_count}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjFubjT )}(hhh]h)}(hNumber of object idsh]hNumber of object ids}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjbubah}(h]h ]h"]h$]h&]uh1jS hjFubeh}(h]h ]h"]h$]h&]uh1j3 hjahMhj ubj4 )}(h,``flags`` flags for new FD (O_CLOEXEC, etc) h](j: )}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h!flags for new FD (O_CLOEXEC, etc)h]h!flags for new FD (O_CLOEXEC, etc)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhj ubj4 )}(h4``lessee_id`` Return: unique identifier for lessee. h](j: )}(h ``lessee_id``h]j)}(hjh]h lessee_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h%Return: unique identifier for lessee.h]h%Return: unique identifier for lessee.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhj ubj4 )}(h5``fd`` Return: file descriptor to new drm_master fileh](j: )}(h``fd``h]j)}(hjh]hfd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h.Return: file descriptor to new drm_master fileh]h.Return: file descriptor to new drm_master file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj hMhj ubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj:h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(h2Lease mode resources, creating another drm_master.h]h2Lease mode resources, creating another drm_master.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hThe **object_ids** array must reference at least one CRTC, one connector and one plane if :c:type:`DRM_CLIENT_CAP_UNIVERSAL_PLANES` is enabled. Alternatively, the lease can be completely empty.h](hThe }(hj_hhhNhNubj )}(h**object_ids**h]h object_ids}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j hj_ubhH array must reference at least one CRTC, one connector and one plane if }(hj_hhhNhNubh)}(h):c:type:`DRM_CLIENT_CAP_UNIVERSAL_PLANES`h]j)}(hj{h]hDRM_CLIENT_CAP_UNIVERSAL_PLANES}(hj}hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jDRM_CLIENT_CAP_UNIVERSAL_PLANESuh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj_ubh> is enabled. Alternatively, the lease can be completely empty.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_list_lessees (C struct)c.drm_mode_list_lesseeshNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_list_lesseesh]j )}(hstruct drm_mode_list_lesseesh](j> )}(hjA h]hstruct}(hjhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhMubj )}(hdrm_mode_list_lesseesh]j )}(hjh]hdrm_mode_list_lessees}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1j hjhMhjhhubj )}(hhh]h)}(h List lesseesh]h List lessees}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_list_lessees { __u32 count_lessees; __u32 pad; __u64 lessees_ptr; }; **Members** ``count_lessees`` Number of lessees. On input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data. ``pad`` Padding. ``lessees_ptr`` Pointer to lessees. Pointer to __u64 array of lessee idsh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(h`struct drm_mode_list_lessees { __u32 count_lessees; __u32 pad; __u64 lessees_ptr; };h]h`struct drm_mode_list_lessees { __u32 count_lessees; __u32 pad; __u64 lessees_ptr; };}hj;sbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjLh]hMembers}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh](j4 )}(h``count_lessees`` Number of lessees. On input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data. h](j: )}(h``count_lessees``h]j)}(hjkh]h count_lessees}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjeubjT )}(hhh](h)}(hNumber of lessees.h]hNumber of lessees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(hOn input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data.h]hOn input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjeubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjbubj4 )}(h``pad`` Padding. h](j: )}(h``pad``h]j)}(hjh]hpad}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hPadding.h]hPadding.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjbubj4 )}(hI``lessees_ptr`` Pointer to lessees. Pointer to __u64 array of lessee idsh](j: )}(h``lessees_ptr``h]j)}(hjh]h lessees_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh](h)}(hPointer to lessees.h]hPointer to lessees.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h$Pointer to __u64 array of lessee idsh]h$Pointer to __u64 array of lessee ids}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjbubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hList lesses from a drm_master.h]hList lesses from a drm_master.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_get_lease (C struct)c.drm_mode_get_leasehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_get_leaseh]j )}(hstruct drm_mode_get_leaseh](j> )}(hjA h]hstruct}(hj}hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjyhhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjyhhhjhMubj )}(hdrm_mode_get_leaseh]j )}(hjwh]hdrm_mode_get_lease}(hjhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjyhhhjhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hjuhhhjhMubah}(h]jpah ](j j eh"]h$]h&]j j )j huh1j hjhMhjrhhubj )}(hhh]h)}(h Get Leaseh]h Get Lease}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hjrhhhjhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hX**Definition**:: struct drm_mode_get_lease { __u32 count_objects; __u32 pad; __u64 objects_ptr; }; **Members** ``count_objects`` Number of leased objects. On input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data. ``pad`` Padding. ``objects_ptr`` Pointer to objects. Pointer to __u32 array of object ids.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.h3hMhjubj)}(h]struct drm_mode_get_lease { __u32 count_objects; __u32 pad; __u64 objects_ptr; };h]h]struct drm_mode_get_lease { __u32 count_objects; __u32 pad; __u64 objects_ptr; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hj h]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh](j4 )}(h``count_objects`` Number of leased objects. On input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data. h](j: )}(h``count_objects``h]j)}(hj,h]h count_objects}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj&ubjT )}(hhh](h)}(hNumber of leased objects.h]hNumber of leased objects.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjBubh)}(hOn input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data.h]hOn input, provides length of the array. On output, provides total number. No more than the input number will be written back, so two calls can be used to get the size and then the data.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjBubeh}(h]h ]h"]h$]h&]uh1jS hj&ubeh}(h]h ]h"]h$]h&]uh1j3 hjAhMhj#ubj4 )}(h``pad`` Padding. h](j: )}(h``pad``h]j)}(hjuh]hpad}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjoubjT )}(hhh]h)}(hPadding.h]hPadding.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jS hjoubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhj#ubj4 )}(hJ``objects_ptr`` Pointer to objects. Pointer to __u32 array of object ids.h](j: )}(h``objects_ptr``h]j)}(hjh]h objects_ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh](h)}(hPointer to objects.h]hPointer to objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h%Pointer to __u32 array of object ids.h]h%Pointer to __u32 array of object ids.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubeh}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhj#ubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(hGet leased objects.h]hGet leased objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_revoke_lease (C struct)c.drm_mode_revoke_leasehNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_revoke_leaseh]j )}(hstruct drm_mode_revoke_leaseh](j> )}(hjA h]hstruct}(hj>hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj:hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjLhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:hhhjKhMubj )}(hdrm_mode_revoke_leaseh]j )}(hj8h]hdrm_mode_revoke_lease}(hj^hhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjZubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj:hhhjKhMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj6hhhjKhMubah}(h]j1ah ](j j eh"]h$]h&]j j )j huh1j hjKhMhj3hhubj )}(hhh]h)}(h Revoke leaseh]h Revoke lease}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj}hhubah}(h]h ]h"]h$]h&]uh1j hj3hhhjKhMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(h**Definition**:: struct drm_mode_revoke_lease { __u32 lessee_id; }; **Members** ``lessee_id`` Unique ID of lesseeh](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(h6struct drm_mode_revoke_lease { __u32 lessee_id; };h]h6struct drm_mode_revoke_lease { __u32 lessee_id; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh]j4 )}(h!``lessee_id`` Unique ID of lesseeh](j: )}(h ``lessee_id``h]j)}(hjh]h lessee_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(hUnique ID of lesseeh]hUnique ID of lessee}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubah}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_rect (C struct)c.drm_mode_recthNtauh1j hjXfhhhNhNubj )}(hhh](j )}(h drm_mode_recth]j )}(hstruct drm_mode_recth](j> )}(hjA h]hstruct}(hjGhhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hjChhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hjUhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjChhhjThMubj )}(h drm_mode_recth]j )}(hjAh]h drm_mode_rect}(hjghhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjcubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hjChhhjThMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj?hhhjThMubah}(h]j:ah ](j j eh"]h$]h&]j j )j huh1j hjThMhj<hhubj )}(hhh]h)}(hTwo dimensional rectangle.h]hTwo dimensional rectangle.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j hj<hhhjThMubeh}(h]h ](jstructeh"]h$]h&]j jj jj jj j j uh1j hhhjXfhNhNubj )}(hXL**Definition**:: struct drm_mode_rect { __s32 x1; __s32 y1; __s32 x2; __s32 y2; }; **Members** ``x1`` Horizontal starting coordinate (inclusive). ``y1`` Vertical starting coordinate (inclusive). ``x2`` Horizontal ending coordinate (exclusive). ``y2`` Vertical ending coordinate (exclusive).h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(hQstruct drm_mode_rect { __s32 x1; __s32 y1; __s32 x2; __s32 y2; };h]hQstruct drm_mode_rect { __s32 x1; __s32 y1; __s32 x2; __s32 y2; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubh)}(h **Members**h]j )}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj/ )}(hhh](j4 )}(h3``x1`` Horizontal starting coordinate (inclusive). h](j: )}(h``x1``h]j)}(hjh]hx1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h+Horizontal starting coordinate (inclusive).h]h+Horizontal starting coordinate (inclusive).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hj hMhjubj4 )}(h1``y1`` Vertical starting coordinate (inclusive). h](j: )}(h``y1``h]j)}(hj/h]hy1}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhj)ubjT )}(hhh]h)}(h)Vertical starting coordinate (inclusive).h]h)Vertical starting coordinate (inclusive).}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjEubah}(h]h ]h"]h$]h&]uh1jS hj)ubeh}(h]h ]h"]h$]h&]uh1j3 hjDhMhjubj4 )}(h1``x2`` Horizontal ending coordinate (exclusive). h](j: )}(h``x2``h]j)}(hjhh]hx2}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjbubjT )}(hhh]h)}(h)Horizontal ending coordinate (exclusive).h]h)Horizontal ending coordinate (exclusive).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1jS hjbubeh}(h]h ]h"]h$]h&]uh1j3 hj}hMhjubj4 )}(h.``y2`` Vertical ending coordinate (exclusive).h](j: )}(h``y2``h]j)}(hjh]hy2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j9 hY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubjT )}(hhh]h)}(h'Vertical ending coordinate (exclusive).h]h'Vertical ending coordinate (exclusive).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubah}(h]h ]h"]h$]h&]uh1jS hjubeh}(h]h ]h"]h$]h&]uh1j3 hjhMhjubeh}(h]h ]h"]h$]h&]uh1j. hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjXfhhhNhNubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(haWith drm subsystem using struct drm_rect to manage rectangular area this export it to user-space.h]haWith drm subsystem using struct drm_rect to manage rectangular area this export it to user-space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubh)}(h@Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.h]h@Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjXfhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j drm_mode_closefb (C struct)c.drm_mode_closefbhNtauh1j hjXfhhhNhNubj )}(hhh](j )}(hdrm_mode_closefbh]j )}(hstruct drm_mode_closefbh](j> )}(hjA h]hstruct}(hj1hhhNhNubah}(h]h ]jJ ah"]h$]h&]uh1j= hj-hhhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMubj )}(h h]h }(hj?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-hhhj>hMubj )}(hdrm_mode_closefbh]j )}(hj+h]hdrm_mode_closefb}(hjQhhhNhNubah}(h]h ]j% ah"]h$]h&]uh1j hjMubah}(h]h ](j, j- eh"]h$]h&]hhuh1j hj-hhhj>hMubeh}(h]h ]h"]h$]h&]hhj uh1j j j hj)hhhj>hMubah}(h]j$ah ](j j eh"]h$]h&]j j )j huh1j hj>hMhj&hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj&hhhj>hMubeh}(h]h ](jstructeh"]h$]h&]j jj j|j j|j j j uh1j hhhjXfhNhNubj )}(h**Definition**:: struct drm_mode_closefb { __u32 fb_id; __u32 pad; }; **Members** ``fb_id`` Framebuffer ID. ``pad`` Must be zero.h](h)}(h**Definition**::h](j )}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhY/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:743: ./include/uapi/drm/drm_mode.hhMhjubj)}(h it uniquely identifies where the job is going to be executed.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:769: ./drivers/gpu/drm/scheduler/gpu_scheduler_trace.hhK,hjmubah}(h]h ]h"]h$]h&]uh1j$hjCubj%)}(h``fence`` - the :c:type:`struct dma_fence `.context and the :c:type:`struct dma_fence `.seqno of :c:type:`struct drm_sched_fence `.finished h]h)}(h``fence`` - the :c:type:`struct dma_fence `.context and the :c:type:`struct dma_fence `.seqno of :c:type:`struct drm_sched_fence `.finishedh](j)}(h ``fence``h]hfence}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - the }(hjhhhNhNubh)}(h&:c:type:`struct dma_fence `h]j)}(hjh]hstruct dma_fence}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j dma_fenceuh1hhm/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:769: ./drivers/gpu/drm/scheduler/gpu_scheduler_trace.hhK/hjubh.context and the }(hjhhhNhNubh)}(h&:c:type:`struct dma_fence `h]j)}(hjh]hstruct dma_fence}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j dma_fenceuh1hhjhK/hjubh .seqno of }(hjhhhNhNubh)}(h2:c:type:`struct drm_sched_fence `h]j)}(hj h]hstruct drm_sched_fence}(hj hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV jdrm_sched_fenceuh1hhjhK/hjubh .finished}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK/hjubah}(h]h ]h"]h$]h&]uh1j$hjCubeh}(h]h ]h"]h$]h&]jj uh1jhjfhK*hjhhubh)}(hAll the events depends on drm_sched_job_arm() having been called already for the job because they use :c:type:`struct drm_sched_job `.sched or :c:type:`struct drm_sched_job `.s_fence.h](hfAll the events depends on drm_sched_job_arm() having been called already for the job because they use }(hj<hhhNhNubh)}(h.:c:type:`struct drm_sched_job `h]j)}(hjFh]hstruct drm_sched_job}(hjHhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_sched_jobuh1hhm/var/lib/git/docbuild/linux/Documentation/gpu/drm-uapi:769: ./drivers/gpu/drm/scheduler/gpu_scheduler_trace.hhK2hj<ubh .sched or }(hj<hhhNhNubh)}(h.:c:type:`struct drm_sched_job `h]j)}(hjjh]hstruct drm_sched_job}(hjlhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjy jV j drm_sched_jobuh1hhjchK2hj<ubh .s_fence.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjchK2hjhhubeh}(h]jah ]h"]stable uapi eventsah$]h&]uh1hhjhhhhhMubeh}(h]jah ]h"] trace eventsah$]h&]uh1hhhhhhhhMubeh}(h]j<ah ]h"]userland interfacesah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj?"footnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(gl_khr_robustness]javulkan]javendor specific recovery]j!aurefids}(j]jaj]jaj]jaj%]j%ajV]jNfaunameids}(jj<jjjj[jjjj}jjjjj jjkjjjjjjjj$jcjFjOjLj\jYjjhjD!jj) jjO jj!jj jj=!jhj&jj!jj#jj#jj$jj4%j=jz%j_j%jj%jj?j%j?jj?jjG\jj?j=j@j_j@jjDjj@\jjjejj+fjjZj7jQjVjPjMjjjjjju nametypes}(jjjjjjjj jkjjjjjcjOj\jjD!j) jO j!j j=!j&j!j#j#j$j4%jz%j%j%j?j?j?jG\j?j@j@jDj@\jjej+fjZjQjPjjjuh}(j<hjj j[jjjj}jj j j j j j j^jcj@jFjjjjjjjjjjjjpj$jjFjjLjFjYjSjhjfjjjjjj, jjR jj j:j jhj!jjG!jjt!jj!jj#jj#j=j$j_j7%jj}%jj%j%j&jj&jjI'j@)jE)j*j*j,j,j.j.j0j0jr2jw2j&5j+5j7j7j<j<jj?j=j?j_j?jj@jj@jAjAjjDjDjEjFjFj IjIjJjJjjȱjͱjjjjjjjj jjjpjuj$j)jݻjjj$jjjjjjjvj{jjjWj\jjjpjuj1j6j:j?j$j)jj]jjjjhj.jUjLjwjnjjjjjjjjjjj@j7jbjYjjjjjjjjjj j4j+jbjYjjjjjjjjjj j7j.jYjPj{jrjjjjjjjjj7j.jYjPj{jrjjjjjjjjj1j(jPjGj~jujjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jK+sRparse_messages]hsystem_message)}(hhh]h)}(h)Duplicate implicit target name: "vulkan".h]h-Duplicate implicit target name: “vulkan”.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubah}(h]h ]h"]h$]h&]j:alevelKtypeINFOsourcehnjlineMquh1j5hj hhhhhMqubatransform_messages](j6)}(hhh]h)}(hhh]h6Hyperlink target "drm-primary-node" is not referenced.}hjXsbah}(h]h ]h"]h$]h&]uh1hhjUubah}(h]h ]h"]h$]h&]levelKtypejPsourcehnjlineKuh1j5ubj6)}(hhh]h)}(hhh]h1Hyperlink target "drm-leasing" is not referenced.}hjrsbah}(h]h ]h"]h$]h&]uh1hhjoubah}(h]h ]h"]h$]h&]levelKtypejPsourcehnjlineK+uh1j5ubj6)}(hhh]h)}(hhh]h5Hyperlink target "drm-render-node" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejPsourcehnjlineKuh1j5ubj6)}(hhh]h)}(hhh]h6Hyperlink target "drm-driver-ioctl" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejPsourcehnjlineM uh1j5ubj6)}(hhh]h)}(hhh]h0Hyperlink target "crtc-index" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejPsourcehnjlineMuh1j5ube transformerN include_log] decorationNhhub.