1*5bb89df2SGerd Hoffmann /* 2*5bb89df2SGerd Hoffmann * SPDX-License-Identifier: GPL-2.0-or-later 3*5bb89df2SGerd Hoffmann * 4*5bb89df2SGerd Hoffmann * uefi vars device - sysbus variant. 5*5bb89df2SGerd Hoffmann */ 6*5bb89df2SGerd Hoffmann #include "qemu/osdep.h" 7*5bb89df2SGerd Hoffmann #include "migration/vmstate.h" 8*5bb89df2SGerd Hoffmann 9*5bb89df2SGerd Hoffmann #include "hw/qdev-properties.h" 10*5bb89df2SGerd Hoffmann #include "hw/sysbus.h" 11*5bb89df2SGerd Hoffmann 12*5bb89df2SGerd Hoffmann #include "hw/uefi/var-service.h" 13*5bb89df2SGerd Hoffmann #include "hw/uefi/var-service-api.h" 14*5bb89df2SGerd Hoffmann 15*5bb89df2SGerd Hoffmann OBJECT_DECLARE_SIMPLE_TYPE(uefi_vars_sysbus_state, UEFI_VARS_SYSBUS) 16*5bb89df2SGerd Hoffmann 17*5bb89df2SGerd Hoffmann struct uefi_vars_sysbus_state { 18*5bb89df2SGerd Hoffmann SysBusDevice parent_obj; 19*5bb89df2SGerd Hoffmann struct uefi_vars_state state; 20*5bb89df2SGerd Hoffmann }; 21*5bb89df2SGerd Hoffmann 22*5bb89df2SGerd Hoffmann static const VMStateDescription vmstate_uefi_vars_sysbus = { 23*5bb89df2SGerd Hoffmann .name = TYPE_UEFI_VARS_SYSBUS, 24*5bb89df2SGerd Hoffmann .fields = (VMStateField[]) { 25*5bb89df2SGerd Hoffmann VMSTATE_STRUCT(state, uefi_vars_sysbus_state, 0, 26*5bb89df2SGerd Hoffmann vmstate_uefi_vars, uefi_vars_state), 27*5bb89df2SGerd Hoffmann VMSTATE_END_OF_LIST() 28*5bb89df2SGerd Hoffmann } 29*5bb89df2SGerd Hoffmann }; 30*5bb89df2SGerd Hoffmann 31*5bb89df2SGerd Hoffmann static const Property uefi_vars_sysbus_properties[] = { 32*5bb89df2SGerd Hoffmann DEFINE_PROP_SIZE("size", uefi_vars_sysbus_state, state.max_storage, 33*5bb89df2SGerd Hoffmann 256 * 1024), 34*5bb89df2SGerd Hoffmann DEFINE_PROP_STRING("jsonfile", uefi_vars_sysbus_state, state.jsonfile), 35*5bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("force-secure-boot", uefi_vars_sysbus_state, 36*5bb89df2SGerd Hoffmann state.force_secure_boot, false), 37*5bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("disable-custom-mode", uefi_vars_sysbus_state, 38*5bb89df2SGerd Hoffmann state.disable_custom_mode, false), 39*5bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("use-pio", uefi_vars_sysbus_state, 40*5bb89df2SGerd Hoffmann state.use_pio, false), 41*5bb89df2SGerd Hoffmann }; 42*5bb89df2SGerd Hoffmann 43*5bb89df2SGerd Hoffmann static void uefi_vars_sysbus_init(Object *obj) 44*5bb89df2SGerd Hoffmann { 45*5bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(obj); 46*5bb89df2SGerd Hoffmann 47*5bb89df2SGerd Hoffmann uefi_vars_init(obj, &uv->state); 48*5bb89df2SGerd Hoffmann } 49*5bb89df2SGerd Hoffmann 50*5bb89df2SGerd Hoffmann static void uefi_vars_sysbus_reset(DeviceState *dev) 51*5bb89df2SGerd Hoffmann { 52*5bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev); 53*5bb89df2SGerd Hoffmann 54*5bb89df2SGerd Hoffmann uefi_vars_hard_reset(&uv->state); 55*5bb89df2SGerd Hoffmann } 56*5bb89df2SGerd Hoffmann 57*5bb89df2SGerd Hoffmann static void uefi_vars_sysbus_realize(DeviceState *dev, Error **errp) 58*5bb89df2SGerd Hoffmann { 59*5bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev); 60*5bb89df2SGerd Hoffmann SysBusDevice *sysbus = SYS_BUS_DEVICE(dev); 61*5bb89df2SGerd Hoffmann 62*5bb89df2SGerd Hoffmann sysbus_init_mmio(sysbus, &uv->state.mr); 63*5bb89df2SGerd Hoffmann uefi_vars_realize(&uv->state, errp); 64*5bb89df2SGerd Hoffmann } 65*5bb89df2SGerd Hoffmann 66*5bb89df2SGerd Hoffmann static void uefi_vars_sysbus_class_init(ObjectClass *klass, void *data) 67*5bb89df2SGerd Hoffmann { 68*5bb89df2SGerd Hoffmann DeviceClass *dc = DEVICE_CLASS(klass); 69*5bb89df2SGerd Hoffmann 70*5bb89df2SGerd Hoffmann dc->realize = uefi_vars_sysbus_realize; 71*5bb89df2SGerd Hoffmann dc->vmsd = &vmstate_uefi_vars_sysbus; 72*5bb89df2SGerd Hoffmann device_class_set_legacy_reset(dc, uefi_vars_sysbus_reset); 73*5bb89df2SGerd Hoffmann device_class_set_props(dc, uefi_vars_sysbus_properties); 74*5bb89df2SGerd Hoffmann set_bit(DEVICE_CATEGORY_MISC, dc->categories); 75*5bb89df2SGerd Hoffmann } 76*5bb89df2SGerd Hoffmann 77*5bb89df2SGerd Hoffmann static const TypeInfo uefi_vars_sysbus_info = { 78*5bb89df2SGerd Hoffmann .name = TYPE_UEFI_VARS_SYSBUS, 79*5bb89df2SGerd Hoffmann .parent = TYPE_SYS_BUS_DEVICE, 80*5bb89df2SGerd Hoffmann .instance_size = sizeof(uefi_vars_sysbus_state), 81*5bb89df2SGerd Hoffmann .instance_init = uefi_vars_sysbus_init, 82*5bb89df2SGerd Hoffmann .class_init = uefi_vars_sysbus_class_init, 83*5bb89df2SGerd Hoffmann }; 84*5bb89df2SGerd Hoffmann module_obj(TYPE_UEFI_VARS_SYSBUS); 85*5bb89df2SGerd Hoffmann 86*5bb89df2SGerd Hoffmann static void uefi_vars_sysbus_register_types(void) 87*5bb89df2SGerd Hoffmann { 88*5bb89df2SGerd Hoffmann type_register_static(&uefi_vars_sysbus_info); 89*5bb89df2SGerd Hoffmann } 90*5bb89df2SGerd Hoffmann 91*5bb89df2SGerd Hoffmann type_init(uefi_vars_sysbus_register_types) 92