/*
 * (C) Copyright 2010 Quantenna Communications Inc.
 *
 * 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
 */

#ifndef __START_INL
#define __START_INL

#ifdef __ASSEMBLY__

#include <config.h>
#include <asm/arch/platform.h>

#if TOPAZ_MMAP_ALIAS
	#define FLIPBIT		TOPAZ_SYS_CTL_UNIFIED_MAP | TOPAZ_SYS_CTL_ALIAS_MAP
#elif TOPAZ_MMAP_UNIFIED
	#define FLIPBIT		TOPAZ_SYS_CTL_UNIFIED_MAP
#elif RUBY_MMAP_FLIP
	#define FLIPBIT		RUBY_SYS_CTL_LINUX_MAP(0x1)
#else
	#undef FLIPBIT
#endif

#define	U_BOOT_TYPE_LARGE	"0"
#define	U_BOOT_TYPE_MINI	"1"
#define	U_BOOT_TYPE_TINY	"2"

.macro FLUSH_CACHE
	/* flush d-cache */
	mov_s	r0, 0x1
	sr	r0, [ARC_REG_DC_FLSH]
1:
	lr      r1, [ARC_REG_DC_CTRL]
	and     r1, r1, ARC_DC_FLUSH_STATUS_BIT
	brne    r1, 0x0, 1b
	/* invalidate i-cache */
	mov_s	r0, 0x1
	sr	r0, [ARC_REG_IC_IVIC]
	lr      r1, [ARC_REG_DC_CTRL]
.endm

.macro M_COPY_UBOOT to_addr, from_addr
	mov_s	r1, \to_addr
	mov_s	r2, \from_addr
	mov_s	r3, \to_addr + __bss_start - TEXT_BASE
1:
	ld.ab	r0, [r2, 4]
	st.ab	r0, [r1, 4]
	brlt	r1, r3, 1b
	FLUSH_CACHE
.endm

.macro M_DELAY_US us
	mov_s	r1, RUBY_FIXED_CPU_CLK
	mov_s	r2, \us
	mpy	r1, r2, r1
	lsr	r1, r1, 20 /* divide by 1024*1024, which is approximately 1000000 */
1:	
	sub.f	r1, r1, 1
	bne	1b
.endm


.macro M_FILL_BSS
	/* Clear bss */
	mov_s	r2, __bss_start
	mov_s	r3, __bss_end
1:
	st.ab	0, [r2, 4]
	brlt	r2, r3, 1b
.endm

.macro M_GOTO_C_CODE
	/* setup stack pointer */
	mov	sp, CONFIG_ARC_STACK_BEGIN
	mov	fp, sp
	/* Start C-code */
	jal	start_arcboot
.endm

.macro M_REMAP_MEM
	/* flip memmap and remap ddr */
	mov	r1, RUBY_SYS_CTL_BASE_ADDR_NOMAP
	mov	r2, FLIPBIT | RUBY_SYS_CTL_REMAP(0x3)
	st.di	r2, [r1, RUBY_SYS_CTL_MASK - RUBY_SYS_CTL_BASE_ADDR]
	mov	r2, FLIPBIT
	st.di	r2, [r1, RUBY_SYS_CTL_CTRL - RUBY_SYS_CTL_BASE_ADDR]
	ld.di	r2, [r1, RUBY_SYS_CTL_CTRL - RUBY_SYS_CTL_BASE_ADDR] /* read back to clear pipeline */
	sync                                                         /* wait for pipeline to flush */
.endm

.macro M_GOTO_IF_EXEC_REMAPPED_SRAM tag
	lr	r1, [ARC_REG_PC]
	brlt	r1, RUBY_SRAM_BEGIN, 1f
	brgt	r1, RUBY_SRAM_BEGIN + RUBY_SRAM_SIZE, 1f
	b \tag
1:
.endm

.macro M_BOOTMODE_CMP val
	mov_s	r1, RUBY_SYS_CTL_BASE_ADDR_NOMAP
	ld.di	r2, [r1, RUBY_SYS_CTL_CTRL - RUBY_SYS_CTL_BASE_ADDR]
	and	r2, r2, 0x3
	cmp_s	r2, \val
.endm

.macro M_IF_BOOT_FROM_FLASH
	M_BOOTMODE_CMP 0x2
.endm

// delay/pulse is 200 * 2.5ns (400mhz) = 500 nS, verified on scope
#define PHY_RESET_DELAY 200
.macro M_REMOVE_FROM_RESET
	/* in general case, need to remove ddr and sram from reset
	 *   We also need to create a reset pulse for external reset pin */
	mov_s	r1, RUBY_SYS_CTL_BASE_ADDR_NOMAP
#if TOPAZ_FPGA_PLATFORM
	mov_s	r2, RUBY_SYS_CTL_RESET_EXT | RUBY_SYS_CTL_RESET_DDR | RUBY_SYS_CTL_RESET_SRAM
#else
	mov_s	r2, RUBY_SYS_CTL_RESET_EXT | RUBY_SYS_CTL_RESET_SRAM
#endif

	st.di	r2, [r1, RUBY_SYS_CTL_CPU_VEC_MASK - RUBY_SYS_CTL_BASE_ADDR]
	st.di	r2, [r1, RUBY_SYS_CTL_CPU_VEC - RUBY_SYS_CTL_BASE_ADDR]


	mov_s	r2, RUBY_SYS_CTL_RESET_EXT
	st.di	r2, [r1, RUBY_SYS_CTL_CPU_VEC_MASK - RUBY_SYS_CTL_BASE_ADDR]
        /* delay for PHY reset delay */
	mov	%lp_count,PHY_RESET_DELAY
	lp	1f
	nop
1:
	st.di	0, [r1, RUBY_SYS_CTL_CPU_VEC - RUBY_SYS_CTL_BASE_ADDR]
.endm

#endif // #ifdef __ASSEMBLY__

#endif // #ifndef __START_INL

