xref: /qemu/include/hw/i386/pc.h (revision a0dba644c139907ccf6735c505fbd254010d6938)
187ecb68bSpbrook #ifndef HW_PC_H
287ecb68bSpbrook #define HW_PC_H
3376253ecSaliguori 
4376253ecSaliguori #include "qemu-common.h"
5022c62cbSPaolo Bonzini #include "exec/memory.h"
60d09e41aSPaolo Bonzini #include "hw/isa/isa.h"
70d09e41aSPaolo Bonzini #include "hw/block/fdc.h"
81422e32dSPaolo Bonzini #include "net/net.h"
90d09e41aSPaolo Bonzini #include "hw/i386/ioapic.h"
10376253ecSaliguori 
113459a625SMichael S. Tsirkin #include "qemu/range.h"
123459a625SMichael S. Tsirkin 
1387ecb68bSpbrook /* PC-style peripherals (also used by other machines).  */
1487ecb68bSpbrook 
153459a625SMichael S. Tsirkin typedef struct PcPciInfo {
163459a625SMichael S. Tsirkin     Range w32;
173459a625SMichael S. Tsirkin     Range w64;
183459a625SMichael S. Tsirkin } PcPciInfo;
193459a625SMichael S. Tsirkin 
203459a625SMichael S. Tsirkin struct PcGuestInfo {
21f8c457b8SMichael S. Tsirkin     bool has_pci_info;
226dd2a5c9SPaolo Bonzini     bool isapc_ram_fw;
233459a625SMichael S. Tsirkin     FWCfgState *fw_cfg;
243459a625SMichael S. Tsirkin };
253459a625SMichael S. Tsirkin 
2687ecb68bSpbrook /* parallel.c */
2748a18b3cSHervé Poussineau static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
28defdb20eSBlue Swirl {
294a17cc4fSAndreas Färber     DeviceState *dev;
304a17cc4fSAndreas Färber     ISADevice *isadev;
3187ecb68bSpbrook 
324a17cc4fSAndreas Färber     isadev = isa_try_create(bus, "isa-parallel");
334a17cc4fSAndreas Färber     if (!isadev) {
3473531538SBlue Swirl         return false;
3573531538SBlue Swirl     }
364a17cc4fSAndreas Färber     dev = DEVICE(isadev);
374a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "index", index);
384a17cc4fSAndreas Färber     qdev_prop_set_chr(dev, "chardev", chr);
394a17cc4fSAndreas Färber     if (qdev_init(dev) < 0) {
40defdb20eSBlue Swirl         return false;
41defdb20eSBlue Swirl     }
42defdb20eSBlue Swirl     return true;
43defdb20eSBlue Swirl }
44defdb20eSBlue Swirl 
4563858cd9SAvi Kivity bool parallel_mm_init(MemoryRegion *address_space,
46a8170e5eSAvi Kivity                       hwaddr base, int it_shift, qemu_irq irq,
47defdb20eSBlue Swirl                       CharDriverState *chr);
4887ecb68bSpbrook 
4987ecb68bSpbrook /* i8259.c */
5087ecb68bSpbrook 
519aa78c42SJan Kiszka extern DeviceState *isa_pic;
5248a18b3cSHervé Poussineau qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
5310b61882SJan Kiszka qemu_irq *kvm_i8259_init(ISABus *bus);
549aa78c42SJan Kiszka int pic_read_irq(DeviceState *d);
559aa78c42SJan Kiszka int pic_get_output(DeviceState *d);
5684f2d0eaSWenchao Xia void pic_info(Monitor *mon, const QDict *qdict);
5784f2d0eaSWenchao Xia void irq_info(Monitor *mon, const QDict *qdict);
5887ecb68bSpbrook 
59b881fbe9SJan Kiszka /* Global System Interrupts */
6096051119SBlue Swirl 
61b881fbe9SJan Kiszka #define GSI_NUM_PINS IOAPIC_NUM_PINS
62845773abSIsaku Yamahata 
63b881fbe9SJan Kiszka typedef struct GSIState {
6443a0db35SJan Kiszka     qemu_irq i8259_irq[ISA_NUM_IRQS];
65b881fbe9SJan Kiszka     qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
66b881fbe9SJan Kiszka } GSIState;
67b881fbe9SJan Kiszka 
68b881fbe9SJan Kiszka void gsi_handler(void *opaque, int n, int level);
69845773abSIsaku Yamahata 
7087ecb68bSpbrook /* vmport.c */
71d67f679dSJan Kiszka typedef uint32_t (VMPortReadFunc)(void *opaque, uint32_t address);
72d67f679dSJan Kiszka 
7348a18b3cSHervé Poussineau static inline void vmport_init(ISABus *bus)
746872ef61SBlue Swirl {
7548a18b3cSHervé Poussineau     isa_create_simple(bus, "vmport");
766872ef61SBlue Swirl }
77d67f679dSJan Kiszka 
78d67f679dSJan Kiszka void vmport_register(unsigned char command, VMPortReadFunc *func, void *opaque);
7986d86414SBlue Swirl void vmmouse_get_data(uint32_t *data);
8086d86414SBlue Swirl void vmmouse_set_data(const uint32_t *data);
8187ecb68bSpbrook 
8287ecb68bSpbrook /* pckbd.c */
8387ecb68bSpbrook 
8487ecb68bSpbrook void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
8587ecb68bSpbrook void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
86dbff76acSRichard Henderson                    MemoryRegion *region, ram_addr_t size,
87a8170e5eSAvi Kivity                    hwaddr mask);
88956a3e6bSBlue Swirl void i8042_isa_mouse_fake_event(void *opaque);
89956a3e6bSBlue Swirl void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);
9087ecb68bSpbrook 
9187ecb68bSpbrook /* pc.c */
9287ecb68bSpbrook extern int fd_bootchk;
9387ecb68bSpbrook 
948e78eb28SIsaku Yamahata void pc_register_ferr_irq(qemu_irq irq);
95845773abSIsaku Yamahata void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
96845773abSIsaku Yamahata 
9762fc403fSIgor Mammedov void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
98c649983bSIgor Mammedov void pc_hot_add_cpu(const int64_t id, Error **errp);
99f7e4dd6cSGerd Hoffmann void pc_acpi_init(const char *default_dsdt);
1003459a625SMichael S. Tsirkin 
1013459a625SMichael S. Tsirkin PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
1023459a625SMichael S. Tsirkin                                 ram_addr_t above_4g_mem_size);
1033459a625SMichael S. Tsirkin 
10439848901SIgor Mammedov #define PCI_HOST_PROP_PCI_HOLE_START   "pci-hole-start"
10539848901SIgor Mammedov #define PCI_HOST_PROP_PCI_HOLE_END     "pci-hole-end"
10639848901SIgor Mammedov #define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
10739848901SIgor Mammedov #define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
10839848901SIgor Mammedov #define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
1091466cef3SMichael S. Tsirkin #define DEFAULT_PCI_HOLE64_SIZE (~0x0ULL)
1101466cef3SMichael S. Tsirkin 
1111466cef3SMichael S. Tsirkin static inline uint64_t pci_host_get_hole64_size(uint64_t pci_hole64_size)
1121466cef3SMichael S. Tsirkin {
1131466cef3SMichael S. Tsirkin     if (pci_hole64_size == DEFAULT_PCI_HOLE64_SIZE) {
1141466cef3SMichael S. Tsirkin         return 1ULL << 62;
1151466cef3SMichael S. Tsirkin     } else {
1161466cef3SMichael S. Tsirkin         return pci_hole64_size;
1171466cef3SMichael S. Tsirkin     }
1181466cef3SMichael S. Tsirkin }
11939848901SIgor Mammedov 
12039848901SIgor Mammedov void pc_init_pci64_hole(PcPciInfo *pci_info, uint64_t pci_hole64_start,
12139848901SIgor Mammedov                         uint64_t pci_hole64_size);
12239848901SIgor Mammedov 
123a88b362cSLaszlo Ersek FWCfgState *pc_memory_init(MemoryRegion *system_memory,
1244aa63af1SAvi Kivity                            const char *kernel_filename,
125845773abSIsaku Yamahata                            const char *kernel_cmdline,
126845773abSIsaku Yamahata                            const char *initrd_filename,
127e0e7e67bSAnthony PERARD                            ram_addr_t below_4g_mem_size,
128ae0a5466SAvi Kivity                            ram_addr_t above_4g_mem_size,
1294463aee6SJan Kiszka                            MemoryRegion *rom_memory,
1303459a625SMichael S. Tsirkin                            MemoryRegion **ram_memory,
1313459a625SMichael S. Tsirkin                            PcGuestInfo *guest_info);
132845773abSIsaku Yamahata qemu_irq *pc_allocate_cpu_irq(void);
13348a18b3cSHervé Poussineau DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
13448a18b3cSHervé Poussineau void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
1351611977cSAnthony PERARD                           ISADevice **rtc_state,
13634d4260eSKevin Wolf                           ISADevice **floppy,
1371611977cSAnthony PERARD                           bool no_vmport);
13848a18b3cSHervé Poussineau void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
139845773abSIsaku Yamahata void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
140c0897e0cSMarkus Armbruster                   const char *boot_device,
14134d4260eSKevin Wolf                   ISADevice *floppy, BusState *ide0, BusState *ide1,
14263ffb564SBlue Swirl                   ISADevice *s);
1439011a1a7SIsaku Yamahata void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
144845773abSIsaku Yamahata void pc_pci_device_init(PCIBus *pci_bus);
1458e78eb28SIsaku Yamahata 
146f885f1eaSIsaku Yamahata typedef void (*cpu_set_smm_t)(int smm, void *arg);
147f885f1eaSIsaku Yamahata void cpu_smm_register(cpu_set_smm_t callback, void *arg);
148f885f1eaSIsaku Yamahata 
149a39e3564SJason Baron void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
150a39e3564SJason Baron 
1519d5e77a2SIsaku Yamahata /* acpi_piix.c */
15253b67b30SBlue Swirl 
153cf7a2fe2Saurel32 i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
154da98c8ebSGerd Hoffmann                        qemu_irq sci_irq, qemu_irq smi_irq,
155a88b362cSLaszlo Ersek                        int kvm_enabled, FWCfgState *fw_cfg);
15687ecb68bSpbrook void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
15787ecb68bSpbrook 
15816b29ae1Saliguori /* hpet.c */
15916b29ae1Saliguori extern int no_hpet;
16016b29ae1Saliguori 
16187ecb68bSpbrook /* piix_pci.c */
1620a3bacf3SJuan Quintela struct PCII440FXState;
1630a3bacf3SJuan Quintela typedef struct PCII440FXState PCII440FXState;
1640a3bacf3SJuan Quintela 
1651e39101cSAvi Kivity PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
16660573079SHervé Poussineau                     ISABus **isa_bus, qemu_irq *pic,
167aee97b84SAvi Kivity                     MemoryRegion *address_space_mem,
168aee97b84SAvi Kivity                     MemoryRegion *address_space_io,
169ae0a5466SAvi Kivity                     ram_addr_t ram_size,
170a8170e5eSAvi Kivity                     hwaddr pci_hole_start,
171a8170e5eSAvi Kivity                     hwaddr pci_hole_size,
17239848901SIgor Mammedov                     ram_addr_t above_4g_mem_size,
173ae0a5466SAvi Kivity                     MemoryRegion *pci_memory,
174ae0a5466SAvi Kivity                     MemoryRegion *ram_memory);
17587ecb68bSpbrook 
176823e675aSJuan Quintela /* piix4.c */
177b1d8e52eSblueswir1 extern PCIDevice *piix4_dev;
178142e9787SHervé Poussineau int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
17987ecb68bSpbrook 
18087ecb68bSpbrook /* vga.c */
181cb5a7aa8Smalc enum vga_retrace_method {
182cb5a7aa8Smalc     VGA_RETRACE_DUMB,
183cb5a7aa8Smalc     VGA_RETRACE_PRECISE
184cb5a7aa8Smalc };
185cb5a7aa8Smalc 
186cb5a7aa8Smalc extern enum vga_retrace_method vga_retrace_method;
18787ecb68bSpbrook 
188a8170e5eSAvi Kivity int isa_vga_mm_init(hwaddr vram_base,
189a8170e5eSAvi Kivity                     hwaddr ctrl_base, int it_shift,
190be20f9e9SAvi Kivity                     MemoryRegion *address_space);
19187ecb68bSpbrook 
19287ecb68bSpbrook /* ne2000.c */
19348a18b3cSHervé Poussineau static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
19460a14ad3SBlue Swirl {
1954a17cc4fSAndreas Färber     DeviceState *dev;
1964a17cc4fSAndreas Färber     ISADevice *isadev;
19787ecb68bSpbrook 
19860a14ad3SBlue Swirl     qemu_check_nic_model(nd, "ne2k_isa");
19960a14ad3SBlue Swirl 
2004a17cc4fSAndreas Färber     isadev = isa_try_create(bus, "ne2k_isa");
2014a17cc4fSAndreas Färber     if (!isadev) {
202cd1b8a8bSBlue Swirl         return false;
203cd1b8a8bSBlue Swirl     }
2044a17cc4fSAndreas Färber     dev = DEVICE(isadev);
2054a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "iobase", base);
2064a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "irq",    irq);
2074a17cc4fSAndreas Färber     qdev_set_nic_properties(dev, nd);
2084a17cc4fSAndreas Färber     qdev_init_nofail(dev);
209cd1b8a8bSBlue Swirl     return true;
21060a14ad3SBlue Swirl }
21187ecb68bSpbrook 
212cbc5b5f3SJordan Justen /* pc_sysfw.c */
2136dd2a5c9SPaolo Bonzini void pc_system_firmware_init(MemoryRegion *rom_memory,
2146dd2a5c9SPaolo Bonzini                              bool isapc_ram_fw);
215cbc5b5f3SJordan Justen 
2163ab135f3SHu Tao /* pvpanic.c */
217bc3e6a0dSMichael S. Tsirkin void pvpanic_init(ISABus *bus);
2183ab135f3SHu Tao 
2194c5b10b7SJes Sorensen /* e820 types */
2204c5b10b7SJes Sorensen #define E820_RAM        1
2214c5b10b7SJes Sorensen #define E820_RESERVED   2
2224c5b10b7SJes Sorensen #define E820_ACPI       3
2234c5b10b7SJes Sorensen #define E820_NVS        4
2244c5b10b7SJes Sorensen #define E820_UNUSABLE   5
2254c5b10b7SJes Sorensen 
2264c5b10b7SJes Sorensen int e820_add_entry(uint64_t, uint64_t, uint32_t);
2274c5b10b7SJes Sorensen 
228ffce9ebbSEduardo Habkost #define PC_COMPAT_1_5 \
229ffce9ebbSEduardo Habkost         {\
230ffce9ebbSEduardo Habkost             .driver   = "Conroe-" TYPE_X86_CPU,\
231ffce9ebbSEduardo Habkost             .property = "model",\
232ffce9ebbSEduardo Habkost             .value    = stringify(2),\
233ffce9ebbSEduardo Habkost         },{\
2346b11322eSEduardo Habkost             .driver   = "Conroe-" TYPE_X86_CPU,\
2356b11322eSEduardo Habkost             .property = "level",\
2366b11322eSEduardo Habkost             .value    = stringify(2),\
2376b11322eSEduardo Habkost         },{\
238ffce9ebbSEduardo Habkost             .driver   = "Penryn-" TYPE_X86_CPU,\
239ffce9ebbSEduardo Habkost             .property = "model",\
240ffce9ebbSEduardo Habkost             .value    = stringify(2),\
241ffce9ebbSEduardo Habkost         },{\
2426b11322eSEduardo Habkost             .driver   = "Penryn-" TYPE_X86_CPU,\
2436b11322eSEduardo Habkost             .property = "level",\
2446b11322eSEduardo Habkost             .value    = stringify(2),\
2456b11322eSEduardo Habkost         },{\
246ffce9ebbSEduardo Habkost             .driver   = "Nehalem-" TYPE_X86_CPU,\
247ffce9ebbSEduardo Habkost             .property = "model",\
248ffce9ebbSEduardo Habkost             .value    = stringify(2),\
2496b11322eSEduardo Habkost         },{\
2506b11322eSEduardo Habkost             .driver   = "Nehalem-" TYPE_X86_CPU,\
2516b11322eSEduardo Habkost             .property = "level",\
2526b11322eSEduardo Habkost             .value    = stringify(2),\
253488f069bSMichael S. Tsirkin         },{\
254488f069bSMichael S. Tsirkin             .driver   = "virtio-net-pci",\
255488f069bSMichael S. Tsirkin             .property = "any_layout",\
256488f069bSMichael S. Tsirkin             .value    = "off",\
2579337e3b6SEduardo Habkost         },{\
2589337e3b6SEduardo Habkost             .driver = TYPE_X86_CPU,\
2599337e3b6SEduardo Habkost             .property = "pmu",\
2609337e3b6SEduardo Habkost             .value = "on",\
261ffce9ebbSEduardo Habkost         }
262ffce9ebbSEduardo Habkost 
263bf3caa3dSPaolo Bonzini #define PC_COMPAT_1_4 \
264ffce9ebbSEduardo Habkost         PC_COMPAT_1_5, \
265bf3caa3dSPaolo Bonzini         {\
266bf3caa3dSPaolo Bonzini             .driver   = "scsi-hd",\
267bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
268bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
269bf3caa3dSPaolo Bonzini 	},{\
270bf3caa3dSPaolo Bonzini             .driver   = "scsi-cd",\
271bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
272bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
273bf3caa3dSPaolo Bonzini 	},{\
274bf3caa3dSPaolo Bonzini             .driver   = "scsi-disk",\
275bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
276bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
277bf3caa3dSPaolo Bonzini 	},{\
278bf3caa3dSPaolo Bonzini             .driver   = "ide-hd",\
279bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
280bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
281bf3caa3dSPaolo Bonzini 	},{\
282bf3caa3dSPaolo Bonzini             .driver   = "ide-cd",\
283bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
284bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
285bf3caa3dSPaolo Bonzini 	},{\
286bf3caa3dSPaolo Bonzini             .driver   = "ide-drive",\
287bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
288bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
289bf3caa3dSPaolo Bonzini         },{\
290bf3caa3dSPaolo Bonzini             .driver   = "virtio-blk-pci",\
291bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
292bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
293554f1997SGal Hammer 	},{\
294554f1997SGal Hammer             .driver   = "virtio-serial-pci",\
295554f1997SGal Hammer             .property = "vectors",\
296554f1997SGal Hammer             /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
297554f1997SGal Hammer             .value    = stringify(0xFFFFFFFF),\
298c45e5b5bSGerd Hoffmann         },{ \
299644c9858SDmitry Fleytman             .driver   = "virtio-net-pci", \
300644c9858SDmitry Fleytman             .property = "ctrl_guest_offloads", \
301644c9858SDmitry Fleytman             .value    = "off", \
302644c9858SDmitry Fleytman         },{\
303c45e5b5bSGerd Hoffmann             .driver   = "e1000",\
304c45e5b5bSGerd Hoffmann             .property = "romfile",\
305c45e5b5bSGerd Hoffmann             .value    = "pxe-e1000.rom",\
306c45e5b5bSGerd Hoffmann         },{\
307c45e5b5bSGerd Hoffmann             .driver   = "ne2k_pci",\
308c45e5b5bSGerd Hoffmann             .property = "romfile",\
309c45e5b5bSGerd Hoffmann             .value    = "pxe-ne2k_pci.rom",\
310c45e5b5bSGerd Hoffmann         },{\
311c45e5b5bSGerd Hoffmann             .driver   = "pcnet",\
312c45e5b5bSGerd Hoffmann             .property = "romfile",\
313c45e5b5bSGerd Hoffmann             .value    = "pxe-pcnet.rom",\
314c45e5b5bSGerd Hoffmann         },{\
315c45e5b5bSGerd Hoffmann             .driver   = "rtl8139",\
316c45e5b5bSGerd Hoffmann             .property = "romfile",\
317c45e5b5bSGerd Hoffmann             .value    = "pxe-rtl8139.rom",\
318c45e5b5bSGerd Hoffmann         },{\
319c45e5b5bSGerd Hoffmann             .driver   = "virtio-net-pci",\
320c45e5b5bSGerd Hoffmann             .property = "romfile",\
321c45e5b5bSGerd Hoffmann             .value    = "pxe-virtio.rom",\
3229953f882SMarkus Armbruster         },{\
323b2a856d9SAndreas Färber             .driver   = "486-" TYPE_X86_CPU,\
324b2a856d9SAndreas Färber             .property = "model",\
325b2a856d9SAndreas Färber             .value    = stringify(0),\
326bf3caa3dSPaolo Bonzini         }
327bf3caa3dSPaolo Bonzini 
328*a0dba644SMichael S. Tsirkin #define PC_COMMON_MACHINE_OPTIONS \
329*a0dba644SMichael S. Tsirkin     .default_boot_order = "cad"
330*a0dba644SMichael S. Tsirkin 
331*a0dba644SMichael S. Tsirkin #define PC_DEFAULT_MACHINE_OPTIONS \
332*a0dba644SMichael S. Tsirkin     PC_COMMON_MACHINE_OPTIONS, \
333*a0dba644SMichael S. Tsirkin     .hot_add_cpu = pc_hot_add_cpu, \
334*a0dba644SMichael S. Tsirkin     .max_cpus = 255
335*a0dba644SMichael S. Tsirkin 
33687ecb68bSpbrook #endif
337