<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
<body>
<h1><span class="mw-headline" id="Thermal_Coolers_Table_1.0">
    <span class="mw-headline-number">1</span> Thermal Coolers Table 1.0</span></h1>
<h2><span class="mw-headline" id="Thermal_Coolers_Table_Header">
    <span class="mw-headline-number">1.1</span> Thermal Coolers Table Header</span></h2>
<p>The Thermal Coolers Table Header is pointed at by the Thermal Coolers Table
   Pointer field in the BIOS Information Tokens (BIT) BIT_PERF_PTRS structure
   version 2. The Thermal Coolers Table table starts with a header, followed
   immediately by an array of entries.
</p>
<table cellpadding="5" border="1" width="800" style="border-collapse: collapse">

<tr>
<th> Name </th>
<th> Bit width </th>
<th> Values and meaning
</th></tr>
<tr>
<td> Version </td>
<td> 8 </td>
<td> Thermal Coolers Table version (0x10)
</td></tr>
<tr>
<td> Header Size </td>
<td> 8 </td>
<td> Size of Thermal Coolers Table Header in bytes (4)
</td></tr>
<tr>
<td> Entry Size </td>
<td> 8 </td>
<td> Size of Thermal Coolers Table Entry in bytes (20)
</td></tr>
<tr>
<td> Entry Count </td>
<td> 8 </td>
<td> Number of Thermal Coolers Table Entries
</td></tr></table>
<h2><span class="mw-headline" id="Thermal_Coolers_Table_Entry">
    <span class="mw-headline-number">1.2</span> Thermal Coolers Table Entry</span></h2>
<table cellpadding="5" border="1" width="800" style="border-collapse: collapse">

<tr style="font-weight: bold">
<td align="left"> 31
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 28
</td>
<td align="left"> 27
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 24
</td>
<td align="left"> 23
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 20
</td>
<td align="left"> 19
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 16
</td>
<td align="left"> 15
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 12
</td>
<td align="left"> 11
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 8
</td>
<td align="left"> 7
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 4
</td>
<td align="left"> 3
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 0
</td></tr>
<tr style="text-align: center;">
<td colspan="2"> CP
</td>
<td colspan="4"> CS
</td>
<td colspan="10"> Speed Maximum
</td>
<td colspan="1"> Rsvd
</td>
<td colspan="3"> Tach Dev
</td>
<td colspan="1"> Rsvd
</td>
<td colspan="3"> Ctrl Dev
</td>
<td colspan="1"> Rsvd
</td>
<td colspan="3"> TA
</td>
<td colspan="4"> Type
</td></tr>
<tr style="font-weight: bold">
<td align="left"> 63
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 60
</td>
<td align="left"> 59
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 56
</td>
<td align="left"> 55
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 52
</td>
<td align="left"> 51
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 48
</td>
<td align="left"> 47
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 44
</td>
<td align="left"> 43
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 40
</td>
<td align="left"> 39
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 36
</td>
<td align="left"> 35
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 32
</td></tr>
<tr style="text-align: center;">
<td colspan="1"> CS
</td>
<td colspan="7"> PWM Start
</td>
<td colspan="1"> Rsvd
</td>
<td colspan="7"> PWM Minimum
</td>
<td colspan="2"> TR
</td>
<td colspan="4"> TS
</td>
<td colspan="10"> Speed Minimum
</td></tr>
<tr style="font-weight: bold">
<td align="left"> 95
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 92
</td>
<td align="left"> 91
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 88
</td>
<td align="left"> 87
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 84
</td>
<td align="left"> 83
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 80
</td>
<td align="left"> 79
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 76
</td>
<td align="left"> 75
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 72
</td>
<td align="left"> 71
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 68
</td>
<td align="left"> 67
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 64
</td></tr>
<tr style="text-align: center;">
<td colspan="16"> PWM Scale Slope
</td>
<td colspan="4"> Rsvd
</td>
<td colspan="12"> PWM Frequency
</td></tr>
<tr style="font-weight: bold">
<td align="left"> 127
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 124
</td>
<td align="left"> 123
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 120
</td>
<td align="left"> 119
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 116
</td>
<td align="left"> 115
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 112
</td>
<td align="left"> 111
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 108
</td>
<td align="left"> 107
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 104
</td>
<td align="left"> 103
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 100
</td>
<td align="left"> 99
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 96
</td></tr>
<tr style="text-align: center;">
<td colspan="8"> Error Interpolation
</td>
<td colspan="8"> Error Endpoint (Low)
</td>
<td colspan="16"> PWM Scale Offset
</td></tr>
<tr style="font-weight: bold">
<td align="left"> 159
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 136
</td>
<td align="left"> 135
</td>
<td>   </td>
<td>  
</td>
<td align="right">
</td>
<td align="left">
</td>
<td>   </td>
<td>  
</td>
<td align="right"> 128
</td></tr>
<tr style="text-align: center;">
<td colspan="24"> Reserved
</td>
<td colspan="8"> Error Endpoint (High)
</td></tr></table>
<p><br />
</p>
<table cellpadding="5" border="1" width="800" style="border-collapse: collapse">

