1*ffcdae67STitus Rwantare /* 2*ffcdae67STitus Rwantare * QTests for the ISL_PMBUS digital voltage regulators 3*ffcdae67STitus Rwantare * 4*ffcdae67STitus Rwantare * Copyright 2021 Google LLC 5*ffcdae67STitus Rwantare * 6*ffcdae67STitus Rwantare * This program is free software; you can redistribute it and/or modify it 7*ffcdae67STitus Rwantare * under the terms of the GNU General Public License as published by the 8*ffcdae67STitus Rwantare * Free Software Foundation; either version 2 of the License, or 9*ffcdae67STitus Rwantare * (at your option) any later version. 10*ffcdae67STitus Rwantare * 11*ffcdae67STitus Rwantare * This program is distributed in the hope that it will be useful, but WITHOUT 12*ffcdae67STitus Rwantare * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*ffcdae67STitus Rwantare * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*ffcdae67STitus Rwantare * for more details. 15*ffcdae67STitus Rwantare */ 16*ffcdae67STitus Rwantare 17*ffcdae67STitus Rwantare #include "qemu/osdep.h" 18*ffcdae67STitus Rwantare #include <math.h> 19*ffcdae67STitus Rwantare #include "hw/i2c/pmbus_device.h" 20*ffcdae67STitus Rwantare #include "hw/sensor/isl_pmbus_vr.h" 21*ffcdae67STitus Rwantare #include "libqtest-single.h" 22*ffcdae67STitus Rwantare #include "libqos/qgraph.h" 23*ffcdae67STitus Rwantare #include "libqos/i2c.h" 24*ffcdae67STitus Rwantare #include "qapi/qmp/qdict.h" 25*ffcdae67STitus Rwantare #include "qapi/qmp/qnum.h" 26*ffcdae67STitus Rwantare #include "qemu/bitops.h" 27*ffcdae67STitus Rwantare 28*ffcdae67STitus Rwantare #define TEST_ID "isl_pmbus_vr-test" 29*ffcdae67STitus Rwantare #define TEST_ADDR (0x43) 30*ffcdae67STitus Rwantare 31*ffcdae67STitus Rwantare static uint16_t qmp_isl_pmbus_vr_get(const char *id, const char *property) 32*ffcdae67STitus Rwantare { 33*ffcdae67STitus Rwantare QDict *response; 34*ffcdae67STitus Rwantare uint64_t ret; 35*ffcdae67STitus Rwantare 36*ffcdae67STitus Rwantare response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, " 37*ffcdae67STitus Rwantare "'property': %s } }", id, property); 38*ffcdae67STitus Rwantare g_assert(qdict_haskey(response, "return")); 39*ffcdae67STitus Rwantare ret = qnum_get_uint(qobject_to(QNum, qdict_get(response, "return"))); 40*ffcdae67STitus Rwantare qobject_unref(response); 41*ffcdae67STitus Rwantare return ret; 42*ffcdae67STitus Rwantare } 43*ffcdae67STitus Rwantare 44*ffcdae67STitus Rwantare static void qmp_isl_pmbus_vr_set(const char *id, 45*ffcdae67STitus Rwantare const char *property, 46*ffcdae67STitus Rwantare uint16_t value) 47*ffcdae67STitus Rwantare { 48*ffcdae67STitus Rwantare QDict *response; 49*ffcdae67STitus Rwantare 50*ffcdae67STitus Rwantare response = qmp("{ 'execute': 'qom-set', 'arguments': { 'path': %s, " 51*ffcdae67STitus Rwantare "'property': %s, 'value': %u } }", id, property, value); 52*ffcdae67STitus Rwantare g_assert(qdict_haskey(response, "return")); 53*ffcdae67STitus Rwantare qobject_unref(response); 54*ffcdae67STitus Rwantare } 55*ffcdae67STitus Rwantare 56*ffcdae67STitus Rwantare /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */ 57*ffcdae67STitus Rwantare static uint16_t isl_pmbus_vr_i2c_get16(QI2CDevice *i2cdev, uint8_t reg) 58*ffcdae67STitus Rwantare { 59*ffcdae67STitus Rwantare uint8_t resp[2]; 60*ffcdae67STitus Rwantare i2c_read_block(i2cdev, reg, resp, sizeof(resp)); 61*ffcdae67STitus Rwantare return (resp[1] << 8) | resp[0]; 62*ffcdae67STitus Rwantare } 63*ffcdae67STitus Rwantare 64*ffcdae67STitus Rwantare /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */ 65*ffcdae67STitus Rwantare static void isl_pmbus_vr_i2c_set16(QI2CDevice *i2cdev, uint8_t reg, 66*ffcdae67STitus Rwantare uint16_t value) 67*ffcdae67STitus Rwantare { 68*ffcdae67STitus Rwantare uint8_t data[2]; 69*ffcdae67STitus Rwantare 70*ffcdae67STitus Rwantare data[0] = value & 255; 71*ffcdae67STitus Rwantare data[1] = value >> 8; 72*ffcdae67STitus Rwantare i2c_write_block(i2cdev, reg, data, sizeof(data)); 73*ffcdae67STitus Rwantare } 74*ffcdae67STitus Rwantare 75*ffcdae67STitus Rwantare static void test_defaults(void *obj, void *data, QGuestAllocator *alloc) 76*ffcdae67STitus Rwantare { 77*ffcdae67STitus Rwantare uint16_t value, i2c_value; 78*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 79*ffcdae67STitus Rwantare 80*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]"); 81*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_VOUT_DEFAULT); 82*ffcdae67STitus Rwantare 83*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 84*ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_IOUT_DEFAULT); 85*ffcdae67STitus Rwantare 86*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]"); 87*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_POUT_DEFAULT); 88*ffcdae67STitus Rwantare 89*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 90*ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_VIN_DEFAULT); 91*ffcdae67STitus Rwantare 92*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]"); 93*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_IIN_DEFAULT); 94*ffcdae67STitus Rwantare 95*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 96*ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_PIN_DEFAULT); 97*ffcdae67STitus Rwantare 98*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]"); 99*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_TEMP_DEFAULT); 100*ffcdae67STitus Rwantare 101*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 102*ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_TEMP_DEFAULT); 103*ffcdae67STitus Rwantare 104*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_CAPABILITY); 105*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_CAPABILITY_DEFAULT); 106*ffcdae67STitus Rwantare 107*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION); 108*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OPERATION_DEFAULT); 109*ffcdae67STitus Rwantare 110*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG); 111*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_ON_OFF_CONFIG_DEFAULT); 112*ffcdae67STitus Rwantare 113*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_VOUT_MODE); 114*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MODE_DEFAULT); 115*ffcdae67STitus Rwantare 116*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND); 117*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_COMMAND_DEFAULT); 118*ffcdae67STitus Rwantare 119*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX); 120*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MAX_DEFAULT); 121*ffcdae67STitus Rwantare 122*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH); 123*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_HIGH_DEFAULT); 124*ffcdae67STitus Rwantare 125*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW); 126*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_LOW_DEFAULT); 127*ffcdae67STitus Rwantare 128*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE); 129*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_TRANSITION_RATE_DEFAULT); 130*ffcdae67STitus Rwantare 131*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT); 132*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_OV_FAULT_LIMIT_DEFAULT); 133*ffcdae67STitus Rwantare 134*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT); 135*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_FAULT_LIMIT_DEFAULT); 136*ffcdae67STitus Rwantare 137*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT); 138*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_WARN_LIMIT_DEFAULT); 139*ffcdae67STitus Rwantare 140*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_WARN_LIMIT); 141*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_OV_WARN_LIMIT_DEFAULT); 142*ffcdae67STitus Rwantare 143*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_WARN_LIMIT); 144*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_UV_WARN_LIMIT_DEFAULT); 145*ffcdae67STitus Rwantare 146*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT); 147*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_IIN_OC_FAULT_LIMIT_DEFAULT); 148*ffcdae67STitus Rwantare 149*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_REVISION); 150*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_REVISION_DEFAULT); 151*ffcdae67STitus Rwantare } 152*ffcdae67STitus Rwantare 153*ffcdae67STitus Rwantare /* test qmp access */ 154*ffcdae67STitus Rwantare static void test_tx_rx(void *obj, void *data, QGuestAllocator *alloc) 155*ffcdae67STitus Rwantare { 156*ffcdae67STitus Rwantare uint16_t i2c_value, value; 157*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 158*ffcdae67STitus Rwantare 159*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vin[0]", 200); 160*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vin[0]"); 161*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 162*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 163*ffcdae67STitus Rwantare 164*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 2500); 165*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]"); 166*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 167*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 168*ffcdae67STitus Rwantare 169*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "iin[0]", 300); 170*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]"); 171*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 172*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 173*ffcdae67STitus Rwantare 174*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "iout[0]", 310); 175*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iout[0]"); 176*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 177*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 178*ffcdae67STitus Rwantare 179*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "pin[0]", 100); 180*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pin[0]"); 181*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 182*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 183*ffcdae67STitus Rwantare 184*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "pout[0]", 95); 185*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]"); 186*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 187*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 188*ffcdae67STitus Rwantare 189*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp1[0]", 26); 190*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]"); 191*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 192*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 193*ffcdae67STitus Rwantare 194*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp2[0]", 27); 195*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp2[0]"); 196*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 197*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 198*ffcdae67STitus Rwantare 199*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp3[0]", 28); 200*ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp3[0]"); 201*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 202*ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 203*ffcdae67STitus Rwantare 204*ffcdae67STitus Rwantare } 205*ffcdae67STitus Rwantare 206*ffcdae67STitus Rwantare /* test r/w registers */ 207*ffcdae67STitus Rwantare static void test_rw_regs(void *obj, void *data, QGuestAllocator *alloc) 208*ffcdae67STitus Rwantare { 209*ffcdae67STitus Rwantare uint16_t i2c_value; 210*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 211*ffcdae67STitus Rwantare 212*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_COMMAND, 0x1234); 213*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND); 214*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x1234); 215*ffcdae67STitus Rwantare 216*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRIM, 0x4567); 217*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRIM); 218*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x4567); 219*ffcdae67STitus Rwantare 220*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MAX, 0x9876); 221*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX); 222*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x9876); 223*ffcdae67STitus Rwantare 224*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_HIGH, 0xABCD); 225*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH); 226*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xABCD); 227*ffcdae67STitus Rwantare 228*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_LOW, 0xA1B2); 229*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW); 230*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xA1B2); 231*ffcdae67STitus Rwantare 232*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRANSITION_RATE, 0xDEF1); 233*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE); 234*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xDEF1); 235*ffcdae67STitus Rwantare 236*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_DROOP, 0x5678); 237*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_DROOP); 238*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x5678); 239*ffcdae67STitus Rwantare 240*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MIN, 0x1234); 241*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MIN); 242*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x1234); 243*ffcdae67STitus Rwantare 244*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT, 0x2345); 245*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT); 246*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x2345); 247*ffcdae67STitus Rwantare 248*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT, 0xFA12); 249*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT); 250*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xFA12); 251*ffcdae67STitus Rwantare 252*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_FAULT_LIMIT, 0xF077); 253*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT); 254*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xF077); 255*ffcdae67STitus Rwantare 256*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_WARN_LIMIT, 0x7137); 257*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT); 258*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x7137); 259*ffcdae67STitus Rwantare 260*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT, 0x3456); 261*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT); 262*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x3456); 263*ffcdae67STitus Rwantare 264*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT, 0xBADA); 265*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT); 266*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xBADA); 267*ffcdae67STitus Rwantare 268*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT, 0xB1B0); 269*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT); 270*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xB1B0); 271*ffcdae67STitus Rwantare 272*ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_OPERATION, 0xA); 273*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION); 274*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xA); 275*ffcdae67STitus Rwantare 276*ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_ON_OFF_CONFIG, 0x42); 277*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG); 278*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x42); 279*ffcdae67STitus Rwantare } 280*ffcdae67STitus Rwantare 281*ffcdae67STitus Rwantare /* test that devices with multiple pages can switch between them */ 282*ffcdae67STitus Rwantare static void test_pages_rw(void *obj, void *data, QGuestAllocator *alloc) 283*ffcdae67STitus Rwantare { 284*ffcdae67STitus Rwantare uint16_t i2c_value; 285*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 286*ffcdae67STitus Rwantare 287*ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_PAGE, 1); 288*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_PAGE); 289*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 1); 290*ffcdae67STitus Rwantare 291*ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_PAGE, 0); 292*ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_PAGE); 293*ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0); 294*ffcdae67STitus Rwantare } 295*ffcdae67STitus Rwantare 296*ffcdae67STitus Rwantare /* test read-only registers */ 297*ffcdae67STitus Rwantare static void test_ro_regs(void *obj, void *data, QGuestAllocator *alloc) 298*ffcdae67STitus Rwantare { 299*ffcdae67STitus Rwantare uint16_t i2c_init_value, i2c_value; 300*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 301*ffcdae67STitus Rwantare 302*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 303*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VIN, 0xBEEF); 304*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 305*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 306*ffcdae67STitus Rwantare 307*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 308*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IIN, 0xB00F); 309*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 310*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 311*ffcdae67STitus Rwantare 312*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 313*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VOUT, 0x1234); 314*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 315*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 316*ffcdae67STitus Rwantare 317*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 318*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IOUT, 0x6547); 319*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 320*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 321*ffcdae67STitus Rwantare 322*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 323*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_1, 0x1597); 324*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 325*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 326*ffcdae67STitus Rwantare 327*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 328*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_2, 0x1897); 329*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 330*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 331*ffcdae67STitus Rwantare 332*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 333*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_3, 0x1007); 334*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 335*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 336*ffcdae67STitus Rwantare 337*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 338*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_PIN, 0xDEAD); 339*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 340*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 341*ffcdae67STitus Rwantare 342*ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 343*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_POUT, 0xD00D); 344*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 345*ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 346*ffcdae67STitus Rwantare } 347*ffcdae67STitus Rwantare 348*ffcdae67STitus Rwantare /* test voltage fault handling */ 349*ffcdae67STitus Rwantare static void test_voltage_faults(void *obj, void *data, QGuestAllocator *alloc) 350*ffcdae67STitus Rwantare { 351*ffcdae67STitus Rwantare uint16_t i2c_value; 352*ffcdae67STitus Rwantare uint8_t i2c_byte; 353*ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 354*ffcdae67STitus Rwantare 355*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_WARN_LIMIT, 5000); 356*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 5100); 357*ffcdae67STitus Rwantare 358*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD); 359*ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 360*ffcdae67STitus Rwantare g_assert_true((i2c_value & PB_STATUS_VOUT) != 0); 361*ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) != 0); 362*ffcdae67STitus Rwantare 363*ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 4500); 364*ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_CLEAR_FAULTS, 0); 365*ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 366*ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) == 0); 367*ffcdae67STitus Rwantare 368*ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_WARN_LIMIT, 4600); 369*ffcdae67STitus Rwantare 370*ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD); 371*ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 372*ffcdae67STitus Rwantare g_assert_true((i2c_value & PB_STATUS_VOUT) != 0); 373*ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_UV_WARN) != 0); 374*ffcdae67STitus Rwantare 375*ffcdae67STitus Rwantare } 376*ffcdae67STitus Rwantare 377*ffcdae67STitus Rwantare static void isl_pmbus_vr_register_nodes(void) 378*ffcdae67STitus Rwantare { 379*ffcdae67STitus Rwantare QOSGraphEdgeOptions opts = { 380*ffcdae67STitus Rwantare .extra_device_opts = "id=" TEST_ID ",address=0x43" 381*ffcdae67STitus Rwantare }; 382*ffcdae67STitus Rwantare add_qi2c_address(&opts, &(QI2CAddress) { TEST_ADDR }); 383*ffcdae67STitus Rwantare 384*ffcdae67STitus Rwantare qos_node_create_driver("isl69260", i2c_device_create); 385*ffcdae67STitus Rwantare qos_node_consumes("isl69260", "i2c-bus", &opts); 386*ffcdae67STitus Rwantare 387*ffcdae67STitus Rwantare qos_add_test("test_defaults", "isl69260", test_defaults, NULL); 388*ffcdae67STitus Rwantare qos_add_test("test_tx_rx", "isl69260", test_tx_rx, NULL); 389*ffcdae67STitus Rwantare qos_add_test("test_rw_regs", "isl69260", test_rw_regs, NULL); 390*ffcdae67STitus Rwantare qos_add_test("test_pages_rw", "isl69260", test_pages_rw, NULL); 391*ffcdae67STitus Rwantare qos_add_test("test_ro_regs", "isl69260", test_ro_regs, NULL); 392*ffcdae67STitus Rwantare qos_add_test("test_ov_faults", "isl69260", test_voltage_faults, NULL); 393*ffcdae67STitus Rwantare } 394*ffcdae67STitus Rwantare libqos_init(isl_pmbus_vr_register_nodes); 395