1
2
3
4
5
6
7
8
9
10
11#include "qemu/osdep.h"
12#include "hw/i2c/pmbus_device.h"
13#include "hw/irq.h"
14#include "migration/vmstate.h"
15#include "qapi/error.h"
16#include "qapi/visitor.h"
17#include "qemu/log.h"
18#include "qemu/module.h"
19
20#define TYPE_MAX31785 "max31785"
21#define MAX31785(obj) OBJECT_CHECK(MAX31785State, (obj), TYPE_MAX31785)
22
23
24#define MAX31785_MFR_MODE 0xD1
25#define MAX31785_MFR_PSEN_CONFIG 0xD2
26#define MAX31785_MFR_VOUT_PEAK 0xD4
27#define MAX31785_MFR_TEMPERATURE_PEAK 0xD6
28#define MAX31785_MFR_VOUT_MIN 0xD7
29#define MAX31785_MFR_FAULT_RESPONSE 0xD9
30#define MAX31785_MFR_NV_FAULT_LOG 0xDC
31#define MAX31785_MFR_TIME_COUNT 0xDD
32#define MAX31785_MFR_TEMP_SENSOR_CONFIG 0xF0
33#define MAX31785_MFR_FAN_CONFIG 0xF1
34#define MAX31785_MFR_FAN_LUT 0xF2
35#define MAX31785_MFR_READ_FAN_PWM 0xF3
36#define MAX31785_MFR_FAN_FAULT_LIMIT 0xF5
37#define MAX31785_MFR_FAN_WARN_LIMIT 0xF6
38#define MAX31785_MFR_FAN_RUN_TIME 0xF7
39#define MAX31785_MFR_FAN_PWM_AVG 0xF8
40#define MAX31785_MFR_FAN_PWM2RPM 0xF9
41
42
43#define MAX31785_DEFAULT_CAPABILITY 0x10
44#define MAX31785_DEFAULT_VOUT_MODE 0x40
45#define MAX31785_DEFAULT_VOUT_SCALE_MONITOR 0x7FFF
46#define MAX31785_DEFAULT_FAN_COMMAND_1 0x7FFF
47#define MAX31785_DEFAULT_OV_FAULT_LIMIT 0x7FFF
48#define MAX31785_DEFAULT_OV_WARN_LIMIT 0x7FFF
49#define MAX31785_DEFAULT_OT_FAULT_LIMIT 0x7FFF
50#define MAX31785_DEFAULT_OT_WARN_LIMIT 0x7FFF
51#define MAX31785_DEFAULT_PMBUS_REVISION 0x11
52#define MAX31785_DEFAULT_MFR_ID 0x4D
53#define MAX31785_DEFAULT_MFR_MODEL 0x53
54#define MAX31785_DEFAULT_MFR_REVISION 0x3030
55#define MAX31785A_DEFAULT_MFR_REVISION 0x3040
56#define MAX31785B_DEFAULT_MFR_REVISION 0x3061
57#define MAX31785B_DEFAULT_MFR_TEMPERATURE_PEAK 0x8000
58#define MAX31785B_DEFAULT_MFR_VOUT_MIN 0x7FFF
59#define MAX31785_DEFAULT_TEXT 0x3130313031303130
60
61
62#define MAX31785_TOTAL_NUM_PAGES 23
63#define MAX31785_FAN_PAGES 6
64#define MAX31785_MIN_FAN_PAGE 0
65#define MAX31785_MAX_FAN_PAGE 5
66#define MAX31785_MIN_TEMP_PAGE 6
67#define MAX31785_MAX_TEMP_PAGE 16
68#define MAX31785_MIN_ADC_VOLTAGE_PAGE 17
69#define MAX31785_MAX_ADC_VOLTAGE_PAGE 22
70
71
72#define MAX31785_MFR_FAN_CONFIG 0xF1
73#define MAX31785_FAN_CONFIG_ENABLE BIT(7)
74#define MAX31785_FAN_CONFIG_RPM_PWM BIT(6)
75#define MAX31785_FAN_CONFIG_PULSE(pulse) (pulse << 4)
76#define MAX31785_DEFAULT_FAN_CONFIG_1_2(pulse) \
77 (MAX31785_FAN_CONFIG_ENABLE | MAX31785_FAN_CONFIG_PULSE(pulse))
78#define MAX31785_DEFAULT_MFR_FAN_CONFIG 0x0000
79
80
81#define MAX31785_DEFAULT_FAN_SPEED 0x7fff
82#define MAX31785_DEFAULT_FAN_STATUS 0x00
83
84#define MAX31785_DEFAULT_FAN_MAX_PWM 0x2710
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147typedef struct MAX31785State {
148 PMBusDevice parent;
149 uint16_t mfr_mode[MAX31785_TOTAL_NUM_PAGES];
150 uint16_t vout_peak[MAX31785_TOTAL_NUM_PAGES];
151 uint16_t temperature_peak[MAX31785_TOTAL_NUM_PAGES];
152 uint16_t vout_min[MAX31785_TOTAL_NUM_PAGES];
153 uint8_t fault_response[MAX31785_TOTAL_NUM_PAGES];
154 uint32_t time_count[MAX31785_TOTAL_NUM_PAGES];
155 uint16_t temp_sensor_config[MAX31785_TOTAL_NUM_PAGES];
156 uint16_t fan_config[MAX31785_TOTAL_NUM_PAGES];
157 uint16_t read_fan_pwm[MAX31785_TOTAL_NUM_PAGES];
158 uint16_t fan_fault_limit[MAX31785_TOTAL_NUM_PAGES];
159 uint16_t fan_warn_limit[MAX31785_TOTAL_NUM_PAGES];
160 uint16_t fan_run_time[MAX31785_TOTAL_NUM_PAGES];
161 uint16_t fan_pwm_avg[MAX31785_TOTAL_NUM_PAGES];
162 uint64_t fan_pwm2rpm[MAX31785_TOTAL_NUM_PAGES];
163 uint64_t mfr_location;
164 uint64_t mfr_date;
165 uint64_t mfr_serial;
166 uint16_t mfr_revision;
167} MAX31785State;
168
169static uint8_t max31785_read_byte(PMBusDevice *pmdev)
170{
171 MAX31785State *s = MAX31785(pmdev);
172 switch (pmdev->code) {
173
174 case PMBUS_FAN_CONFIG_1_2:
175 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
176 pmbus_send8(pmdev, pmdev->pages[pmdev->page].fan_config_1_2);
177 }
178 break;
179
180 case PMBUS_FAN_COMMAND_1:
181 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
182 pmbus_send16(pmdev, pmdev->pages[pmdev->page].fan_command_1);
183 }
184 break;
185
186 case PMBUS_READ_FAN_SPEED_1:
187 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
188 pmbus_send16(pmdev, pmdev->pages[pmdev->page].read_fan_speed_1);
189 }
190 break;
191
192 case PMBUS_STATUS_FANS_1_2:
193 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
194 pmbus_send16(pmdev, pmdev->pages[pmdev->page].status_fans_1_2);
195 }
196 break;
197
198 case PMBUS_MFR_REVISION:
199 pmbus_send16(pmdev, MAX31785_DEFAULT_MFR_REVISION);
200 break;
201
202 case PMBUS_MFR_ID:
203 pmbus_send8(pmdev, 0x4d);
204 break;
205
206 case PMBUS_MFR_MODEL:
207 pmbus_send8(pmdev, 0x53);
208 break;
209
210 case PMBUS_MFR_LOCATION:
211 pmbus_send64(pmdev, s->mfr_location);
212 break;
213
214 case PMBUS_MFR_DATE:
215 pmbus_send64(pmdev, s->mfr_date);
216 break;
217
218 case PMBUS_MFR_SERIAL:
219 pmbus_send64(pmdev, s->mfr_serial);
220 break;
221
222 case MAX31785_MFR_MODE:
223 pmbus_send16(pmdev, s->mfr_mode[pmdev->page]);
224 break;
225
226 case MAX31785_MFR_VOUT_PEAK:
227 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) &&
228 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) {
229 pmbus_send16(pmdev, s->vout_peak[pmdev->page]);
230 }
231 break;
232
233 case MAX31785_MFR_TEMPERATURE_PEAK:
234 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) &&
235 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) {
236 pmbus_send16(pmdev, s->temperature_peak[pmdev->page]);
237 }
238 break;
239
240 case MAX31785_MFR_VOUT_MIN:
241 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) &&
242 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) {
243 pmbus_send16(pmdev, s->vout_min[pmdev->page]);
244 }
245 break;
246
247 case MAX31785_MFR_FAULT_RESPONSE:
248 pmbus_send8(pmdev, s->fault_response[pmdev->page]);
249 break;
250
251 case MAX31785_MFR_TIME_COUNT:
252 pmbus_send32(pmdev, s->time_count[pmdev->page]);
253 break;
254
255 case MAX31785_MFR_TEMP_SENSOR_CONFIG:
256 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) &&
257 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) {
258 pmbus_send16(pmdev, s->temp_sensor_config[pmdev->page]);
259 }
260 break;
261
262 case MAX31785_MFR_FAN_CONFIG:
263 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
264 pmbus_send16(pmdev, s->fan_config[pmdev->page]);
265 }
266 break;
267
268 case MAX31785_MFR_READ_FAN_PWM:
269 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
270 pmbus_send16(pmdev, s->read_fan_pwm[pmdev->page]);
271 }
272 break;
273
274 case MAX31785_MFR_FAN_FAULT_LIMIT:
275 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
276 pmbus_send16(pmdev, s->fan_fault_limit[pmdev->page]);
277 }
278 break;
279
280 case MAX31785_MFR_FAN_WARN_LIMIT:
281 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
282 pmbus_send16(pmdev, s->fan_warn_limit[pmdev->page]);
283 }
284 break;
285
286 case MAX31785_MFR_FAN_RUN_TIME:
287 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
288 pmbus_send16(pmdev, s->fan_run_time[pmdev->page]);
289 }
290 break;
291
292 case MAX31785_MFR_FAN_PWM_AVG:
293 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
294 pmbus_send16(pmdev, s->fan_pwm_avg[pmdev->page]);
295 }
296 break;
297
298 case MAX31785_MFR_FAN_PWM2RPM:
299 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
300 pmbus_send64(pmdev, s->fan_pwm2rpm[pmdev->page]);
301 }
302 break;
303
304 default:
305 qemu_log_mask(LOG_GUEST_ERROR,
306 "%s: reading from unsupported register: 0x%02x\n",
307 __func__, pmdev->code);
308 break;
309 }
310
311 return 0xFF;
312}
313
314static int max31785_write_data(PMBusDevice *pmdev, const uint8_t *buf,
315 uint8_t len)
316{
317 MAX31785State *s = MAX31785(pmdev);
318 if (len == 0) {
319 qemu_log_mask(LOG_GUEST_ERROR, "%s: writing empty data\n", __func__);
320 return -1;
321 }
322
323 pmdev->code = buf[0];
324
325 if (len == 1) {
326 return 0;
327 }
328
329
330 buf++;
331 len--;
332
333 switch (pmdev->code) {
334
335 case PMBUS_FAN_CONFIG_1_2:
336 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
337 pmdev->pages[pmdev->page].fan_config_1_2 = pmbus_receive8(pmdev);
338 }
339 break;
340
341 case PMBUS_FAN_COMMAND_1:
342 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
343 pmdev->pages[pmdev->page].fan_command_1 = pmbus_receive16(pmdev);
344 pmdev->pages[pmdev->page].read_fan_speed_1 =
345 ((MAX31785_DEFAULT_FAN_SPEED / MAX31785_DEFAULT_FAN_MAX_PWM) *
346 pmdev->pages[pmdev->page].fan_command_1);
347 }
348 break;
349
350 case PMBUS_MFR_LOCATION:
351 s->mfr_location = pmbus_receive64(pmdev);
352 break;
353
354 case PMBUS_MFR_DATE:
355 s->mfr_date = pmbus_receive64(pmdev);
356 break;
357
358 case PMBUS_MFR_SERIAL:
359 s->mfr_serial = pmbus_receive64(pmdev);
360 break;
361
362 case MAX31785_MFR_MODE:
363 s->mfr_mode[pmdev->page] = pmbus_receive16(pmdev);
364 break;
365
366 case MAX31785_MFR_VOUT_PEAK:
367 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) &&
368 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) {
369 s->vout_peak[pmdev->page] = pmbus_receive16(pmdev);
370 }
371 break;
372
373 case MAX31785_MFR_TEMPERATURE_PEAK:
374 if ((pmdev->page >= 6) && (pmdev->page <= 16)) {
375 s->temperature_peak[pmdev->page] = pmbus_receive16(pmdev);
376 }
377 break;
378
379 case MAX31785_MFR_VOUT_MIN:
380 if ((pmdev->page >= MAX31785_MIN_ADC_VOLTAGE_PAGE) &&
381 (pmdev->page <= MAX31785_MAX_ADC_VOLTAGE_PAGE)) {
382 s->vout_min[pmdev->page] = pmbus_receive16(pmdev);
383 }
384 break;
385
386 case MAX31785_MFR_FAULT_RESPONSE:
387 s->fault_response[pmdev->page] = pmbus_receive8(pmdev);
388 break;
389
390 case MAX31785_MFR_TIME_COUNT:
391 s->time_count[pmdev->page] = pmbus_receive32(pmdev);
392 break;
393
394 case MAX31785_MFR_TEMP_SENSOR_CONFIG:
395 if ((pmdev->page >= MAX31785_MIN_TEMP_PAGE) &&
396 (pmdev->page <= MAX31785_MAX_TEMP_PAGE)) {
397 s->temp_sensor_config[pmdev->page] = pmbus_receive16(pmdev);
398 }
399 break;
400
401 case MAX31785_MFR_FAN_CONFIG:
402 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
403 s->fan_config[pmdev->page] = pmbus_receive16(pmdev);
404 }
405 break;
406
407 case MAX31785_MFR_FAN_FAULT_LIMIT:
408 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
409 s->fan_fault_limit[pmdev->page] = pmbus_receive16(pmdev);
410 }
411 break;
412
413 case MAX31785_MFR_FAN_WARN_LIMIT:
414 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
415 s->fan_warn_limit[pmdev->page] = pmbus_receive16(pmdev);
416 }
417 break;
418
419 case MAX31785_MFR_FAN_RUN_TIME:
420 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
421 s->fan_run_time[pmdev->page] = pmbus_receive16(pmdev);
422 }
423 break;
424
425 case MAX31785_MFR_FAN_PWM_AVG:
426 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
427 s->fan_pwm_avg[pmdev->page] = pmbus_receive16(pmdev);
428 }
429 break;
430
431 case MAX31785_MFR_FAN_PWM2RPM:
432 if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
433 s->fan_pwm2rpm[pmdev->page] = pmbus_receive64(pmdev);
434 }
435 break;
436
437 default:
438 qemu_log_mask(LOG_GUEST_ERROR,
439 "%s: writing to unsupported register: 0x%02x\n",
440 __func__, pmdev->code);
441 break;
442 }
443
444 return 0;
445}
446
447static void max31785_exit_reset(Object *obj)
448{
449 PMBusDevice *pmdev = PMBUS_DEVICE(obj);
450 MAX31785State *s = MAX31785(obj);
451
452 pmdev->capability = MAX31785_DEFAULT_CAPABILITY;
453
454 for (int i = MAX31785_MIN_FAN_PAGE; i <= MAX31785_MAX_FAN_PAGE; i++) {
455 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE;
456 pmdev->pages[i].fan_command_1 = MAX31785_DEFAULT_FAN_COMMAND_1;
457 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION;
458 pmdev->pages[i].fan_config_1_2 = MAX31785_DEFAULT_FAN_CONFIG_1_2(0);
459 pmdev->pages[i].read_fan_speed_1 = MAX31785_DEFAULT_FAN_SPEED;
460 pmdev->pages[i].status_fans_1_2 = MAX31785_DEFAULT_FAN_STATUS;
461 }
462
463 for (int i = MAX31785_MIN_TEMP_PAGE; i <= MAX31785_MAX_TEMP_PAGE; i++) {
464 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE;
465 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION;
466 pmdev->pages[i].ot_fault_limit = MAX31785_DEFAULT_OT_FAULT_LIMIT;
467 pmdev->pages[i].ot_warn_limit = MAX31785_DEFAULT_OT_WARN_LIMIT;
468 }
469
470 for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE;
471 i <= MAX31785_MAX_ADC_VOLTAGE_PAGE;
472 i++) {
473 pmdev->pages[i].vout_mode = MAX31785_DEFAULT_VOUT_MODE;
474 pmdev->pages[i].revision = MAX31785_DEFAULT_PMBUS_REVISION;
475 pmdev->pages[i].vout_scale_monitor =
476 MAX31785_DEFAULT_VOUT_SCALE_MONITOR;
477 pmdev->pages[i].vout_ov_fault_limit = MAX31785_DEFAULT_OV_FAULT_LIMIT;
478 pmdev->pages[i].vout_ov_warn_limit = MAX31785_DEFAULT_OV_WARN_LIMIT;
479 }
480
481 s->mfr_location = MAX31785_DEFAULT_TEXT;
482 s->mfr_date = MAX31785_DEFAULT_TEXT;
483 s->mfr_serial = MAX31785_DEFAULT_TEXT;
484}
485
486static const VMStateDescription vmstate_max31785 = {
487 .name = TYPE_MAX31785,
488 .version_id = 0,
489 .minimum_version_id = 0,
490 .fields = (VMStateField[]){
491 VMSTATE_PMBUS_DEVICE(parent, MAX31785State),
492 VMSTATE_UINT16_ARRAY(mfr_mode, MAX31785State,
493 MAX31785_TOTAL_NUM_PAGES),
494 VMSTATE_UINT16_ARRAY(vout_peak, MAX31785State,
495 MAX31785_TOTAL_NUM_PAGES),
496 VMSTATE_UINT16_ARRAY(temperature_peak, MAX31785State,
497 MAX31785_TOTAL_NUM_PAGES),
498 VMSTATE_UINT16_ARRAY(vout_min, MAX31785State,
499 MAX31785_TOTAL_NUM_PAGES),
500 VMSTATE_UINT8_ARRAY(fault_response, MAX31785State,
501 MAX31785_TOTAL_NUM_PAGES),
502 VMSTATE_UINT32_ARRAY(time_count, MAX31785State,
503 MAX31785_TOTAL_NUM_PAGES),
504 VMSTATE_UINT16_ARRAY(temp_sensor_config, MAX31785State,
505 MAX31785_TOTAL_NUM_PAGES),
506 VMSTATE_UINT16_ARRAY(fan_config, MAX31785State,
507 MAX31785_TOTAL_NUM_PAGES),
508 VMSTATE_UINT16_ARRAY(read_fan_pwm, MAX31785State,
509 MAX31785_TOTAL_NUM_PAGES),
510 VMSTATE_UINT16_ARRAY(fan_fault_limit, MAX31785State,
511 MAX31785_TOTAL_NUM_PAGES),
512 VMSTATE_UINT16_ARRAY(fan_warn_limit, MAX31785State,
513 MAX31785_TOTAL_NUM_PAGES),
514 VMSTATE_UINT16_ARRAY(fan_run_time, MAX31785State,
515 MAX31785_TOTAL_NUM_PAGES),
516 VMSTATE_UINT16_ARRAY(fan_pwm_avg, MAX31785State,
517 MAX31785_TOTAL_NUM_PAGES),
518 VMSTATE_UINT64_ARRAY(fan_pwm2rpm, MAX31785State,
519 MAX31785_TOTAL_NUM_PAGES),
520 VMSTATE_UINT64(mfr_location, MAX31785State),
521 VMSTATE_UINT64(mfr_date, MAX31785State),
522 VMSTATE_UINT64(mfr_serial, MAX31785State),
523 VMSTATE_END_OF_LIST()
524 }
525};
526
527static void max31785_init(Object *obj)
528{
529 PMBusDevice *pmdev = PMBUS_DEVICE(obj);
530
531 for (int i = MAX31785_MIN_FAN_PAGE; i <= MAX31785_MAX_FAN_PAGE; i++) {
532 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE);
533 }
534
535 for (int i = MAX31785_MIN_TEMP_PAGE; i <= MAX31785_MAX_TEMP_PAGE; i++) {
536 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE | PB_HAS_TEMPERATURE);
537 }
538
539 for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE;
540 i <= MAX31785_MAX_ADC_VOLTAGE_PAGE;
541 i++) {
542 pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE | PB_HAS_VOUT |
543 PB_HAS_VOUT_RATING);
544 }
545}
546
547static void max31785_class_init(ObjectClass *klass, void *data)
548{
549 ResettableClass *rc = RESETTABLE_CLASS(klass);
550 DeviceClass *dc = DEVICE_CLASS(klass);
551 PMBusDeviceClass *k = PMBUS_DEVICE_CLASS(klass);
552 dc->desc = "Maxim MAX31785 6-Channel Fan Controller";
553 dc->vmsd = &vmstate_max31785;
554 k->write_data = max31785_write_data;
555 k->receive_byte = max31785_read_byte;
556 k->device_num_pages = MAX31785_TOTAL_NUM_PAGES;
557 rc->phases.exit = max31785_exit_reset;
558}
559
560static const TypeInfo max31785_info = {
561 .name = TYPE_MAX31785,
562 .parent = TYPE_PMBUS_DEVICE,
563 .instance_size = sizeof(MAX31785State),
564 .instance_init = max31785_init,
565 .class_init = max31785_class_init,
566};
567
568static void max31785_register_types(void)
569{
570 type_register_static(&max31785_info);
571}
572
573type_init(max31785_register_types)
574