1b8d38bd5SDamien Hedde /* 2b8d38bd5SDamien Hedde * Clock migration structure 3b8d38bd5SDamien Hedde * 4b8d38bd5SDamien Hedde * Copyright GreenSocs 2019-2020 5b8d38bd5SDamien Hedde * 6b8d38bd5SDamien Hedde * Authors: 7b8d38bd5SDamien Hedde * Damien Hedde 8b8d38bd5SDamien Hedde * 9b8d38bd5SDamien Hedde * This work is licensed under the terms of the GNU GPL, version 2 or later. 10b8d38bd5SDamien Hedde * See the COPYING file in the top-level directory. 11b8d38bd5SDamien Hedde */ 12b8d38bd5SDamien Hedde 13b8d38bd5SDamien Hedde #include "qemu/osdep.h" 14b8d38bd5SDamien Hedde #include "migration/vmstate.h" 15b8d38bd5SDamien Hedde #include "hw/clock.h" 16b8d38bd5SDamien Hedde 17*99abcbc7SPeter Maydell static bool muldiv_needed(void *opaque) 18*99abcbc7SPeter Maydell { 19*99abcbc7SPeter Maydell Clock *clk = opaque; 20*99abcbc7SPeter Maydell 21*99abcbc7SPeter Maydell return clk->multiplier != 1 || clk->divider != 1; 22*99abcbc7SPeter Maydell } 23*99abcbc7SPeter Maydell 24*99abcbc7SPeter Maydell static int clock_pre_load(void *opaque) 25*99abcbc7SPeter Maydell { 26*99abcbc7SPeter Maydell Clock *clk = opaque; 27*99abcbc7SPeter Maydell /* 28*99abcbc7SPeter Maydell * The initial out-of-reset settings of the Clock might have been 29*99abcbc7SPeter Maydell * configured by the device to be different from what we set 30*99abcbc7SPeter Maydell * in clock_initfn(), so we must here set the default values to 31*99abcbc7SPeter Maydell * be used if they are not in the inbound migration state. 32*99abcbc7SPeter Maydell */ 33*99abcbc7SPeter Maydell clk->multiplier = 1; 34*99abcbc7SPeter Maydell clk->divider = 1; 35*99abcbc7SPeter Maydell 36*99abcbc7SPeter Maydell return 0; 37*99abcbc7SPeter Maydell } 38*99abcbc7SPeter Maydell 39*99abcbc7SPeter Maydell const VMStateDescription vmstate_muldiv = { 40*99abcbc7SPeter Maydell .name = "clock/muldiv", 41*99abcbc7SPeter Maydell .version_id = 1, 42*99abcbc7SPeter Maydell .minimum_version_id = 1, 43*99abcbc7SPeter Maydell .needed = muldiv_needed, 44*99abcbc7SPeter Maydell .fields = (VMStateField[]) { 45*99abcbc7SPeter Maydell VMSTATE_UINT32(multiplier, Clock), 46*99abcbc7SPeter Maydell VMSTATE_UINT32(divider, Clock), 47*99abcbc7SPeter Maydell }, 48*99abcbc7SPeter Maydell }; 49*99abcbc7SPeter Maydell 50b8d38bd5SDamien Hedde const VMStateDescription vmstate_clock = { 51b8d38bd5SDamien Hedde .name = "clock", 52b8d38bd5SDamien Hedde .version_id = 0, 53b8d38bd5SDamien Hedde .minimum_version_id = 0, 54*99abcbc7SPeter Maydell .pre_load = clock_pre_load, 55b8d38bd5SDamien Hedde .fields = (VMStateField[]) { 56b8d38bd5SDamien Hedde VMSTATE_UINT64(period, Clock), 57b8d38bd5SDamien Hedde VMSTATE_END_OF_LIST() 58*99abcbc7SPeter Maydell }, 59*99abcbc7SPeter Maydell .subsections = (const VMStateDescription*[]) { 60*99abcbc7SPeter Maydell &vmstate_muldiv, 61*99abcbc7SPeter Maydell NULL 62*99abcbc7SPeter Maydell }, 63b8d38bd5SDamien Hedde }; 64