1ffcdae67STitus Rwantare /* 2ffcdae67STitus Rwantare * QTests for the ISL_PMBUS digital voltage regulators 3ffcdae67STitus Rwantare * 4ffcdae67STitus Rwantare * Copyright 2021 Google LLC 5ffcdae67STitus Rwantare * 6ffcdae67STitus Rwantare * This program is free software; you can redistribute it and/or modify it 7ffcdae67STitus Rwantare * under the terms of the GNU General Public License as published by the 8ffcdae67STitus Rwantare * Free Software Foundation; either version 2 of the License, or 9ffcdae67STitus Rwantare * (at your option) any later version. 10ffcdae67STitus Rwantare * 11ffcdae67STitus Rwantare * This program is distributed in the hope that it will be useful, but WITHOUT 12ffcdae67STitus Rwantare * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13ffcdae67STitus Rwantare * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14ffcdae67STitus Rwantare * for more details. 15ffcdae67STitus Rwantare */ 16ffcdae67STitus Rwantare 17ffcdae67STitus Rwantare #include "qemu/osdep.h" 18ffcdae67STitus Rwantare #include <math.h> 19ffcdae67STitus Rwantare #include "hw/i2c/pmbus_device.h" 20ffcdae67STitus Rwantare #include "hw/sensor/isl_pmbus_vr.h" 21ffcdae67STitus Rwantare #include "libqtest-single.h" 22ffcdae67STitus Rwantare #include "libqos/qgraph.h" 23ffcdae67STitus Rwantare #include "libqos/i2c.h" 24*407bc4bfSDaniel P. Berrangé #include "qobject/qdict.h" 25*407bc4bfSDaniel P. Berrangé #include "qobject/qnum.h" 26ffcdae67STitus Rwantare #include "qemu/bitops.h" 27ffcdae67STitus Rwantare 28ffcdae67STitus Rwantare #define TEST_ID "isl_pmbus_vr-test" 29ffcdae67STitus Rwantare #define TEST_ADDR (0x43) 30ffcdae67STitus Rwantare 31ffcdae67STitus Rwantare static uint16_t qmp_isl_pmbus_vr_get(const char *id, const char *property) 32ffcdae67STitus Rwantare { 33ffcdae67STitus Rwantare QDict *response; 34ffcdae67STitus Rwantare uint64_t ret; 35ffcdae67STitus Rwantare 36ffcdae67STitus Rwantare response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, " 37ffcdae67STitus Rwantare "'property': %s } }", id, property); 38ffcdae67STitus Rwantare g_assert(qdict_haskey(response, "return")); 39ffcdae67STitus Rwantare ret = qnum_get_uint(qobject_to(QNum, qdict_get(response, "return"))); 40ffcdae67STitus Rwantare qobject_unref(response); 41ffcdae67STitus Rwantare return ret; 42ffcdae67STitus Rwantare } 43ffcdae67STitus Rwantare 44ffcdae67STitus Rwantare static void qmp_isl_pmbus_vr_set(const char *id, 45ffcdae67STitus Rwantare const char *property, 46ffcdae67STitus Rwantare uint16_t value) 47ffcdae67STitus Rwantare { 48ffcdae67STitus Rwantare QDict *response; 49ffcdae67STitus Rwantare 50ffcdae67STitus Rwantare response = qmp("{ 'execute': 'qom-set', 'arguments': { 'path': %s, " 51ffcdae67STitus Rwantare "'property': %s, 'value': %u } }", id, property, value); 52ffcdae67STitus Rwantare g_assert(qdict_haskey(response, "return")); 53ffcdae67STitus Rwantare qobject_unref(response); 54ffcdae67STitus Rwantare } 55ffcdae67STitus Rwantare 56ffcdae67STitus Rwantare /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */ 57ffcdae67STitus Rwantare static uint16_t isl_pmbus_vr_i2c_get16(QI2CDevice *i2cdev, uint8_t reg) 58ffcdae67STitus Rwantare { 59ffcdae67STitus Rwantare uint8_t resp[2]; 60ffcdae67STitus Rwantare i2c_read_block(i2cdev, reg, resp, sizeof(resp)); 61ffcdae67STitus Rwantare return (resp[1] << 8) | resp[0]; 62ffcdae67STitus Rwantare } 63ffcdae67STitus Rwantare 64ffcdae67STitus Rwantare /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */ 65ffcdae67STitus Rwantare static void isl_pmbus_vr_i2c_set16(QI2CDevice *i2cdev, uint8_t reg, 66ffcdae67STitus Rwantare uint16_t value) 67ffcdae67STitus Rwantare { 68ffcdae67STitus Rwantare uint8_t data[2]; 69ffcdae67STitus Rwantare 70ffcdae67STitus Rwantare data[0] = value & 255; 71ffcdae67STitus Rwantare data[1] = value >> 8; 72ffcdae67STitus Rwantare i2c_write_block(i2cdev, reg, data, sizeof(data)); 73ffcdae67STitus Rwantare } 74ffcdae67STitus Rwantare 75ffcdae67STitus Rwantare static void test_defaults(void *obj, void *data, QGuestAllocator *alloc) 76ffcdae67STitus Rwantare { 77ffcdae67STitus Rwantare uint16_t value, i2c_value; 78ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 79ffcdae67STitus Rwantare 80ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]"); 81ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_VOUT_DEFAULT); 82ffcdae67STitus Rwantare 83ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 84ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_IOUT_DEFAULT); 85ffcdae67STitus Rwantare 86ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]"); 87ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_POUT_DEFAULT); 88ffcdae67STitus Rwantare 89ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 90ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_VIN_DEFAULT); 91ffcdae67STitus Rwantare 92ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]"); 93ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_IIN_DEFAULT); 94ffcdae67STitus Rwantare 95ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 96ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_PIN_DEFAULT); 97ffcdae67STitus Rwantare 98ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]"); 99ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, ISL_READ_TEMP_DEFAULT); 100ffcdae67STitus Rwantare 101ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 102ffcdae67STitus Rwantare g_assert_cmpuint(i2c_value, ==, ISL_READ_TEMP_DEFAULT); 103ffcdae67STitus Rwantare 104ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_CAPABILITY); 105ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_CAPABILITY_DEFAULT); 106ffcdae67STitus Rwantare 107ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION); 108ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OPERATION_DEFAULT); 109ffcdae67STitus Rwantare 110ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG); 111ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_ON_OFF_CONFIG_DEFAULT); 112ffcdae67STitus Rwantare 113ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_VOUT_MODE); 114ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MODE_DEFAULT); 115ffcdae67STitus Rwantare 116ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND); 117ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_COMMAND_DEFAULT); 118ffcdae67STitus Rwantare 119ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX); 120ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MAX_DEFAULT); 121ffcdae67STitus Rwantare 122ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH); 123ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_HIGH_DEFAULT); 124ffcdae67STitus Rwantare 125ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW); 126ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_LOW_DEFAULT); 127ffcdae67STitus Rwantare 128ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE); 129ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_TRANSITION_RATE_DEFAULT); 130ffcdae67STitus Rwantare 131ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT); 132ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_OV_FAULT_LIMIT_DEFAULT); 133ffcdae67STitus Rwantare 134ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT); 135ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_FAULT_LIMIT_DEFAULT); 136ffcdae67STitus Rwantare 137ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT); 138ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_WARN_LIMIT_DEFAULT); 139ffcdae67STitus Rwantare 140ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_WARN_LIMIT); 141ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_OV_WARN_LIMIT_DEFAULT); 142ffcdae67STitus Rwantare 143ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_WARN_LIMIT); 144ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_UV_WARN_LIMIT_DEFAULT); 145ffcdae67STitus Rwantare 146ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT); 147ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_IIN_OC_FAULT_LIMIT_DEFAULT); 148ffcdae67STitus Rwantare 149ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_REVISION); 150ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_REVISION_DEFAULT); 151ffcdae67STitus Rwantare } 152ffcdae67STitus Rwantare 1535f14cd70STitus Rwantare static void raa228000_test_defaults(void *obj, void *data, 1545f14cd70STitus Rwantare QGuestAllocator *alloc) 1555f14cd70STitus Rwantare { 1565f14cd70STitus Rwantare uint16_t value, i2c_value; 1575f14cd70STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 1585f14cd70STitus Rwantare 1595f14cd70STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]"); 1605f14cd70STitus Rwantare g_assert_cmpuint(value, ==, 0); 1615f14cd70STitus Rwantare 1625f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 1635f14cd70STitus Rwantare g_assert_cmpuint(i2c_value, ==, 0); 1645f14cd70STitus Rwantare 1655f14cd70STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]"); 1665f14cd70STitus Rwantare g_assert_cmpuint(value, ==, 0); 1675f14cd70STitus Rwantare 1685f14cd70STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_CAPABILITY); 1695f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_CAPABILITY_DEFAULT); 1705f14cd70STitus Rwantare 1715f14cd70STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION); 1725f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OPERATION_DEFAULT); 1735f14cd70STitus Rwantare 1745f14cd70STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG); 1755f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_ON_OFF_CONFIG_DEFAULT); 1765f14cd70STitus Rwantare 1775f14cd70STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_VOUT_MODE); 1785f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MODE_DEFAULT); 1795f14cd70STitus Rwantare 1805f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND); 1815f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_COMMAND_DEFAULT); 1825f14cd70STitus Rwantare 1835f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX); 1845f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MAX_DEFAULT); 1855f14cd70STitus Rwantare 1865f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH); 1875f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_HIGH_DEFAULT); 1885f14cd70STitus Rwantare 1895f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW); 1905f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_LOW_DEFAULT); 1915f14cd70STitus Rwantare 1925f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE); 1935f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_TRANSITION_RATE_DEFAULT); 1945f14cd70STitus Rwantare 1955f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT); 1965f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VOUT_OV_FAULT_LIMIT_DEFAULT); 1975f14cd70STitus Rwantare 1985f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT); 1995f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_FAULT_LIMIT_DEFAULT); 2005f14cd70STitus Rwantare 2015f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT); 2025f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_OT_WARN_LIMIT_DEFAULT); 2035f14cd70STitus Rwantare 2045f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_WARN_LIMIT); 2055f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_OV_WARN_LIMIT_DEFAULT); 2065f14cd70STitus Rwantare 2075f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_WARN_LIMIT); 2085f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_VIN_UV_WARN_LIMIT_DEFAULT); 2095f14cd70STitus Rwantare 2105f14cd70STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT); 2115f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_IIN_OC_FAULT_LIMIT_DEFAULT); 2125f14cd70STitus Rwantare 2135f14cd70STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_REVISION); 2145f14cd70STitus Rwantare g_assert_cmphex(i2c_value, ==, ISL_REVISION_DEFAULT); 2155f14cd70STitus Rwantare } 2165f14cd70STitus Rwantare 217ffcdae67STitus Rwantare /* test qmp access */ 218ffcdae67STitus Rwantare static void test_tx_rx(void *obj, void *data, QGuestAllocator *alloc) 219ffcdae67STitus Rwantare { 220ffcdae67STitus Rwantare uint16_t i2c_value, value; 221ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 222ffcdae67STitus Rwantare 223ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vin[0]", 200); 224ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vin[0]"); 225ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 226ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 227ffcdae67STitus Rwantare 228ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 2500); 229ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]"); 230ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 231ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 232ffcdae67STitus Rwantare 233ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "iin[0]", 300); 234ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]"); 235ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 236ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 237ffcdae67STitus Rwantare 238ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "iout[0]", 310); 239ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "iout[0]"); 240ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 241ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 242ffcdae67STitus Rwantare 243ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "pin[0]", 100); 244ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pin[0]"); 245ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 246ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 247ffcdae67STitus Rwantare 248ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "pout[0]", 95); 249ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]"); 250ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 251ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 252ffcdae67STitus Rwantare 253ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp1[0]", 26); 254ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]"); 255ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 256ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 257ffcdae67STitus Rwantare 258ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp2[0]", 27); 259ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp2[0]"); 260ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 261ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 262ffcdae67STitus Rwantare 263ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "temp3[0]", 28); 264ffcdae67STitus Rwantare value = qmp_isl_pmbus_vr_get(TEST_ID, "temp3[0]"); 265ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 266ffcdae67STitus Rwantare g_assert_cmpuint(value, ==, i2c_value); 267ffcdae67STitus Rwantare 268ffcdae67STitus Rwantare } 269ffcdae67STitus Rwantare 270ffcdae67STitus Rwantare /* test r/w registers */ 271ffcdae67STitus Rwantare static void test_rw_regs(void *obj, void *data, QGuestAllocator *alloc) 272ffcdae67STitus Rwantare { 273ffcdae67STitus Rwantare uint16_t i2c_value; 274ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 275ffcdae67STitus Rwantare 276ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_COMMAND, 0x1234); 277ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND); 278ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x1234); 279ffcdae67STitus Rwantare 280ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRIM, 0x4567); 281ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRIM); 282ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x4567); 283ffcdae67STitus Rwantare 284ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MAX, 0x9876); 285ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX); 286ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x9876); 287ffcdae67STitus Rwantare 288ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_HIGH, 0xABCD); 289ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH); 290ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xABCD); 291ffcdae67STitus Rwantare 292ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_LOW, 0xA1B2); 293ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW); 294ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xA1B2); 295ffcdae67STitus Rwantare 296ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRANSITION_RATE, 0xDEF1); 297ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE); 298ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xDEF1); 299ffcdae67STitus Rwantare 300ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_DROOP, 0x5678); 301ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_DROOP); 302ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x5678); 303ffcdae67STitus Rwantare 304ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MIN, 0x1234); 305ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MIN); 306ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x1234); 307ffcdae67STitus Rwantare 308ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT, 0x2345); 309ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT); 310ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x2345); 311ffcdae67STitus Rwantare 312ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT, 0xFA12); 313ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT); 314ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xFA12); 315ffcdae67STitus Rwantare 316ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_FAULT_LIMIT, 0xF077); 317ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT); 318ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xF077); 319ffcdae67STitus Rwantare 320ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_WARN_LIMIT, 0x7137); 321ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT); 322ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x7137); 323ffcdae67STitus Rwantare 324ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT, 0x3456); 325ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT); 326ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x3456); 327ffcdae67STitus Rwantare 328ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT, 0xBADA); 329ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT); 330ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xBADA); 331ffcdae67STitus Rwantare 332ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT, 0xB1B0); 333ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT); 334ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xB1B0); 335ffcdae67STitus Rwantare 336ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_OPERATION, 0xA); 337ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION); 338ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0xA); 339ffcdae67STitus Rwantare 340ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_ON_OFF_CONFIG, 0x42); 341ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG); 342ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0x42); 343ffcdae67STitus Rwantare } 344ffcdae67STitus Rwantare 345ffcdae67STitus Rwantare /* test that devices with multiple pages can switch between them */ 346ffcdae67STitus Rwantare static void test_pages_rw(void *obj, void *data, QGuestAllocator *alloc) 347ffcdae67STitus Rwantare { 348ffcdae67STitus Rwantare uint16_t i2c_value; 349ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 350ffcdae67STitus Rwantare 351ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_PAGE, 1); 352ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_PAGE); 353ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 1); 354ffcdae67STitus Rwantare 355ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_PAGE, 0); 356ffcdae67STitus Rwantare i2c_value = i2c_get8(i2cdev, PMBUS_PAGE); 357ffcdae67STitus Rwantare g_assert_cmphex(i2c_value, ==, 0); 358ffcdae67STitus Rwantare } 359ffcdae67STitus Rwantare 360ffcdae67STitus Rwantare /* test read-only registers */ 361ffcdae67STitus Rwantare static void test_ro_regs(void *obj, void *data, QGuestAllocator *alloc) 362ffcdae67STitus Rwantare { 363ffcdae67STitus Rwantare uint16_t i2c_init_value, i2c_value; 364ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 365ffcdae67STitus Rwantare 366ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 367ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VIN, 0xBEEF); 368ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN); 369ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 370ffcdae67STitus Rwantare 371ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 372ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IIN, 0xB00F); 373ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN); 374ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 375ffcdae67STitus Rwantare 376ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 377ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VOUT, 0x1234); 378ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT); 379ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 380ffcdae67STitus Rwantare 381ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 382ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IOUT, 0x6547); 383ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT); 384ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 385ffcdae67STitus Rwantare 386ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 387ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_1, 0x1597); 388ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1); 389ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 390ffcdae67STitus Rwantare 391ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 392ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_2, 0x1897); 393ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2); 394ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 395ffcdae67STitus Rwantare 396ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 397ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_3, 0x1007); 398ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3); 399ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 400ffcdae67STitus Rwantare 401ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 402ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_PIN, 0xDEAD); 403ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN); 404ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 405ffcdae67STitus Rwantare 406ffcdae67STitus Rwantare i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 407ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_POUT, 0xD00D); 408ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT); 409ffcdae67STitus Rwantare g_assert_cmphex(i2c_init_value, ==, i2c_value); 410ffcdae67STitus Rwantare } 411ffcdae67STitus Rwantare 412ffcdae67STitus Rwantare /* test voltage fault handling */ 413ffcdae67STitus Rwantare static void test_voltage_faults(void *obj, void *data, QGuestAllocator *alloc) 414ffcdae67STitus Rwantare { 415ffcdae67STitus Rwantare uint16_t i2c_value; 416ffcdae67STitus Rwantare uint8_t i2c_byte; 417ffcdae67STitus Rwantare QI2CDevice *i2cdev = (QI2CDevice *)obj; 418ffcdae67STitus Rwantare 419ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_WARN_LIMIT, 5000); 420ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 5100); 421ffcdae67STitus Rwantare 422ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD); 423ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 424ffcdae67STitus Rwantare g_assert_true((i2c_value & PB_STATUS_VOUT) != 0); 425ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) != 0); 426ffcdae67STitus Rwantare 427ffcdae67STitus Rwantare qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 4500); 428ffcdae67STitus Rwantare i2c_set8(i2cdev, PMBUS_CLEAR_FAULTS, 0); 429ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 430ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) == 0); 431ffcdae67STitus Rwantare 432ffcdae67STitus Rwantare isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_WARN_LIMIT, 4600); 433ffcdae67STitus Rwantare 434ffcdae67STitus Rwantare i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD); 435ffcdae67STitus Rwantare i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT); 436ffcdae67STitus Rwantare g_assert_true((i2c_value & PB_STATUS_VOUT) != 0); 437ffcdae67STitus Rwantare g_assert_true((i2c_byte & PB_STATUS_VOUT_UV_WARN) != 0); 438ffcdae67STitus Rwantare 439ffcdae67STitus Rwantare } 440ffcdae67STitus Rwantare 441ffcdae67STitus Rwantare static void isl_pmbus_vr_register_nodes(void) 442ffcdae67STitus Rwantare { 443ffcdae67STitus Rwantare QOSGraphEdgeOptions opts = { 444ffcdae67STitus Rwantare .extra_device_opts = "id=" TEST_ID ",address=0x43" 445ffcdae67STitus Rwantare }; 446ffcdae67STitus Rwantare add_qi2c_address(&opts, &(QI2CAddress) { TEST_ADDR }); 447ffcdae67STitus Rwantare 448ffcdae67STitus Rwantare qos_node_create_driver("isl69260", i2c_device_create); 449ffcdae67STitus Rwantare qos_node_consumes("isl69260", "i2c-bus", &opts); 450ffcdae67STitus Rwantare 451ffcdae67STitus Rwantare qos_add_test("test_defaults", "isl69260", test_defaults, NULL); 452ffcdae67STitus Rwantare qos_add_test("test_tx_rx", "isl69260", test_tx_rx, NULL); 453ffcdae67STitus Rwantare qos_add_test("test_rw_regs", "isl69260", test_rw_regs, NULL); 454ffcdae67STitus Rwantare qos_add_test("test_pages_rw", "isl69260", test_pages_rw, NULL); 455ffcdae67STitus Rwantare qos_add_test("test_ro_regs", "isl69260", test_ro_regs, NULL); 456ffcdae67STitus Rwantare qos_add_test("test_ov_faults", "isl69260", test_voltage_faults, NULL); 4571c0c52f7STitus Rwantare 4581c0c52f7STitus Rwantare qos_node_create_driver("raa229004", i2c_device_create); 4591c0c52f7STitus Rwantare qos_node_consumes("raa229004", "i2c-bus", &opts); 4601c0c52f7STitus Rwantare 4611c0c52f7STitus Rwantare qos_add_test("test_tx_rx", "raa229004", test_tx_rx, NULL); 4621c0c52f7STitus Rwantare qos_add_test("test_rw_regs", "raa229004", test_rw_regs, NULL); 4631c0c52f7STitus Rwantare qos_add_test("test_pages_rw", "raa229004", test_pages_rw, NULL); 4641c0c52f7STitus Rwantare qos_add_test("test_ov_faults", "raa229004", test_voltage_faults, NULL); 4655f14cd70STitus Rwantare 4665f14cd70STitus Rwantare qos_node_create_driver("raa228000", i2c_device_create); 4675f14cd70STitus Rwantare qos_node_consumes("raa228000", "i2c-bus", &opts); 4685f14cd70STitus Rwantare 4695f14cd70STitus Rwantare qos_add_test("test_defaults", "raa228000", raa228000_test_defaults, NULL); 4705f14cd70STitus Rwantare qos_add_test("test_tx_rx", "raa228000", test_tx_rx, NULL); 4715f14cd70STitus Rwantare qos_add_test("test_rw_regs", "raa228000", test_rw_regs, NULL); 4725f14cd70STitus Rwantare qos_add_test("test_ov_faults", "raa228000", test_voltage_faults, NULL); 473ffcdae67STitus Rwantare } 474ffcdae67STitus Rwantare libqos_init(isl_pmbus_vr_register_nodes); 475