<tr>
<th> Name </th>
<th> Bit width </th>
<th> Values and meaning
</th></tr>
<tr>
<td> Type </td>
<td> 4 </td>
<td> Type of cooler.
<dl>
<dd> 0x0 = Passive Heat Sink (Default)
</dd>
<dd> 0x1 = Active Fan Sink
</dd>
<dd> 0x2 - 0xE = Reserved
</dd>
<dd> 0xF = Skip Entry
</dd>
</dl>
</td></tr>
<tr>
<td> Target Affinity </td>
<td> 3 </td>
<td> Cooler's target affinity.  This specifies which device(s) the cooler is
     intended to affect.
<dl>
<dd> 0x0 = GPU (Default)
</dd>
<dd> 0x1 = All Components
</dd>
<dd> 0x2 - 0x7 = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Reserved </td>
<td> 1 </td>
<td> Reserved
</td></tr>
<tr>
<td> Control Device </td>
<td> 3 </td>
<td> Device connected to the cooler's control signal
<dl>
<dd> 0x0 = None (Uncontrolled, Default)
</dd>
<dd> 0x1 = GPU
</dd>
<dd> 0x2 = External Instance 0
</dd>
<dd> 0x3 - 0x7 = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Reserved </td>
<td> 1 </td>
<td> Reserved
</td></tr>
<tr>
<td> Tachometer Device </td>
<td> 3 </td>
<td> Device connected to the cooler's tachometer signal
<dl>
<dd> 0x0 = None (Undetectable, Default)
</dd>
<dd> 0x1 = GPU
</dd>
<dd> 0x2 = External Instance 0
</dd>
<dd> 0x3 - 0x7 = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Reserved </td>
<td> 1 </td>
<td> Reserved
</td></tr>
<tr>
<td> Speed Maximum </td>
<td> 10 </td>
<td> Fan speed corresponding to Thermal Policy maximum duty cycle PWM signal
     (10 RPM, 0 RPM to 10230 RPM)
<ul>
<li> The Thermal Policy Table 2.x maximum duty cycle is defined by
     OPCODE_FANSPEED_MINMAX_MAXIMUM.
</li>
</ul>
</td></tr>
<tr>
<td> Control Signal </td>
<td> 4 </td>
<td> Signal for PWM or On/Off control relative to the Control Device.
<dl>
<dd> 0x0 = None (Uncontrolled, Default)
</dd>
<dd> 0x1 = Unknown
</dd>
<dd> 0x2 = Fan-specific Instance 0
</dd>
<dd> 0x3 = GPIO Fan Function Instance 0
</dd>
<dd> 0x4 - 0xF = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Control Polarity </td>
<td> 2 </td>
<td> Active PWM or ON control signal level
<dl>
<dd> 0x0 = Use GPIO Definition (Default)
</dd>
<dd> 0x1 = Low (Active-low, 100% = continuous low output)
</dd>
<dd> 0x2 = High (Active-high, 100% = continuous high output)
</dd>
<dd> 0x3 = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Speed Minimum </td>
<td> 10 </td>
<td> Fan speed corresponding to minimum duty cycle PWM signal
     (10 RPM, 0 RPM to 10230 RPM)
<ul>
<li> The Thermal Policy Table 2.x minimum duty cycle is defined by
     OPCODE_FANSPEED_MINMAX_MINIMUM.
</li>
</ul>
</td></tr>
<tr>
<td> Tachometer Signal </td>
<td> 4 </td>
<td> Signal for Tachometer or On/Off detection relative to the Tachometer Device.
<dl>
<dd> 0x0 = None (Undetectable, Default)
</dd>
<dd> 0x1 = Unknown
</dd>
<dd> 0x2 = Tachometer-specific Instance 0
</dd>
<dd> 0x3 = GPIO Tachometer Function Instance 0
</dd>
<dd> 0x4 - 0xF = Reserved
</dd>
</dl>
</td></tr>
<tr>
<td> Tachometer Rate </td>
<td> 2 </td>
<td> Number of tachometer pulses per revolution
<dl>
<dd> 0x0 = 1 (Default)
</dd>
<dd> 0x1 = 2
</dd>
<dd> 0x2 = 3
</dd>
<dd> 0x3 = 4
</dd>
</dl>
</td></tr>
<tr>
<td> (Deprecated) PWM Minimum </td>
<td> 7 </td>
<td> Minimum duty cycle PWM signal to keep fan running (percent, 0% to 100%)
<ul>
<li> Set the minimum speed to 100% to indicate on/off only behavior (no PWM support)
</li>
<li> The use of this field has been deprecated.
</li>
</ul>
</td></tr>
<tr>
<td> Control Stop </td>
<td> 1 </td>
<td> Cooler stop method
<dl>
<dd> 0x0 = PWM (Default)
<dl>
<dd> A 0% duty cycle PWM signal will stop the cooler.
</dd>
</dl>
</dd>
<dd> 0x1 = Power
<dl>
<dd> The cooler remains active with a 0% duty cycle PWM signal; power to the
     cooler must be removed to stop the cooler.
