Tim Lee <[email protected]> writes:
> - Created qtest to check initialization of registers in PSPI Module
> - Implemented test into Build File
>
> Tested:
> ./build/tests/qtest/npcm8xx-pspi_test
>
> Signed-off-by: Tim Lee <[email protected]>
> ---
> MAINTAINERS | 1 +
> tests/qtest/meson.build | 3 +
> tests/qtest/npcm8xx_pspi-test.c | 104 ++++++++++++++++++++++++++++++++
> 3 files changed, 108 insertions(+)
> create mode 100644 tests/qtest/npcm8xx_pspi-test.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index d54b5578f8..0162f59bf7 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -892,6 +892,7 @@ F: hw/sensor/adm1266.c
> F: include/hw/*/npcm*
> F: tests/qtest/npcm*
> F: tests/qtest/adm1266-test.c
> +F: tests/qtest/npcm8xx_pspi-test.c
> F: pc-bios/npcm7xx_bootrom.bin
> F: pc-bios/npcm8xx_bootrom.bin
> F: roms/vbootrom
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 3136d15e0f..88672a8b00 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -210,6 +210,8 @@ qtests_npcm7xx = \
> 'npcm7xx_watchdog_timer-test',
> 'npcm_gmac-test'] + \
> (slirp.found() ? ['npcm7xx_emc-test'] : [])
> +qtests_npcm8xx = \
> + ['npcm8xx_pspi-test']
> qtests_aspeed = \
> ['aspeed_hace-test',
> 'aspeed_smc-test',
> @@ -257,6 +259,7 @@ qtests_aarch64 = \
> (config_all_accel.has_key('CONFIG_TCG') and
> \
> config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test'] :
> []) + \
> (config_all_devices.has_key('CONFIG_ASPEED_SOC') ? qtests_aspeed64 : []) +
> \
> + (config_all_devices.has_key('CONFIG_NPCM8XX') ? qtests_npcm8xx : []) + \
> ['arm-cpu-features',
> 'numa-test',
> 'boot-serial-test',
> diff --git a/tests/qtest/npcm8xx_pspi-test.c b/tests/qtest/npcm8xx_pspi-test.c
> new file mode 100644
> index 0000000000..107bce681f
> --- /dev/null
> +++ b/tests/qtest/npcm8xx_pspi-test.c
> @@ -0,0 +1,104 @@
> +#include "qemu/osdep.h"
> +#include "libqtest.h"
> +#include "qemu/module.h"
> +
> +#define DATA_OFFSET 0x00
> +#define CTL_SPIEN 0x01
> +#define CTL_OFFSET 0x02
> +#define CTL_MOD 0x04
> +
> +typedef struct PSPI {
> + uint64_t base_addr;
> +} PSPI;
> +
> +PSPI pspi_defs = {
> + .base_addr = 0xf0201000
> +};
> +
> +static uint16_t pspi_read_data(QTestState *qts, const PSPI *pspi)
> +{
> + return qtest_readw(qts, pspi->base_addr + DATA_OFFSET);
> +}
> +
> +static void pspi_write_data(QTestState *qts, const PSPI *pspi, uint16_t
> value)
> +{
> + qtest_writew(qts, pspi->base_addr + DATA_OFFSET, value);
> +}
> +
> +static uint32_t pspi_read_ctl(QTestState *qts, const PSPI *pspi)
> +{
> + return qtest_readl(qts, pspi->base_addr + CTL_OFFSET);
> +}
> +
> +static void pspi_write_ctl(QTestState *qts, const PSPI *pspi, uint32_t value)
> +{
> + qtest_writel(qts, pspi->base_addr + CTL_OFFSET, value);
> +}
> +
> +/* Check PSPI can be reset to default value */
> +static void test_init(gconstpointer pspi_p)
> +{
> + const PSPI *pspi = pspi_p;
> +
> + QTestState *qts = qtest_init("-machine npcm845-evb");
> + pspi_write_ctl(qts, pspi, CTL_SPIEN);
> + g_assert_cmphex(pspi_read_ctl(qts, pspi), ==, CTL_SPIEN);
> +
> + qtest_quit(qts);
> +}
> +
> +/* Check PSPI can be r/w data register */
> +static void test_data(gconstpointer pspi_p)
> +{
> + const PSPI *pspi = pspi_p;
> + uint16_t test = 0x1234;
> + uint16_t output;
> +
> + QTestState *qts = qtest_init("-machine npcm845-evb");
> +
> + /* Write to data register */
> + pspi_write_data(qts, pspi, test);
> + printf("Wrote 0x%x to data register\n", test);
> +
> + /* Read from data register */
> + output = pspi_read_data(qts, pspi);
> + printf("Read 0x%x from data register\n", output);
> +
> + qtest_quit(qts);
> +}
> +
> +/* Check PSPI can be r/w control register */
> +static void test_ctl(gconstpointer pspi_p)
> +{
> + const PSPI *pspi = pspi_p;
> + uint8_t control = CTL_MOD;
> +
> + QTestState *qts = qtest_init("-machine npcm845-evb");
> +
> + /* Write CTL_MOD value to control register for 16-bit interface mode */
> + qtest_memwrite(qts, pspi->base_addr + CTL_OFFSET,
> + &control, sizeof(control));
> + g_assert_cmphex(pspi_read_ctl(qts, pspi), ==, control);
> + printf("Wrote CTL_MOD to control register\n");
> +
> + qtest_quit(qts);
> +}
> +
> +static void pspi_add_test(const char *name, const PSPI* wd,
> + GTestDataFunc fn)
> +{
> + g_autofree char *full_name = g_strdup_printf("npcm8xx_pspi/%s", name);
> + qtest_add_data_func(full_name, wd, fn);
> +}
> +
> +#define add_test(name, td) pspi_add_test(#name, td, test_##name)
> +
> +int main(int argc, char **argv)
> +{
> + g_test_init(&argc, &argv, NULL);
> +
> + add_test(init, &pspi_defs);
> + add_test(ctl, &pspi_defs);
> + add_test(data, &pspi_defs);
> + return g_test_run();
> +}
This fails on top of current master, please take a look:
$ QTEST_LOG=1 QTEST_QEMU_BINARY=./qemu-system-aarch64
./tests/qtest/npcm8xx_pspi-test
# random seed: R02S03f79fc48ba73b76c881f93f90b015e9
1..3
# Start of aarch64 tests
# Start of npcm8xx_pspi tests
# starting QEMU: exec ./qemu-system-aarch64 -qtest
unix:/tmp/qtest-32530.sock -qtest-log /dev/fd/2 -chardev
socket,path=/tmp/qtest-32530.qmp,id=char0 -mon
chardev=char0,mode=control -display none -audio none -machine
npcm845-evb -accel qtest
[I 0.000000] OPENED
[R +0.034918] endianness
[S +0.034944] OK little
{"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 10},
"package": "v10.0.0-530-g88d6459dae"}, "capabilities": ["oob"]}}
{"execute": "qmp_capabilities"}
{"return": {}}
[R +0.037373] writel 0xf0201002 0x1
[S +0.037396] OK
[R +0.037417] readl 0xf0201002
[S +0.037426] OK 0x0000000000000000
**
ERROR:../tests/qtest/npcm8xx_pspi-test.c:45:test_init: assertion failed
(pspi_read_ctl(qts, pspi) == CTL_SPIEN): (0x00000000 == 0x00000001)
Bail out!
[I +0.037909] CLOSED
Aborted (core dumped)