Commit 5e3cb5347e9b650bdf8015da3c310b2669219294

Authored by aliguori
1 parent a7607f7e

qemu: initialize hot add system / acpi gpe (Marcelo Tosatti)

ACPI GPE support, used by PCI (and CPU) hotplug.

From: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6607 c046a42c-6fe2-441c-8c8c-71466251a162
hw/acpi.c
... ... @@ -561,3 +561,71 @@ void qemu_system_powerdown(void)
561 561 }
562 562 }
563 563 #endif
  564 +
  565 +#define GPE_BASE 0xafe0
  566 +
  567 +struct gpe_regs {
  568 + uint16_t sts; /* status */
  569 + uint16_t en; /* enabled */
  570 +};
  571 +
  572 +static struct gpe_regs gpe;
  573 +
  574 +static uint32_t gpe_readb(void *opaque, uint32_t addr)
  575 +{
  576 + uint32_t val = 0;
  577 + struct gpe_regs *g = opaque;
  578 + switch (addr) {
  579 + case GPE_BASE:
  580 + val = g->sts & 0xFF;
  581 + break;
  582 + case GPE_BASE + 1:
  583 + val = (g->sts >> 8) & 0xFF;
  584 + break;
  585 + case GPE_BASE + 2:
  586 + val = g->en & 0xFF;
  587 + break;
  588 + case GPE_BASE + 3:
  589 + val = (g->en >> 8) & 0xFF;
  590 + break;
  591 + default:
  592 + break;
  593 + }
  594 +
  595 +#if defined(DEBUG)
  596 + printf("gpe read %lx == %lx\n", addr, val);
  597 +#endif
  598 + return val;
  599 +}
  600 +
  601 +static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val)
  602 +{
  603 + struct gpe_regs *g = opaque;
  604 + switch (addr) {
  605 + case GPE_BASE:
  606 + g->sts = (g->sts & ~0xFFFF) | (val & 0xFFFF);
  607 + break;
  608 + case GPE_BASE + 1:
  609 + g->sts = (g->sts & 0xFFFF) | (val << 8);
  610 + break;
  611 + case GPE_BASE + 2:
  612 + g->en = (g->en & ~0xFFFF) | (val & 0xFFFF);
  613 + break;
  614 + case GPE_BASE + 3:
  615 + g->en = (g->en & 0xFFFF) | (val << 8);
  616 + break;
  617 + default:
  618 + break;
  619 + }
  620 +
  621 +#if defined(DEBUG)
  622 + printf("gpe write %lx <== %d\n", addr, val);
  623 +#endif
  624 +}
  625 +
  626 +void qemu_system_hot_add_init(void)
  627 +{
  628 + register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe);
  629 + register_ioport_read(GPE_BASE, 4, 1, gpe_readb, &gpe);
  630 +
  631 +}
... ...
... ... @@ -1010,6 +1010,8 @@ vga_bios_error:
1010 1010 pci_nic_init(pci_bus, nd, -1, "ne2k_pci");
1011 1011 }
1012 1012  
  1013 + qemu_system_hot_add_init();
  1014 +
1013 1015 if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
1014 1016 fprintf(stderr, "qemu: too many IDE bus\n");
1015 1017 exit(1);
... ...
sysemu.h
... ... @@ -166,6 +166,9 @@ extern int nb_drives_opt;
166 166 extern int drive_add(const char *file, const char *fmt, ...);
167 167 extern int drive_init(struct drive_opt *arg, int snapshot, void *machine);
168 168  
  169 +/* acpi */
  170 +void qemu_system_hot_add_init(void);
  171 +
169 172 /* serial ports */
170 173  
171 174 #define MAX_SERIAL_PORTS 4
... ...