1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */ 2e1404611SBen Skeggs #ifndef __NVKM_THERM_H__ 3e1404611SBen Skeggs #define __NVKM_THERM_H__ 4c39f472eSBen Skeggs #include <core/subdev.h> 5c39f472eSBen Skeggs 657113c01SBen Skeggs #include <subdev/bios.h> 757113c01SBen Skeggs #include <subdev/bios/therm.h> 857113c01SBen Skeggs #include <subdev/timer.h> 957113c01SBen Skeggs 1057113c01SBen Skeggs enum nvkm_therm_thrs_direction { 1157113c01SBen Skeggs NVKM_THERM_THRS_FALLING = 0, 1257113c01SBen Skeggs NVKM_THERM_THRS_RISING = 1 1357113c01SBen Skeggs }; 1457113c01SBen Skeggs 1557113c01SBen Skeggs enum nvkm_therm_thrs_state { 1657113c01SBen Skeggs NVKM_THERM_THRS_LOWER = 0, 1757113c01SBen Skeggs NVKM_THERM_THRS_HIGHER = 1 1857113c01SBen Skeggs }; 1957113c01SBen Skeggs 2057113c01SBen Skeggs enum nvkm_therm_thrs { 2157113c01SBen Skeggs NVKM_THERM_THRS_FANBOOST = 0, 2257113c01SBen Skeggs NVKM_THERM_THRS_DOWNCLOCK = 1, 2357113c01SBen Skeggs NVKM_THERM_THRS_CRITICAL = 2, 2457113c01SBen Skeggs NVKM_THERM_THRS_SHUTDOWN = 3, 2557113c01SBen Skeggs NVKM_THERM_THRS_NR 2657113c01SBen Skeggs }; 2757113c01SBen Skeggs 28e1404611SBen Skeggs enum nvkm_therm_fan_mode { 29e1404611SBen Skeggs NVKM_THERM_CTRL_NONE = 0, 30e1404611SBen Skeggs NVKM_THERM_CTRL_MANUAL = 1, 31e1404611SBen Skeggs NVKM_THERM_CTRL_AUTO = 2, 32c39f472eSBen Skeggs }; 33c39f472eSBen Skeggs 34e1404611SBen Skeggs enum nvkm_therm_attr_type { 35e1404611SBen Skeggs NVKM_THERM_ATTR_FAN_MIN_DUTY = 0, 36e1404611SBen Skeggs NVKM_THERM_ATTR_FAN_MAX_DUTY = 1, 37e1404611SBen Skeggs NVKM_THERM_ATTR_FAN_MODE = 2, 38c39f472eSBen Skeggs 39e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_FAN_BOOST = 10, 40e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_FAN_BOOST_HYST = 11, 41e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_DOWN_CLK = 12, 42e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_DOWN_CLK_HYST = 13, 43e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_CRITICAL = 14, 44e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_CRITICAL_HYST = 15, 45e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_SHUTDOWN = 16, 46e1404611SBen Skeggs NVKM_THERM_ATTR_THRS_SHUTDOWN_HYST = 17, 47c39f472eSBen Skeggs }; 48c39f472eSBen Skeggs 491bab09acSLyude Paul struct nvkm_therm_clkgate_init { 501bab09acSLyude Paul u32 addr; 511bab09acSLyude Paul u8 count; 521bab09acSLyude Paul u32 data; 531bab09acSLyude Paul }; 541bab09acSLyude Paul 551bab09acSLyude Paul struct nvkm_therm_clkgate_pack { 561bab09acSLyude Paul const struct nvkm_therm_clkgate_init *init; 571bab09acSLyude Paul }; 581bab09acSLyude Paul 59e1404611SBen Skeggs struct nvkm_therm { 6057113c01SBen Skeggs const struct nvkm_therm_func *func; 61da06b46bSBen Skeggs struct nvkm_subdev subdev; 62c39f472eSBen Skeggs 6357113c01SBen Skeggs /* automatic thermal management */ 6457113c01SBen Skeggs struct nvkm_alarm alarm; 6557113c01SBen Skeggs spinlock_t lock; 6657113c01SBen Skeggs struct nvbios_therm_trip_point *last_trip; 6757113c01SBen Skeggs int mode; 6857113c01SBen Skeggs int cstate; 6957113c01SBen Skeggs int suspend; 7057113c01SBen Skeggs 7157113c01SBen Skeggs /* bios */ 7257113c01SBen Skeggs struct nvbios_therm_sensor bios_sensor; 7357113c01SBen Skeggs 7457113c01SBen Skeggs /* fan priv */ 7557113c01SBen Skeggs struct nvkm_fan *fan; 7657113c01SBen Skeggs 7757113c01SBen Skeggs /* alarms priv */ 7857113c01SBen Skeggs struct { 7957113c01SBen Skeggs spinlock_t alarm_program_lock; 8057113c01SBen Skeggs struct nvkm_alarm therm_poll_alarm; 8157113c01SBen Skeggs enum nvkm_therm_thrs_state alarm_state[NVKM_THERM_THRS_NR]; 8257113c01SBen Skeggs } sensor; 8357113c01SBen Skeggs 8457113c01SBen Skeggs /* what should be done if the card overheats */ 8557113c01SBen Skeggs struct { 8657113c01SBen Skeggs void (*downclock)(struct nvkm_therm *, bool active); 8757113c01SBen Skeggs void (*pause)(struct nvkm_therm *, bool active); 8857113c01SBen Skeggs } emergency; 8957113c01SBen Skeggs 9057113c01SBen Skeggs /* ic */ 9157113c01SBen Skeggs struct i2c_client *ic; 92c39f472eSBen Skeggs 93e1404611SBen Skeggs int (*fan_get)(struct nvkm_therm *); 94e1404611SBen Skeggs int (*fan_set)(struct nvkm_therm *, int); 95c39f472eSBen Skeggs 96e1404611SBen Skeggs int (*attr_get)(struct nvkm_therm *, enum nvkm_therm_attr_type); 97e1404611SBen Skeggs int (*attr_set)(struct nvkm_therm *, enum nvkm_therm_attr_type, int); 98b138eca6SLyude Paul 99b138eca6SLyude Paul bool clkgating_enabled; 100c39f472eSBen Skeggs }; 101c39f472eSBen Skeggs 10257113c01SBen Skeggs int nvkm_therm_temp_get(struct nvkm_therm *); 10357113c01SBen Skeggs int nvkm_therm_fan_sense(struct nvkm_therm *); 104e1404611SBen Skeggs int nvkm_therm_cstate(struct nvkm_therm *, int, int); 1051bab09acSLyude Paul void nvkm_therm_clkgate_init(struct nvkm_therm *, 1061bab09acSLyude Paul const struct nvkm_therm_clkgate_pack *); 107b138eca6SLyude Paul void nvkm_therm_clkgate_enable(struct nvkm_therm *); 108b138eca6SLyude Paul void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool); 109c39f472eSBen Skeggs 110*0aec69c7SBen Skeggs int nv40_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 111*0aec69c7SBen Skeggs int nv50_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 112*0aec69c7SBen Skeggs int g84_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 113*0aec69c7SBen Skeggs int gt215_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 114*0aec69c7SBen Skeggs int gf119_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 115*0aec69c7SBen Skeggs int gk104_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 116*0aec69c7SBen Skeggs int gm107_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 117*0aec69c7SBen Skeggs int gm200_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 118*0aec69c7SBen Skeggs int gp100_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **); 119c39f472eSBen Skeggs #endif 120