pc.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #ifndef HW_PC_H
  2. #define HW_PC_H
  3. #include "qemu-common.h"
  4. #include "ioport.h"
  5. #include "isa.h"
  6. #include "fdc.h"
  7. #include "net.h"
  8. /* PC-style peripherals (also used by other machines). */
  9. /* serial.c */
  10. SerialState *serial_init(int base, qemu_irq irq, int baudbase,
  11. CharDriverState *chr);
  12. SerialState *serial_mm_init (target_phys_addr_t base, int it_shift,
  13. qemu_irq irq, int baudbase,
  14. CharDriverState *chr, int ioregister,
  15. int be);
  16. static inline bool serial_isa_init(int index, CharDriverState *chr)
  17. {
  18. ISADevice *dev;
  19. dev = isa_try_create("isa-serial");
  20. if (!dev) {
  21. return false;
  22. }
  23. qdev_prop_set_uint32(&dev->qdev, "index", index);
  24. qdev_prop_set_chr(&dev->qdev, "chardev", chr);
  25. if (qdev_init(&dev->qdev) < 0) {
  26. return false;
  27. }
  28. return true;
  29. }
  30. void serial_set_frequency(SerialState *s, uint32_t frequency);
  31. /* parallel.c */
  32. static inline bool parallel_init(int index, CharDriverState *chr)
  33. {
  34. ISADevice *dev;
  35. dev = isa_try_create("isa-parallel");
  36. if (!dev) {
  37. return false;
  38. }
  39. qdev_prop_set_uint32(&dev->qdev, "index", index);
  40. qdev_prop_set_chr(&dev->qdev, "chardev", chr);
  41. if (qdev_init(&dev->qdev) < 0) {
  42. return false;
  43. }
  44. return true;
  45. }
  46. bool parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq,
  47. CharDriverState *chr);
  48. /* i8259.c */
  49. typedef struct PicState2 PicState2;
  50. extern PicState2 *isa_pic;
  51. void pic_set_irq(int irq, int level);
  52. void pic_set_irq_new(void *opaque, int irq, int level);
  53. qemu_irq *i8259_init(qemu_irq parent_irq);
  54. int pic_read_irq(PicState2 *s);
  55. void pic_update_irq(PicState2 *s);
  56. uint32_t pic_intack_read(PicState2 *s);
  57. void pic_info(Monitor *mon);
  58. void irq_info(Monitor *mon);
  59. /* ISA */
  60. #define IOAPIC_NUM_PINS 0x18
  61. typedef struct isa_irq_state {
  62. qemu_irq *i8259;
  63. qemu_irq ioapic[IOAPIC_NUM_PINS];
  64. } IsaIrqState;
  65. void isa_irq_handler(void *opaque, int n, int level);
  66. /* i8254.c */
  67. #define PIT_FREQ 1193182
  68. static inline ISADevice *pit_init(int base, int irq)
  69. {
  70. ISADevice *dev;
  71. dev = isa_create("isa-pit");
  72. qdev_prop_set_uint32(&dev->qdev, "iobase", base);
  73. qdev_prop_set_uint32(&dev->qdev, "irq", irq);
  74. qdev_init_nofail(&dev->qdev);
  75. return dev;
  76. }
  77. void pit_set_gate(ISADevice *dev, int channel, int val);
  78. int pit_get_gate(ISADevice *dev, int channel);
  79. int pit_get_initial_count(ISADevice *dev, int channel);
  80. int pit_get_mode(ISADevice *dev, int channel);
  81. int pit_get_out(ISADevice *dev, int channel, int64_t current_time);
  82. void hpet_pit_disable(void);
  83. void hpet_pit_enable(void);
  84. /* vmport.c */
  85. static inline void vmport_init(void)
  86. {
  87. isa_create_simple("vmport");
  88. }
  89. void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque);
  90. void vmmouse_get_data(uint32_t *data);
  91. void vmmouse_set_data(const uint32_t *data);
  92. /* pckbd.c */
  93. void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
  94. void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
  95. target_phys_addr_t base, ram_addr_t size,
  96. target_phys_addr_t mask);
  97. void i8042_isa_mouse_fake_event(void *opaque);
  98. void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);
  99. /* pc.c */
  100. extern int fd_bootchk;
  101. void pc_register_ferr_irq(qemu_irq irq);
  102. void pc_cmos_set_s3_resume(void *opaque, int irq, int level);
  103. void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
  104. void pc_cpus_init(const char *cpu_model);
  105. void pc_memory_init(const char *kernel_filename,
  106. const char *kernel_cmdline,
  107. const char *initrd_filename,
  108. ram_addr_t below_4g_mem_size,
  109. ram_addr_t above_4g_mem_size);
  110. qemu_irq *pc_allocate_cpu_irq(void);
  111. void pc_vga_init(PCIBus *pci_bus);
  112. void pc_basic_device_init(qemu_irq *isa_irq,
  113. ISADevice **rtc_state,
  114. bool no_vmport);
  115. void pc_init_ne2k_isa(NICInfo *nd);
  116. void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
  117. const char *boot_device,
  118. BusState *ide0, BusState *ide1,
  119. ISADevice *s);
  120. void pc_pci_device_init(PCIBus *pci_bus);
  121. typedef void (*cpu_set_smm_t)(int smm, void *arg);
  122. void cpu_smm_register(cpu_set_smm_t callback, void *arg);
  123. /* acpi.c */
  124. extern int acpi_enabled;
  125. extern char *acpi_tables;
  126. extern size_t acpi_tables_len;
  127. void acpi_bios_init(void);
  128. int acpi_table_add(const char *table_desc);
  129. /* acpi_piix.c */
  130. i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
  131. qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
  132. int kvm_enabled);
  133. void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
  134. /* hpet.c */
  135. extern int no_hpet;
  136. /* pcspk.c */
  137. void pcspk_init(ISADevice *pit);
  138. int pcspk_audio_init(qemu_irq *pic);
  139. /* piix_pci.c */
  140. struct PCII440FXState;
  141. typedef struct PCII440FXState PCII440FXState;
  142. PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn, qemu_irq *pic, ram_addr_t ram_size);
  143. void i440fx_init_memory_mappings(PCII440FXState *d);
  144. /* piix4.c */
  145. extern PCIDevice *piix4_dev;
  146. int piix4_init(PCIBus *bus, int devfn);
  147. /* vga.c */
  148. enum vga_retrace_method {
  149. VGA_RETRACE_DUMB,
  150. VGA_RETRACE_PRECISE
  151. };
  152. extern enum vga_retrace_method vga_retrace_method;
  153. static inline int isa_vga_init(void)
  154. {
  155. ISADevice *dev;
  156. dev = isa_try_create("isa-vga");
  157. if (!dev) {
  158. fprintf(stderr, "Warning: isa-vga not available\n");
  159. return 0;
  160. }
  161. qdev_init_nofail(&dev->qdev);
  162. return 1;
  163. }
  164. int pci_vga_init(PCIBus *bus);
  165. int isa_vga_mm_init(target_phys_addr_t vram_base,
  166. target_phys_addr_t ctrl_base, int it_shift);
  167. /* cirrus_vga.c */
  168. void pci_cirrus_vga_init(PCIBus *bus);
  169. void isa_cirrus_vga_init(void);
  170. /* ne2000.c */
  171. static inline bool isa_ne2000_init(int base, int irq, NICInfo *nd)
  172. {
  173. ISADevice *dev;
  174. qemu_check_nic_model(nd, "ne2k_isa");
  175. dev = isa_try_create("ne2k_isa");
  176. if (!dev) {
  177. return false;
  178. }
  179. qdev_prop_set_uint32(&dev->qdev, "iobase", base);
  180. qdev_prop_set_uint32(&dev->qdev, "irq", irq);
  181. qdev_set_nic_properties(&dev->qdev, nd);
  182. qdev_init_nofail(&dev->qdev);
  183. return true;
  184. }
  185. /* e820 types */
  186. #define E820_RAM 1
  187. #define E820_RESERVED 2
  188. #define E820_ACPI 3
  189. #define E820_NVS 4
  190. #define E820_UNUSABLE 5
  191. int e820_add_entry(uint64_t, uint64_t, uint32_t);
  192. #endif