On Fri, 8 Dec 2023 at 02:36, Sergey Kambalin <serg.o...@gmail.com> wrote: > > Signed-off-by: Sergey Kambalin <sergey.kamba...@auriga.com> > --- > include/hw/arm/bcm2838_peripherals.h | 2 + > tests/qtest/bcm2838-mailbox.c | 71 ++++++++++++++++++++++++++++ > tests/qtest/bcm2838-mailbox.h | 46 ++++++++++++++++++ > tests/qtest/meson.build | 1 + > 4 files changed, 120 insertions(+) > create mode 100644 tests/qtest/bcm2838-mailbox.c > create mode 100644 tests/qtest/bcm2838-mailbox.h > > diff --git a/include/hw/arm/bcm2838_peripherals.h > b/include/hw/arm/bcm2838_peripherals.h > index cdeb892f04..2b97e55048 100644 > --- a/include/hw/arm/bcm2838_peripherals.h > +++ b/include/hw/arm/bcm2838_peripherals.h > @@ -56,6 +56,8 @@ > #define BCM2838_MPHI_OFFSET 0xb200 > #define BCM2838_MPHI_SIZE 0x200 > > +#define GENET_OFFSET 0x1580000 > + > #define TYPE_BCM2838_PERIPHERALS "bcm2838-peripherals" > OBJECT_DECLARE_TYPE(BCM2838PeripheralState, BCM2838PeripheralClass, > BCM2838_PERIPHERALS)
This change looks like it should have been in some other patch (also it's the second define of GENET_OFFSET I think). > diff --git a/tests/qtest/bcm2838-mailbox.c b/tests/qtest/bcm2838-mailbox.c > new file mode 100644 > index 0000000000..2edc24e15e > --- /dev/null > +++ b/tests/qtest/bcm2838-mailbox.c > @@ -0,0 +1,71 @@ > +/* > + * 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" > + > + > +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 reg; > + > + reg = FIELD_DP32(reg, MBOX_WRITE_REG, CHANNEL, channel); > + reg = FIELD_DP32(reg, MBOX_WRITE_REG, DATA, data); > + qtest_mbox1_write_reg32(s, MBOX_REG_WRITE, reg); > +} > + > +int qtest_mbox0_has_data(QTestState *s) { > + return !(qtest_mbox0_read_reg32(s, MBOX_REG_STATUS) & MBOX_READ_EMPTY); > +} > + > +int mbox0_has_data(void) { > + return qtest_mbox0_has_data(global_qtest); > +} > + > +void qtest_mbox0_read_message(QTestState *s, > + uint8_t channel, > + void *msgbuf, > + size_t msgbuf_size) > +{ > + uint32_t reg; > + uint32_t msgaddr; > + > + g_assert(qtest_mbox0_has_data(s)); > + reg = qtest_mbox0_read_reg32(s, MBOX_REG_READ); > + g_assert_cmphex(FIELD_EX32(reg, MBOX_WRITE_REG, CHANNEL), ==, channel); > + msgaddr = FIELD_EX32(reg, MBOX_WRITE_REG, DATA) << 4; > + qtest_memread(s, msgaddr, msgbuf, msgbuf_size); > +} > + > +void mbox0_read_message(uint8_t channel, void *msgbuf, size_t msgbuf_size) { > + qtest_mbox0_read_message(global_qtest, channel, 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); > +} > + > + > +void mbox1_write_message(uint8_t channel, uint32_t msg_addr) > +{ > + qtest_mbox1_write_message(global_qtest, channel, msg_addr); > +} > diff --git a/tests/qtest/bcm2838-mailbox.h b/tests/qtest/bcm2838-mailbox.h > new file mode 100644 > index 0000000000..1d02ca9c2c > --- /dev/null > +++ b/tests/qtest/bcm2838-mailbox.h > @@ -0,0 +1,46 @@ > +/* > + * 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. > + */ > + > + > +REG32(MBOX_WRITE_REG, 0) > +FIELD(MBOX_WRITE_REG, CHANNEL, 0, 4) > +FIELD(MBOX_WRITE_REG, DATA, 4, 28) > + > +REG32(MBOX_SIZE_STAT, 0) > +FIELD(MBOX_WRITE_REG, SIZE, 0, 30) > +FIELD(MBOX_WRITE_REG, SUCCESS, 30, 1) > + > +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); > diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build > index 47dabf91d0..92eba5ac99 100644 > --- a/tests/qtest/meson.build > +++ b/tests/qtest/meson.build > @@ -321,6 +321,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'), Does this compile successfully at this point, given there's no main() function in it yet ? If not, this should go later in the patchset. > } > > if vnc.found() > -- > 2.34.1 Otherwise Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM