qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Corey Minyard
Subject: Re: [Qemu-devel] [PATCH v2 07/12] i2c:pm_smbus: Fix state transfer
Date: Mon, 26 Nov 2018 13:41:23 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1

On 11/26/18 12:24 PM, Corey Minyard wrote:
On 11/26/18 11:20 AM, Dr. David Alan Gilbert wrote:
* address@hidden (address@hidden) wrote:
From: Corey Minyard <address@hidden>

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

Signed-off-by: Corey Minyard <address@hidden>
Cc: Michael S. Tsirkin <address@hidden>
Cc: Paolo Bonzini <address@hidden>
Cc: Dr. David Alan Gilbert <address@hidden>
---
  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 / address@hidden / Manchester, UK






reply via email to

[Prev in Thread] Current Thread [Next in Thread]