€•^Œ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”Œ7/translations/zh_CN/driver-api/thermal/cpu-idle-cooling”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/zh_TW/driver-api/thermal/cpu-idle-cooling”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/it_IT/driver-api/thermal/cpu-idle-cooling”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ja_JP/driver-api/thermal/cpu-idle-cooling”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ko_KR/driver-api/thermal/cpu-idle-cooling”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/sp_SP/driver-api/thermal/cpu-idle-cooling”Œ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ŸŒQ/var/lib/git/docbuild/linux/Documentation/driver-api/thermal/cpu-idle-cooling.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒCPU Idle Cooling”h]”hŒCPU Idle Cooling”…””}”(hh»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hh¶hžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒ Situation:”h]”hŒ Situation:”…””}”(hhÌhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hhÉhžhhŸh³h KubhŒ paragraph”“”)”}”(hXŠUnder certain circumstances a SoC can reach a critical temperature limit and is unable to stabilize the temperature around a temperature control. When the SoC has to stabilize the temperature, the kernel can act on a cooling device to mitigate the dissipated power. When the critical temperature is reached, a decision must be taken to reduce the temperature, that, in turn impacts performance.”h]”hXŠUnder certain circumstances a SoC can reach a critical temperature limit and is unable to stabilize the temperature around a temperature control. When the SoC has to stabilize the temperature, the kernel can act on a cooling device to mitigate the dissipated power. When the critical temperature is reached, a decision must be taken to reduce the temperature, that, in turn impacts performance.”…””}”(hhÜhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K hhÉhžhubhÛ)”}”(hXjAnother situation is when the silicon temperature continues to increase even after the dynamic leakage is reduced to its minimum by clock gating the component. This runaway phenomenon can continue due to the static leakage. The only solution is to power down the component, thus dropping the dynamic and static leakage that will allow the component to cool down.”h]”hXjAnother situation is when the silicon temperature continues to increase even after the dynamic leakage is reduced to its minimum by clock gating the component. This runaway phenomenon can continue due to the static leakage. The only solution is to power down the component, thus dropping the dynamic and static leakage that will allow the component to cool down.”…””}”(hhêhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KhhÉhžhubhÛ)”}”(hXªLast but not least, the system can ask for a specific power budget but because of the OPP density, we can only choose an OPP with a power budget lower than the requested one and under-utilize the CPU, thus losing performance. In other words, one OPP under-utilizes the CPU with a power less than the requested power budget and the next OPP exceeds the power budget. An intermediate OPP could have been used if it were present.”h]”hXªLast but not least, the system can ask for a specific power budget but because of the OPP density, we can only choose an OPP with a power budget lower than the requested one and under-utilize the CPU, thus losing performance. In other words, one OPP under-utilizes the CPU with a power less than the requested power budget and the next OPP exceeds the power budget. An intermediate OPP could have been used if it were present.”…””}”(hhøhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KhhÉhžhubeh}”(h]”Œ situation”ah ]”h"]”Œ situation:”ah$]”h&]”uh1h´hh¶hžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒ Solutions:”h]”hŒ Solutions:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h K!ubhÛ)”}”(hX If we can remove the static and the dynamic leakage for a specific duration in a controlled period, the SoC temperature will decrease. Acting on the idle state duration or the idle cycle injection period, we can mitigate the temperature by modulating the power budget.”h]”hX If we can remove the static and the dynamic leakage for a specific duration in a controlled period, the SoC temperature will decrease. Acting on the idle state duration or the idle cycle injection period, we can mitigate the temperature by modulating the power budget.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K#hjhžhubhÛ)”}”(hX3The Operating Performance Point (OPP) density has a great influence on the control precision of cpufreq, however different vendors have a plethora of OPP density, and some have large power gap between OPPs, that will result in loss of performance during thermal control and loss of power in other scenarios.”h]”hX3The Operating Performance Point (OPP) density has a great influence on the control precision of cpufreq, however different vendors have a plethora of OPP density, and some have large power gap between OPPs, that will result in loss of performance during thermal control and loss of power in other scenarios.”…””}”(hj-hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K)hjhžhubhÛ)”}”(hX¶At a specific OPP, we can assume that injecting idle cycle on all CPUs belong to the same cluster, with a duration greater than the cluster idle state target residency, we lead to dropping the static and the dynamic leakage for this period (modulo the energy needed to enter this state). So the sustainable power with idle cycles has a linear relation with the OPP’s sustainable power and can be computed with a coefficient similar to::”h]”hXµAt a specific OPP, we can assume that injecting idle cycle on all CPUs belong to the same cluster, with a duration greater than the cluster idle state target residency, we lead to dropping the static and the dynamic leakage for this period (modulo the energy needed to enter this state). So the sustainable power with idle cycles has a linear relation with the OPP’s sustainable power and can be computed with a coefficient similar to:”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K/hjhžhubhŒ literal_block”“”)”}”(hŒ$Power(IdleCycle) = Coef x Power(OPP)”h]”hŒ$Power(IdleCycle) = Coef x Power(OPP)”…””}”hjKsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h K7hjhžhubeh}”(h]”Œ solutions”ah ]”h"]”Œ solutions:”ah$]”h&]”uh1h´hh¶hžhhŸh³h K!ubhµ)”}”(hhh]”(hº)”}”(hŒIdle Injection:”h]”hŒIdle Injection:”…””}”(hjdhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjahžhhŸh³h K:ubhÛ)”}”(hXThe base concept of the idle injection is to force the CPU to go to an idle state for a specified time each control cycle, it provides another way to control CPU power and heat in addition to cpufreq. Ideally, if all CPUs belonging to the same cluster, inject their idle cycles synchronously, the cluster can reach its power down state with a minimum power consumption and reduce the static leakage to almost zero. However, these idle cycles injection will add extra latencies as the CPUs will have to wakeup from a deep sleep state.”h]”hXThe base concept of the idle injection is to force the CPU to go to an idle state for a specified time each control cycle, it provides another way to control CPU power and heat in addition to cpufreq. Ideally, if all CPUs belonging to the same cluster, inject their idle cycles synchronously, the cluster can reach its power down state with a minimum power consumption and reduce the static leakage to almost zero. However, these idle cycles injection will add extra latencies as the CPUs will have to wakeup from a deep sleep state.”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K idle <----------------------> running <-----------------------------> duty cycle 25%”h]”hŒß^ | | |------- ------- |_______|_______________________|_______|___________ <------> idle <----------------------> running <-----------------------------> duty cycle 25%”…””}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h KKhjahžhubhÛ)”}”(hŒÁThe implementation of the cooling device bases the number of states on the duty cycle percentage. When no mitigation is happening the cooling device state is zero, meaning the duty cycle is 0%.”h]”hŒÁThe implementation of the cooling device bases the number of states on the duty cycle percentage. When no mitigation is happening the cooling device state is zero, meaning the duty cycle is 0%.”…””}”(hjœhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KYhjahžhubhÛ)”}”(hŒÑWhen the mitigation begins, depending on the governor's policy, a starting state is selected. With a fixed idle duration and the duty cycle (aka the cooling device state), the running duration can be computed.”h]”hŒÓWhen the mitigation begins, depending on the governor’s policy, a starting state is selected. With a fixed idle duration and the duty cycle (aka the cooling device state), the running duration can be computed.”…””}”(hjªhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K]hjahžhubhÛ)”}”(hŒzThe governor will change the cooling device state thus the duty cycle and this variation will modulate the cooling effect.”h]”hŒzThe governor will change the cooling device state thus the duty cycle and this variation will modulate the cooling effect.”…””}”(hj¸hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KbhjahžhubjJ)”}”(hXL^ | | |------- ------- |_______|_______________|_______|___________ <------> idle <--------------> running <---------------------> duty cycle 33% ^ | | |------- ------- |_______|_______|_______|___________ <------> idle <------> running <-------------> duty cycle 50%”h]”hXL^ | | |------- ------- |_______|_______________|_______|___________ <------> idle <--------------> running <---------------------> duty cycle 33% ^ | | |------- ------- |_______|_______|_______|___________ <------> idle <------> running <-------------> duty cycle 50%”…””}”hjÆsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h KghjahžhubhÛ)”}”(hŒCThe idle injection duration value must comply with the constraints:”h]”hŒCThe idle injection duration value must comply with the constraints:”…””}”(hjÔhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K‚hjahžhubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒÞIt is less than or equal to the latency we tolerate when the mitigation begins. It is platform dependent and will depend on the user experience, reactivity vs performance trade off we want. This value should be specified. ”h]”hÛ)”}”(hŒÝIt is less than or equal to the latency we tolerate when the mitigation begins. It is platform dependent and will depend on the user experience, reactivity vs performance trade off we want. This value should be specified.”h]”hŒÝIt is less than or equal to the latency we tolerate when the mitigation begins. It is platform dependent and will depend on the user experience, reactivity vs performance trade off we want. This value should be specified.”…””}”(hjíhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K„hjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jçhjähžhhŸh³h Nubjè)”}”(hŒˆIt is greater than the idle state’s target residency we want to go for thermal mitigation, otherwise we end up consuming more energy. ”h]”hÛ)”}”(hŒ‡It is greater than the idle state’s target residency we want to go for thermal mitigation, otherwise we end up consuming more energy.”h]”hŒ‡It is greater than the idle state’s target residency we want to go for thermal mitigation, otherwise we end up consuming more energy.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K‰hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jçhjähžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jâhŸh³h K„hjahžhubeh}”(h]”Œidle-injection”ah ]”h"]”Œidle injection:”ah$]”h&]”uh1h´hh¶hžhhŸh³h K:ubhµ)”}”(hhh]”(hº)”}”(hŒPower considerations”h]”hŒPower considerations”…””}”(hj,hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj)hžhhŸh³h KubhÛ)”}”(hŒƒWhen we reach the thermal trip point, we have to sustain a specified power for a specific temperature but at this time we consume::”h]”hŒ‚When we reach the thermal trip point, we have to sustain a specified power for a specific temperature but at this time we consume:”…””}”(hj:hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h Khj)hžhubjJ)”}”(hŒ9Power = Capacitance x Voltage^2 x Frequency x Utilisation”h]”hŒ9Power = Capacitance x Voltage^2 x Frequency x Utilisation”…””}”hjHsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h K’hj)hžhubhÛ)”}”(hX«... which is more than the sustainable power (or there is something wrong in the system setup). The ‘Capacitance’ and ‘Utilisation’ are a fixed value, ‘Voltage’ and the ‘Frequency’ are fixed artificially because we don’t want to change the OPP. We can group the ‘Capacitance’ and the ‘Utilisation’ into a single term which is the ‘Dynamic Power Coefficient (Cdyn)’ Simplifying the above, we have::”h]”hXª... which is more than the sustainable power (or there is something wrong in the system setup). The ‘Capacitance’ and ‘Utilisation’ are a fixed value, ‘Voltage’ and the ‘Frequency’ are fixed artificially because we don’t want to change the OPP. We can group the ‘Capacitance’ and the ‘Utilisation’ into a single term which is the ‘Dynamic Power Coefficient (Cdyn)’ Simplifying the above, we have:”…””}”(hjVhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K”hj)hžhubjJ)”}”(hŒ#Pdyn = Cdyn x Voltage^2 x Frequency”h]”hŒ#Pdyn = Cdyn x Voltage^2 x Frequency”…””}”hjdsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h K›hj)hžhubhÛ)”}”(hX\The power allocator governor will ask us somehow to reduce our power in order to target the sustainable power defined in the device tree. So with the idle injection mechanism, we want an average power (Ptarget) resulting in an amount of time running at full power on a specific OPP and idle another amount of time. That could be put in a equation::”h]”hX[The power allocator governor will ask us somehow to reduce our power in order to target the sustainable power defined in the device tree. So with the idle injection mechanism, we want an average power (Ptarget) resulting in an amount of time running at full power on a specific OPP and idle another amount of time. That could be put in a equation:”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h Khj)hžhubjJ)”}”(hŒ®P(opp)target = ((Trunning x (P(opp)running) + (Tidle x P(opp)idle)) / (Trunning + Tidle) ... Tidle = Trunning x ((P(opp)running / P(opp)target) - 1)”h]”hŒ®P(opp)target = ((Trunning x (P(opp)running) + (Tidle x P(opp)idle)) / (Trunning + Tidle) ... Tidle = Trunning x ((P(opp)running / P(opp)target) - 1)”…””}”hj€sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h K¤hj)hžhubhÛ)”}”(hŒÃAt this point if we know the running period for the CPU, that gives us the idle injection we need. Alternatively if we have the idle injection duration, we can compute the running duration with::”h]”hŒÂAt this point if we know the running period for the CPU, that gives us the idle injection we need. Alternatively if we have the idle injection duration, we can compute the running duration with:”…””}”(hjŽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K«hj)hžhubjJ)”}”(hŒ7Trunning = Tidle / ((P(opp)running / P(opp)target) - 1)”h]”hŒ7Trunning = Tidle / ((P(opp)running / P(opp)target) - 1)”…””}”hjœsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h K¯hj)hžhubhÛ)”}”(hŒÿPractically, if the running power is less than the targeted power, we end up with a negative time value, so obviously the equation usage is bound to a power reduction, hence a higher OPP is needed to have the running power greater than the targeted power.”h]”hŒÿPractically, if the running power is less than the targeted power, we end up with a negative time value, so obviously the equation usage is bound to a power reduction, hence a higher OPP is needed to have the running power greater than the targeted power.”…””}”(hjªhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K±hj)hžhubhÛ)”}”(hŒ7However, in this demonstration we ignore three aspects:”h]”hŒ7However, in this demonstration we ignore three aspects:”…””}”(hj¸hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K¶hj)hžhubhŒ block_quote”“”)”}”(hX* The static leakage is not defined here, we can introduce it in the equation but assuming it will be zero most of the time as it is difficult to get the values from the SoC vendors * The idle state wake up latency (or entry + exit latency) is not taken into account, it must be added in the equation in order to rigorously compute the idle injection * The injected idle duration must be greater than the idle state target residency, otherwise we end up consuming more energy and potentially invert the mitigation effect ”h]”jã)”}”(hhh]”(jè)”}”(hŒ´The static leakage is not defined here, we can introduce it in the equation but assuming it will be zero most of the time as it is difficult to get the values from the SoC vendors ”h]”hÛ)”}”(hŒ³The static leakage is not defined here, we can introduce it in the equation but assuming it will be zero most of the time as it is difficult to get the values from the SoC vendors”h]”hŒ³The static leakage is not defined here, we can introduce it in the equation but assuming it will be zero most of the time as it is difficult to get the values from the SoC vendors”…””}”(hjÓhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K¸hjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jçhjÌubjè)”}”(hŒ§The idle state wake up latency (or entry + exit latency) is not taken into account, it must be added in the equation in order to rigorously compute the idle injection ”h]”hÛ)”}”(hŒ¦The idle state wake up latency (or entry + exit latency) is not taken into account, it must be added in the equation in order to rigorously compute the idle injection”h]”hŒ¦The idle state wake up latency (or entry + exit latency) is not taken into account, it must be added in the equation in order to rigorously compute the idle injection”…””}”(hjëhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h K¼hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jçhjÌubjè)”}”(hŒ¨The injected idle duration must be greater than the idle state target residency, otherwise we end up consuming more energy and potentially invert the mitigation effect ”h]”hÛ)”}”(hŒ§The injected idle duration must be greater than the idle state target residency, otherwise we end up consuming more energy and potentially invert the mitigation effect”h]”hŒ§The injected idle duration must be greater than the idle state target residency, otherwise we end up consuming more energy and potentially invert the mitigation effect”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KÀhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jçhjÌubeh}”(h]”h ]”h"]”h$]”h&]”jŒ*”uh1jâhŸh³h K¸hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhŸh³h K¸hj)hžhubhÛ)”}”(hŒSo the final equation is::”h]”hŒSo the final equation is:”…””}”(hj$hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÚhŸh³h KÄhj)hžhubjJ)”}”(hŒmTrunning = (Tidle - Twakeup ) x (((P(opp)dyn + P(opp)static ) - P(opp)target) / P(opp)target )”h]”hŒmTrunning = (Tidle - Twakeup ) x (((P(opp)dyn + P(opp)static ) - P(opp)target) / P(opp)target )”…””}”hj2sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jIhŸh³h KÆhj)hžhubeh}”(h]”Œpower-considerations”ah ]”h"]”Œpower considerations”ah$]”h&]”uh1h´hh¶hžhhŸh³h Kubeh}”(h]”Œcpu-idle-cooling”ah ]”h"]”Œcpu idle cooling”ah$]”h&]”uh1h´hhhžhhŸh³h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h³uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¹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”jsŒ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”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jMjJj jj^j[j&j#jEjBuŒ nametypes”}”(jM‰j ‰j^‰j&‰jE‰uh}”(jJh¶jhÉj[jj#jajBj)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”]”Œ decoration”Nhžhub.