blob: c1c6cadef4daa928439a5b2ffff97a4e8ef2e25c [file] [log] [blame]
/*
* (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>
#include <topaz_platform.h>
#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, RUBY_SYS_CTL_MMAP_REGVAL | RUBY_SYS_CTL_REMAP(0x3)
st.di r2, [r1, RUBY_SYS_CTL_MASK - RUBY_SYS_CTL_BASE_ADDR]
mov r2, RUBY_SYS_CTL_MMAP_REGVAL
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