Skip to content

Commit b1a2679

Browse files
allow ACPI to set fan speeds
Smooth ACPI fan pwm values same as EC fan curve points
1 parent 0188560 commit b1a2679

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

src/board/system76/common/acpi.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <board/acpi.h>
44
#include <board/battery.h>
55
#include <board/dgpu.h>
6+
#include <board/fan.h>
67
#include <board/gpio.h>
78
#include <board/kbled.h>
89
#include <board/lid.h>
@@ -52,6 +53,14 @@ void fcommand(void) {
5253
break;
5354
}
5455
break;
56+
case 0xCE:
57+
acpi_peci_fan_duty = fbuf[0];
58+
break;
59+
#if HAVE_DGPU
60+
case 0xCF:
61+
acpi_dgpu_fan_duty = fbuf[0];
62+
break;
63+
#endif
5564
}
5665
}
5766

src/board/system76/common/fan.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#define MIN_SPEED_TO_SMOOTH PWM_DUTY(SMOOTH_FANS_MIN)
1616

1717
bool fan_max = false;
18+
uint8_t acpi_peci_fan_duty = 0;
19+
uint8_t acpi_dgpu_fan_duty = 0;
1820
uint8_t last_duty_dgpu = 0;
1921
uint8_t last_duty_peci = 0;
2022

@@ -66,8 +68,13 @@ void fan_duty_set(uint8_t peci_fan_duty, uint8_t dgpu_fan_duty) __reentrant {
6668
dgpu_fan_duty = peci_fan_duty > dgpu_fan_duty ? peci_fan_duty : dgpu_fan_duty;
6769
#endif
6870

71+
// allow for ACPI to request a higher duty
72+
peci_fan_duty = peci_fan_duty > acpi_peci_fan_duty ? peci_fan_duty : acpi_peci_fan_duty;
73+
dgpu_fan_duty = dgpu_fan_duty > acpi_dgpu_fan_duty ? dgpu_fan_duty : acpi_dgpu_fan_duty;
74+
6975
// set PECI fan duty
7076
if (peci_fan_duty != DCR2) {
77+
TRACE("PECI acpi_fan_duty_raw=%d\n", acpi_peci_fan_duty);
7178
TRACE("PECI fan_duty_raw=%d\n", peci_fan_duty);
7279
last_duty_peci = peci_fan_duty = fan_smooth(last_duty_peci, peci_fan_duty);
7380
DCR2 = fan_max ? MAX_FAN_SPEED : peci_fan_duty;
@@ -76,6 +83,7 @@ void fan_duty_set(uint8_t peci_fan_duty, uint8_t dgpu_fan_duty) __reentrant {
7683

7784
// set dGPU fan duty
7885
if (dgpu_fan_duty != DCR4) {
86+
TRACE("DGPU acpi_fan_duty_raw=%d\n", acpi_peci_fan_duty);
7987
TRACE("DGPU fan_duty_raw=%d\n", dgpu_fan_duty);
8088
last_duty_dgpu = dgpu_fan_duty = fan_smooth(last_duty_dgpu, dgpu_fan_duty);
8189
DCR4 = fan_max ? MAX_FAN_SPEED : dgpu_fan_duty;

src/board/system76/common/include/board/fan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ struct Fan {
4646
bool interpolate;
4747
};
4848

49+
extern uint8_t acpi_dgpu_fan_duty;
50+
extern uint8_t acpi_peci_fan_duty;
4951
extern bool fan_max;
5052

5153
void fan_reset(void);

0 commit comments

Comments
 (0)