€•ÃŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ3/translations/zh_CN/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/zh_TW/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/it_IT/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ja_JP/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ko_KR/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/pt_BR/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/sp_SP/driver-api/vfio-mediated-device”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒM/var/lib/git/docbuild/linux/Documentation/driver-api/vfio-mediated-device.rst”h´Kubh¶)�”}”(hŒ4This data file has been placed in the public domain.”h]”hŒ4This data file has been placed in the public domain.”…”�”}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³Œo/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txt”h´Kubh¶)�”}”(hŒ¸Derived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .”h]”hŒ¸Derived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .”…”�”}”hh×sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÖh´KubhŒsubstitution_definition”“”)�”}”(hŒ*.. |amp| unicode:: U+00026 .. AMPERSAND”h]”hŒ&”…”�”}”hhçsbah}”(h]”h ]”h"]”Œamp”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ+.. |apos| unicode:: U+00027 .. APOSTROPHE”h]”hŒ'”…”�”}”hhösbah}”(h]”h ]”h"]”Œapos”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ).. |ast| unicode:: U+0002A .. ASTERISK”h]”hŒ*”…”�”}”hjsbah}”(h]”h ]”h"]”Œast”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR”h]”hŒ¦”…”�”}”hjsbah}”(h]”h ]”h"]”Œbrvbar”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUS”h]”hŒ\”…”�”}”hj#sbah}”(h]”h ]”h"]”Œbsol”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ*.. |cent| unicode:: U+000A2 .. CENT SIGN”h]”hŒ¢”…”�”}”hj2sbah}”(h]”h ]”h"]”Œcent”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ&.. |colon| unicode:: U+0003A .. COLON”h]”hŒ:”…”�”}”hjAsbah}”(h]”h ]”h"]”Œcolon”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ&.. |comma| unicode:: U+0002C .. COMMA”h]”hŒ,”…”�”}”hjPsbah}”(h]”h ]”h"]”Œcomma”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |commat| unicode:: U+00040 .. COMMERCIAL AT”h]”hŒ@”…”�”}”hj_sbah}”(h]”h ]”h"]”Œcommat”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN”h]”hŒ©”…”�”}”hjnsbah}”(h]”h ]”h"]”Œcopy”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |curren| unicode:: U+000A4 .. CURRENCY SIGN”h]”hŒ¤”…”�”}”hj}sbah}”(h]”h ]”h"]”Œcurren”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW”h]”hŒ↓”…”�”}”hjŒsbah}”(h]”h ]”h"]”Œdarr”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |deg| unicode:: U+000B0 .. DEGREE SIGN”h]”hŒ°”…”�”}”hj›sbah}”(h]”h ]”h"]”Œdeg”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |divide| unicode:: U+000F7 .. DIVISION SIGN”h]”hŒ÷”…”�”}”hjªsbah}”(h]”h ]”h"]”Œdivide”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |dollar| unicode:: U+00024 .. DOLLAR SIGN”h]”hŒ$”…”�”}”hj¹sbah}”(h]”h ]”h"]”Œdollar”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |equals| unicode:: U+0003D .. EQUALS SIGN”h]”hŒ=”…”�”}”hjÈsbah}”(h]”h ]”h"]”Œequals”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ1.. |excl| unicode:: U+00021 .. EXCLAMATION MARK”h]”hŒ!”…”�”}”hj×sbah}”(h]”h ]”h"]”Œexcl”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF”h]”hŒ½”…”�”}”hjæsbah}”(h]”h ]”h"]”Œfrac12”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER”h]”hŒ¼”…”�”}”hjõsbah}”(h]”h ]”h"]”Œfrac14”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH”h]”hŒâ…›”…”�”}”hjsbah}”(h]”h ]”h"]”Œfrac18”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS”h]”hŒ¾”…”�”}”hjsbah}”(h]”h ]”h"]”Œfrac34”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS”h]”hŒâ…œ”…”�”}”hj"sbah}”(h]”h ]”h"]”Œfrac38”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS”h]”hŒâ…�”…”�”}”hj1sbah}”(h]”h ]”h"]”Œfrac58”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS”h]”hŒâ…ž”…”�”}”hj@sbah}”(h]”h ]”h"]”Œfrac78”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN”h]”hŒ>”…”�”}”hjOsbah}”(h]”h ]”h"]”Œgt”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALF”h]”hŒ½”…”�”}”hj^sbah}”(h]”h ]”h"]”Œhalf”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ/.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR”h]”hŒ―”…”�”}”hjmsbah}”(h]”h ]”h"]”Œhorbar”ah$]”h&]”uh1håh³hÖh´K!hhh²hubhæ)�”}”(hŒ'.. |hyphen| unicode:: U+02010 .. HYPHEN”h]”hŒâ€�”…”�”}”hj|sbah}”(h]”h ]”h"]”Œhyphen”ah$]”h&]”uh1håh³hÖh´K"hhh²hubhæ)�”}”(hŒ:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK”h]”hŒ¡”…”�”}”hj‹sbah}”(h]”h ]”h"]”Œiexcl”ah$]”h&]”uh1håh³hÖh´K#hhh²hubhæ)�”}”(hŒ7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK”h]”hŒ¿”…”�”}”hjšsbah}”(h]”h ]”h"]”Œiquest”ah$]”h&]”uh1håh³hÖh´K$hhh²hubhæ)�”}”(hŒJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK”h]”hŒ«”…”�”}”hj©sbah}”(h]”h ]”h"]”Œlaquo”ah$]”h&]”uh1håh³hÖh´K%hhh²hubhæ)�”}”(hŒ0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW”h]”hŒâ†�”…”�”}”hj¸sbah}”(h]”h ]”h"]”Œlarr”ah$]”h&]”uh1håh³hÖh´K&hhh²hubhæ)�”}”(hŒ3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKET”h]”hŒ{”…”�”}”hjÇsbah}”(h]”h ]”h"]”Œlcub”ah$]”h&]”uh1håh³hÖh´K'hhh²hubhæ)�”}”(hŒ;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK”h]”hŒ“”…”�”}”hjÖsbah}”(h]”h ]”h"]”Œldquo”ah$]”h&]”uh1håh³hÖh´K(hhh²hubhæ)�”}”(hŒ).. |lowbar| unicode:: U+0005F .. LOW LINE”h]”hŒ_”…”�”}”hjåsbah}”(h]”h ]”h"]”Œlowbar”ah$]”h&]”uh1håh³hÖh´K)hhh²hubhæ)�”}”(hŒ1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESIS”h]”hŒ(”…”�”}”hjôsbah}”(h]”h ]”h"]”Œlpar”ah$]”h&]”uh1håh³hÖh´K*hhh²hubhæ)�”}”(hŒ4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKET”h]”hŒ[”…”�”}”hjsbah}”(h]”h ]”h"]”Œlsqb”ah$]”h&]”uh1håh³hÖh´K+hhh²hubhæ)�”}”(hŒ;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK”h]”hŒ‘”…”�”}”hjsbah}”(h]”h ]”h"]”Œlsquo”ah$]”h&]”uh1håh³hÖh´K,hhh²hubhæ)�”}”(hŒ/.. |lt| unicode:: U+0003C .. LESS-THAN SIGN”h]”hŒ<”…”�”}”hj!sbah}”(h]”h ]”h"]”Œlt”ah$]”h&]”uh1håh³hÖh´K-hhh²hubhæ)�”}”(hŒ+.. |micro| unicode:: U+000B5 .. MICRO SIGN”h]”hŒµ”…”�”}”hj0sbah}”(h]”h ]”h"]”Œmicro”ah$]”h&]”uh1håh³hÖh´K.hhh²hubhæ)�”}”(hŒ+.. |middot| unicode:: U+000B7 .. MIDDLE DOT”h]”hŒ·”…”�”}”hj?sbah}”(h]”h ]”h"]”Œmiddot”ah$]”h&]”uh1håh³hÖh´K/hhh²hubhæ)�”}”(hŒ/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE”h]”hŒ ”…”�”}”hjNsbah}”(h]”h ]”h"]”Œnbsp”ah$]”h&]”uh1håh³hÖh´K0hhh²hubhæ)�”}”(hŒ).. |not| unicode:: U+000AC .. NOT SIGN”h]”hŒ¬”…”�”}”hj]sbah}”(h]”h ]”h"]”Œnot”ah$]”h&]”uh1håh³hÖh´K1hhh²hubhæ)�”}”(hŒ,.. |num| unicode:: U+00023 .. NUMBER SIGN”h]”hŒ#”…”�”}”hjlsbah}”(h]”h ]”h"]”Œnum”ah$]”h&]”uh1håh³hÖh´K2hhh²hubhæ)�”}”(hŒ).. |ohm| unicode:: U+02126 .. OHM SIGN”h]”hŒΩ”…”�”}”hj{sbah}”(h]”h ]”h"]”Œohm”ah$]”h&]”uh1håh³hÖh´K3hhh²hubhæ)�”}”(hŒ;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR”h]”hŒª”…”�”}”hjŠsbah}”(h]”h ]”h"]”Œordf”ah$]”h&]”uh1håh³hÖh´K4hhh²hubhæ)�”}”(hŒ<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR”h]”hŒº”…”�”}”hj™sbah}”(h]”h ]”h"]”Œordm”ah$]”h&]”uh1håh³hÖh´K5hhh²hubhæ)�”}”(hŒ-.. |para| unicode:: U+000B6 .. PILCROW SIGN”h]”hŒ¶”…”�”}”hj¨sbah}”(h]”h ]”h"]”Œpara”ah$]”h&]”uh1håh³hÖh´K6hhh²hubhæ)�”}”(hŒ-.. |percnt| unicode:: U+00025 .. PERCENT SIGN”h]”hŒ%”…”�”}”hj·sbah}”(h]”h ]”h"]”Œpercnt”ah$]”h&]”uh1håh³hÖh´K7hhh²hubhæ)�”}”(hŒ*.. |period| unicode:: U+0002E .. FULL STOP”h]”hŒ.”…”�”}”hjÆsbah}”(h]”h ]”h"]”Œperiod”ah$]”h&]”uh1håh³hÖh´K8hhh²hubhæ)�”}”(hŒ*.. |plus| unicode:: U+0002B .. PLUS SIGN”h]”hŒ+”…”�”}”hjÕsbah}”(h]”h ]”h"]”Œplus”ah$]”h&]”uh1håh³hÖh´K9hhh²hubhæ)�”}”(hŒ0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN”h]”hŒ±”…”�”}”hjäsbah}”(h]”h ]”h"]”Œplusmn”ah$]”h&]”uh1håh³hÖh´K:hhh²hubhæ)�”}”(hŒ+.. |pound| unicode:: U+000A3 .. POUND SIGN”h]”hŒ£”…”�”}”hjósbah}”(h]”h ]”h"]”Œpound”ah$]”h&]”uh1håh³hÖh´K;hhh²hubhæ)�”}”(hŒ... |quest| unicode:: U+0003F .. QUESTION MARK”h]”hŒ?”…”�”}”hjsbah}”(h]”h ]”h"]”Œquest”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW”h]”hŒ→”…”�”}”hj/sbah}”(h]”h ]”h"]”Œrarr”ah$]”h&]”uh1håh³hÖh´K?hhh²hubhæ)�”}”(hŒ4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKET”h]”hŒ}”…”�”}”hj>sbah}”(h]”h ]”h"]”Œrcub”ah$]”h&]”uh1håh³hÖh´K@hhh²hubhæ)�”}”(hŒ<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK”h]”hŒâ€�”…”�”}”hjMsbah}”(h]”h ]”h"]”Œrdquo”ah$]”h&]”uh1håh³hÖh´KAhhh²hubhæ)�”}”(hŒ0.. |reg| unicode:: U+000AE .. REGISTERED SIGN”h]”hŒ®”…”�”}”hj\sbah}”(h]”h ]”h"]”Œreg”ah$]”h&]”uh1håh³hÖh´KBhhh²hubhæ)�”}”(hŒ2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESIS”h]”hŒ)”…”�”}”hjksbah}”(h]”h ]”h"]”Œrpar”ah$]”h&]”uh1håh³hÖh´KChhh²hubhæ)�”}”(hŒ5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKET”h]”hŒ]”…”�”}”hjzsbah}”(h]”h ]”h"]”Œrsqb”ah$]”h&]”uh1håh³hÖh´KDhhh²hubhæ)�”}”(hŒ<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK”h]”hŒ’”…”�”}”hj‰sbah}”(h]”h ]”h"]”Œrsquo”ah$]”h&]”uh1håh³hÖh´KEhhh²hubhæ)�”}”(hŒ-.. |sect| unicode:: U+000A7 .. SECTION SIGN”h]”hŒ§”…”�”}”hj˜sbah}”(h]”h ]”h"]”Œsect”ah$]”h&]”uh1håh³hÖh´KFhhh²hubhæ)�”}”(hŒ*.. |semi| unicode:: U+0003B .. SEMICOLON”h]”hŒ;”…”�”}”hj§sbah}”(h]”h ]”h"]”Œsemi”ah$]”h&]”uh1håh³hÖh´KGhhh²hubhæ)�”}”(hŒ,.. |shy| unicode:: U+000AD .. SOFT HYPHEN”h]”hŒ­”…”�”}”hj¶sbah}”(h]”h ]”h"]”Œshy”ah$]”h&]”uh1håh³hÖh´KHhhh²hubhæ)�”}”(hŒ(.. |sol| unicode:: U+0002F .. SOLIDUS”h]”hŒ/”…”�”}”hjÅsbah}”(h]”h ]”h"]”Œsol”ah$]”h&]”uh1håh³hÖh´KIhhh²hubhæ)�”}”(hŒ,.. |sung| unicode:: U+0266A .. EIGHTH NOTE”h]”hŒ♪”…”�”}”hjÔsbah}”(h]”h ]”h"]”Œsung”ah$]”h&]”uh1håh³hÖh´KJhhh²hubhæ)�”}”(hŒ0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE”h]”hŒ¹”…”�”}”hjãsbah}”(h]”h ]”h"]”Œsup1”ah$]”h&]”uh1håh³hÖh´KKhhh²hubhæ)�”}”(hŒ0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO”h]”hŒ²”…”�”}”hjòsbah}”(h]”h ]”h"]”Œsup2”ah$]”h&]”uh1håh³hÖh´KLhhh²hubhæ)�”}”(hŒ2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE”h]”hŒ³”…”�”}”hjsbah}”(h]”h ]”h"]”Œsup3”ah$]”h&]”uh1håh³hÖh´KMhhh²hubhæ)�”}”(hŒ4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN”h]”hŒ×”…”�”}”hjsbah}”(h]”h ]”h"]”Œtimes”ah$]”h&]”uh1håh³hÖh´KNhhh²hubhæ)�”}”(hŒ0.. |trade| unicode:: U+02122 .. TRADE MARK SIGN”h]”hŒâ„¢”…”�”}”hjsbah}”(h]”h ]”h"]”Œtrade”ah$]”h&]”uh1håh³hÖh´KOhhh²hubhæ)�”}”(hŒ... |uarr| unicode:: U+02191 .. UPWARDS ARROW”h]”hŒ↑”…”�”}”hj.sbah}”(h]”h ]”h"]”Œuarr”ah$]”h&]”uh1håh³hÖh´KPhhh²hubhæ)�”}”(hŒ... |verbar| unicode:: U+0007C .. VERTICAL LINE”h]”hŒ|”…”�”}”hj=sbah}”(h]”h ]”h"]”Œverbar”ah$]”h&]”uh1håh³hÖh´KQhhh²hubhæ)�”}”(hŒ*.. |yen| unicode:: U+000A5 .. YEN SIGN ”h]”hŒÂ¥”…”�”}”hjLsbah}”(h]”h ]”h"]”Œyen”ah$]”h&]”uh1håh³hÖh´KRhhh²hubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒVFIO Mediated devices”h]”hŒVFIO Mediated devices”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj]h²hh³hÇh´KubhŒ field_list”“”)�”}”(hhh]”(hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒ Copyright”h]”hŒ Copyright”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhjwh³hÇh´KubhŒ field_body”“”)�”}”(hŒ5|copy| 2016, NVIDIA CORPORATION. All rights reserved.”h]”hŒ paragraph”“”)�”}”(hjŽh]”(hŒ©”…”�”}”(hj’h²hh³Nh´NubhŒ/ 2016, NVIDIA CORPORATION. All rights reserved.”…”�”}”(hj’h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1juh³hÇh´Khjrh²hubjv)�”}”(hhh]”(j{)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhj¯h³hÇh´Kubj‹)�”}”(hŒNeo Jia ”h]”j‘)�”}”(hjÂh]”(hŒ Neo Jia <”…”�”}”(hjÄh²hh³Nh´NubhŒ reference”“”)�”}”(hŒcjia@nvidia.com”h]”hŒcjia@nvidia.com”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:cjia@nvidia.com”uh1jËhjÄubhŒ>”…”�”}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj¯ubeh}”(h]”h ]”h"]”h$]”h&]”uh1juh³hÇh´K hjrh²hubjv)�”}”(hhh]”(j{)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhjóh³hÇh´Kubj‹)�”}”(hŒ(Kirti Wankhede ”h]”j‘)�”}”(hŒ%Kirti Wankhede ”h]”(hŒKirti Wankhede <”…”�”}”(hjh²hh³Nh´NubjÌ)�”}”(hŒkwankhede@nvidia.com”h]”hŒkwankhede@nvidia.com”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:kwankhede@nvidia.com”uh1jËhjubhŒ>”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1juh³hÇh´K hjrh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jphj]h²hh³hÇh´Kubj\)�”}”(hhh]”(ja)�”}”(hŒ/Virtual Function I/O (VFIO) Mediated devices[1]”h]”hŒ/Virtual Function I/O (VFIO) Mediated devices[1]”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj<h²hh³hÇh´Kubj‘)�”}”(hXšThe 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]”hXšThe 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.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khj<h²hubj‘)�”}”(hXÔThe 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]”hXÔThe 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[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khj<h²hubj‘)�”}”(hŒËThe 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]”hŒËThe 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:”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khj<h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ$Create and destroy a mediated device”h]”j‘)�”}”(hj€h]”hŒ$Create and destroy a mediated device”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K#hj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjyh²hh³hÇh´Nubj})�”}”(hŒAAdd a mediated device to and remove it from a mediated bus driver”h]”j‘)�”}”(hj—h]”hŒAAdd a mediated device to and remove it from a mediated bus driver”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K$hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjyh²hh³hÇh´Nubj})�”}”(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 group”h]”hŒ:Add a mediated device to and remove it from an IOMMU group”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K%hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjyh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jwh³hÇh´K#hj<h²hubj‘)�”}”(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.”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K'hj<h²hubj‘)�”}”(hŒðThe 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]”hŒïThe 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:”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K,hj<h²hubhŒ 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 +--------------+ | +-----------+ | +---------------+”…”�”}”hjêsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´K0hj<h²hubeh}”(h]”Œ,virtual-function-i-o-vfio-mediated-devices-1”ah ]”h"]”Œ/virtual function i/o (vfio) mediated devices[1]”ah$]”h&]”uh1j[hj]h²hh³hÇh´Kubj\)�”}”(hhh]”(ja)�”}”(hŒRegistration Interfaces”h]”hŒRegistration Interfaces”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjh²hh³hÇh´KMubj‘)�”}”(hŒQThe mediated core driver provides the following types of registration interfaces:”h]”hŒQThe mediated core driver provides the following types of registration interfaces:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KOhjh²hubjx)�”}”(hhh]”(j})�”}”(hŒ0Registration interface for a mediated bus driver”h]”j‘)�”}”(hj$h]”hŒ0Registration interface for a mediated bus driver”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KRhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjh²hh³hÇh´Nubj})�”}”(hŒ!Physical device driver interface ”h]”j‘)�”}”(hŒ Physical device driver interface”h]”hŒ Physical device driver interface”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KShj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÊjËuh1jwh³hÇh´KRhjh²hubj\)�”}”(hhh]”(ja)�”}”(hŒ0Registration Interface for a Mediated Bus Driver”h]”hŒ0Registration Interface for a Mediated Bus Driver”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjWh²hh³hÇh´KVubj‘)�”}”(hŒ‚The registration interface for a mediated device driver provides the following structure to represent a mediated device's driver::”h]”hŒƒThe registration interface for a mediated device driver provides the following structure to represent a mediated device’s driver:”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KXhjWh²hubjé)�”}”(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&]”hÅhÆuh1jèh³hÇh´K[hjWh²hubj‘)�”}”(hŒ†A mediated bus driver for mdev should use this structure in the function calls to register and unregister itself with the core driver:”h]”hŒ†A mediated bus driver for mdev should use this structure in the function calls to register and unregister itself with the core driver:”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KihjWh²hubjx)�”}”(hhh]”(j})�”}”(hŒARegister:: int mdev_register_driver(struct mdev_driver *drv); ”h]”(j‘)�”}”(hŒ Register::”h]”hŒ Register:”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Klhj•ubjé)�”}”(hŒ2int mdev_register_driver(struct mdev_driver *drv);”h]”hŒ2int mdev_register_driver(struct mdev_driver *drv);”…”�”}”hj§sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´Knhj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj’h²hh³hÇh´Nubj})�”}”(hŒFUnregister:: void mdev_unregister_driver(struct mdev_driver *drv); ”h]”(j‘)�”}”(hŒ Unregister::”h]”hŒ Unregister:”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kphj»ubjé)�”}”(hŒ5void mdev_unregister_driver(struct mdev_driver *drv);”h]”hŒ5void mdev_unregister_driver(struct mdev_driver *drv);”…”�”}”hjÍsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´Krhj»ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj’h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÊjËuh1jwh³hÇh´KlhjWh²hubj‘)�”}”(hŒ¢The 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]”hŒ¤The 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.”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KthjWh²hubj‘)�”}”(hŒpWhen a driver wants to add the GUID creation sysfs to an existing device it has probe'd to then it should call::”h]”hŒqWhen a driver wants to add the GUID creation sysfs to an existing device it has probe’d to then it should call:”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KxhjWh²hubjé)�”}”(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&]”hÅhÆuh1jèh³hÇh´K{hjWh²hubj‘)�”}”(hŒ¿This 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]”hŒÃThis 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.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K~hjWh²hubj‘)�”}”(hŒ1When the driver needs to remove itself it calls::”h]”hŒ0When the driver needs to remove itself it calls:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K‚hjWh²hubjé)�”}”(hŒ8void mdev_unregister_parent(struct mdev_parent *parent);”h]”hŒ8void mdev_unregister_parent(struct mdev_parent *parent);”…”�”}”hj-sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´K„hjWh²hubj‘)�”}”(hŒOWhich will unbind and destroy all the created mdevs and remove the sysfs files.”h]”hŒOWhich will unbind and destroy all the created mdevs and remove the sysfs files.”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K†hjWh²hubeh}”(h]”Œ0registration-interface-for-a-mediated-bus-driver”ah ]”h"]”Œ0registration interface for a mediated bus driver”ah$]”h&]”uh1j[hjh²hh³hÇh´KVubeh}”(h]”Œregistration-interfaces”ah ]”h"]”Œregistration interfaces”ah$]”h&]”uh1j[hj]h²hh³hÇh´KMubj\)�”}”(hhh]”(ja)�”}”(hŒ2Mediated Device Management Interface Through sysfs”h]”hŒ2Mediated Device Management Interface Through sysfs”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjYh²hh³hÇh´K‰ubj‘)�”}”(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:”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K‹hjYh²hubjx)�”}”(hhh]”(j})�”}”(hŒMediated device hot plug”h]”j‘)�”}”(hj}h]”hŒMediated device hot plug”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K�hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjxh²hh³hÇh´Nubj})�”}”(hŒ5Multiple mediated devices in a single virtual machine”h]”j‘)�”}”(hj”h]”hŒ5Multiple mediated devices in a single virtual machine”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K‘hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjxh²hh³hÇh´Nubj})�”}”(hŒ:Multiple mediated devices from different physical devices ”h]”j‘)�”}”(hŒ9Multiple mediated devices from different physical devices”h]”hŒ9Multiple mediated devices from different physical devices”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K’hj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjxh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÊjËuh1jwh³hÇh´K�hjYh²hubj\)�”}”(hhh]”(ja)�”}”(hŒ%Links in the mdev_bus Class Directory”h]”hŒ%Links in the mdev_bus Class Directory”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjÇh²hh³hÇh´K•ubj‘)�”}”(hŒkThe /sys/class/mdev_bus/ directory contains links to devices that are registered with the mdev core driver.”h]”hŒkThe /sys/class/mdev_bus/ directory contains links to devices that are registered with the mdev core driver.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K–hjÇh²hubeh}”(h]”Œ%links-in-the-mdev-bus-class-directory”ah ]”h"]”Œ%links in the mdev_bus class directory”ah$]”h&]”uh1j[hjYh²hh³hÇh´K•ubj\)�”}”(hhh]”(ja)�”}”(hŒ>Directories and files under the sysfs for Each Physical Device”h]”hŒ>Directories and files under the sysfs for Each Physical Device”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjîh²hh³hÇh´Kšubjé)�”}”(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]”…”�”}”hjÿsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´Kžhjîh²hubjx)�”}”(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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K·hj ubj‘)�”}”(hŒHThe list of currently supported mediated device types and their details.”h]”hŒHThe list of currently supported mediated device types and their details.”…”�”}”(hj" h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K¹hj ubj‘)�”}”(hŒs[], device_api, and available_instances are mandatory attributes that should be provided by vendor driver.”h]”hŒs[], device_api, and available_instances are mandatory attributes that should be provided by vendor driver.”…”�”}”(hj0 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K»hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K¾hjD ubj‘)�”}”(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::”h]”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:”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÀhjD ubjé)�”}”(hŒCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);”h]”hŒCsprintf(buf, "%s-%s", dev_driver_string(parent->dev), group->name);”…”�”}”hjd sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´KÄhjD ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(hŒndevice_api This attribute shows which device API is being created, for example, "vfio-pci" for a PCI device. ”h]”(j‘)�”}”(hŒ device_api”h]”hŒ device_api”…”�”}”(hj| h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÆhjx ubj‘)�”}”(hŒaThis attribute shows which device API is being created, for example, "vfio-pci" for a PCI device.”h]”hŒeThis attribute shows which device API is being created, for example, “vfio-pciâ€� for a PCI device.”…”�”}”(hjŠ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÈhjx ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(hŒgavailable_instances This attribute shows the number of devices of type that can be created. ”h]”(j‘)�”}”(hŒavailable_instances”h]”hŒavailable_instances”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KËhjž ubj‘)�”}”(hŒQThis attribute shows the number of devices of type that can be created.”h]”hŒQThis attribute shows the number of devices of type that can be created.”…”�”}”(hj° h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÍhjž ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(hŒa[device] This directory contains links to the devices of type that have been created. ”h]”(j‘)�”}”(hŒ[device]”h]”hŒ[device]”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÐhjÄ ubj‘)�”}”(hŒVThis directory contains links to the devices of type that have been created.”h]”hŒVThis directory contains links to the devices of type that have been created.”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÒhjÄ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(hŒ2name This attribute shows a human readable name. ”h]”(j‘)�”}”(hŒname”h]”hŒname”…”�”}”(hjî h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÕhjê ubj‘)�”}”(hŒ+This attribute shows a human readable name.”h]”hŒ+This attribute shows a human readable name.”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K×hjê ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubj})�”}”(hŒldescription This attribute can show brief features/description of the type. This is an optional attribute. ”h]”(j‘)�”}”(hŒ description”h]”hŒ description”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÙhj 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" h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÛhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÊjËuh1jwh³hÇh´K·hjîh²hubeh}”(h]”Œ>directories-and-files-under-the-sysfs-for-each-physical-device”ah ]”h"]”Œ>directories and files under the sysfs for each physical device”ah$]”h&]”uh1j[hjYh²hh³hÇh´Kšubj\)�”}”(hhh]”(ja)�”}”(hŒ:Directories and Files Under the sysfs for Each mdev Device”h]”hŒ:Directories and Files Under the sysfs for Each mdev Device”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjD h²hh³hÇh´Kßubjé)�”}”(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&]”hÅhÆuh1jèh³hÇh´KãhjD h²hubjx)�”}”(hhh]”j})�”}”(hŒremove (write only) ”h]”j‘)�”}”(hŒremove (write only)”h]”hŒremove (write only)”…”�”}”(hjj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kéhjf ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjc h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jÊjËuh1jwh³hÇh´KéhjD h²hubj‘)�”}”(hŒ¶Writing '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]”hŒÀWriting ‘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„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KëhjD h²hubj‘)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KïhjD h²hubjé)�”}”(hŒ2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove”h]”hŒ2# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove”…”�”}”hj  sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jèh³hÇh´KñhjD h²hubeh}”(h]”Œ:directories-and-files-under-the-sysfs-for-each-mdev-device”ah ]”h"]”Œ:directories and files under the sysfs for each mdev device”ah$]”h&]”uh1j[hjYh²hh³hÇh´Kßubj\)�”}”(hhh]”(ja)�”}”(hŒMediated device Hot plug”h]”hŒMediated device Hot plug”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj¶ h²hh³hÇh´Kôubj‘)�”}”(hŒ›Mediated 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]”hŒ›Mediated 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Ç h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Köhj¶ h²hubeh}”(h]”Œmediated-device-hot-plug”ah ]”h"]”Œmediated device hot plug”ah$]”h&]”uh1j[hjYh²hh³hÇh´Kôubeh}”(h]”Œ2mediated-device-management-interface-through-sysfs”ah ]”h"]”Œ2mediated device management interface through sysfs”ah$]”h&]”uh1j[hj]h²hh³hÇh´K‰ubj\)�”}”(hhh]”(ja)�”}”(hŒ%Translation APIs for Mediated Devices”h]”hŒ%Translation APIs for Mediated Devices”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjå h²hh³hÇh´Kúubj‘)�”}”(hŒWThe following APIs are provided for translating user pfn to host pfn in a VFIO driver::”h]”hŒVThe following APIs are provided for translating user pfn to host pfn in a VFIO driver:”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kühjå h²hubjé)�”}”(hŒðint 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]”hŒðint 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&]”hÅhÆuh1jèh³hÇh´Kÿhjå h²hubj‘)�”}”(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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhjå h²hubeh}”(h]”Œ%translation-apis-for-mediated-devices”ah ]”h"]”Œ%translation apis for mediated devices”ah$]”h&]”uh1j[hj]h²hh³hÇh´Kúubj\)�”}”(hhh]”(ja)�”}”(hŒ References”h]”hŒ References”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj( h²hh³hÇh´M ubhŒenumerated_list”“”)�”}”(hhh]”(j})�”}”(hŒCSee Documentation/driver-api/vfio.rst for more information on VFIO.”h]”j‘)�”}”(hj@ h]”hŒCSee Documentation/driver-api/vfio.rst for more information on VFIO.”…”�”}”(hjB h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhj> ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj; h²hh³hÇh´Nubj})�”}”(hŒ*struct mdev_driver in include/linux/mdev.h”h]”j‘)�”}”(hjW h]”hŒ*struct mdev_driver in include/linux/mdev.h”…”�”}”(hjY h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´MhjU ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj; h²hh³hÇh´Nubj})�”}”(hŒ.struct mdev_parent_ops in include/linux/mdev.h”h]”j‘)�”}”(hjn h]”hŒ.struct mdev_parent_ops in include/linux/mdev.h”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhjl ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj; h²hh³hÇh´Nubj})�”}”(hŒ4struct vfio_iommu_driver_ops in include/linux/vfio.h”h]”j‘)�”}”(hj… h]”hŒ4struct vfio_iommu_driver_ops in include/linux/vfio.h”…”�”}”(hj‡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhjƒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj; h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j9 hj( h²hh³hÇh´Mubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1j[hj]h²hh³hÇh´M ubeh}”(h]”Œvfio-mediated-devices”ah ]”h"]”Œvfio mediated devices”ah$]”h&]”uh1j[hhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(j`NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jØ Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”(hóhçjhöjjj jj/j#j>j2jMjAj\jPjkj_jzjnj‰j}j˜jŒj§j›j¶jªjÅj¹jÔjÈjãj×jòjæjjõjjjjj.j"j=j1jLj@j[jOjjj^jyjmjˆj|j—j‹j¦jšjµj©jÄj¸jÓjÇjâjÖjñjåjjôjjjjj-j!j<j0jKj?jZjNjij]jxjlj‡j{j–jŠj¥j™j´j¨jÃj·jÒjÆjájÕjðjäjÿjójjjjj,j j;j/jJj>jYjMjhj\jwjkj†jzj•j‰j¤j˜j³j§jÂj¶jÑjÅjàjÔjïjãjþjòj jjjj+jj:j.jIj=jXjLuŒsubstitution_names”}”(Œamp”hóŒapos”jŒast”jŒbrvbar”j Œbsol”j/Œcent”j>Œcolon”jMŒcomma”j\Œcommat”jkŒcopy”jzŒcurren”j‰Œdarr”j˜Œdeg”j§Œdivide”j¶Œdollar”jÅŒequals”jÔŒexcl”jãŒfrac12”jòŒfrac14”jŒfrac18”jŒfrac34”jŒfrac38”j.Œfrac58”j=Œfrac78”jLŒgt”j[Œhalf”jjŒhorbar”jyŒhyphen”jˆŒiexcl”j—Œiquest”j¦Œlaquo”jµŒlarr”jÄŒlcub”jÓŒldquo”jâŒlowbar”jñŒlpar”jŒlsqb”jŒlsquo”jŒlt”j-Œmicro”j<Œmiddot”jKŒnbsp”jZŒnot”jiŒnum”jxŒohm”j‡Œordf”j–Œordm”j¥Œpara”j´Œpercnt”jÃŒperiod”jÒŒplus”jáŒplusmn”jðŒpound”jÿŒquest”jŒquot”jŒraquo”j,Œrarr”j;Œrcub”jJŒrdquo”jYŒreg”jhŒrpar”jwŒrsqb”j†Œrsquo”j•Œsect”j¤Œsemi”j³Œshy”jÂŒsol”jÑŒsung”jàŒsup1”jïŒsup2”jþŒsup3”j Œtimes”jŒtrade”j+Œuarr”j:Œverbar”jIŒyen”jXuŒrefnames”}”Œrefids”}”Œnameids”}”(j² j¯ jýjújVjSjNjKjâ jß jëjèjA j> j³ j° jÚ j× j% j" jª j§ uŒ nametypes”}”(j² ‰jý‰jV‰jN‰jâ ‰jë‰jA ‰j³ ‰jÚ ‰j% ‰jª ‰uh}”(j¯ j]júj<jSjjKjWjß jYjèjÇj> jîj° jD j× j¶ j" jå j§ j( uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ1Documentation/driver-api/vfio-mediated-device.rst”(NNNNt”†”aŒ decoration”Nh²hub.