120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: MIT */
 | 
						|
#ifndef __NVKM_THERM_H__
 | 
						|
#define __NVKM_THERM_H__
 | 
						|
#include <core/subdev.h>
 | 
						|
 | 
						|
#include <subdev/bios.h>
 | 
						|
#include <subdev/bios/therm.h>
 | 
						|
#include <subdev/timer.h>
 | 
						|
 | 
						|
enum nvkm_therm_thrs_direction {
 | 
						|
	NVKM_THERM_THRS_FALLING = 0,
 | 
						|
	NVKM_THERM_THRS_RISING = 1
 | 
						|
};
 | 
						|
 | 
						|
enum nvkm_therm_thrs_state {
 | 
						|
	NVKM_THERM_THRS_LOWER = 0,
 | 
						|
	NVKM_THERM_THRS_HIGHER = 1
 | 
						|
};
 | 
						|
 | 
						|
enum nvkm_therm_thrs {
 | 
						|
	NVKM_THERM_THRS_FANBOOST = 0,
 | 
						|
	NVKM_THERM_THRS_DOWNCLOCK = 1,
 | 
						|
	NVKM_THERM_THRS_CRITICAL = 2,
 | 
						|
	NVKM_THERM_THRS_SHUTDOWN = 3,
 | 
						|
	NVKM_THERM_THRS_NR
 | 
						|
};
 | 
						|
 | 
						|
enum nvkm_therm_fan_mode {
 | 
						|
	NVKM_THERM_CTRL_NONE = 0,
 | 
						|
	NVKM_THERM_CTRL_MANUAL = 1,
 | 
						|
	NVKM_THERM_CTRL_AUTO = 2,
 | 
						|
};
 | 
						|
 | 
						|
enum nvkm_therm_attr_type {
 | 
						|
	NVKM_THERM_ATTR_FAN_MIN_DUTY = 0,
 | 
						|
	NVKM_THERM_ATTR_FAN_MAX_DUTY = 1,
 | 
						|
	NVKM_THERM_ATTR_FAN_MODE = 2,
 | 
						|
 | 
						|
	NVKM_THERM_ATTR_THRS_FAN_BOOST = 10,
 | 
						|
	NVKM_THERM_ATTR_THRS_FAN_BOOST_HYST = 11,
 | 
						|
	NVKM_THERM_ATTR_THRS_DOWN_CLK = 12,
 | 
						|
	NVKM_THERM_ATTR_THRS_DOWN_CLK_HYST = 13,
 | 
						|
	NVKM_THERM_ATTR_THRS_CRITICAL = 14,
 | 
						|
	NVKM_THERM_ATTR_THRS_CRITICAL_HYST = 15,
 | 
						|
	NVKM_THERM_ATTR_THRS_SHUTDOWN = 16,
 | 
						|
	NVKM_THERM_ATTR_THRS_SHUTDOWN_HYST = 17,
 | 
						|
};
 | 
						|
 | 
						|
struct nvkm_therm_clkgate_init {
 | 
						|
	u32 addr;
 | 
						|
	u8  count;
 | 
						|
	u32 data;
 | 
						|
};
 | 
						|
 | 
						|
struct nvkm_therm_clkgate_pack {
 | 
						|
	const struct nvkm_therm_clkgate_init *init;
 | 
						|
};
 | 
						|
 | 
						|
struct nvkm_therm {
 | 
						|
	const struct nvkm_therm_func *func;
 | 
						|
	struct nvkm_subdev subdev;
 | 
						|
 | 
						|
	/* automatic thermal management */
 | 
						|
	struct nvkm_alarm alarm;
 | 
						|
	spinlock_t lock;
 | 
						|
	struct nvbios_therm_trip_point *last_trip;
 | 
						|
	int mode;
 | 
						|
	int cstate;
 | 
						|
	int suspend;
 | 
						|
 | 
						|
	/* bios */
 | 
						|
	struct nvbios_therm_sensor bios_sensor;
 | 
						|
 | 
						|
	/* fan priv */
 | 
						|
	struct nvkm_fan *fan;
 | 
						|
 | 
						|
	/* alarms priv */
 | 
						|
	struct {
 | 
						|
		spinlock_t alarm_program_lock;
 | 
						|
		struct nvkm_alarm therm_poll_alarm;
 | 
						|
		enum nvkm_therm_thrs_state alarm_state[NVKM_THERM_THRS_NR];
 | 
						|
	} sensor;
 | 
						|
 | 
						|
	/* what should be done if the card overheats */
 | 
						|
	struct {
 | 
						|
		void (*downclock)(struct nvkm_therm *, bool active);
 | 
						|
		void (*pause)(struct nvkm_therm *, bool active);
 | 
						|
	} emergency;
 | 
						|
 | 
						|
	/* ic */
 | 
						|
	struct i2c_client *ic;
 | 
						|
 | 
						|
	int (*fan_get)(struct nvkm_therm *);
 | 
						|
	int (*fan_set)(struct nvkm_therm *, int);
 | 
						|
 | 
						|
	int (*attr_get)(struct nvkm_therm *, enum nvkm_therm_attr_type);
 | 
						|
	int (*attr_set)(struct nvkm_therm *, enum nvkm_therm_attr_type, int);
 | 
						|
 | 
						|
	bool clkgating_enabled;
 | 
						|
};
 | 
						|
 | 
						|
int nvkm_therm_temp_get(struct nvkm_therm *);
 | 
						|
int nvkm_therm_fan_sense(struct nvkm_therm *);
 | 
						|
int nvkm_therm_cstate(struct nvkm_therm *, int, int);
 | 
						|
void nvkm_therm_clkgate_init(struct nvkm_therm *,
 | 
						|
			     const struct nvkm_therm_clkgate_pack *);
 | 
						|
void nvkm_therm_clkgate_enable(struct nvkm_therm *);
 | 
						|
void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool);
 | 
						|
 | 
						|
int nv40_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int nv50_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int g84_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gt215_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gf119_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gk104_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gm107_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gm200_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
int gp100_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
 | 
						|
#endif
 |