Le mer. 20 déc. 2023 à 00:50, Sébastien Chaumat <euidz...@gmail.com> a écrit :
> > > Le mer. 20 déc. 2023 à 00:11, Sébastien Chaumat <euidz...@gmail.com> a > écrit : > >> >> >> Le mer. 20 déc. 2023 à 00:06, Sébastien Chaumat <euidz...@gmail.com> a >> écrit : >> >>> >>> >>> Le mar. 19 déc. 2023 à 20:03, Sébastien Chaumat <euidz...@gmail.com> a >>> écrit : >>> >>>> Le mar. 19 déc. 2023 à 16:15, Sébastien Chaumat <euidz...@gmail.com> a >>>> écrit : >>>> > >>>> > I did add an extra printk in PHYSDEVOP_setup_gsi >>>> > so the "first one" is my printk (available in xl dmesg) >>>> > the second message is from xen_register_gsi (from linux kernel) >>>> > >>>> > Le mar. 19 déc. 2023 à 14:15, Jan Beulich <jbeul...@suse.com> a >>>> écrit : >>>> > > >>>> > > On 18.12.2023 17:21, Sébastien Chaumat wrote: >>>> > > >>>>> On 05.12.2023 21:31, Sébastien Chaumat wrote: >>>> > > >>>>>>> [ 2.464598] amd_gpio AMDI0030:00: failed to enable >>>> wake-up interrupt >>>> > > >>>>>> >>>> > > >>>>>> Is it expected that IRQ7 goes from fasteoi (kernel 6.6.4 ) to >>>> > > >>>>>> ioapic-edge and IRQ9 to ioapic-level ? >>>> > > >>>>>> >>>> > > >>>>>> IR-IO-APIC 7-fasteoi pinctrl_amd >>>> > > >>>>>> IR-IO-APIC 9-fasteoi acpi >>>> > > >>>>>> >>>> > > >>>>>> to (xen 4.18.0) >>>> > > >>>>>> >>>> > > >>>>>> xen-pirq -ioapic-edge pinctrl_amd >>>> > > >>>>>> xen-pirq -ioapic-level acpi >>>> > > >>>>>> >>>> > > >>>>>> ? >>>> > > >>> >>>> > > > >>>> > > >>> This look similar to >>>> > > >>> https://yhbt.net/lore/all/20201006044941.fdjsp346kc5thyzy@Rk/t/ >>>> > > >>> >>>> > > >>> This issue seems that IRQ 7 (the GPIO controller) is natively >>>> fasteoi >>>> > > >>> (so level type) while in xen it is mapped to oapic-edge >>>> instead of >>>> > > >>> oapic-level >>>> > > >>> as the SSDT indicates : >>>> > > >>> >>>> > > >>> Device (GPIO) >>>> > > >>> >>>> > > >>> { >>>> > > >>> Name (_HID, "AMDI0030") // _HID: Hardware ID >>>> > > >>> Name (_CID, "AMDI0030") // _CID: Compatible ID >>>> > > >>> Name (_UID, Zero) // _UID: Unique ID >>>> > > >>> Method (_CRS, 0, NotSerialized) // _CRS: Current >>>> Resource Settings >>>> > > >>> { >>>> > > >>> Name (RBUF, ResourceTemplate () >>>> > > >>> { >>>> > > >>> Interrupt (ResourceConsumer, Level, ActiveLow, >>>> Shared, ,, ) >>>> > > >>> { >>>> > > >>> 0x00000007, >>>> > > >>> } >>>> > > >>> Any idea why ? >>>> > > >> >>>> > > >> Information coming from AML is required to be handed down by >>>> Dom0 to Xen. >>>> > > >> May want checking that (a) Dom0 properly does so and (b) Xen >>>> doesn't screw >>>> > > >> up in consuming that data. See PHYSDEVOP_setup_gsi. I wonder if >>>> this is >>>> > > >> specific to it being IRQ7 which GPIO uses, as at the (master) >>>> PIC IRQ7 is >>>> > > >> also the spurious vector. You may want to retry with the tip of >>>> the 4.17 >>>> > > >> branch (soon to become 4.17.3) - while it doesn't look very >>>> likely to me >>>> > > >> that recent backports there were related, it may still be that >>>> they make >>>> > > >> a difference. >>>> > > >> >>>> > > > >>>> > > > testing with 4.17.3: >>>> > > > >>>> > > > Adding some printk in PHYSDEVOP_setup_gsi, I see (in xl dmesg) >>>> that >>>> > > > (XEN) PHYSDEVOP_setup_gsi setup_gsi : gsi: 7 triggering: 1 >>>> polarity: 1 >>>> > > > >>>> > > > but later on in dmesg I see : >>>> > > > [ 1.747958] xen: registering gsi 7 triggering 0 polarity 1 >>>> > > >>>> > > Linux has exactly one place where this message is logged from, and >>>> that's >>>> > > ahead of it calling PHYSDEVOP_setup_gsi. Since you said "later", >>>> can you >>>> > > confirm that actually you see two instances of the Xen message and >>>> two >>>> > > instances of the Linux one (each of them with respectively matching >>>> > > trigger and polarity values)? Or are we indeed observing what would >>>> look >>>> > > to be corruption of a hypercall argument? >>>> > > >>>> > > If there were two calls, it would be important to realize that Xen >>>> will >>>> > > respect only the first one. >>>> > > >>>> > > Jan >>>> >>>> Adding a printk to catch the gsi immediately before the hypercall in >>>> linux/arch/x86/pci/xen.c >>>> >>>> #ifdef CONFIG_XEN_PV_DOM0 >>>> static int xen_register_gsi(u32 gsi, int triggering, int polarity) >>>> { >>>> int rc, irq; >>>> struct physdev_setup_gsi setup_gsi; >>>> >>>> if (!xen_pv_domain()) >>>> return -1; >>>> >>>> printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", >>>> gsi, triggering, polarity); >>>> >>> >>> there we have : >>> [ 1.848051] xen: registering gsi 7 triggering 0 polarity 1 >>> >>> then in the next call : >>> >>> irq = xen_register_pirq(gsi, triggering, true); >>> >>> >>> I added a printk at the very beginning : >>> >>> static int xen_register_pirq(u32 gsi, int triggering, bool set_pirq) >>> { >>> int rc, pirq = -1, irq; >>> struct physdev_map_pirq map_irq; >>> int shareable = 0; >>> char *name; >>> >>> printk(KERN_DEBUG "xen_register_pirq start gsi %u triggering %d >>> set_pirq %d\n", gsi, triggering, set_pirq) >>> >>> And I get in this printk result for IRQ7 : triggering=1 while it was >>> passed with value 0 in the call !? >>> >> >> Sorry bad format %d instead of %i for triggering ... >> > > So I replaced the format with %i and suprise : > > There are 2 calls to xen_register_pirq as I can see 2 messages per IRQ > > the first call is right after the message "NR_IRQS: ..."from > early_irq_init() ( kernel/irq/irqdec.c ) > > I see : > xen_register_pirq start gsi 7 triggering 1 set_pirq 1 ... so in > xen_register_pirq() > Then I get the message "Before PHYSDEVOPS_setup_gsi) proving we are called > by xen_register_gsi() > > Then right after the message "ACPI: 26 ACPI AML tables successfully > acquired and loaded" > > I get again, but with reversed triggering : > xen: registering gsi 7 triggering 0 polarity 1 > xen_register_pirq start gsi 7 triggering 0 set_pirq 1 > Before PHYSDEVOPS_setup_gsi ... > > So once again a call to xen_register_gsi() > I had to triple check: The first call is from xen_register_pirq() and seem to originate from early_irq_init() : triggering is 1 in this first call the HYPERVISOR_physdev_ops is called with triggering 1 shareable 0 The second call is from xen_register_pirq() called from xen_register_gsi() : trigger=0 polarity 1 at the start of xen_register_pirq() but then trigger=1 polarity=1 just before the call to PHYSDEVOPS_setup_gsi