#ifndef HW_PC_H
#define HW_PC_H

#include "qemu-common.h"
#include "qemu/typedefs.h"
#include "exec/memory.h"
#include "hw/boards.h"
#include "hw/isa/isa.h"
#include "hw/block/fdc.h"
#include "net/net.h"
#include "hw/i386/ioapic.h"

#include "qemu/range.h"
#include "qemu/bitmap.h"
#include "sysemu/sysemu.h"
#include "hw/pci/pci.h"
#include "hw/boards.h"
#include "hw/compat.h"
#include "hw/mem/pc-dimm.h"

#define HPET_INTCAP "hpet-intcap"

/**
 * PCMachineState:
 * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
 * @enforce_aligned_dimm: check that DIMM's address/size is aligned by
 *                        backend's alignment value if provided
 */
struct PCMachineState {
    /*< private >*/
    MachineState parent_obj;

    /* <public> */
    MemoryHotplugState hotplug_memory;

    HotplugHandler *acpi_dev;
    ISADevice *rtc;

    uint64_t max_ram_below_4g;
    OnOffAuto vmport;
    OnOffAuto smm;
    bool enforce_aligned_dimm;
    ram_addr_t below_4g_mem_size, above_4g_mem_size;
};

#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
#define PC_MACHINE_MEMHP_REGION_SIZE "hotplug-memory-region-size"
#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
#define PC_MACHINE_VMPORT           "vmport"
#define PC_MACHINE_SMM              "smm"
#define PC_MACHINE_ENFORCE_ALIGNED_DIMM "enforce-aligned-dimm"

/**
 * PCMachineClass:
 * @get_hotplug_handler: pointer to parent class callback @get_hotplug_handler
 */
struct PCMachineClass {
    /*< private >*/
    MachineClass parent_class;

    /*< public >*/
    bool broken_reserved_end;
    bool inter_dimm_gap;
    HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                           DeviceState *dev);
};

#define TYPE_PC_MACHINE "generic-pc-machine"
#define PC_MACHINE(obj) \
    OBJECT_CHECK(PCMachineState, (obj), TYPE_PC_MACHINE)
#define PC_MACHINE_GET_CLASS(obj) \
    OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE)
#define PC_MACHINE_CLASS(klass) \
    OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE)

/* PC-style peripherals (also used by other machines).  */

typedef struct PcPciInfo {
    Range w32;
    Range w64;
} PcPciInfo;

#define ACPI_PM_PROP_S3_DISABLED "disable_s3"
#define ACPI_PM_PROP_S4_DISABLED "disable_s4"
#define ACPI_PM_PROP_S4_VAL "s4_val"
#define ACPI_PM_PROP_SCI_INT "sci_int"
#define ACPI_PM_PROP_ACPI_ENABLE_CMD "acpi_enable_cmd"
#define ACPI_PM_PROP_ACPI_DISABLE_CMD "acpi_disable_cmd"
#define ACPI_PM_PROP_PM_IO_BASE "pm_io_base"
#define ACPI_PM_PROP_GPE0_BLK "gpe0_blk"
#define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len"
#define ACPI_PM_PROP_TCO_ENABLED "enable_tco"

struct PcGuestInfo {
    bool isapc_ram_fw;
    hwaddr ram_size, ram_size_below_4g;
    unsigned apic_id_limit;
    bool apic_xrupt_override;
    uint64_t numa_nodes;
    uint64_t *node_mem;
    uint64_t *node_cpu;
    FWCfgState *fw_cfg;
    int legacy_acpi_table_size;
    bool has_acpi_build;
    bool has_reserved_memory;
    bool rsdp_in_ram;
};

/* parallel.c */

void parallel_hds_isa_init(ISABus *bus, int n);

bool parallel_mm_init(MemoryRegion *address_space,
                      hwaddr base, int it_shift, qemu_irq irq,
                      CharDriverState *chr);

/* i8259.c */

extern DeviceState *isa_pic;
qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
qemu_irq *kvm_i8259_init(ISABus *bus);
int pic_read_irq(DeviceState *d);
int pic_get_output(DeviceState *d);
void hmp_info_pic(Monitor *mon, const QDict *qdict);
void hmp_info_irq(Monitor *mon, const QDict *qdict);

/* ioapic.c */

void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict);
void ioapic_dump_state(Monitor *mon, const QDict *qdict);

/* Global System Interrupts */

#define GSI_NUM_PINS IOAPIC_NUM_PINS

typedef struct GSIState {
    qemu_irq i8259_irq[ISA_NUM_IRQS];
    qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
} GSIState;

