1Generic Thermal Sysfs driver How To 2=================================== 3 4Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com> 5 6Updated: 2 January 2008 7 8Copyright (c) 2008 Intel Corporation 9 10 110. Introduction 12 13The generic thermal sysfs provides a set of interfaces for thermal zone 14devices (sensors) and thermal cooling devices (fan, processor...) to register 15with the thermal management solution and to be a part of it. 16 17This how-to focuses on enabling new thermal zone and cooling devices to 18participate in thermal management. 19This solution is platform independent and any type of thermal zone devices 20and cooling devices should be able to make use of the infrastructure. 21 22The main task of the thermal sysfs driver is to expose thermal zone attributes 23as well as cooling device attributes to the user space. 24An intelligent thermal management application can make decisions based on 25inputs from thermal zone attributes (the current temperature and trip point 26temperature) and throttle appropriate devices. 27 28[0-*] denotes any positive number starting from 0 29[1-*] denotes any positive number starting from 1 30 311. thermal sysfs driver interface functions 32 331.1 thermal zone device interface 341.1.1 struct thermal_zone_device *thermal_zone_device_register(char *type, 35 int trips, int mask, void *devdata, 36 struct thermal_zone_device_ops *ops, 37 const struct thermal_zone_params *tzp, 38 int passive_delay, int polling_delay)) 39 40 This interface function adds a new thermal zone device (sensor) to 41 /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind all the 42 thermal cooling devices registered at the same time. 43 44 type: the thermal zone type. 45 trips: the total number of trip points this thermal zone supports. 46 mask: Bit string: If 'n'th bit is set, then trip point 'n' is writeable. 47 devdata: device private data 48 ops: thermal zone device call-backs. 49 .bind: bind the thermal zone device with a thermal cooling device. 50 .unbind: unbind the thermal zone device with a thermal cooling device. 51 .get_temp: get the current temperature of the thermal zone. 52 .set_trips: set the trip points window. Whenever the current temperature 53 is updated, the trip points immediately below and above the 54 current temperature are found. 55 .get_mode: get the current mode (enabled/disabled) of the thermal zone. 56 - "enabled" means the kernel thermal management is enabled. 57 - "disabled" will prevent kernel thermal driver action upon trip points 58 so that user applications can take charge of thermal management. 59 .set_mode: set the mode (enabled/disabled) of the thermal zone. 60 .get_trip_type: get the type of certain trip point. 61 .get_trip_temp: get the temperature above which the certain trip point 62 will be fired. 63 .set_emul_temp: set the emulation temperature which helps in debugging 64 different threshold temperature points. 65 tzp: thermal zone platform parameters. 66 passive_delay: number of milliseconds to wait between polls when 67 performing passive cooling. 68 polling_delay: number of milliseconds to wait between polls when checking 69 whether trip points have been crossed (0 for interrupt driven systems). 70 71 721.1.2 void thermal_zone_device_unregister(struct thermal_zone_device *tz) 73 74 This interface function removes the thermal zone device. 75 It deletes the corresponding entry from /sys/class/thermal folder and 76 unbinds all the thermal cooling devices it uses. 77 781.1.3 struct thermal_zone_device *thermal_zone_of_sensor_register( 79 struct device *dev, int sensor_id, void *data, 80 const struct thermal_zone_of_device_ops *ops) 81 82 This interface adds a new sensor to a DT thermal zone. 83 This function will search the list of thermal zones described in 84 device tree and look for the zone that refer to the sensor device 85 pointed by dev->of_node as temperature providers. For the zone 86 pointing to the sensor node, the sensor will be added to the DT 87 thermal zone device. 88 89 The parameters for this interface are: 90 dev: Device node of sensor containing valid node pointer in 91 dev->of_node. 92 sensor_id: a sensor identifier, in case the sensor IP has more 93 than one sensors 94 data: a private pointer (owned by the caller) that will be 95 passed back, when a temperature reading is needed. 96 ops: struct thermal_zone_of_device_ops *. 97 98 get_temp: a pointer to a function that reads the 99 sensor temperature. This is mandatory 100 callback provided by sensor driver. 101 set_trips: a pointer to a function that sets a 102 temperature window. When this window is 103 left the driver must inform the thermal 104 core via thermal_zone_device_update. 105 get_trend: a pointer to a function that reads the 106 sensor temperature trend. 107 set_emul_temp: a pointer to a function that sets 108 sensor emulated temperature. 109 The thermal zone temperature is provided by the get_temp() function 110 pointer of thermal_zone_of_device_ops. When called, it will 111 have the private pointer @data back. 112 113 It returns error pointer if fails otherwise valid thermal zone device 114 handle. Caller should check the return handle with IS_ERR() for finding 115 whether success or not. 116 1171.1.4 void thermal_zone_of_sensor_unregister(struct device *dev, 118 struct thermal_zone_device *tzd) 119 120 This interface unregisters a sensor from a DT thermal zone which was 121 successfully added by interface thermal_zone_of_sensor_register(). 122 This function removes the sensor callbacks and private data from the 123 thermal zone device registered with thermal_zone_of_sensor_register() 124 interface. It will also silent the zone by remove the .get_temp() and 125 get_trend() thermal zone device callbacks. 126 1271.1.5 struct thermal_zone_device *devm_thermal_zone_of_sensor_register( 128 struct device *dev, int sensor_id, 129 void *data, const struct thermal_zone_of_device_ops *ops) 130 131 This interface is resource managed version of 132 thermal_zone_of_sensor_register(). 133 All details of thermal_zone_of_sensor_register() described in 134 section 1.1.3 is applicable here. 135 The benefit of using this interface to register sensor is that it 136 is not require to explicitly call thermal_zone_of_sensor_unregister() 137 in error path or during driver unbinding as this is done by driver 138 resource manager. 139 1401.1.6 void devm_thermal_zone_of_sensor_unregister(struct device *dev, 141 struct thermal_zone_device *tzd) 142 143 This interface is resource managed version of 144 thermal_zone_of_sensor_unregister(). 145 All details of thermal_zone_of_sensor_unregister() described in 146 section 1.1.4 is applicable here. 147 Normally this function will not need to be called and the resource 148 management code will ensure that the resource is freed. 149 1501.1.7 int thermal_zone_get_slope(struct thermal_zone_device *tz) 151 152 This interface is used to read the slope attribute value 153 for the thermal zone device, which might be useful for platform 154 drivers for temperature calculations. 155 1561.1.8 int thermal_zone_get_offset(struct thermal_zone_device *tz) 157 158 This interface is used to read the offset attribute value 159 for the thermal zone device, which might be useful for platform 160 drivers for temperature calculations. 161 1621.2 thermal cooling device interface 1631.2.1 struct thermal_cooling_device *thermal_cooling_device_register(char *name, 164 void *devdata, struct thermal_cooling_device_ops *) 165 166 This interface function adds a new thermal cooling device (fan/processor/...) 167 to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself 168 to all the thermal zone devices registered at the same time. 169 name: the cooling device name. 170 devdata: device private data. 171 ops: thermal cooling devices call-backs. 172 .get_max_state: get the Maximum throttle state of the cooling device. 173 .get_cur_state: get the Currently requested throttle state of the cooling device. 174 .set_cur_state: set the Current throttle state of the cooling device. 175 1761.2.2 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) 177 178 This interface function removes the thermal cooling device. 179 It deletes the corresponding entry from /sys/class/thermal folder and 180 unbinds itself from all the thermal zone devices using it. 181 1821.3 interface for binding a thermal zone device with a thermal cooling device 1831.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, 184 int trip, struct thermal_cooling_device *cdev, 185 unsigned long upper, unsigned long lower, unsigned int weight); 186 187 This interface function binds a thermal cooling device to a particular trip 188 point of a thermal zone device. 189 This function is usually called in the thermal zone device .bind callback. 190 tz: the thermal zone device 191 cdev: thermal cooling device 192 trip: indicates which trip point in this thermal zone the cooling device 193 is associated with. 194 upper:the Maximum cooling state for this trip point. 195 THERMAL_NO_LIMIT means no upper limit, 196 and the cooling device can be in max_state. 197 lower:the Minimum cooling state can be used for this trip point. 198 THERMAL_NO_LIMIT means no lower limit, 199 and the cooling device can be in cooling state 0. 200 weight: the influence of this cooling device in this thermal 201 zone. See 1.4.1 below for more information. 202 2031.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz, 204 int trip, struct thermal_cooling_device *cdev); 205 206 This interface function unbinds a thermal cooling device from a particular 207 trip point of a thermal zone device. This function is usually called in 208 the thermal zone device .unbind callback. 209 tz: the thermal zone device 210 cdev: thermal cooling device 211 trip: indicates which trip point in this thermal zone the cooling device 212 is associated with. 213 2141.4 Thermal Zone Parameters 2151.4.1 struct thermal_bind_params 216 This structure defines the following parameters that are used to bind 217 a zone with a cooling device for a particular trip point. 218 .cdev: The cooling device pointer 219 .weight: The 'influence' of a particular cooling device on this 220 zone. This is relative to the rest of the cooling 221 devices. For example, if all cooling devices have a 222 weight of 1, then they all contribute the same. You can 223 use percentages if you want, but it's not mandatory. A 224 weight of 0 means that this cooling device doesn't 225 contribute to the cooling of this zone unless all cooling 226 devices have a weight of 0. If all weights are 0, then 227 they all contribute the same. 228 .trip_mask:This is a bit mask that gives the binding relation between 229 this thermal zone and cdev, for a particular trip point. 230 If nth bit is set, then the cdev and thermal zone are bound 231 for trip point n. 232 .binding_limits: This is an array of cooling state limits. Must have 233 exactly 2 * thermal_zone.number_of_trip_points. It is an 234 array consisting of tuples <lower-state upper-state> of 235 state limits. Each trip will be associated with one state 236 limit tuple when binding. A NULL pointer means 237 <THERMAL_NO_LIMITS THERMAL_NO_LIMITS> on all trips. 238 These limits are used when binding a cdev to a trip point. 239 .match: This call back returns success(0) if the 'tz and cdev' need to 240 be bound, as per platform data. 2411.4.2 struct thermal_zone_params 242 This structure defines the platform level parameters for a thermal zone. 243 This data, for each thermal zone should come from the platform layer. 244 This is an optional feature where some platforms can choose not to 245 provide this data. 246 .governor_name: Name of the thermal governor used for this zone 247 .no_hwmon: a boolean to indicate if the thermal to hwmon sysfs interface 248 is required. when no_hwmon == false, a hwmon sysfs interface 249 will be created. when no_hwmon == true, nothing will be done. 250 In case the thermal_zone_params is NULL, the hwmon interface 251 will be created (for backward compatibility). 252 .num_tbps: Number of thermal_bind_params entries for this zone 253 .tbp: thermal_bind_params entries 254 2552. sysfs attributes structure 256 257RO read only value 258WO write only value 259RW read/write value 260 261Thermal sysfs attributes will be represented under /sys/class/thermal. 262Hwmon sysfs I/F extension is also available under /sys/class/hwmon 263if hwmon is compiled in or built as a module. 264 265Thermal zone device sys I/F, created once it's registered: 266/sys/class/thermal/thermal_zone[0-*]: 267 |---type: Type of the thermal zone 268 |---temp: Current temperature 269 |---mode: Working mode of the thermal zone 270 |---policy: Thermal governor used for this zone 271 |---available_policies: Available thermal governors for this zone 272 |---trip_point_[0-*]_temp: Trip point temperature 273 |---trip_point_[0-*]_type: Trip point type 274 |---trip_point_[0-*]_hyst: Hysteresis value for this trip point 275 |---emul_temp: Emulated temperature set node 276 |---sustainable_power: Sustainable dissipatable power 277 |---k_po: Proportional term during temperature overshoot 278 |---k_pu: Proportional term during temperature undershoot 279 |---k_i: PID's integral term in the power allocator gov 280 |---k_d: PID's derivative term in the power allocator 281 |---integral_cutoff: Offset above which errors are accumulated 282 |---slope: Slope constant applied as linear extrapolation 283 |---offset: Offset constant applied as linear extrapolation 284 285Thermal cooling device sys I/F, created once it's registered: 286/sys/class/thermal/cooling_device[0-*]: 287 |---type: Type of the cooling device(processor/fan/...) 288 |---max_state: Maximum cooling state of the cooling device 289 |---cur_state: Current cooling state of the cooling device 290 |---stats: Directory containing cooling device's statistics 291 |---stats/reset: Writing any value resets the statistics 292 |---stats/time_in_state_ms: Time (msec) spent in various cooling states 293 |---stats/total_trans: Total number of times cooling state is changed 294 |---stats/trans_table: Cooing state transition table 295 296 297Then next two dynamic attributes are created/removed in pairs. They represent 298the relationship between a thermal zone and its associated cooling device. 299They are created/removed for each successful execution of 300thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device. 301 302/sys/class/thermal/thermal_zone[0-*]: 303 |---cdev[0-*]: [0-*]th cooling device in current thermal zone 304 |---cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with 305 |---cdev[0-*]_weight: Influence of the cooling device in 306 this thermal zone 307 308Besides the thermal zone device sysfs I/F and cooling device sysfs I/F, 309the generic thermal driver also creates a hwmon sysfs I/F for each _type_ 310of thermal zone device. E.g. the generic thermal driver registers one hwmon 311class device and build the associated hwmon sysfs I/F for all the registered 312ACPI thermal zones. 313 314/sys/class/hwmon/hwmon[0-*]: 315 |---name: The type of the thermal zone devices 316 |---temp[1-*]_input: The current temperature of thermal zone [1-*] 317 |---temp[1-*]_critical: The critical trip point of thermal zone [1-*] 318 319Please read Documentation/hwmon/sysfs-interface for additional information. 320 321*************************** 322* Thermal zone attributes * 323*************************** 324 325type 326 Strings which represent the thermal zone type. 327 This is given by thermal zone driver as part of registration. 328 E.g: "acpitz" indicates it's an ACPI thermal device. 329 In order to keep it consistent with hwmon sys attribute; this should 330 be a short, lowercase string, not containing spaces nor dashes. 331 RO, Required 332 333temp 334 Current temperature as reported by thermal zone (sensor). 335 Unit: millidegree Celsius 336 RO, Required 337 338mode 339 One of the predefined values in [enabled, disabled]. 340 This file gives information about the algorithm that is currently 341 managing the thermal zone. It can be either default kernel based 342 algorithm or user space application. 343 enabled = enable Kernel Thermal management. 344 disabled = Preventing kernel thermal zone driver actions upon 345 trip points so that user application can take full 346 charge of the thermal management. 347 RW, Optional 348 349policy 350 One of the various thermal governors used for a particular zone. 351 RW, Required 352 353available_policies 354 Available thermal governors which can be used for a particular zone. 355 RO, Required 356 357trip_point_[0-*]_temp 358 The temperature above which trip point will be fired. 359 Unit: millidegree Celsius 360 RO, Optional 361 362trip_point_[0-*]_type 363 Strings which indicate the type of the trip point. 364 E.g. it can be one of critical, hot, passive, active[0-*] for ACPI 365 thermal zone. 366 RO, Optional 367 368trip_point_[0-*]_hyst 369 The hysteresis value for a trip point, represented as an integer 370 Unit: Celsius 371 RW, Optional 372 373cdev[0-*] 374 Sysfs link to the thermal cooling device node where the sys I/F 375 for cooling device throttling control represents. 376 RO, Optional 377 378cdev[0-*]_trip_point 379 The trip point in this thermal zone which cdev[0-*] is associated 380 with; -1 means the cooling device is not associated with any trip 381 point. 382 RO, Optional 383 384cdev[0-*]_weight 385 The influence of cdev[0-*] in this thermal zone. This value 386 is relative to the rest of cooling devices in the thermal 387 zone. For example, if a cooling device has a weight double 388 than that of other, it's twice as effective in cooling the 389 thermal zone. 390 RW, Optional 391 392passive 393 Attribute is only present for zones in which the passive cooling 394 policy is not supported by native thermal driver. Default is zero 395 and can be set to a temperature (in millidegrees) to enable a 396 passive trip point for the zone. Activation is done by polling with 397 an interval of 1 second. 398 Unit: millidegrees Celsius 399 Valid values: 0 (disabled) or greater than 1000 400 RW, Optional 401 402emul_temp 403 Interface to set the emulated temperature method in thermal zone 404 (sensor). After setting this temperature, the thermal zone may pass 405 this temperature to platform emulation function if registered or 406 cache it locally. This is useful in debugging different temperature 407 threshold and its associated cooling action. This is write only node 408 and writing 0 on this node should disable emulation. 409 Unit: millidegree Celsius 410 WO, Optional 411 412 WARNING: Be careful while enabling this option on production systems, 413 because userland can easily disable the thermal policy by simply 414 flooding this sysfs node with low temperature values. 415 416sustainable_power 417 An estimate of the sustained power that can be dissipated by 418 the thermal zone. Used by the power allocator governor. For 419 more information see Documentation/thermal/power_allocator.txt 420 Unit: milliwatts 421 RW, Optional 422 423k_po 424 The proportional term of the power allocator governor's PID 425 controller during temperature overshoot. Temperature overshoot 426 is when the current temperature is above the "desired 427 temperature" trip point. For more information see 428 Documentation/thermal/power_allocator.txt 429 RW, Optional 430 431k_pu 432 The proportional term of the power allocator governor's PID 433 controller during temperature undershoot. Temperature undershoot 434 is when the current temperature is below the "desired 435 temperature" trip point. For more information see 436 Documentation/thermal/power_allocator.txt 437 RW, Optional 438 439k_i 440 The integral term of the power allocator governor's PID 441 controller. This term allows the PID controller to compensate 442 for long term drift. For more information see 443 Documentation/thermal/power_allocator.txt 444 RW, Optional 445 446k_d 447 The derivative term of the power allocator governor's PID 448 controller. For more information see 449 Documentation/thermal/power_allocator.txt 450 RW, Optional 451 452integral_cutoff 453 Temperature offset from the desired temperature trip point 454 above which the integral term of the power allocator 455 governor's PID controller starts accumulating errors. For 456 example, if integral_cutoff is 0, then the integral term only 457 accumulates error when temperature is above the desired 458 temperature trip point. For more information see 459 Documentation/thermal/power_allocator.txt 460 Unit: millidegree Celsius 461 RW, Optional 462 463slope 464 The slope constant used in a linear extrapolation model 465 to determine a hotspot temperature based off the sensor's 466 raw readings. It is up to the device driver to determine 467 the usage of these values. 468 RW, Optional 469 470offset 471 The offset constant used in a linear extrapolation model 472 to determine a hotspot temperature based off the sensor's 473 raw readings. It is up to the device driver to determine 474 the usage of these values. 475 RW, Optional 476 477***************************** 478* Cooling device attributes * 479***************************** 480 481type 482 String which represents the type of device, e.g: 483 - for generic ACPI: should be "Fan", "Processor" or "LCD" 484 - for memory controller device on intel_menlow platform: 485 should be "Memory controller". 486 RO, Required 487 488max_state 489 The maximum permissible cooling state of this cooling device. 490 RO, Required 491 492cur_state 493 The current cooling state of this cooling device. 494 The value can any integer numbers between 0 and max_state: 495 - cur_state == 0 means no cooling 496 - cur_state == max_state means the maximum cooling. 497 RW, Required 498 499stats/reset 500 Writing any value resets the cooling device's statistics. 501 WO, Required 502 503stats/time_in_state_ms: 504 The amount of time spent by the cooling device in various cooling 505 states. The output will have "<state> <time>" pair in each line, which 506 will mean this cooling device spent <time> msec of time at <state>. 507 Output will have one line for each of the supported states. usertime 508 units here is 10mS (similar to other time exported in /proc). 509 RO, Required 510 511stats/total_trans: 512 A single positive value showing the total number of times the state of a 513 cooling device is changed. 514 RO, Required 515 516stats/trans_table: 517 This gives fine grained information about all the cooling state 518 transitions. The cat output here is a two dimensional matrix, where an 519 entry <i,j> (row i, column j) represents the number of transitions from 520 State_i to State_j. If the transition table is bigger than PAGE_SIZE, 521 reading this will return an -EFBIG error. 522 RO, Required 523 5243. A simple implementation 525 526ACPI thermal zone may support multiple trip points like critical, hot, 527passive, active. If an ACPI thermal zone supports critical, passive, 528active[0] and active[1] at the same time, it may register itself as a 529thermal_zone_device (thermal_zone1) with 4 trip points in all. 530It has one processor and one fan, which are both registered as 531thermal_cooling_device. Both are considered to have the same 532effectiveness in cooling the thermal zone. 533 534If the processor is listed in _PSL method, and the fan is listed in _AL0 535method, the sys I/F structure will be built like this: 536 537/sys/class/thermal: 538 539|thermal_zone1: 540 |---type: acpitz 541 |---temp: 37000 542 |---mode: enabled 543 |---policy: step_wise 544 |---available_policies: step_wise fair_share 545 |---trip_point_0_temp: 100000 546 |---trip_point_0_type: critical 547 |---trip_point_1_temp: 80000 548 |---trip_point_1_type: passive 549 |---trip_point_2_temp: 70000 550 |---trip_point_2_type: active0 551 |---trip_point_3_temp: 60000 552 |---trip_point_3_type: active1 553 |---cdev0: --->/sys/class/thermal/cooling_device0 554 |---cdev0_trip_point: 1 /* cdev0 can be used for passive */ 555 |---cdev0_weight: 1024 556 |---cdev1: --->/sys/class/thermal/cooling_device3 557 |---cdev1_trip_point: 2 /* cdev1 can be used for active[0]*/ 558 |---cdev1_weight: 1024 559 560|cooling_device0: 561 |---type: Processor 562 |---max_state: 8 563 |---cur_state: 0 564 565|cooling_device3: 566 |---type: Fan 567 |---max_state: 2 568 |---cur_state: 0 569 570/sys/class/hwmon: 571 572|hwmon0: 573 |---name: acpitz 574 |---temp1_input: 37000 575 |---temp1_crit: 100000 576 5774. Event Notification 578 579The framework includes a simple notification mechanism, in the form of a 580netlink event. Netlink socket initialization is done during the _init_ 581of the framework. Drivers which intend to use the notification mechanism 582just need to call thermal_generate_netlink_event() with two arguments viz 583(originator, event). The originator is a pointer to struct thermal_zone_device 584from where the event has been originated. An integer which represents the 585thermal zone device will be used in the message to identify the zone. The 586event will be one of:{THERMAL_AUX0, THERMAL_AUX1, THERMAL_CRITICAL, 587THERMAL_DEV_FAULT}. Notification can be sent when the current temperature 588crosses any of the configured thresholds. 589 5905. Export Symbol APIs: 591 5925.1: get_tz_trend: 593This function returns the trend of a thermal zone, i.e the rate of change 594of temperature of the thermal zone. Ideally, the thermal sensor drivers 595are supposed to implement the callback. If they don't, the thermal 596framework calculated the trend by comparing the previous and the current 597temperature values. 598 5995.2:get_thermal_instance: 600This function returns the thermal_instance corresponding to a given 601{thermal_zone, cooling_device, trip_point} combination. Returns NULL 602if such an instance does not exist. 603 6045.3:thermal_notify_framework: 605This function handles the trip events from sensor drivers. It starts 606throttling the cooling devices according to the policy configured. 607For CRITICAL and HOT trip points, this notifies the respective drivers, 608and does actual throttling for other trip points i.e ACTIVE and PASSIVE. 609The throttling policy is based on the configured platform data; if no 610platform data is provided, this uses the step_wise throttling policy. 611 6125.4:thermal_cdev_update: 613This function serves as an arbitrator to set the state of a cooling 614device. It sets the cooling device to the deepest cooling state if 615possible. 616 6176. thermal_emergency_poweroff: 618 619On an event of critical trip temperature crossing. Thermal framework 620allows the system to shutdown gracefully by calling orderly_poweroff(). 621In the event of a failure of orderly_poweroff() to shut down the system 622we are in danger of keeping the system alive at undesirably high 623temperatures. To mitigate this high risk scenario we program a work 624queue to fire after a pre-determined number of seconds to start 625an emergency shutdown of the device using the kernel_power_off() 626function. In case kernel_power_off() fails then finally 627emergency_restart() is called in the worst case. 628 629The delay should be carefully profiled so as to give adequate time for 630orderly_poweroff(). In case of failure of an orderly_poweroff() the 631emergency poweroff kicks in after the delay has elapsed and shuts down 632the system. 633 634If set to 0 emergency poweroff will not be supported. So a carefully 635profiled non-zero positive value is a must for emergerncy poweroff to be 636triggered. 637