wsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget-/translations/zh_CN/admin-guide/pm/intel_idlemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/zh_TW/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/it_IT/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ja_JP/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ko_KR/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/pt_BR/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/sp_SP/admin-guide/pm/intel_idlemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhG/var/lib/git/docbuild/linux/Documentation/admin-guide/pm/intel_idle.rsthKubh)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubh)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hhsbah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hhsbah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hjsbah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hj#sbah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hj2sbah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hjAsbah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hjPsbah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hj_sbah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hjnsbah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hj}sbah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjsbah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hjsbah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjsbah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hjsbah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hj"sbah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hj1sbah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hj@sbah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hjOsbah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hj^sbah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hjmsbah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hj|sbah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjsbah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hjsbah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjsbah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hjsbah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hj!sbah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hj0sbah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hj?sbah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hjNsbah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hj]sbah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hjlsbah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hj{sbah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjsbah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hjsbah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjsbah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjsbah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hj/sbah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hj>sbah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hjMsbah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hj\sbah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hjksbah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hjzsbah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjsbah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hjsbah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjsbah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjsbah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hjsbah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hj.sbah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hj=sbah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hjLsbah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(h.``intel_idle`` CPU Idle Time Management Driverh](hliteral)}(h``intel_idle``h]h intel_idle}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjbubh CPU Idle Time Management Driver}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1j`hj]hhhhhKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(h Copyrighth]h Copyright}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhKubh field_body)}(h|copy| 2020 Intel Corporation h]h paragraph)}(h|copy| 2020 Intel Corporationh](h©}(hjhhhNhNubh 2020 Intel Corporation}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubj)}(hhh](j)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhKubj)}(h0Rafael J. Wysocki h]j)}(h.Rafael J. Wysocki h](hRafael J. Wysocki <}(hjhhhNhNubh reference)}(hrafael.j.wysocki@intel.comh]hrafael.j.wysocki@intel.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:rafael.j.wysocki@intel.comuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhK hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK hjhhubeh}(h]h ]h"]h$]h&]uh1jhj]hhhhhKubj\)}(hhh](ja)}(hGeneral Informationh]hGeneral Information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj hhhhhKubj)}(hXr``intel_idle`` is a part of the :doc:`CPU idle time management subsystem ` in the Linux kernel (``CPUIdle``). It is the default CPU idle time management driver for the Nehalem and later generations of Intel processors, but the level of support for a particular processor model in it depends on whether or not it recognizes that processor model and may also depend on information coming from the platform firmware. [To understand ``intel_idle`` it is necessary to know how ``CPUIdle`` works in general, so this is the time to get familiar with Documentation/admin-guide/pm/cpuidle.rst if you have not done that yet.]h](jg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh is a part of the }(hjhhhNhNubh)}(h3:doc:`CPU idle time management subsystem `h]hinline)}(hj4h]h"CPU idle time management subsystem}(hj8hhhNhNubah}(h]h ](xrefstdstd-doceh"]h$]h&]uh1j6hj2ubah}(h]h ]h"]h$]h&]refdocadmin-guide/pm/intel_idle refdomainjCreftypedoc refexplicitrefwarn reftargetcpuidleuh1hhhhKhjubh in the Linux kernel (}(hjhhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhXD). It is the default CPU idle time management driver for the Nehalem and later generations of Intel processors, but the level of support for a particular processor model in it depends on whether or not it recognizes that processor model and may also depend on information coming from the platform firmware. [To understand }(hjhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh it is necessary to know how }(hjhhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh works in general, so this is the time to get familiar with Documentation/admin-guide/pm/cpuidle.rst if you have not done that yet.]}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hX``intel_idle`` uses the ``MWAIT`` instruction to inform the processor that the logical CPU executing it is idle and so it may be possible to put some of the processor's functional blocks into low-power states. That instruction takes two arguments (passed in the ``EAX`` and ``ECX`` registers of the target CPU), the first of which, referred to as a *hint*, can be used by the processor to determine what can be done (for details refer to Intel Software Developer’s Manual [1]_). Accordingly, ``intel_idle`` refuses to work with processors in which the support for the ``MWAIT`` instruction has been disabled (for example, via the platform firmware configuration menu) or which do not support that instruction at all.h](jg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh uses the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh instruction to inform the processor that the logical CPU executing it is idle and so it may be possible to put some of the processor’s functional blocks into low-power states. That instruction takes two arguments (passed in the }(hjhhhNhNubjg)}(h``EAX``h]hEAX}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh and }(hjhhhNhNubjg)}(h``ECX``h]hECX}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhD registers of the target CPU), the first of which, referred to as a }(hjhhhNhNubhemphasis)}(h*hint*h]hhint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhw, can be used by the processor to determine what can be done (for details refer to Intel Software Developer’s Manual }(hjhhhNhNubhfootnote_reference)}(h[1]_h]h1}(hjhhhNhNubah}(h]id1ah ]h"]h$]h&]refidid3docnamejOuh1jhjresolvedKubh). Accordingly, }(hjhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh> refuses to work with processors in which the support for the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh instruction has been disabled (for example, via the platform firmware configuration menu) or which do not support that instruction at all.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(h``intel_idle`` is not modular, so it cannot be unloaded, which means that the only way to pass early-configuration-time parameters to it is via the kernel command line.h](jg)}(h``intel_idle``h]h intel_idle}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj:ubh is not modular, so it cannot be unloaded, which means that the only way to pass early-configuration-time parameters to it is via the kernel command line.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhK%hj hhubeh}(h]general-informationah ]h"]general informationah$]h&]uh1j[hj]hhhhhKubj\)}(hhh](ja)}(hSysfs Interfaceh]hSysfs Interface}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj^hhhhhK*ubj)}(hmThe ``intel_idle`` driver exposes the following ``sysfs`` attributes in ``/sys/devices/system/cpu/cpuidle/``:h](hThe }(hjohhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjoubh driver exposes the following }(hjohhhNhNubjg)}(h ``sysfs``h]hsysfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjoubh attributes in }(hjohhhNhNubjg)}(h$``/sys/devices/system/cpu/cpuidle/``h]h /sys/devices/system/cpu/cpuidle/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjoubh:}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhK,hj^hhubhdefinition_list)}(hhh]hdefinition_list_item)}(hXp``intel_c1_demotion`` Enable or disable C1 demotion for all CPUs in the system. This file is only exposed on platforms that support the C1 demotion feature and where it was tested. Value 0 means that C1 demotion is disabled, value 1 means that it is enabled. Write 0 or 1 to disable or enable C1 demotion for all CPUs. The C1 demotion feature involves the platform firmware demoting deep C-state requests from the OS (e.g., C6 requests) to C1. The idea is that firmware monitors CPU wake-up rate, and if it is higher than a platform-specific threshold, the firmware demotes deep C-state requests to C1. For example, Linux requests C6, but firmware noticed too many wake-ups per second, and it keeps the CPU in C1. When the CPU stays in C1 long enough, the platform promotes it back to C6. This may improve some workloads' performance, but it may also increase power consumption. h](hterm)}(h``intel_c1_demotion``h]jg)}(hjh]hintel_c1_demotion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubah}(h]h ]h"]h$]h&]uh1jhhhK=hjubh definition)}(hhh](j)}(hX(Enable or disable C1 demotion for all CPUs in the system. This file is only exposed on platforms that support the C1 demotion feature and where it was tested. Value 0 means that C1 demotion is disabled, value 1 means that it is enabled. Write 0 or 1 to disable or enable C1 demotion for all CPUs.h]hX(Enable or disable C1 demotion for all CPUs in the system. This file is only exposed on platforms that support the C1 demotion feature and where it was tested. Value 0 means that C1 demotion is disabled, value 1 means that it is enabled. Write 0 or 1 to disable or enable C1 demotion for all CPUs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK0hjubj)}(hX/The C1 demotion feature involves the platform firmware demoting deep C-state requests from the OS (e.g., C6 requests) to C1. The idea is that firmware monitors CPU wake-up rate, and if it is higher than a platform-specific threshold, the firmware demotes deep C-state requests to C1. For example, Linux requests C6, but firmware noticed too many wake-ups per second, and it keeps the CPU in C1. When the CPU stays in C1 long enough, the platform promotes it back to C6. This may improve some workloads' performance, but it may also increase power consumption.h]hX1The C1 demotion feature involves the platform firmware demoting deep C-state requests from the OS (e.g., C6 requests) to C1. The idea is that firmware monitors CPU wake-up rate, and if it is higher than a platform-specific threshold, the firmware demotes deep C-state requests to C1. For example, Linux requests C6, but firmware noticed too many wake-ups per second, and it keeps the CPU in C1. When the CPU stays in C1 long enough, the platform promotes it back to C6. This may improve some workloads’ performance, but it may also increase power consumption.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK6hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhK=hjubah}(h]h ]h"]h$]h&]uh1jhj^hhhhhNubhtarget)}(h%.. _intel-idle-enumeration-of-states:h]h}(h]h ]h"]h$]h&]j intel-idle-enumeration-of-statesuh1j hKhj^hhhhnj referencedKubeh}(h]sysfs-interfaceah ]h"]sysfs interfaceah$]h&]uh1j[hj]hhhhhK*ubj\)}(hhh](ja)}(hEnumeration of Idle Statesh]hEnumeration of Idle States}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj hhhhhKBubj)}(hXEach ``MWAIT`` hint value is interpreted by the processor as a license to reconfigure itself in a certain way in order to save energy. The processor configurations (with reduced power draw) resulting from that are referred to as C-states (in the ACPI terminology) or idle states. The list of meaningful ``MWAIT`` hint values and idle states (i.e. low-power configurations of the processor) corresponding to them depends on the processor model and it may also depend on the configuration of the platform.h](hEach }(hj1hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj1ubhX# hint value is interpreted by the processor as a license to reconfigure itself in a certain way in order to save energy. The processor configurations (with reduced power draw) resulting from that are referred to as C-states (in the ACPI terminology) or idle states. The list of meaningful }(hj1hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj1ubh hint values and idle states (i.e. low-power configurations of the processor) corresponding to them depends on the processor model and it may also depend on the configuration of the platform.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKDhj hhubj)}(hX(In order to create a list of available idle states required by the ``CPUIdle`` subsystem (see :ref:`idle-states-representation` in Documentation/admin-guide/pm/cpuidle.rst), ``intel_idle`` can use two sources of information: static tables of idle states for different processor models included in the driver itself and the ACPI tables of the system. The former are always used if the processor model at hand is recognized by ``intel_idle`` and the latter are used if that is required for the given processor model (which is the case for all server processor models recognized by ``intel_idle``) or if the processor model is not recognized. [There is a module parameter that can be used to make the driver use the ACPI tables with any processor model recognized by it; see `below `_.]h](hCIn order to create a list of available idle states required by the }(hjchhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjcubh subsystem (see }(hjchhhNhNubh)}(h!:ref:`idle-states-representation`h]j7)}(hjh]hidle-states-representation}(hjhhhNhNubah}(h]h ](jBstdstd-refeh"]h$]h&]uh1j6hj}ubah}(h]h ]h"]h$]h&]refdocjO refdomainjreftyperef refexplicitrefwarnjUidle-states-representationuh1hhhhKLhjcubh/ in Documentation/admin-guide/pm/cpuidle.rst), }(hjchhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjcubh can use two sources of information: static tables of idle states for different processor models included in the driver itself and the ACPI tables of the system. The former are always used if the processor model at hand is recognized by }(hjchhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjcubh and the latter are used if that is required for the given processor model (which is the case for all server processor models recognized by }(hjchhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjcubh) or if the processor model is not recognized. [There is a module parameter that can be used to make the driver use the ACPI tables with any processor model recognized by it; see }(hjchhhNhNubj)}(h!`below `_h]hbelow}(hjhhhNhNubah}(h]h ]h"]h$]h&]namebelowjintel-idle-parametersuh1jhjcj Kubj )}(h h]h}(h]h ]h"]belowah$]h&]jjuh1j indirect_reference_nameintel-idle-parametershjcj Kubh.]}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKLhj hhubj)}(hXIf the ACPI tables are going to be used for building the list of available idle states, ``intel_idle`` first looks for a ``_CST`` object under one of the ACPI objects corresponding to the CPUs in the system (refer to the ACPI specification [2]_ for the description of ``_CST`` and its output package). Because the ``CPUIdle`` subsystem expects that the list of idle states supplied by the driver will be suitable for all of the CPUs handled by it and ``intel_idle`` is registered as the ``CPUIdle`` driver for all of the CPUs in the system, the driver looks for the first ``_CST`` object returning at least one valid idle state description and such that all of the idle states included in its return package are of the FFH (Functional Fixed Hardware) type, which means that the ``MWAIT`` instruction is expected to be used to tell the processor that it can enter one of them. The return package of that ``_CST`` is then assumed to be applicable to all of the other CPUs in the system and the idle state descriptions extracted from it are stored in a preliminary list of idle states coming from the ACPI tables. [This step is skipped if ``intel_idle`` is configured to ignore the ACPI tables; see `below `_.]h](hXIf the ACPI tables are going to be used for building the list of available idle states, }(hjhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh first looks for a }(hjhhhNhNubjg)}(h``_CST``h]h_CST}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubho object under one of the ACPI objects corresponding to the CPUs in the system (refer to the ACPI specification }(hjhhhNhNubj)}(h[2]_h]h2}(hj+ hhhNhNubah}(h]id2ah ]h"]h$]h&]jid4j jOuh1jhjj Kubh for the description of }(hjhhhNhNubjg)}(h``_CST``h]h_CST}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh' and its output package). Because the }(hjhhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh~ subsystem expects that the list of idle states supplied by the driver will be suitable for all of the CPUs handled by it and }(hjhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh is registered as the }(hjhhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhJ driver for all of the CPUs in the system, the driver looks for the first }(hjhhhNhNubjg)}(h``_CST``h]h_CST}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh object returning at least one valid idle state description and such that all of the idle states included in its return package are of the FFH (Functional Fixed Hardware) type, which means that the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhu instruction is expected to be used to tell the processor that it can enter one of them. The return package of that }(hjhhhNhNubjg)}(h``_CST``h]h_CST}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh is then assumed to be applicable to all of the other CPUs in the system and the idle state descriptions extracted from it are stored in a preliminary list of idle states coming from the ACPI tables. [This step is skipped if }(hjhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh. is configured to ignore the ACPI tables; see }(hjhhhNhNubj)}(h!`below `_h]hbelow}(hj hhhNhNubah}(h]h ]h"]h$]h&]namebelowjjuh1jhjj Kubj )}(h h]h}(h]h ]h"]belowah$]h&]jjuh1j jintel-idle-parametershjj Kubh.]}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKYhj hhubj)}(hXNext, the first (index 0) entry in the list of available idle states is initialized to represent a "polling idle state" (a pseudo-idle state in which the target CPU continuously fetches and executes instructions), and the subsequent (real) idle state entries are populated as follows.h]hX Next, the first (index 0) entry in the list of available idle states is initialized to represent a “polling idle state” (a pseudo-idle state in which the target CPU continuously fetches and executes instructions), and the subsequent (real) idle state entries are populated as follows.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKjhj hhubj)}(hXIf the processor model at hand is recognized by ``intel_idle``, there is a (static) table of idle state descriptions for it in the driver. In that case, the "internal" table is the primary source of information on idle states and the information from it is copied to the final list of available idle states. If using the ACPI tables for the enumeration of idle states is not required (depending on the processor model), all of the listed idle state are enabled by default (so all of them will be taken into consideration by ``CPUIdle`` governors during CPU idle state selection). Otherwise, some of the listed idle states may not be enabled by default if there are no matching entries in the preliminary list of idle states coming from the ACPI tables. In that case user space still can enable them later (on a per-CPU basis) with the help of the ``disable`` idle state attribute in ``sysfs`` (see :ref:`idle-states-representation` in Documentation/admin-guide/pm/cpuidle.rst). This basically means that the idle states "known" to the driver may not be enabled by default if they have not been exposed by the platform firmware (through the ACPI tables).h](h0If the processor model at hand is recognized by }(hj hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubhX, there is a (static) table of idle state descriptions for it in the driver. In that case, the “internal” table is the primary source of information on idle states and the information from it is copied to the final list of available idle states. If using the ACPI tables for the enumeration of idle states is not required (depending on the processor model), all of the listed idle state are enabled by default (so all of them will be taken into consideration by }(hj hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubhX: governors during CPU idle state selection). Otherwise, some of the listed idle states may not be enabled by default if there are no matching entries in the preliminary list of idle states coming from the ACPI tables. In that case user space still can enable them later (on a per-CPU basis) with the help of the }(hj hhhNhNubjg)}(h ``disable``h]hdisable}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh idle state attribute in }(hj hhhNhNubjg)}(h ``sysfs``h]hsysfs}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh (see }(hj hhhNhNubh)}(h!:ref:`idle-states-representation`h]j7)}(hjU h]hidle-states-representation}(hjW hhhNhNubah}(h]h ](jBstdstd-refeh"]h$]h&]uh1j6hjS ubah}(h]h ]h"]h$]h&]refdocjO refdomainja reftyperef refexplicitrefwarnjUidle-states-representationuh1hhhhKohj ubh in Documentation/admin-guide/pm/cpuidle.rst). This basically means that the idle states “known” to the driver may not be enabled by default if they have not been exposed by the platform firmware (through the ACPI tables).}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKohj hhubj)}(hX3If the given processor model is not recognized by ``intel_idle``, but it supports ``MWAIT``, the preliminary list of idle states coming from the ACPI tables is used for building the final list that will be supplied to the ``CPUIdle`` core during driver registration. For each idle state in that list, the description, ``MWAIT`` hint and exit latency are copied to the corresponding entry in the final list of idle states. The name of the idle state represented by it (to be returned by the ``name`` idle state attribute in ``sysfs``) is "CX_ACPI", where X is the index of that idle state in the final list (note that the minimum value of X is 1, because 0 is reserved for the "polling" state), and its target residency is based on the exit latency value. Specifically, for C1-type idle states the exit latency value is also used as the target residency (for compatibility with the majority of the "internal" tables of idle states for various processor models recognized by ``intel_idle``) and for the other idle state types (C2 and C3) the target residency value is 3 times the exit latency (again, that is because it reflects the target residency to exit latency ratio in the majority of cases for the processor models recognized by ``intel_idle``). All of the idle states in the final list are enabled by default in this case.h](h2If the given processor model is not recognized by }(hj} hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubh, but it supports }(hj} hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubh, the preliminary list of idle states coming from the ACPI tables is used for building the final list that will be supplied to the }(hj} hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubhV core during driver registration. For each idle state in that list, the description, }(hj} hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubh hint and exit latency are copied to the corresponding entry in the final list of idle states. The name of the idle state represented by it (to be returned by the }(hj} hhhNhNubjg)}(h``name``h]hname}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubh idle state attribute in }(hj} hhhNhNubjg)}(h ``sysfs``h]hsysfs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubhX) is “CX_ACPI”, where X is the index of that idle state in the final list (note that the minimum value of X is 1, because 0 is reserved for the “polling” state), and its target residency is based on the exit latency value. Specifically, for C1-type idle states the exit latency value is also used as the target residency (for compatibility with the majority of the “internal” tables of idle states for various processor models recognized by }(hj} hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubh) and for the other idle state types (C2 and C3) the target residency value is 3 times the exit latency (again, that is because it reflects the target residency to exit latency ratio in the majority of cases for the processor models recognized by }(hj} hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj} ubhP). All of the idle states in the final list are enabled by default in this case.}(hj} hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj )}(h.. _intel-idle-initialization:h]h}(h]h ]h"]h$]h&]jintel-idle-initializationuh1j hKhj hhhhubeh}(h](enumeration-of-idle-statesjeh ]h"](enumeration of idle states intel-idle-enumeration-of-stateseh$]h&]uh1j[hj]hhhhhKBexpect_referenced_by_name}j, j sexpect_referenced_by_id}jj sjKubj\)}(hhh](ja)}(hInitializationh]hInitialization}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj3 hhhhhKubj)}(hThe initialization of ``intel_idle`` starts with checking if the kernel command line options forbid the use of the ``MWAIT`` instruction. If that is the case, an error code is returned right away.h](hThe initialization of }(hjD hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjD ubhO starts with checking if the kernel command line options forbid the use of the }(hjD hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjD ubhI instruction. If that is the case, an error code is returned right away.}(hjD hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj3 hhubj)}(hX The next step is to check whether or not the processor model is known to the driver, which determines the idle states enumeration method (see `above `_), and whether or not the processor supports ``MWAIT`` (the initialization fails if that is not the case). Then, the ``MWAIT`` support in the processor is enumerated through ``CPUID`` and the driver initialization fails if the level of support is not as expected (for example, if the total number of ``MWAIT`` substates returned is 0).h](hThe next step is to check whether or not the processor model is known to the driver, which determines the idle states enumeration method (see }(hjv hhhNhNubj)}(h,`above `_h]habove}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]nameabovejjuh1jhjv j Kubj )}(h$ h]h}(h]h ]h"]aboveah$]h&]jjuh1j j intel-idle-enumeration-of-stateshjv j Kubh-), and whether or not the processor supports }(hjv hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjv ubh@ (the initialization fails if that is not the case). Then, the }(hjv hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjv ubh0 support in the processor is enumerated through }(hjv hhhNhNubjg)}(h ``CPUID``h]hCPUID}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjv ubhu and the driver initialization fails if the level of support is not as expected (for example, if the total number of }(hjv hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjv ubh substates returned is 0).}(hjv hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj3 hhubj)}(hNext, if the driver is not configured to ignore the ACPI tables (see `below `_), the idle states information provided by the platform firmware is extracted from them.h](hENext, if the driver is not configured to ignore the ACPI tables (see }(hj hhhNhNubj)}(h!`below `_h]hbelow}(hj hhhNhNubah}(h]h ]h"]h$]h&]namebelowjjuh1jhj j Kubj )}(h h]h}(h]h ]h"]belowah$]h&]jjuh1j jintel-idle-parametershj j KubhX), the idle states information provided by the platform firmware is extracted from them.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj3 hhubj)}(hThen, ``CPUIdle`` device objects are allocated for all CPUs and the list of available idle states is created as explained `above `_.h](hThen, }(hj hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubhi device objects are allocated for all CPUs and the list of available idle states is created as explained }(hj hhhNhNubj)}(h,`above `_h]habove}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]nameabovejjuh1jhj j Kubj )}(h$ h]h}(h]h ]h"]aboveah$]h&]jjuh1j j intel-idle-enumeration-of-stateshj j Kubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj3 hhubj)}(hXFinally, ``intel_idle`` is registered with the help of cpuidle_register_driver() as the ``CPUIdle`` driver for all CPUs in the system and a CPU online callback for configuring individual CPUs is registered via cpuhp_setup_state(), which (among other things) causes the callback routine to be invoked for all of the CPUs present in the system at that time (each CPU executes its own instance of the callback routine). That routine registers a ``CPUIdle`` device for the CPU running it (which enables the ``CPUIdle`` subsystem to operate that CPU) and optionally performs some CPU-specific initialization actions that may be required for the given processor model.h](h Finally, }(hjZ hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjZ ubhA is registered with the help of cpuidle_register_driver() as the }(hjZ hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjZ ubhXX driver for all CPUs in the system and a CPU online callback for configuring individual CPUs is registered via cpuhp_setup_state(), which (among other things) causes the callback routine to be invoked for all of the CPUs present in the system at that time (each CPU executes its own instance of the callback routine). That routine registers a }(hjZ hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjZ ubh2 device for the CPU running it (which enables the }(hjZ hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjZ ubh subsystem to operate that CPU) and optionally performs some CPU-specific initialization actions that may be required for the given processor model.}(hjZ hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj3 hhubj )}(h.. _intel-idle-parameters:h]h}(h]h ]h"]h$]h&]jjuh1j hM hj3 hhhhjKubeh}(h](initializationj% eh ]h"](initializationintel-idle-initializationeh$]h&]uh1j[hj]hhhhhKj/ }j j sj1 }j% j subj\)}(hhh](ja)}(h1Kernel Command Line Options and Module Parametersh]h1Kernel Command Line Options and Module Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj hhhhhKubj)}(hXHThe *x86* architecture support code recognizes three kernel command line options related to CPU idle time management: ``idle=poll``, ``idle=halt``, and ``idle=nomwait``. If any of them is present in the kernel command line, the ``MWAIT`` instruction is not allowed to be used, so the initialization of ``intel_idle`` will fail.h](hThe }(hj hhhNhNubj)}(h*x86*h]hx86}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhm architecture support code recognizes three kernel command line options related to CPU idle time management: }(hj hhhNhNubjg)}(h ``idle=poll``h]h idle=poll}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh, }(hj hhhNhNubjg)}(h ``idle=halt``h]h idle=halt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh, and }(hj hhhNhNubjg)}(h``idle=nomwait``h]h idle=nomwait}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh=. If any of them is present in the kernel command line, the }(hj hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubhA instruction is not allowed to be used, so the initialization of }(hj hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh will fail.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hApart from that there are five module parameters recognized by ``intel_idle`` itself that can be set via the kernel command line (they cannot be updated via sysfs, so that is the only way to change their values).h](h?Apart from that there are five module parameters recognized by }(hjP hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjP ubh itself that can be set via the kernel command line (they cannot be updated via sysfs, so that is the only way to change their values).}(hjP hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hXThe ``max_cstate`` parameter value is the maximum idle state index in the list of idle states supplied to the ``CPUIdle`` core during the registration of the driver. It is also the maximum number of regular (non-polling) idle states that can be used by ``intel_idle``, so the enumeration of idle states is terminated after finding that number of usable idle states (the other idle states that potentially might have been used if ``max_cstate`` had been greater are not taken into consideration at all). Setting ``max_cstate`` can prevent ``intel_idle`` from exposing idle states that are regarded as "too deep" for some reason to the ``CPUIdle`` core, but it does so by making them effectively invisible until the system is shut down and started again which may not always be desirable. In practice, it is only really necessary to do that if the idle states in question cannot be enabled during system startup, because in the working state of the system the CPU power management quality of service (PM QoS) feature can be used to prevent ``CPUIdle`` from touching those idle states even if they have been enumerated (see :ref:`cpu-pm-qos` in Documentation/admin-guide/pm/cpuidle.rst). Setting ``max_cstate`` to 0 causes the ``intel_idle`` initialization to fail.h](hThe }(hjp hhhNhNubjg)}(h``max_cstate``h]h max_cstate}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh\ parameter value is the maximum idle state index in the list of idle states supplied to the }(hjp hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh core during the registration of the driver. It is also the maximum number of regular (non-polling) idle states that can be used by }(hjp hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh, so the enumeration of idle states is terminated after finding that number of usable idle states (the other idle states that potentially might have been used if }(hjp hhhNhNubjg)}(h``max_cstate``h]h max_cstate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubhE had been greater are not taken into consideration at all). Setting }(hjp hhhNhNubjg)}(h``max_cstate``h]h max_cstate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh can prevent }(hjp hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubhV from exposing idle states that are regarded as “too deep” for some reason to the }(hjp hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubhX core, but it does so by making them effectively invisible until the system is shut down and started again which may not always be desirable. In practice, it is only really necessary to do that if the idle states in question cannot be enabled during system startup, because in the working state of the system the CPU power management quality of service (PM QoS) feature can be used to prevent }(hjp hhhNhNubjg)}(h ``CPUIdle``h]hCPUIdle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubhH from touching those idle states even if they have been enumerated (see }(hjp hhhNhNubh)}(h:ref:`cpu-pm-qos`h]j7)}(hj h]h cpu-pm-qos}(hj hhhNhNubah}(h]h ](jBstdstd-refeh"]h$]h&]uh1j6hjubah}(h]h ]h"]h$]h&]refdocjO refdomainjreftyperef refexplicitrefwarnjU cpu-pm-qosuh1hhhhKhjp ubh7 in Documentation/admin-guide/pm/cpuidle.rst). Setting }(hjp hhhNhNubjg)}(h``max_cstate``h]h max_cstate}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh to 0 causes the }(hjp hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjp ubh initialization to fail.}(hjp hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hThe ``no_acpi``, ``use_acpi`` and ``no_native`` module parameters are recognized by ``intel_idle`` if the kernel has been configured with ACPI support. In the case that ACPI is not configured these flags have no impact on functionality.h](hThe }(hjVhhhNhNubjg)}(h ``no_acpi``h]hno_acpi}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjVubh, }(hjVhhhNhNubjg)}(h ``use_acpi``h]huse_acpi}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjVubh and }(hjVhhhNhNubjg)}(h ``no_native``h]h no_native}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjVubh% module parameters are recognized by }(hjVhhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjVubh if the kernel has been configured with ACPI support. In the case that ACPI is not configured these flags have no impact on functionality.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hS``no_acpi`` - Do not use ACPI at all. Only native mode is available, no ACPI mode.h](jg)}(h ``no_acpi``h]hno_acpi}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhH - Do not use ACPI at all. Only native mode is available, no ACPI mode.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hq``use_acpi`` - No-op in ACPI mode, the driver will consult ACPI tables for C-states on/off status in native mode.h](jg)}(h ``use_acpi``h]huse_acpi}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhe - No-op in ACPI mode, the driver will consult ACPI tables for C-states on/off status in native mode.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(h\``no_native`` - Work only in ACPI mode, no native mode available (ignore all custom tables).h](jg)}(h ``no_native``h]h no_native}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhO - Work only in ACPI mode, no native mode available (ignore all custom tables).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hThe value of the ``states_off`` module parameter (0 by default) represents a list of idle states to be disabled by default in the form of a bitmask.h](hThe value of the }(hjhhhNhNubjg)}(h``states_off``h]h states_off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhu module parameter (0 by default) represents a list of idle states to be disabled by default in the form of a bitmask.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hXNamely, the positions of the bits that are set in the ``states_off`` value are the indices of idle states to be disabled by default (as reflected by the names of the corresponding idle state directories in ``sysfs``, :file:`state0`, :file:`state1` ... :file:`state` ..., where ```` is the index of the given idle state; see :ref:`idle-states-representation` in Documentation/admin-guide/pm/cpuidle.rst).h](h6Namely, the positions of the bits that are set in the }(hj hhhNhNubjg)}(h``states_off``h]h states_off}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh value are the indices of idle states to be disabled by default (as reflected by the names of the corresponding idle state directories in }(hj hhhNhNubjg)}(h ``sysfs``h]hsysfs}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh, }(hj hhhNhNubjg)}(h:file:`state0`h]hstate0}(hjLhhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jfhj ubh, }(hj hhhNhNubjg)}(h:file:`state1`h]hstate1}(hjahhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jfhj ubh ... }(hj hhhNhNubjg)}(h:file:`state`h]hstate}(hjvhhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jfhj ubh ..., where }(hj hhhNhNubjg)}(h````h]h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj ubh+ is the index of the given idle state; see }(hj hhhNhNubh)}(h!:ref:`idle-states-representation`h]j7)}(hjh]hidle-states-representation}(hjhhhNhNubah}(h]h ](jBstdstd-refeh"]h$]h&]uh1j6hjubah}(h]h ]h"]h$]h&]refdocjO refdomainjreftyperef refexplicitrefwarnjUidle-states-representationuh1hhhhKhj ubh. in Documentation/admin-guide/pm/cpuidle.rst).}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hFor example, if ``states_off`` is equal to 3, the driver will disable idle states 0 and 1 by default, and if it is equal to 8, idle state 3 will be disabled by default and so on (bit positions beyond the maximum idle state index are ignored).h](hFor example, if }(hjhhhNhNubjg)}(h``states_off``h]h states_off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh is equal to 3, the driver will disable idle states 0 and 1 by default, and if it is equal to 8, idle state 3 will be disabled by default and so on (bit positions beyond the maximum idle state index are ignored).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hdThe idle states disabled this way can be enabled (on a per-CPU basis) from user space via ``sysfs``.h](hZThe idle states disabled this way can be enabled (on a per-CPU basis) from user space via }(hjhhhNhNubjg)}(h ``sysfs``h]hsysfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hX9The ``ibrs_off`` module parameter is a boolean flag (defaults to false). If set, it is used to control if IBRS (Indirect Branch Restricted Speculation) should be turned off when the CPU enters an idle state. This flag does not affect CPUs that use Enhanced IBRS which can remain on with little performance impact.h](hThe }(hjhhhNhNubjg)}(h ``ibrs_off``h]hibrs_off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhX) module parameter is a boolean flag (defaults to false). If set, it is used to control if IBRS (Indirect Branch Restricted Speculation) should be turned off when the CPU enters an idle state. This flag does not affect CPUs that use Enhanced IBRS which can remain on with little performance impact.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hX:For some CPUs, IBRS will be selected as mitigation for Spectre v2 and Retbleed security vulnerabilities by default. Leaving the IBRS mode on while idling may have a performance impact on its sibling CPU. The IBRS mode will be turned off by default when the CPU enters into a deep idle state, but not in some shallower ones. Setting the ``ibrs_off`` module parameter will force the IBRS mode to off when the CPU is in any one of the available idle states. This may help performance of a sibling CPU at the expense of a slightly higher wakeup latency for the idle CPU.h](hXSFor some CPUs, IBRS will be selected as mitigation for Spectre v2 and Retbleed security vulnerabilities by default. Leaving the IBRS mode on while idling may have a performance impact on its sibling CPU. The IBRS mode will be turned off by default when the CPU enters into a deep idle state, but not in some shallower ones. Setting the }(hj'hhhNhNubjg)}(h ``ibrs_off``h]hibrs_off}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj'ubh module parameter will force the IBRS mode to off when the CPU is in any one of the available idle states. This may help performance of a sibling CPU at the expense of a slightly higher wakeup latency for the idle CPU.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(hX=The ``table`` argument allows customization of idle state latency and target residency. The syntax is a comma-separated list of ``name:latency:residency`` entries, where ``name`` is the idle state name, ``latency`` is the exit latency in microseconds, and ``residency`` is the target residency in microseconds. It is not necessary to specify all idle states; only those to be customized. For example, ``C1:1:3,C6:50:100`` sets the exit latency and target residency for C1 and C6 to 1/3 and 50/100 microseconds, respectively. Remaining idle states keep their default values. The driver verifies that deeper idle states have higher latency and target residency than shallower ones. Also, target residency cannot be smaller than exit latency. If any of these conditions is not met, the driver ignores the entire ``table`` parameter.Qh](hThe }(hjGhhhNhNubjg)}(h ``table``h]htable}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubhs argument allows customization of idle state latency and target residency. The syntax is a comma-separated list of }(hjGhhhNhNubjg)}(h``name:latency:residency``h]hname:latency:residency}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubh entries, where }(hjGhhhNhNubjg)}(h``name``h]hname}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubh is the idle state name, }(hjGhhhNhNubjg)}(h ``latency``h]hlatency}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubh* is the exit latency in microseconds, and }(hjGhhhNhNubjg)}(h ``residency``h]h residency}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubh is the target residency in microseconds. It is not necessary to specify all idle states; only those to be customized. For example, }(hjGhhhNhNubjg)}(h``C1:1:3,C6:50:100``h]hC1:1:3,C6:50:100}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubhX sets the exit latency and target residency for C1 and C6 to 1/3 and 50/100 microseconds, respectively. Remaining idle states keep their default values. The driver verifies that deeper idle states have higher latency and target residency than shallower ones. Also, target residency cannot be smaller than exit latency. If any of these conditions is not met, the driver ignores the entire }(hjGhhhNhNubjg)}(h ``table``h]htable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjGubh parameter.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj )}(h,.. _intel-idle-core-and-package-idle-states:h]h}(h]h ]h"]h$]h&]j'intel-idle-core-and-package-idle-statesuh1j hMihj hhhhubeh}(h](1kernel-command-line-options-and-module-parametersjeh ]h"](1kernel command line options and module parametersintel-idle-parameterseh$]h&]uh1j[hj]hhhhhKj/ }jj sj1 }jj sjKubj\)}(hhh](ja)}(h&Core and Package Levels of Idle Statesh]h&Core and Package Levels of Idle States}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjhhhhhMubj)}(hXTypically, in a processor supporting the ``MWAIT`` instruction there are (at least) two levels of idle states (or C-states). One level, referred to as "core C-states", covers individual cores in the processor, whereas the other level, referred to as "package C-states", covers the entire processor package and it may also involve other components of the system (GPUs, memory controllers, I/O hubs etc.).h](h)Typically, in a processor supporting the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhXj instruction there are (at least) two levels of idle states (or C-states). One level, referred to as “core C-states”, covers individual cores in the processor, whereas the other level, referred to as “package C-states”, covers the entire processor package and it may also involve other components of the system (GPUs, memory controllers, I/O hubs etc.).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhMhjhhubj)}(hX@Some of the ``MWAIT`` hint values allow the processor to use core C-states only (most importantly, that is the case for the ``MWAIT`` hint value corresponding to the ``C1`` idle state), but the majority of them give it a license to put the target core (i.e. the core containing the logical CPU executing ``MWAIT`` with the given hint value) into a specific core C-state and then (if possible) to enter a specific package C-state at the deeper level. For example, the ``MWAIT`` hint value representing the ``C3`` idle state allows the processor to put the target core into the low-power state referred to as "core ``C3``" (or ``CC3``), which happens if all of the logical CPUs (SMT siblings) in that core have executed ``MWAIT`` with the ``C3`` hint value (or with a hint value representing a deeper idle state), and in addition to that (in the majority of cases) it gives the processor a license to put the entire package (possibly including some non-CPU components such as a GPU or a memory controller) into the low-power state referred to as "package ``C3``" (or ``PC3``), which happens if all of the cores have gone into the ``CC3`` state and (possibly) some additional conditions are satisfied (for instance, if the GPU is covered by ``PC3``, it may be required to be in a certain GPU-specific low-power state for ``PC3`` to be reachable).h](h Some of the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhg hint values allow the processor to use core C-states only (most importantly, that is the case for the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh! hint value corresponding to the }(hjhhhNhNubjg)}(h``C1``h]hC1}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh idle state), but the majority of them give it a license to put the target core (i.e. the core containing the logical CPU executing }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh with the given hint value) into a specific core C-state and then (if possible) to enter a specific package C-state at the deeper level. For example, the }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh hint value representing the }(hjhhhNhNubjg)}(h``C3``h]hC3}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhh idle state allows the processor to put the target core into the low-power state referred to as “core }(hjhhhNhNubjg)}(h``C3``h]hC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh” (or }(hjhhhNhNubjg)}(h``CC3``h]hCC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhV), which happens if all of the logical CPUs (SMT siblings) in that core have executed }(hjhhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh with the }(hjhhhNhNubjg)}(h``C3``h]hC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhX8 hint value (or with a hint value representing a deeper idle state), and in addition to that (in the majority of cases) it gives the processor a license to put the entire package (possibly including some non-CPU components such as a GPU or a memory controller) into the low-power state referred to as “package }(hjhhhNhNubjg)}(h``C3``h]hC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh” (or }(hjhhhNhNubjg)}(h``PC3``h]hPC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh8), which happens if all of the cores have gone into the }(hjhhhNhNubjg)}(h``CC3``h]hCC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhg state and (possibly) some additional conditions are satisfied (for instance, if the GPU is covered by }(hjhhhNhNubjg)}(h``PC3``h]hPC3}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubhI, it may be required to be in a certain GPU-specific low-power state for }(hjhhhNhNubjg)}(h``PC3``h]hPC3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhjubh to be reachable).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhMhjhhubj)}(hXiAs a rule, there is no simple way to make the processor use core C-states only if the conditions for entering the corresponding package C-states are met, so the logical CPU executing ``MWAIT`` with a hint value that is not core-level only (like for ``C1``) must always assume that this may cause the processor to enter a package C-state. [That is why the exit latency and target residency values corresponding to the majority of ``MWAIT`` hint values in the "internal" tables of idle states in ``intel_idle`` reflect the properties of package C-states.] If using package C-states is not desirable at all, either :ref:`PM QoS ` or the ``max_cstate`` module parameter of ``intel_idle`` described `above `_ must be used to restrict the range of permissible idle states to the ones with core-level only ``MWAIT`` hint values (like ``C1``).h](hAs a rule, there is no simple way to make the processor use core C-states only if the conditions for entering the corresponding package C-states are met, so the logical CPU executing }(hj6hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh9 with a hint value that is not core-level only (like for }(hj6hhhNhNubjg)}(h``C1``h]hC1}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh) must always assume that this may cause the processor to enter a package C-state. [That is why the exit latency and target residency values corresponding to the majority of }(hj6hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh< hint values in the “internal” tables of idle states in }(hj6hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubhi reflect the properties of package C-states.] If using package C-states is not desirable at all, either }(hj6hhhNhNubh)}(h:ref:`PM QoS `h]j7)}(hjh]hPM QoS}(hjhhhNhNubah}(h]h ](jBstdstd-refeh"]h$]h&]uh1j6hjubah}(h]h ]h"]h$]h&]refdocjO refdomainjreftyperef refexplicitrefwarnjU cpu-pm-qosuh1hhhhM2hj6ubh or the }(hj6hhhNhNubjg)}(h``max_cstate``h]h max_cstate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh module parameter of }(hj6hhhNhNubjg)}(h``intel_idle``h]h intel_idle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh described }(hj6hhhNhNubj)}(h!`above `_h]habove}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameabovejjuh1jhj6j Kubj )}(h h]h}(h]h ]h"]aboveah$]h&]jjuh1j jintel-idle-parametershj6j Kubh` must be used to restrict the range of permissible idle states to the ones with core-level only }(hj6hhhNhNubjg)}(h ``MWAIT``h]hMWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh hint values (like }(hj6hhhNhNubjg)}(h``C1``h]hC1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jfhj6ubh).}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhM2hjhhubeh}(h](&core-and-package-levels-of-idle-statesjeh ]h"](&core and package levels of idle states'intel-idle-core-and-package-idle-stateseh$]h&]uh1j[hj]hhhhhMj/ }jjsj1 }jjsubj\)}(hhh](ja)}(h Referencesh]h References}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj#hhhhhMAubhfootnote)}(h*Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B*, https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2b-manual.html h](hlabel)}(h1h]h1}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj6ubj)}(h*Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B*, https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2b-manual.htmlh](j)}(hL*Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B*h]hJIntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh, }(hjJhhhNhNubj)}(hhttps://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2b-manual.htmlh]hhttps://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2b-manual.html}(hj`hhhNhNubah}(h]h ]h"]h$]h&]refurijbuh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhhhMChj6ubeh}(h]j ah ]h"]1ah$]h&]jaj jOuh1j4hhhMChj#hhj Kubj5)}(hb*Advanced Configuration and Power Interface (ACPI) Specification*, https://uefi.org/specificationsh](j;)}(h2h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j:hj|ubj)}(hb*Advanced Configuration and Power Interface (ACPI) Specification*, https://uefi.org/specificationsh](j)}(hA*Advanced Configuration and Power Interface (ACPI) Specification*h]h?Advanced Configuration and Power Interface (ACPI) Specification}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(hhttps://uefi.org/specificationsh]hhttps://uefi.org/specifications}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMFhj|ubeh}(h]j: ah ]h"]2ah$]h&]j5 aj jOuh1j4hhhMFhj#hhj Kubeh}(h] referencesah ]h"] referencesah$]h&]uh1j[hj]hhhhhMAubeh}(h]*intel-idle-cpu-idle-time-management-driverah ]h"]*intel_idle cpu idle time management driverah$]h&]uh1j[hhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j`N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets](jj j j jD jesubstitution_defs}(hhjhjjj jj/j#j>j2jMjAj\jPjkj_jzjnjj}jjjjjjjjjjjjjjjjjjjjj.j"j=j1jLj@j[jOjjj^jyjmjj|jjjjjjjjjjjjjjjjjjjjj-j!j<j0jKj?jZjNjij]jxjljj{jjjjjjjjjjjjjjjjjjjjj,j j;j/jJj>jYjMjhj\jwjkjjzjjjjjjjjjjjjjjjjj jjjj+jj:j.jIj=jXjLusubstitution_names}(amphaposjastjbrvbarj bsolj/centj>colonjMcommaj\commatjkcopyjzcurrenjdarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34jfrac38j.frac58j=frac78jLgtj[halfjjhorbarjyhyphenjiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquojltj-microj<middotjKnbspjZnotjinumjxohmjordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotjraquoj,rarrj;rcubjJrdquojYregjhrparjwrsqbjrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3j timesjtradej+uarrj:verbarjIyenjXurefnames}(1]jaintel-idle-parameters](jjj j j j jje2]j+ a intel-idle-enumeration-of-states](j j~ jD j4 eurefids}(j](j j jD ej% ]j aj](j jj j jej]jaunameids}(jjj[jXjjj, jj+ j( j j% j j jjjjjjjjjjjyj jj: u nametypes}(jj[jj, j+ j j jjjjjjyjuh}(jj]jXj jjjj^jj j( j j5 j+ j% j3 j j3 jj jj jjjjjj#j j6j: j|u footnote_refs}(j]jaj]j+ au citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes](j6j|e citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages](hsystem_message)}(hhh]j)}(hhh]h+Hyperlink target "below" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineKLuh1jubj)}(hhh]j)}(hhh]h+Hyperlink target "below" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineKYuh1jubj)}(hhh]j)}(hhh]h?Hyperlink target "intel-idle-initialization" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineKuh1jubj)}(hhh]j)}(hhh]h+Hyperlink target "above" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineKuh1jubj)}(hhh]j)}(hhh]h+Hyperlink target "below" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineKuh1jubj)}(hhh]j)}(hhh]h+Hyperlink target "above" is not referenced.}hj9sbah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineKuh1jubj)}(hhh]j)}(hhh]hMHyperlink target "intel-idle-core-and-package-idle-states" is not referenced.}hjSsbah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineMiuh1jubj)}(hhh]j)}(hhh]h+Hyperlink target "above" is not referenced.}hjmsbah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]levelKtypejsourcehnjlineM2uh1jube transformerN include_log]+Documentation/admin-guide/pm/intel_idle.rst(NNNNta decorationNhhub.