1// Copyright 2017 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <zircon/device/ioctl.h> 8#include <zircon/device/ioctl-wrapper.h> 9#include <ddk/metadata.h> 10#include <ddk/protocol/scpi.h> 11 12// Unique numbers to represent correct metadata. 13// 0x564f4c00 is the string representation of VOL. 14#define VOLTAGE_DUTY_CYCLE_METADATA (0x564f4c00 | DEVICE_METADATA_PRIVATE) 15 16// 0x54485200 is the string representation of THR. 17#define THERMAL_CONFIG_METADATA (0x54485200 | DEVICE_METADATA_PRIVATE) 18 19#define MAX_TRIP_POINTS 16 20#define MAX_DVFS_DOMAINS 2 21#define MAX_VOLTAGE_TABLE 31 22// temperature units are in 10th of a degree kelvin 23typedef struct { 24 // state is a bitmask 25 uint32_t state; 26 // trip points for below states are defined below 27#define THERMAL_STATE_NORMAL 0 28#define THERMAL_STATE_TRIP_VIOLATION 1 29#define BIG_CLUSTER_POWER_DOMAIN 0 30#define LITTLE_CLUSTER_POWER_DOMAIN 1 31 32 // the sensor temperature at which the system should activate 33 // passive cooling policy 34 uint32_t passive_temp; 35 36 // the sensor temperature at which the system should perform 37 // critical shutdown 38 uint32_t critical_temp; 39 40 // number of trip points supported 41 uint32_t max_trip_count; 42 43 // the currently active trip point 44 uint32_t active_trip[9]; 45} thermal_info_t; 46 47typedef struct { 48 uint32_t up_temp; 49 uint32_t down_temp; 50 int32_t fan_level; 51 int32_t big_cluster_dvfs_opp; 52 int32_t little_cluster_dvfs_opp; 53 int32_t gpu_clk_freq_source; 54} thermal_temperature_info_t; 55 56typedef struct { 57 // active cooling support 58 bool active_cooling; 59 60 // passive cooling support 61 bool passive_cooling; 62 63 // gpu throttling support 64 bool gpu_throttling; 65 66 // number of trip points 67 uint32_t num_trip_points; 68 69 // big-little architecture 70 bool big_little; 71 72 // critical temperature 73 uint32_t critical_temp; 74 75 // trip point information 76 thermal_temperature_info_t trip_point_info[MAX_TRIP_POINTS]; 77 78 // opps information 79 scpi_opp_t opps[MAX_DVFS_DOMAINS]; 80} thermal_device_info_t; 81 82typedef struct { 83 uint32_t id; 84 uint32_t temp; 85} trip_point_t; 86 87typedef struct { 88 uint16_t op_idx; 89 uint32_t power_domain; 90} dvfs_info_t; 91 92typedef struct { 93 uint32_t microvolt; 94 uint32_t duty_cycle; 95} voltage_table_t; 96 97typedef struct { 98 scpi_opp_entry_t opps[MAX_TRIP_POINTS]; 99 voltage_table_t voltage_table[MAX_VOLTAGE_TABLE]; 100} opp_info_t; 101 102// Get thermal info 103#define IOCTL_THERMAL_GET_INFO \ 104 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 1) 105 106// Sets a trip point. When the sensor reaches the trip point temperature 107// the device will notify on an event. 108#define IOCTL_THERMAL_SET_TRIP \ 109 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 2) 110 111// Get an event to get trip point notifications on. ZX_USER_SIGNAL_0 is changed 112// when either trip point is reached. It is deasserted when the state is read 113// via IOCTL_THERMAL_GET_INFO. 114#define IOCTL_THERMAL_GET_STATE_CHANGE_EVENT \ 115 IOCTL(IOCTL_KIND_GET_HANDLE, IOCTL_FAMILY_THERMAL, 3) 116 117// Get a port to get trip point notification packets. 118#define IOCTL_THERMAL_GET_STATE_CHANGE_PORT \ 119 IOCTL(IOCTL_KIND_GET_HANDLE, IOCTL_FAMILY_THERMAL, 4) 120 121#define IOCTL_THERMAL_GET_DEVICE_INFO \ 122 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 5) 123 124#define IOCTL_THERMAL_SET_FAN_LEVEL \ 125 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 6) 126 127#define IOCTL_THERMAL_SET_DVFS_OPP \ 128 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 7) 129 130#define IOCTL_THERMAL_GET_TEMPERATURE \ 131 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 8) 132 133#define IOCTL_THERMAL_GET_DVFS_INFO \ 134 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 9) 135 136#define IOCTL_THERMAL_GET_DVFS_OPP \ 137 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 10) 138 139#define IOCTL_THERMAL_GET_FAN_LEVEL \ 140 IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_THERMAL, 11) 141 142// ssize_t ioctl_thermal_get_info(int fd, thermal_info_t* out) 143IOCTL_WRAPPER_OUT(ioctl_thermal_get_info, IOCTL_THERMAL_GET_INFO, thermal_info_t); 144 145// ssize_t ioctl_thermal_set_trip(int fd, uint32_t temp) 146IOCTL_WRAPPER_IN(ioctl_thermal_set_trip, IOCTL_THERMAL_SET_TRIP, trip_point_t); 147 148// ssize_t ioctl_thermal_get_state_change_event(int fd, zx_handle_t* out) 149IOCTL_WRAPPER_OUT(ioctl_thermal_get_state_change_event, 150 IOCTL_THERMAL_GET_STATE_CHANGE_EVENT, 151 zx_handle_t); 152 153// ssize_t ioctl_thermal_get_state_change_port(int fd, zx_handle_t* out) 154IOCTL_WRAPPER_OUT(ioctl_thermal_get_state_change_port, 155 IOCTL_THERMAL_GET_STATE_CHANGE_PORT, 156 zx_handle_t); 157 158// ssize_t ioctl_thermal_get_device_info(int fd, thermal_info_t* out) 159IOCTL_WRAPPER_OUT(ioctl_thermal_get_device_info, 160 IOCTL_THERMAL_GET_DEVICE_INFO, thermal_device_info_t); 161 162// ssize_t ioctl_thermal_set_fan_level(int fd, uint32_t fan_level) 163IOCTL_WRAPPER_IN(ioctl_thermal_set_fan_level, IOCTL_THERMAL_SET_FAN_LEVEL, uint32_t); 164 165// ssize_t ioctl_thermal_set_dvfs_opp(int fd, dvfs_info_t* info) 166IOCTL_WRAPPER_IN(ioctl_thermal_set_dvfs_opp, 167 IOCTL_THERMAL_SET_DVFS_OPP, dvfs_info_t); 168 169// ssize_t ioctl_thermal_get_temperature(int fd, uint32_t* temp) 170IOCTL_WRAPPER_OUT(ioctl_thermal_get_temperature, IOCTL_THERMAL_GET_TEMPERATURE, uint32_t); 171 172// ssize_t ioctl_thermal_get_dvfs_info(int fd, uint32_t* power_domain, scpi_opp_t* opp) 173IOCTL_WRAPPER_INOUT(ioctl_thermal_get_dvfs_info, IOCTL_THERMAL_GET_DVFS_INFO, 174 uint32_t, scpi_opp_t); 175 176// ssize_t ioctl_thermal_get_dvfs_opp(int fd, uint32_t* power_domain, uint32_t* opp) 177IOCTL_WRAPPER_INOUT(ioctl_thermal_get_dvfs_opp, IOCTL_THERMAL_GET_DVFS_OPP, 178 uint32_t, uint32_t); 179 180// ssize_t ioctl_thermal_get_fan_level(int fd, uint32_t* fan_level) 181IOCTL_WRAPPER_OUT(ioctl_thermal_get_fan_level, IOCTL_THERMAL_GET_FAN_LEVEL, uint32_t); 182 183 184