From 8f88c0c7aac091c3cf97e07c813503fc072afcb6 Mon Sep 17 00:00:00 2001 From: Tim Crawford Date: Tue, 30 Apr 2024 11:19:53 -0600 Subject: [PATCH] dgpu: Split out getting temp to a function Signed-off-by: Tim Crawford --- src/board/system76/common/dgpu.c | 28 +++++++++++++------ .../system76/common/include/board/dgpu.h | 7 +++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/board/system76/common/dgpu.c b/src/board/system76/common/dgpu.c index 063ed14..5d7ec7a 100644 --- a/src/board/system76/common/dgpu.c +++ b/src/board/system76/common/dgpu.c @@ -59,23 +59,33 @@ void dgpu_init(void) { i2c_reset(&I2C_DGPU, true); } -uint8_t dgpu_get_fan_duty(void) { - uint8_t duty; - if (power_state == POWER_STATE_S0 && gpio_get(&DGPU_PWR_EN) && !gpio_get(&GC6_FB_EN)) { - // Use I2CS if in S0 state +bool dgpu_get_temp(int16_t *const data) { + if (gpio_get(&DGPU_PWR_EN) && !gpio_get(&GC6_FB_EN)) { int8_t rlts; int16_t res = i2c_get(&I2C_DGPU, 0x4F, 0x00, &rlts, 1); if (res == 1) { - dgpu_temp = (int16_t)rlts; - duty = fan_duty(&FAN, dgpu_temp); + *data = (int16_t)rlts; + return true; } else { DEBUG("DGPU temp error: %d\n", res); - // Default to 50% if there is an error - dgpu_temp = 0; + *data = 0; + return false; + } + } + + *data = 0; + return true; +} + +uint8_t dgpu_get_fan_duty(void) { + uint8_t duty; + if (power_state == POWER_STATE_S0) { + if (dgpu_get_temp(&dgpu_temp)) { + duty = fan_duty(&FAN, dgpu_temp); + } else { duty = PWM_DUTY(50); } } else { - // Turn fan off if not in S0 state or GPU power not on dgpu_temp = 0; duty = PWM_DUTY(0); } diff --git a/src/board/system76/common/include/board/dgpu.h b/src/board/system76/common/include/board/dgpu.h index 7bdf309..2129583 100644 --- a/src/board/system76/common/include/board/dgpu.h +++ b/src/board/system76/common/include/board/dgpu.h @@ -3,6 +3,7 @@ #ifndef _BOARD_DGPU_H #define _BOARD_DGPU_H +#include #include #if CONFIG_HAVE_DGPU @@ -10,12 +11,18 @@ extern int16_t dgpu_temp; void dgpu_init(void); +bool dgpu_get_temp(int16_t *const data); uint8_t dgpu_get_fan_duty(void); #else static inline void dgpu_init(void) {} +static inline bool dgpu_get_temp(int16_t *const data) { + *data = 0; + return true; +} + static inline uint8_t dgpu_get_fan_duty(void) { return 0; }