Skip to content

Commit

Permalink
tests/qtest/bcm2828-mailbox: Add mailbox property tests. Part 1
Browse files Browse the repository at this point in the history
Signed-off-by: Sergey Kambalin <sergey.kambalin@auriga.com>
Message-id: 20240226000259.2752893-37-sergey.kambalin@auriga.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
serg3vik authored and pm215 committed Feb 27, 2024
1 parent fa52b33 commit 80afee9
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 2 deletions.
1 change: 0 additions & 1 deletion tests/qtest/bcm2838-mailbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "hw/registerfields.h"
#include "libqtest-single.h"
#include "bcm2838-mailbox.h"
#include "hw/arm/raspberrypi-fw-defs.h"

REG32(MBOX_EXCHNG_REG, 0)
FIELD(MBOX_EXCHNG_REG, CHANNEL, 0, 4)
Expand Down
207 changes: 207 additions & 0 deletions tests/qtest/bcm2838-mbox-property-test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
/*
* Tests set for BCM2838 mailbox property interface.
*
* Copyright (c) 2022 Auriga
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

#include "qemu/osdep.h"
#include "hw/registerfields.h"
#include "libqtest-single.h"
#include "bcm2838-mailbox.h"
#include "hw/arm/raspberrypi-fw-defs.h"

REG32(MBOX_SIZE_STAT, 0)
FIELD(MBOX_SIZE_STAT, SIZE, 0, 31)
FIELD(MBOX_SIZE_STAT, SUCCESS, 31, 1)

REG32(SET_POWER_STATE_CMD, 0)
FIELD(SET_POWER_STATE_CMD, EN, 0, 1)
FIELD(SET_POWER_STATE_CMD, WAIT, 1, 1)

REG32(GET_CLOCK_STATE_CMD, 0)
FIELD(GET_CLOCK_STATE_CMD, EN, 0, 1)
FIELD(GET_CLOCK_STATE_CMD, NPRES, 1, 1)

#define MBOX_TEST_MESSAGE_ADDRESS 0x10000000

#define TEST_TAG(x) RPI_FWREQ_ ## x
#define TEST_TAG_TYPE(x) TAG_##x##_t

#define TEST_FN_NAME(test, subtest) \
test ## _ ## subtest ## _test

#define SETUP_FN_NAME(test, subtest) \
test ## _ ## subtest ## _setup

#define CHECK_FN_NAME(test, subtest) \
test ## _ ## subtest ## _spec_check

#define DECLARE_TEST_CASE_SETUP(testname, ...) \
void SETUP_FN_NAME(testname, __VA_ARGS__) \
(TEST_TAG_TYPE(testname) * tag)

/*----------------------------------------------------------------------------*/
#define DECLARE_TEST_CASE(testname, ...) \
__attribute__((weak)) \
void SETUP_FN_NAME(testname, __VA_ARGS__) \
(TEST_TAG_TYPE(testname) * tag); \
static void CHECK_FN_NAME(testname, __VA_ARGS__) \
(TEST_TAG_TYPE(testname) *tag); \
static void TEST_FN_NAME(testname, __VA_ARGS__)(void) { \
struct { \
MboxBufHeader header; \
TEST_TAG_TYPE(testname) tag; \
uint32_t end_tag; \
} mailbox_buffer = { 0 }; \
\
QTestState *qts = qtest_init("-machine raspi4b"); \
\
mailbox_buffer.header.size = sizeof(mailbox_buffer); \
mailbox_buffer.header.req_resp_code = MBOX_PROCESS_REQUEST; \
\
mailbox_buffer.tag.id = TEST_TAG(testname); \
mailbox_buffer.tag.value_buffer_size = MAX( \
sizeof(mailbox_buffer.tag.request.value), \
sizeof(mailbox_buffer.tag.response.value)); \
mailbox_buffer.tag.request.zero = 0; \
\
mailbox_buffer.end_tag = RPI_FWREQ_PROPERTY_END; \
\
if (SETUP_FN_NAME(testname, __VA_ARGS__)) { \
SETUP_FN_NAME(testname, __VA_ARGS__)(&mailbox_buffer.tag); \
} \
\
qtest_memwrite(qts, MBOX_TEST_MESSAGE_ADDRESS, \
&mailbox_buffer, sizeof(mailbox_buffer)); \
qtest_mbox1_write_message(qts, MBOX_CHANNEL_ID_PROPERTY, \
MBOX_TEST_MESSAGE_ADDRESS); \
\
qtest_mbox0_read_message(qts, MBOX_CHANNEL_ID_PROPERTY, \
&mailbox_buffer, sizeof(mailbox_buffer)); \
\
g_assert_cmphex(mailbox_buffer.header.req_resp_code, ==, MBOX_SUCCESS);\
\
g_assert_cmphex(mailbox_buffer.tag.id, ==, TEST_TAG(testname)); \
\
uint32_t size = FIELD_EX32(mailbox_buffer.tag.response.size_stat, \
MBOX_SIZE_STAT, SIZE); \
uint32_t success = FIELD_EX32(mailbox_buffer.tag.response.size_stat, \
MBOX_SIZE_STAT, SUCCESS); \
g_assert_cmpint(size, ==, sizeof(mailbox_buffer.tag.response.value)); \
g_assert_cmpint(success, ==, 1); \
\
CHECK_FN_NAME(testname, __VA_ARGS__)(&mailbox_buffer.tag); \
\
qtest_quit(qts); \
} \
static void CHECK_FN_NAME(testname, __VA_ARGS__) \
(TEST_TAG_TYPE(testname) * tag)

/*----------------------------------------------------------------------------*/

#define QTEST_ADD_TEST_CASE(testname, ...) \
qtest_add_func(stringify(/bcm2838/mbox/property/ \
TEST_FN_NAME(testname, __VA_ARGS__)-test), \
TEST_FN_NAME(testname, __VA_ARGS__))

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_FIRMWARE_REVISION) {
g_assert_cmpint(tag->response.value.revision, ==, FIRMWARE_REVISION);
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_BOARD_REVISION) {
g_assert_cmpint(tag->response.value.revision, ==, BOARD_REVISION);
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_ARM_MEMORY) {
g_assert_cmphex(tag->response.value.base, ==, ARM_MEMORY_BASE);
g_assert_cmphex(tag->response.value.size, ==, ARM_MEMORY_SIZE);
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_VC_MEMORY) {
g_assert_cmphex(tag->response.value.base, ==, VC_MEMORY_BASE);
g_assert_cmphex(tag->response.value.size, ==, VC_MEMORY_SIZE);
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(SET_POWER_STATE) {
uint32_t enabled =
FIELD_EX32(tag->response.value.cmd, SET_POWER_STATE_CMD, EN);
uint32_t wait =
FIELD_EX32(tag->response.value.cmd, SET_POWER_STATE_CMD, WAIT);
g_assert_cmphex(tag->response.value.device_id, ==, DEVICE_ID_UART0);
g_assert_cmpint(enabled, ==, 1);
g_assert_cmpint(wait, ==, 0);
}
DECLARE_TEST_CASE_SETUP(SET_POWER_STATE) {
tag->request.value.device_id = DEVICE_ID_UART0;
tag->response.value.cmd =
FIELD_DP32(tag->response.value.cmd, SET_POWER_STATE_CMD, EN, 1);
tag->response.value.cmd =
FIELD_DP32(tag->response.value.cmd, SET_POWER_STATE_CMD, WAIT, 1);
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_CLOCK_STATE) {
uint32_t enabled =
FIELD_EX32(tag->response.value.cmd, GET_CLOCK_STATE_CMD, EN);
uint32_t not_present =
FIELD_EX32(tag->response.value.cmd, GET_CLOCK_STATE_CMD, NPRES);
g_assert_cmphex(tag->response.value.clock_id, ==, CLOCK_ID_CORE);
g_assert_cmphex(enabled, ==, 1);
g_assert_cmphex(not_present, ==, 0);
}
DECLARE_TEST_CASE_SETUP(GET_CLOCK_STATE) {
tag->request.value.clock_id = CLOCK_ID_CORE;
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_CLOCK_RATE, EMMC) {
g_assert_cmphex(tag->response.value.clock_id, ==, CLOCK_ID_EMMC);
g_assert_cmphex(tag->response.value.rate, ==, CLOCK_RATE_EMMC);
}
DECLARE_TEST_CASE_SETUP(GET_CLOCK_RATE, EMMC) {
tag->request.value.clock_id = CLOCK_ID_EMMC;
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_MAX_CLOCK_RATE, EMMC) {
g_assert_cmphex(tag->response.value.clock_id, ==, CLOCK_ID_EMMC);
g_assert_cmphex(tag->response.value.rate, ==, CLOCK_RATE_EMMC);
}
DECLARE_TEST_CASE_SETUP(GET_MAX_CLOCK_RATE, EMMC) {
tag->request.value.clock_id = CLOCK_ID_EMMC;
}

/*----------------------------------------------------------------------------*/
DECLARE_TEST_CASE(GET_MIN_CLOCK_RATE, EMMC) {
g_assert_cmphex(tag->response.value.clock_id, ==, CLOCK_ID_EMMC);
g_assert_cmphex(tag->response.value.rate, ==, CLOCK_RATE_EMMC);
}
DECLARE_TEST_CASE_SETUP(GET_MIN_CLOCK_RATE, EMMC) {
tag->request.value.clock_id = CLOCK_ID_EMMC;
}

/*----------------------------------------------------------------------------*/
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);

QTEST_ADD_TEST_CASE(GET_FIRMWARE_REVISION);
QTEST_ADD_TEST_CASE(GET_BOARD_REVISION);
QTEST_ADD_TEST_CASE(GET_ARM_MEMORY);
QTEST_ADD_TEST_CASE(GET_VC_MEMORY);
QTEST_ADD_TEST_CASE(SET_POWER_STATE);
QTEST_ADD_TEST_CASE(GET_CLOCK_STATE);
QTEST_ADD_TEST_CASE(GET_CLOCK_RATE, EMMC);
QTEST_ADD_TEST_CASE(GET_MAX_CLOCK_RATE, EMMC);
QTEST_ADD_TEST_CASE(GET_MIN_CLOCK_RATE, EMMC);

return g_test_run();
}
2 changes: 1 addition & 1 deletion tests/qtest/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ qtests_aarch64 = \
['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
(config_all_devices.has_key('CONFIG_XLNX_VERSAL') ? ['xlnx-canfd-test', 'xlnx-versal-trng-test'] : []) + \
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test'] : []) + \
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test', 'bcm2838-mbox-property-test'] : []) + \
(config_all_accel.has_key('CONFIG_TCG') and \
config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test'] : []) + \
['arm-cpu-features',
Expand Down

0 comments on commit 80afee9

Please sign in to comment.