[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] Re: "ACPI: Unable to start the ACPI Interpreter"



On Tue, Jun 28, 2011 at 11:33:17AM -0700, Liwei wrote:
> On 29 June 2011 02:12, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> wrote:
> > On Tue, Jun 28, 2011 at 05:09:55AM +0800, Liwei wrote:
> >> Hmm, here's the mapped IRQ list, interestingly IRQ 20 is on the list but 
> >> not 9?
> >
> > Looks like it. You are also in luck - I found a machine that has the same
> > exact problem and while it does not bail out when installing the ACPI 
> > interpreter
> > it does get the wrong IRQs for the rest of the devices.
> >
> > In other words, I can reproduce it here.
> >
> 
> Good to hear.
> 
> Would you be able to CC me when you have a patch available so that I

Of course.
> can test it out? I found out that the 3.0 kernel is somehow much more

 Here it is.

diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index aac866e..09077b3 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -344,6 +344,7 @@ static int xen_register_pirq(u32 gsi, int triggering)
        struct physdev_map_pirq map_irq;
        int shareable = 0;
        char *name;
+       bool gsi_override = false;
 
        if (!xen_pv_domain())
                return -1;
@@ -360,11 +361,23 @@ static int xen_register_pirq(u32 gsi, int triggering)
        if (pirq < 0)
                goto out;
 
-       irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
+       /* We are installing the ACPI SCI */
+       if (gsi == acpi_sci_override_gsi) {
+               /* Check whether the GSI != IRQ */
+               acpi_gsi_to_irq(gsi, &irq);
+               printk(KERN_DEBUG "ACPI SCI GSI is %d, and ACPI IRQ thinks it 
is %d\n", gsi, irq);
+               if (irq != gsi)
+                       /* Bugger, we MUST have that IRQ. */
+                       gsi_override = true;
+       }
+       if (gsi_override)
+               irq = xen_bind_pirq_gsi_to_irq(irq, pirq, shareable, name);
+       else
+               irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
        if (irq < 0)
                goto out;
 
-       printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq);
+       printk(KERN_DEBUG "xen: --> pirq=%d -> gsi=%d -> irq=%d\n", pirq, gsi, 
irq);
 
        map_irq.domid = DOMID_SELF;
        map_irq.type = MAP_PIRQ_TYPE_GSI;
@@ -414,6 +427,7 @@ static __init void xen_setup_acpi_sci(void)
        int rc;
        int trigger, polarity;
        int gsi = acpi_sci_override_gsi;
+       int irq = gsi;
 
        if (!gsi)
                return;
@@ -426,12 +440,14 @@ static __init void xen_setup_acpi_sci(void)
        }
        trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
        polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
-       
+
+       acpi_gsi_to_irq(gsi, &irq);
+
        printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d "
-                       "polarity=%d\n", gsi, trigger, polarity);
+                       "polarity=%d irq %d\n", gsi, trigger, polarity, irq);
 
        gsi = xen_register_gsi(gsi, trigger, polarity);
-       printk(KERN_INFO "xen: acpi sci %d\n", gsi);
+       printk(KERN_INFO "xen: acpi sci %d -> irq %d\n", gsi, irq);
 
        return;
 }

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.