/*
 * QEMU simulated pvpanic device (MMIO frontend)
 *
 * Copyright © 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "qemu/osdep.h"

#include "hw/qdev-properties.h"
#include "hw/misc/pvpanic.h"
#include "hw/sysbus.h"
#include "standard-headers/misc/pvpanic.h"

OBJECT_DECLARE_SIMPLE_TYPE(PVPanicMMIOState, PVPANIC_MMIO_DEVICE)

#define PVPANIC_MMIO_SIZE 0x2

struct PVPanicMMIOState {
    SysBusDevice parent_obj;

    PVPanicState pvpanic;
};

static void pvpanic_mmio_initfn(Object *obj)
{
    PVPanicMMIOState *s = PVPANIC_MMIO_DEVICE(obj);

    pvpanic_setup_io(&s->pvpanic, DEVICE(s), PVPANIC_MMIO_SIZE);
    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->pvpanic.mr);
}

static const Property pvpanic_mmio_properties[] = {
    DEFINE_PROP_UINT8("events", PVPanicMMIOState, pvpanic.events,
                      PVPANIC_PANICKED | PVPANIC_CRASH_LOADED),
};

static void pvpanic_mmio_class_init(ObjectClass *klass, const void *data)
{
    DeviceClass *dc = DEVICE_CLASS(klass);

    device_class_set_props(dc, pvpanic_mmio_properties);
    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}

static const TypeInfo pvpanic_mmio_info = {
    .name          = TYPE_PVPANIC_MMIO_DEVICE,
    .parent        = TYPE_SYS_BUS_DEVICE,
    .instance_size = sizeof(PVPanicMMIOState),
    .instance_init = pvpanic_mmio_initfn,
    .class_init    = pvpanic_mmio_class_init,
};

static void pvpanic_register_types(void)
{
    type_register_static(&pvpanic_mmio_info);
}

type_init(pvpanic_register_types)
