windfarm_pm91.c (57b8628bb0ac4e47c806e45c5bbd89282e93869b) windfarm_pm91.c (33e6820b767a5bfa4a0d579da6ee4568a2b1e730)
1/*
2 * Windfarm PowerMac thermal control. SMU based 1 CPU desktop control loops
3 *
4 * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp.
5 * <benh@kernel.crashing.org>
6 *
7 * Released under the term of the GNU GPL v2.
8 *

--- 178 unchanged lines hidden (view full) ---

187 tdelta = ((s32)piddata->target_temp_delta) << 16;
188 maxpow = ((s32)piddata->max_power) << 16;
189 powadj = ((s32)piddata->power_adj) << 16;
190
191 pid_param.tmax = tmax;
192 pid_param.ttarget = tmax - tdelta;
193 pid_param.pmaxadj = maxpow - powadj;
194
1/*
2 * Windfarm PowerMac thermal control. SMU based 1 CPU desktop control loops
3 *
4 * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp.
5 * <benh@kernel.crashing.org>
6 *
7 * Released under the term of the GNU GPL v2.
8 *

--- 178 unchanged lines hidden (view full) ---

187 tdelta = ((s32)piddata->target_temp_delta) << 16;
188 maxpow = ((s32)piddata->max_power) << 16;
189 powadj = ((s32)piddata->power_adj) << 16;
190
191 pid_param.tmax = tmax;
192 pid_param.ttarget = tmax - tdelta;
193 pid_param.pmaxadj = maxpow - powadj;
194
195 pid_param.min = fan_cpu_main->ops->get_min(fan_cpu_main);
196 pid_param.max = fan_cpu_main->ops->get_max(fan_cpu_main);
195 pid_param.min = wf_control_get_min(fan_cpu_main);
196 pid_param.max = wf_control_get_max(fan_cpu_main);
197
198 wf_cpu_pid_init(&wf_smu_cpu_fans->pid, &pid_param);
199
200 DBG("wf: CPU Fan control initialized.\n");
201 DBG(" ttarged=%d.%03d, tmax=%d.%03d, min=%d RPM, max=%d RPM\n",
202 FIX32TOPRINT(pid_param.ttarget), FIX32TOPRINT(pid_param.tmax),
203 pid_param.min, pid_param.max);
204

--- 16 unchanged lines hidden (view full) ---

221
222 if (--st->ticks != 0) {
223 if (wf_smu_readjust)
224 goto readjust;
225 return;
226 }
227 st->ticks = WF_SMU_CPU_FANS_INTERVAL;
228
197
198 wf_cpu_pid_init(&wf_smu_cpu_fans->pid, &pid_param);
199
200 DBG("wf: CPU Fan control initialized.\n");
201 DBG(" ttarged=%d.%03d, tmax=%d.%03d, min=%d RPM, max=%d RPM\n",
202 FIX32TOPRINT(pid_param.ttarget), FIX32TOPRINT(pid_param.tmax),
203 pid_param.min, pid_param.max);
204

--- 16 unchanged lines hidden (view full) ---

221
222 if (--st->ticks != 0) {
223 if (wf_smu_readjust)
224 goto readjust;
225 return;
226 }
227 st->ticks = WF_SMU_CPU_FANS_INTERVAL;
228
229 rc = sensor_cpu_temp->ops->get_value(sensor_cpu_temp, &temp);
229 rc = wf_sensor_get(sensor_cpu_temp, &temp);
230 if (rc) {
231 printk(KERN_WARNING "windfarm: CPU temp sensor error %d\n",
232 rc);
233 wf_smu_failure_state |= FAILURE_SENSOR;
234 return;
235 }
236
230 if (rc) {
231 printk(KERN_WARNING "windfarm: CPU temp sensor error %d\n",
232 rc);
233 wf_smu_failure_state |= FAILURE_SENSOR;
234 return;
235 }
236
237 rc = sensor_cpu_power->ops->get_value(sensor_cpu_power, &power);
237 rc = wf_sensor_get(&sensor_cpu_power, &power);
238 if (rc) {
239 printk(KERN_WARNING "windfarm: CPU power sensor error %d\n",
240 rc);
241 wf_smu_failure_state |= FAILURE_SENSOR;
242 return;
243 }
244
245 DBG("wf_smu: CPU Fans tick ! CPU temp: %d.%03d, power: %d.%03d\n",

--- 10 unchanged lines hidden (view full) ---

256
257 DBG("wf_smu: new_setpoint: %d RPM\n", (int)new_setpoint);
258
259 if (st->cpu_setpoint == new_setpoint)
260 return;
261 st->cpu_setpoint = new_setpoint;
262 readjust:
263 if (fan_cpu_main && wf_smu_failure_state == 0) {
238 if (rc) {
239 printk(KERN_WARNING "windfarm: CPU power sensor error %d\n",
240 rc);
241 wf_smu_failure_state |= FAILURE_SENSOR;
242 return;
243 }
244
245 DBG("wf_smu: CPU Fans tick ! CPU temp: %d.%03d, power: %d.%03d\n",

--- 10 unchanged lines hidden (view full) ---

256
257 DBG("wf_smu: new_setpoint: %d RPM\n", (int)new_setpoint);
258
259 if (st->cpu_setpoint == new_setpoint)
260 return;
261 st->cpu_setpoint = new_setpoint;
262 readjust:
263 if (fan_cpu_main && wf_smu_failure_state == 0) {
264 rc = fan_cpu_main->ops->set_value(fan_cpu_main,
265 st->cpu_setpoint);
264 rc = wf_control_set(fan_cpu_main, st->cpu_setpoint);
266 if (rc) {
267 printk(KERN_WARNING "windfarm: CPU main fan"
268 " error %d\n", rc);
269 wf_smu_failure_state |= FAILURE_FAN;
270 }
271 }
272 if (fan_cpu_second && wf_smu_failure_state == 0) {
265 if (rc) {
266 printk(KERN_WARNING "windfarm: CPU main fan"
267 " error %d\n", rc);
268 wf_smu_failure_state |= FAILURE_FAN;
269 }
270 }
271 if (fan_cpu_second && wf_smu_failure_state == 0) {
273 rc = fan_cpu_second->ops->set_value(fan_cpu_second,
274 st->cpu_setpoint);
272 rc = wf_control_set(fan_cpu_second, st->cpu_setpoint);
275 if (rc) {
276 printk(KERN_WARNING "windfarm: CPU second fan"
277 " error %d\n", rc);
278 wf_smu_failure_state |= FAILURE_FAN;
279 }
280 }
281 if (fan_cpu_third && wf_smu_failure_state == 0) {
273 if (rc) {
274 printk(KERN_WARNING "windfarm: CPU second fan"
275 " error %d\n", rc);
276 wf_smu_failure_state |= FAILURE_FAN;
277 }
278 }
279 if (fan_cpu_third && wf_smu_failure_state == 0) {
282 rc = fan_cpu_main->ops->set_value(fan_cpu_third,
283 st->cpu_setpoint);
280 rc = wf_control_set(fan_cpu_third, st->cpu_setpoint);
284 if (rc) {
285 printk(KERN_WARNING "windfarm: CPU third fan"
286 " error %d\n", rc);
287 wf_smu_failure_state |= FAILURE_FAN;
288 }
289 }
290}
291

--- 15 unchanged lines hidden (view full) ---

307 printk(KERN_WARNING "windfarm: Memory allocation error"
308 " max fan speed\n");
309 goto fail;
310 }
311 wf_smu_drive_fans->ticks = 1;
312
313 /* Fill PID params */
314 param.additive = (fan_hd->type == WF_CONTROL_RPM_FAN);
281 if (rc) {
282 printk(KERN_WARNING "windfarm: CPU third fan"
283 " error %d\n", rc);
284 wf_smu_failure_state |= FAILURE_FAN;
285 }
286 }
287}
288

