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

Re: [Xen-devel] pvops acpi and xen 4 issues



On 03/10/2010 11:44 AM, M. Nunberg wrote:
On Mon, 2010-03-08 at 15:02 -0500, Konrad Rzeszutek Wilk wrote:
make sure it was indeed being called. I think this might have something
to do with what Jeremy mentioned about my SCI being on 9 and not 20, but
honestly, I haven't a clue. I have the full log if you need more.
I am attaching a debug patch that will help in troubleshooting this and
potentially fix this.

Couple of things:
  1). Turn the Enable ACPI SCI in the BIOS to Enable.

  2). Compile your Linux kernel with the attached patch and these two options:
CONFIG_ACPI_DEBUG=y
CONFIG_ACPI_DEBUG_FUNC_TRACE=y

Do use your old .config that was triggering the failure in the first
case.

  3). Edit your kernel line to have:
debug  initcall_debug acpi.debug_level=0xffffffff acpi.debug_layer=0x2 
xen_sci=fun

  4). Boot your kernel. You should see something like this:

... snip..
[    0.000000] acpi_sci_ioapic_setup: 0 ->  9 (3, 1)
acpi_sci_ioapic_setup: 0 ->  20 (3, 3)
...
[    1.483956] xen_setup_pirqs: FADT.SCI: 9 ACPI.SCI:9. Using 9 IRQ,
[    1.490025] xen_setup_pirqs: SCI override: trigger: level->level,
polarity: high->high
[    1.497824] xen: registering gsi 9 triggering 0 polarity 0
[    1.503282] xen_allocate_pirq: returning irq 9 for gsi 9
[    1.508572] xen: -->  irq=9
NR_IRQS:4352 nr_irqs:4096
xen: registering gsi 0 triggering 1 polarity 0
xen: -->  irq=0
Already setup the GSI :0
xen: registering gsi 1 triggering 1 polarity 0
xen: -->  irq=1
Already setup the GSI :1
xen: registering gsi 2 triggering 1 polarity 0
xen: -->  irq=2
Already setup the GSI :2
xen: registering gsi 3 triggering 1 polarity 0
xen: -->  irq=3
Already setup the GSI :3
xen: registering gsi 4 triggering 1 polarity 0
xen: -->  irq=4
Already setup the GSI :4
xen: registering gsi 5 triggering 1 polarity 0
xen: -->  irq=5
Already setup the GSI :5
xen: registering gsi 6 triggering 1 polarity 0
xen: -->  irq=6
Already setup the GSI :6
xen: registering gsi 7 triggering 1 polarity 0
xen: -->  irq=7
Already setup the GSI :7
xen: registering gsi 8 triggering 1 polarity 0
xen: -->  irq=8
Already setup the GSI :8
xen: registering gsi 9 triggering 1 polarity 0
xen: -->  irq=9
Already setup the GSI :9
xen: registering gsi 10 triggering 1 polarity 0
xen: -->  irq=10
Already setup the GSI :10
xen: registering gsi 11 triggering 1 polarity 0
xen: -->  irq=11
Already setup the GSI :11
xen: registering gsi 12 triggering 1 polarity 0
xen: -->  irq=12
Already setup the GSI :12
xen: registering gsi 13 triggering 1 polarity 0
xen: -->  irq=13
Already setup the GSI :13
xen: registering gsi 14 triggering 1 polarity 0
xen: -->  irq=14
Already setup the GSI :14
xen: registering gsi 15 triggering 1 polarity 0
xen: -->  irq=15
Already setup the GSI :15
xen_setup_pirqs: FADT.SCI: 9 ACPI.SCI:20. Using IRQ 20.
xen_setup_pirqs: acpi_get_override_irq fails for 20.
xen_setup_pirqs: SCI override: trigger: level->edge, polarity: high->low
xen: registering gsi 20 triggering 0 polarity 1
   alloc irq_desc for 20 on node 0
   alloc kstat_irqs on node 0
xen: -->  irq=20
(XEN) IOAPIC[0]: Set PCI routing entry (8-20 ->  0x98 ->  IRQ 20 Mode:1 
Active:1)
Console: colour VGA+ 80x25
....
[    1.511254] Already setup the GSI :9
And as you predicted, this line did not show up for 20
.. and then later:
[    3.058890] ACPI: Core revision 20090903
[    3.084701] acpi_early_init: FADT.SCI = 9
s/9/20, again
.. and then lots of ACPI debug stuff.
In the log.
Thought in your case, the IRQ that should show up is 20 and the 'Already
setup the GSI :20' might not show up.

Please e-mail the full serial log (even if it does work).
All in all, I think it did work. From a novice's perspective (like mine), This 
message:
        ACPI: Interpreter enabled
was missing when SCI was enabled in the BIOS, but with your patch, it is 
present.
I am attaching the full log as a bz2 compressed textfile, as the last time I 
tried to send something with wide lines, something gobbled it up, though I 
think the relevant info is inline

Could you try this patch? (Already committed to xen/next, as it works for me.)

