sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget3/translations/zh_CN/driver-api/vfio-mediated-devicemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/zh_TW/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/it_IT/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/ja_JP/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/ko_KR/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/pt_BR/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/sp_SP/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h%SPDX-License-Identifier: GPL-2.0-onlyh]h%SPDX-License-Identifier: GPL-2.0-only}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhM/var/lib/git/docbuild/linux/Documentation/driver-api/vfio-mediated-device.rsthKubh)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubh)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hhsbah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hhsbah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hjsbah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hj#sbah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hj2sbah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hjAsbah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hjPsbah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hj_sbah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hjnsbah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hj}sbah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjsbah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hjsbah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjsbah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hjsbah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hj"sbah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hj1sbah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hj@sbah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hjOsbah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hj^sbah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hjmsbah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hj|sbah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjsbah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hjsbah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjsbah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hjsbah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hj!sbah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hj0sbah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hj?sbah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hjNsbah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hj]sbah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hjlsbah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hj{sbah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjsbah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hjsbah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjsbah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjsbah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hj/sbah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hj>sbah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hjMsbah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hj\sbah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hjksbah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hjzsbah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjsbah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hjsbah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjsbah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjsbah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hjsbah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hj.sbah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hj=sbah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hjLsbah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(hVFIO Mediated devicesh]hVFIO Mediated devices}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj]hhhhhKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(h Copyrighth]h Copyright}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjwhhhKubh field_body)}(h5|copy| 2016, NVIDIA CORPORATION. All rights reserved.h]h paragraph)}(hjh](h©}(hjhhhNhNubh/ 2016, NVIDIA CORPORATION. All rights reserved.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1juhhhKhjrhhubjv)}(hhh](j{)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjhhhKubj)}(hNeo Jia h]j)}(hjh](h Neo Jia <}(hjhhhNhNubh reference)}(hcjia@nvidia.comh]hcjia@nvidia.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:cjia@nvidia.comuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhK hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1juhhhK hjrhhubjv)}(hhh](j{)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjhhhKubj)}(h(Kirti Wankhede h]j)}(h%Kirti Wankhede h](hKirti Wankhede <}(hjhhhNhNubj)}(hkwankhede@nvidia.comh]hkwankhede@nvidia.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:kwankhede@nvidia.comuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhK hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1juhhhK hjrhhubeh}(h]h ]h"]h$]h&]uh1jphj]hhhhhKubj\)}(hhh](ja)}(h/Virtual Function I/O (VFIO) Mediated devices[1]h]h/Virtual Function I/O (VFIO) Mediated devices[1]}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj<hhhhhKubj)}(hXThe number of use cases for virtualizing DMA devices that do not have built-in SR_IOV capability is increasing. Previously, to virtualize such devices, developers had to create their own management interfaces and APIs, and then integrate them with user space software. To simplify integration with user space software, we have identified common requirements and a unified management interface for such devices.h]hXThe number of use cases for virtualizing DMA devices that do not have built-in SR_IOV capability is increasing. Previously, to virtualize such devices, developers had to create their own management interfaces and APIs, and then integrate them with user space software. To simplify integration with user space software, we have identified common requirements and a unified management interface for such devices.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj<hhubj)}(hXThe VFIO driver framework provides unified APIs for direct device access. It is an IOMMU/device-agnostic framework for exposing direct device access to user space in a secure, IOMMU-protected environment. This framework is used for multiple devices, such as GPUs, network adapters, and compute accelerators. With direct device access, virtual machines or user space applications have direct access to the physical device. This framework is reused for mediated devices.h]hXThe VFIO driver framework provides unified APIs for direct device access. It is an IOMMU/device-agnostic framework for exposing direct device access to user space in a secure, IOMMU-protected environment. This framework is used for multiple devices, such as GPUs, network adapters, and compute accelerators. With direct device access, virtual machines or user space applications have direct access to the physical device. This framework is reused for mediated devices.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj<hhubj)}(hThe mediated core driver provides a common interface for mediated device management that can be used by drivers of different devices. This module provides a generic interface to perform these operations:h]hThe mediated core driver provides a common interface for mediated device management that can be used by drivers of different devices. This module provides a generic interface to perform these operations:}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj<hhubh bullet_list)}(hhh](h list_item)}(h$Create and destroy a mediated deviceh]j)}(hjh]h$Create and destroy a mediated device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK#hj~ubah}(h]h ]h"]h$]h&]uh1j|hjyhhhhhNubj})}(hAAdd a mediated device to and remove it from a mediated bus driverh]j)}(hjh]hAAdd a mediated device to and remove it from a mediated bus driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK$hjubah}(h]h ]h"]h$]h&]uh1j|hjyhhhhhNubj})}(h;Add a mediated device to and remove it from an IOMMU group h]j)}(h:Add a mediated device to and remove it from an IOMMU grouph]h:Add a mediated device to and remove it from an IOMMU group}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK%hjubah}(h]h ]h"]h$]h&]uh1j|hjyhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jwhhhK#hj<hhubj)}(hXThe mediated core driver also provides an interface to register a bus driver. For example, the mediated VFIO mdev driver is designed for mediated devices and supports VFIO APIs. The mediated bus driver adds a mediated device to and removes it from a VFIO group.h]hXThe mediated core driver also provides an interface to register a bus driver. For example, the mediated VFIO mdev driver is designed for mediated devices and supports VFIO APIs. The mediated bus driver adds a mediated device to and removes it from a VFIO group.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK'hj<hhubj)}(hThe following high-level block diagram shows the main components and interfaces in the VFIO mediated driver framework. The diagram shows NVIDIA, Intel, and IBM devices as examples, as these devices are the first devices to use this module::h]hThe following high-level block diagram shows the main components and interfaces in the VFIO mediated driver framework. The diagram shows NVIDIA, Intel, and IBM devices as examples, as these devices are the first devices to use this module:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK,hj<hhubh literal_block)}(hX+---------------+ | | | +-----------+ | mdev_register_driver() +--------------+ | | | +<------------------------+ | | | mdev | | | | | | bus | +------------------------>+ vfio_mdev.ko |<-> VFIO user | | driver | | probe()/remove() | | APIs | | | | +--------------+ | +-----------+ | | | | MDEV CORE | | MODULE | | mdev.ko | | +-----------+ | mdev_register_parent() +--------------+ | | | +<------------------------+ | | | | | | ccw_device.ko|<-> physical | | | +------------------------>+ | device | | | | callbacks +--------------+ | | Physical | | | | device | | mdev_register_parent() +--------------+ | | interface | |<------------------------+ | | | | | | i915.ko |<-> physical | | | +------------------------>+ | device | | | | callbacks +--------------+ | +-----------+ | +---------------+h]hX+---------------+ | | | +-----------+ | mdev_register_driver() +--------------+ | | | +<------------------------+ | | | mdev | | | | | | bus | +------------------------>+ vfio_mdev.ko |<-> VFIO user | | driver | | probe()/remove() | | APIs | | | | +--------------+ | +-----------+ | | | | MDEV CORE | | MODULE | | mdev.ko | | +-----------+ | mdev_register_parent() +--------------+ | | | +<------------------------+ | | | | | | ccw_device.ko|<-> physical | | | +------------------------>+ | device | | | | callbacks +--------------+ | | Physical | | | | device | | mdev_register_parent() +--------------+ | | interface | |<------------------------+ | | | | | | i915.ko |<-> physical | | | +------------------------>+ | device | | | | callbacks +--------------+ | +-----------+ | +---------------+}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK0hj<hhubeh}(h],virtual-function-i-o-vfio-mediated-devices-1ah ]h"]/virtual function i/o (vfio) mediated devices[1]ah$]h&]uh1j[hj]hhhhhKubj\)}(hhh](ja)}(hRegistration Interfacesh]hRegistration Interfaces}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjhhhhhKMubj)}(hQThe mediated core driver provides the following types of registration interfaces:h]hQThe mediated core driver provides the following types of registration interfaces:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKOhjhhubjx)}(hhh](j})}(h0Registration interface for a mediated bus driverh]j)}(hj$h]h0Registration interface for a mediated bus driver}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKRhj"ubah}(h]h ]h"]h$]h&]uh1j|hjhhhhhNubj})}(h!Physical device driver interface h]j)}(h Physical device driver interfaceh]h Physical device driver interface}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKShj9ubah}(h]h ]h"]h$]h&]uh1j|hjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jwhhhKRhjhhubj\)}(hhh](ja)}(h0Registration Interface for a Mediated Bus Driverh]h0Registration Interface for a Mediated Bus Driver}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjWhhhhhKVubj)}(hThe registration interface for a mediated device driver provides the following structure to represent a mediated device's driver::h]hThe registration interface for a mediated device driver provides the following structure to represent a mediated device’s driver:}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKXhjWhhubj)}(hX/* * struct mdev_driver [2] - Mediated device's driver * @probe: called when new device created * @remove: called when device removed * @driver: device driver structure */ struct mdev_driver { int (*probe) (struct mdev_device *dev); void (*remove) (struct mdev_device *dev); unsigned int (*get_available)(struct mdev_type *mtype); ssize_t (*show_description)(struct mdev_type *mtype, char *buf); struct device_driver driver; };h]hX/* * struct mdev_driver [2] - Mediated device's driver * @probe: called when new device created * @remove: called when device removed * @driver: device driver structure */ struct mdev_driver { int (*probe) (struct mdev_device *dev); void (*remove) (struct mdev_device *dev); unsigned int (*get_available)(struct mdev_type *mtype); ssize_t (*show_description)(struct mdev_type *mtype, char *buf); struct device_driver driver; };}hjvsbah}(h]h ]h"]h$]h&]hhuh1jhhhK[hjWhhubj)}(hA mediated bus driver for mdev should use this structure in the function calls to register and unregister itself with the core driver:h]hA mediated bus driver for mdev should use this structure in the function calls to register and unregister itself with the core driver:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKihjWhhubjx)}(hhh](j})}(hARegister:: int mdev_register_driver(struct mdev_driver *drv); h](j)}(h Register::h]h Register:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKlhjubj)}(h2int mdev_register_driver(struct mdev_driver *drv);h]h2int mdev_register_driver(struct mdev_driver *drv);}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKnhjubeh}(h]h ]h"]h$]h&]uh1j|hjhhhhhNubj})}(hFUnregister:: void mdev_unregister_driver(struct mdev_driver *drv); h](j)}(h Unregister::h]h Unregister:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKphjubj)}(h5void mdev_unregister_driver(struct mdev_driver *drv);h]h5void mdev_unregister_driver(struct mdev_driver *drv);}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKrhjubeh}(h]h ]h"]h$]h&]uh1j|hjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jwhhhKlhjWhhubj)}(hThe mediated bus driver's probe function should create a vfio_device on top of the mdev_device and connect it to an appropriate implementation of vfio_device_ops.h]hThe mediated bus driver’s probe function should create a vfio_device on top of the mdev_device and connect it to an appropriate implementation of vfio_device_ops.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKthjWhhubj)}(hpWhen a driver wants to add the GUID creation sysfs to an existing device it has probe'd to then it should call::h]hqWhen a driver wants to add the GUID creation sysfs to an existing device it has probe’d to then it should call:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKxhjWhhubj)}(h~int mdev_register_parent(struct mdev_parent *parent, struct device *dev, struct mdev_driver *mdev_driver);h]h~int mdev_register_parent(struct mdev_parent *parent, struct device *dev, struct mdev_driver *mdev_driver);}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK{hjWhhubj)}(hThis will provide the 'mdev_supported_types/XX/create' files which can then be used to trigger the creation of a mdev_device. The created mdev_device will be attached to the specified driver.h]hThis will provide the ‘mdev_supported_types/XX/create’ files which can then be used to trigger the creation of a mdev_device. The created mdev_device will be attached to the specified driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK~hjWhhubj)}(h1When the driver needs to remove itself it calls::h]h0When the driver needs to remove itself it calls:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjWhhubj)}(h8void mdev_unregister_parent(struct mdev_parent *parent);h]h8void mdev_unregister_parent(struct mdev_parent *parent);}hj-sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjWhhubj)}(hOWhich will unbind and destroy all the created mdevs and remove the sysfs files.h]hOWhich will unbind and destroy all the created mdevs and remove the sysfs files.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjWhhubeh}(h]0registration-interface-for-a-mediated-bus-driverah ]h"]0registration interface for a mediated bus driverah$]h&]uh1j[hjhhhhhKVubeh}(h]registration-interfacesah ]h"]registration interfacesah$]h&]uh1j[hj]hhhhhKMubj\)}(hhh](ja)}(h2Mediated Device Management Interface Through sysfsh]h2Mediated Device Management Interface Through sysfs}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjYhhhhhKubj)}(hXThe management interface through sysfs enables user space software, such as libvirt, to query and configure mediated devices in a hardware-agnostic fashion. This management interface provides flexibility to the underlying physical device's driver to support features such as:h]hXThe management interface through sysfs enables user space software, such as libvirt, to query and configure mediated devices in a hardware-agnostic fashion. This management interface provides flexibility to the underlying physical device’s driver to support features such as:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjYhhubjx)}(hhh](j})}(hMediated device hot plugh]j)}(hj}h]hMediated device hot plug}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj{ubah}(h]h ]h"]h$]h&]uh1j|hjxhhhhhNubj})}(h5Multiple mediated devices in a single virtual machineh]j)}(hjh]h5Multiple mediated devices in a single virtual machine}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1j|hjxhhhhhNubj})}(h:Multiple mediated devices from different physical devices h]j)}(h9Multiple mediated devices from different physical devicesh]h9Multiple mediated devices from different physical devices}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1j|hjxhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jwhhhKhjYhhubj\)}(hhh](ja)}(h%Links in the mdev_bus Class Directoryh]h%Links in the mdev_bus Class Directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjhhhhhKubj)}(hkThe /sys/class/mdev_bus/ directory contains links to devices that are registered with the mdev core driver.h]hkThe /sys/class/mdev_bus/ directory contains links to devices that are registered with the mdev core driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]%links-in-the-mdev-bus-class-directoryah ]h"]%links in the mdev_bus class directoryah$]h&]uh1j[hjYhhhhhKubj\)}(hhh](ja)}(h>Directories and files under the sysfs for Each Physical Deviceh]h>Directories and files under the sysfs for Each Physical Device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjhhhhhKubj)}(hX~|- [parent physical device] |--- Vendor-specific-attributes [optional] |--- [mdev_supported_types] | |--- [] | | |--- create | | |--- name | | |--- available_instances | | |--- device_api | | |--- description | | |--- [devices] | |--- [] | | |--- create | | |--- name | | |--- available_instances | | |--- device_api | | |--- description | | |--- [devices] | |--- [] | |--- create | |--- name | |--- available_instances | |--- device_api | |--- description | |--- [devices]h]hX~|- [parent physical device] |--- Vendor-specific-attributes [optional] |--- [mdev_supported_types] | |--- [] | | |--- create | | |--- name | | |--- available_instances | | |--- device_api | | |--- description | | |--- [devices] | |--- [] | | |--- create | | |--- name | | |--- available_instances | | |--- device_api | | |--- description | | |--- [devices] | |--- [] | |--- create | |--- name | |--- available_instances | |--- device_api | |--- description | |--- [devices]}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubjx)}(hhh](j})}(h[mdev_supported_types] The list of currently supported mediated device types and their details. [], device_api, and available_instances are mandatory attributes that should be provided by vendor driver. h](j)}(h[mdev_supported_types]h]h[mdev_supported_types]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hHThe list of currently supported mediated device types and their details.h]hHThe list of currently supported mediated device types and their details.}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hs[], device_api, and available_instances are mandatory attributes that should be provided by vendor driver.h]hs[], device_api, and available_instances are mandatory attributes that should be provided by vendor driver.}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(h[] The [] name is created by adding the device driver string as a prefix to the string provided by the vendor driver. This format of this name is as follows:: sprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name); h](j)}(h []h]h []}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjD ubj)}(hThe [] name is created by adding the device driver string as a prefix to the string provided by the vendor driver. This format of this name is as follows::h]hThe [] name is created by adding the device driver string as a prefix to the string provided by the vendor driver. This format of this name is as follows:}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjD ubj)}(hCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);h]hCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);}hjd sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjD ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(hndevice_api This attribute shows which device API is being created, for example, "vfio-pci" for a PCI device. h](j)}(h device_apih]h device_api}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjx ubj)}(haThis attribute shows which device API is being created, for example, "vfio-pci" for a PCI device.h]heThis attribute shows which device API is being created, for example, “vfio-pci” for a PCI device.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjx ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(hgavailable_instances This attribute shows the number of devices of type that can be created. h](j)}(havailable_instancesh]havailable_instances}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hQThis attribute shows the number of devices of type that can be created.h]hQThis attribute shows the number of devices of type that can be created.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(ha[device] This directory contains links to the devices of type that have been created. h](j)}(h[device]h]h[device]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hVThis directory contains links to the devices of type that have been created.h]hVThis directory contains links to the devices of type that have been created.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(h2name This attribute shows a human readable name. h](j)}(hnameh]hname}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(h+This attribute shows a human readable name.h]h+This attribute shows a human readable name.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubj})}(hldescription This attribute can show brief features/description of the type. This is an optional attribute. h](j)}(h descriptionh]h description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(h^This attribute can show brief features/description of the type. This is an optional attribute.h]h^This attribute can show brief features/description of the type. This is an optional attribute.}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj ubeh}(h]h ]h"]h$]h&]uh1j|hj hhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jwhhhKhjhhubeh}(h]>directories-and-files-under-the-sysfs-for-each-physical-deviceah ]h"]>directories and files under the sysfs for each physical deviceah$]h&]uh1j[hjYhhhhhKubj\)}(hhh](ja)}(h:Directories and Files Under the sysfs for Each mdev Deviceh]h:Directories and Files Under the sysfs for Each mdev Device}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjD hhhhhKubj)}(h|- [parent phy device] |--- [$MDEV_UUID] |--- remove |--- mdev_type {link to its type} |--- vendor-specific-attributes [optional]h]h|- [parent phy device] |--- [$MDEV_UUID] |--- remove |--- mdev_type {link to its type} |--- vendor-specific-attributes [optional]}hjU sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjD hhubjx)}(hhh]j})}(hremove (write only) h]j)}(hremove (write only)h]hremove (write only)}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjf ubah}(h]h ]h"]h$]h&]uh1j|hjc hhhhhNubah}(h]h ]h"]h$]h&]jjuh1jwhhhKhjD hhubj)}(hWriting '1' to the 'remove' file destroys the mdev device. The vendor driver can fail the remove() callback if that device is active and the vendor driver doesn't support hot unplug.h]hWriting ‘1’ to the ‘remove’ file destroys the mdev device. The vendor driver can fail the remove() callback if that device is active and the vendor driver doesn’t support hot unplug.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjD hhubj)}(h Example::h]hExample:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjD hhubj)}(h2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/removeh]h2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjD hhubeh}(h]:directories-and-files-under-the-sysfs-for-each-mdev-deviceah ]h"]:directories and files under the sysfs for each mdev deviceah$]h&]uh1j[hjYhhhhhKubj\)}(hhh](ja)}(hMediated device Hot plugh]hMediated device Hot plug}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj hhhhhKubj)}(hMediated devices can be created and assigned at runtime. The procedure to hot plug a mediated device is the same as the procedure to hot plug a PCI device.h]hMediated devices can be created and assigned at runtime. The procedure to hot plug a mediated device is the same as the procedure to hot plug a PCI device.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj hhubeh}(h]mediated-device-hot-plugah ]h"]mediated device hot plugah$]h&]uh1j[hjYhhhhhKubeh}(h]2mediated-device-management-interface-through-sysfsah ]h"]2mediated device management interface through sysfsah$]h&]uh1j[hj]hhhhhKubj\)}(hhh](ja)}(h%Translation APIs for Mediated Devicesh]h%Translation APIs for Mediated Devices}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj hhhhhKubj)}(hWThe following APIs are provided for translating user pfn to host pfn in a VFIO driver::h]hVThe following APIs are provided for translating user pfn to host pfn in a VFIO driver:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hint vfio_pin_pages(struct vfio_device *device, dma_addr_t iova, int npage, int prot, struct page **pages); void vfio_unpin_pages(struct vfio_device *device, dma_addr_t iova, int npage);h]hint vfio_pin_pages(struct vfio_device *device, dma_addr_t iova, int npage, int prot, struct page **pages); void vfio_unpin_pages(struct vfio_device *device, dma_addr_t iova, int npage);}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhj hhubj)}(hXSThese functions call back into the back-end IOMMU module by using the pin_pages and unpin_pages callbacks of the struct vfio_iommu_driver_ops[4]. Currently these callbacks are supported in the TYPE1 IOMMU module. To enable them for other IOMMU backend modules, such as PPC64 sPAPR module, they need to provide these two callback functions.h]hXSThese functions call back into the back-end IOMMU module by using the pin_pages and unpin_pages callbacks of the struct vfio_iommu_driver_ops[4]. Currently these callbacks are supported in the TYPE1 IOMMU module. To enable them for other IOMMU backend modules, such as PPC64 sPAPR module, they need to provide these two callback functions.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhj hhubeh}(h]%translation-apis-for-mediated-devicesah ]h"]%translation apis for mediated devicesah$]h&]uh1j[hj]hhhhhKubj\)}(hhh](ja)}(h Referencesh]h References}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj( hhhhhM ubhenumerated_list)}(hhh](j})}(hCSee Documentation/driver-api/vfio.rst for more information on VFIO.h]j)}(hj@ h]hCSee Documentation/driver-api/vfio.rst for more information on VFIO.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhj> ubah}(h]h ]h"]h$]h&]uh1j|hj; hhhhhNubj})}(h*struct mdev_driver in include/linux/mdev.hh]j)}(hjW h]h*struct mdev_driver in include/linux/mdev.h}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhjU ubah}(h]h ]h"]h$]h&]uh1j|hj; hhhhhNubj})}(h.struct mdev_parent_ops in include/linux/mdev.hh]j)}(hjn h]h.struct mdev_parent_ops in include/linux/mdev.h}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhjl ubah}(h]h ]h"]h$]h&]uh1j|hj; hhhhhNubj})}(h4struct vfio_iommu_driver_ops in include/linux/vfio.hh]j)}(hj h]h4struct vfio_iommu_driver_ops in include/linux/vfio.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhj ubah}(h]h ]h"]h$]h&]uh1j|hj; hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j9 hj( hhhhhMubeh}(h] referencesah ]h"] referencesah$]h&]uh1j[hj]hhhhhM ubeh}(h]vfio-mediated-devicesah ]h"]vfio mediated devicesah$]h&]uh1j[hhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j`N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_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_handlerj error_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}(hhjhjjj jj/j#j>j2jMjAj\jPjkj_jzjnjj}jjjjjjjjjjjjjjjjjjjjj.j"j=j1jLj@j[jOjjj^jyjmjj|jjjjjjjjjjjjjjjjjjjjj-j!j<j0jKj?jZjNjij]jxjljj{jjjjjjjjjjjjjjjjjjjjj,j j;j/jJj>jYjMjhj\jwjkjjzjjjjjjjjjjjjjjjjj jjjj+jj:j.jIj=jXjLusubstitution_names}(amphaposjastjbrvbarj bsolj/centj>colonjMcommaj\commatjkcopyjzcurrenjdarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34jfrac38j.frac58j=frac78jLgtj[halfjjhorbarjyhyphenjiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquojltj-microj<middotjKnbspjZnotjinumjxohmjordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotjraquoj,rarrj;rcubjJrdquojYregjhrparjwrsqbjrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3j timesjtradej+uarrj:verbarjIyenjXurefnames}refids}nameids}(j j jjjVjSjNjKj j jjjA j> j j j j j% j" j j u nametypes}(j jjVjNj jjA j j j% j uh}(j j]jj<jSjjKjWj jYjjj> jj jD j j j" j j j( u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log]1Documentation/driver-api/vfio-mediated-device.rst(NNNNta decorationNhhub.