--- 15 unchanged lines hidden (view full) ---

304 printk(KERN_WARNING "windfarm: Memory allocation error"
305 " max fan speed\n");
306 goto fail;
307 }
308 wf_smu_drive_fans->ticks = 1;
309
310 /* Fill PID params */
311 param.additive = (fan_hd->type == WF_CONTROL_RPM_FAN);
315 param.min = fan_hd->ops->get_min(fan_hd);
316 param.max = fan_hd->ops->get_max(fan_hd);
312 param.min = wf_control_get_min(fan_hd);
313 param.max = wf_control_get_max(fan_hd);
317 wf_pid_init(&wf_smu_drive_fans->pid, &param);
318
319 DBG("wf: Drive Fan control initialized.\n");
320 DBG(" itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
321 FIX32TOPRINT(param.itarget), param.min, param.max);
322 return;
323
324 fail:

--- 8 unchanged lines hidden (view full) ---

333
334 if (--st->ticks != 0) {
335 if (wf_smu_readjust)
336 goto readjust;
337 return;
338 }
339 st->ticks = st->pid.param.interval;
340
314 wf_pid_init(&wf_smu_drive_fans->pid, &param);
315
316 DBG("wf: Drive Fan control initialized.\n");
317 DBG(" itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
318 FIX32TOPRINT(param.itarget), param.min, param.max);
319 return;
320
321 fail:

--- 8 unchanged lines hidden (view full) ---

