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