xref: /openbmc/linux/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
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