Re: [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer

2018-11-27 Thread Dr. David Alan Gilbert
* Corey Minyard (miny...@acm.org) wrote:
> On 11/26/18 12:24 PM, Corey Minyard wrote:
> > On 11/26/18 11:20 AM, Dr. David Alan Gilbert wrote:
> > > * miny...@acm.org (miny...@acm.org) wrote:
> > > > From: Corey Minyard 
> > > > 
> > > > Transfer the state information for the SMBus registers and
> > > > internal data so it will work on a VM transfer.
> > > > 
> > > > Signed-off-by: Corey Minyard 
> > > > Cc: Michael S. Tsirkin 
> > > > Cc: Paolo Bonzini 
> > > > Cc: Dr. David Alan Gilbert 
> > > > ---
> > > >   hw/acpi/piix4.c   |  3 ++-
> > > >   hw/i2c/pm_smbus.c | 31 +++
> > > >   hw/i2c/smbus_ich9.c   |  6 --
> > > >   include/hw/i2c/pm_smbus.h |  2 ++
> > > >   4 files changed, 39 insertions(+), 3 deletions(-)
> > > > 
> > > > diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
> > > > index e330f24c71..313305f5a0 100644
> > > > --- a/hw/acpi/piix4.c
> > > > +++ b/hw/acpi/piix4.c
> > > > @@ -309,7 +309,7 @@ static const VMStateDescription
> > > > vmstate_cpuhp_state = {
> > > >    */
> > > >   static const VMStateDescription vmstate_acpi = {
> > > >   .name = "piix4_pm",
> > > > -    .version_id = 3,
> > > > +    .version_id = 4,
> > > OK, so do we need to bump this version ?  Ideally you'd keep the version
> > > as is and let the needed do the work.
> > 
> > 
> > Got it, that makes sense.  Same for the comments below, I'll get all
> > those.
> > 
> Well, maybe not.  the .needed function is only called on the save side, it
> is
> not called on the load side  So a 2.12 to 3.0 transfer fails.  So I've
> exported
> the migration needed function and I'm using the VMSTATE_STRUCT_TEST()
> function to transfer it in each case.  With that I can migrate from 2.12 to
> 3.0 and back without issue.

Ah OK, that's an interesting observation; I hadn't realised it wasn't
symmetric like that, but I can kind of see why thinking about how the
code got that way.

Dave

> -corey
> 
> 
> > Thanks,
> > 
> > -corey
> > 
> > 
> > > >   .minimum_version_id = 3,
> > > >   .minimum_version_id_old = 1,
> > > >   .load_state_old = acpi_load_old,
> > > > @@ -320,6 +320,7 @@ static const VMStateDescription vmstate_acpi = {
> > > >   VMSTATE_UINT16(ar.pm1.evt.en, PIIX4PMState),
> > > >   VMSTATE_UINT16(ar.pm1.cnt.cnt, PIIX4PMState),
> > > >   VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
> > > > +    VMSTATE_STRUCT(smb, PIIX4PMState, 4, pmsmb_vmstate, PMSMBus),
> > > >   VMSTATE_TIMER_PTR(ar.tmr.timer, PIIX4PMState),
> > > >   VMSTATE_INT64(ar.tmr.overflow_time, PIIX4PMState),
> > > >   VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe,
> > > > ACPIGPE),
> > > > diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c
> > > > index 8793113c25..75907e1c22 100644
> > > > --- a/hw/i2c/pm_smbus.c
> > > > +++ b/hw/i2c/pm_smbus.c
> > > > @@ -19,6 +19,7 @@
> > > >    */
> > > >   #include "qemu/osdep.h"
> > > >   #include "hw/hw.h"
> > > > +#include "hw/boards.h"
> > > >   #include "hw/i2c/pm_smbus.h"
> > > >   #include "hw/i2c/smbus_master.h"
> > > >   @@ -450,6 +451,36 @@ static const MemoryRegionOps pm_smbus_ops = {
> > > >   .endianness = DEVICE_LITTLE_ENDIAN,
> > > >   };
> > > >   +static bool pm_smbus_vmstate_needed(void *opaque)
> > > > +{
> > > > +    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
> > > > +
> > > > +    return !mc->smbus_no_migration_support;
> > > > +}
> > > OK
> > > 
> > > > +const VMStateDescription pmsmb_vmstate = {
> > > > +    .name = "pmsmb",
> > > > +    .version_id = 1,
> > > > +    .minimum_version_id = 1,
> > > > +    .needed = pm_smbus_vmstate_needed,
> > > > +    .fields = (VMStateField[]) {
> > > > +    VMSTATE_UINT8(smb_stat, PMSMBus),
> > > > +    VMSTATE_UINT8(smb_ctl, PMSMBus),
> > > > +    VMSTATE_UINT8(smb_cmd, PMSMBus),
> > > > +    VMSTATE_UINT8(smb_addr, PMSMBus),
> > > > +    VMSTATE_UINT8(smb_data0, PMSMBus),
> > > > +    VMSTATE_UINT8(smb_data1, PMSMBus),
> > > > +    VMSTATE_UINT32(smb_index, PMSMBus),
> > > > +    VMSTATE_UINT8_ARRAY(smb_data, PMSMBus, PM_SMBUS_MAX_MSG_SIZE),
> > > > +    VMSTATE_UINT8(smb_auxctl, PMSMBus),
> > > > +    VMSTATE_BOOL(i2c_enable, PMSMBus),
> > > > +    VMSTATE_BOOL(op_done, PMSMBus),
> > > > +    VMSTATE_BOOL(in_i2c_block_read, PMSMBus),
> > > > +    VMSTATE_BOOL(start_transaction_on_status_read, PMSMBus),
> > > > +    VMSTATE_END_OF_LIST()
> > > > +    }
> > > > +};
> > > > +
> > > >   void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool
> > > > force_aux_blk)
> > > >   {
> > > >   smb->op_done = true;
> > > > diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
> > > > index e6d8d28194..c9b7482a54 100644
> > > > --- a/hw/i2c/smbus_ich9.c
> > > > +++ b/hw/i2c/smbus_ich9.c
> > > > @@ -45,10 +45,12 @@ typedef struct ICH9SMBState {
> > > >     static const VMStateDescription vmstate_ich9_smbus = {
> > > >   .name = "ich9_smb",
> > > > -    

Re: [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer

2018-11-26 Thread Corey Minyard

On 11/26/18 12:24 PM, Corey Minyard wrote:

On 11/26/18 11:20 AM, Dr. David Alan Gilbert wrote:

* miny...@acm.org (miny...@acm.org) wrote:

From: Corey Minyard 

Transfer the state information for the SMBus registers and
internal data so it will work on a VM transfer.

Signed-off-by: Corey Minyard 
Cc: Michael S. Tsirkin 
Cc: Paolo Bonzini 
Cc: Dr. David Alan Gilbert 
---
  hw/acpi/piix4.c   |  3 ++-
  hw/i2c/pm_smbus.c | 31 +++
  hw/i2c/smbus_ich9.c   |  6 --
  include/hw/i2c/pm_smbus.h |  2 ++
  4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index e330f24c71..313305f5a0 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -309,7 +309,7 @@ static const VMStateDescription 
vmstate_cpuhp_state = {

   */
  static const VMStateDescription vmstate_acpi = {
  .name = "piix4_pm",
-    .version_id = 3,
+    .version_id = 4,

OK, so do we need to bump this version ?  Ideally you'd keep the version
as is and let the needed do the work.



Got it, that makes sense.  Same for the comments below, I'll get all 
those.


Well, maybe not.  the .needed function is only called on the save side, 
it is
not called on the load side  So a 2.12 to 3.0 transfer fails.  So I've 
exported

the migration needed function and I'm using the VMSTATE_STRUCT_TEST()
function to transfer it in each case.  With that I can migrate from 2.12 to
3.0 and back without issue.

-corey



Thanks,

-corey



  .minimum_version_id = 3,
  .minimum_version_id_old = 1,
  .load_state_old = acpi_load_old,
@@ -320,6 +320,7 @@ static const VMStateDescription vmstate_acpi = {
  VMSTATE_UINT16(ar.pm1.evt.en, PIIX4PMState),
  VMSTATE_UINT16(ar.pm1.cnt.cnt, PIIX4PMState),
  VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
+    VMSTATE_STRUCT(smb, PIIX4PMState, 4, pmsmb_vmstate, PMSMBus),
  VMSTATE_TIMER_PTR(ar.tmr.timer, PIIX4PMState),
  VMSTATE_INT64(ar.tmr.overflow_time, PIIX4PMState),
  VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, 
ACPIGPE),

diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c
index 8793113c25..75907e1c22 100644
--- a/hw/i2c/pm_smbus.c
+++ b/hw/i2c/pm_smbus.c
@@ -19,6 +19,7 @@
   */
  #include "qemu/osdep.h"
  #include "hw/hw.h"
+#include "hw/boards.h"
  #include "hw/i2c/pm_smbus.h"
  #include "hw/i2c/smbus_master.h"
  @@ -450,6 +451,36 @@ static const MemoryRegionOps pm_smbus_ops = {
  .endianness = DEVICE_LITTLE_ENDIAN,
  };
  +static bool pm_smbus_vmstate_needed(void *opaque)
+{
+    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+
+    return !mc->smbus_no_migration_support;
+}

OK


+const VMStateDescription pmsmb_vmstate = {
+    .name = "pmsmb",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = pm_smbus_vmstate_needed,
+    .fields = (VMStateField[]) {
+    VMSTATE_UINT8(smb_stat, PMSMBus),
+    VMSTATE_UINT8(smb_ctl, PMSMBus),
+    VMSTATE_UINT8(smb_cmd, PMSMBus),
+    VMSTATE_UINT8(smb_addr, PMSMBus),
+    VMSTATE_UINT8(smb_data0, PMSMBus),
+    VMSTATE_UINT8(smb_data1, PMSMBus),
+    VMSTATE_UINT32(smb_index, PMSMBus),
+    VMSTATE_UINT8_ARRAY(smb_data, PMSMBus, PM_SMBUS_MAX_MSG_SIZE),
+    VMSTATE_UINT8(smb_auxctl, PMSMBus),
+    VMSTATE_BOOL(i2c_enable, PMSMBus),
+    VMSTATE_BOOL(op_done, PMSMBus),
+    VMSTATE_BOOL(in_i2c_block_read, PMSMBus),
+    VMSTATE_BOOL(start_transaction_on_status_read, PMSMBus),
+    VMSTATE_END_OF_LIST()
+    }
+};
+
  void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool 
force_aux_blk)

  {
  smb->op_done = true;
diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
index e6d8d28194..c9b7482a54 100644
--- a/hw/i2c/smbus_ich9.c
+++ b/hw/i2c/smbus_ich9.c
@@ -45,10 +45,12 @@ typedef struct ICH9SMBState {
    static const VMStateDescription vmstate_ich9_smbus = {
  .name = "ich9_smb",
-    .version_id = 1,
+    .version_id = 2,

Again, do we need to bump this?


  .minimum_version_id = 1,
  .fields = (VMStateField[]) {
-    VMSTATE_PCI_DEVICE(dev, struct ICH9SMBState),
+    VMSTATE_PCI_DEVICE(dev, ICH9SMBState),
+    VMSTATE_BOOL_V(irq_enabled, ICH9SMBState, 2),

Can we make this a VMSTATE_BOOL_TEST (see VMSTATE_UINT64_TEST for the
pattern) tied to the same .neede, and again we don't need to bump the
version.


+    VMSTATE_STRUCT(smb, ICH9SMBState, 2, pmsmb_vmstate, PMSMBus),

So that's taken care of by the .needed.

Dave


  VMSTATE_END_OF_LIST()
  }
  };
diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h
index 7bcca97672..5075fc64fa 100644
--- a/include/hw/i2c/pm_smbus.h
+++ b/include/hw/i2c/pm_smbus.h
@@ -43,4 +43,6 @@ typedef struct PMSMBus {
    void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool 
force_aux_blk);

  +extern const VMStateDescription pmsmb_vmstate;
+
  #endif /* PM_SMBUS_H */
--
2.17.1


--
Dr. David Alan Gilbert / 

Re: [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer

2018-11-26 Thread Corey Minyard

On 11/26/18 11:20 AM, Dr. David Alan Gilbert wrote:

* miny...@acm.org (miny...@acm.org) wrote:

From: Corey Minyard 

Transfer the state information for the SMBus registers and
internal data so it will work on a VM transfer.

Signed-off-by: Corey Minyard 
Cc: Michael S. Tsirkin 
Cc: Paolo Bonzini 
Cc: Dr. David Alan Gilbert 
---
  hw/acpi/piix4.c   |  3 ++-
  hw/i2c/pm_smbus.c | 31 +++
  hw/i2c/smbus_ich9.c   |  6 --
  include/hw/i2c/pm_smbus.h |  2 ++
  4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index e330f24c71..313305f5a0 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -309,7 +309,7 @@ static const VMStateDescription vmstate_cpuhp_state = {
   */
  static const VMStateDescription vmstate_acpi = {
  .name = "piix4_pm",
-.version_id = 3,
+.version_id = 4,

OK, so do we need to bump this version ?  Ideally you'd keep the version
as is and let the needed do the work.



Got it, that makes sense.  Same for the comments below, I'll get all those.

Thanks,

-corey



  .minimum_version_id = 3,
  .minimum_version_id_old = 1,
  .load_state_old = acpi_load_old,
@@ -320,6 +320,7 @@ static const VMStateDescription vmstate_acpi = {
  VMSTATE_UINT16(ar.pm1.evt.en, PIIX4PMState),
  VMSTATE_UINT16(ar.pm1.cnt.cnt, PIIX4PMState),
  VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
+VMSTATE_STRUCT(smb, PIIX4PMState, 4, pmsmb_vmstate, PMSMBus),
  VMSTATE_TIMER_PTR(ar.tmr.timer, PIIX4PMState),
  VMSTATE_INT64(ar.tmr.overflow_time, PIIX4PMState),
  VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE),
diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c
index 8793113c25..75907e1c22 100644
--- a/hw/i2c/pm_smbus.c
+++ b/hw/i2c/pm_smbus.c
@@ -19,6 +19,7 @@
   */
  #include "qemu/osdep.h"
  #include "hw/hw.h"
+#include "hw/boards.h"
  #include "hw/i2c/pm_smbus.h"
  #include "hw/i2c/smbus_master.h"
  
@@ -450,6 +451,36 @@ static const MemoryRegionOps pm_smbus_ops = {

  .endianness = DEVICE_LITTLE_ENDIAN,
  };
  
+static bool pm_smbus_vmstate_needed(void *opaque)

+{
+MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+
+return !mc->smbus_no_migration_support;
+}

OK


+const VMStateDescription pmsmb_vmstate = {
+.name = "pmsmb",
+.version_id = 1,
+.minimum_version_id = 1,
+.needed = pm_smbus_vmstate_needed,
+.fields = (VMStateField[]) {
+VMSTATE_UINT8(smb_stat, PMSMBus),
+VMSTATE_UINT8(smb_ctl, PMSMBus),
+VMSTATE_UINT8(smb_cmd, PMSMBus),
+VMSTATE_UINT8(smb_addr, PMSMBus),
+VMSTATE_UINT8(smb_data0, PMSMBus),
+VMSTATE_UINT8(smb_data1, PMSMBus),
+VMSTATE_UINT32(smb_index, PMSMBus),
+VMSTATE_UINT8_ARRAY(smb_data, PMSMBus, PM_SMBUS_MAX_MSG_SIZE),
+VMSTATE_UINT8(smb_auxctl, PMSMBus),
+VMSTATE_BOOL(i2c_enable, PMSMBus),
+VMSTATE_BOOL(op_done, PMSMBus),
+VMSTATE_BOOL(in_i2c_block_read, PMSMBus),
+VMSTATE_BOOL(start_transaction_on_status_read, PMSMBus),
+VMSTATE_END_OF_LIST()
+}
+};
+
  void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk)
  {
  smb->op_done = true;
diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
index e6d8d28194..c9b7482a54 100644
--- a/hw/i2c/smbus_ich9.c
+++ b/hw/i2c/smbus_ich9.c
@@ -45,10 +45,12 @@ typedef struct ICH9SMBState {
  
  static const VMStateDescription vmstate_ich9_smbus = {

  .name = "ich9_smb",
-.version_id = 1,
+.version_id = 2,

Again, do we need to bump this?


  .minimum_version_id = 1,
  .fields = (VMStateField[]) {
-VMSTATE_PCI_DEVICE(dev, struct ICH9SMBState),
+VMSTATE_PCI_DEVICE(dev, ICH9SMBState),
+VMSTATE_BOOL_V(irq_enabled, ICH9SMBState, 2),

Can we make this a VMSTATE_BOOL_TEST (see VMSTATE_UINT64_TEST for the
pattern) tied to the same .neede, and again we don't need to bump the
version.


+VMSTATE_STRUCT(smb, ICH9SMBState, 2, pmsmb_vmstate, PMSMBus),

So that's taken care of by the .needed.

Dave


  VMSTATE_END_OF_LIST()
  }
  };
diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h
index 7bcca97672..5075fc64fa 100644
--- a/include/hw/i2c/pm_smbus.h
+++ b/include/hw/i2c/pm_smbus.h
@@ -43,4 +43,6 @@ typedef struct PMSMBus {
  
  void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk);
  
+extern const VMStateDescription pmsmb_vmstate;

+
  #endif /* PM_SMBUS_H */
--
2.17.1


--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK






Re: [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer

2018-11-26 Thread Dr. David Alan Gilbert
* miny...@acm.org (miny...@acm.org) wrote:
> From: Corey Minyard 
> 
> Transfer the state information for the SMBus registers and
> internal data so it will work on a VM transfer.
> 
> Signed-off-by: Corey Minyard 
> Cc: Michael S. Tsirkin 
> Cc: Paolo Bonzini 
> Cc: Dr. David Alan Gilbert 
> ---
>  hw/acpi/piix4.c   |  3 ++-
>  hw/i2c/pm_smbus.c | 31 +++
>  hw/i2c/smbus_ich9.c   |  6 --
>  include/hw/i2c/pm_smbus.h |  2 ++
>  4 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
> index e330f24c71..313305f5a0 100644
> --- a/hw/acpi/piix4.c
> +++ b/hw/acpi/piix4.c
> @@ -309,7 +309,7 @@ static const VMStateDescription vmstate_cpuhp_state = {
>   */
>  static const VMStateDescription vmstate_acpi = {
>  .name = "piix4_pm",
> -.version_id = 3,
> +.version_id = 4,

OK, so do we need to bump this version ?  Ideally you'd keep the version
as is and let the needed do the work.

>  .minimum_version_id = 3,
>  .minimum_version_id_old = 1,
>  .load_state_old = acpi_load_old,
> @@ -320,6 +320,7 @@ static const VMStateDescription vmstate_acpi = {
>  VMSTATE_UINT16(ar.pm1.evt.en, PIIX4PMState),
>  VMSTATE_UINT16(ar.pm1.cnt.cnt, PIIX4PMState),
>  VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
> +VMSTATE_STRUCT(smb, PIIX4PMState, 4, pmsmb_vmstate, PMSMBus),
>  VMSTATE_TIMER_PTR(ar.tmr.timer, PIIX4PMState),
>  VMSTATE_INT64(ar.tmr.overflow_time, PIIX4PMState),
>  VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE),
> diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c
> index 8793113c25..75907e1c22 100644
> --- a/hw/i2c/pm_smbus.c
> +++ b/hw/i2c/pm_smbus.c
> @@ -19,6 +19,7 @@
>   */
>  #include "qemu/osdep.h"
>  #include "hw/hw.h"
> +#include "hw/boards.h"
>  #include "hw/i2c/pm_smbus.h"
>  #include "hw/i2c/smbus_master.h"
>  
> @@ -450,6 +451,36 @@ static const MemoryRegionOps pm_smbus_ops = {
>  .endianness = DEVICE_LITTLE_ENDIAN,
>  };
>  
> +static bool pm_smbus_vmstate_needed(void *opaque)
> +{
> +MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
> +
> +return !mc->smbus_no_migration_support;
> +}

OK

> +const VMStateDescription pmsmb_vmstate = {
> +.name = "pmsmb",
> +.version_id = 1,
> +.minimum_version_id = 1,
> +.needed = pm_smbus_vmstate_needed,
> +.fields = (VMStateField[]) {
> +VMSTATE_UINT8(smb_stat, PMSMBus),
> +VMSTATE_UINT8(smb_ctl, PMSMBus),
> +VMSTATE_UINT8(smb_cmd, PMSMBus),
> +VMSTATE_UINT8(smb_addr, PMSMBus),
> +VMSTATE_UINT8(smb_data0, PMSMBus),
> +VMSTATE_UINT8(smb_data1, PMSMBus),
> +VMSTATE_UINT32(smb_index, PMSMBus),
> +VMSTATE_UINT8_ARRAY(smb_data, PMSMBus, PM_SMBUS_MAX_MSG_SIZE),
> +VMSTATE_UINT8(smb_auxctl, PMSMBus),
> +VMSTATE_BOOL(i2c_enable, PMSMBus),
> +VMSTATE_BOOL(op_done, PMSMBus),
> +VMSTATE_BOOL(in_i2c_block_read, PMSMBus),
> +VMSTATE_BOOL(start_transaction_on_status_read, PMSMBus),
> +VMSTATE_END_OF_LIST()
> +}
> +};
> +
>  void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk)
>  {
>  smb->op_done = true;
> diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
> index e6d8d28194..c9b7482a54 100644
> --- a/hw/i2c/smbus_ich9.c
> +++ b/hw/i2c/smbus_ich9.c
> @@ -45,10 +45,12 @@ typedef struct ICH9SMBState {
>  
>  static const VMStateDescription vmstate_ich9_smbus = {
>  .name = "ich9_smb",
> -.version_id = 1,
> +.version_id = 2,

Again, do we need to bump this?

>  .minimum_version_id = 1,
>  .fields = (VMStateField[]) {
> -VMSTATE_PCI_DEVICE(dev, struct ICH9SMBState),
> +VMSTATE_PCI_DEVICE(dev, ICH9SMBState),
> +VMSTATE_BOOL_V(irq_enabled, ICH9SMBState, 2),

Can we make this a VMSTATE_BOOL_TEST (see VMSTATE_UINT64_TEST for the
pattern) tied to the same .neede, and again we don't need to bump the
version.

> +VMSTATE_STRUCT(smb, ICH9SMBState, 2, pmsmb_vmstate, PMSMBus),

So that's taken care of by the .needed.

Dave

>  VMSTATE_END_OF_LIST()
>  }
>  };
> diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h
> index 7bcca97672..5075fc64fa 100644
> --- a/include/hw/i2c/pm_smbus.h
> +++ b/include/hw/i2c/pm_smbus.h
> @@ -43,4 +43,6 @@ typedef struct PMSMBus {
>  
>  void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk);
>  
> +extern const VMStateDescription pmsmb_vmstate;
> +
>  #endif /* PM_SMBUS_H */
> -- 
> 2.17.1
> 
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK



[Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer

2018-11-15 Thread minyard
From: Corey Minyard 

Transfer the state information for the SMBus registers and
internal data so it will work on a VM transfer.

Signed-off-by: Corey Minyard 
Cc: Michael S. Tsirkin 
Cc: Paolo Bonzini 
Cc: Dr. David Alan Gilbert 
---
 hw/acpi/piix4.c   |  3 ++-
 hw/i2c/pm_smbus.c | 31 +++
 hw/i2c/smbus_ich9.c   |  6 --
 include/hw/i2c/pm_smbus.h |  2 ++
 4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index e330f24c71..313305f5a0 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -309,7 +309,7 @@ static const VMStateDescription vmstate_cpuhp_state = {
  */
 static const VMStateDescription vmstate_acpi = {
 .name = "piix4_pm",
-.version_id = 3,
+.version_id = 4,
 .minimum_version_id = 3,
 .minimum_version_id_old = 1,
 .load_state_old = acpi_load_old,
@@ -320,6 +320,7 @@ static const VMStateDescription vmstate_acpi = {
 VMSTATE_UINT16(ar.pm1.evt.en, PIIX4PMState),
 VMSTATE_UINT16(ar.pm1.cnt.cnt, PIIX4PMState),
 VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
+VMSTATE_STRUCT(smb, PIIX4PMState, 4, pmsmb_vmstate, PMSMBus),
 VMSTATE_TIMER_PTR(ar.tmr.timer, PIIX4PMState),
 VMSTATE_INT64(ar.tmr.overflow_time, PIIX4PMState),
 VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE),
diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c
index 8793113c25..75907e1c22 100644
--- a/hw/i2c/pm_smbus.c
+++ b/hw/i2c/pm_smbus.c
@@ -19,6 +19,7 @@
  */
 #include "qemu/osdep.h"
 #include "hw/hw.h"
+#include "hw/boards.h"
 #include "hw/i2c/pm_smbus.h"
 #include "hw/i2c/smbus_master.h"
 
@@ -450,6 +451,36 @@ static const MemoryRegionOps pm_smbus_ops = {
 .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
+static bool pm_smbus_vmstate_needed(void *opaque)
+{
+MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+
+return !mc->smbus_no_migration_support;
+}
+
+const VMStateDescription pmsmb_vmstate = {
+.name = "pmsmb",
+.version_id = 1,
+.minimum_version_id = 1,
+.needed = pm_smbus_vmstate_needed,
+.fields = (VMStateField[]) {
+VMSTATE_UINT8(smb_stat, PMSMBus),
+VMSTATE_UINT8(smb_ctl, PMSMBus),
+VMSTATE_UINT8(smb_cmd, PMSMBus),
+VMSTATE_UINT8(smb_addr, PMSMBus),
+VMSTATE_UINT8(smb_data0, PMSMBus),
+VMSTATE_UINT8(smb_data1, PMSMBus),
+VMSTATE_UINT32(smb_index, PMSMBus),
+VMSTATE_UINT8_ARRAY(smb_data, PMSMBus, PM_SMBUS_MAX_MSG_SIZE),
+VMSTATE_UINT8(smb_auxctl, PMSMBus),
+VMSTATE_BOOL(i2c_enable, PMSMBus),
+VMSTATE_BOOL(op_done, PMSMBus),
+VMSTATE_BOOL(in_i2c_block_read, PMSMBus),
+VMSTATE_BOOL(start_transaction_on_status_read, PMSMBus),
+VMSTATE_END_OF_LIST()
+}
+};
+
 void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk)
 {
 smb->op_done = true;
diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
index e6d8d28194..c9b7482a54 100644
--- a/hw/i2c/smbus_ich9.c
+++ b/hw/i2c/smbus_ich9.c
@@ -45,10 +45,12 @@ typedef struct ICH9SMBState {
 
 static const VMStateDescription vmstate_ich9_smbus = {
 .name = "ich9_smb",
-.version_id = 1,
+.version_id = 2,
 .minimum_version_id = 1,
 .fields = (VMStateField[]) {
-VMSTATE_PCI_DEVICE(dev, struct ICH9SMBState),
+VMSTATE_PCI_DEVICE(dev, ICH9SMBState),
+VMSTATE_BOOL_V(irq_enabled, ICH9SMBState, 2),
+VMSTATE_STRUCT(smb, ICH9SMBState, 2, pmsmb_vmstate, PMSMBus),
 VMSTATE_END_OF_LIST()
 }
 };
diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h
index 7bcca97672..5075fc64fa 100644
--- a/include/hw/i2c/pm_smbus.h
+++ b/include/hw/i2c/pm_smbus.h
@@ -43,4 +43,6 @@ typedef struct PMSMBus {
 
 void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk);
 
+extern const VMStateDescription pmsmb_vmstate;
+
 #endif /* PM_SMBUS_H */
-- 
2.17.1