12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * Clock migration structure
- *
- * Copyright GreenSocs 2019-2020
- *
- * Authors:
- * Damien Hedde
- *
- * 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 "qemu/osdep.h"
- #include "migration/vmstate.h"
- #include "hw/clock.h"
- static bool muldiv_needed(void *opaque)
- {
- Clock *clk = opaque;
- return clk->multiplier != 1 || clk->divider != 1;
- }
- static int clock_pre_load(void *opaque)
- {
- Clock *clk = opaque;
- /*
- * The initial out-of-reset settings of the Clock might have been
- * configured by the device to be different from what we set
- * in clock_initfn(), so we must here set the default values to
- * be used if they are not in the inbound migration state.
- */
- clk->multiplier = 1;
- clk->divider = 1;
- return 0;
- }
- const VMStateDescription vmstate_muldiv = {
- .name = "clock/muldiv",
- .version_id = 1,
- .minimum_version_id = 1,
- .needed = muldiv_needed,
- .fields = (const VMStateField[]) {
- VMSTATE_UINT32(multiplier, Clock),
- VMSTATE_UINT32(divider, Clock),
- VMSTATE_END_OF_LIST()
- },
- };
- const VMStateDescription vmstate_clock = {
- .name = "clock",
- .version_id = 0,
- .minimum_version_id = 0,
- .pre_load = clock_pre_load,
- .fields = (const VMStateField[]) {
- VMSTATE_UINT64(period, Clock),
- VMSTATE_END_OF_LIST()
- },
- .subsections = (const VMStateDescription * const []) {
- &vmstate_muldiv,
- NULL
- },
- };
|