Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hw: gpio: implement gpio-pwr driver for qemu reset/poweroff
Implement gpio-pwr driver to allow reboot and poweroff machine. This is simple driver with just 2 gpios lines. Current use case is to reboot and poweroff virt machine in secure mode. Secure pl066 gpio chip is needed for that. Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> Reviewed-by: Hao Wu <wuhaotsh@google.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
- Loading branch information
Showing
3 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,5 +8,8 @@ config PL061 | |
config GPIO_KEY | ||
bool | ||
|
||
config GPIO_PWR | ||
bool | ||
|
||
config SIFIVE_GPIO | ||
bool |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* GPIO qemu power controller | ||
* | ||
* Copyright (c) 2020 Linaro Limited | ||
* | ||
* Author: Maxim Uvarov <maxim.uvarov@linaro.org> | ||
* | ||
* Virtual gpio driver which can be used on top of pl061 | ||
* to reboot and shutdown qemu virtual machine. One of use | ||
* case is gpio driver for secure world application (ARM | ||
* Trusted Firmware.). | ||
* | ||
* This work is licensed under the terms of the GNU GPL, version 2 or later. | ||
* See the COPYING file in the top-level directory. | ||
* SPDX-License-Identifier: GPL-2.0-or-later | ||
*/ | ||
|
||
/* | ||
* QEMU interface: | ||
* two named input GPIO lines: | ||
* 'reset' : when asserted, trigger system reset | ||
* 'shutdown' : when asserted, trigger system shutdown | ||
*/ | ||
|
||
#include "qemu/osdep.h" | ||
#include "hw/sysbus.h" | ||
#include "sysemu/runstate.h" | ||
|
||
#define TYPE_GPIOPWR "gpio-pwr" | ||
OBJECT_DECLARE_SIMPLE_TYPE(GPIO_PWR_State, GPIOPWR) | ||
|
||
struct GPIO_PWR_State { | ||
SysBusDevice parent_obj; | ||
}; | ||
|
||
static void gpio_pwr_reset(void *opaque, int n, int level) | ||
{ | ||
if (level) { | ||
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); | ||
} | ||
} | ||
|
||
static void gpio_pwr_shutdown(void *opaque, int n, int level) | ||
{ | ||
if (level) { | ||
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); | ||
} | ||
} | ||
|
||
static void gpio_pwr_init(Object *obj) | ||
{ | ||
DeviceState *dev = DEVICE(obj); | ||
|
||
qdev_init_gpio_in_named(dev, gpio_pwr_reset, "reset", 1); | ||
qdev_init_gpio_in_named(dev, gpio_pwr_shutdown, "shutdown", 1); | ||
} | ||
|
||
static const TypeInfo gpio_pwr_info = { | ||
.name = TYPE_GPIOPWR, | ||
.parent = TYPE_SYS_BUS_DEVICE, | ||
.instance_size = sizeof(GPIO_PWR_State), | ||
.instance_init = gpio_pwr_init, | ||
}; | ||
|
||
static void gpio_pwr_register_types(void) | ||
{ | ||
type_register_static(&gpio_pwr_info); | ||
} | ||
|
||
type_init(gpio_pwr_register_types) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters