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