330
331 if (--st->ticks != 0) {
332 if (wf_smu_readjust)
333 goto readjust;
334 return;
335 }
336 st->ticks = st->pid.param.interval;
337
341 rc = sensor_hd_temp->ops->get_value(sensor_hd_temp, &temp);
338 rc = wf_sensor_get(sensor_hd_temp, &temp);
342 if (rc) {
343 printk(KERN_WARNING "windfarm: HD temp sensor error %d\n",
344 rc);
345 wf_smu_failure_state |= FAILURE_SENSOR;
346 return;
347 }
348
349 DBG("wf_smu: Drive Fans tick ! HD temp: %d.%03d\n",

--- 6 unchanged lines hidden (view full) ---

356
357 DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);
358
359 if (st->setpoint == new_setpoint)
360 return;
361 st->setpoint = new_setpoint;
362 readjust:
363 if (fan_hd && wf_smu_failure_state == 0) {
339 if (rc) {
340 printk(KERN_WARNING "windfarm: HD temp sensor error %d\n",
341 rc);
342 wf_smu_failure_state |= FAILURE_SENSOR;
343 return;
344 }
345
346 DBG("wf_smu: Drive Fans tick ! HD temp: %d.%03d\n",

--- 6 unchanged lines hidden (view full) ---

353
354 DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);
355
356 if (st->setpoint == new_setpoint)
357 return;
358 st->setpoint = new_setpoint;
359 readjust:
360 if (fan_hd && wf_smu_failure_state == 0) {
364 rc = fan_hd->ops->set_value(fan_hd, st->setpoint);
361 rc = wf_control_set(fan_hd, st->setpoint);
365 if (rc) {
366 printk(KERN_WARNING "windfarm: HD fan error %d\n",
367 rc);
368 wf_smu_failure_state |= FAILURE_FAN;
369 }
370 }
371}
372

--- 15 unchanged lines hidden (view full) ---

388 printk(KERN_WARNING "windfarm: Memory allocation error"
389 " max fan speed\n");
390 goto fail;
391 }
392 wf_smu_slots_fans->ticks = 1;
393
394 /* Fill PID params */
395 param.additive = (fan_slots->type == WF_CONTROL_RPM_FAN);
362 if (rc) {
363 printk(KERN_WARNING "windfarm: HD fan error %d\n",
364 rc);
365 wf_smu_failure_state |= FAILURE_FAN;
366 }
367 }
368}
369

--- 15 unchanged lines hidden (view full) ---

385 printk(KERN_WARNING "windfarm: Memory allocation error"
386 " max fan speed\n");
387 goto fail;
388 }
389 wf_smu_slots_fans->ticks = 1;
390
391 /* Fill PID params */
392 param.additive = (fan_slots->type == WF_CONTROL_RPM_FAN);
396 param.min = fan_slots->ops->get_min(fan_slots);
397 param.max = fan_slots->ops->get_max(fan_slots);
393 param.min = wf_control_get_min(fan_slots);
394 param.max = wf_control_get_max(fan_slots);
398 wf_pid_init(&wf_smu_slots_fans->pid, &param);
399
400 DBG("wf: Slots Fan control initialized.\n");
401 DBG(" itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
402 FIX32TOPRINT(param.itarget), param.min, param.max);
403 return;
404
405 fail:

--- 8 unchanged lines hidden (view full) ---

414
415 if (--st->ticks != 0) {
416 if (wf_smu_readjust)
417 goto readjust;
418 return;
419 }
420 st->ticks = st->pid.param.interval;
421
395 wf_pid_init(&wf_smu_slots_fans->pid, &param);
396
397 DBG("wf: Slots Fan control initialized.\n");
398 DBG(" itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
399 FIX32TOPRINT(param.itarget), param.min, param.max);
400 return;
401
402 fail:

--- 8 unchanged lines hidden (view full) ---

411
412 if (--st->ticks != 0) {
413 if (wf_smu_readjust)
414 goto readjust;
415 return;
416 }
417 st->ticks = st->pid.param.interval;
418
422 rc = sensor_slots_power->ops->get_value(sensor_slots_power, &power);
419 rc = wf_sensor_get(sensor_slots_power, &power);
423 if (rc) {
424 printk(KERN_WARNING "windfarm: Slots power sensor error %d\n",
425 rc);
426 wf_smu_failure_state |= FAILURE_SENSOR;
427 return;
428 }
429
430 DBG("wf_smu: Slots Fans tick ! Slots power: %d.%03d\n",

--- 8 unchanged lines hidden (view full) ---

439
440 DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);
441
442 if (st->setpoint == new_setpoint)
443 return;
444 st->setpoint = new_setpoint;
445 readjust:
446 if (fan_slots && wf_smu_failure_state == 0) {
420 if (rc) {
421 printk(KERN_WARNING "windfarm: Slots power sensor error %d\n",
422 rc);
423 wf_smu_failure_state |= FAILURE_SENSOR;
424 return;
425 }
426
427 DBG("wf_smu: Slots Fans tick ! Slots power: %d.%03d\n",

--- 8 unchanged lines hidden (view full) ---

436
437 DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);
438
439 if (st->setpoint == new_setpoint)
440 return;
441 st->setpoint = new_setpoint;
442 readjust:
443 if (fan_slots && wf_smu_failure_state == 0) {
447 rc = fan_slots->ops->set_value(fan_slots, st->setpoint);
444 rc = wf_control_set(fan_slots, st->setpoint);
448 if (rc) {
449 printk(KERN_WARNING "windfarm: Slots fan error %d\n",
450 rc);
451 wf_smu_failure_state |= FAILURE_FAN;
452 }
453 }
454}
455

--- 286 unchanged lines hidden ---
445 if (rc) {
446 printk(KERN_WARNING "windfarm: Slots fan error %d\n",
447 rc);
448 wf_smu_failure_state |= FAILURE_FAN;
449 }
450 }
451}
452

--- 286 unchanged lines hidden ---