qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Corey Minyard <minyard@acm.org>
Cc: qemu-devel@nongnu.org,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Michael S . Tsirkin" <mst@redhat.com>,
	"Corey Minyard" <cminyard@mvista.com>
Subject: Re: [Qemu-devel] [PATCH v3 14/16] i2c:smbus_eeprom: Add vmstate handling to the smbus eeprom
Date: Thu, 3 Jan 2019 10:44:50 +0000	[thread overview]
Message-ID: <20190103104450.GE2316@work-vm> (raw)
In-Reply-To: <64256efc-d0e4-1828-bf67-81c46984f387@acm.org>

* Corey Minyard (minyard@acm.org) wrote:
> On 11/29/18 7:29 AM, Dr. David Alan Gilbert wrote:
> > * 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[].
> > So I think I'm OK with this, but I'd like other peoples comments as
> > well; see comments.
> 
> 
> Well, no comments so far.
> 
> I have a question on this.  If this particular device were modified to be
> able
> to support different size eeproms, would this need a new version of the
> vmstate structure?  I know the vmstate structure itself would have to
> change to have an array size, but would it have to change in such a
> way that the array size would need to be transmitted?
> 
> I ask because someday, someone might need an eeprom of a different
> size, and it would be nice if it could be done now in a way that avoided
> creating a new version.

That depends; for example one way to do it would be to keep the existing
structure for cases where the PROM was the current default size, and
then add the extra data in a subsection that was only transmitted for a
PROM that was a different size.

However, it's probably simpler - the size of the eprom comes from the
configuration from the command line etc - it's not a dynamic thing;
So you'd probably end up going back to a void *data, making sure that's
allocated before thefields are loaded, and then replacing the
VMSTATE_UINT8_ARRAY by a VMSTATE_BUFFER;  note that if the sizes don't
match on source/destination then that would fail rather messily
where as the subsection would fail cleanly.

Dave

> Thanks,
> 
> -corey
> 
> > > 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;
> > That's a little complx, but OK.
> > 
> > > +}
> > > +
> > > +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),
> > OK, good - including 'accessed' means that if we migrate a->b->c and
> > it's not changed while it's on b, then 'c' still gets the updated
> > version.
> > 
> > > +        VMSTATE_END_OF_LIST()
> > > +    }
> > > +};
> > > +
> > >   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;
> > >   }
> > so from migration side:
> > 
> > 
> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > 
> > > -- 
> > > 2.17.1
> > > 
> > --
> > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2019-01-03 10:45 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-26 20:04 [Qemu-devel] [PATCH v3 00/16] Fix/add vmstate handling in some I2C code minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 01/16] i2c: Split smbus into parts minyard
2018-11-26 20:23   ` Philippe Mathieu-Daudé
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 02/16] i2c: have I2C receive operation return uint8_t minyard
2018-11-26 20:23   ` Philippe Mathieu-Daudé
2018-11-27  0:14     ` Corey Minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 03/16] arm:i2c: Don't mask return from i2c_recv() minyard
2018-11-26 20:29   ` Philippe Mathieu-Daudé
2018-11-30 17:26   ` Peter Maydell
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 04/16] i2c: Don't check return value " minyard
2018-11-30 17:25   ` Peter Maydell
2018-11-30 18:53     ` Corey Minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 05/16] i2c: Simplify and correct the SMBus state machine minyard
2018-11-30 18:13   ` Peter Maydell
2018-11-30 21:03     ` Corey Minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 06/16] i2c: Add a length check to the SMBus write handling minyard
2018-11-26 20:33   ` Philippe Mathieu-Daudé
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 07/16] i2c:pm_smbus: Fix pm_smbus handling of I2C block read minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 08/16] boards.h: Ignore migration for SMBus devices on older machines minyard
2018-11-29 12:20   ` Dr. David Alan Gilbert
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 09/16] migration: Add a VMSTATE_BOOL_TEST() macro minyard
2018-11-29 12:22   ` Dr. David Alan Gilbert
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 10/16] i2c:pm_smbus: Fix state transfer minyard
2018-11-29 12:28   ` Dr. David Alan Gilbert
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 11/16] i2c:smbus_slave: Add an SMBus vmstate structure minyard
2018-11-29 13:09   ` Dr. David Alan Gilbert
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 12/16] i2c:smbus_eeprom: Add normal type name and cast to smbus_eeprom.c minyard
2018-11-26 20:35   ` Philippe Mathieu-Daudé
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 13/16] i2c:smbus_eeprom: Add a size constant for the smbus_eeprom size minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 14/16] i2c:smbus_eeprom: Add vmstate handling to the smbus eeprom minyard
2018-11-29 13:29   ` Dr. David Alan Gilbert
2018-12-19 18:52     ` Corey Minyard
2019-01-03 10:44       ` Dr. David Alan Gilbert [this message]
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 15/16] hw/i2c/smbus_eeprom: Create at most SMBUS_EEPROM_MAX EEPROMs on a SMBus minyard
2018-11-30 17:39   ` Peter Maydell
2018-11-30 20:47     ` Corey Minyard
2018-12-01 11:57       ` Peter Maydell
2018-12-01 17:43         ` Philippe Mathieu-Daudé
2018-12-03 21:19           ` Corey Minyard
2018-11-26 20:04 ` [Qemu-devel] [PATCH v3 16/16] i2c:smbus_eeprom: Add a reset function to smbus_eeprom minyard
2018-11-26 20:42   ` Philippe Mathieu-Daudé
2018-11-26 22:41     ` Corey Minyard
2018-11-26 23:01       ` Philippe Mathieu-Daudé
2018-11-26 23:58         ` Corey Minyard
2018-11-27 10:54           ` Philippe Mathieu-Daudé
2018-11-27 12:58             ` Corey Minyard
2018-11-27 13:27               ` 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=20190103104450.GE2316@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=philmd@redhat.com \
    --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 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).