xref: /qemu/include/hw/i386/pc.h (revision f8c457b88d72a48989f190bc3d7b79f4f3b7d11c)
187ecb68bSpbrook #ifndef HW_PC_H
287ecb68bSpbrook #define HW_PC_H
3376253ecSaliguori 
4376253ecSaliguori #include "qemu-common.h"
5022c62cbSPaolo Bonzini #include "exec/memory.h"
6022c62cbSPaolo Bonzini #include "exec/ioport.h"
70d09e41aSPaolo Bonzini #include "hw/isa/isa.h"
80d09e41aSPaolo Bonzini #include "hw/block/fdc.h"
91422e32dSPaolo Bonzini #include "net/net.h"
100d09e41aSPaolo Bonzini #include "hw/i386/ioapic.h"
11376253ecSaliguori 
123459a625SMichael S. Tsirkin #include "qemu/range.h"
133459a625SMichael S. Tsirkin 
1487ecb68bSpbrook /* PC-style peripherals (also used by other machines).  */
1587ecb68bSpbrook 
163459a625SMichael S. Tsirkin typedef struct PcPciInfo {
173459a625SMichael S. Tsirkin     Range w32;
183459a625SMichael S. Tsirkin     Range w64;
193459a625SMichael S. Tsirkin } PcPciInfo;
203459a625SMichael S. Tsirkin 
213459a625SMichael S. Tsirkin struct PcGuestInfo {
223459a625SMichael S. Tsirkin     PcPciInfo pci_info;
23*f8c457b8SMichael S. Tsirkin     bool has_pci_info;
243459a625SMichael S. Tsirkin     FWCfgState *fw_cfg;
253459a625SMichael S. Tsirkin };
263459a625SMichael S. Tsirkin 
2787ecb68bSpbrook /* parallel.c */
2848a18b3cSHervé Poussineau static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
29defdb20eSBlue Swirl {
304a17cc4fSAndreas Färber     DeviceState *dev;
314a17cc4fSAndreas Färber     ISADevice *isadev;
3287ecb68bSpbrook 
334a17cc4fSAndreas Färber     isadev = isa_try_create(bus, "isa-parallel");
344a17cc4fSAndreas Färber     if (!isadev) {
3573531538SBlue Swirl         return false;
3673531538SBlue Swirl     }
374a17cc4fSAndreas Färber     dev = DEVICE(isadev);
384a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "index", index);
394a17cc4fSAndreas Färber     qdev_prop_set_chr(dev, "chardev", chr);
404a17cc4fSAndreas Färber     if (qdev_init(dev) < 0) {
41defdb20eSBlue Swirl         return false;
42defdb20eSBlue Swirl     }
43defdb20eSBlue Swirl     return true;
44defdb20eSBlue Swirl }
45defdb20eSBlue Swirl 
4663858cd9SAvi Kivity bool parallel_mm_init(MemoryRegion *address_space,
47a8170e5eSAvi Kivity                       hwaddr base, int it_shift, qemu_irq irq,
48defdb20eSBlue Swirl                       CharDriverState *chr);
4987ecb68bSpbrook 
5087ecb68bSpbrook /* i8259.c */
5187ecb68bSpbrook 
529aa78c42SJan Kiszka extern DeviceState *isa_pic;
5348a18b3cSHervé Poussineau qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
5410b61882SJan Kiszka qemu_irq *kvm_i8259_init(ISABus *bus);
559aa78c42SJan Kiszka int pic_read_irq(DeviceState *d);
569aa78c42SJan Kiszka int pic_get_output(DeviceState *d);
5784f2d0eaSWenchao Xia void pic_info(Monitor *mon, const QDict *qdict);
5884f2d0eaSWenchao Xia void irq_info(Monitor *mon, const QDict *qdict);
5987ecb68bSpbrook 
60b881fbe9SJan Kiszka /* Global System Interrupts */
6196051119SBlue Swirl 
62b881fbe9SJan Kiszka #define GSI_NUM_PINS IOAPIC_NUM_PINS
63845773abSIsaku Yamahata 
64b881fbe9SJan Kiszka typedef struct GSIState {
6543a0db35SJan Kiszka     qemu_irq i8259_irq[ISA_NUM_IRQS];
66b881fbe9SJan Kiszka     qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
67b881fbe9SJan Kiszka } GSIState;
68b881fbe9SJan Kiszka 
69b881fbe9SJan Kiszka void gsi_handler(void *opaque, int n, int level);
70845773abSIsaku Yamahata 
7187ecb68bSpbrook /* vmport.c */
7248a18b3cSHervé Poussineau static inline void vmport_init(ISABus *bus)
736872ef61SBlue Swirl {
7448a18b3cSHervé Poussineau     isa_create_simple(bus, "vmport");
756872ef61SBlue Swirl }
7687ecb68bSpbrook void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque);
7786d86414SBlue Swirl void vmmouse_get_data(uint32_t *data);
7886d86414SBlue Swirl void vmmouse_set_data(const uint32_t *data);
7987ecb68bSpbrook 
8087ecb68bSpbrook /* pckbd.c */
8187ecb68bSpbrook 
8287ecb68bSpbrook void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
8387ecb68bSpbrook void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
84dbff76acSRichard Henderson                    MemoryRegion *region, ram_addr_t size,
85a8170e5eSAvi Kivity                    hwaddr mask);
86956a3e6bSBlue Swirl void i8042_isa_mouse_fake_event(void *opaque);
87956a3e6bSBlue Swirl void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);
8887ecb68bSpbrook 
8987ecb68bSpbrook /* pc.c */
9087ecb68bSpbrook extern int fd_bootchk;
9187ecb68bSpbrook 
928e78eb28SIsaku Yamahata void pc_register_ferr_irq(qemu_irq irq);
93845773abSIsaku Yamahata void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
94845773abSIsaku Yamahata 
9562fc403fSIgor Mammedov void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
96c649983bSIgor Mammedov void pc_hot_add_cpu(const int64_t id, Error **errp);
97f7e4dd6cSGerd Hoffmann void pc_acpi_init(const char *default_dsdt);
983459a625SMichael S. Tsirkin 
993459a625SMichael S. Tsirkin PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
1003459a625SMichael S. Tsirkin                                 ram_addr_t above_4g_mem_size);
1013459a625SMichael S. Tsirkin 
102a88b362cSLaszlo Ersek FWCfgState *pc_memory_init(MemoryRegion *system_memory,
1034aa63af1SAvi Kivity                            const char *kernel_filename,
104845773abSIsaku Yamahata                            const char *kernel_cmdline,
105845773abSIsaku Yamahata                            const char *initrd_filename,
106e0e7e67bSAnthony PERARD                            ram_addr_t below_4g_mem_size,
107ae0a5466SAvi Kivity                            ram_addr_t above_4g_mem_size,
1084463aee6SJan Kiszka                            MemoryRegion *rom_memory,
1093459a625SMichael S. Tsirkin                            MemoryRegion **ram_memory,
1103459a625SMichael S. Tsirkin                            PcGuestInfo *guest_info);
111845773abSIsaku Yamahata qemu_irq *pc_allocate_cpu_irq(void);
11248a18b3cSHervé Poussineau DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
11348a18b3cSHervé Poussineau void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
1141611977cSAnthony PERARD                           ISADevice **rtc_state,
11534d4260eSKevin Wolf                           ISADevice **floppy,
1161611977cSAnthony PERARD                           bool no_vmport);
11748a18b3cSHervé Poussineau void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
118845773abSIsaku Yamahata void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
119c0897e0cSMarkus Armbruster                   const char *boot_device,
12034d4260eSKevin Wolf                   ISADevice *floppy, BusState *ide0, BusState *ide1,
12163ffb564SBlue Swirl                   ISADevice *s);
1229011a1a7SIsaku Yamahata void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
123845773abSIsaku Yamahata void pc_pci_device_init(PCIBus *pci_bus);
1248e78eb28SIsaku Yamahata 
125f885f1eaSIsaku Yamahata typedef void (*cpu_set_smm_t)(int smm, void *arg);
126f885f1eaSIsaku Yamahata void cpu_smm_register(cpu_set_smm_t callback, void *arg);
127f885f1eaSIsaku Yamahata 
128a39e3564SJason Baron void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
129a39e3564SJason Baron 
1309d5e77a2SIsaku Yamahata /* acpi_piix.c */
13153b67b30SBlue Swirl 
132cf7a2fe2Saurel32 i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
133da98c8ebSGerd Hoffmann                        qemu_irq sci_irq, qemu_irq smi_irq,
134a88b362cSLaszlo Ersek                        int kvm_enabled, FWCfgState *fw_cfg);
13587ecb68bSpbrook void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
13687ecb68bSpbrook 
13716b29ae1Saliguori /* hpet.c */
13816b29ae1Saliguori extern int no_hpet;
13916b29ae1Saliguori 
14087ecb68bSpbrook /* piix_pci.c */
1410a3bacf3SJuan Quintela struct PCII440FXState;
1420a3bacf3SJuan Quintela typedef struct PCII440FXState PCII440FXState;
1430a3bacf3SJuan Quintela 
1441e39101cSAvi Kivity PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
14560573079SHervé Poussineau                     ISABus **isa_bus, qemu_irq *pic,
146aee97b84SAvi Kivity                     MemoryRegion *address_space_mem,
147aee97b84SAvi Kivity                     MemoryRegion *address_space_io,
148ae0a5466SAvi Kivity                     ram_addr_t ram_size,
149a8170e5eSAvi Kivity                     hwaddr pci_hole_start,
150a8170e5eSAvi Kivity                     hwaddr pci_hole_size,
151a8170e5eSAvi Kivity                     hwaddr pci_hole64_start,
152a8170e5eSAvi Kivity                     hwaddr pci_hole64_size,
153ae0a5466SAvi Kivity                     MemoryRegion *pci_memory,
154ae0a5466SAvi Kivity                     MemoryRegion *ram_memory);
15587ecb68bSpbrook 
156823e675aSJuan Quintela /* piix4.c */
157b1d8e52eSblueswir1 extern PCIDevice *piix4_dev;
158142e9787SHervé Poussineau int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
15987ecb68bSpbrook 
16087ecb68bSpbrook /* vga.c */
161cb5a7aa8Smalc enum vga_retrace_method {
162cb5a7aa8Smalc     VGA_RETRACE_DUMB,
163cb5a7aa8Smalc     VGA_RETRACE_PRECISE
164cb5a7aa8Smalc };
165cb5a7aa8Smalc 
166cb5a7aa8Smalc extern enum vga_retrace_method vga_retrace_method;
16787ecb68bSpbrook 
168a8170e5eSAvi Kivity int isa_vga_mm_init(hwaddr vram_base,
169a8170e5eSAvi Kivity                     hwaddr ctrl_base, int it_shift,
170be20f9e9SAvi Kivity                     MemoryRegion *address_space);
17187ecb68bSpbrook 
17287ecb68bSpbrook /* ne2000.c */
17348a18b3cSHervé Poussineau static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
17460a14ad3SBlue Swirl {
1754a17cc4fSAndreas Färber     DeviceState *dev;
1764a17cc4fSAndreas Färber     ISADevice *isadev;
17787ecb68bSpbrook 
17860a14ad3SBlue Swirl     qemu_check_nic_model(nd, "ne2k_isa");
17960a14ad3SBlue Swirl 
1804a17cc4fSAndreas Färber     isadev = isa_try_create(bus, "ne2k_isa");
1814a17cc4fSAndreas Färber     if (!isadev) {
182cd1b8a8bSBlue Swirl         return false;
183cd1b8a8bSBlue Swirl     }
1844a17cc4fSAndreas Färber     dev = DEVICE(isadev);
1854a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "iobase", base);
1864a17cc4fSAndreas Färber     qdev_prop_set_uint32(dev, "irq",    irq);
1874a17cc4fSAndreas Färber     qdev_set_nic_properties(dev, nd);
1884a17cc4fSAndreas Färber     qdev_init_nofail(dev);
189cd1b8a8bSBlue Swirl     return true;
19060a14ad3SBlue Swirl }
19187ecb68bSpbrook 
192cbc5b5f3SJordan Justen /* pc_sysfw.c */
193cbc5b5f3SJordan Justen void pc_system_firmware_init(MemoryRegion *rom_memory);
194cbc5b5f3SJordan Justen 
1953ab135f3SHu Tao /* pvpanic.c */
1963ab135f3SHu Tao int pvpanic_init(ISABus *bus);
1973ab135f3SHu Tao 
1984c5b10b7SJes Sorensen /* e820 types */
1994c5b10b7SJes Sorensen #define E820_RAM        1
2004c5b10b7SJes Sorensen #define E820_RESERVED   2
2014c5b10b7SJes Sorensen #define E820_ACPI       3
2024c5b10b7SJes Sorensen #define E820_NVS        4
2034c5b10b7SJes Sorensen #define E820_UNUSABLE   5
2044c5b10b7SJes Sorensen 
2054c5b10b7SJes Sorensen int e820_add_entry(uint64_t, uint64_t, uint32_t);
2064c5b10b7SJes Sorensen 
207ffce9ebbSEduardo Habkost #define PC_COMPAT_1_5 \
208ffce9ebbSEduardo Habkost         {\
209ffce9ebbSEduardo Habkost             .driver   = "Conroe-" TYPE_X86_CPU,\
210ffce9ebbSEduardo Habkost             .property = "model",\
211ffce9ebbSEduardo Habkost             .value    = stringify(2),\
212ffce9ebbSEduardo Habkost         },{\
2136b11322eSEduardo Habkost             .driver   = "Conroe-" TYPE_X86_CPU,\
2146b11322eSEduardo Habkost             .property = "level",\
2156b11322eSEduardo Habkost             .value    = stringify(2),\
2166b11322eSEduardo Habkost         },{\
217ffce9ebbSEduardo Habkost             .driver   = "Penryn-" TYPE_X86_CPU,\
218ffce9ebbSEduardo Habkost             .property = "model",\
219ffce9ebbSEduardo Habkost             .value    = stringify(2),\
220ffce9ebbSEduardo Habkost         },{\
2216b11322eSEduardo Habkost             .driver   = "Penryn-" TYPE_X86_CPU,\
2226b11322eSEduardo Habkost             .property = "level",\
2236b11322eSEduardo Habkost             .value    = stringify(2),\
2246b11322eSEduardo Habkost         },{\
225ffce9ebbSEduardo Habkost             .driver   = "Nehalem-" TYPE_X86_CPU,\
226ffce9ebbSEduardo Habkost             .property = "model",\
227ffce9ebbSEduardo Habkost             .value    = stringify(2),\
2286b11322eSEduardo Habkost         },{\
2296b11322eSEduardo Habkost             .driver   = "Nehalem-" TYPE_X86_CPU,\
2306b11322eSEduardo Habkost             .property = "level",\
2316b11322eSEduardo Habkost             .value    = stringify(2),\
232ffce9ebbSEduardo Habkost         }
233ffce9ebbSEduardo Habkost 
234bf3caa3dSPaolo Bonzini #define PC_COMPAT_1_4 \
235ffce9ebbSEduardo Habkost         PC_COMPAT_1_5, \
236bf3caa3dSPaolo Bonzini         {\
237bf3caa3dSPaolo Bonzini             .driver   = "scsi-hd",\
238bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
239bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
240bf3caa3dSPaolo Bonzini 	},{\
241bf3caa3dSPaolo Bonzini             .driver   = "scsi-cd",\
242bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
243bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
244bf3caa3dSPaolo Bonzini 	},{\
245bf3caa3dSPaolo Bonzini             .driver   = "scsi-disk",\
246bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
247bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
248bf3caa3dSPaolo Bonzini 	},{\
249bf3caa3dSPaolo Bonzini             .driver   = "ide-hd",\
250bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
251bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
252bf3caa3dSPaolo Bonzini 	},{\
253bf3caa3dSPaolo Bonzini             .driver   = "ide-cd",\
254bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
255bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
256bf3caa3dSPaolo Bonzini 	},{\
257bf3caa3dSPaolo Bonzini             .driver   = "ide-drive",\
258bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
259bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
260bf3caa3dSPaolo Bonzini         },{\
261bf3caa3dSPaolo Bonzini             .driver   = "virtio-blk-pci",\
262bf3caa3dSPaolo Bonzini             .property = "discard_granularity",\
263bf3caa3dSPaolo Bonzini             .value    = stringify(0),\
264554f1997SGal Hammer 	},{\
265554f1997SGal Hammer             .driver   = "virtio-serial-pci",\
266554f1997SGal Hammer             .property = "vectors",\
267554f1997SGal Hammer             /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
268554f1997SGal Hammer             .value    = stringify(0xFFFFFFFF),\
269c45e5b5bSGerd Hoffmann         },{ \
270644c9858SDmitry Fleytman             .driver   = "virtio-net-pci", \
271644c9858SDmitry Fleytman             .property = "ctrl_guest_offloads", \
272644c9858SDmitry Fleytman             .value    = "off", \
273644c9858SDmitry Fleytman         },{\
274c45e5b5bSGerd Hoffmann             .driver   = "e1000",\
275c45e5b5bSGerd Hoffmann             .property = "romfile",\
276c45e5b5bSGerd Hoffmann             .value    = "pxe-e1000.rom",\
277c45e5b5bSGerd Hoffmann         },{\
278c45e5b5bSGerd Hoffmann             .driver   = "ne2k_pci",\
279c45e5b5bSGerd Hoffmann             .property = "romfile",\
280c45e5b5bSGerd Hoffmann             .value    = "pxe-ne2k_pci.rom",\
281c45e5b5bSGerd Hoffmann         },{\
282c45e5b5bSGerd Hoffmann             .driver   = "pcnet",\
283c45e5b5bSGerd Hoffmann             .property = "romfile",\
284c45e5b5bSGerd Hoffmann             .value    = "pxe-pcnet.rom",\
285c45e5b5bSGerd Hoffmann         },{\
286c45e5b5bSGerd Hoffmann             .driver   = "rtl8139",\
287c45e5b5bSGerd Hoffmann             .property = "romfile",\
288c45e5b5bSGerd Hoffmann             .value    = "pxe-rtl8139.rom",\
289c45e5b5bSGerd Hoffmann         },{\
290c45e5b5bSGerd Hoffmann             .driver   = "virtio-net-pci",\
291c45e5b5bSGerd Hoffmann             .property = "romfile",\
292c45e5b5bSGerd Hoffmann             .value    = "pxe-virtio.rom",\
2939953f882SMarkus Armbruster         },{\
294b2a856d9SAndreas Färber             .driver   = "486-" TYPE_X86_CPU,\
295b2a856d9SAndreas Färber             .property = "model",\
296b2a856d9SAndreas Färber             .value    = stringify(0),\
297bf3caa3dSPaolo Bonzini         }
298bf3caa3dSPaolo Bonzini 
29987ecb68bSpbrook #endif
300