void gsi_handler(void *opaque, int n, int level);

/* vmport.c */
typedef uint32_t (VMPortReadFunc)(void *opaque, uint32_t address);

static inline void vmport_init(ISABus *bus)
{
    isa_create_simple(bus, "vmport");
}

void vmport_register(unsigned char command, VMPortReadFunc *func, void *opaque);
void vmmouse_get_data(uint32_t *data);
void vmmouse_set_data(const uint32_t *data);

/* pckbd.c */

void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
                   MemoryRegion *region, ram_addr_t size,
                   hwaddr mask);
void i8042_isa_mouse_fake_event(void *opaque);
void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);

/* pc.c */
extern int fd_bootchk;

bool pc_machine_is_smm_enabled(PCMachineState *pcms);
void pc_register_ferr_irq(qemu_irq irq);
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);

void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
void pc_hot_add_cpu(const int64_t id, Error **errp);
void pc_acpi_init(const char *default_dsdt);

PcGuestInfo *pc_guest_info_init(PCMachineState *pcms);

void pc_set_legacy_acpi_data_size(void);

#define PCI_HOST_PROP_PCI_HOLE_START   "pci-hole-start"
#define PCI_HOST_PROP_PCI_HOLE_END     "pci-hole-end"
#define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
#define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
#define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
#define DEFAULT_PCI_HOLE64_SIZE (~0x0ULL)


void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory,
                            MemoryRegion *pci_address_space);

FWCfgState *xen_load_linux(PCMachineState *pcms,
                           PcGuestInfo *guest_info);
FWCfgState *pc_memory_init(PCMachineState *pcms,
                           MemoryRegion *system_memory,
                           MemoryRegion *rom_memory,
                           MemoryRegion **ram_memory,
                           PcGuestInfo *guest_info);
qemu_irq pc_allocate_cpu_irq(void);
DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
                          ISADevice **rtc_state,
                          bool create_fdctrl,
                          bool no_vmport,
                          uint32 hpet_irqs);
void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
void pc_cmos_init(PCMachineState *pcms,
                  BusState *ide0, BusState *ide1,
                  ISADevice *s);
void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
void pc_pci_device_init(PCIBus *pci_bus);

typedef void (*cpu_set_smm_t)(int smm, void *arg);

void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);

/* acpi_piix.c */

I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
                      qemu_irq sci_irq, qemu_irq smi_irq,
                      int smm_enabled, DeviceState **piix4_pm);
void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);

/* hpet.c */
extern int no_hpet;

/* piix_pci.c */
struct PCII440FXState;
typedef struct PCII440FXState PCII440FXState;

#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"
#define TYPE_I440FX_PCI_DEVICE "i440FX"

#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"

PCIBus *i440fx_init(const char *host_type, const char *pci_type,
                    PCII440FXState **pi440fx_state, int *piix_devfn,
                    ISABus **isa_bus, qemu_irq *pic,
                    MemoryRegion *address_space_mem,
                    MemoryRegion *address_space_io,
                    ram_addr_t ram_size,
                    ram_addr_t below_4g_mem_size,
                    ram_addr_t above_4g_mem_size,
                    MemoryRegion *pci_memory,
                    MemoryRegion *ram_memory);

PCIBus *find_i440fx(void);
/* piix4.c */
extern PCIDevice *piix4_dev;
int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);

/* vga.c */
enum vga_retrace_method {
    VGA_RETRACE_DUMB,
    VGA_RETRACE_PRECISE
};

extern enum vga_retrace_method vga_retrace_method;

int isa_vga_mm_init(hwaddr vram_base,
                    hwaddr ctrl_base, int it_shift,
                    MemoryRegion *address_space);

/* ne2000.c */
static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
{
    DeviceState *dev;
    ISADevice *isadev;

    qemu_check_nic_model(nd, "ne2k_isa");

    isadev = isa_try_create(bus, "ne2k_isa");
    if (!isadev) {
        return false;
    }
    dev = DEVICE(isadev);
    qdev_prop_set_uint32(dev, "iobase", base);
    qdev_prop_set_uint32(dev, "irq",    irq);
    qdev_set_nic_properties(dev, nd);
    qdev_init_nofail(dev);
    return true;
}

/* pc_sysfw.c */
void pc_system_firmware_init(MemoryRegion *rom_memory,
                             bool isapc_ram_fw);

/* pvpanic.c */
uint16_t pvpanic_port(void);

