Revision 633aa0ac
b/hw/acpi_piix4.c | ||
---|---|---|
107 | 107 |
(ACPI_BITMASK_RT_CLOCK_ENABLE | |
108 | 108 |
ACPI_BITMASK_POWER_BUTTON_ENABLE | |
109 | 109 |
ACPI_BITMASK_GLOBAL_LOCK_ENABLE | |
110 |
ACPI_BITMASK_TIMER_ENABLE)) != 0); |
|
110 |
ACPI_BITMASK_TIMER_ENABLE)) != 0) || |
|
111 |
(((s->gpe.sts & s->gpe.en) & PIIX4_PCI_HOTPLUG_STATUS) != 0); |
|
112 |
|
|
111 | 113 |
qemu_set_irq(s->irq, sci_level); |
112 | 114 |
/* schedule a timer interruption if needed */ |
113 | 115 |
if ((s->pmen & ACPI_BITMASK_TIMER_ENABLE) && |
... | ... | |
462 | 464 |
static uint32_t gpe_readb(void *opaque, uint32_t addr) |
463 | 465 |
{ |
464 | 466 |
uint32_t val = 0; |
465 |
struct gpe_regs *g = opaque; |
|
467 |
PIIX4PMState *s = opaque; |
|
468 |
struct gpe_regs *g = &s->gpe; |
|
469 |
|
|
466 | 470 |
switch (addr) { |
467 | 471 |
case GPE_BASE: |
468 | 472 |
case GPE_BASE + 1: |
... | ... | |
502 | 506 |
|
503 | 507 |
static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val) |
504 | 508 |
{ |
505 |
struct gpe_regs *g = opaque; |
|
509 |
PIIX4PMState *s = opaque; |
|
510 |
struct gpe_regs *g = &s->gpe; |
|
511 |
|
|
506 | 512 |
switch (addr) { |
507 | 513 |
case GPE_BASE: |
508 | 514 |
case GPE_BASE + 1: |
... | ... | |
514 | 520 |
break; |
515 | 521 |
default: |
516 | 522 |
break; |
517 |
} |
|
523 |
} |
|
524 |
|
|
525 |
pm_update_sci(s); |
|
518 | 526 |
|
519 | 527 |
PIIX4_DPRINTF("gpe write %x <== %d\n", addr, val); |
520 | 528 |
} |
... | ... | |
581 | 589 |
|
582 | 590 |
static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s) |
583 | 591 |
{ |
584 |
struct gpe_regs *gpe = &s->gpe; |
|
585 | 592 |
struct pci_status *pci0_status = &s->pci0_status; |
586 | 593 |
|
587 |
register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, gpe);
|
|
588 |
register_ioport_read(GPE_BASE, 4, 1, gpe_readb, gpe);
|
|
594 |
register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, s);
|
|
595 |
register_ioport_read(GPE_BASE, 4, 1, gpe_readb, s);
|
|
589 | 596 |
|
590 | 597 |
register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, pci0_status); |
591 | 598 |
register_ioport_read(PCI_BASE, 8, 4, pcihotplug_read, pci0_status); |
... | ... | |
621 | 628 |
} else { |
622 | 629 |
disable_device(s, slot); |
623 | 630 |
} |
624 |
if (s->gpe.en & 2) { |
|
625 |
qemu_set_irq(s->irq, 1); |
|
626 |
qemu_set_irq(s->irq, 0); |
|
627 |
} |
|
631 |
|
|
632 |
pm_update_sci(s); |
|
633 |
|
|
628 | 634 |
return 0; |
629 | 635 |
} |
Also available in: Unified diff