Skip to content

Commit 5ab02d9

Browse files
committed
mainboard/novacustom/nuc_box/bootblock.c: implement fan curve options
Signed-off-by: Filip Lewiński <[email protected]>
1 parent 6933cb2 commit 5ab02d9

File tree

2 files changed

+53
-52
lines changed

2 files changed

+53
-52
lines changed

configs/config.novacustom_nuc_box

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,4 @@ CONFIG_ME_BIN_PATH="me.bin"
6464
CONFIG_EDK2_CREATE_PREINSTALLED_BOOT_OPTIONS=y
6565
CONFIG_EDK2_ENABLE_FAST_BOOT_FEATURE=y
6666
CONFIG_EDK2_ENABLE_QUIET_BOOT_FEATURE=y
67+
CONFIG_EDK2_FAN_CURVE_OPTION=y

src/mainboard/novacustom/nuc_box/bootblock.c

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <bootblock_common.h>
44
#include <device/pnp_ops.h>
55
#include <mainboard/gpio.h>
6+
#include <dasharo/options.h>
67

78
// nuvoton_pnp_enter_conf_state
89
static void pnp_enter_conf_state(pnp_devfn_t dev)
@@ -118,69 +119,68 @@ static void hm_write(uint8_t reg, uint8_t value)
118119
outb(value, 0x296);
119120
}
120121

121-
static void hm_init(void)
122+
static void hm_init(uint8_t fan_curve)
122123
{
123-
// Bank 2
124+
// --- Generic setup ---
125+
// Bank 2: PECI settings
124126
hm_write(0x4E, 0x82);
127+
hm_write(0x00, 0x85); // Enable PECI 3.0
128+
hm_write(0x02, 0x10); // Enable PECI agent 30
129+
hm_write(0x04, 110); // Tbase0 = 110C
125130

126-
// Enable PECI 3.0 with routine function
127-
hm_write(0x00, 0x85);
128-
129-
// Enable PECI agent 30
130-
hm_write(0x02, 0x10);
131-
132-
// PECI Tbase0 = 110C
133-
hm_write(0x04, 110);
134-
135-
// Bank 3
131+
// Bank 3: PECI agent mode
136132
hm_write(0x4E, 0x83);
133+
hm_write(0x90, 0x01); // Enable PECI agent 0
137134

138-
// Enable PECI agent 0 mode
139-
hm_write(0x90, 0x01);
140-
141-
// Bank 1
135+
// Bank 1: Smart FAN IV setup
142136
hm_write(0x4E, 0x81);
143137

144-
// CPUFAN T1 = 50C
145-
hm_write(0x70, 50);
146-
// CPUFAN FD1 = 25% = 0x3F
147-
hm_write(0x74, 0x3F);
148-
149-
// CPUFAN T2 = 75C
150-
hm_write(0x71, 75);
151-
// CPUFAN FD2 = 50% = 0x7F
152-
hm_write(0x75, 0x7F);
153-
154-
// CPUFAN T3 = 90C
155-
hm_write(0x72, 90);
156-
// CPUFAN FD3 = 65% = 0xA5
157-
hm_write(0x76, 0xA5);
158-
159-
// CPUFAN T4 = 99C
160-
hm_write(0x73, 99);
161-
// CPUFAN FD4 = 100% = 0xFF
162-
hm_write(0x77, 0xFF);
163-
164-
// CPUFAN critical temperature = 105C
165-
hm_write(0x2A, 105);
166-
// By default critical duty is 0xFF
167-
168-
// CPUFAN step up time = 1s
169-
hm_write(0x24, 10);
170-
171-
// CPUFAN step down time = 0.5s
172-
hm_write(0x25, 5);
173-
174-
// Use PECI agent 0 as CPUFAN monitoring source
175-
hm_write(0x20, 0b01100);
176-
177-
// CPUFAN Smart Fan IV mode
178-
hm_write(0x23, 0x40);
138+
// CPUFAN: Enable Smart Fan IV mode
139+
hm_write(0x23, 0x40); // Mode select: Smart FAN IV
140+
141+
// Set PECI agent 0 as CPUFAN temperature source
142+
hm_write(0x20, 0x0C); // Source = PECI agent 0
143+
144+
// Set fan ramp timings
145+
hm_write(0x24, 10); // Step up = 1s
146+
hm_write(0x25, 5); // Step down = 0.5s
147+
148+
// Set critical temperature
149+
hm_write(0x2A, 105); // Trip point to force 100% duty
150+
151+
// --- Curve-specific thresholds ---
152+
switch (fan_curve) {
153+
case FAN_CURVE_OPTION_OFF:
154+
// Fan off curve (only reacts at critical temp)
155+
hm_write(0x70, 90); hm_write(0x74, 0x00); // T1
156+
hm_write(0x71, 95); hm_write(0x75, 0x00); // T2
157+
hm_write(0x72,100); hm_write(0x76, 0x00); // T3
158+
hm_write(0x73,105); hm_write(0x77, 0x00); // T4
159+
break;
160+
161+
case FAN_CURVE_OPTION_PERFORMANCE:
162+
// Aggressive response
163+
hm_write(0x70, 40); hm_write(0x74, 0x40); // 25%
164+
hm_write(0x71, 60); hm_write(0x75, 0x80); // 50%
165+
hm_write(0x72, 75); hm_write(0x76, 0xC0); // 75%
166+
hm_write(0x73, 85); hm_write(0x77, 0xFF); // 100%
167+
break;
168+
169+
case FAN_CURVE_OPTION_SILENT:
170+
default:
171+
// Quiet, conservative curve
172+
hm_write(0x70, 60); hm_write(0x74, 0x2A); // ~16%
173+
hm_write(0x71, 75); hm_write(0x75, 0x50); // ~31%
174+
hm_write(0x72, 85); hm_write(0x76, 0x80); // ~50%
175+
hm_write(0x73, 95); hm_write(0x77, 0xC0); // ~75%
176+
break;
177+
}
179178
}
180179

181180
void bootblock_mainboard_early_init(void)
182181
{
182+
uint8_t fan_curve = get_fan_curve_option();
183183
mainboard_configure_early_gpios();
184184
superio_init();
185-
hm_init();
185+
hm_init(fan_curve);
186186
}

0 commit comments

Comments
 (0)