</dd>
</dl>
</dd>
</dl>
</td></tr>
<tr>
<td> (Deprecated) PWM Start </td>
<td> 7 </td>
<td> PWM duty cycle required to start fan from the off state (percent, 0% to 100%)
<ul>
<li> This value must be greater than or equal to PWM Minimum
</li>
<li> The use of this field has been deprecated.
</li>
</ul>
</td></tr>
<tr>
<td> Reserved </td>
<td> 1 </td>
<td> Reserved
</td></tr>
<tr>
<td> PWM Frequency </td>
<td> 12 </td>
<td> Frequency of pulse-width modulation signal (10 Hz, 10 Hz to 40950 Hz)
<ul>
<li> 0 Hz is a reserved value, the behavior is undefined
</li>
</ul>
</td></tr>
<tr>
<td> Reserved </td>
<td> 4 </td>
<td> Reserved
</td></tr>
<tr>
<td> PWM Scale Slope </td>
<td> 16 </td>
<td> Slope to scale effective PWM to actual PWM (1/4096, F4.12, signed)
<dl>
<dd> For backwards compatibility, a value of 0.0 (0x0000) is
     interpreted as 1.0 (0x1000).
</dd>
<dd> This value is used to scale the effective PWM duty cycle, a conceptual
     fraction of full speed (0% to 100%), to the actual electrical PWM duty
     cycle.
</dd>
<dd>PWM(actual) = Slope × PWM(effective) + Offset
</dd>
</dl>
</td></tr>
<tr>
<td> PWM Scale Offset </td>
<td> 16 </td>
<td> Offset to scale effective PWM to actual PWM (1/4096, F4.12, signed)
<dl>
<dd> This value is used to scale the effective PWM duty cycle, a conceptual
     fraction of full speed (0% to 100%), to the actual electrical PWM duty
     cycle.
</dd>
<dd>PWM(actual) = Slope × PWM(effective) + Offset
</dd>
</dl>
</td></tr>
<tr>
<td> Error Endpoint (Low) </td>
<td> 8 </td>
<td> Error tolerance for actual speed compared to expected speed at Thermal
     Policy minimum duty cycle. (percent)
</td></tr>
<tr>
<td> Error Interpolation </td>
<td> 8 </td>
<td> Error tolerance for actual speed compared to linearly interpolated
     expected speeds between Thermal Policy minimum and maximum duty cycles. (percent)
</td></tr>
<tr>
<td> Error Endpoint (High) </td>
<td> 8 </td>
<td> Error tolerance for actual speed compared to expected speed at Thermal
     Policy maximum duty cycle. (percent)
</td></tr>
<tr>
<td> Reserved </td>
<td> 24 </td>
<td> Reserved
</td></tr></table>
<h3><span class="mw-headline" id="Thermal_Coolers_Table_Entry_Notes">
    <span class="mw-headline-number">1.2.1</span>
    Thermal Coolers Table Entry Notes</span></h3>
<ol>
<li> The specified defaults indicate the value initially allocated in the
     structure (typically 0).  This value will remain if not overridden for a
     specific board and SKU.
</li>
<li> "Control Signal" and "Tachometer Signal" should maintain equivalent enumerants.
</li>
<li> "ControlSignal.Unknown" indicates fan control is present, but no programming is required.
</li>
<li> "ControlSignal.Fan-SpecificInstance0" refers to the FAN pin on NVIO.
</li>
<li> "TachometerSignal.Tachometer-SpecificInstance0" would refer to a dedicated
     TACH pin if ever implemented.
</li>
<li> "TachometerSignal.Unknown" indicates speed detection is present, but no
     programming is required.
</li>
<li> "Tachometer Polarity" is not specified, it is assumed to be Active-high
     both for counting tachometer pulses or for on detection.
</li>
</ol>
</body></html>