Reviewed-by: Glenn Miles <[email protected]> Thanks,
Glenn On Mon, 2026-10-12 at 16:32 +0200, Emmanuel Blot via qemu development wrote: > Verify that the extremes of the shunt-voltage, bus-voltage and > die-temperature injection ranges round-trip through the QOM property > without truncation or wraparound, and that values just outside are > rejected rather than silently wrapped. > > Signed-off-by: Emmanuel Blot <[email protected]> > --- > tests/qtest/ina238-test.c | 84 > +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 84 insertions(+) > > diff --git a/tests/qtest/ina238-test.c b/tests/qtest/ina238-test.c > index 08813377c9..74912424c0 100644 > --- a/tests/qtest/ina238-test.c > +++ b/tests/qtest/ina238-test.c > @@ -67,6 +67,13 @@ > #define MANUFACTURER_ID_VAL 0x5449 > #define DEVICE_ID_VAL 0x2381 > > +/* Injection-property limits (see ina238.c) */ > +#define SHUNT_MIN_NV (-163840000) /* -32768 * 5 uV */ > +#define SHUNT_MAX_NV 163835000 /* 32767 * 5 uV */ > +#define BUS_MAX_UV 85000000 /* 27200 * 3.125 mV */ > +#define TEMP_MIN_MC (-40000) /* -320 * 125 m-degC */ > +#define TEMP_MAX_MC 125000 /* 1000 * 125 m-degC */ > + > /* Read the 24-bit POWER register (MSB first) */ > static uint32_t i2c_get24(QI2CDevice *dev, uint8_t reg) > { > @@ -103,6 +110,18 @@ static int qmp_ina238_get(const char *property) > return ret; > } > > +/* A qom-set expected to be rejected (value outside the supported range) */ > +static void qmp_ina238_set_fail(const char *property, int64_t value) > +{ > + QDict *resp; > + > + resp = qmp("{ 'execute': 'qom-set', 'arguments':" > + " { 'path': %s, 'property': %s, 'value': %lld } }", > + INA238_TEST_ID, property, (long long)value); > + g_assert(qdict_haskey(resp, "error")); > + qobject_unref(resp); > +} > + > /* Power-on-reset default values and the ID registers */ > static void test_defaults(void *obj, void *data, QGuestAllocator *alloc) > { > @@ -443,6 +462,68 @@ static void test_cnvrf(void *obj, void *data, > QGuestAllocator *alloc) > g_assert_cmphex(i2c_get16(dev, REG_DIAG_ALRT) & DIAG_CNVRF, ==, 0); > } > > +/* Shunt-voltage injection limits */ > +static void test_shunt_limits(void *obj, void *data, QGuestAllocator *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + > + qmp_ina238_set("shunt-voltage", SHUNT_MAX_NV); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x7FFF); > + g_assert_cmpint(qmp_ina238_get("shunt-voltage"), ==, SHUNT_MAX_NV); > + > + qmp_ina238_set("shunt-voltage", SHUNT_MIN_NV); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x8000); > + g_assert_cmpint(qmp_ina238_get("shunt-voltage"), ==, SHUNT_MIN_NV); > + > + qmp_ina238_set_fail("shunt-voltage", (int64_t)SHUNT_MAX_NV + 1); > + qmp_ina238_set_fail("shunt-voltage", (int64_t)SHUNT_MIN_NV - 1); > + g_assert_cmpint(qmp_ina238_get("shunt-voltage"), ==, SHUNT_MIN_NV); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x8000); > +} > + > +/* Bus-voltage injection limits */ > +static void test_bus_limits(void *obj, void *data, QGuestAllocator *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + > + qmp_ina238_set("bus-voltage", 0); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x0000); > + > + qmp_ina238_set("bus-voltage", BUS_MAX_UV); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x6A40); > + g_assert_cmpint(qmp_ina238_get("bus-voltage"), ==, BUS_MAX_UV); > + > + qmp_ina238_set_fail("bus-voltage", (int64_t)BUS_MAX_UV + 1); > + qmp_ina238_set_fail("bus-voltage", -1); > + g_assert_cmpint(qmp_ina238_get("bus-voltage"), ==, BUS_MAX_UV); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x6A40); > +} > + > +/* Die-temperature injection limits */ > +static void test_temp_limits(void *obj, void *data, QGuestAllocator *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + > + qmp_ina238_set("die-temperature", TEMP_MAX_MC); > + g_assert_cmphex(i2c_get16(dev, REG_DIETEMP), ==, 0x3E80); > + g_assert_cmpint(qmp_ina238_get("die-temperature"), ==, TEMP_MAX_MC); > + > + qmp_ina238_set("die-temperature", TEMP_MIN_MC); > + g_assert_cmphex(i2c_get16(dev, REG_DIETEMP), ==, 0xEC00); > + g_assert_cmpint(qmp_ina238_get("die-temperature"), ==, TEMP_MIN_MC); > + > + qmp_ina238_set_fail("die-temperature", (int64_t)TEMP_MAX_MC + 1); > + qmp_ina238_set_fail("die-temperature", (int64_t)TEMP_MIN_MC - 1); > + g_assert_cmpint(qmp_ina238_get("die-temperature"), ==, TEMP_MIN_MC); > + g_assert_cmphex(i2c_get16(dev, REG_DIETEMP), ==, 0xEC00); > +} > + > static void ina238_register_nodes(void) > { > QOSGraphEdgeOptions opts = { > @@ -459,6 +540,9 @@ static void ina238_register_nodes(void) > qos_add_test("shunt-injection", "ina238", test_shunt_injection, NULL); > qos_add_test("bus-injection", "ina238", test_bus_injection, NULL); > qos_add_test("temp-injection", "ina238", test_temp_injection, NULL); > + qos_add_test("shunt-limits", "ina238", test_shunt_limits, NULL); > + qos_add_test("bus-limits", "ina238", test_bus_limits, NULL); > + qos_add_test("temp-limits", "ina238", test_temp_limits, NULL); > qos_add_test("calibration-current", "ina238", test_calibration_current, > NULL); > qos_add_test("power", "ina238", test_power, NULL); >
