/*
 * Copyright (C) 2018 Synaptics Incorporated. 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.
 */

/*
 * bootloader memory layout:
 *  0x04100000 - 0x04500000 4096kB translation table
 *  0x04500000 - 0x04800000 3072kB code, rodata, data, bss
 *  0x04800000 - 0x04E00000 6144kB heap
 *  0x04E00000 - 0x04FF0000 1984kB stack
 *
 *******************************************************************************/

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(BootLoaderEntry)

MEMORY
{
	MEM_TTB     (rw)  : ORIGIN = 0x04100000, LENGTH = 0x00100000
	MEM_RUNTIME (rwx) : ORIGIN = 0x04500000, LENGTH = 0x00300000
	MEM_HEAP    (rw)  : ORIGIN = 0x04800000, LENGTH = 0x00600000
	MEM_STACK   (rw)  : ORIGIN = 0x04E00000, LENGTH = 0x001F0000
}

SECTIONS
{
	. = 0x04100000;
	. = ALIGN(0x1000);
	__ttb_base_start = .;

	. = 0x04100000 + 0x400000 + 0x80000;
	.text ALIGN(32) :
	{
		*(.text .text.*)
	} >MEM_RUNTIME

	.rodata :
	{
		*(.rodata .rodata.*)
	} >MEM_RUNTIME

	.rela :
	{
		*(.rela.*)
	} >MEM_RUNTIME

	.got :
	{
		*(.got.plt)
		*(.igot.plt)
		*(.got)
		*(.igot)
	} >MEM_RUNTIME

	.plt :
	{
		*(.plt)
		*(.iplt)
	} >MEM_RUNTIME

	.data ALIGN(32) :
	{
		*(.data .data.*)
	} >MEM_RUNTIME

        .bss ALIGN(32):
	{
		__bss = .;
		*(.bss .bss.*)
		*(COMMON)
		__bss_end = .;
	} >MEM_RUNTIME

	. = 0x04800000;
	.heap ALIGN(32):
	{
		__heap_start = .;
		. = . + 0x600000;
		__heap_end = .;
	} >MEM_HEAP

	. = 0x04E00000;
	.stack ALIGN(32):
	{
		__stack_stop  = .;
		. = . + 0x1F0000;
		__stack_start = .;
	} >MEM_STACK
}
