Thermal Management Module

Overview

The Thermal Management Module is the orchestration and autonomous regulation system for physical cooling within tlBMC. Its core responsibility is to continuously monitor platform temperatures, power dissipation, and airflow metrics across distinct physical regions, autonomously computing optimal fan speeds to maintain hermetic hardware health, optimize acoustic/power profiles, and prevent component thermal throttling or structural damage.

When activated via the central configuration switch, the Thermal Management Module assumes complete ownership over the following Redfish API endpoints and platform subsystems:

  • /redfish/v1/Chassis/{id}/ThermalSubsystem and its associated Fans collection.
  • /redfish/v1/Chassis/{id}/PowerSubsystem and its associated PowerSupplies collection.
  • /redfish/v1/Managers/{id} (thermal state reporting and override properties).
  • /redfish/v1/Managers/bmc/Actions/Manager.FanMode.Change POST (dynamic acoustic and fan override profiles).
  • /redfish/v1/Managers/bmc/FanMode.Change.ActionInfo.
  • /redfish/v1/Chassis/{id}/Sensors PATCH (sensor threshold monitoring and thermal tuning).

Simultaneously, enabling this module automatically purges legacy Redfish links to /redfish/v1/Chassis/{id}/Thermal in compliance with modern Redfish DMTF specifications.

Architecture

The underlying architecture of the Thermal Management Module enforces a strict, robust mathematical decoupling between Zone Management (physical area orchestration) and Thermal Control Loops (independent control strategies and algorithms).

1. Zone Management

A physical platform is divided into one or more thermal zones managed by dedicated ZoneManager instances (and SupportiveZoneManager instances for auxiliary loops). Each zone orchestrates:

  • Hardware Entity Ownership: Grouping input temperature/power sensors (SensorInfo), physical output fan tachometers/PWM controllers (FanInfo), and independent thermal loop controllers (ControllerInfo).
  • Setpoint Determination & Aggregation: Collecting diverse setpoint requests (e.g., base target speeds, additive offsets, RPM ceilings) from attached control loops via AddSetpoint and AddAdditiveSetpoint. The zone computes a single canonical MaximumSetpoint, clamping final targets strictly within configured bounds (setpoint_lower_bound and setpoint_upper_bound).
  • Failsafe Orchestration: Continuously auditing sensor health and readings against critical thresholds (min_threshold_critical and max_threshold_critical). If any sensor becomes stale, returns invalid readings, or crosses critical operating limits, the zone instantly enters failsafe mode (GetFailsafeMode()), forcing PWM outputs to an aggressive emergency cooling level (failsafe_percent) and logging protective overrides via the FailsafeLogger.

For detailed documentation, see Zone Management.

2. Thermal Control Loops

Control strategies are encapsulated into autonomous mathematical loops executing at configurable sample frequencies. Each loop translates raw telemetry (temperatures, thermal margins, power dissipation, tachometer feedback) into cooling setpoint directives:

  • PID Controller (PidThermalLoop): Implements classical Proportional-Integral-Derivative feedback regulation with advanced anti-windup clamping, feed-forward offsets, output slew limiting, and setpoint hysteresis. Supports raw temperature tracking (TEMP_PID), thermal margin tracking (MARGIN_PID), and power tracking (POWER_PID).
  • Stepwise Controller (StepwiseThermalLoop): Binds thermal output steps to discrete input thresholds via StepwiseCriticalPoint definitions. Employs asymmetric positive/negative hysteresis to eliminate threshold jitter, functioning as either a base PWM setpoint generator or a strict RPM ceiling enforcer (is_ceiling).
  • DFF Controller (DffThermalLoop): Disturbance Feed-Forward control driven by real-time platform power consumption. Passes sudden workload shifts through low-pass filtering and feed-forward gain schedules (coeff_f1-coeff_f3) relative to a nominal baseline (reference_power), injecting proactive additive setpoints into peer control loops.
  • Fan PID Controller (FanPidController): High-speed, closed-loop tachometer regulation matching actual fan blade RPM against target setpoints using high-frequency proportional-integral tracking.
  • EAT Controller (EatThermalLoop): Entering Air Temperature compensation loop calculating multi-hour ambient baseline shifts to dynamically offset room-level environmental changes.
  • First/Second Order ADRC (FirstOrderAdrcLoopConfig / SecondOrderAdrcLoopConfig): Advanced Active Disturbance Rejection Control utilizing Non-linear Tracking Differentiators (NonlinearTrackingDifferentiatorConfig) and extended state observers (observer_bandwidth_factor) to estimate and cancel external platform thermal perturbations in real time.

For detailed algorithm breakdowns, see Control Loops.

Central Configuration (central_config.proto)

Activation of the Thermal Management Module is controlled within the central tlBMC bundle:

