|
3 | 3 | #include <bootblock_common.h>
|
4 | 4 | #include <device/pnp_ops.h>
|
5 | 5 | #include <mainboard/gpio.h>
|
| 6 | +#include <dasharo/options.h> |
6 | 7 |
|
7 | 8 | // nuvoton_pnp_enter_conf_state
|
8 | 9 | static void pnp_enter_conf_state(pnp_devfn_t dev)
|
@@ -118,69 +119,68 @@ static void hm_write(uint8_t reg, uint8_t value)
|
118 | 119 | outb(value, 0x296);
|
119 | 120 | }
|
120 | 121 |
|
121 |
| -static void hm_init(void) |
| 122 | +static void hm_init(uint8_t fan_curve) |
122 | 123 | {
|
123 |
| - // Bank 2 |
| 124 | + // --- Generic setup --- |
| 125 | + // Bank 2: PECI settings |
124 | 126 | 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 |
125 | 130 |
|
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 |
136 | 132 | hm_write(0x4E, 0x83);
|
| 133 | + hm_write(0x90, 0x01); // Enable PECI agent 0 |
137 | 134 |
|
138 |
| - // Enable PECI agent 0 mode |
139 |
| - hm_write(0x90, 0x01); |
140 |
| - |
141 |
| - // Bank 1 |
| 135 | + // Bank 1: Smart FAN IV setup |
142 | 136 | hm_write(0x4E, 0x81);
|
143 | 137 |
|
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 | + } |
179 | 178 | }
|
180 | 179 |
|
181 | 180 | void bootblock_mainboard_early_init(void)
|
182 | 181 | {
|
| 182 | + uint8_t fan_curve = get_fan_curve_option(); |
183 | 183 | mainboard_configure_early_gpios();
|
184 | 184 | superio_init();
|
185 |
| - hm_init(); |
| 185 | + hm_init(fan_curve); |
186 | 186 | }
|
0 commit comments