WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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