The Century bit had no coverage: neither its guest read/write behaviour, nor the rule that only an elapsed rollover toggles it.
Signed-off-by: Emmanuel Blot <[email protected]> --- tests/qtest/ds1339-test.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tests/qtest/ds1339-test.c b/tests/qtest/ds1339-test.c index ac19ebd71d..8c144579e6 100644 --- a/tests/qtest/ds1339-test.c +++ b/tests/qtest/ds1339-test.c @@ -169,6 +169,62 @@ static void test_eosc_restart(void *obj, void *data, QGuestAllocator *alloc) g_assert_cmphex(resp[6], ==, 0x31); } +/* The Century bit is guest-writable and survives an oscillator restart. */ +static void test_century_bit(void *obj, void *data, QGuestAllocator *alloc) +{ + QI2CDevice *i2cdev = (QI2CDevice *)obj; + + i2c_set8(i2cdev, DS1339_MONTH, 0x86); /* Century | June */ + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x80); + + i2c_set8(i2cdev, DS1339_CONTROL, 0x18 | 0x80); + i2c_set8(i2cdev, DS1339_CONTROL, 0x18); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x80); + + i2c_set8(i2cdev, DS1339_MONTH, 0x06); /* June, century clear */ + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x00); +} + +/* A guest write never toggles the Century bit. */ +static void test_century_write_no_toggle(void *obj, void *data, + QGuestAllocator *alloc) +{ + QI2CDevice *i2cdev = (QI2CDevice *)obj; + + i2c_set8(i2cdev, DS1339_MONTH, 0x86); + i2c_set8(i2cdev, DS1339_YEAR, 0x99); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x80); + i2c_set8(i2cdev, DS1339_YEAR, 0x00); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x80); + + i2c_set8(i2cdev, DS1339_MONTH, 0x06); + i2c_set8(i2cdev, DS1339_YEAR, 0x99); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x00); + i2c_set8(i2cdev, DS1339_YEAR, 0x00); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x00); +} + +/* A clock-driven year rollover from 99 to 00 toggles the Century bit. */ +static void test_century_rollover(void *obj, void *data, + QGuestAllocator *alloc) +{ + QI2CDevice *i2cdev = (QI2CDevice *)obj; + const uint8_t tod[7] = { 0x59, 0x59, 0x23, 0x01, 0x31, 0x12, 0x99 }; + unsigned idx; + + i2c_write_block(i2cdev, DS1339_SECONDS, tod, sizeof(tod)); + + for (idx = 0; idx < 50; idx++) { + if (i2c_get8(i2cdev, DS1339_YEAR) == 0x00) { + break; + } + g_usleep(100 * 1000); + } + + g_assert_cmphex(i2c_get8(i2cdev, DS1339_YEAR), ==, 0x00); + g_assert_cmphex(i2c_get8(i2cdev, DS1339_MONTH) & 0x80, ==, 0x80); +} + /* The register pointer wraps at the end of the map. */ static void test_address_wrap(void *obj, void *data, QGuestAllocator *alloc) { @@ -258,6 +314,10 @@ static void ds1339_register_nodes(void) qos_add_test("eosc-restart", "ds1339", test_eosc_restart, NULL); qos_add_test("stopped-reserved-bits", "ds1339", test_stopped_reserved_bits, NULL); + qos_add_test("century-bit", "ds1339", test_century_bit, NULL); + qos_add_test("century-write-no-toggle", "ds1339", + test_century_write_no_toggle, NULL); + qos_add_test("century-rollover", "ds1339", test_century_rollover, NULL); qos_add_test("address-wrap", "ds1339", test_address_wrap, NULL); qos_add_test("block-wrap", "ds1339", test_block_wrap, NULL); qos_add_test("alarm-registers", "ds1339", test_alarm_registers, -- 2.50.1
