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