/* e820 types */
#define E820_RAM        1
#define E820_RESERVED   2
#define E820_ACPI       3
#define E820_NVS        4
#define E820_UNUSABLE   5

int e820_add_entry(uint64_t, uint64_t, uint32_t);
int e820_get_num_entries(void);
bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);

#define PC_COMPAT_2_4 \
        HW_COMPAT_2_4

#define PC_COMPAT_2_3 \
        PC_COMPAT_2_4 \
        HW_COMPAT_2_3 \
        {\
            .driver   = TYPE_X86_CPU,\
            .property = "arat",\
            .value    = "off",\
        },{\
            .driver   = "qemu64" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(4),\
        },{\
            .driver   = "kvm64" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(5),\
        },{\
            .driver   = "pentium3" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(2),\
        },{\
            .driver   = "n270" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(5),\
        },{\
            .driver   = "Conroe" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(4),\
        },{\
            .driver   = "Penryn" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(4),\
        },{\
            .driver   = "Nehalem" "-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(4),\
        },{\
            .driver   = "n270" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Penryn" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Conroe" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Nehalem" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Westmere" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "SandyBridge" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "IvyBridge" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Haswell" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Haswell-noTSX" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Broadwell" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },{\
            .driver   = "Broadwell-noTSX" "-" TYPE_X86_CPU,\
            .property = "xlevel",\
            .value    = stringify(0x8000000a),\
        },

