blob: 7395a5c58d4d9179bb9e5222b766dbe4632b9eaf [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
*******************************************************************************/
#define MV_ASMLANGUAGE
#include "mvOsAsm.h"
#include <config.h>
#include <version.h>
#include "mvBoardEnvSpec.h"
#include "mvCtrlEnvSpec.h"
#include "mvAhbToMbusRegs.h"
#include "ddr2_3/mvDramIfRegs.h"
#include "mvCtrlEnvAsm.h"
.globl lowlevel_init
/************************************************/
/* lowlevel_init *
/************************************************/
lowlevel_init:
mov r2, lr
/* Multicore support - read MPIDR register (Multiprocessor Affinity) */
mrc p15, 0, r0, c0, c0, 5
#if defined(CONFIG_AVANTA_LP_FPGA)
bic r0, r0, #0xFFFFFFF0
cmp r0, #0x0
bne exit
/* If run from DRAM, then no need to init DRAM, => return */
adr r0, lowlevel_init /* run-time address of function */
ldr r1, _lowlevel_init_val /* link-time address of function */
cmp r1, r0
beq exit /* exit if run from DRAM */
/* Write to CP15:1 - point exception vector to flash (0xffff0000) */
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x00002000 /* bit 13 - Exception Vector on flash */
orr r0, r0, #0x00001000 /* bit 12 - re-enable I-cache */
mcr p15, 0, r0, c1, c0, 0
/* descrease size of CS[2] to prevent overlap with 0xf1000000*/
ldr r4, =0x000f3b11
MV_DV_REG_WRITE_ASM(r4, r1, 0x200B0)
/* Mask L2 End address filtering - forward CPU transactions to XBAR */
ldr r4, =0x0
MV_DV_REG_WRITE_ASM(r4, r1, 0x08c04)
#if defined(MV_STATIC_DRAM_ON_BOARD)
bl _mvDramIfStaticInit
#endif
/* re-open XBAR window */
ldr r4, =0x0fff0e01
MV_REG_WRITE_ASM(r4, r1, 0x200e8)
/* Enable CS0 bank */
ldr r4, =0x1
MV_DV_REG_WRITE_ASM(r4, r1, 0x015e0)
#endif /* CONFIG_AVANTA_LP_FPGA) */
exit:
mov lr, r2
mov pc, lr
.globl _lowlevel_init_val
_lowlevel_init_val:
.word lowlevel_init
/*
*************************************************************************
*
* Flush DCache
*
*************************************************************************
*/
.globl _dcache_index_max
_dcache_index_max:
.word 0x0
.globl _dcache_index_inc
_dcache_index_inc:
.word 0x0
.globl _dcache_set_max
_dcache_set_max:
.word 0x0
.globl _dcache_set_index
_dcache_set_index:
.word 0x0
#define s_max r0
#define s_inc r1
#define i_max r2
#define i_inc r3
.globl cpu_dcache_flush_all
cpu_dcache_flush_all:
#if !defined(CONFIG_MACH_AVANTA_LP_FPGA)
stmdb sp!, {r0-r3,ip}
ldr i_max, _dcache_index_max
ldr i_inc, _dcache_index_inc
ldr s_max, _dcache_set_max
ldr s_inc, _dcache_set_index
Lnext_set_inv:
orr ip, s_max, i_max
Lnext_index_inv:
mcr p15, 0, ip, c7, c14, 2 /* Purge D cache SE with Set/Index */
sub ip, ip, i_inc
tst ip, i_max /* Index 0 is last one */
bne Lnext_index_inv /* Next index */
mcr p15, 0, ip, c7, c14, 2 /* Purge D cache SE with Set/Index */
subs s_max, s_max, s_inc
bpl Lnext_set_inv /* Next set */
ldmia sp!, {r0-r3,ip}
#endif
mov pc, lr /* back to my caller */
.globl cpu_icache_flush_invalidate_all
cpu_icache_flush_invalidate_all:
#if !defined(CONFIG_MACH_AVANTA_LP_FPGA)
stmdb sp!, {r0}
ldr r0,=0
mcr p15, 0, r0, c7, c5, 0 /* Flush Invalidate D and I caches */
ldmia sp!, {r0}
#endif
mov pc, lr /* back to my caller */