1c39f472eSBen Skeggs #ifndef __NVTHERM_PRIV_H__
2c39f472eSBen Skeggs #define __NVTHERM_PRIV_H__
357113c01SBen Skeggs #define nvkm_therm(p) container_of((p), struct nvkm_therm, subdev)
4c39f472eSBen Skeggs /*
5c39f472eSBen Skeggs  * Copyright 2012 The Nouveau community
6c39f472eSBen Skeggs  *
7c39f472eSBen Skeggs  * Permission is hereby granted, free of charge, to any person obtaining a
8c39f472eSBen Skeggs  * copy of this software and associated documentation files (the "Software"),
9c39f472eSBen Skeggs  * to deal in the Software without restriction, including without limitation
10c39f472eSBen Skeggs  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11c39f472eSBen Skeggs  * and/or sell copies of the Software, and to permit persons to whom the
12c39f472eSBen Skeggs  * Software is furnished to do so, subject to the following conditions:
13c39f472eSBen Skeggs  *
14c39f472eSBen Skeggs  * The above copyright notice and this permission notice shall be included in
15c39f472eSBen Skeggs  * all copies or substantial portions of the Software.
16c39f472eSBen Skeggs  *
17c39f472eSBen Skeggs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18c39f472eSBen Skeggs  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19c39f472eSBen Skeggs  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20c39f472eSBen Skeggs  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
21c39f472eSBen Skeggs  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22c39f472eSBen Skeggs  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23c39f472eSBen Skeggs  * OTHER DEALINGS IN THE SOFTWARE.
24c39f472eSBen Skeggs  *
25c39f472eSBen Skeggs  * Authors: Martin Peres
26c39f472eSBen Skeggs  */
27c39f472eSBen Skeggs #include <subdev/therm.h>
28d390b480SBen Skeggs #include <subdev/bios.h>
29c39f472eSBen Skeggs #include <subdev/bios/extdev.h>
30c39f472eSBen Skeggs #include <subdev/bios/gpio.h>
31c39f472eSBen Skeggs #include <subdev/bios/perf.h>
3257113c01SBen Skeggs 
33*0aec69c7SBen Skeggs int nvkm_therm_new_(const struct nvkm_therm_func *, struct nvkm_device *, enum nvkm_subdev_type,
34*0aec69c7SBen Skeggs 		    int, struct nvkm_therm **);
35*0aec69c7SBen Skeggs void nvkm_therm_ctor(struct nvkm_therm *, struct nvkm_device *, enum nvkm_subdev_type, int,
36*0aec69c7SBen Skeggs 		     const struct nvkm_therm_func *);
37c39f472eSBen Skeggs 
38e1404611SBen Skeggs struct nvkm_fan {
39e1404611SBen Skeggs 	struct nvkm_therm *parent;
40c39f472eSBen Skeggs 	const char *type;
41c39f472eSBen Skeggs 
42c39f472eSBen Skeggs 	struct nvbios_therm_fan bios;
43c39f472eSBen Skeggs 	struct nvbios_perf_fan perf;
44c39f472eSBen Skeggs 
45e1404611SBen Skeggs 	struct nvkm_alarm alarm;
46c39f472eSBen Skeggs 	spinlock_t lock;
47c39f472eSBen Skeggs 	int percent;
48c39f472eSBen Skeggs 
49e1404611SBen Skeggs 	int (*get)(struct nvkm_therm *);
50e1404611SBen Skeggs 	int (*set)(struct nvkm_therm *, int percent);
51c39f472eSBen Skeggs 
52c39f472eSBen Skeggs 	struct dcb_gpio_func tach;
53c39f472eSBen Skeggs };
54c39f472eSBen Skeggs 
55e1404611SBen Skeggs int nvkm_therm_fan_mode(struct nvkm_therm *, int mode);
56e1404611SBen Skeggs int nvkm_therm_attr_get(struct nvkm_therm *, enum nvkm_therm_attr_type);
57e1404611SBen Skeggs int nvkm_therm_attr_set(struct nvkm_therm *, enum nvkm_therm_attr_type, int);
58c39f472eSBen Skeggs 
59e1404611SBen Skeggs void nvkm_therm_ic_ctor(struct nvkm_therm *);
60c39f472eSBen Skeggs 
61e1404611SBen Skeggs int nvkm_therm_sensor_ctor(struct nvkm_therm *);
62c39f472eSBen Skeggs 
63e1404611SBen Skeggs int nvkm_therm_fan_ctor(struct nvkm_therm *);
64e1404611SBen Skeggs int nvkm_therm_fan_init(struct nvkm_therm *);
65e1404611SBen Skeggs int nvkm_therm_fan_fini(struct nvkm_therm *, bool suspend);
66e1404611SBen Skeggs int nvkm_therm_fan_get(struct nvkm_therm *);
67e1404611SBen Skeggs int nvkm_therm_fan_set(struct nvkm_therm *, bool now, int percent);
68e1404611SBen Skeggs int nvkm_therm_fan_user_get(struct nvkm_therm *);
69e1404611SBen Skeggs int nvkm_therm_fan_user_set(struct nvkm_therm *, int percent);
70c39f472eSBen Skeggs 
71e1404611SBen Skeggs int  nvkm_therm_sensor_init(struct nvkm_therm *);
72e1404611SBen Skeggs int  nvkm_therm_sensor_fini(struct nvkm_therm *, bool suspend);
73e1404611SBen Skeggs void nvkm_therm_sensor_preinit(struct nvkm_therm *);
74e1404611SBen Skeggs void nvkm_therm_sensor_set_threshold_state(struct nvkm_therm *,
75e1404611SBen Skeggs 					   enum nvkm_therm_thrs,
76e1404611SBen Skeggs 					   enum nvkm_therm_thrs_state);
77e1404611SBen Skeggs enum nvkm_therm_thrs_state
78e1404611SBen Skeggs nvkm_therm_sensor_get_threshold_state(struct nvkm_therm *,
79e1404611SBen Skeggs 				      enum nvkm_therm_thrs);
80e1404611SBen Skeggs void nvkm_therm_sensor_event(struct nvkm_therm *, enum nvkm_therm_thrs,
81e1404611SBen Skeggs 			     enum nvkm_therm_thrs_direction);
82e1404611SBen Skeggs void nvkm_therm_program_alarms_polling(struct nvkm_therm *);
83c39f472eSBen Skeggs 
8457113c01SBen Skeggs struct nvkm_therm_func {
8557113c01SBen Skeggs 	void (*init)(struct nvkm_therm *);
8657113c01SBen Skeggs 	void (*fini)(struct nvkm_therm *);
8757113c01SBen Skeggs 	void (*intr)(struct nvkm_therm *);
8857113c01SBen Skeggs 
8957113c01SBen Skeggs 	int (*pwm_ctrl)(struct nvkm_therm *, int line, bool);
9057113c01SBen Skeggs 	int (*pwm_get)(struct nvkm_therm *, int line, u32 *, u32 *);
9157113c01SBen Skeggs 	int (*pwm_set)(struct nvkm_therm *, int line, u32, u32);
9257113c01SBen Skeggs 	int (*pwm_clock)(struct nvkm_therm *, int line);
9357113c01SBen Skeggs 
9457113c01SBen Skeggs 	int (*temp_get)(struct nvkm_therm *);
9557113c01SBen Skeggs 
9657113c01SBen Skeggs 	int (*fan_sense)(struct nvkm_therm *);
9757113c01SBen Skeggs 
9857113c01SBen Skeggs 	void (*program_alarms)(struct nvkm_therm *);
99b138eca6SLyude Paul 
1001bab09acSLyude Paul 	void (*clkgate_init)(struct nvkm_therm *,
1011bab09acSLyude Paul 			     const struct nvkm_therm_clkgate_pack *);
102b138eca6SLyude Paul 	void (*clkgate_enable)(struct nvkm_therm *);
103b138eca6SLyude Paul 	void (*clkgate_fini)(struct nvkm_therm *, bool);
10457113c01SBen Skeggs };
10557113c01SBen Skeggs 
10657113c01SBen Skeggs void nv40_therm_intr(struct nvkm_therm *);
10757113c01SBen Skeggs 
108e1404611SBen Skeggs int  nv50_fan_pwm_ctrl(struct nvkm_therm *, int, bool);
109e1404611SBen Skeggs int  nv50_fan_pwm_get(struct nvkm_therm *, int, u32 *, u32 *);
110e1404611SBen Skeggs int  nv50_fan_pwm_set(struct nvkm_therm *, int, u32, u32);
111e1404611SBen Skeggs int  nv50_fan_pwm_clock(struct nvkm_therm *, int);
11257113c01SBen Skeggs 
113e1404611SBen Skeggs int  g84_temp_get(struct nvkm_therm *);
114e1404611SBen Skeggs void g84_sensor_setup(struct nvkm_therm *);
11557113c01SBen Skeggs void g84_therm_fini(struct nvkm_therm *);
116c39f472eSBen Skeggs 
117e1404611SBen Skeggs int gt215_therm_fan_sense(struct nvkm_therm *);
118c39f472eSBen Skeggs 
1191bab09acSLyude Paul void gf100_clkgate_init(struct nvkm_therm *,
1201bab09acSLyude Paul 			const struct nvkm_therm_clkgate_pack *);
1211bab09acSLyude Paul 
1229d60b9c9SKarol Herbst void g84_therm_init(struct nvkm_therm *);
123b138eca6SLyude Paul 
124b138eca6SLyude Paul int gf119_fan_pwm_ctrl(struct nvkm_therm *, int, bool);
125b138eca6SLyude Paul int gf119_fan_pwm_get(struct nvkm_therm *, int, u32 *, u32 *);
126b138eca6SLyude Paul int gf119_fan_pwm_set(struct nvkm_therm *, int, u32, u32);
127b138eca6SLyude Paul int gf119_fan_pwm_clock(struct nvkm_therm *, int);
12857113c01SBen Skeggs void gf119_therm_init(struct nvkm_therm *);
129c39f472eSBen Skeggs 
1301bab09acSLyude Paul void gk104_therm_init(struct nvkm_therm *);
131b138eca6SLyude Paul void gk104_clkgate_enable(struct nvkm_therm *);
132b138eca6SLyude Paul void gk104_clkgate_fini(struct nvkm_therm *, bool);
133b138eca6SLyude Paul 
134e1404611SBen Skeggs int nvkm_fanpwm_create(struct nvkm_therm *, struct dcb_gpio_func *);
135e1404611SBen Skeggs int nvkm_fantog_create(struct nvkm_therm *, struct dcb_gpio_func *);
136e1404611SBen Skeggs int nvkm_fannil_create(struct nvkm_therm *);
137c39f472eSBen Skeggs #endif
138