#define PC_COMPAT_2_2 \
        PC_COMPAT_2_3 \
        HW_COMPAT_2_2 \
        {\
            .driver = "kvm64" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "kvm32" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Conroe" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Penryn" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Nehalem" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Westmere" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "SandyBridge" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Haswell" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Broadwell" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Opteron_G1" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Opteron_G2" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Opteron_G3" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Opteron_G4" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Opteron_G5" "-" TYPE_X86_CPU,\
            .property = "vme",\
            .value = "off",\
        },\
        {\
            .driver = "Haswell" "-" TYPE_X86_CPU,\
            .property = "f16c",\
            .value = "off",\
        },\
        {\
            .driver = "Haswell" "-" TYPE_X86_CPU,\
            .property = "rdrand",\
            .value = "off",\
        },\
        {\
            .driver = "Broadwell" "-" TYPE_X86_CPU,\
            .property = "f16c",\
            .value = "off",\
        },\
        {\
            .driver = "Broadwell" "-" TYPE_X86_CPU,\
            .property = "rdrand",\
            .value = "off",\
        },

#define PC_COMPAT_2_1 \
        PC_COMPAT_2_2 \
        HW_COMPAT_2_1 \
        {\
            .driver = "coreduo" "-" TYPE_X86_CPU,\
            .property = "vmx",\
            .value = "on",\
        },\
        {\
            .driver = "core2duo" "-" TYPE_X86_CPU,\
            .property = "vmx",\
            .value = "on",\
        },

#define PC_COMPAT_2_0 \
        PC_COMPAT_2_1 \
        {\
            .driver   = "virtio-scsi-pci",\
            .property = "any_layout",\
            .value    = "off",\
        },{\
            .driver   = "PIIX4_PM",\
            .property = "memory-hotplug-support",\
            .value    = "off",\
        },\
        {\
            .driver   = "apic",\
            .property = "version",\
            .value    = stringify(0x11),\
        },\
        {\
            .driver   = "nec-usb-xhci",\
            .property = "superspeed-ports-first",\
            .value    = "off",\
        },\
        {\
            .driver   = "nec-usb-xhci",\
            .property = "force-pcie-endcap",\
            .value    = "on",\
        },\
        {\
            .driver   = "pci-serial",\
            .property = "prog_if",\
            .value    = stringify(0),\
        },\
        {\
            .driver   = "pci-serial-2x",\
            .property = "prog_if",\
            .value    = stringify(0),\
        },\
        {\
            .driver   = "pci-serial-4x",\
            .property = "prog_if",\
            .value    = stringify(0),\
        },\
        {\
            .driver   = "virtio-net-pci",\
            .property = "guest_announce",\
            .value    = "off",\
        },\
        {\
            .driver   = "ICH9-LPC",\
            .property = "memory-hotplug-support",\
            .value    = "off",\
        },{\
            .driver   = "xio3130-downstream",\
            .property = COMPAT_PROP_PCP,\
            .value    = "off",\
        },{\
            .driver   = "ioh3420",\
            .property = COMPAT_PROP_PCP,\
            .value    = "off",\
        },

#define PC_COMPAT_1_7 \
        PC_COMPAT_2_0 \
        {\
            .driver   = TYPE_USB_DEVICE,\
            .property = "msos-desc",\
            .value    = "no",\
        },\
        {\
            .driver   = "PIIX4_PM",\
            .property = "acpi-pci-hotplug-with-bridge-support",\
            .value    = "off",\
        },\
        {\
            .driver   = "hpet",\
            .property = HPET_INTCAP,\
            .value    = stringify(4),\
        },

#define PC_COMPAT_1_6 \
        PC_COMPAT_1_7 \
        {\
            .driver   = "e1000",\
            .property = "mitigation",\
            .value    = "off",\
        },{\
            .driver   = "qemu64-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(2),\
        },{\
            .driver   = "qemu32-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(3),\
        },{\
            .driver   = "i440FX-pcihost",\
            .property = "short_root_bus",\
            .value    = stringify(1),\
        },{\
            .driver   = "q35-pcihost",\
            .property = "short_root_bus",\
            .value    = stringify(1),\
        },

#define PC_COMPAT_1_5 \
        PC_COMPAT_1_6 \
        {\
            .driver   = "Conroe-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(2),\
        },{\
            .driver   = "Conroe-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(2),\
        },{\
            .driver   = "Penryn-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(2),\
        },{\
            .driver   = "Penryn-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(2),\
        },{\
            .driver   = "Nehalem-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(2),\
        },{\
            .driver   = "Nehalem-" TYPE_X86_CPU,\
            .property = "level",\
            .value    = stringify(2),\
        },{\
            .driver   = "virtio-net-pci",\
            .property = "any_layout",\
            .value    = "off",\
        },{\
            .driver = TYPE_X86_CPU,\
            .property = "pmu",\
            .value = "on",\
        },{\
            .driver   = "i440FX-pcihost",\
            .property = "short_root_bus",\
            .value    = stringify(0),\
        },{\
            .driver   = "q35-pcihost",\
            .property = "short_root_bus",\
            .value    = stringify(0),\
        },

#define PC_COMPAT_1_4 \
        PC_COMPAT_1_5 \
        {\
            .driver   = "scsi-hd",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "scsi-cd",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "scsi-disk",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "ide-hd",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "ide-cd",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "ide-drive",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "virtio-blk-pci",\
            .property = "discard_granularity",\
            .value    = stringify(0),\
        },{\
            .driver   = "virtio-serial-pci",\
            .property = "vectors",\
            /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
            .value    = stringify(0xFFFFFFFF),\
        },{ \
            .driver   = "virtio-net-pci", \
            .property = "ctrl_guest_offloads", \
            .value    = "off", \
        },{\
            .driver   = "e1000",\
            .property = "romfile",\
            .value    = "pxe-e1000.rom",\
        },{\
            .driver   = "ne2k_pci",\
            .property = "romfile",\
            .value    = "pxe-ne2k_pci.rom",\
        },{\
            .driver   = "pcnet",\
            .property = "romfile",\
            .value    = "pxe-pcnet.rom",\
        },{\
            .driver   = "rtl8139",\
            .property = "romfile",\
            .value    = "pxe-rtl8139.rom",\
        },{\
            .driver   = "virtio-net-pci",\
            .property = "romfile",\
            .value    = "pxe-virtio.rom",\
        },{\
            .driver   = "486-" TYPE_X86_CPU,\
            .property = "model",\
            .value    = stringify(0),\
        },\
        {\
            .driver = "n270" "-" TYPE_X86_CPU,\
            .property = "movbe",\
            .value = "off",\
        },\
        {\
            .driver = "Westmere" "-" TYPE_X86_CPU,\
            .property = "pclmulqdq",\
            .value = "off",\
        },

#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
    { \
        MachineClass *mc = MACHINE_CLASS(oc); \
        optsfn(mc); \
        mc->name = namestr; \
        mc->init = initfn; \
    } \
    static const TypeInfo pc_machine_type_##suffix = { \
        .name       = namestr TYPE_MACHINE_SUFFIX, \
        .parent     = TYPE_PC_MACHINE, \
        .class_init = pc_machine_##suffix##_class_init, \
    }; \
    static void pc_machine_init_##suffix(void) \
    { \
        type_register(&pc_machine_type_##suffix); \
    } \
    machine_init(pc_machine_init_##suffix)

#define SET_MACHINE_COMPAT(m, COMPAT) do { \
    static GlobalProperty props[] = { \
        COMPAT \
        { /* end of list */ } \
    }; \
    (m)->compat_props = props; \
} while (0)

extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
#endif
