On 23 June 2016 at 13:37, Jon Medhurst (Tixy) <t...@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 <t...@linaro.org>
Reviewed-by: Ryan Harkin <ryan.har...@linaro.org> Tested-by: Ryan Harkin <ryan.har...@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 <t...@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 > > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot