[RFC PATCH 1/2] arndale5250: Boot in Hyp mode and enable architected timers

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

 



First, to boot in Hyp mode we need to change to non-secure mode, which
involves configuring the frequency of the arch. timers and setting all
interrupts on the gic to group 1 (this code was inspired by the boot
wrapper code).

Second, signal the secondary CPU while still in secure mode and have the
secondary CPU run the SPL.  The SPL checks the hardware cpu id, and if
it's a secondary CPU, it will initialize non-secure mode inside the SPL,
enter Hyp mode, and finally enter a new SMP pen with the same poking stick
interface as the regular kernel uses.

Third, on CPU0 we wait until u-boot is fully up to actually enter the
non-secure mode on CPU0, and stay in non-secure svc mode right up until
we actually load the kernel, where the last thing we do is enter Hyp
mode.

Let it roll...

Signed-off-by: Jeremy C. Andrus <jeremya@xxxxxxxxxxxxxxx>
Signed-off-by: Christoffer Dall <cdall@xxxxxxxxxxxxxxx>
---
 arch/arm/include/asm/arch-exynos/cpu.h |    3 +
 board/samsung/smdk5250/Makefile        |    3 +
 board/samsung/smdk5250/lowlevel_init.S |   34 +++++++++++
 board/samsung/smdk5250/monitor.S       |   97 ++++++++++++++++++++++++++++++++
 board/samsung/smdk5250/non_secure.c    |   96 +++++++++++++++++++++++++++++++
 board/samsung/smdk5250/setup.h         |    2 +
 board/samsung/smdk5250/smdk5250.c      |   23 ++++++++
 board/samsung/smdk5250/smp.S           |   69 +++++++++++++++++++++++
 board/samsung/smdk5250/timer_init.c    |   45 +++++++++++++++
 include/configs/arndale5250.h          |    6 ++
 tools/mksmdk5250spl                    |  Bin 5552 -> 6320 bytes
 11 files changed, 378 insertions(+)
 create mode 100644 board/samsung/smdk5250/monitor.S
 create mode 100644 board/samsung/smdk5250/non_secure.c
 create mode 100644 board/samsung/smdk5250/smp.S
 create mode 100644 board/samsung/smdk5250/timer_init.c

diff --git a/arch/arm/include/asm/arch-exynos/cpu.h b/arch/arm/include/asm/arch-exynos/cpu.h
index 2cd4ae1..03537e5 100644
--- a/arch/arm/include/asm/arch-exynos/cpu.h
+++ b/arch/arm/include/asm/arch-exynos/cpu.h
@@ -68,6 +68,9 @@
 #define EXYNOS5_SWRESET			0x10040400
 #define EXYNOS5_SYSREG_BASE		0x10050000
 #define EXYNOS5_WATCHDOG_BASE		0x101D0000
+#define EXYNOS5_GIC_DIST_BASE		0x10481000
+#define EXYNOS5_GIC_CPU_BASE		0x10482000
+
 #define EXYNOS5_DMC_PHY0_BASE		0x10C00000
 #define EXYNOS5_DMC_PHY1_BASE		0x10C10000
 #define EXYNOS5_GPIO_PART3_BASE		0x10D10000
diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile
index 1474fa8..64f8c42 100644
--- a/board/samsung/smdk5250/Makefile
+++ b/board/samsung/smdk5250/Makefile
@@ -25,8 +25,10 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)lib$(BOARD).o
 
 SOBJS	:= lowlevel_init.o
+SOBJS	+= monitor.o
 
 COBJS	:= clock_init.o
+COBJS	+= timer_init.o non_secure.o
 COBJS	+= dmc_common.o dmc_init_ddr3.o
 COBJS	+= tzpc_init.o
 COBJS	+= smdk5250_spl.o
@@ -36,6 +38,7 @@ COBJS	+= smdk5250.o
 endif
 
 ifdef CONFIG_SPL_BUILD
+SOBJS	+= smp.o
 COBJS	+= mmc_boot.o
 endif
 
diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S
index 07925c3..2ef520f 100644
--- a/board/samsung/smdk5250/lowlevel_init.S
+++ b/board/samsung/smdk5250/lowlevel_init.S
@@ -32,6 +32,29 @@ _TEXT_BASE:
 	.globl lowlevel_init
 lowlevel_init:
 
