Vsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}(hhparenthuba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget3/translations/zh_CN/driver-api/vfio-mediated-devicemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}(hhhh2ubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/zh_TW/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}(hhhhFubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/it_IT/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}(hhhhZubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/ja_JP/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}(hhhhnubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget3/translations/ko_KR/driver-api/vfio-mediated-devicemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}(hhhhubah}(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}(hhhhubah}(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.}(hhhhubah}(h]h ]h"]h$]h&]hhuh1hhhhhhY/srv/docbuild/venv3/lib64/python3.6/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: .}(hhhhubah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}(hhhhubah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}(hhhhubah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}(hhhhubah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}(hhhjubah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}(hhhjubah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}(hhhjubah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}(hhhj-ubah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}(hhhj<ubah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}(hhhjKubah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}(hhhjZubah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}(hhhjiubah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}(hhhjxubah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}(hhhjubah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}(hhhjubah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}(hhhjubah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}(hhhjubah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}(hhhjubah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}(hhhjubah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}(hhhjubah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}(hhhjubah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}(hhhjubah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}(hhhjubah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}(hhhjubah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}(hhhj,ubah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}(hhhj;ubah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}(hhhjJubah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}(hhhjYubah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}(hhhjhubah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}(hhhjwubah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}(hhhjubah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}(hhhjubah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}(hhhjubah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}(hhhjubah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}(hhhjubah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}(hhhjubah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}(hhhjubah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}(hhhjubah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}(hhhjubah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}(hhhj ubah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}(hhhjubah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}(hhhj+ubah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }(hhhj:ubah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}(hhhjIubah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}(hhhjXubah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}(hhhjgubah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}(hhhjvubah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}(hhhjubah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}(hhhjubah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}(hhhjubah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}(hhhjubah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}(hhhjubah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}(hhhjubah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}(hhhjubah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}(hhhjubah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}(hhhjubah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}(hhhj*ubah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}(hhhj9ubah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}(hhhjHubah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}(hhhjWubah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}(hhhjfubah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}(hhhjuubah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}(hhhjubah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}(hhhjubah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}(hhhjubah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}(hhhjubah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}(hhhjubah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}(hhhjubah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}(hhhjubah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}(hhhjubah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}(hhhjubah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}(hhhj ubah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}(hhhjubah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}(hhhj)ubah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}(hhhj8ubah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(hVFIO Mediated devicesh]hVFIO Mediated devices}(hjPhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhhhhhKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(h Copyrighth]h Copyright}(hjjhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjchhhKubh field_body)}(h5|copy| 2016, NVIDIA CORPORATION. All rights reserved.h]h paragraph)}(hjzh](h©}(hhhj~hhhNhNubh/ 2016, NVIDIA CORPORATION. All rights reserved.}(h/ 2016, NVIDIA CORPORATION. All rights reserved.hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhKhjxubah}(h]h ]h"]h$]h&]uh1jvhjcubeh}(h]h ]h"]h$]h&]uh1jahhhKhj^hhubjb)}(hhh](jg)}(hAuthorh]hAuthor}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjhhhKubjw)}(hNeo Jia h]j})}(hjh](h Neo Jia <}(h Neo Jia }(h>hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK hjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jahhhK hj^hhubjb)}(hhh](jg)}(hAuthorh]hAuthor}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjhhhKubjw)}(h(Kirti Wankhede h]j})}(h%Kirti Wankhede h](hKirti Wankhede <}(hKirti Wankhede }(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j|hhhK hjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jahhhK hj^hhubeh}(h]h ]h"]h$]h&]uh1j\hjIhhhhhKubjH)}(hhh](jM)}(h/Virtual Function I/O (VFIO) Mediated devices[1]h]h/Virtual Function I/O (VFIO) Mediated devices[1]}(hj1hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,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.}(hj?hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj,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.}(hjMhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj,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:}(hj[hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj,hhubh bullet_list)}(hhh](h list_item)}(h$Create and destroy a mediated deviceh]j})}(hjph]h$Create and destroy a mediated device}(hjphjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK#hjnubah}(h]h ]h"]h$]h&]uh1jlhjihhhhhNubjm)}(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}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK$hjubah}(h]h ]h"]h$]h&]uh1jlhjihhhhhNubjm)}(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}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK%hjubah}(h]h ]h"]h$]h&]uh1jlhjihhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jghhhK#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.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK'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:}(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&]uh1j|hhhK,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 +--------------+ | +-----------+ | +---------------+}(hhhjubah}(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&]uh1jGhjIhhhhhKubjH)}(hhh](jM)}(hRegistration Interfacesh]hRegistration Interfaces}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhKMubj})}(hQThe mediated core driver provides the following types of registration interfaces:h]hQThe mediated core driver provides the following types of registration interfaces:}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKOhjhhubjh)}(hhh](jm)}(h0Registration interface for a mediated bus driverh]j})}(hjh]h0Registration interface for a mediated bus driver}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKRhjubah}(h]h ]h"]h$]h&]uh1jlhjhhhhhNubjm)}(h!Physical device driver interface h]j})}(h Physical device driver interfaceh]h Physical device driver interface}(hj0hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKShj*ubah}(h]h ]h"]h$]h&]uh1jlhjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jghhhKRhjhhubjH)}(hhh](jM)}(h0Registration Interface for a Mediated Bus Driverh]h0Registration Interface for a Mediated Bus Driver}(hjMhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHhhhhhKVubj})}(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:}(hThe registration interface for a mediated device driver provides the following structure to represent a mediated device's driver:hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKXhjHhhubj)}(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; };}(hhhjhubah}(h]h ]h"]h$]h&]hhuh1jhhhK[hjHhhubj})}(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:}(hjxhjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKihjHhhubjh)}(hhh](jm)}(hARegister:: int mdev_register_driver(struct mdev_driver *drv); h](j})}(h Register::h]h Register:}(h Register:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKlhjubj)}(h2int mdev_register_driver(struct mdev_driver *drv);h]h2int mdev_register_driver(struct mdev_driver *drv);}(hhhjubah}(h]h ]h"]h$]h&]hhuh1jhhhKnhjubeh}(h]h ]h"]h$]h&]uh1jlhjhhhhhNubjm)}(hFUnregister:: void mdev_unregister_driver(struct mdev_driver *drv); h](j})}(h Unregister::h]h Unregister:}(h Unregister:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKphjubj)}(h5void mdev_unregister_driver(struct mdev_driver *drv);h]h5void mdev_unregister_driver(struct mdev_driver *drv);}(hhhjubah}(h]h ]h"]h$]h&]hhuh1jhhhKrhjubeh}(h]h ]h"]h$]h&]uh1jlhjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jghhhKlhjHhhubj})}(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.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKthjHhhubj})}(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:}(hoWhen 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&]uh1j|hhhKxhjHhhubj)}(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);}(hhhjubah}(h]h ]h"]h$]h&]hhuh1jhhhK{hjHhhubj})}(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.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhK~hjHhhubj})}(h1When the driver needs to remove itself it calls::h]h0When the driver needs to remove itself it calls:}(h0When the driver needs to remove itself it calls:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjHhhubj)}(h8void mdev_unregister_parent(struct mdev_parent *parent);h]h8void mdev_unregister_parent(struct mdev_parent *parent);}(hhhj#ubah}(h]h ]h"]h$]h&]hhuh1jhhhKhjHhhubj})}(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.}(hj3hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjHhhubeh}(h]0registration-interface-for-a-mediated-bus-driverah ]h"]0registration interface for a mediated bus driverah$]h&]uh1jGhjhhhhhKVubeh}(h]registration-interfacesah ]h"]registration interfacesah$]h&]uh1jGhjIhhhhhKMubjH)}(hhh](jM)}(h2Mediated Device Management Interface Through sysfsh]h2Mediated Device Management Interface Through sysfs}(hjThjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjOhhhhhKubj})}(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:}(hjbhj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjOhhubjh)}(hhh](jm)}(hMediated device hot plugh]j})}(hjsh]hMediated device hot plug}(hjshjuhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjqubah}(h]h ]h"]h$]h&]uh1jlhjnhhhhhNubjm)}(h5Multiple mediated devices in a single virtual machineh]j})}(hjh]h5Multiple mediated devices in a single virtual machine}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjubah}(h]h ]h"]h$]h&]uh1jlhjnhhhhhNubjm)}(h:Multiple mediated devices from different physical devices h]j})}(h9Multiple mediated devices from different physical devicesh]h9Multiple mediated devices from different physical devices}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjubah}(h]h ]h"]h$]h&]uh1jlhjnhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jghhhKhjOhhubjH)}(hhh](jM)}(h%Links in the mdev_bus Class Directoryh]h%Links in the mdev_bus Class Directory}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhKubj})}(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.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjhhubeh}(h]%links-in-the-mdev-bus-class-directoryah ]h"]%links in the mdev_bus class directoryah$]h&]uh1jGhjOhhhhhKubjH)}(hhh](jM)}(h>Directories and files under the sysfs for Each Physical Deviceh]h>Directories and files under the sysfs for Each Physical Device}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhKubj)}(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]}(hhhjubah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubjh)}(hhh](jm)}(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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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.}(hj( hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(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 []}(hj@ hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj: 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:}(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:hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj: ubj)}(hCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);h]hCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);}(hhhj[ ubah}(h]h ]h"]h$]h&]hhuh1jhhhKhj: ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(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}(hju hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjo 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhjo ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(hgavailable_instances This attribute shows the number of devices of type that can be created. h](j})}(havailable_instancesh]havailable_instances}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(ha[device] This directory contains links to the devices of type that have been created. h](j})}(h[device]h]h[device]}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(h2name This attribute shows a human readable name. h](j})}(hnameh]hname}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubj})}(h+This attribute shows a human readable name.h]h+This attribute shows a human readable name.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubjm)}(hldescription This attribute can show brief features/description of the type. This is an optional attribute. h](j})}(h descriptionh]h description}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj ubeh}(h]h ]h"]h$]h&]uh1jlhj hhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jghhhKhjhhubeh}(h]>directories-and-files-under-the-sysfs-for-each-physical-deviceah ]h"]>directories and files under the sysfs for each physical deviceah$]h&]uh1jGhjOhhhhhKubjH)}(hhh](jM)}(h:Directories and Files Under the sysfs for Each mdev Deviceh]h:Directories and Files Under the sysfs for Each mdev Device}(hj@ hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj; 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]}(hhhjL ubah}(h]h ]h"]h$]h&]hhuh1jhhhKhj; hhubjh)}(hhh]jm)}(hremove (write only) h]j})}(hremove (write only)h]hremove (write only)}(hjc hja hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj] ubah}(h]h ]h"]h$]h&]uh1jlhjZ hhhhhNubah}(h]h ]h"]h$]h&]jjuh1jghhhKhj; 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} hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj; hhubj})}(h Example::h]hExample:}(hExample:hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj; hhubj)}(h2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/removeh]h2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove}(hhhj ubah}(h]h ]h"]h$]h&]hhuh1jhhhKhj; hhubeh}(h]:directories-and-files-under-the-sysfs-for-each-mdev-deviceah ]h"]:directories and files under the sysfs for each mdev deviceah$]h&]uh1jGhjOhhhhhKubjH)}(hhh](jM)}(hMediated device Hot plugh]hMediated device Hot plug}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj 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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj hhubeh}(h]mediated-device-hot-plugah ]h"]mediated device hot plugah$]h&]uh1jGhjOhhhhhKubeh}(h]2mediated-device-management-interface-through-sysfsah ]h"]2mediated device management interface through sysfsah$]h&]uh1jGhjIhhhhhKubjH)}(hhh](jM)}(h%Translation APIs for Mediated Devicesh]h%Translation APIs for Mediated Devices}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj 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:}(hVThe following APIs are provided for translating user pfn to host pfn in a VFIO driver:hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhKhj 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);}(hhhj ubah}(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 hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhMhj hhubeh}(h]%translation-apis-for-mediated-devicesah ]h"]%translation apis for mediated devicesah$]h&]uh1jGhjIhhhhhKubjH)}(hhh](jM)}(h Referencesh]h References}(hj& hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj! hhhhhM ubhenumerated_list)}(hhh](jm)}(hCSee Documentation/driver-api/vfio.rst for more information on VFIO.h]j})}(hj9 h]hCSee Documentation/driver-api/vfio.rst for more information on VFIO.}(hj9 hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhMhj7 ubah}(h]h ]h"]h$]h&]uh1jlhj4 hhhhhNubjm)}(h*struct mdev_driver in include/linux/mdev.hh]j})}(hjP h]h*struct mdev_driver in include/linux/mdev.h}(hjP hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhMhjN ubah}(h]h ]h"]h$]h&]uh1jlhj4 hhhhhNubjm)}(h.struct mdev_parent_ops in include/linux/mdev.hh]j})}(hjg h]h.struct mdev_parent_ops in include/linux/mdev.h}(hjg hji hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhMhje ubah}(h]h ]h"]h$]h&]uh1jlhj4 hhhhhNubjm)}(h4struct vfio_iommu_driver_ops in include/linux/vfio.hh]j})}(hj~ h]h4struct vfio_iommu_driver_ops in include/linux/vfio.h}(hj~ hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j|hhhMhj| ubah}(h]h ]h"]h$]h&]uh1jlhj4 hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j2 hj! hhhhhMubeh}(h] referencesah ]h"] referencesah$]h&]uh1jGhjIhhhhhM ubeh}(h]vfio-mediated-devicesah ]h"]vfio mediated devicesah$]h&]uh1jGhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jLN 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_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confapep_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_spacefile_insertion_enabled raw_enabledKline_length_limitM'syntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_link embed_imagesenvNubreporterNindirect_targets]substitution_defs}(hhhhhhj jjjj*jj9j-jHj<jWjKjfjZjujijjxjjjjjjjjjjjjjjjjj jjjj)jj8j,jGj;jVjJjejYjtjhjjwjjjjjjjjjjjjjjjjj jjj j(jj7j+jFj:jUjIjdjXjsjgjjvjjjjjjjjjjjjjjjjj jjj j'jj6j*jEj9jTjHjcjWjrjfjjujjjjjjjjjjjjjjjjjjjj j&jj5j)jDj8usubstitution_names}(amphߌaposhasthbrvbarj bsoljcentj*colonj9commajHcommatjWcopyjfcurrenjudarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34j frac38jfrac58j)frac78j8gtjGhalfjVhorbarjehyphenjtiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquoj ltjmicroj(middotj7nbspjFnotjUnumjdohmjsordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotj raquojrarrj'rcubj6rdquojEregjTrparjcrsqbjrrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3jtimesjtradejuarrj&verbarj5yenjDurefnames}refids}nameids}(j j jjjLjIjDjAj j jjj8 j5 j j j j j j j j u nametypes}(j NjNjLNjDNj NjNj8 Nj Nj Nj Nj Nuh}(j jIjj,jIjjAjHj jOjjj5 jj j; 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(NNNNtGCh(NNNNtKVe decorationNhhub.