blob: e3d84030ce0c781bb5a04ceee0f80ea7fdf7cce3 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.hardware.thermal;
using zx;
/// The maximum number of trip points that can be used.
const uint32 MAX_TRIP_POINTS = 16;
/// The maximum number of DVFS domains a device can support (one for each cluster in a big-little
/// architecture).
const uint32 MAX_DVFS_DOMAINS = 2;
/// The maximum number of operating points that can be used.
const uint32 MAX_DVFS_OPPS = 16;
/// Bitmask values for ThermalInfo.state.
const uint32 THERMAL_STATE_NORMAL = 0;
const uint32 THERMAL_STATE_TRIP_VIOLATION = 1;
/// Devices with big-little architecture may have different operating points for each cluster.
/// Other devices use BIG_CLUSTER_POWER_DOMAIN for getting/setting the operating point.
enum PowerDomain : uint32 {
BIG_CLUSTER_POWER_DOMAIN = 0;
LITTLE_CLUSTER_POWER_DOMAIN = 1;
};
/// scpi_opp_t is typedef'd to this.
struct OperatingPoint {
/// The device's operating points.
array<OperatingPointEntry>:MAX_DVFS_OPPS opp;
/// In microseconds.
uint32 latency;
/// The number of operating points in opp.
uint32 count;
};
/// scpi_opp_entry_t is typedef'd to this.
struct OperatingPointEntry {
/// The operating point frequency in Hz.
uint32 freq_hz;
/// The operating point voltage in millivolts.
uint32 volt_mv;
};
/// Temperature units are in 10th of a degree Kelvin.
struct ThermalInfo {
/// State is a bitmask of THERMAL_STATE_* values.
uint32 state;
/// The sensor temperature at which the system should activate passive cooling policy.
uint32 passive_temp;
/// The sensor temperature at which the system should perform critical shutdown.
uint32 critical_temp;
/// The number of trip points supported.
uint32 max_trip_count;
/// The currently active trip point.
array<uint32>:MAX_TRIP_POINTS active_trip;
};
struct ThermalTemperatureInfo {
/// The temperature must rise to up_temp to get to this trip point.
uint32 up_temp;
/// The temperature must fall to down_temp to get to this trip point.
uint32 down_temp;
/// The fan level for this trip point.
int32 fan_level;
/// The operating point index of the big cluster.
int32 big_cluster_dvfs_opp;
/// The operating point index of the little cluster.
int32 little_cluster_dvfs_opp;
/// The GPU clock source index.
int32 gpu_clk_freq_source;
};
struct ThermalDeviceInfo {
/// Active cooling support.
bool active_cooling;
/// Passive cooling support.
bool passive_cooling;
/// GPU throttling support.
bool gpu_throttling;
/// Number of trip points.
uint32 num_trip_points;
/// Big-little architecture.
bool big_little;
/// Critical temperature.
uint32 critical_temp;
/// Trip point information.
array<ThermalTemperatureInfo>:MAX_TRIP_POINTS trip_point_info;
/// Operating point information.
array<OperatingPoint>:MAX_DVFS_DOMAINS opps;
};
[Layout = "Simple"]
protocol Device {
/// Get information about the device's current state.
GetInfo() -> (zx.status status, ThermalInfo info);
/// Get information about the device's thermal capabilities and trip points.
GetDeviceInfo() -> (zx.status status, ThermalDeviceInfo info);
/// Get the device's operating points.
/// TODO(bradenkell): Can this be removed? GetDeviceInfo() provides the same information.
GetDvfsInfo(PowerDomain power_domain) -> (zx.status status, OperatingPoint info);
/// Get the current temperature.
GetTemperature() -> (zx.status status, uint32 temp);
/// Get an event to get trip point notifications on. ZX_USER_SIGNAL_0 is changed when either
/// trip point is reached. It is deasserted when the state is read via GetInfo.
GetStateChangeEvent() -> (zx.status status, handle<event>? handle);
/// Get a port to get trip point notification packets.
GetStateChangePort() -> (zx.status status, handle<port>? handle);
/// Sets a trip point. When the sensor reaches the trip point temperature the device will notify
/// on an event.
SetTrip(uint32 id, uint32 temp) -> (zx.status status);
/// Get the current operating point index.
GetDvfsOperatingPoint(PowerDomain power_domain) -> (zx.status status, uint16 op_idx);
/// Set the operating point index.
SetDvfsOperatingPoint(uint16 op_idx, PowerDomain power_domain) -> (zx.status status);
/// Get the current fan level.
GetFanLevel() -> (zx.status status, uint32 fan_level);
/// Set the fan level.
SetFanLevel(uint32 fan_level) -> (zx.status status);
};