qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCHv8 3/3] arm-virt: add secure pl061 for reset/power down


From: Andrew Jones
Subject: Re: [PATCHv8 3/3] arm-virt: add secure pl061 for reset/power down
Date: Fri, 22 Jan 2021 09:29:26 +0100

On Wed, Jan 20, 2021 at 12:27:48PM +0300, Maxim Uvarov wrote:
> Add secure pl061 for reset/power down machine from
> the secure world (Arm Trusted Firmware). Connect it
> with gpio-pwr driver.
> 
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>  hw/arm/Kconfig        |  1 +
>  hw/arm/virt.c         | 47 +++++++++++++++++++++++++++++++++++++++++++
>  include/hw/arm/virt.h |  2 ++
>  3 files changed, 50 insertions(+)
> 
> diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
> index 0a242e4c5d..13cc42dcc8 100644
> --- a/hw/arm/Kconfig
> +++ b/hw/arm/Kconfig
> @@ -17,6 +17,7 @@ config ARM_VIRT
>      select PL011 # UART
>      select PL031 # RTC
>      select PL061 # GPIO
> +    select GPIO_PWR
>      select PLATFORM_BUS
>      select SMBIOS
>      select VIRTIO_MMIO
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index c427ce5f81..060a5f492e 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -153,6 +153,7 @@ static const MemMapEntry base_memmap[] = {
>      [VIRT_ACPI_GED] =           { 0x09080000, ACPI_GED_EVT_SEL_LEN },
>      [VIRT_NVDIMM_ACPI] =        { 0x09090000, NVDIMM_ACPI_IO_LEN},
>      [VIRT_PVTIME] =             { 0x090a0000, 0x00010000 },
> +    [VIRT_SECURE_GPIO] =        { 0x090b0000, 0x00001000 },
>      [VIRT_MMIO] =               { 0x0a000000, 0x00000200 },
>      /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size 
> */
>      [VIRT_PLATFORM_BUS] =       { 0x0c000000, 0x02000000 },
> @@ -841,6 +842,43 @@ static void create_gpio_keys(const VirtMachineState *vms,
>                             "gpios", phandle, 3, 0);
>  }
>  
> +#define SECURE_GPIO_POWEROFF 0
> +#define SECURE_GPIO_REBOOT   1
> +
> +static void create_gpio_pwr(const VirtMachineState *vms,

This function is specific to the secure view. I think it should have
"secure" in its name.

> +                            DeviceState *pl061_dev,
> +                            uint32_t phandle)
> +{
> +    DeviceState *gpio_pwr_dev;
> +
> +    /* gpio-pwr */
> +    gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL);

Should this device be in secure memory?

> +
> +    /* connect secure pl061 to gpio-pwr */
> +    qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_REBOOT,
> +                          qdev_get_gpio_in_named(gpio_pwr_dev, "reset", 0));
> +    qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_POWEROFF,
> +                          qdev_get_gpio_in_named(gpio_pwr_dev, "shutdown", 
> 0));
> +
> +    qemu_fdt_add_subnode(vms->fdt, "/gpio-poweroff");
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "compatible",
> +                            "gpio-poweroff");
> +    qemu_fdt_setprop_cells(vms->fdt, "/gpio-poweroff",
> +                           "gpios", phandle, SECURE_GPIO_POWEROFF, 0);
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "status", 
> "disabled");
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "secure-status",
> +                            "okay");
> +
> +    qemu_fdt_add_subnode(vms->fdt, "/gpio-restart");
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "compatible",
> +                            "gpio-restart");
> +    qemu_fdt_setprop_cells(vms->fdt, "/gpio-restart",
> +                           "gpios", phandle, SECURE_GPIO_REBOOT, 0);
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "status", "disabled");
> +    qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "secure-status",
> +                            "okay");
> +}
> +
>  static void create_gpio_devices(const VirtMachineState *vms, int gpio,
>                                  MemoryRegion *mem)
>  {
> @@ -883,6 +921,8 @@ static void create_gpio_devices(const VirtMachineState 
> *vms, int gpio,
>      /* Child gpio devices */
>      if (gpio == VIRT_GPIO) {
>          create_gpio_keys(vms, pl061_dev, phandle);
> +    } else {
> +        create_gpio_pwr(vms, pl061_dev, phandle);
>      }
>  }
>  
> @@ -2015,6 +2055,10 @@ static void machvirt_init(MachineState *machine)
>          create_gpio_devices(vms, VIRT_GPIO, sysmem);
>      }
>  
> +    if (vms->secure && !vmc->no_secure_gpio) {
> +        create_gpio_devices(vms, VIRT_SECURE_GPIO, secure_sysmem);
> +    }
> +
>       /* connect powerdown request */
>       vms->powerdown_notifier.notify = virt_powerdown_req;
>       qemu_register_powerdown_notifier(&vms->powerdown_notifier);
> @@ -2630,8 +2674,11 @@ DEFINE_VIRT_MACHINE_AS_LATEST(6, 0)
>  
>  static void virt_machine_5_2_options(MachineClass *mc)
>  {
> +    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
> +
>      virt_machine_6_0_options(mc);
>      compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
> +    vmc->no_secure_gpio = true;
>  }
>  DEFINE_VIRT_MACHINE(5, 2)
>  
> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> index abf54fab49..6f6c85ffcf 100644
> --- a/include/hw/arm/virt.h
> +++ b/include/hw/arm/virt.h
> @@ -81,6 +81,7 @@ enum {
>      VIRT_GPIO,
>      VIRT_SECURE_UART,
>      VIRT_SECURE_MEM,
> +    VIRT_SECURE_GPIO,
>      VIRT_PCDIMM_ACPI,
>      VIRT_ACPI_GED,
>      VIRT_NVDIMM_ACPI,
> @@ -127,6 +128,7 @@ struct VirtMachineClass {
>      bool kvm_no_adjvtime;
>      bool no_kvm_steal_time;
>      bool acpi_expose_flash;
> +    bool no_secure_gpio;
>  };
>  
>  struct VirtMachineState {
> -- 
> 2.17.1
> 
>

Thanks,
drew 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]