1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/device.h> 4 #include <linux/hwmon.h> 5 #include <linux/hwmon-sysfs.h> 6 #include <linux/jiffies.h> 7 #include <linux/kernel.h> 8 #include <linux/math64.h> 9 #include <linux/mutex.h> 10 #include <linux/sysfs.h> 11 #include <asm/unaligned.h> 12 13 #include "common.h" 14 15 #define EXTN_FLAG_SENSOR_ID BIT(7) 16 17 #define OCC_ERROR_COUNT_THRESHOLD 2 /* required by OCC spec */ 18 19 #define OCC_STATE_SAFE 4 20 #define OCC_SAFE_TIMEOUT msecs_to_jiffies(60000) /* 1 min */ 21 22 #define OCC_UPDATE_FREQUENCY msecs_to_jiffies(1000) 23 24 #define OCC_TEMP_SENSOR_FAULT 0xFF 25 26 #define OCC_FRU_TYPE_VRM 3 27 28 /* OCC sensor type and version definitions */ 29 30 struct temp_sensor_1 { 31 u16 sensor_id; 32 u16 value; 33 } __packed; 34 35 struct temp_sensor_2 { 36 u32 sensor_id; 37 u8 fru_type; 38 u8 value; 39 } __packed; 40 41 struct freq_sensor_1 { 42 u16 sensor_id; 43 u16 value; 44 } __packed; 45 46 struct freq_sensor_2 { 47 u32 sensor_id; 48 u16 value; 49 } __packed; 50 51 struct power_sensor_1 { 52 u16 sensor_id; 53 u32 update_tag; 54 u32 accumulator; 55 u16 value; 56 } __packed; 57 58 struct power_sensor_2 { 59 u32 sensor_id; 60 u8 function_id; 61 u8 apss_channel; 62 u16 reserved; 63 u32 update_tag; 64 u64 accumulator; 65 u16 value; 66 } __packed; 67 68 struct power_sensor_data { 69 u16 value; 70 u32 update_tag; 71 u64 accumulator; 72 } __packed; 73 74 struct power_sensor_data_and_time { 75 u16 update_time; 76 u16 value; 77 u32 update_tag; 78 u64 accumulator; 79 } __packed; 80 81 struct power_sensor_a0 { 82 u32 sensor_id; 83 struct power_sensor_data_and_time system; 84 u32 reserved; 85 struct power_sensor_data_and_time proc; 86 struct power_sensor_data vdd; 87 struct power_sensor_data vdn; 88 } __packed; 89 90 struct caps_sensor_2 { 91 u16 cap; 92 u16 system_power; 93 u16 n_cap; 94 u16 max; 95 u16 min; 96 u16 user; 97 u8 user_source; 98 } __packed; 99 100 struct caps_sensor_3 { 101 u16 cap; 102 u16 system_power; 103 u16 n_cap; 104 u16 max; 105 u16 hard_min; 106 u16 soft_min; 107 u16 user; 108 u8 user_source; 109 } __packed; 110 111 struct extended_sensor { 112 union { 113 u8 name[4]; 114 u32 sensor_id; 115 }; 116 u8 flags; 117 u8 reserved; 118 u8 data[6]; 119 } __packed; 120 121 static int occ_poll(struct occ *occ) 122 { 123 int rc; 124 u16 checksum = occ->poll_cmd_data + 1; 125 u8 cmd[8]; 126 struct occ_poll_response_header *header; 127 128 /* big endian */ 129 cmd[0] = 0; /* sequence number */ 130 cmd[1] = 0; /* cmd type */ 131 cmd[2] = 0; /* data length msb */ 132 cmd[3] = 1; /* data length lsb */ 133 cmd[4] = occ->poll_cmd_data; /* data */ 134 cmd[5] = checksum >> 8; /* checksum msb */ 135 cmd[6] = checksum & 0xFF; /* checksum lsb */ 136 cmd[7] = 0; 137 138 /* mutex should already be locked if necessary */ 139 rc = occ->send_cmd(occ, cmd); 140 if (rc) { 141 if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD) 142 occ->error = rc; 143 144 goto done; 145 } 146 147 /* clear error since communication was successful */ 148 occ->error_count = 0; 149 occ->error = 0; 150 151 /* check for safe state */ 152 header = (struct occ_poll_response_header *)occ->resp.data; 153 if (header->occ_state == OCC_STATE_SAFE) { 154 if (occ->last_safe) { 155 if (time_after(jiffies, 156 occ->last_safe + OCC_SAFE_TIMEOUT)) 157 occ->error = -EHOSTDOWN; 158 } else { 159 occ->last_safe = jiffies; 160 } 161 } else { 162 occ->last_safe = 0; 163 } 164 165 done: 166 occ_sysfs_poll_done(occ); 167 return rc; 168 } 169 170 static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap) 171 { 172 int rc; 173 u8 cmd[8]; 174 u16 checksum = 0x24; 175 __be16 user_power_cap_be = cpu_to_be16(user_power_cap); 176 177 cmd[0] = 0; 178 cmd[1] = 0x22; 179 cmd[2] = 0; 180 cmd[3] = 2; 181 182 memcpy(&cmd[4], &user_power_cap_be, 2); 183 184 checksum += cmd[4] + cmd[5]; 185 cmd[6] = checksum >> 8; 186 cmd[7] = checksum & 0xFF; 187 188 rc = mutex_lock_interruptible(&occ->lock); 189 if (rc) 190 return rc; 191 192 rc = occ->send_cmd(occ, cmd); 193 194 mutex_unlock(&occ->lock); 195 196 return rc; 197 } 198 199 int occ_update_response(struct occ *occ) 200 { 201 int rc = mutex_lock_interruptible(&occ->lock); 202 203 if (rc) 204 return rc; 205 206 /* limit the maximum rate of polling the OCC */ 207 if (time_after(jiffies, occ->last_update + OCC_UPDATE_FREQUENCY)) { 208 rc = occ_poll(occ); 209 occ->last_update = jiffies; 210 } 211 212 mutex_unlock(&occ->lock); 213 return rc; 214 } 215 216 static ssize_t occ_show_temp_1(struct device *dev, 217 struct device_attribute *attr, char *buf) 218 { 219 int rc; 220 u32 val = 0; 221 struct temp_sensor_1 *temp; 222 struct occ *occ = dev_get_drvdata(dev); 223 struct occ_sensors *sensors = &occ->sensors; 224 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 225 226 rc = occ_update_response(occ); 227 if (rc) 228 return rc; 229 230 temp = ((struct temp_sensor_1 *)sensors->temp.data) + sattr->index; 231 232 switch (sattr->nr) { 233 case 0: 234 val = get_unaligned_be16(&temp->sensor_id); 235 break; 236 case 1: 237 val = get_unaligned_be16(&temp->value) * 1000; 238 break; 239 default: 240 return -EINVAL; 241 } 242 243 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); 244 } 245 246 static ssize_t occ_show_temp_2(struct device *dev, 247 struct device_attribute *attr, char *buf) 248 { 249 int rc; 250 u32 val = 0; 251 struct temp_sensor_2 *temp; 252 struct occ *occ = dev_get_drvdata(dev); 253 struct occ_sensors *sensors = &occ->sensors; 254 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 255 256 rc = occ_update_response(occ); 257 if (rc) 258 return rc; 259 260 temp = ((struct temp_sensor_2 *)sensors->temp.data) + sattr->index; 261 262 switch (sattr->nr) { 263 case 0: 264 val = get_unaligned_be32(&temp->sensor_id); 265 break; 266 case 1: 267 val = temp->value; 268 if (val == OCC_TEMP_SENSOR_FAULT) 269 return -EREMOTEIO; 270 271 /* 272 * VRM doesn't return temperature, only alarm bit. This 273 * attribute maps to tempX_alarm instead of tempX_input for 274 * VRM 275 */ 276 if (temp->fru_type != OCC_FRU_TYPE_VRM) { 277 /* sensor not ready */ 278 if (val == 0) 279 return -EAGAIN; 280 281 val *= 1000; 282 } 283 break; 284 case 2: 285 val = temp->fru_type; 286 break; 287 case 3: 288 val = temp->value == OCC_TEMP_SENSOR_FAULT; 289 break; 290 default: 291 return -EINVAL; 292 } 293 294 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); 295 } 296 297 static ssize_t occ_show_freq_1(struct device *dev, 298 struct device_attribute *attr, char *buf) 299 { 300 int rc; 301 u16 val = 0; 302 struct freq_sensor_1 *freq; 303 struct occ *occ = dev_get_drvdata(dev); 304 struct occ_sensors *sensors = &occ->sensors; 305 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 306 307 rc = occ_update_response(occ); 308 if (rc) 309 return rc; 310 311 freq = ((struct freq_sensor_1 *)sensors->freq.data) + sattr->index; 312 313 switch (sattr->nr) { 314 case 0: 315 val = get_unaligned_be16(&freq->sensor_id); 316 break; 317 case 1: 318 val = get_unaligned_be16(&freq->value); 319 break; 320 default: 321 return -EINVAL; 322 } 323 324 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); 325 } 326 327 static ssize_t occ_show_freq_2(struct device *dev, 328 struct device_attribute *attr, char *buf) 329 { 330 int rc; 331 u32 val = 0; 332 struct freq_sensor_2 *freq; 333 struct occ *occ = dev_get_drvdata(dev); 334 struct occ_sensors *sensors = &occ->sensors; 335 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 336 337 rc = occ_update_response(occ); 338 if (rc) 339 return rc; 340 341 freq = ((struct freq_sensor_2 *)sensors->freq.data) + sattr->index; 342 343 switch (sattr->nr) { 344 case 0: 345 val = get_unaligned_be32(&freq->sensor_id); 346 break; 347 case 1: 348 val = get_unaligned_be16(&freq->value); 349 break; 350 default: 351 return -EINVAL; 352 } 353 354 return snprintf(buf, PAGE_SIZE - 1, "%u\n", val); 355 } 356 357 static ssize_t occ_show_power_1(struct device *dev, 358 struct device_attribute *attr, char *buf) 359 { 360 int rc; 361 u64 val = 0; 362 struct power_sensor_1 *power; 363 struct occ *occ = dev_get_drvdata(dev); 364 struct occ_sensors *sensors = &occ->sensors; 365 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 366 367 rc = occ_update_response(occ); 368 if (rc) 369 return rc; 370 371 power = ((struct power_sensor_1 *)sensors->power.data) + sattr->index; 372 373 switch (sattr->nr) { 374 case 0: 375 val = get_unaligned_be16(&power->sensor_id); 376 break; 377 case 1: 378 val = get_unaligned_be32(&power->accumulator) / 379 get_unaligned_be32(&power->update_tag); 380 val *= 1000000ULL; 381 break; 382 case 2: 383 val = (u64)get_unaligned_be32(&power->update_tag) * 384 occ->powr_sample_time_us; 385 break; 386 case 3: 387 val = get_unaligned_be16(&power->value) * 1000000ULL; 388 break; 389 default: 390 return -EINVAL; 391 } 392 393 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); 394 } 395 396 static u64 occ_get_powr_avg(u64 *accum, u32 *samples) 397 { 398 return div64_u64(get_unaligned_be64(accum) * 1000000ULL, 399 get_unaligned_be32(samples)); 400 } 401 402 static ssize_t occ_show_power_2(struct device *dev, 403 struct device_attribute *attr, char *buf) 404 { 405 int rc; 406 u64 val = 0; 407 struct power_sensor_2 *power; 408 struct occ *occ = dev_get_drvdata(dev); 409 struct occ_sensors *sensors = &occ->sensors; 410 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 411 412 rc = occ_update_response(occ); 413 if (rc) 414 return rc; 415 416 power = ((struct power_sensor_2 *)sensors->power.data) + sattr->index; 417 418 switch (sattr->nr) { 419 case 0: 420 return snprintf(buf, PAGE_SIZE - 1, "%u_%u_%u\n", 421 get_unaligned_be32(&power->sensor_id), 422 power->function_id, power->apss_channel); 423 case 1: 424 val = occ_get_powr_avg(&power->accumulator, 425 &power->update_tag); 426 break; 427 case 2: 428 val = (u64)get_unaligned_be32(&power->update_tag) * 429 occ->powr_sample_time_us; 430 break; 431 case 3: 432 val = get_unaligned_be16(&power->value) * 1000000ULL; 433 break; 434 default: 435 return -EINVAL; 436 } 437 438 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); 439 } 440 441 static ssize_t occ_show_power_a0(struct device *dev, 442 struct device_attribute *attr, char *buf) 443 { 444 int rc; 445 u64 val = 0; 446 struct power_sensor_a0 *power; 447 struct occ *occ = dev_get_drvdata(dev); 448 struct occ_sensors *sensors = &occ->sensors; 449 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 450 451 rc = occ_update_response(occ); 452 if (rc) 453 return rc; 454 455 power = ((struct power_sensor_a0 *)sensors->power.data) + sattr->index; 456 457 switch (sattr->nr) { 458 case 0: 459 return snprintf(buf, PAGE_SIZE - 1, "%u_system\n", 460 get_unaligned_be32(&power->sensor_id)); 461 case 1: 462 val = occ_get_powr_avg(&power->system.accumulator, 463 &power->system.update_tag); 464 break; 465 case 2: 466 val = (u64)get_unaligned_be32(&power->system.update_tag) * 467 occ->powr_sample_time_us; 468 break; 469 case 3: 470 val = get_unaligned_be16(&power->system.value) * 1000000ULL; 471 break; 472 case 4: 473 return snprintf(buf, PAGE_SIZE - 1, "%u_proc\n", 474 get_unaligned_be32(&power->sensor_id)); 475 case 5: 476 val = occ_get_powr_avg(&power->proc.accumulator, 477 &power->proc.update_tag); 478 break; 479 case 6: 480 val = (u64)get_unaligned_be32(&power->proc.update_tag) * 481 occ->powr_sample_time_us; 482 break; 483 case 7: 484 val = get_unaligned_be16(&power->proc.value) * 1000000ULL; 485 break; 486 case 8: 487 return snprintf(buf, PAGE_SIZE - 1, "%u_vdd\n", 488 get_unaligned_be32(&power->sensor_id)); 489 case 9: 490 val = occ_get_powr_avg(&power->vdd.accumulator, 491 &power->vdd.update_tag); 492 break; 493 case 10: 494 val = (u64)get_unaligned_be32(&power->vdd.update_tag) * 495 occ->powr_sample_time_us; 496 break; 497 case 11: 498 val = get_unaligned_be16(&power->vdd.value) * 1000000ULL; 499 break; 500 case 12: 501 return snprintf(buf, PAGE_SIZE - 1, "%u_vdn\n", 502 get_unaligned_be32(&power->sensor_id)); 503 case 13: 504 val = occ_get_powr_avg(&power->vdn.accumulator, 505 &power->vdn.update_tag); 506 break; 507 case 14: 508 val = (u64)get_unaligned_be32(&power->vdn.update_tag) * 509 occ->powr_sample_time_us; 510 break; 511 case 15: 512 val = get_unaligned_be16(&power->vdn.value) * 1000000ULL; 513 break; 514 default: 515 return -EINVAL; 516 } 517 518 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); 519 } 520 521 static ssize_t occ_show_caps_1_2(struct device *dev, 522 struct device_attribute *attr, char *buf) 523 { 524 int rc; 525 u64 val = 0; 526 struct caps_sensor_2 *caps; 527 struct occ *occ = dev_get_drvdata(dev); 528 struct occ_sensors *sensors = &occ->sensors; 529 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 530 531 rc = occ_update_response(occ); 532 if (rc) 533 return rc; 534 535 caps = ((struct caps_sensor_2 *)sensors->caps.data) + sattr->index; 536 537 switch (sattr->nr) { 538 case 0: 539 return snprintf(buf, PAGE_SIZE - 1, "system\n"); 540 case 1: 541 val = get_unaligned_be16(&caps->cap) * 1000000ULL; 542 break; 543 case 2: 544 val = get_unaligned_be16(&caps->system_power) * 1000000ULL; 545 break; 546 case 3: 547 val = get_unaligned_be16(&caps->n_cap) * 1000000ULL; 548 break; 549 case 4: 550 val = get_unaligned_be16(&caps->max) * 1000000ULL; 551 break; 552 case 5: 553 val = get_unaligned_be16(&caps->min) * 1000000ULL; 554 break; 555 case 6: 556 val = get_unaligned_be16(&caps->user) * 1000000ULL; 557 break; 558 case 7: 559 if (occ->sensors.caps.version == 1) 560 return -EINVAL; 561 562 val = caps->user_source; 563 break; 564 default: 565 return -EINVAL; 566 } 567 568 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); 569 } 570 571 static ssize_t occ_show_caps_3(struct device *dev, 572 struct device_attribute *attr, char *buf) 573 { 574 int rc; 575 u64 val = 0; 576 struct caps_sensor_3 *caps; 577 struct occ *occ = dev_get_drvdata(dev); 578 struct occ_sensors *sensors = &occ->sensors; 579 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 580 581 rc = occ_update_response(occ); 582 if (rc) 583 return rc; 584 585 caps = ((struct caps_sensor_3 *)sensors->caps.data) + sattr->index; 586 587 switch (sattr->nr) { 588 case 0: 589 return snprintf(buf, PAGE_SIZE - 1, "system\n"); 590 case 1: 591 val = get_unaligned_be16(&caps->cap) * 1000000ULL; 592 break; 593 case 2: 594 val = get_unaligned_be16(&caps->system_power) * 1000000ULL; 595 break; 596 case 3: 597 val = get_unaligned_be16(&caps->n_cap) * 1000000ULL; 598 break; 599 case 4: 600 val = get_unaligned_be16(&caps->max) * 1000000ULL; 601 break; 602 case 5: 603 val = get_unaligned_be16(&caps->hard_min) * 1000000ULL; 604 break; 605 case 6: 606 val = get_unaligned_be16(&caps->user) * 1000000ULL; 607 break; 608 case 7: 609 val = caps->user_source; 610 break; 611 default: 612 return -EINVAL; 613 } 614 615 return snprintf(buf, PAGE_SIZE - 1, "%llu\n", val); 616 } 617 618 static ssize_t occ_store_caps_user(struct device *dev, 619 struct device_attribute *attr, 620 const char *buf, size_t count) 621 { 622 int rc; 623 u16 user_power_cap; 624 unsigned long long value; 625 struct occ *occ = dev_get_drvdata(dev); 626 627 rc = kstrtoull(buf, 0, &value); 628 if (rc) 629 return rc; 630 631 user_power_cap = div64_u64(value, 1000000ULL); /* microwatt to watt */ 632 633 rc = occ_set_user_power_cap(occ, user_power_cap); 634 if (rc) 635 return rc; 636 637 return count; 638 } 639 640 static ssize_t occ_show_extended(struct device *dev, 641 struct device_attribute *attr, char *buf) 642 { 643 int rc; 644 struct extended_sensor *extn; 645 struct occ *occ = dev_get_drvdata(dev); 646 struct occ_sensors *sensors = &occ->sensors; 647 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr); 648 649 rc = occ_update_response(occ); 650 if (rc) 651 return rc; 652 653 extn = ((struct extended_sensor *)sensors->extended.data) + 654 sattr->index; 655 656 switch (sattr->nr) { 657 case 0: 658 if (extn->flags & EXTN_FLAG_SENSOR_ID) 659 rc = snprintf(buf, PAGE_SIZE - 1, "%u", 660 get_unaligned_be32(&extn->sensor_id)); 661 else 662 rc = snprintf(buf, PAGE_SIZE - 1, "%02x%02x%02x%02x\n", 663 extn->name[0], extn->name[1], 664 extn->name[2], extn->name[3]); 665 break; 666 case 1: 667 rc = snprintf(buf, PAGE_SIZE - 1, "%02x\n", extn->flags); 668 break; 669 case 2: 670 rc = snprintf(buf, PAGE_SIZE - 1, "%02x%02x%02x%02x%02x%02x\n", 671 extn->data[0], extn->data[1], extn->data[2], 672 extn->data[3], extn->data[4], extn->data[5]); 673 break; 674 default: 675 return -EINVAL; 676 } 677 678 return rc; 679 } 680 681 /* 682 * Some helper macros to make it easier to define an occ_attribute. Since these 683 * are dynamically allocated, we shouldn't use the existing kernel macros which 684 * stringify the name argument. 685 */ 686 #define ATTR_OCC(_name, _mode, _show, _store) { \ 687 .attr = { \ 688 .name = _name, \ 689 .mode = VERIFY_OCTAL_PERMISSIONS(_mode), \ 690 }, \ 691 .show = _show, \ 692 .store = _store, \ 693 } 694 695 #define SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index) { \ 696 .dev_attr = ATTR_OCC(_name, _mode, _show, _store), \ 697 .index = _index, \ 698 .nr = _nr, \ 699 } 700 701 #define OCC_INIT_ATTR(_name, _mode, _show, _store, _nr, _index) \ 702 ((struct sensor_device_attribute_2) \ 703 SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index)) 704 705 /* 706 * Allocate and instatiate sensor_device_attribute_2s. It's most efficient to 707 * use our own instead of the built-in hwmon attribute types. 708 */ 709 static int occ_setup_sensor_attrs(struct occ *occ) 710 { 711 unsigned int i, s, num_attrs = 0; 712 struct device *dev = occ->bus_dev; 713 struct occ_sensors *sensors = &occ->sensors; 714 struct occ_attribute *attr; 715 struct temp_sensor_2 *temp; 716 ssize_t (*show_temp)(struct device *, struct device_attribute *, 717 char *) = occ_show_temp_1; 718 ssize_t (*show_freq)(struct device *, struct device_attribute *, 719 char *) = occ_show_freq_1; 720 ssize_t (*show_power)(struct device *, struct device_attribute *, 721 char *) = occ_show_power_1; 722 ssize_t (*show_caps)(struct device *, struct device_attribute *, 723 char *) = occ_show_caps_1_2; 724 725 switch (sensors->temp.version) { 726 case 1: 727 num_attrs += (sensors->temp.num_sensors * 2); 728 break; 729 case 2: 730 num_attrs += (sensors->temp.num_sensors * 4); 731 show_temp = occ_show_temp_2; 732 break; 733 default: 734 sensors->temp.num_sensors = 0; 735 } 736 737 switch (sensors->freq.version) { 738 case 2: 739 show_freq = occ_show_freq_2; 740 /* fall through */ 741 case 1: 742 num_attrs += (sensors->freq.num_sensors * 2); 743 break; 744 default: 745 sensors->freq.num_sensors = 0; 746 } 747 748 switch (sensors->power.version) { 749 case 2: 750 show_power = occ_show_power_2; 751 /* fall through */ 752 case 1: 753 num_attrs += (sensors->power.num_sensors * 4); 754 break; 755 case 0xA0: 756 num_attrs += (sensors->power.num_sensors * 16); 757 show_power = occ_show_power_a0; 758 break; 759 default: 760 sensors->power.num_sensors = 0; 761 } 762 763 switch (sensors->caps.version) { 764 case 1: 765 num_attrs += (sensors->caps.num_sensors * 7); 766 break; 767 case 3: 768 show_caps = occ_show_caps_3; 769 /* fall through */ 770 case 2: 771 num_attrs += (sensors->caps.num_sensors * 8); 772 break; 773 default: 774 sensors->caps.num_sensors = 0; 775 } 776 777 switch (sensors->extended.version) { 778 case 1: 779 num_attrs += (sensors->extended.num_sensors * 3); 780 break; 781 default: 782 sensors->extended.num_sensors = 0; 783 } 784 785 occ->attrs = devm_kzalloc(dev, sizeof(*occ->attrs) * num_attrs, 786 GFP_KERNEL); 787 if (!occ->attrs) 788 return -ENOMEM; 789 790 /* null-terminated list */ 791 occ->group.attrs = devm_kzalloc(dev, sizeof(*occ->group.attrs) * 792 num_attrs + 1, GFP_KERNEL); 793 if (!occ->group.attrs) 794 return -ENOMEM; 795 796 attr = occ->attrs; 797 798 for (i = 0; i < sensors->temp.num_sensors; ++i) { 799 s = i + 1; 800 temp = ((struct temp_sensor_2 *)sensors->temp.data) + i; 801 802 snprintf(attr->name, sizeof(attr->name), "temp%d_label", s); 803 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, 804 0, i); 805 attr++; 806 807 if (sensors->temp.version > 1 && 808 temp->fru_type == OCC_FRU_TYPE_VRM) { 809 snprintf(attr->name, sizeof(attr->name), 810 "temp%d_alarm", s); 811 } else { 812 snprintf(attr->name, sizeof(attr->name), 813 "temp%d_input", s); 814 } 815 816 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_temp, NULL, 817 1, i); 818 attr++; 819 820 if (sensors->temp.version > 1) { 821 snprintf(attr->name, sizeof(attr->name), 822 "temp%d_fru_type", s); 823 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 824 show_temp, NULL, 2, i); 825 attr++; 826 827 snprintf(attr->name, sizeof(attr->name), 828 "temp%d_fault", s); 829 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 830 show_temp, NULL, 3, i); 831 attr++; 832 } 833 } 834 835 for (i = 0; i < sensors->freq.num_sensors; ++i) { 836 s = i + 1; 837 838 snprintf(attr->name, sizeof(attr->name), "freq%d_label", s); 839 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, 840 0, i); 841 attr++; 842 843 snprintf(attr->name, sizeof(attr->name), "freq%d_input", s); 844 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_freq, NULL, 845 1, i); 846 attr++; 847 } 848 849 if (sensors->power.version == 0xA0) { 850 /* 851 * Special case for many-attribute power sensor. Split it into 852 * a sensor number per power type, emulating several sensors. 853 */ 854 for (i = 0; i < sensors->power.num_sensors; ++i) { 855 unsigned int j; 856 unsigned int nr = 0; 857 858 s = (i * 4) + 1; 859 860 for (j = 0; j < 4; ++j) { 861 snprintf(attr->name, sizeof(attr->name), 862 "power%d_label", s); 863 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 864 show_power, NULL, 865 nr++, i); 866 attr++; 867 868 snprintf(attr->name, sizeof(attr->name), 869 "power%d_average", s); 870 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 871 show_power, NULL, 872 nr++, i); 873 attr++; 874 875 snprintf(attr->name, sizeof(attr->name), 876 "power%d_average_interval", s); 877 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 878 show_power, NULL, 879 nr++, i); 880 attr++; 881 882 snprintf(attr->name, sizeof(attr->name), 883 "power%d_input", s); 884 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 885 show_power, NULL, 886 nr++, i); 887 attr++; 888 889 s++; 890 } 891 } 892 } else { 893 for (i = 0; i < sensors->power.num_sensors; ++i) { 894 s = i + 1; 895 896 snprintf(attr->name, sizeof(attr->name), 897 "power%d_label", s); 898 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 899 show_power, NULL, 0, i); 900 attr++; 901 902 snprintf(attr->name, sizeof(attr->name), 903 "power%d_average", s); 904 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 905 show_power, NULL, 1, i); 906 attr++; 907 908 snprintf(attr->name, sizeof(attr->name), 909 "power%d_average_interval", s); 910 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 911 show_power, NULL, 2, i); 912 attr++; 913 914 snprintf(attr->name, sizeof(attr->name), 915 "power%d_input", s); 916 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 917 show_power, NULL, 3, i); 918 attr++; 919 } 920 } 921 922 if (sensors->caps.num_sensors >= 1) { 923 s = sensors->power.num_sensors + 1; 924 925 snprintf(attr->name, sizeof(attr->name), "power%d_label", s); 926 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 927 0, 0); 928 attr++; 929 930 snprintf(attr->name, sizeof(attr->name), "power%d_cap", s); 931 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 932 1, 0); 933 attr++; 934 935 snprintf(attr->name, sizeof(attr->name), "power%d_input", s); 936 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 937 2, 0); 938 attr++; 939 940 snprintf(attr->name, sizeof(attr->name), 941 "power%d_cap_not_redundant", s); 942 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 943 3, 0); 944 attr++; 945 946 snprintf(attr->name, sizeof(attr->name), "power%d_cap_max", s); 947 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 948 4, 0); 949 attr++; 950 951 snprintf(attr->name, sizeof(attr->name), "power%d_cap_min", s); 952 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, show_caps, NULL, 953 5, 0); 954 attr++; 955 956 snprintf(attr->name, sizeof(attr->name), "power%d_cap_user", 957 s); 958 attr->sensor = OCC_INIT_ATTR(attr->name, 0644, show_caps, 959 occ_store_caps_user, 6, 0); 960 attr++; 961 962 if (sensors->caps.version > 1) { 963 snprintf(attr->name, sizeof(attr->name), 964 "power%d_cap_user_source", s); 965 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 966 show_caps, NULL, 7, 0); 967 attr++; 968 } 969 } 970 971 for (i = 0; i < sensors->extended.num_sensors; ++i) { 972 s = i + 1; 973 974 snprintf(attr->name, sizeof(attr->name), "extn%d_label", s); 975 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 976 occ_show_extended, NULL, 0, i); 977 attr++; 978 979 snprintf(attr->name, sizeof(attr->name), "extn%d_flags", s); 980 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 981 occ_show_extended, NULL, 1, i); 982 attr++; 983 984 snprintf(attr->name, sizeof(attr->name), "extn%d_input", s); 985 attr->sensor = OCC_INIT_ATTR(attr->name, 0444, 986 occ_show_extended, NULL, 2, i); 987 attr++; 988 } 989 990 /* put the sensors in the group */ 991 for (i = 0; i < num_attrs; ++i) { 992 sysfs_attr_init(&occ->attrs[i].sensor.dev_attr.attr); 993 occ->group.attrs[i] = &occ->attrs[i].sensor.dev_attr.attr; 994 } 995 996 return 0; 997 } 998 999 /* only need to do this once at startup, as OCC won't change sensors on us */ 1000 static void occ_parse_poll_response(struct occ *occ) 1001 { 1002 unsigned int i, old_offset, offset = 0, size = 0; 1003 struct occ_sensor *sensor; 1004 struct occ_sensors *sensors = &occ->sensors; 1005 struct occ_response *resp = &occ->resp; 1006 struct occ_poll_response *poll = 1007 (struct occ_poll_response *)&resp->data[0]; 1008 struct occ_poll_response_header *header = &poll->header; 1009 struct occ_sensor_data_block *block = &poll->block; 1010 1011 dev_info(occ->bus_dev, "OCC found, code level: %.16s\n", 1012 header->occ_code_level); 1013 1014 for (i = 0; i < header->num_sensor_data_blocks; ++i) { 1015 block = (struct occ_sensor_data_block *)((u8 *)block + offset); 1016 old_offset = offset; 1017 offset = (block->header.num_sensors * 1018 block->header.sensor_length) + sizeof(block->header); 1019 size += offset; 1020 1021 /* validate all the length/size fields */ 1022 if ((size + sizeof(*header)) >= OCC_RESP_DATA_BYTES) { 1023 dev_warn(occ->bus_dev, "exceeded response buffer\n"); 1024 return; 1025 } 1026 1027 dev_dbg(occ->bus_dev, " %04x..%04x: %.4s (%d sensors)\n", 1028 old_offset, offset - 1, block->header.eye_catcher, 1029 block->header.num_sensors); 1030 1031 /* match sensor block type */ 1032 if (strncmp(block->header.eye_catcher, "TEMP", 4) == 0) 1033 sensor = &sensors->temp; 1034 else if (strncmp(block->header.eye_catcher, "FREQ", 4) == 0) 1035 sensor = &sensors->freq; 1036 else if (strncmp(block->header.eye_catcher, "POWR", 4) == 0) 1037 sensor = &sensors->power; 1038 else if (strncmp(block->header.eye_catcher, "CAPS", 4) == 0) 1039 sensor = &sensors->caps; 1040 else if (strncmp(block->header.eye_catcher, "EXTN", 4) == 0) 1041 sensor = &sensors->extended; 1042 else { 1043 dev_warn(occ->bus_dev, "sensor not supported %.4s\n", 1044 block->header.eye_catcher); 1045 continue; 1046 } 1047 1048 sensor->num_sensors = block->header.num_sensors; 1049 sensor->version = block->header.sensor_format; 1050 sensor->data = &block->data; 1051 } 1052 1053 dev_dbg(occ->bus_dev, "Max resp size: %u+%zd=%zd\n", size, 1054 sizeof(*header), size + sizeof(*header)); 1055 } 1056 1057 int occ_setup(struct occ *occ, const char *name) 1058 { 1059 int rc; 1060 1061 mutex_init(&occ->lock); 1062 occ->groups[0] = &occ->group; 1063 1064 /* no need to lock */ 1065 rc = occ_poll(occ); 1066 if (rc == -ESHUTDOWN) { 1067 dev_info(occ->bus_dev, "host is not ready\n"); 1068 return rc; 1069 } else if (rc < 0) { 1070 dev_err(occ->bus_dev, "failed to get OCC poll response: %d\n", 1071 rc); 1072 return rc; 1073 } 1074 1075 occ_parse_poll_response(occ); 1076 1077 rc = occ_setup_sensor_attrs(occ); 1078 if (rc) { 1079 dev_err(occ->bus_dev, "failed to setup sensor attrs: %d\n", 1080 rc); 1081 return rc; 1082 } 1083 1084 occ->hwmon = devm_hwmon_device_register_with_groups(occ->bus_dev, name, 1085 occ, occ->groups); 1086 if (IS_ERR(occ->hwmon)) { 1087 rc = PTR_ERR(occ->hwmon); 1088 dev_err(occ->bus_dev, "failed to register hwmon device: %d\n", 1089 rc); 1090 return rc; 1091 } 1092 1093 rc = occ_setup_sysfs(occ); 1094 if (rc) 1095 dev_err(occ->bus_dev, "failed to setup sysfs: %d\n", rc); 1096 1097 return rc; 1098 } 1099