qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Corey Minyard <corey@minyard.net>
To: Octavian Purdila <tavip@google.com>
Cc: qemu-devel@nongnu.org, qemu-arm@nongnu.org, stefanst@google.com,
	pbonzini@redhat.com, peter.maydell@linaro.org,
	marcandre.lureau@redhat.com, berrange@redhat.com,
	eduardo@habkost.net, luc@lmichel.fr, damien.hedde@dahe.fr,
	alistair@alistair23.me, thuth@redhat.com, philmd@linaro.org,
	jsnow@redhat.com, crosa@redhat.com, lvivier@redhat.com
Subject: Re: [PATCH 19/25] hw/misc: add i2c-tester
Date: Wed, 18 Sep 2024 15:05:57 -0500	[thread overview]
Message-ID: <Zusypeay8cjjPTn0@mail.minyard.net> (raw)
In-Reply-To: <20240918192254.3136903-20-tavip@google.com>

On Wed, Sep 18, 2024 at 12:22:47PM -0700, Octavian Purdila wrote:
> Add a simple i2c peripheral to be used for testing I2C device
> models. The peripheral has a fixed number of registers that can be
> read and written.

Why is this better than just using the eeprom device?

This has some uncommon attributes compared to most i2c devices.  For
instance, most i2c devices take their address as the first bytes of a
write operation, then auto-increment after that for reads and writes.
This seems to take one address on a write after a system reset, then use
that forever.

Anyway, unless there is a compelling reason to use this over the eeprom
device, I'm going to recommend against it.

-corey

