From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: minyard@acm.org
Cc: qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
Corey Minyard <cminyard@mvista.com>,
Peter Maydell <peter.maydell@linaro.org>
Subject: Re: [Qemu-devel] [PATCH v2 11/12] i2c: Add vmstate handling to the smbus eeprom
Date: Mon, 26 Nov 2018 17:30:31 +0000 [thread overview]
Message-ID: <20181126173030.GK2547@work-vm> (raw)
In-Reply-To: <20181115192446.17187-12-minyard@acm.org>
* minyard@acm.org (minyard@acm.org) wrote:
> From: Corey Minyard <cminyard@mvista.com>
>
> Transfer the state of the EEPROM on a migration. This way the
> data remains consistent on migration.
>
> This required moving the actual data to a separate array and
> using the data provided in the init function as a separate
> initialization array, since a pointer property has to be a
> void * and the array needs to be uint8_t[].
>
> Signed-off-by: Corey Minyard <cminyard@mvista.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> ---
> hw/i2c/smbus_eeprom.c | 34 ++++++++++++++++++++++++++++++++--
> 1 file changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
> index 8e9b734c09..942057dc10 100644
> --- a/hw/i2c/smbus_eeprom.c
> +++ b/hw/i2c/smbus_eeprom.c
> @@ -24,6 +24,7 @@
>
> #include "qemu/osdep.h"
> #include "hw/hw.h"
> +#include "hw/boards.h"
> #include "hw/i2c/i2c.h"
> #include "hw/i2c/smbus_slave.h"
> #include "hw/i2c/smbus_eeprom.h"
> @@ -39,8 +40,10 @@
>
> typedef struct SMBusEEPROMDevice {
> SMBusDevice smbusdev;
> - void *data;
> + uint8_t data[SMBUS_EEPROM_SIZE];
> + void *init_data;
> uint8_t offset;
> + bool accessed;
> } SMBusEEPROMDevice;
>
> static uint8_t eeprom_receive_byte(SMBusDevice *dev)
> @@ -49,6 +52,7 @@ static uint8_t eeprom_receive_byte(SMBusDevice *dev)
> uint8_t *data = eeprom->data;
> uint8_t val = data[eeprom->offset++];
>
> + eeprom->accessed = true;
> #ifdef DEBUG
> printf("eeprom_receive_byte: addr=0x%02x val=0x%02x\n",
> dev->i2c.address, val);
> @@ -61,6 +65,7 @@ static int eeprom_write_data(SMBusDevice *dev, uint8_t *buf, uint8_t len)
> SMBusEEPROMDevice *eeprom = SMBUS_EEPROM(dev);
> uint8_t *data = eeprom->data;
>
> + eeprom->accessed = true;
> #ifdef DEBUG
> printf("eeprom_write_byte: addr=0x%02x cmd=0x%02x val=0x%02x\n",
> dev->i2c.address, cmd, buf[0]);
> @@ -78,15 +83,39 @@ static int eeprom_write_data(SMBusDevice *dev, uint8_t *buf, uint8_t len)
> return 0;
> }
>
> +static bool smbus_eeprom_vmstate_needed(void *opaque)
> +{
> + MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
> + SMBusEEPROMDevice *eeprom = opaque;
> +
> + return (eeprom->accessed || smbus_vmstate_needed(&eeprom->smbusdev)) &&
> + !mc->smbus_no_migration_support;
> +}
> +
> +static const VMStateDescription vmstate_smbus_eeprom = {
> + .name = "smbus-eeprom",
> + .version_id = 1,
> + .minimum_version_id = 1,
> + .needed = smbus_eeprom_vmstate_needed,
> + .fields = (VMStateField[]) {
> + VMSTATE_SMBUS_DEVICE(smbusdev, SMBusEEPROMDevice),
> + VMSTATE_UINT8_ARRAY(data, SMBusEEPROMDevice, SMBUS_EEPROM_SIZE),
> + VMSTATE_UINT8(offset, SMBusEEPROMDevice),
> + VMSTATE_BOOL(accessed, SMBusEEPROMDevice),
> + VMSTATE_END_OF_LIST()
I think this is OK from the vmstate side of things.
Dave
> + }
> +};
> +
> static void smbus_eeprom_realize(DeviceState *dev, Error **errp)
> {
> SMBusEEPROMDevice *eeprom = SMBUS_EEPROM(dev);
>
> + memcpy(eeprom->data, eeprom->init_data, SMBUS_EEPROM_SIZE);
> eeprom->offset = 0;
> }
>
> static Property smbus_eeprom_properties[] = {
> - DEFINE_PROP_PTR("data", SMBusEEPROMDevice, data),
> + DEFINE_PROP_PTR("data", SMBusEEPROMDevice, init_data),
> DEFINE_PROP_END_OF_LIST(),
> };
>
> @@ -99,6 +128,7 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
> sc->receive_byte = eeprom_receive_byte;
> sc->write_data = eeprom_write_data;
> dc->props = smbus_eeprom_properties;
> + dc->vmsd = &vmstate_smbus_eeprom;
> /* Reason: pointer property "data" */
> dc->user_creatable = false;
> }
> --
> 2.17.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2018-11-26 17:30 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-15 19:24 [Qemu-devel] [PATCH v2 00/12] RFC: Fix/add vmstate handling in some I2C code minyard
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 01/12] i2c: Split smbus into parts minyard
2018-11-15 22:22 ` Philippe Mathieu-Daudé
2018-11-16 13:20 ` Corey Minyard
2018-11-20 15:47 ` Peter Maydell
2018-11-20 19:30 ` Philippe Mathieu-Daudé
2018-11-21 11:59 ` Peter Maydell
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 02/12] i2c: have I2C receive operation return uint8_t minyard
2018-11-20 15:31 ` Peter Maydell
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 03/12] i2c: Simplify and correct the SMBus state machine minyard
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 04/12] i2c: Add a length check to the SMBus write handling minyard
2018-11-20 15:33 ` Peter Maydell
2018-11-20 16:58 ` Corey Minyard
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 05/12] i2c: Fix pm_smbus handling of I2C block read minyard
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 06/12] boards.h: Ignore migration for SMBus devices on older machines minyard
2018-11-26 17:23 ` Dr. David Alan Gilbert
2018-11-26 18:22 ` Corey Minyard
2018-11-27 16:01 ` Dr. David Alan Gilbert
2018-11-27 16:59 ` Corey Minyard
2018-11-27 18:14 ` Dr. David Alan Gilbert
2018-11-27 18:41 ` Laurent Vivier
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer minyard
2018-11-26 17:20 ` Dr. David Alan Gilbert
2018-11-26 18:24 ` Corey Minyard
2018-11-26 19:41 ` Corey Minyard
2018-11-27 18:20 ` Dr. David Alan Gilbert
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 08/12] i2c: Add an SMBus vmstate structure minyard
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 09/12] i2c: Add normal type name and cast to smbus_eeprom.c minyard
2018-11-20 15:34 ` Peter Maydell
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 10/12] i2c: Add a size constant for the smbus_eeprom size minyard
2018-11-15 22:34 ` Philippe Mathieu-Daudé
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 11/12] i2c: Add vmstate handling to the smbus eeprom minyard
2018-11-26 17:30 ` Dr. David Alan Gilbert [this message]
2018-11-15 19:24 ` [Qemu-devel] [PATCH v2 12/12] i2c: Add a reset function to smbus_eeprom minyard
2018-11-15 23:01 ` [Qemu-devel] [PATCH v2 00/12] RFC: Fix/add vmstate handling in some I2C code Philippe Mathieu-Daudé
2018-11-16 13:30 ` Corey Minyard
2018-11-26 14:11 ` Corey Minyard
2018-11-26 14:35 ` Philippe Mathieu-Daudé
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=20181126173030.GK2547@work-vm \
--to=dgilbert@redhat.com \
--cc=cminyard@mvista.com \
--cc=minyard@acm.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.