[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [BUG]i2c_hid_acpi broken with 4.17.2 on Framework Laptop 13 AMD
Le mar. 19 déc. 2023 à 16:15, Sébastien Chaumat <euidzero@xxxxxxxxx> 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 <jbeulich@xxxxxxxx> 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); irq = xen_register_pirq(gsi, triggering, true); setup_gsi.gsi = gsi; setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); setup_gsi.polarity = (polarity == ACPI_ACTIVE_HIGH ? 0 : 1); printk(KERN_INFO "Before PHYSDEVOP_setup_gsi gsi: %d,triggering: %u, polarity: %u\n", setup_gsi.gsi, setup_gsi.triggering, setup_gsi.polarity); rc = HYPERVISOR_physdev_op(PHYSDEVOP_setup_gsi, &setup_gsi); if (rc == -EEXIST) printk(KERN_INFO "Already setup the GSI :%d\n", gsi); else if (rc) { printk(KERN_ERR "Failed to setup GSI :%d, err_code:%d\n", gsi, rc); } return irq; } I got the following : [ 1.848051] xen: registering gsi 7 triggering 0 polarity 1 [ 1.848056] Before PHYSDEVOP_setup_gsi gsi: 7,triggering: 1, polarity: 1 So the reversal occurs there irq = xen_register_pirq(gsi, triggering, true); Or there : setup_gsi.gsi = gsi; setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); setup_gsi.polarity = (polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |