/*
 * 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:
 *  0x00100000 - 0x0017C000  496kB vt, drm_img, custkey, bootloader preloaded buffer
 *  0x0017C000 - 0x00180000   16kB 16kB for level 1 translation table base
 *  0x00180000 - 0x004C0000 3328kB code, rodata, data, bss, heap
 *  0x004C0000 - 0x00500000  256kB stack
 *
 *******************************************************************************/

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(BootLoaderEntry)
SECTIONS
{
	. = 0x1100000 - 0x10000;
	__usb_console_buf_start = .;

	. = 0x1100000;
	__usb_console_buf_end = .;

	. = 0x01600000;
	__preload_buf_start = .;

	. = 0x01680000 - 0x4000;
	. = ALIGN(0x4000);
	__ttb_base_start = .;

	. = 0x01680000;
	. = ALIGN(4);
	.text :
	{
		*(.text)
	}

	.rodata :
	{
		*(.rodata)
	}

        . = ALIGN(4);
	.data :
	{
		*(.data)
	}
	__exidx_start = .;
	.ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
	__exidx_end = .;

	. = ALIGN(4);
        .bss :
	{
		*(.bss)
	}

	. = ALIGN(8);
	__heap_start = .;

	. = 0x01A00000 - 0x00040000;
	__heap_end = .;

	. = 0x01A00000;
	. = ALIGN(8);
	__stack_start = .;

}
