Message ID | 1477535233-7760-4-git-send-email-alastair@au1.ibm.com |
---|---|
State | Changes Requested, archived |
Headers | show |
On Thu, Oct 27, 2016 at 12:57 PM, <alastair@au1.ibm.com> wrote: > From: Alastair D'Silva <alastair@d-silva.org> > You need a commit message. I don't know much about Qemu testing, so I'll let Andrew and Cedric comment. > Signed-off-by: Alastair D'Silva <alastair@d-silva.org> > --- > hw/arm/imx25_pdk.c | 9 +++--- > tests/Makefile.include | 2 ++ > tests/rx8900-test.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 89 insertions(+), 4 deletions(-) > create mode 100644 tests/rx8900-test.c > > diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c > index 025b608..99a819f 100644 > --- a/hw/arm/imx25_pdk.c > +++ b/hw/arm/imx25_pdk.c > @@ -134,13 +134,14 @@ static void imx25_pdk_init(MachineState *machine) > arm_load_kernel(&s->soc.cpu, &imx25_pdk_binfo); > } else { > /* > - * This I2C device doesn't exist on the real board. > + * These I2C devices doesn't exist on the real board. > * We add it here (only on qtest usage) to be able to do a bit > * of simple qtest. See "make check" for details. > */ > - i2c_create_slave((I2CBus *)qdev_get_child_bus(DEVICE(&s->soc.i2c[0]), > - "i2c"), > - "ds1338", 0x68); > + I2CBus *i2c = (I2CBus *)qdev_get_child_bus(DEVICE(&s->soc.i2c[0]), > + "i2c"); > + i2c_create_slave(i2c, "ds1338", 0x68); > + i2c_create_slave(i2c, "rx8900", 0x32); I'm not sure how upstream will take this. Is there a reason you didn't add them to an aspeed board instead? > } > } > > diff --git a/tests/Makefile.include b/tests/Makefile.include > index cbe38ad..3f08ba9 100644 > --- a/tests/Makefile.include > +++ b/tests/Makefile.include > @@ -297,6 +297,7 @@ check-qtest-sparc64-y = tests/endianness-test$(EXESUF) > > check-qtest-arm-y = tests/tmp105-test$(EXESUF) > check-qtest-arm-y += tests/ds1338-test$(EXESUF) > +check-qtest-arm-y += tests/rx8900-test$(EXESUF) > check-qtest-arm-y += tests/m25p80-test$(EXESUF) > gcov-files-arm-y += hw/misc/tmp105.c > check-qtest-arm-y += tests/virtio-blk-test$(EXESUF) > @@ -629,6 +630,7 @@ tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ > tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y) > tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y) > tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y) > +tests/rx8900-test$(EXESUF): tests/rx8900-test.o $(libqos-imx-obj-y) > tests/m25p80-test$(EXESUF): tests/m25p80-test.o > tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y) > tests/q35-test$(EXESUF): tests/q35-test.o $(libqos-pc-obj-y) > diff --git a/tests/rx8900-test.c b/tests/rx8900-test.c > new file mode 100644 > index 0000000..8d3ecd8 > --- /dev/null > +++ b/tests/rx8900-test.c > @@ -0,0 +1,82 @@ > +/* > + * QTest testcase for the DS1338 RTC > + * > + * Copyright (c) 2013 Jean-Christophe Dubois > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License as published by the > + * Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > + * for more details. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include "qemu/osdep.h" > +#include "libqtest.h" > +#include "libqos/i2c.h" > + > +#define IMX25_I2C_0_BASE 0x43F80000 > + > +#define RX8900_ADDR 0x32 > + > +static I2CAdapter *i2c; > +static uint8_t addr; > + > +static inline uint8_t bcd2bin(uint8_t x) > +{ > + return ((x) & 0x0f) + ((x) >> 4) * 10; > +} > + > +static void send_and_receive(void) > +{ > + uint8_t cmd[1]; > + uint8_t resp[7]; > + time_t now = time(NULL); > + struct tm *tm_ptr; > + > + /* reset the index in the RTC memory */ > + cmd[0] = 0; > + i2c_send(i2c, addr, cmd, 1); > + > + tm_ptr = gmtime(&now); > + /* retrieve the date */ > + i2c_recv(i2c, addr, resp, 7); > + > + /* check retrieved time against local time */ > + g_assert_cmpuint(bcd2bin(resp[0]), == , tm_ptr->tm_sec); > + g_assert_cmpuint(bcd2bin(resp[1]), == , tm_ptr->tm_min); > + g_assert_cmpuint(bcd2bin(resp[2]), == , tm_ptr->tm_hour); > + g_assert_cmpuint(bcd2bin(resp[4]), == , tm_ptr->tm_mday); > + g_assert_cmpuint(bcd2bin(resp[5]), == , 1 + tm_ptr->tm_mon); > + g_assert_cmpuint(2000 + bcd2bin(resp[6]), == , 1900 + tm_ptr->tm_year); > +} > + > +int main(int argc, char **argv) > +{ > + QTestState *s = NULL; > + int ret; > + > + g_test_init(&argc, &argv, NULL); > + > + /* Address must match RX8900_ADDR */ > + s = qtest_start("-display none -machine imx25-pdk"); > + i2c = imx_i2c_create(IMX25_I2C_0_BASE); > + addr = RX8900_ADDR; > + > + qtest_add_func("/rx8900/tx-rx", send_and_receive); > + > + ret = g_test_run(); > + > + if (s) { > + qtest_quit(s); > + } > + g_free(i2c); > + > + return ret; > +} > -- > 2.7.4 > > _______________________________________________ > openbmc mailing list > openbmc@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/openbmc
On Thu, 2016-10-27 at 14:51 +1030, Joel Stanley wrote: > > - * This I2C device doesn't exist on the real board. > > + * These I2C devices doesn't exist on the real board. > > * We add it here (only on qtest usage) to be able to do a > > bit > > * of simple qtest. See "make check" for details. > > */ > > - i2c_create_slave((I2CBus *)qdev_get_child_bus(DEVICE(&s- > > >soc.i2c[0]), > > - "i2c"), > > - "ds1338", 0x68); > > + I2CBus *i2c = (I2CBus *)qdev_get_child_bus(DEVICE(&s- > > >soc.i2c[0]), > > + "i2c"); > > + i2c_create_slave(i2c, "ds1338", 0x68); > > + i2c_create_slave(i2c, "rx8900", 0x32); > > I'm not sure how upstream will take this. > > Is there a reason you didn't add them to an aspeed board instead? > We are currently missing the *_i2c_create and the associated send/receive callbacks required to access the i2c bus from the test framework. The structure of aspeed_i2c.c was different enough from i2c_imx.c & i2c_omap.c that I need more familiarity with the code before I could implement it myself.
On 10/27/2016 06:29 AM, Alastair D'Silva wrote: > On Thu, 2016-10-27 at 14:51 +1030, Joel Stanley wrote: >>> - * This I2C device doesn't exist on the real board. >>> + * These I2C devices doesn't exist on the real board. >>> * We add it here (only on qtest usage) to be able to do a >>> bit >>> * of simple qtest. See "make check" for details. >>> */ >>> - i2c_create_slave((I2CBus *)qdev_get_child_bus(DEVICE(&s- >>>> soc.i2c[0]), >>> - "i2c"), >>> - "ds1338", 0x68); >>> + I2CBus *i2c = (I2CBus *)qdev_get_child_bus(DEVICE(&s- >>>> soc.i2c[0]), >>> + "i2c"); >>> + i2c_create_slave(i2c, "ds1338", 0x68); >>> + i2c_create_slave(i2c, "rx8900", 0x32); >> >> I'm not sure how upstream will take this. >> >> Is there a reason you didn't add them to an aspeed board instead? >> > > We are currently missing the *_i2c_create and the associated > send/receive callbacks required to access the i2c bus from the test > framework. The structure of aspeed_i2c.c was different enough from > i2c_imx.c & i2c_omap.c that I need more familiarity with the code > before I could implement it myself. Could you extend libqos to have these routines ? or you can start an aspeed guest which would have the device with your patchset. take a look at the m25p80 test. Cheers, C.
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c index 025b608..99a819f 100644 --- a/hw/arm/imx25_pdk.c +++ b/hw/arm/imx25_pdk.c @@ -134,13 +134,14 @@ static void imx25_pdk_init(MachineState *machine) arm_load_kernel(&s->soc.cpu, &imx25_pdk_binfo); } else { /* - * This I2C device doesn't exist on the real board. + * These I2C devices doesn't exist on the real board. * We add it here (only on qtest usage) to be able to do a bit * of simple qtest. See "make check" for details. */ - i2c_create_slave((I2CBus *)qdev_get_child_bus(DEVICE(&s->soc.i2c[0]), - "i2c"), - "ds1338", 0x68); + I2CBus *i2c = (I2CBus *)qdev_get_child_bus(DEVICE(&s->soc.i2c[0]), + "i2c"); + i2c_create_slave(i2c, "ds1338", 0x68); + i2c_create_slave(i2c, "rx8900", 0x32); } } diff --git a/tests/Makefile.include b/tests/Makefile.include index cbe38ad..3f08ba9 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -297,6 +297,7 @@ check-qtest-sparc64-y = tests/endianness-test$(EXESUF) check-qtest-arm-y = tests/tmp105-test$(EXESUF) check-qtest-arm-y += tests/ds1338-test$(EXESUF) +check-qtest-arm-y += tests/rx8900-test$(EXESUF) check-qtest-arm-y += tests/m25p80-test$(EXESUF) gcov-files-arm-y += hw/misc/tmp105.c check-qtest-arm-y += tests/virtio-blk-test$(EXESUF) @@ -629,6 +630,7 @@ tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \ tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y) tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y) tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y) +tests/rx8900-test$(EXESUF): tests/rx8900-test.o $(libqos-imx-obj-y) tests/m25p80-test$(EXESUF): tests/m25p80-test.o tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y) tests/q35-test$(EXESUF): tests/q35-test.o $(libqos-pc-obj-y) diff --git a/tests/rx8900-test.c b/tests/rx8900-test.c new file mode 100644 index 0000000..8d3ecd8 --- /dev/null +++ b/tests/rx8900-test.c @@ -0,0 +1,82 @@ +/* + * QTest testcase for the DS1338 RTC + * + * Copyright (c) 2013 Jean-Christophe Dubois + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "qemu/osdep.h" +#include "libqtest.h" +#include "libqos/i2c.h" + +#define IMX25_I2C_0_BASE 0x43F80000 + +#define RX8900_ADDR 0x32 + +static I2CAdapter *i2c; +static uint8_t addr; + +static inline uint8_t bcd2bin(uint8_t x) +{ + return ((x) & 0x0f) + ((x) >> 4) * 10; +} + +static void send_and_receive(void) +{ + uint8_t cmd[1]; + uint8_t resp[7]; + time_t now = time(NULL); + struct tm *tm_ptr; + + /* reset the index in the RTC memory */ + cmd[0] = 0; + i2c_send(i2c, addr, cmd, 1); + + tm_ptr = gmtime(&now); + /* retrieve the date */ + i2c_recv(i2c, addr, resp, 7); + + /* check retrieved time against local time */ + g_assert_cmpuint(bcd2bin(resp[0]), == , tm_ptr->tm_sec); + g_assert_cmpuint(bcd2bin(resp[1]), == , tm_ptr->tm_min); + g_assert_cmpuint(bcd2bin(resp[2]), == , tm_ptr->tm_hour); + g_assert_cmpuint(bcd2bin(resp[4]), == , tm_ptr->tm_mday); + g_assert_cmpuint(bcd2bin(resp[5]), == , 1 + tm_ptr->tm_mon); + g_assert_cmpuint(2000 + bcd2bin(resp[6]), == , 1900 + tm_ptr->tm_year); +} + +int main(int argc, char **argv) +{ + QTestState *s = NULL; + int ret; + + g_test_init(&argc, &argv, NULL); + + /* Address must match RX8900_ADDR */ + s = qtest_start("-display none -machine imx25-pdk"); + i2c = imx_i2c_create(IMX25_I2C_0_BASE); + addr = RX8900_ADDR; + + qtest_add_func("/rx8900/tx-rx", send_and_receive); + + ret = g_test_run(); + + if (s) { + qtest_quit(s); + } + g_free(i2c); + + return ret; +}