€•°Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ!/translations/zh_CN/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/zh_TW/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/it_IT/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ja_JP/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ko_KR/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/pt_BR/PCI/msi-howto”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/sp_SP/PCI/msi-howto”Œ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”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ;/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto.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ŒThe MSI Driver Guide HOWTO”h]”hŒThe MSI Driver Guide HOWTO”…”�”}”(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ŒAuthors”h]”hŒAuthors”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhjwh³hÇh´KubhŒ field_body”“”)�”}”(hŒ1Tom L Nguyen; Martine Silbermann; Matthew Wilcox ”h]”hŒ paragraph”“”)�”}”(hŒ0Tom L Nguyen; Martine Silbermann; Matthew Wilcox”h]”hŒ0Tom L Nguyen; Martine Silbermann; Matthew Wilcox”…”�”}”(hj’h²hh³Nh´Nubah}”(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Œ Copyright”h]”hŒ Copyright”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jzhj¬h³hÇh´Kubj‹)�”}”(hŒ2003, 2008 Intel Corporation ”h]”j‘)�”}”(hŒ2003, 2008 Intel Corporation”h]”hŒ2003, 2008 Intel Corporation”…”�”}”(hjÁh²hh³Nh´Nubah}”(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²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jphj]h²hh³hÇh´Kubj\)�”}”(hhh]”(ja)�”}”(hŒAbout this guide”h]”hŒAbout this guide”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjáh²hh³hÇh´K ubj‘)�”}”(hŒûThis guide describes the basics of Message Signaled Interrupts (MSIs), the advantages of using MSI over traditional interrupt mechanisms, how to change your driver to use MSI or MSI-X and some basic diagnostics to try if a device doesn't support MSIs.”h]”hŒýThis guide describes the basics of Message Signaled Interrupts (MSIs), the advantages of using MSI over traditional interrupt mechanisms, how to change your driver to use MSI or MSI-X and some basic diagnostics to try if a device doesn’t support MSIs.”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khjáh²hubeh}”(h]”Œabout-this-guide”ah ]”h"]”Œabout this guide”ah$]”h&]”uh1j[hj]h²hh³hÇh´K ubj\)�”}”(hhh]”(ja)�”}”(hŒWhat are MSIs?”h]”hŒWhat are MSIs?”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjh²hh³hÇh´Kubj‘)�”}”(hŒ�A Message Signaled Interrupt is a write from the device to a special address which causes an interrupt to be received by the CPU.”h]”hŒ�A Message Signaled Interrupt is a write from the device to a special address which causes an interrupt to be received by the CPU.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khjh²hubj‘)�”}”(hX%The MSI capability was first specified in PCI 2.2 and was later enhanced in PCI 3.0 to allow each interrupt to be masked individually. The MSI-X capability was also introduced with PCI 3.0. It supports more interrupts per device than MSI and allows interrupts to be independently configured.”h]”hX%The MSI capability was first specified in PCI 2.2 and was later enhanced in PCI 3.0 to allow each interrupt to be masked individually. The MSI-X capability was also introduced with PCI 3.0. It supports more interrupts per device than MSI and allows interrupts to be independently configured.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Khjh²hubj‘)�”}”(hŒNDevices may support both MSI and MSI-X, but only one can be enabled at a time.”h]”hŒNDevices may support both MSI and MSI-X, but only one can be enabled at a time.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K hjh²hubeh}”(h]”Œ what-are-msis”ah ]”h"]”Œwhat are msis?”ah$]”h&]”uh1j[hj]h²hh³hÇh´Kubj\)�”}”(hhh]”(ja)�”}”(hŒ Why use MSIs?”h]”hŒ Why use MSIs?”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjKh²hh³hÇh´K%ubj‘)�”}”(hŒcThere are three reasons why using MSIs can give an advantage over traditional pin-based interrupts.”h]”hŒcThere are three reasons why using MSIs can give an advantage over traditional pin-based interrupts.”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K'hjKh²hubj‘)�”}”(hXPin-based PCI interrupts are often shared amongst several devices. To support this, the kernel must call each interrupt handler associated with an interrupt, which leads to reduced performance for the system as a whole. MSIs are never shared, so this problem cannot arise.”h]”hXPin-based PCI interrupts are often shared amongst several devices. To support this, the kernel must call each interrupt handler associated with an interrupt, which leads to reduced performance for the system as a whole. MSIs are never shared, so this problem cannot arise.”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K*hjKh²hubj‘)�”}”(hX¯When a device writes data to memory, then raises a pin-based interrupt, it is possible that the interrupt may arrive before all the data has arrived in memory (this becomes more likely with devices behind PCI-PCI bridges). In order to ensure that all the data has arrived in memory, the interrupt handler must read a register on the device which raised the interrupt. PCI transaction ordering rules require that all the data arrive in memory before the value may be returned from the register. Using MSIs avoids this problem as the interrupt-generating write cannot pass the data writes, so by the time the interrupt is raised, the driver knows that all the data has arrived in memory.”h]”hX¯When a device writes data to memory, then raises a pin-based interrupt, it is possible that the interrupt may arrive before all the data has arrived in memory (this becomes more likely with devices behind PCI-PCI bridges). In order to ensure that all the data has arrived in memory, the interrupt handler must read a register on the device which raised the interrupt. PCI transaction ordering rules require that all the data arrive in memory before the value may be returned from the register. Using MSIs avoids this problem as the interrupt-generating write cannot pass the data writes, so by the time the interrupt is raised, the driver knows that all the data has arrived in memory.”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K/hjKh²hubj‘)�”}”(hXjPCI devices can only support a single pin-based interrupt per function. Often drivers have to query the device to find out what event has occurred, slowing down interrupt handling for the common case. With MSIs, a device can support more interrupts, allowing each interrupt to be specialised to a different purpose. One possible design gives infrequent conditions (such as errors) their own interrupt which allows the driver to handle the normal interrupt handling path more efficiently. Other possible designs include giving one interrupt to each packet queue in a network card or each port in a storage controller.”h]”hXjPCI devices can only support a single pin-based interrupt per function. Often drivers have to query the device to find out what event has occurred, slowing down interrupt handling for the common case. With MSIs, a device can support more interrupts, allowing each interrupt to be specialised to a different purpose. One possible design gives infrequent conditions (such as errors) their own interrupt which allows the driver to handle the normal interrupt handling path more efficiently. Other possible designs include giving one interrupt to each packet queue in a network card or each port in a storage controller.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K:hjKh²hubeh}”(h]”Œ why-use-msis”ah ]”h"]”Œ why use msis?”ah$]”h&]”uh1j[hj]h²hh³hÇh´K%ubj\)�”}”(hhh]”(ja)�”}”(hŒHow to use MSIs”h]”hŒHow to use MSIs”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjœh²hh³hÇh´KFubj‘)�”}”(hXPCI devices are initialised to use pin-based interrupts. The device driver has to set up the device to use MSI or MSI-X. Not all machines support MSIs correctly, and for those machines, the APIs described below will simply fail and the device will continue to use pin-based interrupts.”h]”hXPCI devices are initialised to use pin-based interrupts. The device driver has to set up the device to use MSI or MSI-X. Not all machines support MSIs correctly, and for those machines, the APIs described below will simply fail and the device will continue to use pin-based interrupts.”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KHhjœh²hubj\)�”}”(hhh]”(ja)�”}”(hŒInclude kernel support for MSIs”h]”hŒInclude kernel support for MSIs”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj»h²hh³hÇh´KNubj‘)�”}”(hX0To support MSI or MSI-X, the kernel must be built with the CONFIG_PCI_MSI option enabled. This option is only available on some architectures, and it may depend on some other options also being set. For example, on x86, you must also enable X86_UP_APIC or SMP in order to see the CONFIG_PCI_MSI option.”h]”hX0To support MSI or MSI-X, the kernel must be built with the CONFIG_PCI_MSI option enabled. This option is only available on some architectures, and it may depend on some other options also being set. For example, on x86, you must also enable X86_UP_APIC or SMP in order to see the CONFIG_PCI_MSI option.”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KPhj»h²hubeh}”(h]”Œinclude-kernel-support-for-msis”ah ]”h"]”Œinclude kernel support for msis”ah$]”h&]”uh1j[hjœh²hh³hÇh´KNubj\)�”}”(hhh]”(ja)�”}”(hŒ Using MSI”h]”hŒ Using MSI”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjâh²hh³hÇh´KWubj‘)�”}”(hŒžMost of the hard work is done for the driver in the PCI layer. The driver simply has to request that the PCI layer set up the MSI capability for this device.”h]”hŒžMost of the hard work is done for the driver in the PCI layer. The driver simply has to request that the PCI layer set up the MSI capability for this device.”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KYhjâh²hubj‘)�”}”(hŒQTo automatically use MSI or MSI-X interrupt vectors, use the following function::”h]”hŒPTo automatically use MSI or MSI-X interrupt vectors, use the following function:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K]hjâh²hubhŒ literal_block”“”)�”}”(hŒint pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags);”h]”hŒint pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags);”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´K`hjâh²hubj‘)�”}”(hXTwhich allocates up to max_vecs interrupt vectors for a PCI device. It returns the number of vectors allocated or a negative error. If the device has a requirement for a minimum number of vectors the driver can pass a min_vecs argument set to this limit, and the PCI core will return -ENOSPC if it can't meet the minimum number of vectors.”h]”hXVwhich allocates up to max_vecs interrupt vectors for a PCI device. It returns the number of vectors allocated or a negative error. If the device has a requirement for a minimum number of vectors the driver can pass a min_vecs argument set to this limit, and the PCI core will return -ENOSPC if it can’t meet the minimum number of vectors.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kchjâh²hubj‘)�”}”(hXnThe flags argument is used to specify which type of interrupt can be used by the device and the driver (PCI_IRQ_INTX, PCI_IRQ_MSI, PCI_IRQ_MSIX). A convenient short-hand (PCI_IRQ_ALL_TYPES) is also available to ask for any possible kind of interrupt. If the PCI_IRQ_AFFINITY flag is set, pci_alloc_irq_vectors() will spread the interrupts around the available CPUs.”h]”hXnThe flags argument is used to specify which type of interrupt can be used by the device and the driver (PCI_IRQ_INTX, PCI_IRQ_MSI, PCI_IRQ_MSIX). A convenient short-hand (PCI_IRQ_ALL_TYPES) is also available to ask for any possible kind of interrupt. If the PCI_IRQ_AFFINITY flag is set, pci_alloc_irq_vectors() will spread the interrupts around the available CPUs.”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kihjâh²hubj‘)�”}”(hŒqTo get the Linux IRQ numbers passed to request_irq() and free_irq() and the vectors, use the following function::”h]”hŒpTo get the Linux IRQ numbers passed to request_irq() and free_irq() and the vectors, use the following function:”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kohjâh²hubj)�”}”(hŒ9int pci_irq_vector(struct pci_dev *dev, unsigned int nr);”h]”hŒ9int pci_irq_vector(struct pci_dev *dev, unsigned int nr);”…”�”}”hjIsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´Krhjâh²hubj‘)�”}”(hX0If the driver enables the device using pcim_enable_device(), the driver shouldn't call pci_free_irq_vectors() because pcim_enable_device() activates automatic management for IRQ vectors. Otherwise, the driver should free any allocated IRQ vectors before removing the device using the following function::”h]”hX1If the driver enables the device using pcim_enable_device(), the driver shouldn’t call pci_free_irq_vectors() because pcim_enable_device() activates automatic management for IRQ vectors. Otherwise, the driver should free any allocated IRQ vectors before removing the device using the following function:”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kthjâh²hubj)�”}”(hŒ/void pci_free_irq_vectors(struct pci_dev *dev);”h]”hŒ/void pci_free_irq_vectors(struct pci_dev *dev);”…”�”}”hjesbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´Kzhjâh²hubj‘)�”}”(hXNIf a device supports both MSI-X and MSI capabilities, this API will use the MSI-X facilities in preference to the MSI facilities. MSI-X supports any number of interrupts between 1 and 2048. In contrast, MSI is restricted to a maximum of 32 interrupts (and must be a power of two). In addition, the MSI interrupt vectors must be allocated consecutively, so the system might not be able to allocate as many vectors for MSI as it could for MSI-X. On some platforms, MSI interrupts must all be targeted at the same set of CPUs whereas MSI-X interrupts can all be targeted at different CPUs.”h]”hXNIf a device supports both MSI-X and MSI capabilities, this API will use the MSI-X facilities in preference to the MSI facilities. MSI-X supports any number of interrupts between 1 and 2048. In contrast, MSI is restricted to a maximum of 32 interrupts (and must be a power of two). In addition, the MSI interrupt vectors must be allocated consecutively, so the system might not be able to allocate as many vectors for MSI as it could for MSI-X. On some platforms, MSI interrupts must all be targeted at the same set of CPUs whereas MSI-X interrupts can all be targeted at different CPUs.”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K|hjâh²hubj‘)�”}”(hŒ[If a device supports neither MSI-X nor MSI it will fall back to a single legacy IRQ vector.”h]”hŒ[If a device supports neither MSI-X nor MSI it will fall back to a single legacy IRQ vector.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K…hjâh²hubj‘)�”}”(hXEThe typical usage of MSI or MSI-X interrupts is to allocate as many vectors as possible, likely up to the limit supported by the device. If nvec is larger than the number supported by the device it will automatically be capped to the supported limit, so there is no need to query the number of vectors supported beforehand::”h]”hXDThe typical usage of MSI or MSI-X interrupts is to allocate as many vectors as possible, likely up to the limit supported by the device. If nvec is larger than the number supported by the device it will automatically be capped to the supported limit, so there is no need to query the number of vectors supported beforehand:”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kˆhjâh²hubj)�”}”(hŒbnvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_ALL_TYPES) if (nvec < 0) goto out_err;”h]”hŒbnvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_ALL_TYPES) if (nvec < 0) goto out_err;”…”�”}”hj�sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´KŽhjâh²hubj‘)�”}”(hŒîIf a driver is unable or unwilling to deal with a variable number of MSI interrupts it can request a particular number of interrupts by passing that number to pci_alloc_irq_vectors() function as both 'min_vecs' and 'max_vecs' parameters::”h]”hŒõIf a driver is unable or unwilling to deal with a variable number of MSI interrupts it can request a particular number of interrupts by passing that number to pci_alloc_irq_vectors() function as both ‘min_vecs’ and ‘max_vecs’ parameters:”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K’hjâh²hubj)�”}”(hŒdret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_ALL_TYPES); if (ret < 0) goto out_err;”h]”hŒdret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_ALL_TYPES); if (ret < 0) goto out_err;”…”�”}”hj¹sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´K—hjâh²hubj‘)�”}”(hŒ¯The most notorious example of the request type described above is enabling the single MSI mode for a device. It could be done by passing two 1s as 'min_vecs' and 'max_vecs'::”h]”hŒ¶The most notorious example of the request type described above is enabling the single MSI mode for a device. It could be done by passing two 1s as ‘min_vecs’ and ‘max_vecs’:”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K›hjâh²hubj)�”}”(hŒ^ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES); if (ret < 0) goto out_err;”h]”hŒ^ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES); if (ret < 0) goto out_err;”…”�”}”hjÕsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´KŸhjâh²hubj‘)�”}”(hŒˆSome devices might not support using legacy line interrupts, in which case the driver can specify that only MSI or MSI-X is acceptable::”h]”hŒ‡Some devices might not support using legacy line interrupts, in which case the driver can specify that only MSI or MSI-X is acceptable:”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K£hjâh²hubj)�”}”(hŒlnvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_MSI | PCI_IRQ_MSIX); if (nvec < 0) goto out_err;”h]”hŒlnvec = pci_alloc_irq_vectors(pdev, 1, nvec, PCI_IRQ_MSI | PCI_IRQ_MSIX); if (nvec < 0) goto out_err;”…”�”}”hjñsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´K¦hjâh²hubeh}”(h]”Œ using-msi”ah ]”h"]”Œ using msi”ah$]”h&]”uh1j[hjœh²hh³hÇh´KWubj\)�”}”(hhh]”(ja)�”}”(hŒ Legacy APIs”h]”hŒ Legacy APIs”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjh²hh³hÇh´K«ubj‘)�”}”(hŒeThe following old APIs to enable and disable MSI or MSI-X interrupts should not be used in new code::”h]”hŒdThe following old APIs to enable and disable MSI or MSI-X interrupts should not be used in new code:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K­hjh²hubj)�”}”(hŒêpci_enable_msi() /* deprecated */ pci_disable_msi() /* deprecated */ pci_enable_msix_range() /* deprecated */ pci_enable_msix_exact() /* deprecated */ pci_disable_msix() /* deprecated */”h]”hŒêpci_enable_msi() /* deprecated */ pci_disable_msi() /* deprecated */ pci_enable_msix_range() /* deprecated */ pci_enable_msix_exact() /* deprecated */ pci_disable_msix() /* deprecated */”…”�”}”hj&sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´K°hjh²hubj‘)�”}”(hX¨Additionally there are APIs to provide the number of supported MSI or MSI-X vectors: pci_msi_vec_count() and pci_msix_vec_count(). In general these should be avoided in favor of letting pci_alloc_irq_vectors() cap the number of vectors. If you have a legitimate special use case for the count of vectors we might have to revisit that decision and add a pci_nr_irq_vectors() helper that handles MSI and MSI-X transparently.”h]”hX¨Additionally there are APIs to provide the number of supported MSI or MSI-X vectors: pci_msi_vec_count() and pci_msix_vec_count(). In general these should be avoided in favor of letting pci_alloc_irq_vectors() cap the number of vectors. If you have a legitimate special use case for the count of vectors we might have to revisit that decision and add a pci_nr_irq_vectors() helper that handles MSI and MSI-X transparently.”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´K¶hjh²hubeh}”(h]”Œ legacy-apis”ah ]”h"]”Œ legacy apis”ah$]”h&]”uh1j[hjœh²hh³hÇh´K«ubj\)�”}”(hhh]”(ja)�”}”(hŒConsiderations when using MSIs”h]”hŒConsiderations when using MSIs”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjJh²hh³hÇh´K¾ubj\)�”}”(hhh]”(ja)�”}”(hŒ Spinlocks”h]”hŒ Spinlocks”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj[h²hh³hÇh´KÁubj‘)�”}”(hXqMost device drivers have a per-device spinlock which is taken in the interrupt handler. With pin-based interrupts or a single MSI, it is not necessary to disable interrupts (Linux guarantees the same interrupt will not be re-entered). If a device uses multiple interrupts, the driver must disable interrupts while the lock is held. If the device sends a different interrupt, the driver will deadlock trying to recursively acquire the spinlock. Such deadlocks can be avoided by using spin_lock_irqsave() or spin_lock_irq() which disable local interrupts and acquire the lock (see Documentation/kernel-hacking/locking.rst).”h]”hXqMost device drivers have a per-device spinlock which is taken in the interrupt handler. With pin-based interrupts or a single MSI, it is not necessary to disable interrupts (Linux guarantees the same interrupt will not be re-entered). If a device uses multiple interrupts, the driver must disable interrupts while the lock is held. If the device sends a different interrupt, the driver will deadlock trying to recursively acquire the spinlock. Such deadlocks can be avoided by using spin_lock_irqsave() or spin_lock_irq() which disable local interrupts and acquire the lock (see Documentation/kernel-hacking/locking.rst).”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÃhj[h²hubeh}”(h]”Œ spinlocks”ah ]”h"]”Œ spinlocks”ah$]”h&]”uh1j[hjJh²hh³hÇh´KÁubeh}”(h]”Œconsiderations-when-using-msis”ah ]”h"]”Œconsiderations when using msis”ah$]”h&]”uh1j[hjœh²hh³hÇh´K¾ubj\)�”}”(hhh]”(ja)�”}”(hŒ4How to tell whether MSI/MSI-X is enabled on a device”h]”hŒ4How to tell whether MSI/MSI-X is enabled on a device”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjŠh²hh³hÇh´KÎubj‘)�”}”(hŒãUsing 'lspci -v' (as root) may show some devices with "MSI", "Message Signaled Interrupts" or "MSI-X" capabilities. Each of these capabilities has an 'Enable' flag which is followed with either "+" (enabled) or "-" (disabled).”h]”hŒÿUsing ‘lspci -v’ (as root) may show some devices with “MSIâ€�, “Message Signaled Interruptsâ€� or “MSI-Xâ€� capabilities. Each of these capabilities has an ‘Enable’ flag which is followed with either “+â€� (enabled) or “-â€� (disabled).”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÐhjŠh²hubeh}”(h]”Œ4how-to-tell-whether-msi-msi-x-is-enabled-on-a-device”ah ]”h"]”Œ4how to tell whether msi/msi-x is enabled on a device”ah$]”h&]”uh1j[hjœh²hh³hÇh´KÎubeh}”(h]”Œhow-to-use-msis”ah ]”h"]”Œhow to use msis”ah$]”h&]”uh1j[hj]h²hh³hÇh´KFubj\)�”}”(hhh]”(ja)�”}”(hŒ MSI quirks”h]”hŒ MSI quirks”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj¹h²hh³hÇh´K×ubj‘)�”}”(hŒqSeveral PCI chipsets or devices are known not to support MSIs. The PCI stack provides three ways to disable MSIs:”h]”hŒqSeveral PCI chipsets or devices are known not to support MSIs. The PCI stack provides three ways to disable MSIs:”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÙhj¹h²hubhŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒglobally”h]”j‘)�”}”(hjáh]”hŒglobally”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÜhjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÚh²hh³hÇh´NubjÞ)�”}”(hŒ'on all devices behind a specific bridge”h]”j‘)�”}”(hjøh]”hŒ'on all devices behind a specific bridge”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÝhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÚh²hh³hÇh´NubjÞ)�”}”(hŒon a single device ”h]”j‘)�”}”(hŒon a single device”h]”hŒon a single device”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´KÞhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÚh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jØhj¹h²hh³hÇh´KÜubj\)�”}”(hhh]”(ja)�”}”(hŒDisabling MSIs globally”h]”hŒDisabling MSIs globally”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj0 h²hh³hÇh´Káubj‘)�”}”(hX‹Some host chipsets simply don't support MSIs properly. If we're lucky, the manufacturer knows this and has indicated it in the ACPI FADT table. In this case, Linux automatically disables MSIs. Some boards don't include this information in the table and so we have to detect them ourselves. The complete list of these is found near the quirk_disable_all_msi() function in drivers/pci/quirks.c.”h]”hX‘Some host chipsets simply don’t support MSIs properly. If we’re lucky, the manufacturer knows this and has indicated it in the ACPI FADT table. In this case, Linux automatically disables MSIs. Some boards don’t include this information in the table and so we have to detect them ourselves. The complete list of these is found near the quirk_disable_all_msi() function in drivers/pci/quirks.c.”…”�”}”(hjA h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kãhj0 h²hubj‘)�”}”(hXIf you have a board which has problems with MSIs, you can pass pci=nomsi on the kernel command line to disable MSIs on all devices. It would be in your best interests to report the problem to linux-pci@vger.kernel.org including a full 'lspci -v' so we can add the quirks to the kernel.”h]”(hŒÁIf you have a board which has problems with MSIs, you can pass pci=nomsi on the kernel command line to disable MSIs on all devices. It would be in your best interests to report the problem to ”…”�”}”(hjO h²hh³Nh´NubhŒ reference”“”)�”}”(hŒlinux-pci@vger.kernel.org”h]”hŒlinux-pci@vger.kernel.org”…”�”}”(hjY h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:linux-pci@vger.kernel.org”uh1jW hjO ubhŒH including a full ‘lspci -v’ so we can add the quirks to the kernel.”…”�”}”(hjO h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kêhj0 h²hubeh}”(h]”Œdisabling-msis-globally”ah ]”h"]”Œdisabling msis globally”ah$]”h&]”uh1j[hj¹h²hh³hÇh´Káubj\)�”}”(hhh]”(ja)�”}”(hŒDisabling MSIs below a bridge”h]”hŒDisabling MSIs below a bridge”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj{ h²hh³hÇh´Kðubj‘)�”}”(hŒ‰Some PCI bridges are not able to route MSIs between buses properly. In this case, MSIs must be disabled on all devices behind the bridge.”h]”hŒ‰Some PCI bridges are not able to route MSIs between buses properly. In this case, MSIs must be disabled on all devices behind the bridge.”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kòhj{ h²hubj‘)�”}”(hXºSome bridges allow you to enable MSIs by changing some bits in their PCI configuration space (especially the Hypertransport chipsets such as the nVidia nForce and Serverworks HT2000). As with host chipsets, Linux mostly knows about them and automatically enables MSIs if it can. If you have a bridge unknown to Linux, you can enable MSIs in configuration space using whatever method you know works, then enable MSIs on that bridge by doing::”h]”hX¹Some bridges allow you to enable MSIs by changing some bits in their PCI configuration space (especially the Hypertransport chipsets such as the nVidia nForce and Serverworks HT2000). As with host chipsets, Linux mostly knows about them and automatically enables MSIs if it can. If you have a bridge unknown to Linux, you can enable MSIs in configuration space using whatever method you know works, then enable MSIs on that bridge by doing:”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kõhj{ h²hubj)�”}”(hŒ-echo 1 > /sys/bus/pci/devices/$bridge/msi_bus”h]”hŒ-echo 1 > /sys/bus/pci/devices/$bridge/msi_bus”…”�”}”hj¨ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´Kýhj{ h²hubj‘)�”}”(hŒPwhere $bridge is the PCI address of the bridge you've enabled (eg 0000:00:0e.0).”h]”hŒRwhere $bridge is the PCI address of the bridge you’ve enabled (eg 0000:00:0e.0).”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Kÿhj{ h²hubj‘)�”}”(hŒžTo disable MSIs, echo 0 instead of 1. Changing this value should be done with caution as it could break interrupt handling for all devices below this bridge.”h]”hŒžTo disable MSIs, echo 0 instead of 1. Changing this value should be done with caution as it could break interrupt handling for all devices below this bridge.”…”�”}”(hjÄ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhj{ h²hubj‘)�”}”(hŒYAgain, please notify linux-pci@vger.kernel.org of any bridges that need special handling.”h]”(hŒAgain, please notify ”…”�”}”(hjÒ h²hh³Nh´NubjX )�”}”(hŒlinux-pci@vger.kernel.org”h]”hŒlinux-pci@vger.kernel.org”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:linux-pci@vger.kernel.org”uh1jW hjÒ ubhŒ+ of any bridges that need special handling.”…”�”}”(hjÒ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhj{ h²hubeh}”(h]”Œdisabling-msis-below-a-bridge”ah ]”h"]”Œdisabling msis below a bridge”ah$]”h&]”uh1j[hj¹h²hh³hÇh´Kðubj\)�”}”(hhh]”(ja)�”}”(hŒ!Disabling MSIs on a single device”h]”hŒ!Disabling MSIs on a single device”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjü h²hh³hÇh´M ubj‘)�”}”(hXXSome devices are known to have faulty MSI implementations. Usually this is handled in the individual device driver, but occasionally it's necessary to handle this with a quirk. Some drivers have an option to disable use of MSI. While this is a convenient workaround for the driver author, it is not good practice, and should not be emulated.”h]”hXZSome devices are known to have faulty MSI implementations. Usually this is handled in the individual device driver, but occasionally it’s necessary to handle this with a quirk. Some drivers have an option to disable use of MSI. While this is a convenient workaround for the driver author, it is not good practice, and should not be emulated.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´M hjü h²hubeh}”(h]”Œ!disabling-msis-on-a-single-device”ah ]”h"]”Œ!disabling msis on a single device”ah$]”h&]”uh1j[hj¹h²hh³hÇh´M ubj\)�”}”(hhh]”(ja)�”}”(hŒ)Finding why MSIs are disabled on a device”h]”hŒ)Finding why MSIs are disabled on a device”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj# h²hh³hÇh´Mubj‘)�”}”(hX9From the above three sections, you can see that there are many reasons why MSIs may not be enabled for a given device. Your first step should be to examine your dmesg carefully to determine whether MSIs are enabled for your machine. You should also check your .config to be sure you have enabled CONFIG_PCI_MSI.”h]”hX9From the above three sections, you can see that there are many reasons why MSIs may not be enabled for a given device. Your first step should be to examine your dmesg carefully to determine whether MSIs are enabled for your machine. You should also check your .config to be sure you have enabled CONFIG_PCI_MSI.”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhj# h²hubj‘)�”}”(hXThen, 'lspci -t' gives the list of bridges above a device. Reading `/sys/bus/pci/devices/*/msi_bus` will tell you whether MSIs are enabled (1) or disabled (0). If 0 is found in any of the msi_bus files belonging to bridges between the PCI root and the device, MSIs are disabled.”h]”(hŒGThen, ‘lspci -t’ gives the list of bridges above a device. Reading ”…”�”}”(hjB h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `/sys/bus/pci/devices/*/msi_bus`”h]”hŒ/sys/bus/pci/devices/*/msi_bus”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jJ hjB ubhŒ´ will tell you whether MSIs are enabled (1) or disabled (0). If 0 is found in any of the msi_bus files belonging to bridges between the PCI root and the device, MSIs are disabled.”…”�”}”(hjB h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´Mhj# h²hubj‘)�”}”(hŒµIt is also worth checking the device driver to see whether it supports MSIs. For example, it may contain calls to pci_alloc_irq_vectors() with the PCI_IRQ_MSI or PCI_IRQ_MSIX flags.”h]”hŒµIt is also worth checking the device driver to see whether it supports MSIs. For example, it may contain calls to pci_alloc_irq_vectors() with the PCI_IRQ_MSI or PCI_IRQ_MSIX flags.”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´M hj# h²hubeh}”(h]”Œ)finding-why-msis-are-disabled-on-a-device”ah ]”h"]”Œ)finding why msis are disabled on a device”ah$]”h&]”uh1j[hj¹h²hh³hÇh´Mubeh}”(h]”Œ msi-quirks”ah ]”h"]”Œ msi quirks”ah$]”h&]”uh1j[hj]h²hh³hÇh´K×ubj\)�”}”(hhh]”(ja)�”}”(hŒ#List of device drivers MSI(-X) APIs”h]”hŒ#List of device drivers MSI(-X) APIs”…”�”}”(hj… h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj‚ h²hh³hÇh´M&ubj‘)�”}”(hŒ“The PCI/MSI subsystem has a dedicated C file for its exported device driver APIs — `drivers/pci/msi/api.c`. The following functions are exported:”h]”(hŒUThe PCI/MSI subsystem has a dedicated C file for its exported device driver APIs — ”…”�”}”(hj“ h²hh³Nh´NubjK )�”}”(hŒ`drivers/pci/msi/api.c`”h]”hŒdrivers/pci/msi/api.c”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jJ hj“ ubhŒ'. The following functions are exported:”…”�”}”(hj“ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÇh´M(hj‚ h²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œpci_enable_msi (C function)”Œc.pci_enable_msi”hNt”auh1j³ hj‚ h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ(int pci_enable_msi (struct pci_dev *dev)”h]”hŒdesc_signature_line”“”)�”}”(hŒ'int pci_enable_msi(struct pci_dev *dev)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hj× h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jÕ hjÑ h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jç hjÑ h²hh³jæ h´KubhŒ desc_name”“”)�”}”(hŒpci_enable_msi”h]”hŒ desc_sig_name”“”)�”}”(hŒpci_enable_msi”h]”hŒpci_enable_msi”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jþ hjú ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jø hjÑ h²hh³jæ h´KubhŒdesc_parameterlist”“”)�”}”(hŒ(struct pci_dev *dev)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct pci_dev *dev”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j# hj ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjB ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”jG Œmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”ja Œ ASTIdentifier”“”)�”}”j\ j sbŒc.pci_enable_msi”†”asbuh1hhj ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj ubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j| hj ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjÑ h²hh³jæ h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jÏ Œsphinx_line_type”Œ declarator”hjË h²hh³jæ h´Kubah}”(h]”j ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jÉ h³jæ h´KhjÆ h²hubhŒ desc_content”“”)�”}”(hhh]”j‘)�”}”(hŒ#Enable MSI interrupt mode on device”h]”hŒ#Enable MSI interrupt mode on device”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khj¾ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjÆ h²hh³jæ h´Kubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”Œdomain”jZ Œobjtype”jÙ Œdesctype”jÙ Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jÄ h²hhj‚ h³Nh´NubhŒ container”“”)�”}”(hXß**Parameters** ``struct pci_dev *dev`` the PCI device to operate on **Description** Legacy device driver API to enable MSI interrupts mode on device and allocate a single interrupt vector. On success, the allocated vector Linux IRQ will be saved at **dev->irq**. The driver must invoke pci_disable_msi() on cleanup. **NOTE** The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead. **Return** 0 on success, errno otherwise”h]”(j‘)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hjë h]”hŒ Parameters”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjé ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubhŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(hŒterm”“”)�”}”(hŒ``struct pci_dev *dev``”h]”hŒliteral”“”)�”}”(hj h]”hŒstruct pci_dev *dev”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khj ubhŒ definition”“”)�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j) h´Khj, ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j) h´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjå ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hjQ h]”hŒ Description”…”�”}”(hjS h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjO ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubj‘)�”}”(hŒçLegacy device driver API to enable MSI interrupts mode on device and allocate a single interrupt vector. On success, the allocated vector Linux IRQ will be saved at **dev->irq**. The driver must invoke pci_disable_msi() on cleanup.”h]”(hŒ¥Legacy device driver API to enable MSI interrupts mode on device and allocate a single interrupt vector. On success, the allocated vector Linux IRQ will be saved at ”…”�”}”(hjg h²hh³Nh´Nubjî )�”}”(hŒ **dev->irq**”h]”hŒdev->irq”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjg ubhŒ6. The driver must invoke pci_disable_msi() on cleanup.”…”�”}”(hjg h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubj‘)�”}”(hŒ**NOTE**”h]”jî )�”}”(hjŠ h]”hŒNOTE”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjˆ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubj‘)�”}”(hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”h]”hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”…”�”}”(hj  h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hj± h]”hŒReturn”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj¯ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubj‘)�”}”(hŒ0 on success, errno otherwise”h]”hŒ0 on success, errno otherwise”…”�”}”(hjÇ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjå ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œpci_disable_msi (C function)”Œc.pci_disable_msi”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ*void pci_disable_msi (struct pci_dev *dev)”h]”jÐ )�”}”(hŒ)void pci_disable_msi(struct pci_dev *dev)”h]”(jÖ )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjò h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K(ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjò h²hh³j h´K(ubjù )�”}”(hŒpci_disable_msi”h]”jÿ )�”}”(hŒpci_disable_msi”h]”hŒpci_disable_msi”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjò h²hh³j h´K(ubj )�”}”(hŒ(struct pci_dev *dev)”h]”j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj/ ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@ h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj/ ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjN ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jS Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ j sbŒc.pci_disable_msi”†”asbuh1hhj/ ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj/ ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj/ ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj/ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj+ ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjò h²hh³j h´K(ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjî h²hh³j h´K(ubah}”(h]”jé ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³j h´K(hjë h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ$Disable MSI interrupt mode on device”h]”hŒ$Disable MSI interrupt mode on device”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K(hj³ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjë h²hh³j h´K(ubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jÎ jß jÎ jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hXØ**Parameters** ``struct pci_dev *dev`` the PCI device to operate on **Description** Legacy device driver API to disable MSI interrupt mode on device, free earlier allocated interrupt vectors, and restore INTx emulation. The PCI device Linux IRQ (**dev->irq**) is restored to its default pin-assertion IRQ. This is the cleanup pair of pci_enable_msi(). **NOTE** The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjØ h]”hŒ Parameters”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K,hjÒ ubj )�”}”(hhh]”j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj÷ h]”hŒstruct pci_dev *dev”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjõ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K)hjñ ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j h´K)hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjñ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j h´K)hjî ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÒ ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj2h]”hŒ Description”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K+hjÒ ubj‘)�”}”(hX Legacy device driver API to disable MSI interrupt mode on device, free earlier allocated interrupt vectors, and restore INTx emulation. The PCI device Linux IRQ (**dev->irq**) is restored to its default pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().”h]”(hŒ¢Legacy device driver API to disable MSI interrupt mode on device, free earlier allocated interrupt vectors, and restore INTx emulation. The PCI device Linux IRQ (”…”�”}”(hjHh²hh³Nh´Nubjî )�”}”(hŒ **dev->irq**”h]”hŒdev->irq”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjHubhŒ]) is restored to its default pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().”…”�”}”(hjHh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K*hjÒ ubj‘)�”}”(hŒ**NOTE**”h]”jî )�”}”(hjkh]”hŒNOTE”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjiubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K/hjÒ ubj‘)�”}”(hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”h]”hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K0hjÒ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œpci_msix_vec_count (C function)”Œc.pci_msix_vec_count”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ,int pci_msix_vec_count (struct pci_dev *dev)”h]”jÐ )�”}”(hŒ+int pci_msix_vec_count(struct pci_dev *dev)”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj¬h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K?ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj¬h²hh³j¾h´K?ubjù )�”}”(hŒpci_msix_vec_count”h]”jÿ )�”}”(hŒpci_msix_vec_count”h]”hŒpci_msix_vec_count”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjÍubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hj¬h²hh³j¾h´K?ubj )�”}”(hŒ(struct pci_dev *dev)”h]”j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjéubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjéubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”j Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ jÓsbŒc.pci_msix_vec_count”†”asbuh1hhjéubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjéubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjéubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjéubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjåubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hj¬h²hh³j¾h´K?ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hj¨h²hh³j¾h´K?ubah}”(h]”j£ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³j¾h´K?hj¥h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ/Get number of MSI-X interrupt vectors on device”h]”hŒ/Get number of MSI-X interrupt vectors on device”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K?hjmh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hj¥h²hh³j¾h´K?ubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jˆjß jˆjà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hX**Parameters** ``struct pci_dev *dev`` the PCI device to operate on **Return** number of MSI-X interrupt vectors available on this device (i.e., the device's MSI-X capability structure "table size"), -EINVAL if the device is not MSI-X capable, other errnos otherwise.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj’h]”hŒ Parameters”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KChjŒubj )�”}”(hhh]”j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj±h]”hŒstruct pci_dev *dev”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K@hj«ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jÆh´K@hjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jÆh´K@hj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjŒubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hjìh]”hŒReturn”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjêubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KBhjŒubj‘)�”}”(hŒ¼number of MSI-X interrupt vectors available on this device (i.e., the device's MSI-X capability structure "table size"), -EINVAL if the device is not MSI-X capable, other errnos otherwise.”h]”hŒÂnumber of MSI-X interrupt vectors available on this device (i.e., the device’s MSI-X capability structure “table sizeâ€�), -EINVAL if the device is not MSI-X capable, other errnos otherwise.”…”�”•}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KBhjŒubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ"pci_enable_msix_range (C function)”Œc.pci_enable_msix_range”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒcint pci_enable_msix_range (struct pci_dev *dev, struct msix_entry *entries, int minvec, int maxvec)”h]”jÐ )�”}”(hŒbint pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec, int maxvec)”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj-h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KSubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj-h²hh³j?h´KSubjù )�”}”(hŒpci_enable_msix_range”h]”jÿ )�”}”(hŒpci_enable_msix_range”h]”hŒpci_enable_msix_range”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjNubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hj-h²hh³j?h´KSubj )�”}”(hŒI(struct pci_dev *dev, struct msix_entry *entries, int minvec, int maxvec)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjjubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjjubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj‰ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jŽŒmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ jTsbŒc.pci_enable_msix_range”†”asbuh1hhjjubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjjubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjjubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjfubj )�”}”(hŒstruct msix_entry *entries”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjÜubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÜubh)�”}”(hhh]”jÿ )�”}”(hŒ msix_entry”h]”hŒ msix_entry”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjûubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jŒmodname”NŒ classname”Nj` jc )�”}”jf ]”j¨Œc.pci_enable_msix_range”†”asbuh1hhjÜubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÜubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjÜubjÿ )�”}”(hŒentries”h]”hŒentries”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjÜubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjfubj )�”}”(hŒ int minvec”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjLubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjLubjÿ )�”}”(hŒminvec”h]”hŒminvec”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjLubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjfubj )�”}”(hŒ int maxvec”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj�ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj�ubjÿ )�”}”(hŒmaxvec”h]”hŒmaxvec”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj�ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjfubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hj-h²hh³j?h´KSubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hj)h²hh³j?h´KSubah}”(h]”j$ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³j?h´KShj&h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ%Enable MSI-X interrupt mode on device”h]”hŒ%Enable MSI-X interrupt mode on device”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KShjÈh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hj&h²hh³j?h´KSubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jãjß jãjà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hX**Parameters** ``struct pci_dev *dev`` the PCI device to operate on ``struct msix_entry *entries`` input/output parameter, array of MSI-X configuration entries ``int minvec`` minimum required number of MSI-X vectors ``int maxvec`` maximum desired number of MSI-X vectors **Description** Legacy device driver API to enable MSI-X interrupt mode on device and configure its MSI-X capability structure as appropriate. The passed **entries** array must have each of its members "entry" field set to a desired (valid) MSI-X vector number, where the range of valid MSI-X vector numbers can be queried through pci_msix_vec_count(). If successful, the driver must invoke pci_disable_msix() on cleanup. **NOTE** The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead. **Return** number of MSI-X vectors allocated (which might be smaller than **maxvecs**), where Linux IRQ numbers for such allocated vectors are saved back in the **entries** array elements' "vector" field. Return -ENOSPC if less than **minvecs** interrupt vectors are available. Return -EINVAL if one of the passed **entries** members "entry" field was invalid or a duplicate, or if plain MSI interrupts mode was earlier enabled on device. Return other errnos otherwise.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjíh]”hŒ Parameters”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KWhjçubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj h]”hŒstruct pci_dev *dev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KThjubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j!h´KThj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j!h´KThjubj )�”}”(hŒ\``struct msix_entry *entries`` input/output parameter, array of MSI-X configuration entries ”h]”(j )�”}”(hŒ``struct msix_entry *entries``”h]”j )�”}”(hjEh]”hŒstruct msix_entry *entries”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KUhj?ubj+ )�”}”(hhh]”j‘)�”}”(hŒ= 0) and msi_map::virq contains the allocated Linux interrupt number (> 0). On fail msi_map::index contains the error code and msi_map::virq is set to 0.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjMh]”hŒ Parameters”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KˆhjGubj )�”}”(hhh]”(j )�”}”(hŒ1``struct pci_dev *dev`` PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hjlh]”hŒstruct pci_dev *dev”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K‡hjfubj+ )�”}”(hhh]”j‘)�”}”(hŒPCI device to operate on”h]”hŒPCI device to operate on”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j�h´K‡hj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j�h´K‡hjcubj )�”}”(hŒ~``unsigned int index`` Index to allocate. If **index** == MSI_ANY_INDEX this allocates the next free index in the MSI-X table ”h]”(j )�”}”(hŒ``unsigned int index``”h]”j )�”}”(hj¥h]”hŒunsigned int index”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K‰hjŸubj+ )�”}”(hhh]”j‘)�”}”(hŒfIndex to allocate. If **index** == MSI_ANY_INDEX this allocates the next free index in the MSI-X table”h]”(hŒIndex to allocate. If ”…”�”}”(hj¾h²hh³Nh´Nubjî )�”}”(hŒ **index**”h]”hŒindex”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj¾ubhŒG == MSI_ANY_INDEX this allocates the next free index in the MSI-X table”…”�”}”(hj¾h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kˆhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjŸubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jºh´K‰hjcubj )�”}”(hŒq``const struct irq_affinity_desc *affdesc`` Optional pointer to an affinity descriptor structure. NULL otherwise ”h]”(j )�”}”(hŒ+``const struct irq_affinity_desc *affdesc``”h]”j )�”}”(hjñh]”hŒ'const struct irq_affinity_desc *affdesc”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjïubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KŠhjëubj+ )�”}”(hhh]”j‘)�”}”(hŒDOptional pointer to an affinity descriptor structure. NULL otherwise”h]”hŒDOptional pointer to an affinity descriptor structure. NULL otherwise”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jh´KŠhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjëubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jh´KŠhjcubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hjGubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hj,h]”hŒReturn”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KŒhjGubj‘)�”}”(hŒA struct msi_map”h]”hŒA struct msi_map”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KŒhjGubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hjSh]”hŒ Description”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjQubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KŽhjGubhŒ block_quote”“”)�”}”(hŒÓOn success msi_map::index contains the allocated index (>= 0) and msi_map::virq contains the allocated Linux interrupt number (> 0). On fail msi_map::index contains the error code and msi_map::virq is set to 0.”h]”(j‘)�”}”(hŒ„On success msi_map::index contains the allocated index (>= 0) and msi_map::virq contains the allocated Linux interrupt number (> 0).”h]”hŒ„On success msi_map::index contains the allocated index (>= 0) and msi_map::virq contains the allocated Linux interrupt number (> 0).”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K�hjkubj‘)�”}”(hŒMOn fail msi_map::index contains the error code and msi_map::virq is set to 0.”h]”hŒMOn fail msi_map::index contains the error code and msi_map::virq is set to 0.”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K�hjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1jih³j}h´K�hjGubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œpci_msix_free_irq (C function)”Œc.pci_msix_free_irq”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ@void pci_msix_free_irq (struct pci_dev *dev, struct msi_map map)”h]”jÐ )�”}”(hŒ?void pci_msix_free_irq(struct pci_dev *dev, struct msi_map map)”h]”(jÖ )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj¯h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¤ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj¯h²hh³jÁh´K¤ubjù )�”}”(hŒpci_msix_free_irq”h]”jÿ )�”}”(hŒpci_msix_free_irq”h]”hŒpci_msix_free_irq”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjÐubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hj¯h²hh³jÁh´K¤ubj )�”}”(hŒ)(struct pci_dev *dev, struct msi_map map)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjìubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjìubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jŒmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ jÖsbŒc.pci_msix_free_irq”†”asbuh1hhjìubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjìubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjìubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjìubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjèubj )�”}”(hŒstruct msi_map map”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj^ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj^ubh)�”}”(hhh]”jÿ )�”}”(hŒmsi_map”h]”hŒmsi_map”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj}ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”j‚Œmodname”NŒ classname”Nj` jc )�”}”jf ]”j*Œc.pci_msix_free_irq”†”asbuh1hhj^ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj^ubjÿ )�”}”(hŒmap”h]”hŒmap”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj^ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hjèubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hj¯h²hh³jÁh´K¤ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hj«h²hh³jÁh´K¤ubah}”(h]”j¦ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jÁh´K¤hj¨h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ1Free an interrupt on a PCI/MSI-X interrupt domain”h]”hŒ1Free an interrupt on a PCI/MSI-X interrupt domain”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¤hjÓh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hj¨h²hh³jÁh´K¤ubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jîjß jîjà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hŒá**Parameters** ``struct pci_dev *dev`` The PCI device to operate on ``struct msi_map map`` A struct msi_map describing the interrupt to free **Description** Undo an interrupt vector allocation. Does not disable MSI-X.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjøh]”hŒ Parameters”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjöubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¨hjòubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` The PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hjh]”hŒstruct pci_dev *dev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¦hjubj+ )�”}”(hhh]”j‘)�”}”(hŒThe PCI device to operate on”h]”hŒThe PCI device to operate on”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j,h´K¦hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j,h´K¦hjubj )�”}”(hŒI``struct msi_map map`` A struct msi_map describing the interrupt to free ”h]”(j )�”}”(hŒ``struct msi_map map``”h]”j )�”}”(hjPh]”hŒstruct msi_map map”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K§hjJubj+ )�”}”(hhh]”j‘)�”}”(hŒ1A struct msi_map describing the interrupt to free”h]”hŒ1A struct msi_map describing the interrupt to free”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jeh´K§hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jeh´K§hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hjòubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj‹h]”hŒ Description”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K©hjòubj‘)�”}”(hŒirq**) is restored to its default pin assertion IRQ. This is the cleanup pair of pci_enable_msix_range(). **NOTE** The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj²h]”hŒ Parameters”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kºhj¬ubj )�”}”(hhh]”j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hjÑh]”hŒstruct pci_dev *dev”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K·hjËubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jæh´K·hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjËubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jæh´K·hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¬ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj h]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¹hj¬ubj‘)�”}”(hX Legacy device driver API to disable MSI-X interrupt mode on device, free earlier-allocated interrupt vectors, and restore INTx. The PCI device Linux IRQ (**dev->irq**) is restored to its default pin assertion IRQ. This is the cleanup pair of pci_enable_msix_range().”h]”(hŒšLegacy device driver API to disable MSI-X interrupt mode on device, free earlier-allocated interrupt vectors, and restore INTx. The PCI device Linux IRQ (”…”�”}”(hj"h²hh³Nh´Nubjî )�”}”(hŒ **dev->irq**”h]”hŒdev->irq”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj"ubhŒd) is restored to its default pin assertion IRQ. This is the cleanup pair of pci_enable_msix_range().”…”�”}”(hj"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¸hj¬ubj‘)�”}”(hŒ**NOTE**”h]”jî )�”}”(hjEh]”hŒNOTE”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K½hj¬ubj‘)�”}”(hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”h]”hŒhThe newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API pair should, in general, be used instead.”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K¾hj¬ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ"pci_alloc_irq_vectors (C function)”Œc.pci_alloc_irq_vectors”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒqint pci_alloc_irq_vectors (struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags)”h]”jÐ )�”}”(hŒpint pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags)”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj†h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÍubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj†h²hh³j˜h´KÍubjù )�”}”(hŒpci_alloc_irq_vectors”h]”jÿ )�”}”(hŒpci_alloc_irq_vectors”h]”hŒpci_alloc_irq_vectors”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj§ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hj†h²hh³j˜h´KÍubj )�”}”(hŒW(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjÃubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÃubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjâubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jçŒmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ j­sbŒc.pci_alloc_irq_vectors”†”asbuh1hhjÃubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÃubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjÃubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjÃubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj¿ubj )�”}”(hŒunsigned int min_vecs”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj5ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj5ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj5ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj5ubjÿ )�”}”(hŒmin_vecs”h]”hŒmin_vecs”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj5ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj¿ubj )�”}”(hŒunsigned int max_vecs”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj†ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj†ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj†ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj†ubjÿ )�”}”(hŒmax_vecs”h]”hŒmax_vecs”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj†ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj¿ubj )�”}”(hŒunsigned int flags”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj×ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj×ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj×ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj×ubjÿ )�”}”(hŒflags”h]”hŒflags”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj×ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj¿ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hj†h²hh³j˜h´KÍubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hj‚h²hh³j˜h´KÍubah}”(h]”j}ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³j˜h´KÍhjh²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ*Allocate multiple device interrupt vectors”h]”hŒ*Allocate multiple device interrupt vectors”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÍhj:h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjh²hh³j˜h´KÍubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jUjß jUjà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hX´**Parameters** ``struct pci_dev *dev`` the PCI device to operate on ``unsigned int min_vecs`` minimum required number of vectors (must be >= 1) ``unsigned int max_vecs`` maximum desired number of vectors ``unsigned int flags`` One or more of: **Description** * ``PCI_IRQ_MSIX`` Allow trying MSI-X vector allocations * ``PCI_IRQ_MSI`` Allow trying MSI vector allocations * ``PCI_IRQ_INTX`` Allow trying INTx interrupts, if and only if **min_vecs** == 1 * ``PCI_IRQ_AFFINITY`` Auto-manage IRQs affinity by spreading the vectors around available CPUs Allocate up to **max_vecs** interrupt vectors on device. MSI-X irq vector allocation has a higher precedence over plain MSI, which has a higher precedence over legacy INTx emulation. Upon a successful allocation, the caller should use pci_irq_vector() to get the Linux IRQ number to be passed to request_threaded_irq(). The driver must call pci_free_irq_vectors() on cleanup. **Return** number of allocated vectors (which might be smaller than **max_vecs**), -ENOSPC if less than **min_vecs** interrupt vectors are available, other errnos otherwise.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj_h]”hŒ Parameters”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÑhjYubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj~h]”hŒstruct pci_dev *dev”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÎhjxubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j“h´KÎhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j“h´KÎhjuubj )�”}”(hŒL``unsigned int min_vecs`` minimum required number of vectors (must be >= 1) ”h]”(j )�”}”(hŒ``unsigned int min_vecs``”h]”j )�”}”(hj·h]”hŒunsigned int min_vecs”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjµubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÏhj±ubj+ )�”}”(hhh]”j‘)�”}”(hŒ1minimum required number of vectors (must be >= 1)”h]”hŒ1minimum required number of vectors (must be >= 1)”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jÌh´KÏhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj±ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jÌh´KÏhjuubj )�”}”(hŒ<``unsigned int max_vecs`` maximum desired number of vectors ”h]”(j )�”}”(hŒ``unsigned int max_vecs``”h]”j )�”}”(hjðh]”hŒunsigned int max_vecs”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÐhjêubj+ )�”}”(hhh]”j‘)�”}”(hŒ!maximum desired number of vectors”h]”hŒ!maximum desired number of vectors”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jh´KÐhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jh´KÐhjuubj )�”}”(hŒ'``unsigned int flags`` One or more of: ”h]”(j )�”}”(hŒ``unsigned int flags``”h]”j )�”}”(hj)h]”hŒunsigned int flags”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÑhj#ubj+ )�”}”(hhh]”j‘)�”}”(hŒOne or more of:”h]”hŒOne or more of:”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j>h´KÑhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j>h´KÑhjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hjYubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hjdh]”hŒ Description”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjbubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÓhjYubjj)�”}”(hX8* ``PCI_IRQ_MSIX`` Allow trying MSI-X vector allocations * ``PCI_IRQ_MSI`` Allow trying MSI vector allocations * ``PCI_IRQ_INTX`` Allow trying INTx interrupts, if and only if **min_vecs** == 1 * ``PCI_IRQ_AFFINITY`` Auto-manage IRQs affinity by spreading the vectors around available CPUs ”h]”hŒ bullet_list”“”)�”}”(hhh]”(jÞ)�”}”(hŒ;``PCI_IRQ_MSIX`` Allow trying MSI-X vector allocations”h]”j‘)�”}”(hj…h]”(j )�”}”(hŒ``PCI_IRQ_MSIX``”h]”hŒ PCI_IRQ_MSIX”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj‡ubhŒ+ Allow trying MSI-X vector allocations”…”�”}”(hj‡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÒhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhj€ubjÞ)�”}”(hŒ:``PCI_IRQ_MSI`` Allow trying MSI vector allocations ”h]”j‘)�”}”(hŒ9``PCI_IRQ_MSI`` Allow trying MSI vector allocations”h]”(j )�”}”(hŒ``PCI_IRQ_MSI``”h]”hŒ PCI_IRQ_MSI”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj­ubhŒ* Allow trying MSI vector allocations”…”�”}”(hj­h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÓhj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhj€ubjÞ)�”}”(hŒU``PCI_IRQ_INTX`` Allow trying INTx interrupts, if and only if **min_vecs** == 1 ”h]”j‘)�”}”(hŒT``PCI_IRQ_INTX`` Allow trying INTx interrupts, if and only if **min_vecs** == 1”h]”(j )�”}”(hŒ``PCI_IRQ_INTX``”h]”hŒ PCI_IRQ_INTX”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÔubhŒ3 Allow trying INTx interrupts, if and only if ”…”�”}”(hjÔh²hh³Nh´Nubjî )�”}”(hŒ **min_vecs**”h]”hŒmin_vecs”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjÔubhŒ == 1”…”�”}”(hjÔh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÕhjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhj€ubjÞ)�”}”(hŒ_``PCI_IRQ_AFFINITY`` Auto-manage IRQs affinity by spreading the vectors around available CPUs ”h]”j‘)�”}”(hŒ^``PCI_IRQ_AFFINITY`` Auto-manage IRQs affinity by spreading the vectors around available CPUs”h]”(j )�”}”(hŒ``PCI_IRQ_AFFINITY``”h]”hŒPCI_IRQ_AFFINITY”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubhŒJ Auto-manage IRQs affinity by spreading the vectors around available CPUs”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KØhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhj€ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”j€ uh1j~h³j¢h´KÒhjzubah}”(h]”h ]”h"]”h$]”h&]”uh1jih³j¢h´KÒhjYubj‘)�”}”(hŒ¶Allocate up to **max_vecs** interrupt vectors on device. MSI-X irq vector allocation has a higher precedence over plain MSI, which has a higher precedence over legacy INTx emulation.”h]”(hŒAllocate up to ”…”�”}”(hj= h²hh³Nh´Nubjî )�”}”(hŒ **max_vecs**”h]”hŒmax_vecs”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj= ubhŒ› interrupt vectors on device. MSI-X irq vector allocation has a higher precedence over plain MSI, which has a higher precedence over legacy INTx emulation.”…”�”}”(hj= h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KÛhjYubj‘)�”}”(hŒÀUpon a successful allocation, the caller should use pci_irq_vector() to get the Linux IRQ number to be passed to request_threaded_irq(). The driver must call pci_free_irq_vectors() on cleanup.”h]”hŒÀUpon a successful allocation, the caller should use pci_irq_vector() to get the Linux IRQ number to be passed to request_threaded_irq(). The driver must call pci_free_irq_vectors() on cleanup.”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KßhjYubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hjo h]”hŒReturn”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjm ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KãhjYubj‘)�”}”(hŒ¢number of allocated vectors (which might be smaller than **max_vecs**), -ENOSPC if less than **min_vecs** interrupt vectors are available, other errnos otherwise.”h]”(hŒ9number of allocated vectors (which might be smaller than ”…”�”}”(hj… h²hh³Nh´Nubjî )�”}”(hŒ **max_vecs**”h]”hŒmax_vecs”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj… ubhŒ), -ENOSPC if less than ”…”�”}”(hj… h²hh³Nh´Nubjî )�”}”(hŒ **min_vecs**”h]”hŒmin_vecs”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj… ubhŒ9 interrupt vectors are available, other errnos otherwise.”…”�”}”(hj… h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´KähjYubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ+pci_alloc_irq_vectors_affinity (C function)”Œ c.pci_alloc_irq_vectors_affinity”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ•int pci_alloc_irq_vectors_affinity (struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd)”h]”jÐ )�”}”(hŒ”int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd)”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjØ h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjÔ h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kñubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÔ h²hh³jæ h´Kñubjù )�”}”(hŒpci_alloc_irq_vectors_affinity”h]”jÿ )�”}”(hŒpci_alloc_irq_vectors_affinity”h]”hŒpci_alloc_irq_vectors_affinity”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjõ ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjÔ h²hh³jæ h´Kñubj )�”}”(hŒr(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"!h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj!ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj3!h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj0!ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”j5!Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ jû sbŒ c.pci_alloc_irq_vectors_affinity”†”asbuh1hhj!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjS!h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj!ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hja!h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj!ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjn!h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj !ubj )�”}”(hŒunsigned int min_vecs”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj‡!h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjƒ!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj•!h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjƒ!ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj£!h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjƒ!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj±!h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjƒ!ubjÿ )�”}”(hŒmin_vecs”h]”hŒmin_vecs”…”�”}”(hj¿!h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjƒ!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj !ubj )�”}”(hŒunsigned int max_vecs”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjØ!h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjÔ!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjæ!h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÔ!ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjô!h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjÔ!ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjÔ!ubjÿ )�”}”(hŒmax_vecs”h]”hŒmax_vecs”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjÔ!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj !ubj )�”}”(hŒunsigned int flags”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj)"h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj%"ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7"h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj%"ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjE"h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj%"ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjS"h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj%"ubjÿ )�”}”(hŒflags”h]”hŒflags”…”�”}”(hja"h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj%"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj !ubj )�”}”(hŒstruct irq_affinity *affd”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjz"h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hjv"ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‡"h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjv"ubh)�”}”(hhh]”jÿ )�”}”(hŒ irq_affinity”h]”hŒ irq_affinity”…”�”}”(hj˜"h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj•"ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jš"Œmodname”NŒ classname”Nj` jc )�”}”jf ]”jO!Œ c.pci_alloc_irq_vectors_affinity”†”asbuh1hhjv"ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¶"h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjv"ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjÄ"h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hjv"ubjÿ )�”}”(hŒaffd”h]”hŒaffd”…”�”}”(hjÑ"h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjv"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj !ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjÔ h²hh³jæ h´Kñubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjÐ h²hh³jæ h´Kñubah}”(h]”jË ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jæ h´KñhjÍ h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒEAllocate multiple device interrupt vectors with affinity requirements”h]”hŒEAllocate multiple device interrupt vectors with affinity requirements”…”�”}”(hjû"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kñhjø"h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjÍ h²hh³jæ h´Kñubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ j#jß j#jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hX **Parameters** ``struct pci_dev *dev`` the PCI device to operate on ``unsigned int min_vecs`` minimum required number of vectors (must be >= 1) ``unsigned int max_vecs`` maximum desired number of vectors ``unsigned int flags`` allocation flags, as in pci_alloc_irq_vectors() ``struct irq_affinity *affd`` affinity requirements (can be ``NULL``). **Description** Same as pci_alloc_irq_vectors(), but with the extra **affd** parameter. Check that function docs, and :c:type:`struct irq_affinity `, for more details.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj#h]”hŒ Parameters”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kõhj#ubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj<#h]”hŒstruct pci_dev *dev”…”�”}”(hj>#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj:#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kóhj6#ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjU#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jQ#h´KóhjR#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj6#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jQ#h´Kóhj3#ubj )�”}”(hŒL``unsigned int min_vecs`` minimum required number of vectors (must be >= 1) ”h]”(j )�”}”(hŒ``unsigned int min_vecs``”h]”j )�”}”(hju#h]”hŒunsigned int min_vecs”…”�”}”(hjw#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjs#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kôhjo#ubj+ )�”}”(hhh]”j‘)�”}”(hŒ1minimum required number of vectors (must be >= 1)”h]”hŒ1minimum required number of vectors (must be >= 1)”…”�”}”(hjŽ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jŠ#h´Kôhj‹#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjo#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jŠ#h´Kôhj3#ubj )�”}”(hŒ<``unsigned int max_vecs`` maximum desired number of vectors ”h]”(j )�”}”(hŒ``unsigned int max_vecs``”h]”j )�”}”(hj®#h]”hŒunsigned int max_vecs”…”�”}”(hj°#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¬#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kõhj¨#ubj+ )�”}”(hhh]”j‘)�”}”(hŒ!maximum desired number of vectors”h]”hŒ!maximum desired number of vectors”…”�”}”(hjÇ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jÃ#h´KõhjÄ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj¨#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jÃ#h´Kõhj3#ubj )�”}”(hŒG``unsigned int flags`` allocation flags, as in pci_alloc_irq_vectors() ”h]”(j )�”}”(hŒ``unsigned int flags``”h]”j )�”}”(hjç#h]”hŒunsigned int flags”…”�”}”(hjé#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjå#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Köhjá#ubj+ )�”}”(hhh]”j‘)�”}”(hŒ/allocation flags, as in pci_alloc_irq_vectors()”h]”hŒ/allocation flags, as in pci_alloc_irq_vectors()”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jü#h´Köhjý#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjá#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jü#h´Köhj3#ubj )�”}”(hŒG``struct irq_affinity *affd`` affinity requirements (can be ``NULL``). ”h]”(j )�”}”(hŒ``struct irq_affinity *affd``”h]”j )�”}”(hj $h]”hŒstruct irq_affinity *affd”…”�”}”(hj"$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´K÷hj$ubj+ )�”}”(hhh]”j‘)�”}”(hŒ(affinity requirements (can be ``NULL``).”h]”(hŒaffinity requirements (can be ”…”�”}”(hj9$h²hh³Nh´Nubj )�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjA$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj9$ubhŒ).”…”�”}”(hj9$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j5$h´K÷hj6$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j5$h´K÷hj3#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hj#ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hjm$h]”hŒ Description”…”�”}”(hjo$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjk$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Kùhj#ubj‘)�”}”(hŒ¥Same as pci_alloc_irq_vectors(), but with the extra **affd** parameter. Check that function docs, and :c:type:`struct irq_affinity `, for more details.”h]”(hŒ4Same as pci_alloc_irq_vectors(), but with the extra ”…”�”}”(hjƒ$h²hh³Nh´Nubjî )�”}”(hŒ**affd**”h]”hŒaffd”…”�”}”(hj‹$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjƒ$ubhŒ* parameter. Check that function docs, and ”…”�”}”(hjƒ$h²hh³Nh´Nubh)�”}”(hŒ,:c:type:`struct irq_affinity `”h]”j )�”}”(hjŸ$h]”hŒstruct irq_affinity”…”�”}”(hj¡$h²hh³Nh´Nubah}”(h]”h ]”(Œxref”jZ Œc-type”eh"]”h$]”h&]”uh1j •Žhj�$ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ PCI/msi-howto”Œ refdomain”jZ Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j` jc )�”}”jf ]”sbŒ reftarget”Œ irq_affinity”uh1hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Køhjƒ$ubhŒ, for more details.”…”�”}”(hjƒ$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jÂ$h´Køhj#ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œpci_irq_vector (C function)”Œc.pci_irq_vector”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ9int pci_irq_vector (struct pci_dev *dev, unsigned int nr)”h]”jÐ )�”}”(hŒ8int pci_irq_vector(struct pci_dev *dev, unsigned int nr)”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hjí$h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjé$h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M,ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjü$h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjé$h²hh³jû$h´M,ubjù )�”}”(hŒpci_irq_vector”h]”jÿ )�”}”(hŒpci_irq_vector”h]”hŒpci_irq_vector”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj %ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjé$h²hh³jû$h´M,ubj )�”}”(hŒ&(struct pci_dev *dev, unsigned int nr)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj*%h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj&%ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7%h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj&%ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjH%h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjE%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jJ%Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ j%sbŒc.pci_irq_vector”†”asbuh1hhj&%ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh%h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj&%ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjv%h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj&%ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjƒ%h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj&%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj"%ubj )�”}”(hŒunsigned int nr”h]”(jÖ )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjœ%h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj˜%ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjª%h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj˜%ubjÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj¸%h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj˜%ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÆ%h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj˜%ubjÿ )�”}”(hŒnr”h]”hŒnr”…”�”}”(hjÔ%h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj˜%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj"%ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjé$h²hh³jû$h´M,ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjå$h²hh³jû$h´M,ubah}”(h]”jà$ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jû$h´M,hjâ$h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ1Get Linux IRQ number of a device interrupt vector”h]”hŒ1Get Linux IRQ number of a device interrupt vector”…”�”}”(hjþ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M,hjû%h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjâ$h²hh³jû$h´M,ubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ j&jß j&jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hX¯**Parameters** ``struct pci_dev *dev`` the PCI device to operate on ``unsigned int nr`` device-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode: **Description** * MSI-X the index in the MSI-X vector table * MSI the index of the enabled MSI vectors * INTx must be 0 **Return** the Linux IRQ number, or -EINVAL if **nr** is out of range”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj &h]”hŒ Parameters”…”�”}”(hj"&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M0hj&ubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj?&h]”hŒstruct pci_dev *dev”…”�”}”(hjA&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj=&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M-hj9&ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjX&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jT&h´M-hjU&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj9&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jT&h´M-hj6&ubj )�”}”(hŒ{``unsigned int nr`` device-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode: ”h]”(j )�”}”(hŒ``unsigned int nr``”h]”j )�”}”(hjx&h]”hŒunsigned int nr”…”�”}”(hjz&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjv&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M/hjr&ubj+ )�”}”(hhh]”j‘)�”}”(hŒfdevice-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode:”h]”hŒfdevice-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode:”…”�”}”(hj‘&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M.hjŽ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjr&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j�&h´M/hj6&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hj&ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj´&h]”hŒ Description”…”�”}”(hj¶&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj²&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M1hj&ubjj)�”}”(hŒw* MSI-X the index in the MSI-X vector table * MSI the index of the enabled MSI vectors * INTx must be 0 ”h]”j)�”}”(hhh]”(jÞ)�”}”(hŒ-MSI-X the index in the MSI-X vector table”h]”j‘)�”}”(hjÓ&h]”hŒ-MSI-X the index in the MSI-X vector table”…”�”}”(hjÕ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M0hjÑ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÎ&ubjÞ)�”}”(hŒ.MSI the index of the enabled MSI vectors”h]”j‘)�”}”(hjë&h]”hŒ.MSI the index of the enabled MSI vectors”…”�”}”(hjí&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M1hjé&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÎ&ubjÞ)�”}”(hŒINTx must be 0 ”h]”j‘)�”}”(hŒINTx must be 0”h]”hŒINTx must be 0”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M2hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjÎ&ubeh}”(h]”h ]”h"]”h$]”h&]”j6 j€ uh1j~h³jâ&h´M0hjÊ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jih³jâ&h´M0hj&ubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hj('h]”hŒReturn”…”�”}”(hj*'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj&'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M4hj&ubj‘)�”}”(hŒ:the Linux IRQ number, or -EINVAL if **nr** is out of range”h]”(hŒ$the Linux IRQ number, or -EINVAL if ”…”�”}”(hj>'h²hh³Nh´Nubjî )�”}”(hŒ**nr**”h]”hŒnr”…”�”}”(hjF'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj>'ubhŒ is out of range”…”�”}”(hj>'h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M5hj&ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ!pci_irq_get_affinity (C function)”Œc.pci_irq_get_affinity”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒIconst struct cpumask * pci_irq_get_affinity (struct pci_dev *dev, int nr)”h]”jÐ )�”}”(hŒGconst struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)”h]”(j$ )�”}”(hj�h]”hŒconst”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj{'h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MDubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�'h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj{'h²hh³jŒ'h´MDubj$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj›'h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj{'h²hh³jŒ'h´MDubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨'h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj{'h²hh³jŒ'h´MDubh)�”}”(hhh]”jÿ )�”}”(hŒcpumask”h]”hŒcpumask”…”�”}”(hj¹'h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj¶'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”j»'Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ Œpci_irq_get_affinity”sbŒc.pci_irq_get_affinity”†”asbuh1hhj{'h²hh³jŒ'h´MDubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚ'h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj{'h²hh³jŒ'h´MDubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjè'h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj{'h²hh³jŒ'h´MDubjù )�”}”(hŒpci_irq_get_affinity”h]”jÿ )�”}”(hj×'h]”hŒpci_irq_get_affinity”…”�”}”(hjù'h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjõ'ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hj{'h²hh³jŒ'h´MDubj )�”}”(hŒ(struct pci_dev *dev, int nr)”h]”(j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj(ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj!(h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj(ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj2(h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj/(ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”j4(Œmodname”NŒ classname”Nj` jc )�”}”jf ]”jÕ'Œc.pci_irq_get_affinity”†”asbuh1hhj(ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjP(h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj(ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hj^(h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj(ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjk(h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj(ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj (ubj )�”}”(hŒint nr”h]”(jÖ )�”}”(hŒint”h]”hŒint”…”�”}”(hj„(h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj€(ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj’(h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj€(ubjÿ )�”}”(hŒnr”h]”hŒnr”…”�”}”(hj (h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj€(ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj (ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hj{'h²hh³jŒ'h´MDubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjw'h²hh³jŒ'h´MDubah}”(h]”jr'ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jŒ'h´MDhjt'h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ&Get a device interrupt vector affinity”h]”hŒ&Get a device interrupt vector affinity”…”�”}”(hjÊ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MDhjÇ(h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjt'h²hh³jŒ'h´MDubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jâ(jß jâ(jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hXí**Parameters** ``struct pci_dev *dev`` the PCI device to operate on ``int nr`` device-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode: **Description** * MSI-X the index in the MSI-X vector table * MSI the index of the enabled MSI vectors * INTx must be 0 **Return** MSI/MSI-X vector affinity, NULL if **nr** is out of range or if the MSI(-X) vector was allocated without explicit affinity requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or pci_alloc_irq_vectors() without the ``PCI_IRQ_AFFINITY`` flag). Return a generic set of CPU IDs representing all possible CPUs available during system boot if the device is in legacy INTx mode.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjì(h]”hŒ Parameters”…”�”}”(hjî(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjê(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MHhjæ(ubj )�”}”(hhh]”(j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj )h]”hŒstruct pci_dev *dev”…”�”}”(hj )h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj )ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MEhj)ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hj$)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j )h´MEhj!)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j )h´MEhj)ubj )�”}”(hŒr``int nr`` device-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode: ”h]”(j )�”}”(hŒ ``int nr``”h]”j )�”}”(hjD)h]”hŒint nr”…”�”}”(hjF)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjB)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MGhj>)ubj+ )�”}”(hhh]”j‘)�”}”(hŒfdevice-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode:”h]”hŒfdevice-relative interrupt vector index (0-based); has different meanings, depending on interrupt mode:”…”�”}”(hj])h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MFhjZ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj>)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³jY)h´MGhj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hjæ(ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj€)h]”hŒ Description”…”�”}”(hj‚)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj~)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MIhjæ(ubjj)�”}”(hŒw* MSI-X the index in the MSI-X vector table * MSI the index of the enabled MSI vectors * INTx must be 0 ”h]”j)�”}”(hhh]”(jÞ)�”}”(hŒ-MSI-X the index in the MSI-X vector table”h]”j‘)�”}”(hjŸ)h]”hŒ-MSI-X the index in the MSI-X vector table”…”�”}”(hj¡)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MHhj�)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjš)ubjÞ)�”}”(hŒ.MSI the index of the enabled MSI vectors”h]”j‘)�”}”(hj·)h]”hŒ.MSI the index of the enabled MSI vectors”…”�”}”(hj¹)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MIhjµ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjš)ubjÞ)�”}”(hŒINTx must be 0 ”h]”j‘)�”}”(hŒINTx must be 0”h]”hŒINTx must be 0”…”�”}”(hjÑ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MJhjÍ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝhjš)ubeh}”(h]”h ]”h"]”h$]”h&]”j6 j€ uh1j~h³j®)h´MHhj–)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jih³j®)h´MHhjæ(ubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hjô)h]”hŒReturn”…”�”}”(hjö)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjò)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MLhjæ(ubj‘)�”}”(hX�MSI/MSI-X vector affinity, NULL if **nr** is out of range or if the MSI(-X) vector was allocated without explicit affinity requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or pci_alloc_irq_vectors() without the ``PCI_IRQ_AFFINITY`` flag). Return a generic set of CPU IDs representing all possible CPUs available during system boot if the device is in legacy INTx mode.”h]”(hŒ#MSI/MSI-X vector affinity, NULL if ”…”�”}”(hj *h²hh³Nh´Nubjî )�”}”(hŒ**nr**”h]”hŒnr”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj *ubhŒ» is out of range or if the MSI(-X) vector was allocated without explicit affinity requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or pci_alloc_irq_vectors() without the ”…”�”}”(hj *h²hh³Nh´Nubj )�”}”(hŒ``PCI_IRQ_AFFINITY``”h]”hŒPCI_IRQ_AFFINITY”…”�”}”(hj$*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj *ubhŒ‰ flag). Return a generic set of CPU IDs representing all possible CPUs available during system boot if the device is in legacy INTx mode.”…”�”}”(hj *h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MMhjæ(ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ!pci_free_irq_vectors (C function)”Œc.pci_free_irq_vectors”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ/void pci_free_irq_vectors (struct pci_dev *dev)”h]”jÐ )�”}”(hŒ.void pci_free_irq_vectors(struct pci_dev *dev)”h]”(jÖ )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj]*h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjY*h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Moubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjl*h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjY*h²hh³jk*h´Moubjù )�”}”(hŒpci_free_irq_vectors”h]”jÿ )�”}”(hŒpci_free_irq_vectors”h]”hŒpci_free_irq_vectors”…”�”}”(hj~*h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjz*ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjY*h²hh³jk*h´Moubj )�”}”(hŒ(struct pci_dev *dev)”h]”j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hjš*h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj–*ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§*h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj–*ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hj¸*h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjµ*ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jº*Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ j€*sbŒc.pci_free_irq_vectors”†”asbuh1hhj–*ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjØ*h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj–*ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjæ*h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj–*ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjó*h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj–*ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj’*ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjY*h²hh³jk*h´Moubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjU*h²hh³jk*h´Moubah}”(h]”jP*ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jk*h´MohjR*h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ+Free previously allocated IRQs for a device”h]”hŒ+Free previously allocated IRQs for a device”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mohj+h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjR*h²hh³jk*h´Moubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ j5+jß j5+jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hXå**Parameters** ``struct pci_dev *dev`` the PCI device to operate on **Description** Undo the interrupt vector allocations and possible device MSI/MSI-X enablement earlier done through pci_alloc_irq_vectors_affinity() or pci_alloc_irq_vectors(). WARNING: Do not call this function if the device has been enabled with pcim_enable_device(). In that case, IRQ vectors are automatically managed via pcim_msi_release() and calling pci_free_irq_vectors() can lead to double-free issues.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hj?+h]”hŒ Parameters”…”�”}”(hjA+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj=+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mshj9+ubj )�”}”(hhh]”j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hj^+h]”hŒstruct pci_dev *dev”…”�”}”(hj`+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj\+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´MphjX+ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hjw+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³js+h´Mphjt+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjX+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³js+h´MphjU+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj9+ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj™+h]”hŒ Description”…”�”}”(hj›+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj—+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mrhj9+ubj‘)�”}”(hŒ Undo the interrupt vector allocations and possible device MSI/MSI-X enablement earlier done through pci_alloc_irq_vectors_affinity() or pci_alloc_irq_vectors().”h]”hŒ Undo the interrupt vector allocations and possible device MSI/MSI-X enablement earlier done through pci_alloc_irq_vectors_affinity() or pci_alloc_irq_vectors().”…”�”}”(hj¯+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mqhj9+ubj‘)�”}”(hŒêWARNING: Do not call this function if the device has been enabled with pcim_enable_device(). In that case, IRQ vectors are automatically managed via pcim_msi_release() and calling pci_free_irq_vectors() can lead to double-free issues.”h]”hŒêWARNING: Do not call this function if the device has been enabled with pcim_enable_device(). In that case, IRQ vectors are automatically managed via pcim_msi_release() and calling pci_free_irq_vectors() can lead to double-free issues.”…”�”}”(hj¾+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Muhj9+ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œ"pci_restore_msi_state (C function)”Œc.pci_restore_msi_state”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒ0void pci_restore_msi_state (struct pci_dev *dev)”h]”jÐ )�”}”(hŒ/void pci_restore_msi_state(struct pci_dev *dev)”h]”(jÖ )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjí+h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjé+h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mƒubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjü+h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjé+h²hh³jû+h´Mƒubjù )�”}”(hŒpci_restore_msi_state”h]”jÿ )�”}”(hŒpci_restore_msi_state”h]”hŒpci_restore_msi_state”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj ,ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjé+h²hh³jû+h´Mƒubj )�”}”(hŒ(struct pci_dev *dev)”h]”j )�”}”(hŒstruct pci_dev *dev”h]”(j$ )�”}”(hj' h]”hŒstruct”…”�”}”(hj*,h²hh³Nh´Nubah}”(h]”h ]”j0 ah"]”h$]”h&]”uh1j# hj&,ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7,h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj&,ubh)�”}”(hhh]”jÿ )�”}”(hŒpci_dev”h]”hŒpci_dev”…”�”}”(hjH,h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjE,ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jZ Œreftype”j\ Œ reftarget”jJ,Œmodname”NŒ classname”Nj` jc )�”}”jf ]”ji )�”}”j\ j,sbŒc.pci_restore_msi_state”†”asbuh1hhj&,ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh,h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hj&,ubj} )�”}”(hj€ h]”hŒ*”…”�”}”(hjv,h²hh³Nh´Nubah}”(h]”h ]”j‰ ah"]”h$]”h&]”uh1j| hj&,ubjÿ )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjƒ,h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hj&,ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj",ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjé+h²hh³jû+h´Mƒubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjå+h²hh³jû+h´Mƒubah}”(h]”jà+ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³jû+h´Mƒhjâ+h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ&Restore cached MSI(-X) state on device”h]”hŒ&Restore cached MSI(-X) state on device”…”�”}”(hj­,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Mƒhjª,h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjâ+h²hh³jû+h´Mƒubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jÅ,jß jÅ,jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hŒè**Parameters** ``struct pci_dev *dev`` the PCI device to operate on **Description** Write the Linux-cached MSI(-X) state back on device. This is typically useful upon system resume, or after an error-recovery PCI adapter reset.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjÏ,h]”hŒ Parameters”…”�”}”(hjÑ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjÍ,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M‡hjÉ,ubj )�”}”(hhh]”j )�”}”(hŒ5``struct pci_dev *dev`` the PCI device to operate on ”h]”(j )�”}”(hŒ``struct pci_dev *dev``”h]”j )�”}”(hjî,h]”hŒstruct pci_dev *dev”…”�”}”(hjð,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjì,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M„hjè,ubj+ )�”}”(hhh]”j‘)�”}”(hŒthe PCI device to operate on”h]”hŒthe PCI device to operate on”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j-h´M„hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hjè,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j-h´M„hjå,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÉ,ubj‘)�”}”(hŒ**Description**”h]”jî )�”}”(hj)-h]”hŒ Description”…”�”}”(hj+-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hj'-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M†hjÉ,ubj‘)�”}”(hŒ�Write the Linux-cached MSI(-X) state back on device. This is typically useful upon system resume, or after an error-recovery PCI adapter reset.”h]”hŒ�Write the Linux-cached MSI(-X) state back on device. This is typically useful upon system resume, or after an error-recovery PCI adapter reset.”…”�”}”(hj?-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M…hjÉ,ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubj´ )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÀ Œpci_msi_enabled (C function)”Œc.pci_msi_enabled”hNt”auh1j³ hj‚ h²hh³Nh´NubjÅ )�”}”(hhh]”(jÊ )�”}”(hŒbool pci_msi_enabled (void)”h]”jÐ )�”}”(hŒbool pci_msi_enabled(void)”h]”(jÖ )�”}”(hjáh]”hŒbool”…”�”}”(hjn-h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hjj-h²hh³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M’ubjè )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj|-h²hh³Nh´Nubah}”(h]”h ]”jô ah"]”h$]”h&]”uh1jç hjj-h²hh³j{-h´M’ubjù )�”}”(hŒpci_msi_enabled”h]”jÿ )�”}”(hŒpci_msi_enabled”h]”hŒpci_msi_enabled”…”�”}”(hjŽ-h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jþ hjŠ-ubah}”(h]”h ]”(j j eh"]”h$]”h&]”hÅhÆuh1jø hjj-h²hh³j{-h´M’ubj )�”}”(hŒ(void)”h]”j )�”}”(hŒvoid”h]”jÖ )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjª-h²hh³Nh´Nubah}”(h]”h ]”jâ ah"]”h$]”h&]”uh1jÕ hj¦-ubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j hj¢-ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j hjj-h²hh³j{-h´M’ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj® ˆuh1jÏ j¯ j° hjf-h²hh³j{-h´M’ubah}”(h]”ja-ah ]”(j´ jµ eh"]”h$]”h&]”j¹ ˆjº )j» huh1jÉ h³j{-h´M’hjc-h²hubj½ )�”}”(hhh]”j‘)�”}”(hŒ+Are MSI(-X) interrupts enabled system-wide?”h]”hŒ+Are MSI(-X) interrupts enabled system-wide?”…”�”}”(hjÔ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M’hjÑ-h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼ hjc-h²hh³j{-h´M’ubeh}”(h]”h ]”(jZ Œfunction”eh"]”h$]”h&]”jÝ jZ jÞ jì-jß jì-jà ‰já ‰jâ ‰uh1jÄ h²hhj‚ h³Nh´Nubjä )�”}”(hŒ´**Parameters** ``void`` no arguments **Return** true if MSI has not been globally disabled through ACPI FADT, PCI bridge quirks, or the "pci=nomsi" kernel command-line option.”h]”(j‘)�”}”(hŒ**Parameters**”h]”jî )�”}”(hjö-h]”hŒ Parameters”…”�”}”(hjø-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjô-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M–hjð-ubj )�”}”(hhh]”j )�”}”(hŒ``void`` no arguments ”h]”(j )�”}”(hŒ``void``”h]”j )�”}”(hj.h]”hŒvoid”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khj.ubj+ )�”}”(hhh]”j‘)�”}”(hŒ no arguments”h]”hŒ no arguments”…”�”}”(hj..h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j*.h´Khj+.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j* hj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³j*.h´Khj .ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjð-ubj‘)�”}”(hŒ **Return**”h]”jî )�”}”(hjP.h]”hŒReturn”…”�”}”(hjR.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jí hjN.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´Khjð-ubj‘)�”}”(hŒtrue if MSI has not been globally disabled through ACPI FADT, PCI bridge quirks, or the "pci=nomsi" kernel command-line option.”h]”hŒƒtrue if MSI has not been globally disabled through ACPI FADT, PCI bridge quirks, or the “pci=nomsiâ€� kernel command-line option.”…”�”}”(hjf.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³ŒT/var/lib/git/docbuild/linux/Documentation/PCI/msi-howto:385: ./drivers/pci/msi/api.c”h´M”hjð-ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jã hj‚ h²hh³Nh´Nubeh}”(h]”Œ!list-of-device-drivers-msi-x-apis”ah ]”h"]”Œ#list of device drivers msi(-x) apis”ah$]”h&]”uh1j[hj]h²hh³hÇh´M&ubeh}”(h]”Œthe-msi-driver-guide-howto”ah ]”h"]”Œthe msi driver guide howto”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†.jjjHjEj™j–j¶j³jßjÜjjjGjDj‡j„jj|j®j«j j| jx ju jù jö j j jw jt j�.j~.uŒ nametypes”}”(j‰.‰j‰jH‰j™‰j¶‰j߉j‰jG‰j‡‰j‰j®‰j ‰jx ‰jù ‰j ‰jw ‰j�.‰uh}”(j†.j]jjájEjj–jKj³jœjÜj»jjâjDjj„jJj|j[j«jŠj| j¹ju j0 jö j{ j jü jt j# j~.j‚ j jË jé jî j£j¨j$j)jÒj×jSjXj¦j«jÃjÈj}j‚jË jÐ jà$jå$jr'jw'jP*jU*jà+jå+ja-jf-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”]”ŒDocumentation/PCI/msi-howto.rst”(NNNNt”†”aŒ decoration”Nh²hub.