aboutsummaryrefslogtreecommitdiff
path: root/include/hw/i386/microvm.h
blob: e8af61f194469ac8f1f235a6824dd20cebd829a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * Copyright (c) 2018 Intel Corporation
 * Copyright (c) 2019 Red Hat, Inc.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2 or later, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef HW_I386_MICROVM_H
#define HW_I386_MICROVM_H

#include "exec/hwaddr.h"
#include "qemu/notify.h"

#include "hw/boards.h"
#include "hw/i386/x86.h"
#include "hw/acpi/acpi_dev_interface.h"
#include "hw/pci-host/gpex.h"
#include "qom/object.h"

/*
 *  IRQ    |  pc        | microvm (acpi=on)
 * --------+------------+------------------
 *   0     |  pit       |
 *   1     |  kbd       |
 *   2     |  cascade   |
 *   3     |  serial 1  |
 *   4     |  serial 0  | serial
 *   5     |  -         |
 *   6     |  floppy    |
 *   7     |  parallel  |
 *   8     |  rtc       | rtc (rtc=on)
 *   9     |  acpi      | acpi (ged)
 *  10     |  pci lnk   | xhci (usb=on)
 *  11     |  pci lnk   |
 *  12     |  ps2       | pcie
 *  13     |  fpu       | pcie
 *  14     |  ide 0     | pcie
 *  15     |  ide 1     | pcie
 *  16-23  |  pci gsi   | virtio
 */

/* Platform virtio definitions */
#define VIRTIO_MMIO_BASE                0xfeb00000
#define VIRTIO_CMDLINE_MAXLEN           64
#define VIRTIO_CMDLINE_TOTAL_MAX_LEN    ((VIRTIO_CMDLINE_MAXLEN + 1) * 16)

#define GED_MMIO_BASE         0xfea00000
#define GED_MMIO_BASE_MEMHP   (GED_MMIO_BASE + 0x100)
#define GED_MMIO_BASE_REGS    (GED_MMIO_BASE + 0x200)
#define GED_MMIO_IRQ          9

#define MICROVM_XHCI_BASE     0xfe900000
#define MICROVM_XHCI_IRQ      10

#define PCIE_MMIO_BASE        0xc0000000
#define PCIE_MMIO_SIZE        0x20000000
#define PCIE_ECAM_BASE        0xe0000000
#define PCIE_ECAM_SIZE        0x10000000

/* Machine type options */
#define MICROVM_MACHINE_RTC                 "rtc"
#define MICROVM_MACHINE_PCIE                "pcie"
#define MICROVM_MACHINE_IOAPIC2             "ioapic2"
#define MICROVM_MACHINE_ISA_SERIAL          "isa-serial"
#define MICROVM_MACHINE_OPTION_ROMS         "x-option-roms"
#define MICROVM_MACHINE_AUTO_KERNEL_CMDLINE "auto-kernel-cmdline"

struct MicrovmMachineClass {
    X86MachineClass parent;
    HotplugHandler *(*orig_hotplug_handler)(MachineState *machine,
                                           DeviceState *dev);
};

struct MicrovmMachineState {
    X86MachineState parent;

    /* Machine type options */
    OnOffAuto rtc;
    OnOffAuto pcie;
    OnOffAuto ioapic2;
    bool isa_serial;
    bool option_roms;
    bool auto_kernel_cmdline;

    /* Machine state */
    uint32_t pcie_irq_base;
    uint32_t virtio_irq_base;
    uint32_t virtio_num_transports;
    bool kernel_cmdline_fixed;
    Notifier machine_done;
    Notifier powerdown_req;
    struct GPEXConfig gpex;

    /* device tree */
    void *fdt;
    uint32_t ioapic_phandle[2];
};

#define TYPE_MICROVM_MACHINE   MACHINE_TYPE_NAME("microvm")
OBJECT_DECLARE_TYPE(MicrovmMachineState, MicrovmMachineClass, MICROVM_MACHINE)

#endif