xref: /qemu/hw/uefi/var-service-sysbus.c (revision 5bb89df2e37382d6d278d52cfb22ae61f60daf70)
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