[U-Boot] [RFC PATCH] vexpress: Check TC2 firmware support before defaulting to nonsec booting

Ryan Harkin ryan.harkin at linaro.org
Tue Jun 28 18:25:44 CEST 2016


On 23 June 2016 at 13:37, Jon Medhurst (Tixy) <tixy at linaro.org> wrote:
> The firmware on TC2 needs to be configured appropriately before booting
> in nonsec mode will work as expected, so test for this and fall back to
> sec mode if required.
>
> Signed-off-by: Jon Medhurst <tixy at linaro.org>

Reviewed-by: Ryan Harkin <ryan.harkin at linaro.org>
Tested-by: Ryan Harkin <ryan.harkin at linaro.org>

I tested with a "regular" linux kernel only.  I didn't test with hyp
mode enabled.


> ---
>
> This is an implementation of Andre's suggestion in
> http://lists.denx.de/pipermail/u-boot/2016-June/258873.html
>
> Possibly the change to bootm.c should be in a separate patch?
>
>  arch/arm/lib/bootm.c                 | 15 ++++++++++-----
>  board/armltd/vexpress/Makefile       |  1 +
>  board/armltd/vexpress/vexpress_tc2.c | 33 +++++++++++++++++++++++++++++++++
>  3 files changed, 44 insertions(+), 5 deletions(-)
>  create mode 100644 board/armltd/vexpress/vexpress_tc2.c
>
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index 0838d89..766a0c8 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -248,15 +248,20 @@ static void boot_prep_linux(bootm_headers_t *images)
>         }
>  }
>
> -#ifdef CONFIG_ARMV7_NONSEC
> -bool armv7_boot_nonsec(void)
> +__weak bool armv7_boot_nonsec_default(void)
>  {
> -       char *s = getenv("bootm_boot_mode");
>  #ifdef CONFIG_ARMV7_BOOT_SEC_DEFAULT
> -       bool nonsec = false;
> +       return false;
>  #else
> -       bool nonsec = true;
> +       return true;
>  #endif
> +}
> +
> +#ifdef CONFIG_ARMV7_NONSEC
> +bool armv7_boot_nonsec(void)
> +{
> +       char *s = getenv("bootm_boot_mode");
> +       bool nonsec = armv7_boot_nonsec_default();
>
>         if (s && !strcmp(s, "sec"))
>                 nonsec = false;
> diff --git a/board/armltd/vexpress/Makefile b/board/armltd/vexpress/Makefile
> index 1dd6780..95f4ec0 100644
> --- a/board/armltd/vexpress/Makefile
> +++ b/board/armltd/vexpress/Makefile
> @@ -6,3 +6,4 @@
>  #
>
>  obj-y  := vexpress_common.o
> +obj-$(CONFIG_TARGET_VEXPRESS_CA15_TC2) += vexpress_tc2.o
> diff --git a/board/armltd/vexpress/vexpress_tc2.c b/board/armltd/vexpress/vexpress_tc2.c
> new file mode 100644
> index 0000000..f00a83c
> --- /dev/null
> +++ b/board/armltd/vexpress/vexpress_tc2.c
> @@ -0,0 +1,33 @@
> +/*
> + * (C) Copyright 2016 Linaro
> + * Jon Medhurst <tixy at linaro.org>
> + *
> + * TC2 specific code for Versatile Express.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <asm/io.h>
> +
> +#define SCC_BASE       0x7fff0000
> +
> +bool armv7_boot_nonsec_default(void)
> +{
> +#ifdef CONFIG_ARMV7_BOOT_SEC_DEFAULT
> +       return false
> +#else
> +       /*
> +        * The Serial Configuration Controller (SCC) register at address 0x700
> +        * contains flags for configuring the behaviour of the Boot Monitor
> +        * (which CPUs execute from reset). Two of these bits are of interest:
> +        *
> +        * bit 12 = Use per-cpu mailboxes for power management
> +        * bit 13 = Power down the non-boot cluster
> +        *
> +        * It is only when both of these are false that U-Boot's current
> +        * implementation of 'nonsec' mode can work as expected because we
> +        * rely on getting all CPUs to execute _nonsec_init, so let's check that.
> +        */
> +       return (readl((u32 *)(SCC_BASE + 0x700)) & ((1 << 12) | (1 << 13))) == 0;
> +#endif
> +}
> --
> 2.1.4
>
>


More information about the U-Boot mailing list