15bb89df2SGerd Hoffmann /*
25bb89df2SGerd Hoffmann * SPDX-License-Identifier: GPL-2.0-or-later
35bb89df2SGerd Hoffmann *
45bb89df2SGerd Hoffmann * uefi vars device - sysbus variant.
55bb89df2SGerd Hoffmann */
65bb89df2SGerd Hoffmann #include "qemu/osdep.h"
75bb89df2SGerd Hoffmann #include "migration/vmstate.h"
85bb89df2SGerd Hoffmann
95bb89df2SGerd Hoffmann #include "hw/qdev-properties.h"
105bb89df2SGerd Hoffmann #include "hw/sysbus.h"
115bb89df2SGerd Hoffmann
1269392de9SGerd Hoffmann #include "hw/uefi/hardware-info.h"
135bb89df2SGerd Hoffmann #include "hw/uefi/var-service.h"
145bb89df2SGerd Hoffmann #include "hw/uefi/var-service-api.h"
155bb89df2SGerd Hoffmann
165bb89df2SGerd Hoffmann OBJECT_DECLARE_SIMPLE_TYPE(uefi_vars_sysbus_state, UEFI_VARS_SYSBUS)
175bb89df2SGerd Hoffmann
185bb89df2SGerd Hoffmann struct uefi_vars_sysbus_state {
195bb89df2SGerd Hoffmann SysBusDevice parent_obj;
205bb89df2SGerd Hoffmann struct uefi_vars_state state;
215bb89df2SGerd Hoffmann };
225bb89df2SGerd Hoffmann
235bb89df2SGerd Hoffmann static const VMStateDescription vmstate_uefi_vars_sysbus = {
245bb89df2SGerd Hoffmann .name = TYPE_UEFI_VARS_SYSBUS,
255bb89df2SGerd Hoffmann .fields = (VMStateField[]) {
265bb89df2SGerd Hoffmann VMSTATE_STRUCT(state, uefi_vars_sysbus_state, 0,
275bb89df2SGerd Hoffmann vmstate_uefi_vars, uefi_vars_state),
285bb89df2SGerd Hoffmann VMSTATE_END_OF_LIST()
295bb89df2SGerd Hoffmann }
305bb89df2SGerd Hoffmann };
315bb89df2SGerd Hoffmann
325bb89df2SGerd Hoffmann static const Property uefi_vars_sysbus_properties[] = {
335bb89df2SGerd Hoffmann DEFINE_PROP_SIZE("size", uefi_vars_sysbus_state, state.max_storage,
345bb89df2SGerd Hoffmann 256 * 1024),
355bb89df2SGerd Hoffmann DEFINE_PROP_STRING("jsonfile", uefi_vars_sysbus_state, state.jsonfile),
365bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("force-secure-boot", uefi_vars_sysbus_state,
375bb89df2SGerd Hoffmann state.force_secure_boot, false),
385bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("disable-custom-mode", uefi_vars_sysbus_state,
395bb89df2SGerd Hoffmann state.disable_custom_mode, false),
405bb89df2SGerd Hoffmann DEFINE_PROP_BOOL("use-pio", uefi_vars_sysbus_state,
415bb89df2SGerd Hoffmann state.use_pio, false),
425bb89df2SGerd Hoffmann };
435bb89df2SGerd Hoffmann
uefi_vars_sysbus_init(Object * obj)445bb89df2SGerd Hoffmann static void uefi_vars_sysbus_init(Object *obj)
455bb89df2SGerd Hoffmann {
465bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(obj);
475bb89df2SGerd Hoffmann
485bb89df2SGerd Hoffmann uefi_vars_init(obj, &uv->state);
495bb89df2SGerd Hoffmann }
505bb89df2SGerd Hoffmann
uefi_vars_sysbus_reset(DeviceState * dev)515bb89df2SGerd Hoffmann static void uefi_vars_sysbus_reset(DeviceState *dev)
525bb89df2SGerd Hoffmann {
535bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
545bb89df2SGerd Hoffmann
555bb89df2SGerd Hoffmann uefi_vars_hard_reset(&uv->state);
565bb89df2SGerd Hoffmann }
575bb89df2SGerd Hoffmann
uefi_vars_sysbus_realize(DeviceState * dev,Error ** errp)585bb89df2SGerd Hoffmann static void uefi_vars_sysbus_realize(DeviceState *dev, Error **errp)
595bb89df2SGerd Hoffmann {
605bb89df2SGerd Hoffmann uefi_vars_sysbus_state *uv = UEFI_VARS_SYSBUS(dev);
615bb89df2SGerd Hoffmann SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
625bb89df2SGerd Hoffmann
635bb89df2SGerd Hoffmann sysbus_init_mmio(sysbus, &uv->state.mr);
645bb89df2SGerd Hoffmann uefi_vars_realize(&uv->state, errp);
655bb89df2SGerd Hoffmann }
665bb89df2SGerd Hoffmann
uefi_vars_sysbus_class_init(ObjectClass * klass,const void * data)67*12d1a768SPhilippe Mathieu-Daudé static void uefi_vars_sysbus_class_init(ObjectClass *klass, const void *data)
685bb89df2SGerd Hoffmann {
695bb89df2SGerd Hoffmann DeviceClass *dc = DEVICE_CLASS(klass);
705bb89df2SGerd Hoffmann
715bb89df2SGerd Hoffmann dc->realize = uefi_vars_sysbus_realize;
725bb89df2SGerd Hoffmann dc->vmsd = &vmstate_uefi_vars_sysbus;
7303223b66SGerd Hoffmann dc->user_creatable = true;
745bb89df2SGerd Hoffmann device_class_set_legacy_reset(dc, uefi_vars_sysbus_reset);
755bb89df2SGerd Hoffmann device_class_set_props(dc, uefi_vars_sysbus_properties);
765bb89df2SGerd Hoffmann set_bit(DEVICE_CATEGORY_MISC, dc->categories);
775bb89df2SGerd Hoffmann }
785bb89df2SGerd Hoffmann
7969392de9SGerd Hoffmann /* generic: hardware discovery via FDT */
805bb89df2SGerd Hoffmann static const TypeInfo uefi_vars_sysbus_info = {
815bb89df2SGerd Hoffmann .name = TYPE_UEFI_VARS_SYSBUS,
825bb89df2SGerd Hoffmann .parent = TYPE_SYS_BUS_DEVICE,
835bb89df2SGerd Hoffmann .instance_size = sizeof(uefi_vars_sysbus_state),
845bb89df2SGerd Hoffmann .instance_init = uefi_vars_sysbus_init,
855bb89df2SGerd Hoffmann .class_init = uefi_vars_sysbus_class_init,
865bb89df2SGerd Hoffmann };
875bb89df2SGerd Hoffmann module_obj(TYPE_UEFI_VARS_SYSBUS);
885bb89df2SGerd Hoffmann
uefi_vars_x64_realize(DeviceState * dev,Error ** errp)8969392de9SGerd Hoffmann static void uefi_vars_x64_realize(DeviceState *dev, Error **errp)
9069392de9SGerd Hoffmann {
9169392de9SGerd Hoffmann HARDWARE_INFO_SIMPLE_DEVICE hwinfo = {
9269392de9SGerd Hoffmann .mmio_address = cpu_to_le64(0xfef10000),
9369392de9SGerd Hoffmann };
9469392de9SGerd Hoffmann SysBusDevice *sysbus = SYS_BUS_DEVICE(dev);
9569392de9SGerd Hoffmann
9669392de9SGerd Hoffmann uefi_vars_sysbus_realize(dev, errp);
9769392de9SGerd Hoffmann
9869392de9SGerd Hoffmann hardware_info_register(HardwareInfoQemuUefiVars,
9969392de9SGerd Hoffmann &hwinfo, sizeof(hwinfo));
10069392de9SGerd Hoffmann sysbus_mmio_map(sysbus, 0, hwinfo.mmio_address);
10169392de9SGerd Hoffmann }
10269392de9SGerd Hoffmann
uefi_vars_x64_class_init(ObjectClass * klass,const void * data)103*12d1a768SPhilippe Mathieu-Daudé static void uefi_vars_x64_class_init(ObjectClass *klass, const void *data)
10469392de9SGerd Hoffmann {
10569392de9SGerd Hoffmann DeviceClass *dc = DEVICE_CLASS(klass);
10669392de9SGerd Hoffmann
10769392de9SGerd Hoffmann dc->realize = uefi_vars_x64_realize;
10869392de9SGerd Hoffmann }
10969392de9SGerd Hoffmann
11069392de9SGerd Hoffmann /* x64: hardware discovery via etc/hardware-info fw_cfg */
11169392de9SGerd Hoffmann static const TypeInfo uefi_vars_x64_info = {
11269392de9SGerd Hoffmann .name = TYPE_UEFI_VARS_X64,
11369392de9SGerd Hoffmann .parent = TYPE_UEFI_VARS_SYSBUS,
11469392de9SGerd Hoffmann .class_init = uefi_vars_x64_class_init,
11569392de9SGerd Hoffmann };
11669392de9SGerd Hoffmann module_obj(TYPE_UEFI_VARS_X64);
11769392de9SGerd Hoffmann
uefi_vars_sysbus_register_types(void)1185bb89df2SGerd Hoffmann static void uefi_vars_sysbus_register_types(void)
1195bb89df2SGerd Hoffmann {
1205bb89df2SGerd Hoffmann type_register_static(&uefi_vars_sysbus_info);
12169392de9SGerd Hoffmann type_register_static(&uefi_vars_x64_info);
1225bb89df2SGerd Hoffmann }
1235bb89df2SGerd Hoffmann
1245bb89df2SGerd Hoffmann type_init(uefi_vars_sysbus_register_types)
125