[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 00/11] hw/arm: Make virt board secure powerdown/reset work
From: |
Peter Maydell |
Subject: |
[PATCH 00/11] hw/arm: Make virt board secure powerdown/reset work |
Date: |
Fri, 2 Jul 2021 11:40:07 +0100 |
This series fixes a bug reported by Maxim where the virt board's
functionality intended to allow a guest in the Secure world to
shutdown or reset the system was broken. Patch 1 from Maxim (seen
already on-list) fixes a silly cut-n-paste error in the gpio-pwr
device. The rest of the series fixes the trickier part of the bug.
The bug is caused because the gpio-pwr device and the virt board
wiring assume that the GPIO outputs used to trigger shutdown and reset
are active-high. However, for the PL061 GPIO lines default to inputs,
and our PL061 implementation currently hardcodes "assume lines have
pullup resistors so that when configured for input they act like a
logical 1 output". The only reason this doesn't mean that we
immediately shutdown/reset on startup is a second PL061 bug where we
don't assert the GPIO lines to the active-1-pullup behaviour on reset,
but instead do this the first time that pl061_active() is called,
which is typically when the guest touches the PL061. It happens that
OVMF doesn't do that until it decides it actually wants to do a
shutdown, so the bug was manifesting as "we got a reset instead of
shutdown".
I did an audit of our PL061 users in-tree:
* highbank, versatilepb create PL061 devices but don't connect any of
the GPIO inputs or outputs
* realview, sbsa_ref connect only inputs, never outputs
* virt has an NS PL061 which is used only for inputs, and an S PL061
which is used for outputs (and doesn't work correctly, as described
above)
* stellaris uses its PL061s for both inputs and outputs; the output
handling is for the SSI device chip selects (and is not really
correctly modelling what the hardware does). These PL061s are the
"Luminary" variant.
The Realview and Versatile boards really do want pull-up behaviour (as
documented in their TRMs). For 'virt' and 'sbsa_ref' we can define
whatever behaviour we like; 'virt' needs pull-down unless we want to
redesign the gpio-pwr device, as noted above. The Luminary PL061s in
the stellaris board have extra registers not provided in the stock
PL061 which let the guest control whether to enable pullup or pulldown
or to leave the line truly floating. I don't know what highbank
hardware needs, but since it doesn't connect any inputs or outputs it
doesn't really matter.
These patches make the implementation honour the Luminary PL061 PUR
and PDR registers, and add QOM properties so that boards using the
stock PL061 can configure whether the lines are pullup, pulldown, or
floating. We default to pullup to retain existing behaviour, and make
the virt board explicitly configure the pulldown it wants. Once that
is all in place, we can make the PL061 assert the GPIO lines to the
pullup/pulldown state on reset (by converting it to 3-phase reset).
A few patches early in the series do some cleanup of the PL061:
converting it to tracepoints, some minor refactoring, and a
documentation patch. The last two patches are comments only, and
document a couple of issues with our stellaris board model which I
noticed while I was making sure I hadn't broken it with my PL061
changes. Given that the stellaris board is old and not very useful
these days, I don't want to put in a lot of effort trying to "fix"
things which aren't causing any issues with guest images we know
about, but I did want to record what I'd figured out from various data
sheets so it doesn't get forgotten...
thanks
-- PMM
Maxim Uvarov (1):
hw/gpio/gpio_pwr: use shutdown function for reboot
Peter Maydell (10):
hw/gpio/pl061: Convert DPRINTF to tracepoints
hw/gpio/pl061: Clean up read/write offset handling logic
hw/gpio/pl061: Add tracepoints for register read and write
hw/gpio/pl061: Document the interface of this device
hw/gpio/pl061: Honour Luminary PL061 PUR and PDR registers
hw/gpio/pl061: Make pullup/pulldown of outputs configurable
hw/arm/virt: Make PL061 GPIO lines pulled low, not high
hw/gpio/pl061: Convert to 3-phase reset and assert GPIO lines
correctly on reset
hw/gpio/pl061: Document a shortcoming in our implementation
hw/arm/stellaris: Expand comment about handling of OLED chipselect
hw/arm/stellaris.c | 56 ++++++-
hw/arm/virt.c | 3 +
hw/gpio/gpio_pwr.c | 2 +-
hw/gpio/pl061.c | 343 ++++++++++++++++++++++++++++++++++---------
hw/gpio/trace-events | 9 ++
5 files changed, 341 insertions(+), 72 deletions(-)
--
2.20.1
- [PATCH 00/11] hw/arm: Make virt board secure powerdown/reset work,
Peter Maydell <=