Skip to content

Commit

Permalink
tests/qtest: Add bcm2838 mailbox test stub
Browse files Browse the repository at this point in the history
Signed-off-by: Sergey Kambalin <sergey.kambalin@auriga.com>
Message-id: 20240226000259.2752893-32-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 2f79d2e commit 0c1797f
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 0 deletions.
60 changes: 60 additions & 0 deletions tests/qtest/bcm2838-mailbox.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Helper functions to work with BCM2838 mailbox via qtest interface.
*
* Copyright (c) 2023 Auriga LLC
*
* 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"

REG32(MBOX_EXCHNG_REG, 0)
FIELD(MBOX_EXCHNG_REG, CHANNEL, 0, 4)
FIELD(MBOX_EXCHNG_REG, DATA, 4, 28)

static uint32_t qtest_mbox0_read_reg32(QTestState *s, uint32_t offset)
{
return qtest_readl(s, MBOX0_BASE + offset);
}

static void qtest_mbox1_write_reg32(QTestState *s, uint32_t offset, uint32_t value)
{
return qtest_writel(s, MBOX1_BASE + offset, value);
}

static void qtest_mbox1_write(QTestState *s, uint8_t channel, uint32_t data)
{
uint32_t mbox_reg = 0;

mbox_reg = FIELD_DP32(mbox_reg, MBOX_EXCHNG_REG, CHANNEL, channel);
mbox_reg = FIELD_DP32(mbox_reg, MBOX_EXCHNG_REG, DATA, data);
qtest_mbox1_write_reg32(s, MBOX_REG_WRITE, mbox_reg);
}

int qtest_mbox0_has_data(QTestState *s) {
return !(qtest_mbox0_read_reg32(s, MBOX_REG_STATUS) & MBOX_READ_EMPTY);
}

void qtest_mbox0_read_message(QTestState *s,
uint8_t channel,
void *msgbuf,
size_t msgbuf_size)
{
uint32_t mbox_reg;
uint32_t msgaddr;

g_assert(qtest_mbox0_has_data(s));
mbox_reg = qtest_mbox0_read_reg32(s, MBOX_REG_READ);
g_assert_cmphex(FIELD_EX32(mbox_reg, MBOX_EXCHNG_REG, CHANNEL), ==, channel);
msgaddr = FIELD_EX32(mbox_reg, MBOX_EXCHNG_REG, DATA) << 4;
qtest_memread(s, msgaddr, msgbuf, msgbuf_size);
}

void qtest_mbox1_write_message(QTestState *s, uint8_t channel, uint32_t msg_addr)
{
qtest_mbox1_write(s, channel, msg_addr >> 4);
}
37 changes: 37 additions & 0 deletions tests/qtest/bcm2838-mailbox.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Declarations for BCM2838 mailbox test.
*
* Copyright (c) 2023 Auriga LLC
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

typedef struct {
uint32_t size;
uint32_t req_resp_code;
} MboxBufHeader;

#define DECLARE_TAG_TYPE(TypeName, RequestValueType, ResponseValueType) \
typedef struct { \
uint32_t id; \
uint32_t value_buffer_size; \
union { \
struct { \
uint32_t zero; \
RequestValueType value; \
} request; \
struct { \
uint32_t size_stat; \
ResponseValueType value; \
} response; \
}; \
} TypeName


int mbox0_has_data(void);
void mbox0_read_message(uint8_t channel, void *msgbuf, size_t msgbuf_size);
void mbox1_write_message(uint8_t channel, uint32_t msg_addr);
int qtest_mbox0_has_data(QTestState *s);
void qtest_mbox0_read_message(QTestState *s, uint8_t channel, void *msgbuf, size_t msgbuf_size);
void qtest_mbox1_write_message(QTestState *s, uint8_t channel, uint32_t msg_addr);
1 change: 1 addition & 0 deletions tests/qtest/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ qtests = {
'virtio-net-failover': files('migration-helpers.c'),
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
'bcm2838-mbox-property-test' : files('bcm2838-mailbox.c'),
}

if vnc.found()
Expand Down

0 comments on commit 0c1797f

Please sign in to comment.