Avi Kivity wrote:
> Aurelien Jarno wrote:
>   
>> On Fri, Oct 05, 2007 at 03:25:05PM +0200, Laurent Vivier wrote:
>>   
>>     
>>> Digging in the FreeBSD sources I found the origin of the problem:
>>>
>>> I added some ACPI traces:
>>>
>>>    rsirq-0234 [13] RsIrqResource         : Invalid interrupt 
>>> polarity/trigger in
>>>  resource list, 10
>>>
>>> Which is in /sys/contrib/dev/acpica/rsirq.c :
>>>
>>>
>>>        /*
>>>          * Check for HE, LL interrupts
>>>          */
>>>         switch (Temp8 & 0x09)
>>>         {
>>>         case 0x01: /* HE */
>>>             OutputStruct->Data.Irq.EdgeLevel = ACPI_EDGE_SENSITIVE;
>>>             OutputStruct->Data.Irq.ActiveHighLow = ACPI_ACTIVE_HIGH;
>>>             break;
>>>
>>>         case 0x08: /* LL */
>>>             OutputStruct->Data.Irq.EdgeLevel = ACPI_LEVEL_SENSITIVE;
>>>             OutputStruct->Data.Irq.ActiveHighLow = ACPI_ACTIVE_LOW;
>>>             break;
>>>
>>>         default:
>>>             /*
>>>              * Only _LL and _HE polarity/trigger interrupts
>>>              * are allowed (ACPI spec, section "IRQ Format")
>>>              * so 0x00 and 0x09 are illegal.
>>>              */
>>>             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
>>>                 "Invalid interrupt polarity/trigger in resource list, 
>>> %X\n", Tem
>>> p8));
>>>             return_ACPI_STATUS (AE_BAD_DATA);
>>>         }
>>>
>>>     
>>>       
>> Good catch!
>>
>>   
>>     
>>> Conclusion, in kvm-userspace/bios/acpi-dsdt.dsl, if you have "ActiveHigh", 
>>> you
>>> must have "Edge" instead of "Level":
>>>
>>> -                    IRQ (Level, ActiveHigh, Shared)
>>> +                    IRQ (Edge, ActiveHigh, Shared)
>>>
>>> But I found nothing in ACPI specification explaining the freeBSD behavior.
>>>
>>>     
>>>       
>> It's actually described page 200 of the specifications (page 216 in 
>> ACPIspec30.pdf):
>>
>>   Note: This descriptor is meant for describing interrupts that are 
>> connected to PIC-compatible
>>   interrupt controllers, which can only be programmed for 
>> Active-High-Edge-Triggered or Active-
>>   Low-Level-Triggered interrupts. Any other combination is illegal. The 
>> Extended Interrupt
>>   Descriptor can be used to describe other combinations.
>>
>>
>>   
>>     
>>> Avi, if you think this anlysis is correct I can provide the patch changing
>>> "Level" to "Edge"...
>>>
>>>     
>>>       
>> It looks like the solution is either to describe the IRQ with an 
>> "Extended Interrupt Descriptor" or to change this value to one of the 
>> two allowed values. In the later case we have to make sure it is
>> consistent with the way the PIC works.
>>
>>   
>>     
>
> Edge-triggered means we can't share interrupt lines.  Since we have only 
> two or three that limits the number of devices we can have.
>
> So I'd like to try moving to active low pci interrupts, and implementing 
> polarity in the qemu ioapic.  It's probably closer to real hardware anyway.
>
>
>   

The docs are conflicting.  The piix3 spec describes the pic irqs 
(PIRQ[A-D]#) as active low, but the internal pic describes level 
interrupts as active high.  There's probably an inverter in there somewhere.


-- 
Any sufficiently difficult bug is indistinguishable from a feature.


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to