Hi Avi, On Thu, Jan 03, 2008 at 11:17:50PM +0200, Avi Kivity wrote: > While pci interrupts are documented as active high, the documentation for > the piix4 pic elcr registers suggests piix4 level-triggered interrupts are > active high. So there is some inconsistency somewhere involving qemu > interrupt generation (which IIRC treats all interrupts as active high), the > ioapic (qemu doesn't implement polarity), bios setup, and the acpi dsdt. We currently specify INT10 as active high in the dsl so I added an override entry to the madt an now the OS knows about it and things work as expected - we this be o.k. until all the IRQ setup gets a revamp:
>From 7950892de473d42ce57e0727594190b4bfafab14 Mon Sep 17 00:00:00 2001 From: Guido Guenther <[EMAIL PROTECTED]> Date: Fri, 4 Jan 2008 19:26:33 +0100 Subject: [PATCH] int 10 is currently active high so add a proper interrupt override entry to the MADT so the OS knows about it. Fixes the ACPI powerbutton and should also fix the PM timer. diff --git a/bios/rombios32.c b/bios/rombios32.c index 7a96ece..99f7d23 100755 --- a/bios/rombios32.c +++ b/bios/rombios32.c @@ -1181,6 +1181,14 @@ struct madt_io_apic * lines start */ }; +struct madt_intsrcovr { + APIC_HEADER_DEF + uint8_t bus; + uint8_t source; + uint32_t gsi; + uint16_t flags; +}; + #include "acpi-dsdt.hex" static inline uint16_t cpu_to_le16(uint16_t x) @@ -1271,9 +1279,10 @@ void acpi_bios_init(void) addr = (addr + 7) & ~7; madt_addr = addr; - madt_size = sizeof(*madt) + + madt_size = sizeof(*madt) + sizeof(struct madt_processor_apic) * smp_cpus + - sizeof(struct madt_io_apic); + sizeof(struct madt_io_apic) + + sizeof(struct madt_intsrcovr); madt = (void *)(addr); addr += madt_size; @@ -1335,6 +1344,7 @@ void acpi_bios_init(void) { struct madt_processor_apic *apic; struct madt_io_apic *io_apic; + struct madt_intsrcovr *intsrcovr; memset(madt, 0, madt_size); madt->local_apic_address = cpu_to_le32(0xfee00000); @@ -1355,6 +1365,15 @@ void acpi_bios_init(void) io_apic->address = cpu_to_le32(0xfec00000); io_apic->interrupt = cpu_to_le32(0); + /* int 10 (SCI) is active high atm */ + intsrcovr = (struct madt_intsrcovr*)(io_apic + 1); + memset(intsrcovr, 0, sizeof(*intsrcovr)); + intsrcovr->type = APIC_XRUPT_OVERRIDE; + intsrcovr->length = sizeof(*intsrcovr); + intsrcovr->source = 10; + intsrcovr->gsi = 10; + intsrcovr->flags = 0xd; + acpi_build_table_header((struct acpi_table_header *)madt, "APIC", madt_size); } Cheers, -- Guido ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel