diff options
author | Liu Ping Fan <qemulist@gmail.com> | 2013-12-08 17:38:17 +0800 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2013-12-11 20:11:09 +0200 |
commit | 7a10ef51c2397ac4323bc786af02c58b413b5cd2 (patch) | |
tree | 1081bc99a1661c9cb112f681d300f12e4ef7c6a8 /hw/timer | |
parent | 0d63b2dd31464cfccc80bbeedc24e3863fe4c895 (diff) | |
download | qemu-7a10ef51c2397ac4323bc786af02c58b413b5cd2.zip qemu-7a10ef51c2397ac4323bc786af02c58b413b5cd2.tar.gz qemu-7a10ef51c2397ac4323bc786af02c58b413b5cd2.tar.bz2 |
hpet: enable to entitle more irq pins for hpet
Owning to some different hardware design, piix and q35 need
different compat. So making them diverge.
On q35, IRQ2/8 can be reserved for hpet timer 0/1. And pin 16~23
can be assigned to hpet as guest chooses. So we introduce intcap
property to do that.
Consider the compat and piix/q35, we finally have the following
value for intcap: For piix, hpet's intcap is hard coded as IRQ2.
For pc-q35-1.7 and earlier, we use IRQ2 for compat reason. Otherwise
IRQ2, IRQ8, and IRQ16~23 are allowed.
Signed-off-by: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/timer')
-rw-r--r-- | hw/timer/hpet.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c index 0aee2c1..0ec440e 100644 --- a/hw/timer/hpet.c +++ b/hw/timer/hpet.c @@ -73,6 +73,7 @@ typedef struct HPETState { uint8_t rtc_irq_level; qemu_irq pit_enabled; uint8_t num_timers; + uint32_t intcap; HPETTimer timer[HPET_MAX_TIMERS]; /* Memory-mapped, software visible registers */ @@ -663,8 +664,8 @@ static void hpet_reset(DeviceState *d) if (s->flags & (1 << HPET_MSI_SUPPORT)) { timer->config |= HPET_TN_FSB_CAP; } - /* advertise availability of ioapic inti2 */ - timer->config |= 0x00000004ULL << 32; + /* advertise availability of ioapic int */ + timer->config |= (uint64_t)s->intcap << 32; timer->period = 0ULL; timer->wrap_flag = 0; } @@ -713,6 +714,9 @@ static void hpet_realize(DeviceState *dev, Error **errp) int i; HPETTimer *timer; + if (!s->intcap) { + error_printf("Hpet's intcap not initialized.\n"); + } if (hpet_cfg.count == UINT8_MAX) { /* first instance */ hpet_cfg.count = 0; @@ -753,6 +757,7 @@ static void hpet_realize(DeviceState *dev, Error **errp) static Property hpet_device_properties[] = { DEFINE_PROP_UINT8("timers", HPETState, num_timers, HPET_MIN_TIMERS), DEFINE_PROP_BIT("msi", HPETState, flags, HPET_MSI_SUPPORT, false), + DEFINE_PROP_UINT32(HPET_INTCAP, HPETState, intcap, 0), DEFINE_PROP_END_OF_LIST(), }; |