> 
> Signed-off-by: Octavian Purdila <tavip@google.com>
> ---
>  include/hw/misc/i2c_tester.h |  30 ++++++++++
>  hw/misc/i2c_tester.c         | 109 +++++++++++++++++++++++++++++++++++
>  hw/misc/Kconfig              |   5 ++
>  hw/misc/meson.build          |   2 +
>  4 files changed, 146 insertions(+)
>  create mode 100644 include/hw/misc/i2c_tester.h
>  create mode 100644 hw/misc/i2c_tester.c
> 
> diff --git a/include/hw/misc/i2c_tester.h b/include/hw/misc/i2c_tester.h
> new file mode 100644
> index 0000000000..f6b6491008
> --- /dev/null
> +++ b/include/hw/misc/i2c_tester.h
> @@ -0,0 +1,30 @@
> +/*
> + *
> + * Copyright (c) 2024 Google LLC
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#ifndef HW_I2C_TESTER_H
> +#define HW_I2C_TESTER_H
> +
> +#include "qemu/osdep.h"
> +#include "hw/i2c/i2c.h"
> +#include "hw/irq.h"
> +
> +#define I2C_TESTER_NUM_REGS    0x31
> +
> +#define TYPE_I2C_TESTER "i2c-tester"
> +#define I2C_TESTER(obj) OBJECT_CHECK(I2cTesterState, (obj), TYPE_I2C_TESTER)
> +
> +typedef struct {
> +    I2CSlave i2c;
> +    bool set_reg_idx;
> +    uint8_t reg_idx;
> +    uint8_t regs[I2C_TESTER_NUM_REGS];
> +} I2cTesterState;
> +
> +#endif /* HW_I2C_TESTER_H */
> diff --git a/hw/misc/i2c_tester.c b/hw/misc/i2c_tester.c
> new file mode 100644
> index 0000000000..77ce8bf91a
> --- /dev/null
> +++ b/hw/misc/i2c_tester.c
> @@ -0,0 +1,109 @@
> +/*
> + * Simple I2C peripheral for testing I2C device models.
> + *
> + * Copyright (c) 2024 Google LLC
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + *
> + * 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 "hw/misc/i2c_tester.h"
> +
> +#include "qemu/log.h"
> +#include "qemu/module.h"
> +#include "migration/vmstate.h"
> +
> +static void i2c_tester_reset_enter(Object *o, ResetType type)
> +{
> +    I2cTesterState *s = I2C_TESTER(o);
> +
> +    s->set_reg_idx = false;
> +    s->reg_idx     = 0;
> +    memset(s->regs, 0, I2C_TESTER_NUM_REGS);
> +}
> +
> +static int i2c_tester_event(I2CSlave *i2c, enum i2c_event event)
> +{
> +    I2cTesterState *s = I2C_TESTER(i2c);
> +
> +    if (event == I2C_START_SEND) {
> +        s->set_reg_idx = true;
> +    }
> +
> +    return 0;
> +}
> +
> +static uint8_t i2c_tester_rx(I2CSlave *i2c)
> +{
> +    I2cTesterState *s = I2C_TESTER(i2c);
> +
> +    if (s->reg_idx >= I2C_TESTER_NUM_REGS) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid reg 0x%02x\n", __func__,
> +                      s->reg_idx);
> +        return I2C_NACK;
> +    }
> +
> +    return s->regs[s->reg_idx];
> +}
> +
> +static int i2c_tester_tx(I2CSlave *i2c, uint8_t data)
> +{
> +    I2cTesterState *s = I2C_TESTER(i2c);
> +
> +    if (s->set_reg_idx) {
> +        /* Setting the register in which the operation will be done. */
> +        s->reg_idx = data;
> +        s->set_reg_idx = false;
> +        return 0;
> +    }
> +
> +    if (s->reg_idx >= I2C_TESTER_NUM_REGS) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid reg 0x%02x\n", __func__,
> +                      s->reg_idx);
> +        return I2C_NACK;
> +    }
> +
> +    /* Write reg data. */
> +    s->regs[s->reg_idx] = data;
> +
> +    return 0;
> +}
> +
> +static const VMStateDescription vmstate_i2c_tester = {
> +    .name = "i2c-tester",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .fields = (const VMStateField[]) {
> +        VMSTATE_I2C_SLAVE(i2c, I2cTesterState),
> +        VMSTATE_BOOL(set_reg_idx, I2cTesterState),
> +        VMSTATE_UINT8(reg_idx, I2cTesterState),
> +        VMSTATE_UINT8_ARRAY(regs, I2cTesterState, I2C_TESTER_NUM_REGS),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +static void i2c_tester_class_init(ObjectClass *oc, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(oc);
> +    ResettableClass *rc = RESETTABLE_CLASS(oc);
> +    I2CSlaveClass *isc = I2C_SLAVE_CLASS(oc);
> +
> +    rc->phases.enter = i2c_tester_reset_enter;
> +    dc->vmsd = &vmstate_i2c_tester;
> +    isc->event = i2c_tester_event;
> +    isc->recv = i2c_tester_rx;
> +    isc->send = i2c_tester_tx;
> +}
> +
> +static const TypeInfo i2c_tester_types[] = {
> +    {
> +        .name = TYPE_I2C_TESTER,
> +        .parent = TYPE_I2C_SLAVE,
> +        .instance_size = sizeof(I2cTesterState),
> +        .class_init = i2c_tester_class_init
> +    },
> +};
> +
> +DEFINE_TYPES(i2c_tester_types);
> diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
> index 4b688aead2..3e93c12c8e 100644
> --- a/hw/misc/Kconfig
> +++ b/hw/misc/Kconfig
> @@ -213,6 +213,11 @@ config IOSB
>  config XLNX_VERSAL_TRNG
>      bool
>  
> +config I2C_TESTER
> +    bool
> +    default y if TEST_DEVICES
> +    depends on I2C
> +
>  config FLEXCOMM
>      bool
>      select I2C
> diff --git a/hw/misc/meson.build b/hw/misc/meson.build
> index faaf2671ba..4f22231fa3 100644
> --- a/hw/misc/meson.build
> +++ b/hw/misc/meson.build
> @@ -158,6 +158,8 @@ system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c'))
>  # HPPA devices
>  system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.c'))
>  
> +system_ss.add(when: 'CONFIG_I2C_TESTER', if_true: files('i2c_tester.c'))
> +
>  system_ss.add(when: 'CONFIG_FLEXCOMM', if_true: files('flexcomm.c'))
>  system_ss.add(when: 'CONFIG_RT500_CLKCTL', if_true: files('rt500_clkctl0.c', 'rt500_clkctl1.c'))
>  system_ss.add(when: 'CONFIG_RT500_RSTCTL', if_true: files('rt500_rstctl.c'))
> -- 
> 2.46.0.662.g92d0881bb0-goog
> 
> 


  reply	other threads:[~2024-09-18 20:52 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-18 19:22 [PATCH 00/25] NXP i.MX RT595 Octavian Purdila
2024-09-18 19:22 ` [PATCH 01/25] fifo32: add peek function Octavian Purdila
2024-09-18 19:22 ` [PATCH 02/25] tests/unit: add fifo32 tests Octavian Purdila
2024-09-18 19:22 ` [PATCH 03/25] scripts: add script to generate C header files from SVD XML files Octavian Purdila
2024-09-18 19:22 ` [PATCH 04/25] Add mcux-soc-svd subproject Octavian Purdila
2024-09-18 19:22 ` [PATCH 05/25] hw/misc: add support for flexcomm Octavian Purdila
2024-09-18 19:22 ` [PATCH 06/25] hw/misc/flexcomm.c: add common fifo functionality Octavian Purdila
2024-09-18 19:22 ` [PATCH 07/25] hw/char: add support for flexcomm usart Octavian Purdila
2024-09-18 19:22 ` [PATCH 08/25] hw/i2c: add support for flexcomm i2c Octavian Purdila
2024-09-18 20:17   ` Corey Minyard
2024-09-18 21:04     ` Octavian Purdila
2024-09-18 21:31       ` Corey Minyard
2024-09-18 22:25         ` Octavian Purdila
2024-09-19  9:36         ` Peter Maydell
2024-09-20 18:02           ` Octavian Purdila
2024-09-20 18:09             ` Corey Minyard
2024-09-18 19:22 ` [PATCH 09/25] hw/ssi: add support for flexcomm spi Octavian Purdila
2024-09-18 19:22 ` [PATCH 10/25] hw/misc: add support for RT500's clock controller Octavian Purdila
2024-09-18 19:22 ` [PATCH 11/25] hw/ssi: add support for flexspi Octavian Purdila
2024-09-18 19:22 ` [PATCH 12/25] hw/misc: add support for RT500's reset controller Octavian Purdila
2024-09-18 19:22 ` [PATCH 13/25] hw/arm: add basic support for the RT500 SoC Octavian Purdila
2024-09-18 19:22 ` [PATCH 14/25] hw/arm: add RT595-EVK board Octavian Purdila
2024-09-18 19:22 ` [PATCH 15/25] tests/qtest: add register access macros and functions Octavian Purdila
2024-09-18 19:22 ` [PATCH 16/25] system/qtest: add APIS to check for memory access failures Octavian Purdila
2024-09-18 19:22 ` [PATCH 17/25] tests/qtest: add flexcomm tests Octavian Purdila
2024-09-18 19:22 ` [PATCH 18/25] tests/qtest: add flexcomm usart tests Octavian Purdila
2024-09-18 19:22 ` [PATCH 19/25] hw/misc: add i2c-tester Octavian Purdila
2024-09-18 20:05   ` Corey Minyard [this message]
2024-09-18 23:03     ` Octavian Purdila
2024-09-18 23:52       ` Corey Minyard
2024-09-18 19:22 ` [PATCH 20/25] tests/qtest: add tests for flexcomm i2c Octavian Purdila
2024-09-18 19:22 ` [PATCH 21/25] hw/ssi: allow NULL realize callbacks for peripherals Octavian Purdila
2024-09-18 19:22 ` [PATCH 22/25] hw/misc: add spi-tester Octavian Purdila
2024-09-18 19:22 ` [PATCH 23/25] tests/qtest: add tests for flexcomm spi Octavian Purdila
2024-09-18 19:22 ` [PATCH 24/25] systems/qtest: add device clock APIs Octavian Purdila
2024-09-18 19:22 ` [PATCH 25/25] tests/qtest: add tests for RT500's clock controller Octavian Purdila

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zusypeay8cjjPTn0@mail.minyard.net \
    --to=corey@minyard.net \
    --cc=alistair@alistair23.me \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=damien.hedde@dahe.fr \
    --cc=eduardo@habkost.net \
    --cc=jsnow@redhat.com \
    --cc=luc@lmichel.fr \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanst@google.com \
    --cc=tavip@google.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).