1 #ifndef __NVKM_THERM_H__ 2 #define __NVKM_THERM_H__ 3 #include <core/subdev.h> 4 5 #include <subdev/bios.h> 6 #include <subdev/bios/therm.h> 7 #include <subdev/timer.h> 8 9 enum nvkm_therm_thrs_direction { 10 NVKM_THERM_THRS_FALLING = 0, 11 NVKM_THERM_THRS_RISING = 1 12 }; 13 14 enum nvkm_therm_thrs_state { 15 NVKM_THERM_THRS_LOWER = 0, 16 NVKM_THERM_THRS_HIGHER = 1 17 }; 18 19 enum nvkm_therm_thrs { 20 NVKM_THERM_THRS_FANBOOST = 0, 21 NVKM_THERM_THRS_DOWNCLOCK = 1, 22 NVKM_THERM_THRS_CRITICAL = 2, 23 NVKM_THERM_THRS_SHUTDOWN = 3, 24 NVKM_THERM_THRS_NR 25 }; 26 27 enum nvkm_therm_fan_mode { 28 NVKM_THERM_CTRL_NONE = 0, 29 NVKM_THERM_CTRL_MANUAL = 1, 30 NVKM_THERM_CTRL_AUTO = 2, 31 }; 32 33 enum nvkm_therm_attr_type { 34 NVKM_THERM_ATTR_FAN_MIN_DUTY = 0, 35 NVKM_THERM_ATTR_FAN_MAX_DUTY = 1, 36 NVKM_THERM_ATTR_FAN_MODE = 2, 37 38 NVKM_THERM_ATTR_THRS_FAN_BOOST = 10, 39 NVKM_THERM_ATTR_THRS_FAN_BOOST_HYST = 11, 40 NVKM_THERM_ATTR_THRS_DOWN_CLK = 12, 41 NVKM_THERM_ATTR_THRS_DOWN_CLK_HYST = 13, 42 NVKM_THERM_ATTR_THRS_CRITICAL = 14, 43 NVKM_THERM_ATTR_THRS_CRITICAL_HYST = 15, 44 NVKM_THERM_ATTR_THRS_SHUTDOWN = 16, 45 NVKM_THERM_ATTR_THRS_SHUTDOWN_HYST = 17, 46 }; 47 48 struct nvkm_therm { 49 const struct nvkm_therm_func *func; 50 struct nvkm_subdev subdev; 51 52 /* automatic thermal management */ 53 struct nvkm_alarm alarm; 54 spinlock_t lock; 55 struct nvbios_therm_trip_point *last_trip; 56 int mode; 57 int cstate; 58 int suspend; 59 60 /* bios */ 61 struct nvbios_therm_sensor bios_sensor; 62 63 /* fan priv */ 64 struct nvkm_fan *fan; 65 66 /* alarms priv */ 67 struct { 68 spinlock_t alarm_program_lock; 69 struct nvkm_alarm therm_poll_alarm; 70 enum nvkm_therm_thrs_state alarm_state[NVKM_THERM_THRS_NR]; 71 } sensor; 72 73 /* what should be done if the card overheats */ 74 struct { 75 void (*downclock)(struct nvkm_therm *, bool active); 76 void (*pause)(struct nvkm_therm *, bool active); 77 } emergency; 78 79 /* ic */ 80 struct i2c_client *ic; 81 82 int (*fan_get)(struct nvkm_therm *); 83 int (*fan_set)(struct nvkm_therm *, int); 84 85 int (*attr_get)(struct nvkm_therm *, enum nvkm_therm_attr_type); 86 int (*attr_set)(struct nvkm_therm *, enum nvkm_therm_attr_type, int); 87 }; 88 89 int nvkm_therm_temp_get(struct nvkm_therm *); 90 int nvkm_therm_fan_sense(struct nvkm_therm *); 91 int nvkm_therm_cstate(struct nvkm_therm *, int, int); 92 93 int nv40_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 94 int nv50_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 95 int g84_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 96 int gt215_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 97 int gf119_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 98 int gm107_therm_new(struct nvkm_device *, int, struct nvkm_therm **); 99 #endif 100