xref: /qemu/hw/uefi/var-service-sysbus.c (revision 06b40d250ecfa1633209c2e431a7a38acfd03a98)
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/hardware-info.h"
13 #include "hw/uefi/var-service.h"
14 #include "hw/uefi/var-service-api.h"
15 
16 OBJECT_DECLARE_SIMPLE_TYPE(uefi_vars_sysbus_state, UEFI_VARS_SYSBUS)
17 
18 struct uefi_vars_sysbus_state {
19     SysBusDevice parent_obj;
20     struct uefi_vars_state state;
21 };
22 
23 static const VMStateDescription vmstate_uefi_vars_sysbus = {
24     .name = TYPE_UEFI_VARS_SYSBUS,
25     .fields = (VMStateField[]) {
26         VMSTATE_STRUCT(state, uefi_vars_sysbus_state, 0,
27                        vmstate_uefi_vars, uefi_vars_state),
28         VMSTATE_END_OF_LIST()
29     }
30 };
31 
32 static const Property uefi_vars_sysbus_properties[] = {
33     DEFINE_PROP_SIZE("size", uefi_vars_sysbus_state, state.max_storage,
34                      256 * 1024),
35     DEFINE_PROP_STRING("jsonfile", uefi_vars_sysbus_state, state.jsonfile),
36     DEFINE_PROP_BOOL("force-secure-boot", uefi_vars_sysbus_state,
37                      state.force_secure_boot, false),
38     DEFINE_PROP_BOOL("disable-custom-mode", uefi_vars_sysbus_state,
39                      state.disable_custom_mode, false),
40     DEFINE_PROP_BOOL("use-pio", uefi_vars_sysbus_state,
41                      state.use_pio, false),
42 };
43 
uefi_vars_sysbus_init(Object * obj)44 static void uefi_vars_sysbus_init(Object *obj)
45 {
46     uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(obj);
47 
48     uefi_vars_init(obj, &uv->state);
49 }
50 
uefi_vars_sysbus_reset(DeviceState * dev)51 static void uefi_vars_sysbus_reset(DeviceState *dev)
52 {
53     uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
54 
55     uefi_vars_hard_reset(&uv->state);
56 }
57 
uefi_vars_sysbus_realize(DeviceState * dev,Error ** errp)58 static void uefi_vars_sysbus_realize(DeviceState *dev, Error **errp)
59 {
60     uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
61     SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
62 
63     sysbus_init_mmio(sysbus, &uv->state.mr);
64     uefi_vars_realize(&uv->state, errp);
65 }
66 
uefi_vars_sysbus_class_init(ObjectClass * klass,const void * data)67 static void uefi_vars_sysbus_class_init(ObjectClass *klass, const void *data)
68 {
69     DeviceClass *dc = DEVICE_CLASS(klass);
70 
71     dc->realize = uefi_vars_sysbus_realize;
72     dc->vmsd = &vmstate_uefi_vars_sysbus;
73     dc->user_creatable = true;
74     device_class_set_legacy_reset(dc, uefi_vars_sysbus_reset);
75     device_class_set_props(dc, uefi_vars_sysbus_properties);
76     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
77 }
78 
79 /* generic: hardware discovery via FDT */
80 static const TypeInfo uefi_vars_sysbus_info = {
81     .name          = TYPE_UEFI_VARS_SYSBUS,
82     .parent        = TYPE_SYS_BUS_DEVICE,
83     .instance_size = sizeof(uefi_vars_sysbus_state),
84     .instance_init = uefi_vars_sysbus_init,
85     .class_init    = uefi_vars_sysbus_class_init,
86 };
87 module_obj(TYPE_UEFI_VARS_SYSBUS);
88 
uefi_vars_x64_realize(DeviceState * dev,Error ** errp)89 static void uefi_vars_x64_realize(DeviceState *dev, Error **errp)
90 {
91     HARDWARE_INFO_SIMPLE_DEVICE hwinfo = {
92         .mmio_address = cpu_to_le64(0xfef10000),
93     };
94     SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
95 
96     uefi_vars_sysbus_realize(dev, errp);
97 
98     hardware_info_register(HardwareInfoQemuUefiVars,
99                            &hwinfo, sizeof(hwinfo));
100     sysbus_mmio_map(sysbus, 0, hwinfo.mmio_address);
101 }
102 
uefi_vars_x64_class_init(ObjectClass * klass,const void * data)103 static void uefi_vars_x64_class_init(ObjectClass *klass, const void *data)
104 {
105     DeviceClass *dc = DEVICE_CLASS(klass);
106 
107     dc->realize = uefi_vars_x64_realize;
108 }
109 
110 /* x64: hardware discovery via etc/hardware-info fw_cfg */
111 static const TypeInfo uefi_vars_x64_info = {
112     .name          = TYPE_UEFI_VARS_X64,
113     .parent        = TYPE_UEFI_VARS_SYSBUS,
114     .class_init    = uefi_vars_x64_class_init,
115 };
116 module_obj(TYPE_UEFI_VARS_X64);
117 
uefi_vars_sysbus_register_types(void)118 static void uefi_vars_sysbus_register_types(void)
119 {
120     type_register_static(&uefi_vars_sysbus_info);
121     type_register_static(&uefi_vars_x64_info);
122 }
123 
124 type_init(uefi_vars_sysbus_register_types)
125