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