11
#include "qemu/osdep.h"
12
#include "hw/i2c/pmbus_device.h"
14
#include "migration/vmstate.h"
15
#include "qapi/error.h"
16
#include "qapi/visitor.h"
18
#include "qemu/module.h"
20
#define TYPE_MAX31785 "max31785"
21
#define MAX31785(obj) OBJECT_CHECK(MAX31785State, (obj), TYPE_MAX31785)
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
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
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
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
81
#define MAX31785_DEFAULT_FAN_SPEED 0x7fff
82
#define MAX31785_DEFAULT_FAN_STATUS 0x00
84
#define MAX31785_DEFAULT_FAN_MAX_PWM 0x2710
147
typedef struct MAX31785State {
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;
166
uint16_t mfr_revision;
169
static uint8_t max31785_read_byte(PMBusDevice *pmdev)
171
MAX31785State *s = MAX31785(pmdev);
172
switch (pmdev->code) {
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);
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);
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);
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);
198
case PMBUS_MFR_REVISION:
199
pmbus_send16(pmdev, MAX31785_DEFAULT_MFR_REVISION);
203
pmbus_send8(pmdev, 0x4d);
206
case PMBUS_MFR_MODEL:
207
pmbus_send8(pmdev, 0x53);
210
case PMBUS_MFR_LOCATION:
211
pmbus_send64(pmdev, s->mfr_location);
215
pmbus_send64(pmdev, s->mfr_date);
218
case PMBUS_MFR_SERIAL:
219
pmbus_send64(pmdev, s->mfr_serial);
222
case MAX31785_MFR_MODE:
223
pmbus_send16(pmdev, s->mfr_mode[pmdev->page]);
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]);
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]);
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]);
247
case MAX31785_MFR_FAULT_RESPONSE:
248
pmbus_send8(pmdev, s->fault_response[pmdev->page]);
251
case MAX31785_MFR_TIME_COUNT:
252
pmbus_send32(pmdev, s->time_count[pmdev->page]);
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]);
262
case MAX31785_MFR_FAN_CONFIG:
263
if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
264
pmbus_send16(pmdev, s->fan_config[pmdev->page]);
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]);
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]);
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]);
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]);
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]);
298
case MAX31785_MFR_FAN_PWM2RPM:
299
if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
300
pmbus_send64(pmdev, s->fan_pwm2rpm[pmdev->page]);
305
qemu_log_mask(LOG_GUEST_ERROR,
306
"%s: reading from unsupported register: 0x%02x\n",
307
__func__, pmdev->code);
314
static int max31785_write_data(PMBusDevice *pmdev, const uint8_t *buf,
317
MAX31785State *s = MAX31785(pmdev);
319
qemu_log_mask(LOG_GUEST_ERROR, "%s: writing empty data\n", __func__);
323
pmdev->code = buf[0];
333
switch (pmdev->code) {
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);
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);
350
case PMBUS_MFR_LOCATION:
351
s->mfr_location = pmbus_receive64(pmdev);
355
s->mfr_date = pmbus_receive64(pmdev);
358
case PMBUS_MFR_SERIAL:
359
s->mfr_serial = pmbus_receive64(pmdev);
362
case MAX31785_MFR_MODE:
363
s->mfr_mode[pmdev->page] = pmbus_receive16(pmdev);
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);
373
case MAX31785_MFR_TEMPERATURE_PEAK:
374
if ((pmdev->page >= 6) && (pmdev->page <= 16)) {
375
s->temperature_peak[pmdev->page] = pmbus_receive16(pmdev);
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);
386
case MAX31785_MFR_FAULT_RESPONSE:
387
s->fault_response[pmdev->page] = pmbus_receive8(pmdev);
390
case MAX31785_MFR_TIME_COUNT:
391
s->time_count[pmdev->page] = pmbus_receive32(pmdev);
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);
401
case MAX31785_MFR_FAN_CONFIG:
402
if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
403
s->fan_config[pmdev->page] = pmbus_receive16(pmdev);
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);
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);
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);
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);
431
case MAX31785_MFR_FAN_PWM2RPM:
432
if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
433
s->fan_pwm2rpm[pmdev->page] = pmbus_receive64(pmdev);
438
qemu_log_mask(LOG_GUEST_ERROR,
439
"%s: writing to unsupported register: 0x%02x\n",
440
__func__, pmdev->code);
447
static void max31785_exit_reset(Object *obj, ResetType type)
449
PMBusDevice *pmdev = PMBUS_DEVICE(obj);
450
MAX31785State *s = MAX31785(obj);
452
pmdev->capability = MAX31785_DEFAULT_CAPABILITY;
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;
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;
470
for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE;
471
i <= MAX31785_MAX_ADC_VOLTAGE_PAGE;
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;
481
s->mfr_location = MAX31785_DEFAULT_TEXT;
482
s->mfr_date = MAX31785_DEFAULT_TEXT;
483
s->mfr_serial = MAX31785_DEFAULT_TEXT;
486
static const VMStateDescription vmstate_max31785 = {
487
.name = TYPE_MAX31785,
489
.minimum_version_id = 0,
490
.fields = (const 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()
527
static void max31785_init(Object *obj)
529
PMBusDevice *pmdev = PMBUS_DEVICE(obj);
531
for (int i = MAX31785_MIN_FAN_PAGE; i <= MAX31785_MAX_FAN_PAGE; i++) {
532
pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE);
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);
539
for (int i = MAX31785_MIN_ADC_VOLTAGE_PAGE;
540
i <= MAX31785_MAX_ADC_VOLTAGE_PAGE;
542
pmbus_page_config(pmdev, i, PB_HAS_VOUT_MODE | PB_HAS_VOUT |
547
static void max31785_class_init(ObjectClass *klass, void *data)
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;
560
static 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,
568
static void max31785_register_types(void)
570
type_register_static(&max31785_info);
573
type_init(max31785_register_types)