On 2016/2/4 0:01, Wei Huang wrote: > > On 2/3/16 04:46, Peter Maydell wrote: >> > On 3 February 2016 at 07:15, Michael Tokarev <m...@tls.msk.ru> wrote: >>> >> 28.01.2016 21:22, Wei Huang wrote: >>>> >>> When QEMU is hook'ed up with libvirt/virsh, the first ACPI reboot >>>> >>> request will succeed; but the following shutdown/reboot requests >>>> >>> fail to trigger VMs to react. Notice that in mach-virt machine >>>> >>> model GPIO is defined as edge-triggered and active-high in ACPI. >>>> >>> This patch changes the behavior of powerdown notifier from PULLUP >>>> >>> to PULSE. It solves the problem described above (i.e. reboot >>>> >>> continues to work). >>> >> >>> >> So, what's the outcome of this? :) >> > >> > This patch is definitely wrong. The patch to fix up the >> > gpio reset stuff is definitely the right idea. Whether it >> > fixes the reported failure or some further change is also >> > needed is currently unclear. > I will NAK this one for now. Please see V2 patch, which is necessary. In > the meanwhile, I think there is a problem with pulling-up only in > current implementation. Let me debug Shannon's DT problem first. > Hi Wei,
The reason of DT problem is that when we use qemu_irq_pulse(i.e qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 1); qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 0);), it will inject the GPIO interrupt until it executes qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 0) because the qemu main thread is serialized and then guest will get the button value as zero, so it's failed to report the input event. See gpio_keys_gpio_report_event in drivers/input/keyboard/gpio_keys.c int state = gpio_get_value_cansleep(button->gpio); The state is always zero. The solution I think would be making the each qemu_set_irq(qdev_get_gpio_in(pl061_dev, 3), 1 or 0) cloud inject an interrupt to guest. Thanks, -- Shannon