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