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