Skip to content

Commit 4a93be9

Browse files
allow ACPI to set fan speeds
Smooth ACPI fan pwm values same as EC fan curve points
1 parent 1fded3f commit 4a93be9

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>
@@ -65,6 +66,14 @@ void fcommand(void) {
6566
break;
6667
}
6768
break;
69+
case 0xCE:
70+
acpi_peci_fan_duty = fbuf[0];
71+
break;
72+
#if HAVE_DGPU
73+
case 0xCF:
74+
acpi_dgpu_fan_duty = fbuf[0];
75+
break;
76+
#endif
6877
}
6978
}
7079

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

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

73+
// allow for ACPI to request a higher duty
74+
peci_fan_duty = peci_fan_duty > acpi_peci_fan_duty ? peci_fan_duty : acpi_peci_fan_duty;
75+
dgpu_fan_duty = dgpu_fan_duty > acpi_dgpu_fan_duty ? dgpu_fan_duty : acpi_dgpu_fan_duty;
76+
7177
// set PECI fan duty
7278
if (peci_fan_duty != DCR2) {
79+
TRACE("PECI acpi_fan_duty_raw=%d\n", acpi_peci_fan_duty);
7380
TRACE("PECI fan_duty_raw=%d\n", peci_fan_duty);
7481
last_duty_peci = peci_fan_duty = fan_smooth(last_duty_peci, peci_fan_duty);
7582
DCR2 = fan_max ? MAX_FAN_SPEED : peci_fan_duty;
@@ -78,6 +85,7 @@ void fan_duty_set(uint8_t peci_fan_duty, uint8_t dgpu_fan_duty) __reentrant {
7885

7986
// set dGPU fan duty
8087
if (dgpu_fan_duty != DCR4) {
88+
TRACE("DGPU acpi_fan_duty_raw=%d\n", acpi_peci_fan_duty);
8189
TRACE("DGPU fan_duty_raw=%d\n", dgpu_fan_duty);
8290
last_duty_dgpu = dgpu_fan_duty = fan_smooth(last_duty_dgpu, dgpu_fan_duty);
8391
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)