Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.16 2073 lines 57 kB view raw
1/* 2 * Device driver for the thermostats & fan controller of the 3 * Apple G5 "PowerMac7,2" desktop machines. 4 * 5 * (c) Copyright IBM Corp. 2003-2004 6 * 7 * Maintained by: Benjamin Herrenschmidt 8 * <benh@kernel.crashing.org> 9 * 10 * 11 * The algorithm used is the PID control algorithm, used the same 12 * way the published Darwin code does, using the same values that 13 * are present in the Darwin 7.0 snapshot property lists. 14 * 15 * As far as the CPUs control loops are concerned, I use the 16 * calibration & PID constants provided by the EEPROM, 17 * I do _not_ embed any value from the property lists, as the ones 18 * provided by Darwin 7.0 seem to always have an older version that 19 * what I've seen on the actual computers. 20 * It would be interesting to verify that though. Darwin has a 21 * version code of 1.0.0d11 for all control loops it seems, while 22 * so far, the machines EEPROMs contain a dataset versioned 1.0.0f 23 * 24 * Darwin doesn't provide source to all parts, some missing 25 * bits like the AppleFCU driver or the actual scale of some 26 * of the values returned by sensors had to be "guessed" some 27 * way... or based on what Open Firmware does. 28 * 29 * I didn't yet figure out how to get the slots power consumption 30 * out of the FCU, so that part has not been implemented yet and 31 * the slots fan is set to a fixed 50% PWM, hoping this value is 32 * safe enough ... 33 * 34 * Note: I have observed strange oscillations of the CPU control 35 * loop on a dual G5 here. When idle, the CPU exhaust fan tend to 36 * oscillates slowly (over several minutes) between the minimum 37 * of 300RPMs and approx. 1000 RPMs. I don't know what is causing 38 * this, it could be some incorrect constant or an error in the 39 * way I ported the algorithm, or it could be just normal. I 40 * don't have full understanding on the way Apple tweaked the PID 41 * algorithm for the CPU control, it is definitely not a standard 42 * implementation... 43 * 44 * TODO: - Check MPU structure version/signature 45 * - Add things like /sbin/overtemp for non-critical 46 * overtemp conditions so userland can take some policy 47 * decisions, like slewing down CPUs 48 * - Deal with fan and i2c failures in a better way 49 * - Maybe do a generic PID based on params used for 50 * U3 and Drives ? Definitely need to factor code a bit 51 * bettter... also make sensor detection more robust using 52 * the device-tree to probe for them 53 * - Figure out how to get the slots consumption and set the 54 * slots fan accordingly 55 * 56 * History: 57 * 58 * Nov. 13, 2003 : 0.5 59 * - First release 60 * 61 * Nov. 14, 2003 : 0.6 62 * - Read fan speed from FCU, low level fan routines now deal 63 * with errors & check fan status, though higher level don't 64 * do much. 65 * - Move a bunch of definitions to .h file 66 * 67 * Nov. 18, 2003 : 0.7 68 * - Fix build on ppc64 kernel 69 * - Move back statics definitions to .c file 70 * - Avoid calling schedule_timeout with a negative number 71 * 72 * Dec. 18, 2003 : 0.8 73 * - Fix typo when reading back fan speed on 2 CPU machines 74 * 75 * Mar. 11, 2004 : 0.9 76 * - Rework code accessing the ADC chips, make it more robust and 77 * closer to the chip spec. Also make sure it is configured properly, 78 * I've seen yet unexplained cases where on startup, I would have stale 79 * values in the configuration register 80 * - Switch back to use of target fan speed for PID, thus lowering 81 * pressure on i2c 82 * 83 * Oct. 20, 2004 : 1.1 84 * - Add device-tree lookup for fan IDs, should detect liquid cooling 85 * pumps when present 86 * - Enable driver for PowerMac7,3 machines 87 * - Split the U3/Backside cooling on U3 & U3H versions as Darwin does 88 * - Add new CPU cooling algorithm for machines with liquid cooling 89 * - Workaround for some PowerMac7,3 with empty "fan" node in the devtree 90 * - Fix a signed/unsigned compare issue in some PID loops 91 * 92 * Mar. 10, 2005 : 1.2 93 * - Add basic support for Xserve G5 94 * - Retreive pumps min/max from EEPROM image in device-tree (broken) 95 * - Use min/max macros here or there 96 * - Latest darwin updated U3H min fan speed to 20% PWM 97 * 98 */ 99 100#include <linux/config.h> 101#include <linux/types.h> 102#include <linux/module.h> 103#include <linux/errno.h> 104#include <linux/kernel.h> 105#include <linux/delay.h> 106#include <linux/sched.h> 107#include <linux/i2c.h> 108#include <linux/slab.h> 109#include <linux/init.h> 110#include <linux/spinlock.h> 111#include <linux/smp_lock.h> 112#include <linux/wait.h> 113#include <linux/reboot.h> 114#include <linux/kmod.h> 115#include <linux/i2c.h> 116#include <linux/i2c-dev.h> 117#include <asm/prom.h> 118#include <asm/machdep.h> 119#include <asm/io.h> 120#include <asm/system.h> 121#include <asm/sections.h> 122#include <asm/of_device.h> 123#include <asm/macio.h> 124 125#include "therm_pm72.h" 126 127#define VERSION "1.2b2" 128 129#undef DEBUG 130 131#ifdef DEBUG 132#define DBG(args...) printk(args) 133#else 134#define DBG(args...) do { } while(0) 135#endif 136 137 138/* 139 * Driver statics 140 */ 141 142static struct of_device * of_dev; 143static struct i2c_adapter * u3_0; 144static struct i2c_adapter * u3_1; 145static struct i2c_adapter * k2; 146static struct i2c_client * fcu; 147static struct cpu_pid_state cpu_state[2]; 148static struct basckside_pid_params backside_params; 149static struct backside_pid_state backside_state; 150static struct drives_pid_state drives_state; 151static struct dimm_pid_state dimms_state; 152static int state; 153static int cpu_count; 154static int cpu_pid_type; 155static pid_t ctrl_task; 156static struct completion ctrl_complete; 157static int critical_state; 158static int rackmac; 159static s32 dimm_output_clamp; 160 161static DECLARE_MUTEX(driver_lock); 162 163/* 164 * We have 3 types of CPU PID control. One is "split" old style control 165 * for intake & exhaust fans, the other is "combined" control for both 166 * CPUs that also deals with the pumps when present. To be "compatible" 167 * with OS X at this point, we only use "COMBINED" on the machines that 168 * are identified as having the pumps (though that identification is at 169 * least dodgy). Ultimately, we could probably switch completely to this 170 * algorithm provided we hack it to deal with the UP case 171 */ 172#define CPU_PID_TYPE_SPLIT 0 173#define CPU_PID_TYPE_COMBINED 1 174#define CPU_PID_TYPE_RACKMAC 2 175 176/* 177 * This table describes all fans in the FCU. The "id" and "type" values 178 * are defaults valid for all earlier machines. Newer machines will 179 * eventually override the table content based on the device-tree 180 */ 181struct fcu_fan_table 182{ 183 char* loc; /* location code */ 184 int type; /* 0 = rpm, 1 = pwm, 2 = pump */ 185 int id; /* id or -1 */ 186}; 187 188#define FCU_FAN_RPM 0 189#define FCU_FAN_PWM 1 190 191#define FCU_FAN_ABSENT_ID -1 192 193#define FCU_FAN_COUNT ARRAY_SIZE(fcu_fans) 194 195struct fcu_fan_table fcu_fans[] = { 196 [BACKSIDE_FAN_PWM_INDEX] = { 197 .loc = "BACKSIDE,SYS CTRLR FAN", 198 .type = FCU_FAN_PWM, 199 .id = BACKSIDE_FAN_PWM_DEFAULT_ID, 200 }, 201 [DRIVES_FAN_RPM_INDEX] = { 202 .loc = "DRIVE BAY", 203 .type = FCU_FAN_RPM, 204 .id = DRIVES_FAN_RPM_DEFAULT_ID, 205 }, 206 [SLOTS_FAN_PWM_INDEX] = { 207 .loc = "SLOT,PCI FAN", 208 .type = FCU_FAN_PWM, 209 .id = SLOTS_FAN_PWM_DEFAULT_ID, 210 }, 211 [CPUA_INTAKE_FAN_RPM_INDEX] = { 212 .loc = "CPU A INTAKE", 213 .type = FCU_FAN_RPM, 214 .id = CPUA_INTAKE_FAN_RPM_DEFAULT_ID, 215 }, 216 [CPUA_EXHAUST_FAN_RPM_INDEX] = { 217 .loc = "CPU A EXHAUST", 218 .type = FCU_FAN_RPM, 219 .id = CPUA_EXHAUST_FAN_RPM_DEFAULT_ID, 220 }, 221 [CPUB_INTAKE_FAN_RPM_INDEX] = { 222 .loc = "CPU B INTAKE", 223 .type = FCU_FAN_RPM, 224 .id = CPUB_INTAKE_FAN_RPM_DEFAULT_ID, 225 }, 226 [CPUB_EXHAUST_FAN_RPM_INDEX] = { 227 .loc = "CPU B EXHAUST", 228 .type = FCU_FAN_RPM, 229 .id = CPUB_EXHAUST_FAN_RPM_DEFAULT_ID, 230 }, 231 /* pumps aren't present by default, have to be looked up in the 232 * device-tree 233 */ 234 [CPUA_PUMP_RPM_INDEX] = { 235 .loc = "CPU A PUMP", 236 .type = FCU_FAN_RPM, 237 .id = FCU_FAN_ABSENT_ID, 238 }, 239 [CPUB_PUMP_RPM_INDEX] = { 240 .loc = "CPU B PUMP", 241 .type = FCU_FAN_RPM, 242 .id = FCU_FAN_ABSENT_ID, 243 }, 244 /* Xserve fans */ 245 [CPU_A1_FAN_RPM_INDEX] = { 246 .loc = "CPU A 1", 247 .type = FCU_FAN_RPM, 248 .id = FCU_FAN_ABSENT_ID, 249 }, 250 [CPU_A2_FAN_RPM_INDEX] = { 251 .loc = "CPU A 2", 252 .type = FCU_FAN_RPM, 253 .id = FCU_FAN_ABSENT_ID, 254 }, 255 [CPU_A3_FAN_RPM_INDEX] = { 256 .loc = "CPU A 3", 257 .type = FCU_FAN_RPM, 258 .id = FCU_FAN_ABSENT_ID, 259 }, 260 [CPU_B1_FAN_RPM_INDEX] = { 261 .loc = "CPU B 1", 262 .type = FCU_FAN_RPM, 263 .id = FCU_FAN_ABSENT_ID, 264 }, 265 [CPU_B2_FAN_RPM_INDEX] = { 266 .loc = "CPU B 2", 267 .type = FCU_FAN_RPM, 268 .id = FCU_FAN_ABSENT_ID, 269 }, 270 [CPU_B3_FAN_RPM_INDEX] = { 271 .loc = "CPU B 3", 272 .type = FCU_FAN_RPM, 273 .id = FCU_FAN_ABSENT_ID, 274 }, 275}; 276 277/* 278 * i2c_driver structure to attach to the host i2c controller 279 */ 280 281static int therm_pm72_attach(struct i2c_adapter *adapter); 282static int therm_pm72_detach(struct i2c_adapter *adapter); 283 284static struct i2c_driver therm_pm72_driver = 285{ 286 .driver = { 287 .name = "therm_pm72", 288 }, 289 .attach_adapter = therm_pm72_attach, 290 .detach_adapter = therm_pm72_detach, 291}; 292 293/* 294 * Utility function to create an i2c_client structure and 295 * attach it to one of u3 adapters 296 */ 297static struct i2c_client *attach_i2c_chip(int id, const char *name) 298{ 299 struct i2c_client *clt; 300 struct i2c_adapter *adap; 301 302 if (id & 0x200) 303 adap = k2; 304 else if (id & 0x100) 305 adap = u3_1; 306 else 307 adap = u3_0; 308 if (adap == NULL) 309 return NULL; 310 311 clt = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); 312 if (clt == NULL) 313 return NULL; 314 memset(clt, 0, sizeof(struct i2c_client)); 315 316 clt->addr = (id >> 1) & 0x7f; 317 clt->adapter = adap; 318 clt->driver = &therm_pm72_driver; 319 strncpy(clt->name, name, I2C_NAME_SIZE-1); 320 321 if (i2c_attach_client(clt)) { 322 printk(KERN_ERR "therm_pm72: Failed to attach to i2c ID 0x%x\n", id); 323 kfree(clt); 324 return NULL; 325 } 326 return clt; 327} 328 329/* 330 * Utility function to get rid of the i2c_client structure 331 * (will also detach from the adapter hopepfully) 332 */ 333static void detach_i2c_chip(struct i2c_client *clt) 334{ 335 i2c_detach_client(clt); 336 kfree(clt); 337} 338 339/* 340 * Here are the i2c chip access wrappers 341 */ 342 343static void initialize_adc(struct cpu_pid_state *state) 344{ 345 int rc; 346 u8 buf[2]; 347 348 /* Read ADC the configuration register and cache it. We 349 * also make sure Config2 contains proper values, I've seen 350 * cases where we got stale grabage in there, thus preventing 351 * proper reading of conv. values 352 */ 353 354 /* Clear Config2 */ 355 buf[0] = 5; 356 buf[1] = 0; 357 i2c_master_send(state->monitor, buf, 2); 358 359 /* Read & cache Config1 */ 360 buf[0] = 1; 361 rc = i2c_master_send(state->monitor, buf, 1); 362 if (rc > 0) { 363 rc = i2c_master_recv(state->monitor, buf, 1); 364 if (rc > 0) { 365 state->adc_config = buf[0]; 366 DBG("ADC config reg: %02x\n", state->adc_config); 367 /* Disable shutdown mode */ 368 state->adc_config &= 0xfe; 369 buf[0] = 1; 370 buf[1] = state->adc_config; 371 rc = i2c_master_send(state->monitor, buf, 2); 372 } 373 } 374 if (rc <= 0) 375 printk(KERN_ERR "therm_pm72: Error reading ADC config" 376 " register !\n"); 377} 378 379static int read_smon_adc(struct cpu_pid_state *state, int chan) 380{ 381 int rc, data, tries = 0; 382 u8 buf[2]; 383 384 for (;;) { 385 /* Set channel */ 386 buf[0] = 1; 387 buf[1] = (state->adc_config & 0x1f) | (chan << 5); 388 rc = i2c_master_send(state->monitor, buf, 2); 389 if (rc <= 0) 390 goto error; 391 /* Wait for convertion */ 392 msleep(1); 393 /* Switch to data register */ 394 buf[0] = 4; 395 rc = i2c_master_send(state->monitor, buf, 1); 396 if (rc <= 0) 397 goto error; 398 /* Read result */ 399 rc = i2c_master_recv(state->monitor, buf, 2); 400 if (rc < 0) 401 goto error; 402 data = ((u16)buf[0]) << 8 | (u16)buf[1]; 403 return data >> 6; 404 error: 405 DBG("Error reading ADC, retrying...\n"); 406 if (++tries > 10) { 407 printk(KERN_ERR "therm_pm72: Error reading ADC !\n"); 408 return -1; 409 } 410 msleep(10); 411 } 412} 413 414static int read_lm87_reg(struct i2c_client * chip, int reg) 415{ 416 int rc, tries = 0; 417 u8 buf; 418 419 for (;;) { 420 /* Set address */ 421 buf = (u8)reg; 422 rc = i2c_master_send(chip, &buf, 1); 423 if (rc <= 0) 424 goto error; 425 rc = i2c_master_recv(chip, &buf, 1); 426 if (rc <= 0) 427 goto error; 428 return (int)buf; 429 error: 430 DBG("Error reading LM87, retrying...\n"); 431 if (++tries > 10) { 432 printk(KERN_ERR "therm_pm72: Error reading LM87 !\n"); 433 return -1; 434 } 435 msleep(10); 436 } 437} 438 439static int fan_read_reg(int reg, unsigned char *buf, int nb) 440{ 441 int tries, nr, nw; 442 443 buf[0] = reg; 444 tries = 0; 445 for (;;) { 446 nw = i2c_master_send(fcu, buf, 1); 447 if (nw > 0 || (nw < 0 && nw != -EIO) || tries >= 100) 448 break; 449 msleep(10); 450 ++tries; 451 } 452 if (nw <= 0) { 453 printk(KERN_ERR "Failure writing address to FCU: %d", nw); 454 return -EIO; 455 } 456 tries = 0; 457 for (;;) { 458 nr = i2c_master_recv(fcu, buf, nb); 459 if (nr > 0 || (nr < 0 && nr != ENODEV) || tries >= 100) 460 break; 461 msleep(10); 462 ++tries; 463 } 464 if (nr <= 0) 465 printk(KERN_ERR "Failure reading data from FCU: %d", nw); 466 return nr; 467} 468 469static int fan_write_reg(int reg, const unsigned char *ptr, int nb) 470{ 471 int tries, nw; 472 unsigned char buf[16]; 473 474 buf[0] = reg; 475 memcpy(buf+1, ptr, nb); 476 ++nb; 477 tries = 0; 478 for (;;) { 479 nw = i2c_master_send(fcu, buf, nb); 480 if (nw > 0 || (nw < 0 && nw != EIO) || tries >= 100) 481 break; 482 msleep(10); 483 ++tries; 484 } 485 if (nw < 0) 486 printk(KERN_ERR "Failure writing to FCU: %d", nw); 487 return nw; 488} 489 490static int start_fcu(void) 491{ 492 unsigned char buf = 0xff; 493 int rc; 494 495 rc = fan_write_reg(0xe, &buf, 1); 496 if (rc < 0) 497 return -EIO; 498 rc = fan_write_reg(0x2e, &buf, 1); 499 if (rc < 0) 500 return -EIO; 501 return 0; 502} 503 504static int set_rpm_fan(int fan_index, int rpm) 505{ 506 unsigned char buf[2]; 507 int rc, id; 508 509 if (fcu_fans[fan_index].type != FCU_FAN_RPM) 510 return -EINVAL; 511 id = fcu_fans[fan_index].id; 512 if (id == FCU_FAN_ABSENT_ID) 513 return -EINVAL; 514 515 if (rpm < 300) 516 rpm = 300; 517 else if (rpm > 8191) 518 rpm = 8191; 519 buf[0] = rpm >> 5; 520 buf[1] = rpm << 3; 521 rc = fan_write_reg(0x10 + (id * 2), buf, 2); 522 if (rc < 0) 523 return -EIO; 524 return 0; 525} 526 527static int get_rpm_fan(int fan_index, int programmed) 528{ 529 unsigned char failure; 530 unsigned char active; 531 unsigned char buf[2]; 532 int rc, id, reg_base; 533 534 if (fcu_fans[fan_index].type != FCU_FAN_RPM) 535 return -EINVAL; 536 id = fcu_fans[fan_index].id; 537 if (id == FCU_FAN_ABSENT_ID) 538 return -EINVAL; 539 540 rc = fan_read_reg(0xb, &failure, 1); 541 if (rc != 1) 542 return -EIO; 543 if ((failure & (1 << id)) != 0) 544 return -EFAULT; 545 rc = fan_read_reg(0xd, &active, 1); 546 if (rc != 1) 547 return -EIO; 548 if ((active & (1 << id)) == 0) 549 return -ENXIO; 550 551 /* Programmed value or real current speed */ 552 reg_base = programmed ? 0x10 : 0x11; 553 rc = fan_read_reg(reg_base + (id * 2), buf, 2); 554 if (rc != 2) 555 return -EIO; 556 557 return (buf[0] << 5) | buf[1] >> 3; 558} 559 560static int set_pwm_fan(int fan_index, int pwm) 561{ 562 unsigned char buf[2]; 563 int rc, id; 564 565 if (fcu_fans[fan_index].type != FCU_FAN_PWM) 566 return -EINVAL; 567 id = fcu_fans[fan_index].id; 568 if (id == FCU_FAN_ABSENT_ID) 569 return -EINVAL; 570 571 if (pwm < 10) 572 pwm = 10; 573 else if (pwm > 100) 574 pwm = 100; 575 pwm = (pwm * 2559) / 1000; 576 buf[0] = pwm; 577 rc = fan_write_reg(0x30 + (id * 2), buf, 1); 578 if (rc < 0) 579 return rc; 580 return 0; 581} 582 583static int get_pwm_fan(int fan_index) 584{ 585 unsigned char failure; 586 unsigned char active; 587 unsigned char buf[2]; 588 int rc, id; 589 590 if (fcu_fans[fan_index].type != FCU_FAN_PWM) 591 return -EINVAL; 592 id = fcu_fans[fan_index].id; 593 if (id == FCU_FAN_ABSENT_ID) 594 return -EINVAL; 595 596 rc = fan_read_reg(0x2b, &failure, 1); 597 if (rc != 1) 598 return -EIO; 599 if ((failure & (1 << id)) != 0) 600 return -EFAULT; 601 rc = fan_read_reg(0x2d, &active, 1); 602 if (rc != 1) 603 return -EIO; 604 if ((active & (1 << id)) == 0) 605 return -ENXIO; 606 607 /* Programmed value or real current speed */ 608 rc = fan_read_reg(0x30 + (id * 2), buf, 1); 609 if (rc != 1) 610 return -EIO; 611 612 return (buf[0] * 1000) / 2559; 613} 614 615/* 616 * Utility routine to read the CPU calibration EEPROM data 617 * from the device-tree 618 */ 619static int read_eeprom(int cpu, struct mpu_data *out) 620{ 621 struct device_node *np; 622 char nodename[64]; 623 u8 *data; 624 int len; 625 626 /* prom.c routine for finding a node by path is a bit brain dead 627 * and requires exact @xxx unit numbers. This is a bit ugly but 628 * will work for these machines 629 */ 630 sprintf(nodename, "/u3@0,f8000000/i2c@f8001000/cpuid@a%d", cpu ? 2 : 0); 631 np = of_find_node_by_path(nodename); 632 if (np == NULL) { 633 printk(KERN_ERR "therm_pm72: Failed to retrieve cpuid node from device-tree\n"); 634 return -ENODEV; 635 } 636 data = (u8 *)get_property(np, "cpuid", &len); 637 if (data == NULL) { 638 printk(KERN_ERR "therm_pm72: Failed to retrieve cpuid property from device-tree\n"); 639 of_node_put(np); 640 return -ENODEV; 641 } 642 memcpy(out, data, sizeof(struct mpu_data)); 643 of_node_put(np); 644 645 return 0; 646} 647 648static void fetch_cpu_pumps_minmax(void) 649{ 650 struct cpu_pid_state *state0 = &cpu_state[0]; 651 struct cpu_pid_state *state1 = &cpu_state[1]; 652 u16 pump_min = 0, pump_max = 0xffff; 653 u16 tmp[4]; 654 655 /* Try to fetch pumps min/max infos from eeprom */ 656 657 memcpy(&tmp, &state0->mpu.processor_part_num, 8); 658 if (tmp[0] != 0xffff && tmp[1] != 0xffff) { 659 pump_min = max(pump_min, tmp[0]); 660 pump_max = min(pump_max, tmp[1]); 661 } 662 if (tmp[2] != 0xffff && tmp[3] != 0xffff) { 663 pump_min = max(pump_min, tmp[2]); 664 pump_max = min(pump_max, tmp[3]); 665 } 666 667 /* Double check the values, this _IS_ needed as the EEPROM on 668 * some dual 2.5Ghz G5s seem, at least, to have both min & max 669 * same to the same value ... (grrrr) 670 */ 671 if (pump_min == pump_max || pump_min == 0 || pump_max == 0xffff) { 672 pump_min = CPU_PUMP_OUTPUT_MIN; 673 pump_max = CPU_PUMP_OUTPUT_MAX; 674 } 675 676 state0->pump_min = state1->pump_min = pump_min; 677 state0->pump_max = state1->pump_max = pump_max; 678} 679 680/* 681 * Now, unfortunately, sysfs doesn't give us a nice void * we could 682 * pass around to the attribute functions, so we don't really have 683 * choice but implement a bunch of them... 684 * 685 * That sucks a bit, we take the lock because FIX32TOPRINT evaluates 686 * the input twice... I accept patches :) 687 */ 688#define BUILD_SHOW_FUNC_FIX(name, data) \ 689static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ 690{ \ 691 ssize_t r; \ 692 down(&driver_lock); \ 693 r = sprintf(buf, "%d.%03d", FIX32TOPRINT(data)); \ 694 up(&driver_lock); \ 695 return r; \ 696} 697#define BUILD_SHOW_FUNC_INT(name, data) \ 698static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ 699{ \ 700 return sprintf(buf, "%d", data); \ 701} 702 703BUILD_SHOW_FUNC_FIX(cpu0_temperature, cpu_state[0].last_temp) 704BUILD_SHOW_FUNC_FIX(cpu0_voltage, cpu_state[0].voltage) 705BUILD_SHOW_FUNC_FIX(cpu0_current, cpu_state[0].current_a) 706BUILD_SHOW_FUNC_INT(cpu0_exhaust_fan_rpm, cpu_state[0].rpm) 707BUILD_SHOW_FUNC_INT(cpu0_intake_fan_rpm, cpu_state[0].intake_rpm) 708 709BUILD_SHOW_FUNC_FIX(cpu1_temperature, cpu_state[1].last_temp) 710BUILD_SHOW_FUNC_FIX(cpu1_voltage, cpu_state[1].voltage) 711BUILD_SHOW_FUNC_FIX(cpu1_current, cpu_state[1].current_a) 712BUILD_SHOW_FUNC_INT(cpu1_exhaust_fan_rpm, cpu_state[1].rpm) 713BUILD_SHOW_FUNC_INT(cpu1_intake_fan_rpm, cpu_state[1].intake_rpm) 714 715BUILD_SHOW_FUNC_FIX(backside_temperature, backside_state.last_temp) 716BUILD_SHOW_FUNC_INT(backside_fan_pwm, backside_state.pwm) 717 718BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) 719BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) 720 721BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp) 722 723static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); 724static DEVICE_ATTR(cpu0_voltage,S_IRUGO,show_cpu0_voltage,NULL); 725static DEVICE_ATTR(cpu0_current,S_IRUGO,show_cpu0_current,NULL); 726static DEVICE_ATTR(cpu0_exhaust_fan_rpm,S_IRUGO,show_cpu0_exhaust_fan_rpm,NULL); 727static DEVICE_ATTR(cpu0_intake_fan_rpm,S_IRUGO,show_cpu0_intake_fan_rpm,NULL); 728 729static DEVICE_ATTR(cpu1_temperature,S_IRUGO,show_cpu1_temperature,NULL); 730static DEVICE_ATTR(cpu1_voltage,S_IRUGO,show_cpu1_voltage,NULL); 731static DEVICE_ATTR(cpu1_current,S_IRUGO,show_cpu1_current,NULL); 732static DEVICE_ATTR(cpu1_exhaust_fan_rpm,S_IRUGO,show_cpu1_exhaust_fan_rpm,NULL); 733static DEVICE_ATTR(cpu1_intake_fan_rpm,S_IRUGO,show_cpu1_intake_fan_rpm,NULL); 734 735static DEVICE_ATTR(backside_temperature,S_IRUGO,show_backside_temperature,NULL); 736static DEVICE_ATTR(backside_fan_pwm,S_IRUGO,show_backside_fan_pwm,NULL); 737 738static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); 739static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); 740 741static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL); 742 743/* 744 * CPUs fans control loop 745 */ 746 747static int do_read_one_cpu_values(struct cpu_pid_state *state, s32 *temp, s32 *power) 748{ 749 s32 ltemp, volts, amps; 750 int index, rc = 0; 751 752 /* Default (in case of error) */ 753 *temp = state->cur_temp; 754 *power = state->cur_power; 755 756 if (cpu_pid_type == CPU_PID_TYPE_RACKMAC) 757 index = (state->index == 0) ? 758 CPU_A1_FAN_RPM_INDEX : CPU_B1_FAN_RPM_INDEX; 759 else 760 index = (state->index == 0) ? 761 CPUA_EXHAUST_FAN_RPM_INDEX : CPUB_EXHAUST_FAN_RPM_INDEX; 762 763 /* Read current fan status */ 764 rc = get_rpm_fan(index, !RPM_PID_USE_ACTUAL_SPEED); 765 if (rc < 0) { 766 /* XXX What do we do now ? Nothing for now, keep old value, but 767 * return error upstream 768 */ 769 DBG(" cpu %d, fan reading error !\n", state->index); 770 } else { 771 state->rpm = rc; 772 DBG(" cpu %d, exhaust RPM: %d\n", state->index, state->rpm); 773 } 774 775 /* Get some sensor readings and scale it */ 776 ltemp = read_smon_adc(state, 1); 777 if (ltemp == -1) { 778 /* XXX What do we do now ? */ 779 state->overtemp++; 780 if (rc == 0) 781 rc = -EIO; 782 DBG(" cpu %d, temp reading error !\n", state->index); 783 } else { 784 /* Fixup temperature according to diode calibration 785 */ 786 DBG(" cpu %d, temp raw: %04x, m_diode: %04x, b_diode: %04x\n", 787 state->index, 788 ltemp, state->mpu.mdiode, state->mpu.bdiode); 789 *temp = ((s32)ltemp * (s32)state->mpu.mdiode + ((s32)state->mpu.bdiode << 12)) >> 2; 790 state->last_temp = *temp; 791 DBG(" temp: %d.%03d\n", FIX32TOPRINT((*temp))); 792 } 793 794 /* 795 * Read voltage & current and calculate power 796 */ 797 volts = read_smon_adc(state, 3); 798 amps = read_smon_adc(state, 4); 799 800 /* Scale voltage and current raw sensor values according to fixed scales 801 * obtained in Darwin and calculate power from I and V 802 */ 803 volts *= ADC_CPU_VOLTAGE_SCALE; 804 amps *= ADC_CPU_CURRENT_SCALE; 805 *power = (((u64)volts) * ((u64)amps)) >> 16; 806 state->voltage = volts; 807 state->current_a = amps; 808 state->last_power = *power; 809 810 DBG(" cpu %d, current: %d.%03d, voltage: %d.%03d, power: %d.%03d W\n", 811 state->index, FIX32TOPRINT(state->current_a), 812 FIX32TOPRINT(state->voltage), FIX32TOPRINT(*power)); 813 814 return 0; 815} 816 817static void do_cpu_pid(struct cpu_pid_state *state, s32 temp, s32 power) 818{ 819 s32 power_target, integral, derivative, proportional, adj_in_target, sval; 820 s64 integ_p, deriv_p, prop_p, sum; 821 int i; 822 823 /* Calculate power target value (could be done once for all) 824 * and convert to a 16.16 fp number 825 */ 826 power_target = ((u32)(state->mpu.pmaxh - state->mpu.padjmax)) << 16; 827 DBG(" power target: %d.%03d, error: %d.%03d\n", 828 FIX32TOPRINT(power_target), FIX32TOPRINT(power_target - power)); 829 830 /* Store temperature and power in history array */ 831 state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; 832 state->temp_history[state->cur_temp] = temp; 833 state->cur_power = (state->cur_power + 1) % state->count_power; 834 state->power_history[state->cur_power] = power; 835 state->error_history[state->cur_power] = power_target - power; 836 837 /* If first loop, fill the history table */ 838 if (state->first) { 839 for (i = 0; i < (state->count_power - 1); i++) { 840 state->cur_power = (state->cur_power + 1) % state->count_power; 841 state->power_history[state->cur_power] = power; 842 state->error_history[state->cur_power] = power_target - power; 843 } 844 for (i = 0; i < (CPU_TEMP_HISTORY_SIZE - 1); i++) { 845 state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; 846 state->temp_history[state->cur_temp] = temp; 847 } 848 state->first = 0; 849 } 850 851 /* Calculate the integral term normally based on the "power" values */ 852 sum = 0; 853 integral = 0; 854 for (i = 0; i < state->count_power; i++) 855 integral += state->error_history[i]; 856 integral *= CPU_PID_INTERVAL; 857 DBG(" integral: %08x\n", integral); 858 859 /* Calculate the adjusted input (sense value). 860 * G_r is 12.20 861 * integ is 16.16 862 * so the result is 28.36 863 * 864 * input target is mpu.ttarget, input max is mpu.tmax 865 */ 866 integ_p = ((s64)state->mpu.pid_gr) * (s64)integral; 867 DBG(" integ_p: %d\n", (int)(integ_p >> 36)); 868 sval = (state->mpu.tmax << 16) - ((integ_p >> 20) & 0xffffffff); 869 adj_in_target = (state->mpu.ttarget << 16); 870 if (adj_in_target > sval) 871 adj_in_target = sval; 872 DBG(" adj_in_target: %d.%03d, ttarget: %d\n", FIX32TOPRINT(adj_in_target), 873 state->mpu.ttarget); 874 875 /* Calculate the derivative term */ 876 derivative = state->temp_history[state->cur_temp] - 877 state->temp_history[(state->cur_temp + CPU_TEMP_HISTORY_SIZE - 1) 878 % CPU_TEMP_HISTORY_SIZE]; 879 derivative /= CPU_PID_INTERVAL; 880 deriv_p = ((s64)state->mpu.pid_gd) * (s64)derivative; 881 DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); 882 sum += deriv_p; 883 884 /* Calculate the proportional term */ 885 proportional = temp - adj_in_target; 886 prop_p = ((s64)state->mpu.pid_gp) * (s64)proportional; 887 DBG(" prop_p: %d\n", (int)(prop_p >> 36)); 888 sum += prop_p; 889 890 /* Scale sum */ 891 sum >>= 36; 892 893 DBG(" sum: %d\n", (int)sum); 894 state->rpm += (s32)sum; 895} 896 897static void do_monitor_cpu_combined(void) 898{ 899 struct cpu_pid_state *state0 = &cpu_state[0]; 900 struct cpu_pid_state *state1 = &cpu_state[1]; 901 s32 temp0, power0, temp1, power1; 902 s32 temp_combi, power_combi; 903 int rc, intake, pump; 904 905 rc = do_read_one_cpu_values(state0, &temp0, &power0); 906 if (rc < 0) { 907 /* XXX What do we do now ? */ 908 } 909 state1->overtemp = 0; 910 rc = do_read_one_cpu_values(state1, &temp1, &power1); 911 if (rc < 0) { 912 /* XXX What do we do now ? */ 913 } 914 if (state1->overtemp) 915 state0->overtemp++; 916 917 temp_combi = max(temp0, temp1); 918 power_combi = max(power0, power1); 919 920 /* Check tmax, increment overtemp if we are there. At tmax+8, we go 921 * full blown immediately and try to trigger a shutdown 922 */ 923 if (temp_combi >= ((state0->mpu.tmax + 8) << 16)) { 924 printk(KERN_WARNING "Warning ! Temperature way above maximum (%d) !\n", 925 temp_combi >> 16); 926 state0->overtemp += CPU_MAX_OVERTEMP / 4; 927 } else if (temp_combi > (state0->mpu.tmax << 16)) 928 state0->overtemp++; 929 else 930 state0->overtemp = 0; 931 if (state0->overtemp >= CPU_MAX_OVERTEMP) 932 critical_state = 1; 933 if (state0->overtemp > 0) { 934 state0->rpm = state0->mpu.rmaxn_exhaust_fan; 935 state0->intake_rpm = intake = state0->mpu.rmaxn_intake_fan; 936 pump = state0->pump_max; 937 goto do_set_fans; 938 } 939 940 /* Do the PID */ 941 do_cpu_pid(state0, temp_combi, power_combi); 942 943 /* Range check */ 944 state0->rpm = max(state0->rpm, (int)state0->mpu.rminn_exhaust_fan); 945 state0->rpm = min(state0->rpm, (int)state0->mpu.rmaxn_exhaust_fan); 946 947 /* Calculate intake fan speed */ 948 intake = (state0->rpm * CPU_INTAKE_SCALE) >> 16; 949 intake = max(intake, (int)state0->mpu.rminn_intake_fan); 950 intake = min(intake, (int)state0->mpu.rmaxn_intake_fan); 951 state0->intake_rpm = intake; 952 953 /* Calculate pump speed */ 954 pump = (state0->rpm * state0->pump_max) / 955 state0->mpu.rmaxn_exhaust_fan; 956 pump = min(pump, state0->pump_max); 957 pump = max(pump, state0->pump_min); 958 959 do_set_fans: 960 /* We copy values from state 0 to state 1 for /sysfs */ 961 state1->rpm = state0->rpm; 962 state1->intake_rpm = state0->intake_rpm; 963 964 DBG("** CPU %d RPM: %d Ex, %d, Pump: %d, In, overtemp: %d\n", 965 state1->index, (int)state1->rpm, intake, pump, state1->overtemp); 966 967 /* We should check for errors, shouldn't we ? But then, what 968 * do we do once the error occurs ? For FCU notified fan 969 * failures (-EFAULT) we probably want to notify userland 970 * some way... 971 */ 972 set_rpm_fan(CPUA_INTAKE_FAN_RPM_INDEX, intake); 973 set_rpm_fan(CPUA_EXHAUST_FAN_RPM_INDEX, state0->rpm); 974 set_rpm_fan(CPUB_INTAKE_FAN_RPM_INDEX, intake); 975 set_rpm_fan(CPUB_EXHAUST_FAN_RPM_INDEX, state0->rpm); 976 977 if (fcu_fans[CPUA_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) 978 set_rpm_fan(CPUA_PUMP_RPM_INDEX, pump); 979 if (fcu_fans[CPUB_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) 980 set_rpm_fan(CPUB_PUMP_RPM_INDEX, pump); 981} 982 983static void do_monitor_cpu_split(struct cpu_pid_state *state) 984{ 985 s32 temp, power; 986 int rc, intake; 987 988 /* Read current fan status */ 989 rc = do_read_one_cpu_values(state, &temp, &power); 990 if (rc < 0) { 991 /* XXX What do we do now ? */ 992 } 993 994 /* Check tmax, increment overtemp if we are there. At tmax+8, we go 995 * full blown immediately and try to trigger a shutdown 996 */ 997 if (temp >= ((state->mpu.tmax + 8) << 16)) { 998 printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum" 999 " (%d) !\n", 1000 state->index, temp >> 16); 1001 state->overtemp += CPU_MAX_OVERTEMP / 4; 1002 } else if (temp > (state->mpu.tmax << 16)) 1003 state->overtemp++; 1004 else 1005 state->overtemp = 0; 1006 if (state->overtemp >= CPU_MAX_OVERTEMP) 1007 critical_state = 1; 1008 if (state->overtemp > 0) { 1009 state->rpm = state->mpu.rmaxn_exhaust_fan; 1010 state->intake_rpm = intake = state->mpu.rmaxn_intake_fan; 1011 goto do_set_fans; 1012 } 1013 1014 /* Do the PID */ 1015 do_cpu_pid(state, temp, power); 1016 1017 /* Range check */ 1018 state->rpm = max(state->rpm, (int)state->mpu.rminn_exhaust_fan); 1019 state->rpm = min(state->rpm, (int)state->mpu.rmaxn_exhaust_fan); 1020 1021 /* Calculate intake fan */ 1022 intake = (state->rpm * CPU_INTAKE_SCALE) >> 16; 1023 intake = max(intake, (int)state->mpu.rminn_intake_fan); 1024 intake = min(intake, (int)state->mpu.rmaxn_intake_fan); 1025 state->intake_rpm = intake; 1026 1027 do_set_fans: 1028 DBG("** CPU %d RPM: %d Ex, %d In, overtemp: %d\n", 1029 state->index, (int)state->rpm, intake, state->overtemp); 1030 1031 /* We should check for errors, shouldn't we ? But then, what 1032 * do we do once the error occurs ? For FCU notified fan 1033 * failures (-EFAULT) we probably want to notify userland 1034 * some way... 1035 */ 1036 if (state->index == 0) { 1037 set_rpm_fan(CPUA_INTAKE_FAN_RPM_INDEX, intake); 1038 set_rpm_fan(CPUA_EXHAUST_FAN_RPM_INDEX, state->rpm); 1039 } else { 1040 set_rpm_fan(CPUB_INTAKE_FAN_RPM_INDEX, intake); 1041 set_rpm_fan(CPUB_EXHAUST_FAN_RPM_INDEX, state->rpm); 1042 } 1043} 1044 1045static void do_monitor_cpu_rack(struct cpu_pid_state *state) 1046{ 1047 s32 temp, power, fan_min; 1048 int rc; 1049 1050 /* Read current fan status */ 1051 rc = do_read_one_cpu_values(state, &temp, &power); 1052 if (rc < 0) { 1053 /* XXX What do we do now ? */ 1054 } 1055 1056 /* Check tmax, increment overtemp if we are there. At tmax+8, we go 1057 * full blown immediately and try to trigger a shutdown 1058 */ 1059 if (temp >= ((state->mpu.tmax + 8) << 16)) { 1060 printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum" 1061 " (%d) !\n", 1062 state->index, temp >> 16); 1063 state->overtemp = CPU_MAX_OVERTEMP / 4; 1064 } else if (temp > (state->mpu.tmax << 16)) 1065 state->overtemp++; 1066 else 1067 state->overtemp = 0; 1068 if (state->overtemp >= CPU_MAX_OVERTEMP) 1069 critical_state = 1; 1070 if (state->overtemp > 0) { 1071 state->rpm = state->intake_rpm = state->mpu.rmaxn_intake_fan; 1072 goto do_set_fans; 1073 } 1074 1075 /* Do the PID */ 1076 do_cpu_pid(state, temp, power); 1077 1078 /* Check clamp from dimms */ 1079 fan_min = dimm_output_clamp; 1080 fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan); 1081 1082 state->rpm = max(state->rpm, (int)fan_min); 1083 state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan); 1084 state->intake_rpm = state->rpm; 1085 1086 do_set_fans: 1087 DBG("** CPU %d RPM: %d overtemp: %d\n", 1088 state->index, (int)state->rpm, state->overtemp); 1089 1090 /* We should check for errors, shouldn't we ? But then, what 1091 * do we do once the error occurs ? For FCU notified fan 1092 * failures (-EFAULT) we probably want to notify userland 1093 * some way... 1094 */ 1095 if (state->index == 0) { 1096 set_rpm_fan(CPU_A1_FAN_RPM_INDEX, state->rpm); 1097 set_rpm_fan(CPU_A2_FAN_RPM_INDEX, state->rpm); 1098 set_rpm_fan(CPU_A3_FAN_RPM_INDEX, state->rpm); 1099 } else { 1100 set_rpm_fan(CPU_B1_FAN_RPM_INDEX, state->rpm); 1101 set_rpm_fan(CPU_B2_FAN_RPM_INDEX, state->rpm); 1102 set_rpm_fan(CPU_B3_FAN_RPM_INDEX, state->rpm); 1103 } 1104} 1105 1106/* 1107 * Initialize the state structure for one CPU control loop 1108 */ 1109static int init_cpu_state(struct cpu_pid_state *state, int index) 1110{ 1111 state->index = index; 1112 state->first = 1; 1113 state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000; 1114 state->overtemp = 0; 1115 state->adc_config = 0x00; 1116 1117 1118 if (index == 0) 1119 state->monitor = attach_i2c_chip(SUPPLY_MONITOR_ID, "CPU0_monitor"); 1120 else if (index == 1) 1121 state->monitor = attach_i2c_chip(SUPPLY_MONITORB_ID, "CPU1_monitor"); 1122 if (state->monitor == NULL) 1123 goto fail; 1124 1125 if (read_eeprom(index, &state->mpu)) 1126 goto fail; 1127 1128 state->count_power = state->mpu.tguardband; 1129 if (state->count_power > CPU_POWER_HISTORY_SIZE) { 1130 printk(KERN_WARNING "Warning ! too many power history slots\n"); 1131 state->count_power = CPU_POWER_HISTORY_SIZE; 1132 } 1133 DBG("CPU %d Using %d power history entries\n", index, state->count_power); 1134 1135 if (index == 0) { 1136 device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature); 1137 device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage); 1138 device_create_file(&of_dev->dev, &dev_attr_cpu0_current); 1139 device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); 1140 device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); 1141 } else { 1142 device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature); 1143 device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage); 1144 device_create_file(&of_dev->dev, &dev_attr_cpu1_current); 1145 device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); 1146 device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); 1147 } 1148 1149 return 0; 1150 fail: 1151 if (state->monitor) 1152 detach_i2c_chip(state->monitor); 1153 state->monitor = NULL; 1154 1155 return -ENODEV; 1156} 1157 1158/* 1159 * Dispose of the state data for one CPU control loop 1160 */ 1161static void dispose_cpu_state(struct cpu_pid_state *state) 1162{ 1163 if (state->monitor == NULL) 1164 return; 1165 1166 if (state->index == 0) { 1167 device_remove_file(&of_dev->dev, &dev_attr_cpu0_temperature); 1168 device_remove_file(&of_dev->dev, &dev_attr_cpu0_voltage); 1169 device_remove_file(&of_dev->dev, &dev_attr_cpu0_current); 1170 device_remove_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); 1171 device_remove_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); 1172 } else { 1173 device_remove_file(&of_dev->dev, &dev_attr_cpu1_temperature); 1174 device_remove_file(&of_dev->dev, &dev_attr_cpu1_voltage); 1175 device_remove_file(&of_dev->dev, &dev_attr_cpu1_current); 1176 device_remove_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); 1177 device_remove_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); 1178 } 1179 1180 detach_i2c_chip(state->monitor); 1181 state->monitor = NULL; 1182} 1183 1184/* 1185 * Motherboard backside & U3 heatsink fan control loop 1186 */ 1187static void do_monitor_backside(struct backside_pid_state *state) 1188{ 1189 s32 temp, integral, derivative, fan_min; 1190 s64 integ_p, deriv_p, prop_p, sum; 1191 int i, rc; 1192 1193 if (--state->ticks != 0) 1194 return; 1195 state->ticks = backside_params.interval; 1196 1197 DBG("backside:\n"); 1198 1199 /* Check fan status */ 1200 rc = get_pwm_fan(BACKSIDE_FAN_PWM_INDEX); 1201 if (rc < 0) { 1202 printk(KERN_WARNING "Error %d reading backside fan !\n", rc); 1203 /* XXX What do we do now ? */ 1204 } else 1205 state->pwm = rc; 1206 DBG(" current pwm: %d\n", state->pwm); 1207 1208 /* Get some sensor readings */ 1209 temp = i2c_smbus_read_byte_data(state->monitor, MAX6690_EXT_TEMP) << 16; 1210 state->last_temp = temp; 1211 DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), 1212 FIX32TOPRINT(backside_params.input_target)); 1213 1214 /* Store temperature and error in history array */ 1215 state->cur_sample = (state->cur_sample + 1) % BACKSIDE_PID_HISTORY_SIZE; 1216 state->sample_history[state->cur_sample] = temp; 1217 state->error_history[state->cur_sample] = temp - backside_params.input_target; 1218 1219 /* If first loop, fill the history table */ 1220 if (state->first) { 1221 for (i = 0; i < (BACKSIDE_PID_HISTORY_SIZE - 1); i++) { 1222 state->cur_sample = (state->cur_sample + 1) % 1223 BACKSIDE_PID_HISTORY_SIZE; 1224 state->sample_history[state->cur_sample] = temp; 1225 state->error_history[state->cur_sample] = 1226 temp - backside_params.input_target; 1227 } 1228 state->first = 0; 1229 } 1230 1231 /* Calculate the integral term */ 1232 sum = 0; 1233 integral = 0; 1234 for (i = 0; i < BACKSIDE_PID_HISTORY_SIZE; i++) 1235 integral += state->error_history[i]; 1236 integral *= backside_params.interval; 1237 DBG(" integral: %08x\n", integral); 1238 integ_p = ((s64)backside_params.G_r) * (s64)integral; 1239 DBG(" integ_p: %d\n", (int)(integ_p >> 36)); 1240 sum += integ_p; 1241 1242 /* Calculate the derivative term */ 1243 derivative = state->error_history[state->cur_sample] - 1244 state->error_history[(state->cur_sample + BACKSIDE_PID_HISTORY_SIZE - 1) 1245 % BACKSIDE_PID_HISTORY_SIZE]; 1246 derivative /= backside_params.interval; 1247 deriv_p = ((s64)backside_params.G_d) * (s64)derivative; 1248 DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); 1249 sum += deriv_p; 1250 1251 /* Calculate the proportional term */ 1252 prop_p = ((s64)backside_params.G_p) * (s64)(state->error_history[state->cur_sample]); 1253 DBG(" prop_p: %d\n", (int)(prop_p >> 36)); 1254 sum += prop_p; 1255 1256 /* Scale sum */ 1257 sum >>= 36; 1258 1259 DBG(" sum: %d\n", (int)sum); 1260 if (backside_params.additive) 1261 state->pwm += (s32)sum; 1262 else 1263 state->pwm = sum; 1264 1265 /* Check for clamp */ 1266 fan_min = (dimm_output_clamp * 100) / 14000; 1267 fan_min = max(fan_min, backside_params.output_min); 1268 1269 state->pwm = max(state->pwm, fan_min); 1270 state->pwm = min(state->pwm, backside_params.output_max); 1271 1272 DBG("** BACKSIDE PWM: %d\n", (int)state->pwm); 1273 set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, state->pwm); 1274} 1275 1276/* 1277 * Initialize the state structure for the backside fan control loop 1278 */ 1279static int init_backside_state(struct backside_pid_state *state) 1280{ 1281 struct device_node *u3; 1282 int u3h = 1; /* conservative by default */ 1283 1284 /* 1285 * There are different PID params for machines with U3 and machines 1286 * with U3H, pick the right ones now 1287 */ 1288 u3 = of_find_node_by_path("/u3@0,f8000000"); 1289 if (u3 != NULL) { 1290 u32 *vers = (u32 *)get_property(u3, "device-rev", NULL); 1291 if (vers) 1292 if (((*vers) & 0x3f) < 0x34) 1293 u3h = 0; 1294 of_node_put(u3); 1295 } 1296 1297 if (rackmac) { 1298 backside_params.G_d = BACKSIDE_PID_RACK_G_d; 1299 backside_params.input_target = BACKSIDE_PID_RACK_INPUT_TARGET; 1300 backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN; 1301 backside_params.interval = BACKSIDE_PID_RACK_INTERVAL; 1302 backside_params.G_p = BACKSIDE_PID_RACK_G_p; 1303 backside_params.G_r = BACKSIDE_PID_G_r; 1304 backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; 1305 backside_params.additive = 0; 1306 } else if (u3h) { 1307 backside_params.G_d = BACKSIDE_PID_U3H_G_d; 1308 backside_params.input_target = BACKSIDE_PID_U3H_INPUT_TARGET; 1309 backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN; 1310 backside_params.interval = BACKSIDE_PID_INTERVAL; 1311 backside_params.G_p = BACKSIDE_PID_G_p; 1312 backside_params.G_r = BACKSIDE_PID_G_r; 1313 backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; 1314 backside_params.additive = 1; 1315 } else { 1316 backside_params.G_d = BACKSIDE_PID_U3_G_d; 1317 backside_params.input_target = BACKSIDE_PID_U3_INPUT_TARGET; 1318 backside_params.output_min = BACKSIDE_PID_U3_OUTPUT_MIN; 1319 backside_params.interval = BACKSIDE_PID_INTERVAL; 1320 backside_params.G_p = BACKSIDE_PID_G_p; 1321 backside_params.G_r = BACKSIDE_PID_G_r; 1322 backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; 1323 backside_params.additive = 1; 1324 } 1325 1326 state->ticks = 1; 1327 state->first = 1; 1328 state->pwm = 50; 1329 1330 state->monitor = attach_i2c_chip(BACKSIDE_MAX_ID, "backside_temp"); 1331 if (state->monitor == NULL) 1332 return -ENODEV; 1333 1334 device_create_file(&of_dev->dev, &dev_attr_backside_temperature); 1335 device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm); 1336 1337 return 0; 1338} 1339 1340/* 1341 * Dispose of the state data for the backside control loop 1342 */ 1343static void dispose_backside_state(struct backside_pid_state *state) 1344{ 1345 if (state->monitor == NULL) 1346 return; 1347 1348 device_remove_file(&of_dev->dev, &dev_attr_backside_temperature); 1349 device_remove_file(&of_dev->dev, &dev_attr_backside_fan_pwm); 1350 1351 detach_i2c_chip(state->monitor); 1352 state->monitor = NULL; 1353} 1354 1355/* 1356 * Drives bay fan control loop 1357 */ 1358static void do_monitor_drives(struct drives_pid_state *state) 1359{ 1360 s32 temp, integral, derivative; 1361 s64 integ_p, deriv_p, prop_p, sum; 1362 int i, rc; 1363 1364 if (--state->ticks != 0) 1365 return; 1366 state->ticks = DRIVES_PID_INTERVAL; 1367 1368 DBG("drives:\n"); 1369 1370 /* Check fan status */ 1371 rc = get_rpm_fan(DRIVES_FAN_RPM_INDEX, !RPM_PID_USE_ACTUAL_SPEED); 1372 if (rc < 0) { 1373 printk(KERN_WARNING "Error %d reading drives fan !\n", rc); 1374 /* XXX What do we do now ? */ 1375 } else 1376 state->rpm = rc; 1377 DBG(" current rpm: %d\n", state->rpm); 1378 1379 /* Get some sensor readings */ 1380 temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, DS1775_TEMP)) << 8; 1381 state->last_temp = temp; 1382 DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), 1383 FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); 1384 1385 /* Store temperature and error in history array */ 1386 state->cur_sample = (state->cur_sample + 1) % DRIVES_PID_HISTORY_SIZE; 1387 state->sample_history[state->cur_sample] = temp; 1388 state->error_history[state->cur_sample] = temp - DRIVES_PID_INPUT_TARGET; 1389 1390 /* If first loop, fill the history table */ 1391 if (state->first) { 1392 for (i = 0; i < (DRIVES_PID_HISTORY_SIZE - 1); i++) { 1393 state->cur_sample = (state->cur_sample + 1) % 1394 DRIVES_PID_HISTORY_SIZE; 1395 state->sample_history[state->cur_sample] = temp; 1396 state->error_history[state->cur_sample] = 1397 temp - DRIVES_PID_INPUT_TARGET; 1398 } 1399 state->first = 0; 1400 } 1401 1402 /* Calculate the integral term */ 1403 sum = 0; 1404 integral = 0; 1405 for (i = 0; i < DRIVES_PID_HISTORY_SIZE; i++) 1406 integral += state->error_history[i]; 1407 integral *= DRIVES_PID_INTERVAL; 1408 DBG(" integral: %08x\n", integral); 1409 integ_p = ((s64)DRIVES_PID_G_r) * (s64)integral; 1410 DBG(" integ_p: %d\n", (int)(integ_p >> 36)); 1411 sum += integ_p; 1412 1413 /* Calculate the derivative term */ 1414 derivative = state->error_history[state->cur_sample] - 1415 state->error_history[(state->cur_sample + DRIVES_PID_HISTORY_SIZE - 1) 1416 % DRIVES_PID_HISTORY_SIZE]; 1417 derivative /= DRIVES_PID_INTERVAL; 1418 deriv_p = ((s64)DRIVES_PID_G_d) * (s64)derivative; 1419 DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); 1420 sum += deriv_p; 1421 1422 /* Calculate the proportional term */ 1423 prop_p = ((s64)DRIVES_PID_G_p) * (s64)(state->error_history[state->cur_sample]); 1424 DBG(" prop_p: %d\n", (int)(prop_p >> 36)); 1425 sum += prop_p; 1426 1427 /* Scale sum */ 1428 sum >>= 36; 1429 1430 DBG(" sum: %d\n", (int)sum); 1431 state->rpm += (s32)sum; 1432 1433 state->rpm = max(state->rpm, DRIVES_PID_OUTPUT_MIN); 1434 state->rpm = min(state->rpm, DRIVES_PID_OUTPUT_MAX); 1435 1436 DBG("** DRIVES RPM: %d\n", (int)state->rpm); 1437 set_rpm_fan(DRIVES_FAN_RPM_INDEX, state->rpm); 1438} 1439 1440/* 1441 * Initialize the state structure for the drives bay fan control loop 1442 */ 1443static int init_drives_state(struct drives_pid_state *state) 1444{ 1445 state->ticks = 1; 1446 state->first = 1; 1447 state->rpm = 1000; 1448 1449 state->monitor = attach_i2c_chip(DRIVES_DALLAS_ID, "drives_temp"); 1450 if (state->monitor == NULL) 1451 return -ENODEV; 1452 1453 device_create_file(&of_dev->dev, &dev_attr_drives_temperature); 1454 device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm); 1455 1456 return 0; 1457} 1458 1459/* 1460 * Dispose of the state data for the drives control loop 1461 */ 1462static void dispose_drives_state(struct drives_pid_state *state) 1463{ 1464 if (state->monitor == NULL) 1465 return; 1466 1467 device_remove_file(&of_dev->dev, &dev_attr_drives_temperature); 1468 device_remove_file(&of_dev->dev, &dev_attr_drives_fan_rpm); 1469 1470 detach_i2c_chip(state->monitor); 1471 state->monitor = NULL; 1472} 1473 1474/* 1475 * DIMMs temp control loop 1476 */ 1477static void do_monitor_dimms(struct dimm_pid_state *state) 1478{ 1479 s32 temp, integral, derivative, fan_min; 1480 s64 integ_p, deriv_p, prop_p, sum; 1481 int i; 1482 1483 if (--state->ticks != 0) 1484 return; 1485 state->ticks = DIMM_PID_INTERVAL; 1486 1487 DBG("DIMM:\n"); 1488 1489 DBG(" current value: %d\n", state->output); 1490 1491 temp = read_lm87_reg(state->monitor, LM87_INT_TEMP); 1492 if (temp < 0) 1493 return; 1494 temp <<= 16; 1495 state->last_temp = temp; 1496 DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), 1497 FIX32TOPRINT(DIMM_PID_INPUT_TARGET)); 1498 1499 /* Store temperature and error in history array */ 1500 state->cur_sample = (state->cur_sample + 1) % DIMM_PID_HISTORY_SIZE; 1501 state->sample_history[state->cur_sample] = temp; 1502 state->error_history[state->cur_sample] = temp - DIMM_PID_INPUT_TARGET; 1503 1504 /* If first loop, fill the history table */ 1505 if (state->first) { 1506 for (i = 0; i < (DIMM_PID_HISTORY_SIZE - 1); i++) { 1507 state->cur_sample = (state->cur_sample + 1) % 1508 DIMM_PID_HISTORY_SIZE; 1509 state->sample_history[state->cur_sample] = temp; 1510 state->error_history[state->cur_sample] = 1511 temp - DIMM_PID_INPUT_TARGET; 1512 } 1513 state->first = 0; 1514 } 1515 1516 /* Calculate the integral term */ 1517 sum = 0; 1518 integral = 0; 1519 for (i = 0; i < DIMM_PID_HISTORY_SIZE; i++) 1520 integral += state->error_history[i]; 1521 integral *= DIMM_PID_INTERVAL; 1522 DBG(" integral: %08x\n", integral); 1523 integ_p = ((s64)DIMM_PID_G_r) * (s64)integral; 1524 DBG(" integ_p: %d\n", (int)(integ_p >> 36)); 1525 sum += integ_p; 1526 1527 /* Calculate the derivative term */ 1528 derivative = state->error_history[state->cur_sample] - 1529 state->error_history[(state->cur_sample + DIMM_PID_HISTORY_SIZE - 1) 1530 % DIMM_PID_HISTORY_SIZE]; 1531 derivative /= DIMM_PID_INTERVAL; 1532 deriv_p = ((s64)DIMM_PID_G_d) * (s64)derivative; 1533 DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); 1534 sum += deriv_p; 1535 1536 /* Calculate the proportional term */ 1537 prop_p = ((s64)DIMM_PID_G_p) * (s64)(state->error_history[state->cur_sample]); 1538 DBG(" prop_p: %d\n", (int)(prop_p >> 36)); 1539 sum += prop_p; 1540 1541 /* Scale sum */ 1542 sum >>= 36; 1543 1544 DBG(" sum: %d\n", (int)sum); 1545 state->output = (s32)sum; 1546 state->output = max(state->output, DIMM_PID_OUTPUT_MIN); 1547 state->output = min(state->output, DIMM_PID_OUTPUT_MAX); 1548 dimm_output_clamp = state->output; 1549 1550 DBG("** DIMM clamp value: %d\n", (int)state->output); 1551 1552 /* Backside PID is only every 5 seconds, force backside fan clamping now */ 1553 fan_min = (dimm_output_clamp * 100) / 14000; 1554 fan_min = max(fan_min, backside_params.output_min); 1555 if (backside_state.pwm < fan_min) { 1556 backside_state.pwm = fan_min; 1557 DBG(" -> applying clamp to backside fan now: %d !\n", fan_min); 1558 set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, fan_min); 1559 } 1560} 1561 1562/* 1563 * Initialize the state structure for the DIMM temp control loop 1564 */ 1565static int init_dimms_state(struct dimm_pid_state *state) 1566{ 1567 state->ticks = 1; 1568 state->first = 1; 1569 state->output = 4000; 1570 1571 state->monitor = attach_i2c_chip(XSERVE_DIMMS_LM87, "dimms_temp"); 1572 if (state->monitor == NULL) 1573 return -ENODEV; 1574 1575 device_create_file(&of_dev->dev, &dev_attr_dimms_temperature); 1576 1577 return 0; 1578} 1579 1580/* 1581 * Dispose of the state data for the drives control loop 1582 */ 1583static void dispose_dimms_state(struct dimm_pid_state *state) 1584{ 1585 if (state->monitor == NULL) 1586 return; 1587 1588 device_remove_file(&of_dev->dev, &dev_attr_dimms_temperature); 1589 1590 detach_i2c_chip(state->monitor); 1591 state->monitor = NULL; 1592} 1593 1594static int call_critical_overtemp(void) 1595{ 1596 char *argv[] = { critical_overtemp_path, NULL }; 1597 static char *envp[] = { "HOME=/", 1598 "TERM=linux", 1599 "PATH=/sbin:/usr/sbin:/bin:/usr/bin", 1600 NULL }; 1601 1602 return call_usermodehelper(critical_overtemp_path, argv, envp, 0); 1603} 1604 1605 1606/* 1607 * Here's the kernel thread that calls the various control loops 1608 */ 1609static int main_control_loop(void *x) 1610{ 1611 daemonize("kfand"); 1612 1613 DBG("main_control_loop started\n"); 1614 1615 down(&driver_lock); 1616 1617 if (start_fcu() < 0) { 1618 printk(KERN_ERR "kfand: failed to start FCU\n"); 1619 up(&driver_lock); 1620 goto out; 1621 } 1622 1623 /* Set the PCI fan once for now */ 1624 set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); 1625 1626 /* Initialize ADCs */ 1627 initialize_adc(&cpu_state[0]); 1628 if (cpu_state[1].monitor != NULL) 1629 initialize_adc(&cpu_state[1]); 1630 1631 up(&driver_lock); 1632 1633 while (state == state_attached) { 1634 unsigned long elapsed, start; 1635 1636 start = jiffies; 1637 1638 down(&driver_lock); 1639 1640 /* First, we always calculate the new DIMMs state on an Xserve */ 1641 if (rackmac) 1642 do_monitor_dimms(&dimms_state); 1643 1644 /* Then, the CPUs */ 1645 if (cpu_pid_type == CPU_PID_TYPE_COMBINED) 1646 do_monitor_cpu_combined(); 1647 else if (cpu_pid_type == CPU_PID_TYPE_RACKMAC) { 1648 do_monitor_cpu_rack(&cpu_state[0]); 1649 if (cpu_state[1].monitor != NULL) 1650 do_monitor_cpu_rack(&cpu_state[1]); 1651 // better deal with UP 1652 } else { 1653 do_monitor_cpu_split(&cpu_state[0]); 1654 if (cpu_state[1].monitor != NULL) 1655 do_monitor_cpu_split(&cpu_state[1]); 1656 // better deal with UP 1657 } 1658 /* Then, the rest */ 1659 do_monitor_backside(&backside_state); 1660 if (!rackmac) 1661 do_monitor_drives(&drives_state); 1662 up(&driver_lock); 1663 1664 if (critical_state == 1) { 1665 printk(KERN_WARNING "Temperature control detected a critical condition\n"); 1666 printk(KERN_WARNING "Attempting to shut down...\n"); 1667 if (call_critical_overtemp()) { 1668 printk(KERN_WARNING "Can't call %s, power off now!\n", 1669 critical_overtemp_path); 1670 machine_power_off(); 1671 } 1672 } 1673 if (critical_state > 0) 1674 critical_state++; 1675 if (critical_state > MAX_CRITICAL_STATE) { 1676 printk(KERN_WARNING "Shutdown timed out, power off now !\n"); 1677 machine_power_off(); 1678 } 1679 1680 // FIXME: Deal with signals 1681 elapsed = jiffies - start; 1682 if (elapsed < HZ) 1683 schedule_timeout_interruptible(HZ - elapsed); 1684 } 1685 1686 out: 1687 DBG("main_control_loop ended\n"); 1688 1689 ctrl_task = 0; 1690 complete_and_exit(&ctrl_complete, 0); 1691} 1692 1693/* 1694 * Dispose the control loops when tearing down 1695 */ 1696static void dispose_control_loops(void) 1697{ 1698 dispose_cpu_state(&cpu_state[0]); 1699 dispose_cpu_state(&cpu_state[1]); 1700 dispose_backside_state(&backside_state); 1701 dispose_drives_state(&drives_state); 1702 dispose_dimms_state(&dimms_state); 1703} 1704 1705/* 1706 * Create the control loops. U3-0 i2c bus is up, so we can now 1707 * get to the various sensors 1708 */ 1709static int create_control_loops(void) 1710{ 1711 struct device_node *np; 1712 1713 /* Count CPUs from the device-tree, we don't care how many are 1714 * actually used by Linux 1715 */ 1716 cpu_count = 0; 1717 for (np = NULL; NULL != (np = of_find_node_by_type(np, "cpu"));) 1718 cpu_count++; 1719 1720 DBG("counted %d CPUs in the device-tree\n", cpu_count); 1721 1722 /* Decide the type of PID algorithm to use based on the presence of 1723 * the pumps, though that may not be the best way, that is good enough 1724 * for now 1725 */ 1726 if (rackmac) 1727 cpu_pid_type = CPU_PID_TYPE_RACKMAC; 1728 else if (machine_is_compatible("PowerMac7,3") 1729 && (cpu_count > 1) 1730 && fcu_fans[CPUA_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID 1731 && fcu_fans[CPUB_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) { 1732 printk(KERN_INFO "Liquid cooling pumps detected, using new algorithm !\n"); 1733 cpu_pid_type = CPU_PID_TYPE_COMBINED; 1734 } else 1735 cpu_pid_type = CPU_PID_TYPE_SPLIT; 1736 1737 /* Create control loops for everything. If any fail, everything 1738 * fails 1739 */ 1740 if (init_cpu_state(&cpu_state[0], 0)) 1741 goto fail; 1742 if (cpu_pid_type == CPU_PID_TYPE_COMBINED) 1743 fetch_cpu_pumps_minmax(); 1744 1745 if (cpu_count > 1 && init_cpu_state(&cpu_state[1], 1)) 1746 goto fail; 1747 if (init_backside_state(&backside_state)) 1748 goto fail; 1749 if (rackmac && init_dimms_state(&dimms_state)) 1750 goto fail; 1751 if (!rackmac && init_drives_state(&drives_state)) 1752 goto fail; 1753 1754 DBG("all control loops up !\n"); 1755 1756 return 0; 1757 1758 fail: 1759 DBG("failure creating control loops, disposing\n"); 1760 1761 dispose_control_loops(); 1762 1763 return -ENODEV; 1764} 1765 1766/* 1767 * Start the control loops after everything is up, that is create 1768 * the thread that will make them run 1769 */ 1770static void start_control_loops(void) 1771{ 1772 init_completion(&ctrl_complete); 1773 1774 ctrl_task = kernel_thread(main_control_loop, NULL, SIGCHLD | CLONE_KERNEL); 1775} 1776 1777/* 1778 * Stop the control loops when tearing down 1779 */ 1780static void stop_control_loops(void) 1781{ 1782 if (ctrl_task != 0) 1783 wait_for_completion(&ctrl_complete); 1784} 1785 1786/* 1787 * Attach to the i2c FCU after detecting U3-1 bus 1788 */ 1789static int attach_fcu(void) 1790{ 1791 fcu = attach_i2c_chip(FAN_CTRLER_ID, "fcu"); 1792 if (fcu == NULL) 1793 return -ENODEV; 1794 1795 DBG("FCU attached\n"); 1796 1797 return 0; 1798} 1799 1800/* 1801 * Detach from the i2c FCU when tearing down 1802 */ 1803static void detach_fcu(void) 1804{ 1805 if (fcu) 1806 detach_i2c_chip(fcu); 1807 fcu = NULL; 1808} 1809 1810/* 1811 * Attach to the i2c controller. We probe the various chips based 1812 * on the device-tree nodes and build everything for the driver to 1813 * run, we then kick the driver monitoring thread 1814 */ 1815static int therm_pm72_attach(struct i2c_adapter *adapter) 1816{ 1817 down(&driver_lock); 1818 1819 /* Check state */ 1820 if (state == state_detached) 1821 state = state_attaching; 1822 if (state != state_attaching) { 1823 up(&driver_lock); 1824 return 0; 1825 } 1826 1827 /* Check if we are looking for one of these */ 1828 if (u3_0 == NULL && !strcmp(adapter->name, "u3 0")) { 1829 u3_0 = adapter; 1830 DBG("found U3-0\n"); 1831 if (k2 || !rackmac) 1832 if (create_control_loops()) 1833 u3_0 = NULL; 1834 } else if (u3_1 == NULL && !strcmp(adapter->name, "u3 1")) { 1835 u3_1 = adapter; 1836 DBG("found U3-1, attaching FCU\n"); 1837 if (attach_fcu()) 1838 u3_1 = NULL; 1839 } else if (k2 == NULL && !strcmp(adapter->name, "mac-io 0")) { 1840 k2 = adapter; 1841 DBG("Found K2\n"); 1842 if (u3_0 && rackmac) 1843 if (create_control_loops()) 1844 k2 = NULL; 1845 } 1846 /* We got all we need, start control loops */ 1847 if (u3_0 != NULL && u3_1 != NULL && (k2 || !rackmac)) { 1848 DBG("everything up, starting control loops\n"); 1849 state = state_attached; 1850 start_control_loops(); 1851 } 1852 up(&driver_lock); 1853 1854 return 0; 1855} 1856 1857/* 1858 * Called on every adapter when the driver or the i2c controller 1859 * is going away. 1860 */ 1861static int therm_pm72_detach(struct i2c_adapter *adapter) 1862{ 1863 down(&driver_lock); 1864 1865 if (state != state_detached) 1866 state = state_detaching; 1867 1868 /* Stop control loops if any */ 1869 DBG("stopping control loops\n"); 1870 up(&driver_lock); 1871 stop_control_loops(); 1872 down(&driver_lock); 1873 1874 if (u3_0 != NULL && !strcmp(adapter->name, "u3 0")) { 1875 DBG("lost U3-0, disposing control loops\n"); 1876 dispose_control_loops(); 1877 u3_0 = NULL; 1878 } 1879 1880 if (u3_1 != NULL && !strcmp(adapter->name, "u3 1")) { 1881 DBG("lost U3-1, detaching FCU\n"); 1882 detach_fcu(); 1883 u3_1 = NULL; 1884 } 1885 if (u3_0 == NULL && u3_1 == NULL) 1886 state = state_detached; 1887 1888 up(&driver_lock); 1889 1890 return 0; 1891} 1892 1893static int fan_check_loc_match(const char *loc, int fan) 1894{ 1895 char tmp[64]; 1896 char *c, *e; 1897 1898 strlcpy(tmp, fcu_fans[fan].loc, 64); 1899 1900 c = tmp; 1901 for (;;) { 1902 e = strchr(c, ','); 1903 if (e) 1904 *e = 0; 1905 if (strcmp(loc, c) == 0) 1906 return 1; 1907 if (e == NULL) 1908 break; 1909 c = e + 1; 1910 } 1911 return 0; 1912} 1913 1914static void fcu_lookup_fans(struct device_node *fcu_node) 1915{ 1916 struct device_node *np = NULL; 1917 int i; 1918 1919 /* The table is filled by default with values that are suitable 1920 * for the old machines without device-tree informations. We scan 1921 * the device-tree and override those values with whatever is 1922 * there 1923 */ 1924 1925 DBG("Looking up FCU controls in device-tree...\n"); 1926 1927 while ((np = of_get_next_child(fcu_node, np)) != NULL) { 1928 int type = -1; 1929 char *loc; 1930 u32 *reg; 1931 1932 DBG(" control: %s, type: %s\n", np->name, np->type); 1933 1934 /* Detect control type */ 1935 if (!strcmp(np->type, "fan-rpm-control") || 1936 !strcmp(np->type, "fan-rpm")) 1937 type = FCU_FAN_RPM; 1938 if (!strcmp(np->type, "fan-pwm-control") || 1939 !strcmp(np->type, "fan-pwm")) 1940 type = FCU_FAN_PWM; 1941 /* Only care about fans for now */ 1942 if (type == -1) 1943 continue; 1944 1945 /* Lookup for a matching location */ 1946 loc = (char *)get_property(np, "location", NULL); 1947 reg = (u32 *)get_property(np, "reg", NULL); 1948 if (loc == NULL || reg == NULL) 1949 continue; 1950 DBG(" matching location: %s, reg: 0x%08x\n", loc, *reg); 1951 1952 for (i = 0; i < FCU_FAN_COUNT; i++) { 1953 int fan_id; 1954 1955 if (!fan_check_loc_match(loc, i)) 1956 continue; 1957 DBG(" location match, index: %d\n", i); 1958 fcu_fans[i].id = FCU_FAN_ABSENT_ID; 1959 if (type != fcu_fans[i].type) { 1960 printk(KERN_WARNING "therm_pm72: Fan type mismatch " 1961 "in device-tree for %s\n", np->full_name); 1962 break; 1963 } 1964 if (type == FCU_FAN_RPM) 1965 fan_id = ((*reg) - 0x10) / 2; 1966 else 1967 fan_id = ((*reg) - 0x30) / 2; 1968 if (fan_id > 7) { 1969 printk(KERN_WARNING "therm_pm72: Can't parse " 1970 "fan ID in device-tree for %s\n", np->full_name); 1971 break; 1972 } 1973 DBG(" fan id -> %d, type -> %d\n", fan_id, type); 1974 fcu_fans[i].id = fan_id; 1975 } 1976 } 1977 1978 /* Now dump the array */ 1979 printk(KERN_INFO "Detected fan controls:\n"); 1980 for (i = 0; i < FCU_FAN_COUNT; i++) { 1981 if (fcu_fans[i].id == FCU_FAN_ABSENT_ID) 1982 continue; 1983 printk(KERN_INFO " %d: %s fan, id %d, location: %s\n", i, 1984 fcu_fans[i].type == FCU_FAN_RPM ? "RPM" : "PWM", 1985 fcu_fans[i].id, fcu_fans[i].loc); 1986 } 1987} 1988 1989static int fcu_of_probe(struct of_device* dev, const struct of_device_id *match) 1990{ 1991 state = state_detached; 1992 1993 /* Lookup the fans in the device tree */ 1994 fcu_lookup_fans(dev->node); 1995 1996 /* Add the driver */ 1997 return i2c_add_driver(&therm_pm72_driver); 1998} 1999 2000static int fcu_of_remove(struct of_device* dev) 2001{ 2002 i2c_del_driver(&therm_pm72_driver); 2003 2004 return 0; 2005} 2006 2007static struct of_device_id fcu_match[] = 2008{ 2009 { 2010 .type = "fcu", 2011 }, 2012 {}, 2013}; 2014 2015static struct of_platform_driver fcu_of_platform_driver = 2016{ 2017 .name = "temperature", 2018 .match_table = fcu_match, 2019 .probe = fcu_of_probe, 2020 .remove = fcu_of_remove 2021}; 2022 2023/* 2024 * Check machine type, attach to i2c controller 2025 */ 2026static int __init therm_pm72_init(void) 2027{ 2028 struct device_node *np; 2029 2030 rackmac = machine_is_compatible("RackMac3,1"); 2031 2032 if (!machine_is_compatible("PowerMac7,2") && 2033 !machine_is_compatible("PowerMac7,3") && 2034 !rackmac) 2035 return -ENODEV; 2036 2037 printk(KERN_INFO "PowerMac G5 Thermal control driver %s\n", VERSION); 2038 2039 np = of_find_node_by_type(NULL, "fcu"); 2040 if (np == NULL) { 2041 /* Some machines have strangely broken device-tree */ 2042 np = of_find_node_by_path("/u3@0,f8000000/i2c@f8001000/fan@15e"); 2043 if (np == NULL) { 2044 printk(KERN_ERR "Can't find FCU in device-tree !\n"); 2045 return -ENODEV; 2046 } 2047 } 2048 of_dev = of_platform_device_create(np, "temperature", NULL); 2049 if (of_dev == NULL) { 2050 printk(KERN_ERR "Can't register FCU platform device !\n"); 2051 return -ENODEV; 2052 } 2053 2054 of_register_driver(&fcu_of_platform_driver); 2055 2056 return 0; 2057} 2058 2059static void __exit therm_pm72_exit(void) 2060{ 2061 of_unregister_driver(&fcu_of_platform_driver); 2062 2063 if (of_dev) 2064 of_device_unregister(of_dev); 2065} 2066 2067module_init(therm_pm72_init); 2068module_exit(therm_pm72_exit); 2069 2070MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>"); 2071MODULE_DESCRIPTION("Driver for Apple's PowerMac G5 thermal control"); 2072MODULE_LICENSE("GPL"); 2073