FieldTypeDefaultDescription
enabledboolfalseActivation toggle under SensorCollectorModule.thermal_control_sub_module. When set to true, initiates autonomous thermal loops, instantiates ZoneManager boundaries, and binds Redfish ThermalSubsystem API routes.

Platform Configuration

While physical thermal sensors and PWM/Tach hardware endpoints are discovered via standard Entity Manager JSON configuration blocks, advanced loop parameters, gain coefficients, and zone boundaries are configured via platform-specific textproto bundles.

Protobuf Schema Definitions

The primary configuration definitions and control loop structures are exhaustively detailed in the following schemas:

  • thermal_config.proto: Schema defining ThermalConfigs, ZoneManagerConfig, SupportiveZoneManagerConfig, and all independent loop structures (PidLoopConfig, StepwiseLoopConfig, DffLoopConfig, EatLoopConfig, FirstOrderAdrcLoopConfig, SecondOrderAdrcLoopConfig).
  • central_config.proto: Schema defining the central module activation structure (ThermalControlSubmodule).

Configuration Table (ThermalConfigs)

ParameterTypeDescription
zonesZoneManagerConfigsDefines physical thermal zones, operating boundaries, cycle timers, attached sensors, and managed output fans.
supportive_zonesSupportiveZoneManagerConfigsConfigures supportive zone boundaries for non-actuating auxiliary loops (e.g., ambient EAT tracking).
pid_controllersPidControllerConfigsInstantiates Proportional-Integral-Derivative controllers, binding sensor keys, Kp/Ki/Kd gains, and target setpoints.
stepwise_controllersStepwiseControllerConfigsConfigures multi-step thermal curves, hysteresis boundaries, and setpoint/ceiling modes.
fan_pid_controllersFanPidControllerConfigsConfigures closed-loop RPM tachometer tracking controllers driving physical fan PWM lines.
dff_controllersDffControllerConfigsEstablishes Disturbance Feed-Forward power tracking loops modifying target setpoints of peer controllers.
eat_controllersEatControllerConfigsInstantiates ambient Entering Air Temperature compensation tracking loops.
failsafe_logger_configFailsafeLoggerConfigConfigures rate limits (failsafe_log_limit_per_second) for emergency thermal override reporting.
tuning_enabledboolEnables runtime interactive tuning and parameter modification via Redfish/debug interfaces.

Usage & Examples

1. Enabling Thermal Management in Central Config

To activate thermal management within a platform build (tlbmc_config_bundle.textproto):

sensor_collector_module {
  enabled: true
  thermal_control_sub_module {
    enabled: true
  }
}

2. Platform Thermal Zone Configuration (configs/thermal_config.textproto)

A production platform configuration defining a zone manager, temperature sensor inputs, fan tachometers, and a standard PID controller:

# proto-file: third_party/milotic/external/cc/tlbmc/configs/thermal_config.proto
# proto-message: ThermalConfigs

zones {
  zone_manager_configs {
    id: 1
    setpoint_upper_bound: 16100
    setpoint_lower_bound: 2000
    minimum_thermal_setpoint: 30
    zone_failsafe_percent: 70
    ms_per_fan_cycle: 100
    ms_per_thermal_cycle: 1000
    debug_mode {
      debug_enabled: true
      debug_pid_enabled: true
    }
    input_sensors {
      sensor_key: "temperature_PDB_QB0_P12V_T"
      is_missing_acceptable: false
      scale: 0
      failsafe_percent: 100
      max_threshold_critical: 115
      min_threshold_critical: 15
    }
    input_sensors {
      sensor_key: "fantach_PDB_fan0_front_TACH"
      is_missing_acceptable: false
      scale: 0
      failsafe_percent: 100
      max_threshold_critical: 19800
      min_threshold_critical: 0
    }
    output_fans {
      fan_name: "fanpwm_PDB_fan0_PWM"
      failsafe_percent: 80
      max_threshold_critical: 1000
      min_threshold_critical: -10
    }
  }
}

pid_controllers {
  pid_controller_configs {
    id: "PDB_Quarter_Brick_0_T"
    pid_loop_config {
      sample_time_sec: 1
      coeff_proportional: -3.0
      coeff_integral: -0.1
      coeff_derivative: 0.0
      integral_limit_max: 100.0
      integral_limit_min: 30.0
      output_limit_max: 0.0
      output_limit_min: 0.0
    }
    zone_manager_id: 1
    setpoint: 95.0
    input_process_type: TEMP_PID
    input_sensors {
      sensor_key: "temperature_PDB_QB0_P12V_T"
      max_junction_temperature: 100.0
      convert_temperature_to_margin: false
    }
  }
}

failsafe_logger_config {
  failsafe_log_limit_per_second: 20
}
tuning_enabled: true

Code References