| edition = "2023"; |
| |
| package milotic_tlbmc; |
| |
| // The config of thermal zone debug mode. |
| message ThermalDebugModeConfig { |
| bool tuning_enabled = 1 [deprecated = true]; |
| bool debug_enabled = 2 [default = false]; |
| bool debug_pid_enabled = 3 [default = false]; |
| } |
| |
| // The sensor info needed by a PID controller. |
| message PidControllerSensorInfo { |
| string sensor_key = 1; |
| // `max_junction_temperature` is `Tjmax`, the hottest temperature a CPU can |
| // operate at before it begins thermal throttling to reduce performance and |
| // prevent damage. It must be explicitly specified for a margin PID sensor. |
| double max_junction_temperature = 2 [default = 0]; |
| bool convert_temperature_to_margin = 3 [default = false]; |
| } |
| |
| // The sensor info needed by a zone manager. |
| message ZoneManagerSensorInfo { |
| string sensor_key = 1; |
| bool is_missing_acceptable = 2 [default = false]; |
| // The scale factor to apply to sensor readings. The eventual sensor reading |
| // value used by the thermal loop will be: `reading * pow(10, scale)`. |
| double scale = 3 [default = 0]; |
| double failsafe_percent = 4 [default = 100]; |
| // For a sensor reading outside the critical thresholds, failsafe mode will be |
| // triggered for the zones owning that sensor. |
| double max_threshold_critical = 5; |
| double min_threshold_critical = 6; |
| } |
| |
| message ZoneManagerFanInfo { |
| string fan_name = 1; |
| double failsafe_percent = 2 [default = 100]; |
| // If the fan speed to be written is outside the critical thresholds, failsafe |
| // mode will be triggered for the zone try to write that fan speed. |
| double max_threshold_critical = 3 [default = 255]; |
| double min_threshold_critical = 4 [default = 0]; |
| } |
| |
| // The config of thermal zone managers. |
| message ZoneManagerConfig { |
| int32 id = 1; |
| double setpoint_upper_bound = 2; |
| double setpoint_lower_bound = 3; |
| double minimum_thermal_setpoint = 4; |
| double zone_failsafe_percent = 5 [default = 100]; |
| ThermalDebugModeConfig debug_mode = 6; |
| // The time interval in milliseconds between two fan cycles. |
| uint64 ms_per_fan_cycle = 7 [default = 100]; |
| // The time interval in milliseconds between two thermal cycles. |
| uint64 ms_per_thermal_cycle = 8 [default = 1000]; |
| repeated ZoneManagerSensorInfo input_sensors = 9; |
| repeated ZoneManagerFanInfo output_fans = 10; |
| } |
| |
| // The config of 1st-Order Active Disturbance Rejection Control (ADRC) thermal |
| // loops. |
| message FirstOrderAdrcLoopConfig { |
| // Sample time in seconds. |
| double sample_time_sec = 1 [default = 1]; |
| // Settling time in seconds. |
| // The target time for the closed-loop system to reach the reference value |
| // within a 2% error margin. |
| double settle_time_sec = 2 [default = 1]; |
| // Control gain for current disturbance. |
| double b0 = 3 [default = 0]; |
| // Gain for extended state observer. |
| // It determines the speed of the observer relative to the controller. |
| double coeff_eso = 4 [default = 0]; |
| // Actuator saturation limits |
| double u_limit_max = 5 [default = 0]; |
| double u_limit_min = 6 [default = 0]; |
| } |
| |
| // The config of 2nd-Order Active Disturbance Rejection Control (ADRC) thermal |
| // loops. |
| message SecondOrderAdrcLoopConfig { |
| // Sample time in seconds. |
| double sample_time_sec = 1 [default = 1]; |
| // Settling time in seconds. |
| // The target time for the closed-loop system to reach the reference value |
| // within a 2% error margin. |
| double settle_time_sec = 2 [default = 1]; |
| // Control gain for current disturbance. |
| double b0 = 3 [default = 0]; |
| // Gain for extended state observer. |
| // It determines the speed of the observer relative to the controller. |
| double coeff_eso = 4 [default = 0]; |
| // Actuator saturation limits |
| double u_limit_max = 5 [default = 0]; |
| double u_limit_min = 6 [default = 0]; |
| } |
| |
| // The config of Proportional-Integral-Derivative (PID) thermal loops. |
| message PidLoopConfig { |
| // Sample time in seconds. |
| double sample_time_sec = 1 [default = 1]; |
| // Coefficient for P (proportional gain), aka Kp. |
| double coeff_proportional = 2 [default = 0]; |
| // Coefficient for I (integral gain), aka Ki. |
| double coeff_integral = 3 [default = 0]; |
| // Coefficient for D (derivative gain), aka Kd. |
| double coeff_derivative = 4 [default = 0]; |
| // Offset coeff for feed-forward term. |
| double feed_forward_offset = 5 [default = 0]; |
| // Gain for feed-forward term. |
| double feed_forward_gain = 6 [default = 0]; |
| // Clamp of integral value upper bound. |
| double integral_limit_max = 7 [default = 0]; |
| // Clamp of integral value lower bound. |
| double integral_limit_min = 8 [default = 0]; |
| // Clamp of output value upper bound. |
| double output_limit_max = 9 [default = 0]; |
| // Clamp of output value lower bound. |
| double output_limit_min = 10 [default = 0]; |
| // Negative slew rate. |
| double slew_neg = 11 [default = 0]; |
| // Positive slew rate. |
| double slew_pos = 12 [default = 0]; |
| // Negative hysteresis. |
| double hysteresis_neg = 13 [default = 0]; |
| // Positive hysteresis. |
| double hysteresis_pos = 14 [default = 0]; |
| // Compare current input and setpoint to check hysteresis. |
| // If this is true, the hysteresis check will be performed regardless of the |
| // value of `hysteresis_pos` and `hysteresis_neg`. If this is false, input |
| // hysteresis check will be performed if any of `hysteresis_pos` and |
| // `hysteresis_neg` is significant. |
| bool check_hysteresis_with_setpoint = 15 [default = false]; |
| } |
| |
| // The the input process type of PID thermal controllers. |
| enum PidControllerInputProcessType { |
| UNSUPPORTED_PID = 0; |
| MARGIN_PID = 1; |
| TEMP_PID = 2; |
| POWER_PID = 3; |
| POWERSUM_PID = 4; |
| } |
| |
| // The config of PID thermal controllers. |
| message PidControllerConfig { |
| // The ID of the PID controller. |
| string id = 1; |
| // The config of the PID loop. |
| PidLoopConfig pid_loop_config = 2; |
| // The ID of the owner zone manager. |
| repeated int32 zone_manager_id = 3; |
| double setpoint = 4; |
| PidControllerInputProcessType input_process_type = 5; |
| repeated PidControllerSensorInfo input_sensors = 6; |
| } |
| |
| // The config of fan PID thermal controllers. |
| message FanPidControllerConfig { |
| // The ID of the fan PID controller. |
| string id = 1; |
| // The config of the PID loop. |
| PidLoopConfig pid_loop_config = 2; |
| // The ID of the owner zone manager. |
| repeated int32 zone_manager_id = 3; |
| repeated string input_fans = 4; |
| repeated string output_fans = 5; |
| } |
| |
| // The critical point of stepwise thermal loops. |
| message StepwiseCriticalPoint { |
| // The threshold value. |
| double threshold = 1; |
| // The output value. |
| double stepwise_output = 2; |
| } |
| |
| // The config of stepwise thermal loops. |
| message StepwiseLoopConfig { |
| // Sample time in seconds. |
| double sample_time_sec = 1 [default = 1]; |
| // Enumerated list of threshold values with its corresponding output value. |
| // The threshold values must be monotonically increasing. |
| repeated StepwiseCriticalPoint critical_points = 2; |
| // How much the input value must raise to allow the switch to the next step. |
| double positive_hysteresis = 3 [default = 0]; |
| // How much the input value must drop to allow the switch to the previous |
| // step. |
| double negative_hysteresis = 4 [default = 0]; |
| // Whether this controller provides a setpoint or a ceiling for the zone. |
| bool is_ceiling = 5 [default = false]; |
| } |
| |
| // The config of stepwise thermal controllers. |
| message StepwiseControllerConfig { |
| // The ID of the stepwise controller. |
| string id = 1; |
| // The config of the stepwise loop. |
| StepwiseLoopConfig stepwise_loop_config = 2; |
| // The ID of the owner zone manager. |
| repeated int32 zone_manager_id = 3; |
| // Whether this controller provides a setpoint or a ceiling for the zone. |
| bool is_ceiling = 4; |
| repeated string input_sensors = 5; |
| } |
| |
| // The config of Dynamic Feedforward (DFF) thermal loops. |
| message DffLoopConfig { |
| // Sample time in seconds. |
| double sample_time_sec = 1 [default = 1]; |
| // Coefficient of disturbance when applying low pass filter. |
| double coeff_h1 = 2 [default = 0]; |
| // Coefficient of previous disturbance when applying low pass filter. |
| double coeff_h2 = 3 [default = 0]; |
| // Coefficient of previous filtered disturbance when applying low pass filter. |
| double coeff_h3 = 4 [default = 0]; |
| // Coefficient of current disturbance input. This is the coefficient for the |
| // current disturbance input. For example, a large positive value here will |
| // cause an immediate and large response to a sudden change in chip power. |
| double coeff_f1 = 5 [default = 0]; |
| // Coefficient of previous disturbance input. This is the coefficient for the |
| // previous disturbance input. Its value and its sign are crucial for shaping |
| // the output response. |
| double coeff_f2 = 6 [default = 0]; |
| // Coefficient of previous output. This is the coefficient for the previous |
| // output. It acts as a feedback term within the feedforward controller |
| // itself. It determines how long the effect of a disturbance persists. |
| double coeff_f3 = 7 [default = 0]; |
| // Clamp of output value upper bound. |
| double output_limit_max = 8; |
| // Clamp of output value lower bound. |
| double output_limit_min = 9; |
| // Refernece power is the nominal workload power. This variable acts as a |
| // setpoint or baseline offset for the disturbance input in the feedforward |
| // controller equation. It ensures the DFF controller only reacts to the |
| // change in power relative to that baseline, not the absolute power value |
| // itself. |
| double reference_power = 10; |
| // Negative slew rate. It has to be less than -1.0 to be significant. |
| double slew_neg = 11 [default = 0]; |
| // Positive slew rate. It has to be greater than 1.0 to be significant. |
| double slew_pos = 12 [default = 0]; |
| } |
| |
| // The config of DFF thermal controllers. |
| message DffControllerConfig { |
| // The ID of the DFF controller. |
| string id = 1; |
| // The config of the DFF loop. |
| DffLoopConfig dff_loop_config = 2; |
| // The ID of the owner zone manager. |
| repeated int32 zone_manager_id = 3; |
| repeated string input_sensors = 4; |
| // The IDs of the controllers affected by this DFF controller. |
| repeated string affected_controller_ids = 5; |
| } |
| |
| // The config of Entering Air Temperature (EAT) thermal loops. |
| message EatLoopConfig { |
| // Negative slew rate. -1 by default. |
| double slew_neg = 1 [default = -1]; |
| // Positive slew rate. 1 by default. |
| double slew_pos = 2 [default = 1]; |
| // The max EAT output limit (i.e., max setpoint offset). |
| double output_limit_max = 3; |
| // The min EAT output limit (i.e., min setpoint offset). |
| double output_limit_min = 4; |
| // Calculation interval in hours. 24 by default. |
| uint32 calculation_interval_hour = 5 [default = 24]; |
| // Reference entering air temperature. |
| double reference_eat = 6; |
| } |
| |
| // The config of EAT thermal controllers. |
| message EatControllerConfig { |
| // The ID of the EAT controller. |
| string id = 1; |
| // The config of the EAT loop. |
| EatLoopConfig eat_loop_config = 2; |
| // The ID of the owner zone manager. |
| repeated int32 zone_manager_id = 3; |
| repeated string input_sensors = 4; |
| // The IDs of thermal zones affected by this EAT controller. |
| repeated int32 affected_zone_ids = 5; |
| } |
| |
| // The config of zone managers that does not maniopulate hardware directly. |
| // Such a zone manager is usually used for processing supportive thermal |
| // loops that does not contribute directly to the fan speed output (e.g., EAT). |
| message SupportiveZoneManagerConfig { |
| int32 id = 1; |
| ThermalDebugModeConfig debug_mode = 2; |
| // The time interval in milliseconds between two thermal cycles. |
| uint64 ms_per_thermal_cycle = 3; |
| repeated ZoneManagerSensorInfo input_sensors = 4; |
| } |
| |
| message FailsafeLoggerConfig { |
| // The maximum number of failsafe logs to be output per zone within 1 second. |
| uint32 failsafe_log_limit_per_second = 7; |
| } |
| |
| message ZoneManagerConfigs { |
| repeated ZoneManagerConfig zone_manager_configs = 1; |
| } |
| |
| message SupportiveZoneManagerConfigs { |
| repeated SupportiveZoneManagerConfig supportive_zone_manager_configs = 1; |
| } |
| |
| message PidControllerConfigs { |
| repeated PidControllerConfig pid_controller_configs = 1; |
| } |
| |
| message StepwiseControllerConfigs { |
| repeated StepwiseControllerConfig stepwise_controller_configs = 1; |
| } |
| |
| message FanPidControllerConfigs { |
| repeated FanPidControllerConfig fan_pid_controller_configs = 1; |
| } |
| |
| message DffControllerConfigs { |
| repeated DffControllerConfig dff_controller_configs = 1; |
| } |
| |
| message EatControllerConfigs { |
| repeated EatControllerConfig eat_controller_configs = 1; |
| } |
| |
| message ThermalConfigs { |
| bool tuning_enabled = 9 [default = false]; |
| ZoneManagerConfigs zones = 1; |
| SupportiveZoneManagerConfigs supportive_zones = 8; |
| |
| PidControllerConfigs pid_controllers = 2; |
| StepwiseControllerConfigs stepwise_controllers = 3; |
| FanPidControllerConfigs fan_pid_controllers = 4; |
| DffControllerConfigs dff_controllers = 5; |
| EatControllerConfigs eat_controllers = 7; |
| |
| FailsafeLoggerConfig failsafe_logger_config = 6; |
| |
| string sample_data_file_path = 10 [default = "/tmp/tlbmc_thermal_data.txt"]; |
| } |