+#ifdef CONFIG_SPL_BUILD
+	/* check if we're the first cpu or not */
+	mrc	p15, 0, r0, c0, c0, 5	/* MPIDR */
+	and	r0, r0, #15
+	cmp	r0, #0
+	beq	first_cpu
+
+	/* Secondary CPU */
+	bl	arch_timer_init
+	bl	non_secure_init
+	bl	monitor_init
+	bl	enter_ns
+	bl	enter_hyp
+	b	enter_smp_pen
+
+	/*
+	 * We entered the SMP pen above, and we expect kernels to write an
+	 * address into the ALIVE SFR SYSFLAGS register thingy at 0x02020000
+	 * which should not be here, but some kernel secondary entry point.
+	 */
+#endif
+
+first_cpu:
 	/* use iRAM stack in bl2 */
 	ldr	sp, =CONFIG_IRAM_STACK
 	stmdb	r13!, {ip,lr}
@@ -55,6 +78,12 @@ lowlevel_init:
 	cmp	r1, r2
 	beq	wakeup_reset
 
+	/* Init architected timers */
+	bl	arch_timer_init
+
+	/* Non-secure-init */
+	bl	non_secure_init
+
 	/*PS-Hold High*/
 	ldr r0, =0x1004330c
 	ldr r1, [r0]
@@ -81,6 +110,11 @@ lowlevel_init:
 
 1:
 	bl	tzpc_init
+#ifdef CONFIG_SPL_BUILD
+	bl	smp_kick_secondary	/* Bring other CPU1 into smp pen */
+#else
+	bl	monitor_init		/* Setup monitor mode */
+#endif
 	ldmia	r13!, {ip,pc}
 
 wakeup_reset:
diff --git a/board/samsung/smdk5250/monitor.S b/board/samsung/smdk5250/monitor.S
new file mode 100644
index 0000000..8bc21d8
--- /dev/null
+++ b/board/samsung/smdk5250/monitor.S
@@ -0,0 +1,97 @@
+/*
+ *
+ * Copyright (c) 2012	Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx>
+ * 					 <cdall@xxxxxxxxxxxxxxx>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+
+.syntax	unified
+.arch_extension sec
+.arch_extension virt
+.text
+
+.align 5
+
+/* We use the same vector table for Hyp and Monitor mode, since
+ * we will only use each once and they don't overlap.
+ */
+mon_vectors:
+	.word 0	/* reset */
+	.word 0	/* undef */
+	b	2f /* smc */
+	.word 0 /* pabt */
+	.word 0 /* dabt */
+	b	1f
+	.word 0 /* irq */
+	.word 0 /* fiq */
+
+/* Return directly back to the caller without leaving Hyp mode: */
+1:	mrs	lr, elr_hyp
+	mov	pc, lr
+
+/* In monitor mode, set up HVBAR and SCR then return to caller in NS-SVC. */
+2:
+	mrc	p15, 0, r1, c1, c1, 0		@ SCR
+	/*
+	 * Set SCR.NS=1 (needed for setting HVBAR and also returning to NS state)
+	 *        .IRQ,FIQ,EA=0 (don't take aborts/exceptions to Monitor mode)
+	 *        .FW,AW=1 (CPSR.A,F modifiable in NS state)
+	 *        .nET=0 (early termination OK)
+	 *        .SCD=0 (SMC in NS mode OK, so we can call secure firmware)
+	 *        .HCE=1 (HVC does Hyp call)
+	 */
+	bic	r1, r1, #0x07f
+	ldr	r2, =0x131
+	orr	r1, r1, r2
+	mcr	p15, 0, r2, c1, c1, 0		@ SCR
+	isb
+	ldr	r2, =mon_vectors
+	mcr	p15, 4, r2, c12, c0, 0		@ set HVBAR
+	/* ...and return to calling code in NS state */
+	movs	pc, lr
+
+/******************************************************************************
+ * This code is called from u-boot into the above handler
+ */
+
+	.globl monitor_init
+monitor_init:
+	ldr	ip, =mon_vectors
+	mcr	p15, 0, ip, c12, c0, 1		@ Monitor vector base address
+	mov	pc, lr
+
+	/* Try to go into NS-SVC: void enter_ns(void); */
+	.globl enter_ns
+enter_ns:
+	smc	#0
+	mov	pc, lr
+
+	/* void enter_hyp(void); */
+	.globl enter_hyp
+enter_hyp:
+	/* Now we're in NS-SVC, make a Hyp call to get into Hyp mode */
+	mov	r0, lr
+	mov	r1, sp
+	hvc	#0
+	/* We will end up here in NS-Hyp. */
+	mov	sp, r1
+	mov	pc, r0
diff --git a/board/samsung/smdk5250/non_secure.c b/board/samsung/smdk5250/non_secure.c
new file mode 100644
index 0000000..e46b6f8
--- /dev/null
+++ b/board/samsung/smdk5250/non_secure.c
@@ -0,0 +1,96 @@
+
+/*
+ * Architected Timer setup for SMDK5250 board based on EXYNOS5
+ *
+ * Copyright (C) 2012 Christoffer Dall <cdall@xxxxxxxxxxxxxxx>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/io.h>
+#include <asm/arch/spl.h>
+
+#include "setup.h"
+
+#define ARM_GICV2_DIST_CTRL		0x00
+#define ARM_GICV2_DIST_TYPE		0x04
+#define ARM_GICV2_DIST_SEC_REG		0x80
+
+#define ARM_GICV2_CPU_CTRL		0x00
+
+#define ARM_GICV2_ICCPMR		0x04
+
+static unsigned long read_mpidr(void)
+{
+	unsigned long val;
+	asm volatile("mrc p15, 0, %0, c0, c0, 5": "=r" (val));
+	return val;
+}
+
+static unsigned long read_nsacr(void)
+{
+	unsigned long val;
+	asm volatile("mrc p15, 0, %0, c1, c1, 2": "=r" (val));
+	return val;
+}
+
+static void write_nsacr(unsigned long val)
+{
+	asm volatile("mcr p15, 0, %0, c1, c1, 2": : "r" (val));
+}
+
+void non_secure_init(void)
+{
+	unsigned long addr, type, num_regs;
+	unsigned long nsacr, ctrl;
+	int i;
+
+	addr = EXYNOS5_GIC_DIST_BASE;
+	type = readl(addr + ARM_GICV2_DIST_TYPE);
+	num_regs = (type & 0x1f) + 1;
+
+	/* Set all interrupts to be non-secure */
+	addr = EXYNOS5_GIC_DIST_BASE + ARM_GICV2_DIST_SEC_REG;
+	for (i = 0; i < num_regs; i++) {
+		writel(0xffffffff, addr);
+		addr += 4;
+	}
+
+	/* Set GIC priority mask bit [7] = 1 */
+	addr = EXYNOS5_GIC_CPU_BASE;
+	writel(0x80, addr + ARM_GICV2_ICCPMR);
+
+	/* Set NSACR to allow coprocessor access from non-secure */
+	nsacr = read_nsacr();
+	nsacr |= 0x43fff;
+	write_nsacr(nsacr);
+
+	/* Enable group 1 interrupts on CPU interface */
+	addr = EXYNOS5_GIC_CPU_BASE + ARM_GICV2_CPU_CTRL;
+	ctrl = readl(addr);
+	writel(ctrl | 0x1, addr);
+
+	/* Disable group 0 interrupts and enable group 1 interrupts on Dist */
+	addr = EXYNOS5_GIC_DIST_BASE + ARM_GICV2_DIST_CTRL;
+	ctrl = readl(addr);
+	ctrl = (ctrl & ~0x1) | 0x2;
+	writel(ctrl | 0x1, addr);
+}
diff --git a/board/samsung/smdk5250/setup.h b/board/samsung/smdk5250/setup.h
index a159601..bb8e971 100644
--- a/board/samsung/smdk5250/setup.h
+++ b/board/samsung/smdk5250/setup.h
@@ -591,4 +591,6 @@ void sdelay(unsigned long);
 void mem_ctrl_init(void);
 void system_clock_init(void);
 void tzpc_init(void);
+void enter_ns(void);
+void enter_hyp(void);
 #endif
diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c
index b9372d1..76687e5 100644
--- a/board/samsung/smdk5250/smdk5250.c
+++ b/board/samsung/smdk5250/smdk5250.c
@@ -30,6 +30,8 @@
 #include <asm/arch/pinmux.h>
 #include <asm/arch/sromc.h>
 
+#include "setup.h"
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_SMC911X
@@ -215,3 +217,24 @@ int board_early_init_f(void)
 	return err;
 }
 #endif
