Reviewed-by: Glenn Miles <[email protected]>

Thanks,

Glenn

On Mon, 2026-10-12 at 16:32 +0200, Emmanuel Blot via qemu development
wrote:
> Cover the shunt/bus/power alert-limit functions, the alert latch
> behaviour and the conversion-ready flag.
> 
> Signed-off-by: Emmanuel Blot <[email protected]>
> ---
>  tests/qtest/ina230-test.c | 97 
> +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 97 insertions(+)
> 
> diff --git a/tests/qtest/ina230-test.c b/tests/qtest/ina230-test.c
> index b01f9445d1..1c55028fcb 100644
> --- a/tests/qtest/ina230-test.c
> +++ b/tests/qtest/ina230-test.c
> @@ -215,6 +215,98 @@ static void test_edges_overflow(void *obj, void *data, 
> QGuestAllocator *alloc)
>      g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_OVF, ==, ME_OVF);
>  }
>  
> +/* Shunt over-limit alert (transparent mode) sets the AFF flag */
> +static void test_alert_shunt_over(void *obj, void *data,
> +                                  QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +
> +    i2c_set16(dev, REG_CONFIG, CONFIG_RST);
> +
> +    i2c_set16(dev, REG_ALERT_LIMIT, 0x1000);
> +    i2c_set16(dev, REG_MASK_ENABLE, ME_SOL);
> +
> +    qmp_ina230_set("shunt-voltage", 2500000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, 0);
> +
> +    qmp_ina230_set("shunt-voltage", 20000000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, ME_AFF);
> +
> +    qmp_ina230_set("shunt-voltage", 2500000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, 0);
> +}
> +
> +/* Latch mode holds the alert until the Mask/Enable register is read */
> +static void test_alert_latch(void *obj, void *data, QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +    uint16_t me;
> +
> +    i2c_set16(dev, REG_CONFIG, CONFIG_RST);
> +
> +    i2c_set16(dev, REG_ALERT_LIMIT, 0x1000);
> +    i2c_set16(dev, REG_MASK_ENABLE, ME_SOL | ME_LEN);
> +
> +    qmp_ina230_set("shunt-voltage", 20000000);
> +    qmp_ina230_set("shunt-voltage", 2500000);
> +
> +    me = i2c_get16(dev, REG_MASK_ENABLE);
> +    g_assert_cmphex(me & ME_AFF, ==, ME_AFF);
> +
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, 0);
> +}
> +
> +/* Bus over-limit alert */
> +static void test_alert_bus(void *obj, void *data, QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +
> +    i2c_set16(dev, REG_CONFIG, CONFIG_RST);
> +
> +    i2c_set16(dev, REG_ALERT_LIMIT, 0x2000);
> +    i2c_set16(dev, REG_MASK_ENABLE, ME_BOL);
> +
> +    qmp_ina230_set("bus-voltage", 5000000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, 0);
> +
> +    qmp_ina230_set("bus-voltage", 12000000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, ME_AFF);
> +}
> +
> +/* Power over-limit alert */
> +static void test_alert_power(void *obj, void *data, QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +
> +    i2c_set16(dev, REG_CONFIG, CONFIG_RST);
> +
> +    qmp_ina230_set("shunt-voltage", 20000000);
> +    qmp_ina230_set("bus-voltage", 11980000);
> +    i2c_set16(dev, REG_CALIBRATION, 0x0A00);
> +
> +    i2c_set16(dev, REG_ALERT_LIMIT, 0x1000);
> +    i2c_set16(dev, REG_MASK_ENABLE, ME_POL);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, ME_AFF);
> +
> +    i2c_set16(dev, REG_ALERT_LIMIT, 0x2000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_AFF, ==, 0);
> +}
> +
> +/* Conversion Ready Flag: set on conversion, cleared by reading Mask/Enable 
> */
> +static void test_cvrf(void *obj, void *data, QGuestAllocator *alloc)
> +{
> +    QI2CDevice *dev = (QI2CDevice *)obj;
> +
> +    i2c_set16(dev, REG_CONFIG, CONFIG_RST);
> +
> +    /* A conversion (triggered by injection) sets CVRF */
> +    qmp_ina230_set("shunt-voltage", 20000000);
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_CVRF, ==, ME_CVRF);
> +
> +    /* The previous read cleared CVRF; no conversion since, so it stays 
> clear */
> +    g_assert_cmphex(i2c_get16(dev, REG_MASK_ENABLE) & ME_CVRF, ==, 0);
> +}
> +
>  static void ina230_register_nodes(void)
>  {
>      QOSGraphEdgeOptions opts = {
> @@ -235,5 +327,10 @@ static void ina230_register_nodes(void)
>      qos_add_test("power", "ina230", test_power, NULL);
>      qos_add_test("zero-cal", "ina230", test_zero_cal, NULL);
>      qos_add_test("edges-overflow", "ina230", test_edges_overflow, NULL);
> +    qos_add_test("alert-shunt-over", "ina230", test_alert_shunt_over, NULL);
> +    qos_add_test("alert-latch", "ina230", test_alert_latch, NULL);
> +    qos_add_test("alert-bus", "ina230", test_alert_bus, NULL);
> +    qos_add_test("alert-power", "ina230", test_alert_power, NULL);
> +    qos_add_test("cvrf", "ina230", test_cvrf, NULL);
>  }
>  libqos_init(ina230_register_nodes);
> 


Reply via email to