xref: /linux/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/therm.h (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
1*b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
2c39f472eSBen Skeggs #ifndef __NVBIOS_THERM_H__
3c39f472eSBen Skeggs #define __NVBIOS_THERM_H__
4c39f472eSBen Skeggs struct nvbios_therm_threshold {
5c39f472eSBen Skeggs 	u8 temp;
6c39f472eSBen Skeggs 	u8 hysteresis;
7c39f472eSBen Skeggs };
8c39f472eSBen Skeggs 
9c39f472eSBen Skeggs struct nvbios_therm_sensor {
10c39f472eSBen Skeggs 	/* diode */
11c39f472eSBen Skeggs 	s16 slope_mult;
12c39f472eSBen Skeggs 	s16 slope_div;
13c39f472eSBen Skeggs 	s16 offset_num;
14c39f472eSBen Skeggs 	s16 offset_den;
15c39f472eSBen Skeggs 	s8 offset_constant;
16c39f472eSBen Skeggs 
17c39f472eSBen Skeggs 	/* thresholds */
18c39f472eSBen Skeggs 	struct nvbios_therm_threshold thrs_fan_boost;
19c39f472eSBen Skeggs 	struct nvbios_therm_threshold thrs_down_clock;
20c39f472eSBen Skeggs 	struct nvbios_therm_threshold thrs_critical;
21c39f472eSBen Skeggs 	struct nvbios_therm_threshold thrs_shutdown;
22c39f472eSBen Skeggs };
23c39f472eSBen Skeggs 
24c39f472eSBen Skeggs enum nvbios_therm_fan_type {
25c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_UNK = 0,
26c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_TOGGLE = 1,
27c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_PWM = 2,
28c39f472eSBen Skeggs };
29c39f472eSBen Skeggs 
30c39f472eSBen Skeggs /* no vbios have more than 6 */
31d390b480SBen Skeggs #define NVKM_TEMP_FAN_TRIP_MAX 10
32d390b480SBen Skeggs struct nvbios_therm_trip_point {
33c39f472eSBen Skeggs 	int fan_duty;
34c39f472eSBen Skeggs 	int temp;
35c39f472eSBen Skeggs 	int hysteresis;
36c39f472eSBen Skeggs };
37c39f472eSBen Skeggs 
38c39f472eSBen Skeggs enum nvbios_therm_fan_mode {
39c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_TRIP = 0,
40c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_LINEAR = 1,
41c39f472eSBen Skeggs 	NVBIOS_THERM_FAN_OTHER = 2,
42c39f472eSBen Skeggs };
43c39f472eSBen Skeggs 
44c39f472eSBen Skeggs struct nvbios_therm_fan {
45c39f472eSBen Skeggs 	enum nvbios_therm_fan_type type;
46c39f472eSBen Skeggs 
47c39f472eSBen Skeggs 	u32 pwm_freq;
48c39f472eSBen Skeggs 
49c39f472eSBen Skeggs 	u8 min_duty;
50c39f472eSBen Skeggs 	u8 max_duty;
51c39f472eSBen Skeggs 
52c39f472eSBen Skeggs 	u16 bump_period;
53c39f472eSBen Skeggs 	u16 slow_down_period;
54c39f472eSBen Skeggs 
55c39f472eSBen Skeggs 	enum nvbios_therm_fan_mode fan_mode;
56d390b480SBen Skeggs 	struct nvbios_therm_trip_point trip[NVKM_TEMP_FAN_TRIP_MAX];
57c39f472eSBen Skeggs 	u8 nr_fan_trip;
58c39f472eSBen Skeggs 	u8 linear_min_temp;
59c39f472eSBen Skeggs 	u8 linear_max_temp;
60c39f472eSBen Skeggs };
61c39f472eSBen Skeggs 
62c39f472eSBen Skeggs enum nvbios_therm_domain {
63c39f472eSBen Skeggs 	NVBIOS_THERM_DOMAIN_CORE,
64c39f472eSBen Skeggs 	NVBIOS_THERM_DOMAIN_AMBIENT,
65c39f472eSBen Skeggs };
66c39f472eSBen Skeggs 
67c39f472eSBen Skeggs int
68d390b480SBen Skeggs nvbios_therm_sensor_parse(struct nvkm_bios *, enum nvbios_therm_domain,
69c39f472eSBen Skeggs 			  struct nvbios_therm_sensor *);
70c39f472eSBen Skeggs 
71c39f472eSBen Skeggs int
72d390b480SBen Skeggs nvbios_therm_fan_parse(struct nvkm_bios *, struct nvbios_therm_fan *);
73c39f472eSBen Skeggs #endif
74