https://bugzilla.kernel.org/show_bug.cgi?id=68291

--- Comment #23 from Mathias Nyman <[email protected]> ---
(In reply to Ashok Raj from comment #22)

> looking at the dsl for GPIO below, the IRQ number is 0x31... why would linux
> allocate 0x10 instead? 
> 
>                     Interrupt (ResourceConsumer, Level, ActiveLow, Shared,
> ,, )
>                     {
>                         0x00000031,
>                     }

This is the interrupt resource the gpio controller uses, this is not the issue
in this case.

the GPIO controller works as an interrupt controller, the gpio controller is
connected to only one interrupt, and driver only listens to that one (0x31).
but the driver provides lots of interrupts to the system, one for each gpio
line if needed. So when interrupt 0x31 is called the gpio interrupt handler
checks which pin was asserted and calls the handler for that specific
interrupt.

For example when sd card detection is connected to GPIO pin 38, the sd card
driver asks the gpio driver what interrupt that corresponds to by calling
gpio_to_irq().  gpio_to_irq() in the gpio driver maps gpio 38 to a irq
descriptor by finding a free interrupt descriptor from a global bitmap of all
descriptor. Once a free one is found it is returned to SD card driver. for
example descriptor 40

SD card driver registers a handler for irq 40. When a sd card is inserted gpio
line 38 is set high, the gpio controller fires an interrupt on (0x31), gpio
driver interrupt handler is called, it checks which gpio was asserted (was line
38, it finds which interrupts gpio 38 is mapped to (40) and calls the interrupt
handler for 40 (the interrupt handler registered by SD card)

Issue here is that on x86 the ioapic used to be the only one providing
interrupts (well, int these ranges atleast I think) so ioapic code assumes that
if a intrrupt descriptor is occupied in the global bitmap it belongs to an
ioapic, and it accesses data that is only valid for ioapics which causes
failures.

In this specific case we collide on interrupt descriptor 16. And it turns out
the graphic driver does not even need interrupt.

So this needs to be fixed in two places:
1. make sure io_apic code does not access data in interrupt descriptors that
belong to other "interrupt controllers", eg gpio than io_apic.

2. fix graphics driver / bios to not request the not needed irq 16 (graphics
driver use msi interrupts)

-Mathias

-- 
You are receiving this mail because:
You are watching the assignee of the bug.

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
acpi-bugzilla mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla

Reply via email to