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