Thermal Profiles User Guide#
Overview#
Intel® Core™ Ultra edge nodes let you control how the platform reacts as its
temperature rises — when fans spin up, when the CPU frequency is capped, and
when idle cycles are forced in as a hard limit. The Infrastructure Blueprint
ships a local tool under tools/power-tuning/ that configures this policy
through the Linux thermal daemon, thermald:
Apply a ready-made thermal profile (
cool,warm,hot,thermal-max).Set an explicit set of custom trip points (Fan / Processor / powerclamp).
Optionally add the CHRG (battery charge) cooling device.
Disable thermald to revert to kernel default thermal control.
set_thermal_profile.sh generates, validates, applies and verifies a
/etc/thermald/thermal-conf.xml with a staged escalation on the CPU package
sensor (x86_pkg_temp):
Fan (active) < Processor (passive) < intel_powerclamp (passive)
fans on early cap CPU frequency inject idle cycles (hard limit)
It then makes thermald the sole thermal authority (a systemd drop-in that
runs thermald with --ignore-default-control and without --adaptive, so
firmware DPTF/GDDV adaptive tables do not override the trip points).
On the target system: the commands below use repository-relative paths (
tools/power-tuning/…), which work when you run them from the repo root. On a host provisioned with Infrastructure Blueprint, the same tools are available on the target system at/opt/edge/developer/tools/power-tuning/. Eithercd /opt/edge/developerand use the relative paths as written, or prefix each command with the full path (e.g.sudo /opt/edge/developer/tools/power-tuning/set_thermal_profile.sh --profile warm).
This thermal profile pairs with the power envelope from
set_power_profile.sh: the power cap bounds how much heat
is produced, while the thermal profile governs how the platform responds as the
package temperature climbs. Apply the power envelope first, then the thermal
policy.
Note: Unlike the runtime-only RAPL power cap, the thermal config and systemd override are written to disk and persist across a reboot — see What Persists Across a Reboot.
Prerequisites#
An Intel
x86_64host (Core Ultra / Panther Lake recommended).thermaldinstalled (it consumes the generated config and drives the cooling devices). Not required for--dry-runor--outputmode:sudo apt-get install -y thermald
sudoaccess. The script writes to/etc/thermald/, installs a systemd drop-in, and restarts the service. It does not self-elevate, so apply and--disableruns must be invoked withsudo.Cooling devices exposed by the kernel. The script wires in whichever of
Fan,Processor,intel_powerclamp(andCHRGwhen--chargeis given) are present, and refuses to write an empty zone if none exist. Check with:grep . /sys/class/thermal/cooling_device*/type
Thermal Profiles#
A profile is a set of three trip points on the CPU package sensor, ordered
Fan (active) < Processor (passive) < powerclamp (passive). Trip points are in
degrees Celsius.
Profile |
Fan |
Processor |
powerclamp |
Typical use |
|---|---|---|---|---|
|
55 |
70 |
80 |
Aggressive cooling; fans on early, runs coolest/quietest at the cost of performance |
|
60 |
75 |
85 |
Balanced |
|
70 |
90 |
95 |
Lets the platform run warmer before intervening |
|
95 |
100 |
104 |
Pushes to Tjmax headroom; runs hot |
|
|
|
|
Supply your own trip points |
Terminology#
Term |
Meaning |
|---|---|
thermald |
The Linux thermal daemon that consumes the generated |
trip point |
A temperature threshold at which a cooling action is engaged. |
active trip |
A cooling response that does not cost performance — here, turning fans on. |
passive trip |
A cooling response that reduces performance to shed heat — frequency capping or idle injection. |
x86_pkg_temp |
The CPU package temperature sensor the profile escalates on. |
Fan |
The active cooling device engaged at the first (lowest) trip. |
Processor |
The passive cooling device that caps CPU frequency at the middle trip. |
intel_powerclamp |
The passive cooling device that injects idle cycles (hard limit) at the top trip. |
CHRG |
The battery-charge cooling device; optionally added to the top trip when present ( |
Tjmax |
The silicon’s maximum junction temperature (~110 °C); the top trip must stay below it ( |
DPTF / GDDV |
Firmware adaptive thermal framework/tables that would override the config unless thermald runs without |
Apply a Named Profile#
Use set_thermal_profile.sh with --profile. The profile must be given via the
flag; a bare positional word is rejected. Run from the repository root:
# Balanced (default) — Fan 60 / Processor 75 / powerclamp 85 °C
sudo tools/power-tuning/set_thermal_profile.sh --profile warm
# Aggressive cooling — fans on early, coolest/quietest
sudo tools/power-tuning/set_thermal_profile.sh --profile cool
# Run warmer before intervening
sudo tools/power-tuning/set_thermal_profile.sh --profile hot
# Push to Tjmax headroom — runs hot; warn on fanless/constrained enclosures
sudo tools/power-tuning/set_thermal_profile.sh --profile thermal-max
# Add the battery-charge (CHRG) cooling device to the top trip, if present
sudo tools/power-tuning/set_thermal_profile.sh --profile cool --charge
# Preview only — print the plan and generated XML without changing anything
tools/power-tuning/set_thermal_profile.sh --profile warm --dry-run
Set Custom Trip Points#
For fine-grained control, supply your own three trip points instead of a named
profile. All three are required and must satisfy fan < proc < clamp with
clamp < 105 (must stay below Tjmax).
# Custom escalation — Fan 50 / Processor 65 / powerclamp 78 °C
sudo tools/power-tuning/set_thermal_profile.sh --profile custom \
--fan 50 --proc 65 --clamp 78
# Preview a custom profile without applying it
tools/power-tuning/set_thermal_profile.sh --profile custom \
--fan 50 --proc 65 --clamp 78 --dry-run
Option |
Meaning |
|---|---|
|
Profile to apply: |
|
Fan (active) trip in Celsius (custom only). |
|
Processor (passive) trip in Celsius (custom only). |
|
powerclamp (passive) trip in Celsius (custom only). |
|
Add the CHRG (battery charge) cooling device to the top trip, if present on this platform. |
|
Write the XML to |
|
Stop thermald and disable it at boot (reverts to kernel default thermal control). |
|
Print the plan and generated XML; write nothing, change nothing. |
Generate the XML Without Applying It#
To produce the thermal-conf.xml for review or use elsewhere without touching
the running daemon, write it to a file with -o/--output:
sudo tools/power-tuning/set_thermal_profile.sh --profile warm -o /tmp/thermal-conf.xml
This writes only the XML and makes no daemon changes.
Disable Thermald (Revert to Kernel Default)#
To fully revert to kernel default thermal control, disable thermald. This stops the service and disables it at boot, leaving the config and override files untouched:
sudo tools/power-tuning/set_thermal_profile.sh --disable
Re-enable it later with:
sudo systemctl enable --now thermald
Verify and Monitor#
After applying, confirm thermald is active and is the sole thermal authority
(the effective ExecStart contains --ignore-default-control and not
--adaptive):
systemctl is-active thermald
systemctl show thermald -p ExecStart
To watch the package temperature cross the trip points under load, pair this with the power-tuning monitor and stress tools (see Power Profiles):
# Terminal 1 — live power/thermal monitor (watch PkgTmp against the trips)
cd tools/power-tuning && sudo ./pt_mon.sh
# Terminal 2 — drive the platform hot enough to exercise the trip points
tools/power-tuning/stress_gen.sh --duration 3m
Watch for the escalation stages engaging in order: fans on at the Fan trip, frequency capping at the Processor trip, and idle injection at the powerclamp trip.
Side Effects and Tips#
thermal-maxruns hot: its top trip sits near Tjmax, so the platform intervenes only very late. On fanless / thermally constrained enclosures this can mean sustained high temperatures — prefercoolorwarmthere.Fanless platforms: if no
Fancooling device exists, the active step is omitted and the platform relies solely on the passive steps (frequency cap + idle injection).Sole thermal authority: the systemd override runs thermald without
--adaptiveso firmware DPTF/GDDV adaptive tables cannot override the trip points. If the profile seems ignored, confirm the effectiveExecStartstill has--ignore-default-controland no--adaptive.Config is validated first: the script parses the generated XML in thermald test-mode before installing it and aborts without changing the system if it does not validate.
Brief management gap: applying a profile restarts
thermald; if the script aborts mid-run it restores the previously running daemon.
What Persists Across a Reboot#
Unlike the runtime-only RAPL power cap from
set_power_profile.sh, the
thermal config and systemd override are written to disk and persist across a
reboot:
What changes |
Where it lives |
Reverts on reboot? |
|---|---|---|
Thermal trip points |
|
No — thermald re-reads it at the next boot. |
Sole-authority |
|
No — the drop-in stays on disk. |
To change the trip points, simply re-run with a different --profile (the script
backs up the previous config to ${CONF_FILE}.bak and the override to
${OVERRIDE_FILE}.bak). To restore the previous config manually:
sudo cp /etc/thermald/thermal-conf.xml.bak /etc/thermald/thermal-conf.xml
sudo systemctl restart thermald
To fully revert to kernel default thermal control, run with --disable (see
Disable Thermald).