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