Thanks,
    J

From 06ab9af4e7beaf2bcafae4e390b4a51908dfd29e Mon Sep 17 00:00:00 2001
From: Jeremy Fitzhardinge<jeremy.fitzhardinge@xxxxxxxxxx>
Date: Wed, 10 Mar 2010 15:44:21 -0800
Subject: [PATCH] Merge branch 'xen/dom0/apic-next' into xen/next

* xen/dom0/apic-next:
  xen: parse MADT to get information to set up ACPI SCI

: abulafia:pts/0; git show d02659fd69312e5ff9890c1c7ca2bea9a782ad57
From d02659fd69312e5ff9890c1c7ca2bea9a782ad57 Mon Sep 17 00:00:00 2001
From: Jeremy Fitzhardinge<jeremy.fitzhardinge@xxxxxxxxxx>
Date: Wed, 10 Mar 2010 13:07:15 -0800
Subject: [PATCH] xen: parse MADT to get information to set up ACPI SCI

If the SCI is not in its traditional place of irq 9/gsi 9, then we
need to set it up properly.

Signed-off-by: Jeremy Fitzhardinge<jeremy.fitzhardinge@xxxxxxxxxx>

diff --git a/arch/x86/xen/pci.c b/arch/x86/xen/pci.c
index f999ad8..a2accf4 100644
--- a/arch/x86/xen/pci.c
+++ b/arch/x86/xen/pci.c
@@ -70,6 +70,97 @@ int xen_register_gsi(u32 gsi, int triggering, int polarity)
        return irq;
 }

+#ifdef CONFIG_ACPI
+#define BAD_MADT_ENTRY(entry, end) (                                       \
+               (!entry) || (unsigned long)entry + sizeof(*entry)>  end ||  \
+               ((struct acpi_subtable_header *)entry)->length<  sizeof(*entry))
+
+
+static int __init
+xen_acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
+                          const unsigned long end)
+{
+       struct acpi_madt_interrupt_override *intsrc = NULL;
+
+       intsrc = (struct acpi_madt_interrupt_override *)header;
+
+       if (BAD_MADT_ENTRY(intsrc, end))
+               return -EINVAL;
+
+       acpi_table_print_madt_entry(header);
+
+       if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) {
+               int gsi;
+               int trigger, polarity;
+
+               trigger = intsrc->inti_flags&  ACPI_MADT_TRIGGER_MASK;
+               polarity = intsrc->inti_flags&  ACPI_MADT_POLARITY_MASK;
+
+               /* Command-line over-ride via acpi_sci= */
+               if (acpi_sci_flags&  ACPI_MADT_TRIGGER_MASK)
+                       trigger = acpi_sci_flags&  ACPI_MADT_TRIGGER_MASK;
+
+               if (acpi_sci_flags&  ACPI_MADT_POLARITY_MASK)
+                       polarity = acpi_sci_flags&  ACPI_MADT_POLARITY_MASK;
+
+               printk("xen: sci override: source_irq=%d global_irq=%d trigger=%x 
polarity=%x\n",
+                       intsrc->source_irq, intsrc->global_irq,
+                       trigger, polarity);
+
+               switch (polarity) {
+               case ACPI_MADT_POLARITY_CONFORMS:
+               case ACPI_MADT_POLARITY_ACTIVE_LOW:
+                       polarity = ACPI_ACTIVE_LOW;
+                       break;
+
+               case ACPI_MADT_POLARITY_ACTIVE_HIGH:
+                       polarity = ACPI_ACTIVE_HIGH;
+                       break;
+
+               default:
+                       return 0;
+               }
+
+               switch (trigger) {
+               case ACPI_MADT_TRIGGER_CONFORMS:
+               case ACPI_MADT_TRIGGER_LEVEL:
+                       trigger = ACPI_LEVEL_SENSITIVE;
+                       break;
+
+               case ACPI_MADT_TRIGGER_EDGE:
+                       trigger = ACPI_EDGE_SENSITIVE;
+                       break;
+
+               default:
+                       return 0;
+               }
+
+               gsi = xen_register_gsi(intsrc->global_irq,
+                                      trigger, polarity);
+               /*
+                * stash over-ride to indicate we've been here
+                * and for later update of acpi_gbl_FADT
+                */
+               acpi_sci_override_gsi = gsi;
+
+               printk("xen: acpi sci %d\n", gsi);
+       }
+
+       return 0;
+}
+
+static __init void xen_setup_acpi_sci(void)
+{
+  acpi_table_parse_madt(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE,
+                       xen_acpi_parse_int_src_ovr,
+                       nr_irqs);
+}
+#else
+static __init void xen_setup_acpi_sci(void)
+{
+}
+#endif
+
 void __init xen_setup_pirqs(void)
 {
        int irq;
@@ -91,6 +182,8 @@ void __init xen_setup_pirqs(void)
                        trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE,
                        polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH);
        }
+
+       xen_setup_acpi_sci();
 }

 #ifdef CONFIG_PCI_MSI



_______________________________________________
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®.