[PATCH v4 35/45] Add mailbox test stub

Sergey Kambalin posted 45 patches 11 months, 3 weeks ago
Maintainers: Peter Maydell <peter.maydell@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Jason Wang <jasowang@redhat.com>, Cleber Rosa <crosa@redhat.com>, Wainer dos Santos Moschetta <wainersm@redhat.com>, Beraldo Leal <bleal@redhat.com>, Thomas Huth <thuth@redhat.com>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>
There is a newer version of this series
[PATCH v4 35/45] Add mailbox test stub
Posted by Sergey Kambalin 11 months, 3 weeks ago
Signed-off-by: Sergey Kambalin <sergey.kambalin@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)
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'),
 }
 
 if vnc.found()
-- 
2.34.1
Re: [PATCH v4 35/45] Add mailbox test stub
Posted by Peter Maydell 10 months, 2 weeks ago
On Fri, 8 Dec 2023 at 02:36, Sergey Kambalin <serg.oker@gmail.com> wrote:
>
> Signed-off-by: Sergey Kambalin <sergey.kambalin@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.maydell@linaro.org>

thanks
-- PMM