/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 * Copyright Marvell Semiconductor, Inc. 2006. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

/*
  This code initialises the Integrator board (eg REMAP) before calling
  TCM Initialization and MMU Initialization if they exist.
  this allows scatter loading to relocate code into the TCMs

  This code must be run from a privileged mode
*/

.global enable_mmu


#define SCTLR_M_BIT		(1 << 0)
#define SCTLR_A_BIT		(1 << 1)
#define SCTLR_C_BIT		(1 << 2)
#define SCTLR_SA_BIT		(1 << 3)
#define SCTLR_I_BIT		(1 << 12)
#define SCTLR_WXN_BIT		(1 << 19)
#define SCTLR_EE_BIT		(1 << 25)

.globl BootLoaderEntry
BootLoaderEntry:

		mrs     x0, DAIF
		msr     DAIFSET, #3                 /* disable interrupt */

		/*
		 * Clear BSS so that there are no surprises
		 * Make sure this is only applied to BSS section
		 * as it is time consuming.
		 */
		ldr 	x0, =__bss
		ldr 	x1, =__bss_end
z_loop:
		cmp x0, x1
		b.eq	z_end
		strb	wzr, [x0], #1
		b	z_loop
z_end:
		isb

		mrs	x0, hcr_el2
		orr x0, x0, #0xf8
		msr	hcr_el2, x0
		isb sy

		ic	ialluis

		mrs x0, sctlr_el2
		orr x0, x0, #SCTLR_I_BIT
		bic x0, x0, #SCTLR_M_BIT
		bic x0, x0, #SCTLR_C_BIT
		msr sctlr_el2, x0

		isb sy


		/* ---------------------------------------------
		 * Set the exception vector to something sane.
		 * ---------------------------------------------
		 */
		adr	x0, exception_handler
		msr	vbar_el2, x0
		isb

		ldr x0, = __stack_start
		mov sp, x0

		bl	enable_mmu

		/*
		 * branch to C Library entry point
		 */
		ldr		x0, = 0
		ldr		x1, = 0
		ldr		x2, = 0
		bl		StartBootLoader

panic:
		b	panic

.global asm_delay
asm_delay:
		subs    w0, w0, #1
		bne     asm_delay
		ret
