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 12*69392de9SGerd 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 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 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 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 675bb89df2SGerd Hoffmann static void uefi_vars_sysbus_class_init(ObjectClass *klass, 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 79*69392de9SGerd 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 89*69392de9SGerd Hoffmann static void uefi_vars_x64_realize(DeviceState *dev, Error **errp) 90*69392de9SGerd Hoffmann { 91*69392de9SGerd Hoffmann HARDWARE_INFO_SIMPLE_DEVICE hwinfo = { 92*69392de9SGerd Hoffmann .mmio_address = cpu_to_le64(0xfef10000), 93*69392de9SGerd Hoffmann }; 94*69392de9SGerd Hoffmann SysBusDevice *sysbus = SYS_BUS_DEVICE(dev); 95*69392de9SGerd Hoffmann 96*69392de9SGerd Hoffmann uefi_vars_sysbus_realize(dev, errp); 97*69392de9SGerd Hoffmann 98*69392de9SGerd Hoffmann hardware_info_register(HardwareInfoQemuUefiVars, 99*69392de9SGerd Hoffmann &hwinfo, sizeof(hwinfo)); 100*69392de9SGerd Hoffmann sysbus_mmio_map(sysbus, 0, hwinfo.mmio_address); 101*69392de9SGerd Hoffmann } 102*69392de9SGerd Hoffmann 103*69392de9SGerd Hoffmann static void uefi_vars_x64_class_init(ObjectClass *klass, void *data) 104*69392de9SGerd Hoffmann { 105*69392de9SGerd Hoffmann DeviceClass *dc = DEVICE_CLASS(klass); 106*69392de9SGerd Hoffmann 107*69392de9SGerd Hoffmann dc->realize = uefi_vars_x64_realize; 108*69392de9SGerd Hoffmann } 109*69392de9SGerd Hoffmann 110*69392de9SGerd Hoffmann /* x64: hardware discovery via etc/hardware-info fw_cfg */ 111*69392de9SGerd Hoffmann static const TypeInfo uefi_vars_x64_info = { 112*69392de9SGerd Hoffmann .name = TYPE_UEFI_VARS_X64, 113*69392de9SGerd Hoffmann .parent = TYPE_UEFI_VARS_SYSBUS, 114*69392de9SGerd Hoffmann .class_init = uefi_vars_x64_class_init, 115*69392de9SGerd Hoffmann }; 116*69392de9SGerd Hoffmann module_obj(TYPE_UEFI_VARS_X64); 117*69392de9SGerd Hoffmann 1185bb89df2SGerd Hoffmann static void uefi_vars_sysbus_register_types(void) 1195bb89df2SGerd Hoffmann { 1205bb89df2SGerd Hoffmann type_register_static(&uefi_vars_sysbus_info); 121*69392de9SGerd Hoffmann type_register_static(&uefi_vars_x64_info); 1225bb89df2SGerd Hoffmann } 1235bb89df2SGerd Hoffmann 1245bb89df2SGerd Hoffmann type_init(uefi_vars_sysbus_register_types) 125