+
+void arch_preboot_os(void)
+{
+	/*
+	 * We should now long be done with accessing any peripherals or
+	 * setting up any other hardware state that needs to be set up from
+	 * the secure mode (TrustZone), so we can switch to non-secure mode
+	 * and we rely on board-specific logic to put a board-specific monitor
+	 * in place for stuff like L2 cache maintenance and power management.
+	 */
+	enter_ns();
+
+	/*
+	 * Enter Hyp mode immediately before booting the kernel to allow
+	 * the first Linux kernel access to and control of Hyp mode so that
+	 * modules like KVM can run VMs.
+	 *
+	 * Without further ado...
+	 */
+	enter_hyp();
+}
diff --git a/board/samsung/smdk5250/smp.S b/board/samsung/smdk5250/smp.S
new file mode 100644
index 0000000..998d2ab
--- /dev/null
+++ b/board/samsung/smdk5250/smp.S
@@ -0,0 +1,69 @@
+/*
+ *
+ * Copyright (c) 2012	Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx>
+ * 					 <cdall@xxxxxxxxxxxxxxx>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+
+__smp_pen:
+	wfe
+	ldr	r1, [r0]
+	mov	pc, r1
+
+	.globl enter_smp_pen
+enter_smp_pen:
+	adr	r1, __smp_pen
+	ldmia	r1, {r4, r5, r6}
+	ldr	r2, =CONFIG_SPL_SMP_PEN
+	stmia	r2, {r4, r5, r6}
+
+	/*
+	 * Store SMP pen into SYSFLAGS so the processor stays in the loop if
+	 * it gets a spurious interrupt
+	 */
+	ldr	r0, =CONFIG_SYSFLAGS_ADDR
+	str	r2, [r0]
+
+	/*
+	 * Make instruction copy coherent
+	 */
+	mcr	p15, 0, r2, c7, c11, 1 /* Clean the data cache by MVA*/
+	mov	r10, #0
+	mcr	p15, 0, r10, c7, c5, 0 /* Invalidate the I-cache */
+	isb	/* Make sure the invalidate ops are complete */
+	dsb
+
+	mov	pc, r2
+
+	.globl smp_kick_secondary
+smp_kick_secondary:
+	/* Bring up the secondary CPU */
+	ldr	r0, =CONFIG_SYSFLAGS_ADDR
+	ldr	r1, =CONFIG_SPL_TEXT_BASE
+	str	r1, [r0]
+	dsb
+	ldr	r0, =(EXYNOS5_GIC_DIST_BASE + 0xf00) /* GICD_SGIR */
+	ldr	r1, =(2 << 16)		/* Bring up CPU 1*/
+	str	r1, [r0]
+	dsb
+
+	mov	pc, lr
diff --git a/board/samsung/smdk5250/timer_init.c b/board/samsung/smdk5250/timer_init.c
new file mode 100644
index 0000000..cf90177
--- /dev/null
+++ b/board/samsung/smdk5250/timer_init.c
@@ -0,0 +1,45 @@
+/*
+ * Architected Timer setup for SMDK5250 board based on EXYNOS5
+ *
+ * Copyright (C) 2012 Christoffer Dall <cdall@xxxxxxxxxxxxxxx>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/io.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/spl.h>
+
+#include "setup.h"
+
+void arch_timer_init(void)
+{
+	unsigned long cpuid, freq;
+	asm volatile("mrc	p15, 0, %[cpuid], c0, c1, 1":
+		     [cpuid] "=r" (cpuid));
+
+	if ((cpuid >> 16) & 1) {
+		freq = 24000000;
+		asm volatile("mcr p15, 0, %[freq], c14, c0, 0" : :
+			     [freq] "r" (freq));
+	}
+}
diff --git a/include/configs/arndale5250.h b/include/configs/arndale5250.h
index 35bfebc..d1adde0 100644
--- a/include/configs/arndale5250.h
+++ b/include/configs/arndale5250.h
@@ -112,6 +112,9 @@
 #define CONFIG_USB_STORAGE
 #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	3
 
+/* SYSFLAGS register */
+#define CONFIG_SYSFLAGS_ADDR	0x02020000
+
 /* MMC SPL */
 #define CONFIG_SPL
 #define COPY_BL2_FNPTR_ADDR	0x02020030
@@ -121,6 +124,9 @@
 #define CONFIG_SPL_TEXT_BASE	0x02023400
 #define CONFIG_SPL_MAX_SIZE	(14 * 1024)
 
+/* secondary SMP pens */
+#define CONFIG_SPL_SMP_PEN	(CONFIG_SPL_TEXT_BASE + CONFIG_SPL_MAX_SIZE - 8)
+
 #define CONFIG_BOOTCOMMAND	"mmc read 40007000 451 2000; bootm 40007000"
 /* Miscellaneous configurable options */
 #define CONFIG_SYS_LONGHELP		/* undef to save memory */
diff --git a/tools/mksmdk5250spl b/tools/mksmdk5250spl
index a3d8b7a8f01bdd12b6dbfbaef175b9185fe6b23b..b9effb5d17fc79b02406a61d3987c7555d877553 100755
GIT binary patch
literal 6320
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

literal 5552
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
bV7!`wgSaOYsNkbt<y5W?;HH&Q@KgOa*`MJ^

-- 
1.7.9.5

_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux