1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3External (\PPKG, MethodObj) 4 5#include <variant/thermal.h> 6 7// Thermal Zone 8 9#define HAVE_THERMALZONE 10Scope (\_TZ) 11{ 12 ThermalZone (THRM) 13 { 14 Name (_TC1, 0x02) 15 Name (_TC2, 0x05) 16 17 // Thermal zone polling frequency: 10 seconds 18 Name (_TZP, 100) 19 20 // Thermal sampling period for passive cooling: 2 seconds 21 Name (_TSP, 20) 22 23 // Convert from Degrees C to 1/10 Kelvin for ACPI 24 Method (CTOK, 1) { 25 // 10th of Degrees C 26 Local0 = Arg0 * 10 27 28 // Convert to Kelvin 29 Local0 += 2732 30 31 Return (Local0) 32 } 33 34 // Threshold for OS to shutdown 35 Method (_CRT, 0, Serialized) 36 { 37 Return (CTOK (\TCRT)) 38 } 39 40 // Threshold for passive cooling 41 Method (_PSV, 0, Serialized) 42 { 43 Return (CTOK (\TPSV)) 44 } 45 46 // Processors used for passive cooling 47 Method (_PSL, 0, Serialized) 48 { 49 Return (\PPKG ()) 50 } 51 52 // Start fan at state 4 = lowest temp state 53 Method (_INI) 54 { 55 \FLVL = 4 56 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN4_PWM 57 Notify (\_TZ.THRM, 0x81) 58 } 59 60 Method (TCHK, 0, Serialized) 61 { 62 // Get CPU Temperature from PECI via SuperIO TMPIN3 63 Local0 = \_SB.PCI0.LPCB.SIO.ENVC.TIN3 64 65 // Check for "no reading available" 66 If (Local0 == 0x80) { 67 Return (CTOK (FAN0_THRESHOLD_ON)) 68 } 69 70 // Check for invalid readings 71 If ((Local0 == 255) || (Local0 == 0)) { 72 Return (CTOK (FAN0_THRESHOLD_ON)) 73 } 74 75 // PECI raw value is an offset from Tj_max 76 Local1 = 255 - Local0 77 78 // Handle values greater than Tj_max 79 If (Local1 >= \TMAX) { 80 Return (CTOK (\TMAX)) 81 } 82 83 // Subtract from Tj_max to get temperature 84 Local0 = \TMAX - Local1 85 Return (CTOK (Local0)) 86 } 87 88 Method (_TMP, 0, Serialized) 89 { 90 // Get temperature from SuperIO in deci-kelvin 91 Local0 = TCHK () 92 93 // Critical temperature in deci-kelvin 94 Local1 = CTOK (\TMAX) 95 96 If (Local0 >= Local1) { 97 Printf ("CRITICAL TEMPERATURE: %o", Local0) 98 99 // Wait 1 second for SuperIO to re-poll 100 Sleep (1000) 101 102 // Re-read temperature from SuperIO 103 Local0 = TCHK () 104 105 Printf ("RE-READ TEMPERATURE: %o", Local0) 106 } 107 108 Return (Local0) 109 } 110 111 Method (_AC0) { 112 If (\FLVL <= 0) { 113 Return (CTOK (FAN0_THRESHOLD_OFF)) 114 } Else { 115 Return (CTOK (FAN0_THRESHOLD_ON)) 116 } 117 } 118 119 Method (_AC1) { 120 If (\FLVL <= 1) { 121 Return (CTOK (FAN1_THRESHOLD_OFF)) 122 } Else { 123 Return (CTOK (FAN1_THRESHOLD_ON)) 124 } 125 } 126 127 Method (_AC2) { 128 If (\FLVL <= 2) { 129 Return (CTOK (FAN2_THRESHOLD_OFF)) 130 } Else { 131 Return (CTOK (FAN2_THRESHOLD_ON)) 132 } 133 } 134 135 Method (_AC3) { 136 If (\FLVL <= 3) { 137 Return (CTOK (FAN3_THRESHOLD_OFF)) 138 } Else { 139 Return (CTOK (FAN3_THRESHOLD_ON)) 140 } 141 } 142 143 Method (_AC4) { 144 If (\FLVL <= 4) { 145 Return (CTOK (FAN4_THRESHOLD_OFF)) 146 } Else { 147 Return (CTOK (FAN4_THRESHOLD_ON)) 148 } 149 } 150 151 Name (_AL0, Package () { FAN0 }) 152 Name (_AL1, Package () { FAN1 }) 153 Name (_AL2, Package () { FAN2 }) 154 Name (_AL3, Package () { FAN3 }) 155 Name (_AL4, Package () { FAN4 }) 156 157 PowerResource (FNP0, 0, 0) 158 { 159 Method (_STA) { 160 If (\FLVL <= 0) { 161 Return (1) 162 } Else { 163 Return (0) 164 } 165 } 166 Method (_ON) { 167 If (!_STA ()) { 168 \FLVL = 0 169 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN0_PWM 170 Notify (\_TZ.THRM, 0x81) 171 } 172 } 173 Method (_OFF) { 174 If (_STA ()) { 175 \FLVL = 1 176 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN1_PWM 177 Notify (\_TZ.THRM, 0x81) 178 } 179 } 180 } 181 182 PowerResource (FNP1, 0, 0) 183 { 184 Method (_STA) { 185 If (\FLVL <= 1) { 186 Return (1) 187 } Else { 188 Return (0) 189 } 190 } 191 Method (_ON) { 192 If (!_STA ()) { 193 \FLVL = 1 194 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN1_PWM 195 Notify (\_TZ.THRM, 0x81) 196 } 197 } 198 Method (_OFF) { 199 If (_STA ()) { 200 \FLVL = 2 201 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN2_PWM 202 Notify (\_TZ.THRM, 0x81) 203 } 204 } 205 } 206 207 PowerResource (FNP2, 0, 0) 208 { 209 Method (_STA) { 210 If (\FLVL <= 2) { 211 Return (1) 212 } Else { 213 Return (0) 214 } 215 } 216 Method (_ON) { 217 If (!_STA ()) { 218 \FLVL = 2 219 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN2_PWM 220 Notify (\_TZ.THRM, 0x81) 221 } 222 } 223 Method (_OFF) { 224 If (_STA ()) { 225 \FLVL = 3 226 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN3_PWM 227 Notify (\_TZ.THRM, 0x81) 228 } 229 } 230 } 231 232 PowerResource (FNP3, 0, 0) 233 { 234 Method (_STA) { 235 If (\FLVL <= 3) { 236 Return (1) 237 } Else { 238 Return (0) 239 } 240 } 241 Method (_ON) { 242 If (!_STA ()) { 243 \FLVL = 3 244 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN3_PWM 245 Notify (\_TZ.THRM, 0x81) 246 } 247 } 248 Method (_OFF) { 249 If (_STA ()) { 250 \FLVL = 4 251 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN4_PWM 252 Notify (\_TZ.THRM, 0x81) 253 } 254 } 255 } 256 257 PowerResource (FNP4, 0, 0) 258 { 259 Method (_STA) { 260 If (\FLVL <= 4) { 261 Return (1) 262 } Else { 263 Return (0) 264 } 265 } 266 Method (_ON) { 267 If (!_STA ()) { 268 \FLVL = 4 269 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN4_PWM 270 Notify (\_TZ.THRM, 0x81) 271 } 272 } 273 Method (_OFF) { 274 If (_STA ()) { 275 \FLVL = 4 276 \_SB.PCI0.LPCB.SIO.ENVC.F2PS = FAN4_PWM 277 Notify (\_TZ.THRM, 0x81) 278 } 279 } 280 } 281 282 Device (FAN0) 283 { 284 Name (_HID, EISAID ("PNP0C0B")) 285 Name (_UID, 0) 286 Name (_PR0, Package () { FNP0 }) 287 } 288 289 Device (FAN1) 290 { 291 Name (_HID, EISAID ("PNP0C0B")) 292 Name (_UID, 1) 293 Name (_PR0, Package () { FNP1 }) 294 } 295 296 Device (FAN2) 297 { 298 Name (_HID, EISAID ("PNP0C0B")) 299 Name (_UID, 2) 300 Name (_PR0, Package () { FNP2 }) 301 } 302 303 Device (FAN3) 304 { 305 Name (_HID, EISAID ("PNP0C0B")) 306 Name (_UID, 3) 307 Name (_PR0, Package () { FNP3 }) 308 } 309 310 Device (FAN4) 311 { 312 Name (_HID, EISAID ("PNP0C0B")) 313 Name (_UID, 4) 314 Name (_PR0, Package () { FNP4 }) 315 } 316 } 317} 318