Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
484acce3
Commit
484acce3
authored
Apr 21, 2017
by
davidcunado-arm
Committed by
GitHub
Apr 21, 2017
Browse files
Merge pull request #910 from dp-arm/dp/AArch32-juno-port
Add AArch32 support for Juno
parents
94e0ed60
6f249345
Changes
26
Show whitespace changes
Inline
Side-by-side
include/common/aarch32/asm_macros.S
View file @
484acce3
...
@@ -134,4 +134,37 @@
...
@@ -134,4 +134,37 @@
.
space
SPINLOCK_ASM_SIZE
.
space
SPINLOCK_ASM_SIZE
.
endm
.
endm
/
*
*
Helper
macro
to
OR
the
bottom
32
bits
of
`
_val
`
into
`
_reg_l
`
*
and
the
top
32
bits
of
`
_val
`
into
`
_reg_h
`
.
If
either
the
bottom
*
or
top
word
of
`
_val
`
is
zero
,
the
corresponding
OR
operation
*
is
skipped
.
*/
.
macro
orr64_imm
_reg_l
,
_reg_h
,
_val
.
if
(
\
_val
>>
32
)
orr
\
_reg_h
,
\
_reg_h
,
#(
\
_val
>>
32
)
.
endif
.
if
(
\
_val
&
0xffffffff
)
orr
\
_reg_l
,
\
_reg_l
,
#(
\
_val
&
0xffffffff
)
.
endif
.
endm
/
*
*
Helper
macro
to
bitwise
-
clear
bits
in
`
_reg_l
`
and
*
`
_reg_h
`
given
a
64
bit
immediate
`
_val
`
.
The
set
bits
*
in
the
bottom
word
of
`
_val
`
dictate
which
bits
from
*
`
_reg_l
`
should
be
cleared
.
Similarly
,
the
set
bits
in
*
the
top
word
of
`
_val
`
dictate
which
bits
from
`
_reg_h
`
*
should
be
cleared
.
If
either
the
bottom
or
top
word
of
*
`
_val
`
is
zero
,
the
corresponding
BIC
operation
is
skipped
.
*/
.
macro
bic64_imm
_reg_l
,
_reg_h
,
_val
.
if
(
\
_val
>>
32
)
bic
\
_reg_h
,
\
_reg_h
,
#(
\
_val
>>
32
)
.
endif
.
if
(
\
_val
&
0xffffffff
)
bic
\
_reg_l
,
\
_reg_l
,
#(
\
_val
&
0xffffffff
)
.
endif
.
endm
#endif /* __ASM_MACROS_S__ */
#endif /* __ASM_MACROS_S__ */
include/lib/aarch32/arch.h
View file @
484acce3
...
@@ -394,12 +394,14 @@
...
@@ -394,12 +394,14 @@
#define HCR p15, 4, c1, c1, 0
#define HCR p15, 4, c1, c1, 0
#define HCPTR p15, 4, c1, c1, 2
#define HCPTR p15, 4, c1, c1, 2
#define CNTHCTL p15, 4, c14, c1, 0
#define CNTHCTL p15, 4, c14, c1, 0
#define CNTKCTL p15, 0, c14, c1, 0
#define VPIDR p15, 4, c0, c0, 0
#define VPIDR p15, 4, c0, c0, 0
#define VMPIDR p15, 4, c0, c0, 5
#define VMPIDR p15, 4, c0, c0, 5
#define ISR p15, 0, c12, c1, 0
#define ISR p15, 0, c12, c1, 0
#define CLIDR p15, 1, c0, c0, 1
#define CLIDR p15, 1, c0, c0, 1
#define CSSELR p15, 2, c0, c0, 0
#define CSSELR p15, 2, c0, c0, 0
#define CCSIDR p15, 1, c0, c0, 0
#define CCSIDR p15, 1, c0, c0, 0
#define DBGOSDLR p14, 0, c1, c3, 4
/* Debug register defines. The format is: coproc, opt1, CRn, CRm, opt2 */
/* Debug register defines. The format is: coproc, opt1, CRn, CRm, opt2 */
#define HDCR p15, 4, c1, c1, 1
#define HDCR p15, 4, c1, c1, 1
...
...
include/lib/aarch32/arch_helpers.h
View file @
484acce3
...
@@ -209,6 +209,8 @@ DEFINE_SYSOP_FUNC(wfe)
...
@@ -209,6 +209,8 @@ DEFINE_SYSOP_FUNC(wfe)
DEFINE_SYSOP_FUNC
(
sev
)
DEFINE_SYSOP_FUNC
(
sev
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
sy
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
sy
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
sy
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
sy
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
st
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
ld
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
ish
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
ish
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
ishst
)
DEFINE_SYSOP_TYPE_FUNC
(
dsb
,
ishst
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
ish
)
DEFINE_SYSOP_TYPE_FUNC
(
dmb
,
ish
)
...
...
include/lib/aarch64/arch.h
View file @
484acce3
...
@@ -261,6 +261,16 @@
...
@@ -261,6 +261,16 @@
#define DISABLE_ALL_EXCEPTIONS \
#define DISABLE_ALL_EXCEPTIONS \
(DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT)
(DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT)
/*
* RMR_EL3 definitions
*/
#define RMR_EL3_RR_BIT (1 << 1)
#define RMR_EL3_AA64_BIT (1 << 0)
/*
* HI-VECTOR address for AArch32 state
*/
#define HI_VECTOR_BASE (0xFFFF0000)
/*
/*
* TCR defintions
* TCR defintions
...
...
include/lib/cpus/aarch32/cortex_a53.h
0 → 100644
View file @
484acce3
/*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __CORTEX_A53_H__
#define __CORTEX_A53_H__
/* Cortex-A53 midr for revision 0 */
#define CORTEX_A53_MIDR 0x410FD030
/* Retention timer tick definitions */
#define RETENTION_ENTRY_TICKS_2 0x1
#define RETENTION_ENTRY_TICKS_8 0x2
#define RETENTION_ENTRY_TICKS_32 0x3
#define RETENTION_ENTRY_TICKS_64 0x4
#define RETENTION_ENTRY_TICKS_128 0x5
#define RETENTION_ENTRY_TICKS_256 0x6
#define RETENTION_ENTRY_TICKS_512 0x7
/*******************************************************************************
* CPU Extended Control register specific definitions.
******************************************************************************/
#define CPUECTLR p15, 1, c15
/* Instruction def. */
#define CPUECTLR_SMP_BIT (1 << 6)
#define CPUECTLR_CPU_RET_CTRL_SHIFT 0
#define CPUECTLR_CPU_RET_CTRL_MASK (0x7 << CPUECTLR_CPU_RET_CTRL_SHIFT)
#define CPUECTLR_FPU_RET_CTRL_SHIFT 3
#define CPUECTLR_FPU_RET_CTRL_MASK (0x7 << CPUECTLR_FPU_RET_CTRL_SHIFT)
/*******************************************************************************
* CPU Memory Error Syndrome register specific definitions.
******************************************************************************/
#define CPUMERRSR p15, 2, c15
/* Instruction def. */
/*******************************************************************************
* CPU Auxiliary Control register specific definitions.
******************************************************************************/
#define CPUACTLR p15, 0, c15
/* Instruction def. */
#define CPUACTLR_DTAH (1 << 24)
/*******************************************************************************
* L2 Auxiliary Control register specific definitions.
******************************************************************************/
#define L2ACTLR p15, 1, c15, c0, 0
/* Instruction def. */
#define L2ACTLR_ENABLE_UNIQUECLEAN (1 << 14)
#define L2ACTLR_DISABLE_CLEAN_PUSH (1 << 3)
/*******************************************************************************
* L2 Extended Control register specific definitions.
******************************************************************************/
#define L2ECTLR p15, 1, c9, c0, 3
/* Instruction def. */
#define L2ECTLR_RET_CTRL_SHIFT 0
#define L2ECTLR_RET_CTRL_MASK (0x7 << L2ECTLR_RET_CTRL_SHIFT)
/*******************************************************************************
* L2 Memory Error Syndrome register specific definitions.
******************************************************************************/
#define L2MERRSR p15, 3, c15
/* Instruction def. */
#endif
/* __CORTEX_A53_H__ */
include/lib/cpus/aarch32/cortex_a57.h
0 → 100644
View file @
484acce3
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __CORTEX_A57_H__
#define __CORTEX_A57_H__
/* Cortex-A57 midr for revision 0 */
#define CORTEX_A57_MIDR 0x410FD070
/* Retention timer tick definitions */
#define RETENTION_ENTRY_TICKS_2 0x1
#define RETENTION_ENTRY_TICKS_8 0x2
#define RETENTION_ENTRY_TICKS_32 0x3
#define RETENTION_ENTRY_TICKS_64 0x4
#define RETENTION_ENTRY_TICKS_128 0x5
#define RETENTION_ENTRY_TICKS_256 0x6
#define RETENTION_ENTRY_TICKS_512 0x7
/*******************************************************************************
* CPU Extended Control register specific definitions.
******************************************************************************/
#define CPUECTLR p15, 1, c15
/* Instruction def. */
#define CPUECTLR_SMP_BIT (1 << 6)
#define CPUECTLR_DIS_TWD_ACC_PFTCH_BIT (1 << 38)
#define CPUECTLR_L2_IPFTCH_DIST_MASK (0x3 << 35)
#define CPUECTLR_L2_DPFTCH_DIST_MASK (0x3 << 32)
#define CPUECTLR_CPU_RET_CTRL_SHIFT 0
#define CPUECTLR_CPU_RET_CTRL_MASK (0x7 << CPUECTLR_CPU_RET_CTRL_SHIFT)
/*******************************************************************************
* CPU Memory Error Syndrome register specific definitions.
******************************************************************************/
#define CPUMERRSR p15, 2, c15
/* Instruction def. */
/*******************************************************************************
* CPU Auxiliary Control register specific definitions.
******************************************************************************/
#define CPUACTLR p15, 0, c15
/* Instruction def. */
#define CPUACTLR_DIS_LOAD_PASS_DMB (1 << 59)
#define CPUACTLR_GRE_NGRE_AS_NGNRE (1 << 54)
#define CPUACTLR_DIS_OVERREAD (1 << 52)
#define CPUACTLR_NO_ALLOC_WBWA (1 << 49)
#define CPUACTLR_DCC_AS_DCCI (1 << 44)
#define CPUACTLR_FORCE_FPSCR_FLUSH (1 << 38)
#define CPUACTLR_DIS_STREAMING (3 << 27)
#define CPUACTLR_DIS_L1_STREAMING (3 << 25)
#define CPUACTLR_DIS_INDIRECT_PREDICTOR (1 << 4)
/*******************************************************************************
* L2 Control register specific definitions.
******************************************************************************/
#define L2CTLR p15, 1, c9, c0, 3
/* Instruction def. */
#define L2CTLR_DATA_RAM_LATENCY_SHIFT 0
#define L2CTLR_TAG_RAM_LATENCY_SHIFT 6
#define L2_DATA_RAM_LATENCY_3_CYCLES 0x2
#define L2_TAG_RAM_LATENCY_3_CYCLES 0x2
/*******************************************************************************
* L2 Extended Control register specific definitions.
******************************************************************************/
#define L2ECTLR p15, 1, c9, c0, 3
/* Instruction def. */
#define L2ECTLR_RET_CTRL_SHIFT 0
#define L2ECTLR_RET_CTRL_MASK (0x7 << L2ECTLR_RET_CTRL_SHIFT)
/*******************************************************************************
* L2 Memory Error Syndrome register specific definitions.
******************************************************************************/
#define L2MERRSR p15, 3, c15
/* Instruction def. */
#endif
/* __CORTEX_A57_H__ */
include/lib/cpus/aarch32/cortex_a72.h
0 → 100644
View file @
484acce3
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __CORTEX_A72_H__
#define __CORTEX_A72_H__
/* Cortex-A72 midr for revision 0 */
#define CORTEX_A72_MIDR 0x410FD080
/*******************************************************************************
* CPU Extended Control register specific definitions.
******************************************************************************/
#define CPUECTLR p15, 1, c15
/* Instruction def. */
#define CPUECTLR_SMP_BIT (1 << 6)
#define CPUECTLR_DIS_TWD_ACC_PFTCH_BIT (1 << 38)
#define CPUECTLR_L2_IPFTCH_DIST_MASK (0x3 << 35)
#define CPUECTLR_L2_DPFTCH_DIST_MASK (0x3 << 32)
/*******************************************************************************
* CPU Memory Error Syndrome register specific definitions.
******************************************************************************/
#define CPUMERRSR p15, 2, c15
/* Instruction def. */
/*******************************************************************************
* CPU Auxiliary Control register specific definitions.
******************************************************************************/
#define CPUACTLR p15, 0, c15
/* Instruction def. */
#define CPUACTLR_DISABLE_L1_DCACHE_HW_PFTCH (1 << 56)
#define CPUACTLR_NO_ALLOC_WBWA (1 << 49)
#define CPUACTLR_DCC_AS_DCCI (1 << 44)
/*******************************************************************************
* L2 Control register specific definitions.
******************************************************************************/
#define L2CTLR p15, 1, c9, c0, 3
/* Instruction def. */
#define L2CTLR_DATA_RAM_LATENCY_SHIFT 0
#define L2CTLR_TAG_RAM_LATENCY_SHIFT 6
#define L2_DATA_RAM_LATENCY_3_CYCLES 0x2
#define L2_TAG_RAM_LATENCY_2_CYCLES 0x1
#define L2_TAG_RAM_LATENCY_3_CYCLES 0x2
/*******************************************************************************
* L2 Memory Error Syndrome register specific definitions.
******************************************************************************/
#define L2MERRSR p15, 3, c15
/* Instruction def. */
#endif
/* __CORTEX_A72_H__ */
include/plat/arm/common/plat_arm.h
View file @
484acce3
...
@@ -81,7 +81,7 @@ void arm_setup_page_tables(uintptr_t total_base,
...
@@ -81,7 +81,7 @@ void arm_setup_page_tables(uintptr_t total_base,
#else
#else
/*
/*
* Empty macros for all other BL stages other than BL31
* Empty macros for all other BL stages other than BL31
and BL32
*/
*/
#define ARM_INSTANTIATE_LOCK
#define ARM_INSTANTIATE_LOCK
#define arm_lock_init()
#define arm_lock_init()
...
@@ -157,6 +157,7 @@ void arm_bl2_platform_setup(void);
...
@@ -157,6 +157,7 @@ void arm_bl2_platform_setup(void);
void
arm_bl2_plat_arch_setup
(
void
);
void
arm_bl2_plat_arch_setup
(
void
);
uint32_t
arm_get_spsr_for_bl32_entry
(
void
);
uint32_t
arm_get_spsr_for_bl32_entry
(
void
);
uint32_t
arm_get_spsr_for_bl33_entry
(
void
);
uint32_t
arm_get_spsr_for_bl33_entry
(
void
);
int
arm_bl2_handle_post_image_load
(
unsigned
int
image_id
);
/* BL2U utility functions */
/* BL2U utility functions */
void
arm_bl2u_early_platform_setup
(
struct
meminfo
*
mem_layout
,
void
arm_bl2u_early_platform_setup
(
struct
meminfo
*
mem_layout
,
...
...
include/plat/arm/soc/common/soc_css_def.h
View file @
484acce3
...
@@ -96,9 +96,16 @@
...
@@ -96,9 +96,16 @@
/*
/*
* Required platform porting definitions common to all ARM CSS SoCs
* Required platform porting definitions common to all ARM CSS SoCs
*/
*/
#if JUNO_AARCH32_EL3_RUNTIME
/*
* Following change is required to initialize TZC
* for enabling access to the HI_VECTOR (0xFFFF0000)
* location needed for JUNO AARCH32 support.
*/
#define PLAT_ARM_SCP_TZC_DRAM1_SIZE ULL(0x8000)
#else
/* 2MB used for SCP DDR retraining */
/* 2MB used for SCP DDR retraining */
#define PLAT_ARM_SCP_TZC_DRAM1_SIZE ULL(0x00200000)
#define PLAT_ARM_SCP_TZC_DRAM1_SIZE ULL(0x00200000)
#endif
#endif
/* __SOC_CSS_DEF_H__ */
#endif
/* __SOC_CSS_DEF_H__ */
lib/cpus/aarch32/cortex_a53.S
0 → 100644
View file @
484acce3
/*
*
Copyright
(
c
)
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <assert_macros.S>
#include <cortex_a53.h>
#include <cpu_macros.S>
#include <debug.h>
/
*
---------------------------------------------
*
Disable
intra
-
cluster
coherency
*
---------------------------------------------
*/
func
cortex_a53_disable_smp
ldcopr16
r0
,
r1
,
CPUECTLR
bic64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
isb
dsb
sy
bx
lr
endfunc
cortex_a53_disable_smp
/
*
-------------------------------------------------
*
The
CPU
Ops
reset
function
for
Cortex
-
A53
.
*
-------------------------------------------------
*/
func
cortex_a53_reset_func
/
*
---------------------------------------------
*
Enable
the
SMP
bit
.
*
---------------------------------------------
*/
ldcopr16
r0
,
r1
,
CPUECTLR
orr64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
isb
bx
lr
endfunc
cortex_a53_reset_func
/
*
----------------------------------------------------
*
The
CPU
Ops
core
power
down
function
for
Cortex
-
A53
.
*
----------------------------------------------------
*/
func
cortex_a53_core_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a53_disable_smp
endfunc
cortex_a53_core_pwr_dwn
/
*
-------------------------------------------------------
*
The
CPU
Ops
cluster
power
down
function
for
Cortex
-
A53
.
*
Clobbers
:
r0
-
r3
*
-------------------------------------------------------
*/
func
cortex_a53_cluster_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
/
*
---------------------------------------------
*
Disable
the
optional
ACP
.
*
---------------------------------------------
*/
bl
plat_disable_acp
/
*
---------------------------------------------
*
Flush
L2
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level2
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a53_disable_smp
endfunc
cortex_a53_cluster_pwr_dwn
declare_cpu_ops
cortex_a53
,
CORTEX_A53_MIDR
,
\
cortex_a53_reset_func
,
\
cortex_a53_core_pwr_dwn
,
\
cortex_a53_cluster_pwr_dwn
lib/cpus/aarch32/cortex_a57.S
0 → 100644
View file @
484acce3
/*
*
Copyright
(
c
)
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <assert_macros.S>
#include <cortex_a57.h>
#include <cpu_macros.S>
#include <debug.h>
/
*
---------------------------------------------
*
Disable
intra
-
cluster
coherency
*
Clobbers
:
r0
-
r1
*
---------------------------------------------
*/
func
cortex_a57_disable_smp
ldcopr16
r0
,
r1
,
CPUECTLR
bic64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
bx
lr
endfunc
cortex_a57_disable_smp
/
*
---------------------------------------------
*
Disable
all
types
of
L2
prefetches
.
*
Clobbers
:
r0
-
r2
*
---------------------------------------------
*/
func
cortex_a57_disable_l2_prefetch
ldcopr16
r0
,
r1
,
CPUECTLR
orr64_imm
r0
,
r1
,
CPUECTLR_DIS_TWD_ACC_PFTCH_BIT
bic64_imm
r0
,
r1
,
(
CPUECTLR_L2_IPFTCH_DIST_MASK
|
\
CPUECTLR_L2_DPFTCH_DIST_MASK
)
stcopr16
r0
,
r1
,
CPUECTLR
isb
dsb
ish
bx
lr
endfunc
cortex_a57_disable_l2_prefetch
/
*
---------------------------------------------
*
Disable
debug
interfaces
*
---------------------------------------------
*/
func
cortex_a57_disable_ext_debug
mov
r0
,
#
1
stcopr
r0
,
DBGOSDLR
isb
dsb
sy
bx
lr
endfunc
cortex_a57_disable_ext_debug
/
*
-------------------------------------------------
*
The
CPU
Ops
reset
function
for
Cortex
-
A57
.
*
-------------------------------------------------
*/
func
cortex_a57_reset_func
/
*
---------------------------------------------
*
Enable
the
SMP
bit
.
*
---------------------------------------------
*/
ldcopr16
r0
,
r1
,
CPUECTLR
orr64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
isb
bx
lr
endfunc
cortex_a57_reset_func
/
*
----------------------------------------------------
*
The
CPU
Ops
core
power
down
function
for
Cortex
-
A57
.
*
----------------------------------------------------
*/
func
cortex_a57_core_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Disable
the
L2
prefetches
.
*
---------------------------------------------
*/
bl
cortex_a57_disable_l2_prefetch
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
bl
cortex_a57_disable_smp
/
*
---------------------------------------------
*
Force
the
debug
interfaces
to
be
quiescent
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a57_disable_ext_debug
endfunc
cortex_a57_core_pwr_dwn
/
*
-------------------------------------------------------
*
The
CPU
Ops
cluster
power
down
function
for
Cortex
-
A57
.
*
Clobbers
:
r0
-
r3
*
-------------------------------------------------------
*/
func
cortex_a57_cluster_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Disable
the
L2
prefetches
.
*
---------------------------------------------
*/
bl
cortex_a57_disable_l2_prefetch
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
/
*
---------------------------------------------
*
Disable
the
optional
ACP
.
*
---------------------------------------------
*/
bl
plat_disable_acp
/
*
---------------------------------------------
*
Flush
L2
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level2
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
bl
cortex_a57_disable_smp
/
*
---------------------------------------------
*
Force
the
debug
interfaces
to
be
quiescent
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a57_disable_ext_debug
endfunc
cortex_a57_cluster_pwr_dwn
declare_cpu_ops
cortex_a57
,
CORTEX_A57_MIDR
,
\
cortex_a57_reset_func
,
\
cortex_a57_core_pwr_dwn
,
\
cortex_a57_cluster_pwr_dwn
lib/cpus/aarch32/cortex_a72.S
0 → 100644
View file @
484acce3
/*
*
Copyright
(
c
)
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <assert_macros.S>
#include <cortex_a72.h>
#include <cpu_macros.S>
#include <debug.h>
/
*
---------------------------------------------
*
Disable
all
types
of
L2
prefetches
.
*
---------------------------------------------
*/
func
cortex_a72_disable_l2_prefetch
ldcopr16
r0
,
r1
,
CPUECTLR
orr64_imm
r0
,
r1
,
CPUECTLR_DIS_TWD_ACC_PFTCH_BIT
bic64_imm
r0
,
r1
,
(
CPUECTLR_L2_IPFTCH_DIST_MASK
|
\
CPUECTLR_L2_DPFTCH_DIST_MASK
)
stcopr16
r0
,
r1
,
CPUECTLR
isb
bx
lr
endfunc
cortex_a72_disable_l2_prefetch
/
*
---------------------------------------------
*
Disable
the
load
-
store
hardware
prefetcher
.
*
---------------------------------------------
*/
func
cortex_a72_disable_hw_prefetcher
ldcopr16
r0
,
r1
,
CPUACTLR
orr64_imm
r0
,
r1
,
CPUACTLR_DISABLE_L1_DCACHE_HW_PFTCH
stcopr16
r0
,
r1
,
CPUACTLR
isb
dsb
ish
bx
lr
endfunc
cortex_a72_disable_hw_prefetcher
/
*
---------------------------------------------
*
Disable
intra
-
cluster
coherency
*
Clobbers
:
r0
-
r1
*
---------------------------------------------
*/
func
cortex_a72_disable_smp
ldcopr16
r0
,
r1
,
CPUECTLR
bic64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
bx
lr
endfunc
cortex_a72_disable_smp
/
*
---------------------------------------------
*
Disable
debug
interfaces
*
---------------------------------------------
*/
func
cortex_a72_disable_ext_debug
mov
r0
,
#
1
stcopr
r0
,
DBGOSDLR
isb
dsb
sy
bx
lr
endfunc
cortex_a72_disable_ext_debug
/
*
-------------------------------------------------
*
The
CPU
Ops
reset
function
for
Cortex
-
A72
.
*
-------------------------------------------------
*/
func
cortex_a72_reset_func
/
*
---------------------------------------------
*
Enable
the
SMP
bit
.
*
---------------------------------------------
*/
ldcopr16
r0
,
r1
,
CPUECTLR
orr64_imm
r0
,
r1
,
CPUECTLR_SMP_BIT
stcopr16
r0
,
r1
,
CPUECTLR
isb
bx
lr
endfunc
cortex_a72_reset_func
/
*
----------------------------------------------------
*
The
CPU
Ops
core
power
down
function
for
Cortex
-
A72
.
*
----------------------------------------------------
*/
func
cortex_a72_core_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Disable
the
L2
prefetches
.
*
---------------------------------------------
*/
bl
cortex_a72_disable_l2_prefetch
/
*
---------------------------------------------
*
Disable
the
load
-
store
hardware
prefetcher
.
*
---------------------------------------------
*/
bl
cortex_a72_disable_hw_prefetcher
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
bl
cortex_a72_disable_smp
/
*
---------------------------------------------
*
Force
the
debug
interfaces
to
be
quiescent
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a72_disable_ext_debug
endfunc
cortex_a72_core_pwr_dwn
/
*
-------------------------------------------------------
*
The
CPU
Ops
cluster
power
down
function
for
Cortex
-
A72
.
*
-------------------------------------------------------
*/
func
cortex_a72_cluster_pwr_dwn
push
{
r12
,
lr
}
/
*
Assert
if
cache
is
enabled
*/
#if ASM_ASSERTION
ldcopr
r0
,
SCTLR
tst
r0
,
#
SCTLR_C_BIT
ASM_ASSERT
(
eq
)
#endif
/
*
---------------------------------------------
*
Disable
the
L2
prefetches
.
*
---------------------------------------------
*/
bl
cortex_a72_disable_l2_prefetch
/
*
---------------------------------------------
*
Disable
the
load
-
store
hardware
prefetcher
.
*
---------------------------------------------
*/
bl
cortex_a72_disable_hw_prefetcher
#if !SKIP_A72_L1_FLUSH_PWR_DWN
/
*
---------------------------------------------
*
Flush
L1
caches
.
*
---------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level1
#endif
/
*
---------------------------------------------
*
Disable
the
optional
ACP
.
*
---------------------------------------------
*/
bl
plat_disable_acp
/
*
-------------------------------------------------
*
Flush
the
L2
caches
.
*
-------------------------------------------------
*/
mov
r0
,
#
DC_OP_CISW
bl
dcsw_op_level2
/
*
---------------------------------------------
*
Come
out
of
intra
cluster
coherency
*
---------------------------------------------
*/
bl
cortex_a72_disable_smp
/
*
---------------------------------------------
*
Force
the
debug
interfaces
to
be
quiescent
*
---------------------------------------------
*/
pop
{
r12
,
lr
}
b
cortex_a72_disable_ext_debug
endfunc
cortex_a72_cluster_pwr_dwn
declare_cpu_ops
cortex_a72
,
CORTEX_A72_MIDR
,
\
cortex_a72_reset_func
,
\
cortex_a72_core_pwr_dwn
,
\
cortex_a72_cluster_pwr_dwn
plat/arm/board/common/board_css_common.c
View file @
484acce3
...
@@ -79,6 +79,9 @@ const mmap_region_t plat_arm_mmap[] = {
...
@@ -79,6 +79,9 @@ const mmap_region_t plat_arm_mmap[] = {
#endif
#endif
#ifdef IMAGE_BL32
#ifdef IMAGE_BL32
const
mmap_region_t
plat_arm_mmap
[]
=
{
const
mmap_region_t
plat_arm_mmap
[]
=
{
#ifdef AARCH32
ARM_MAP_SHARED_RAM
,
#endif
V2M_MAP_IOFPGA
,
V2M_MAP_IOFPGA
,
CSS_MAP_DEVICE
,
CSS_MAP_DEVICE
,
SOC_CSS_MAP_DEVICE
,
SOC_CSS_MAP_DEVICE
,
...
...
plat/arm/board/juno/aarch32/juno_helpers.S
0 → 100644
View file @
484acce3
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <bl_common.h>
#include <cortex_a53.h>
#include <cortex_a57.h>
#include <cortex_a72.h>
#include <v2m_def.h>
#include "../juno_def.h"
.
globl
plat_reset_handler
.
globl
plat_arm_calc_core_pos
#define JUNO_REVISION(rev) REV_JUNO_R##rev
#define JUNO_HANDLER(rev) plat_reset_handler_juno_r##rev
#define JUMP_TO_HANDLER_IF_JUNO_R(revision) \
jump_to_handler
JUNO_REVISION
(
revision
),
JUNO_HANDLER
(
revision
)
/
*
--------------------------------------------------------------------
*
Helper
macro
to
jump
to
the
given
handler
if
the
board
revision
*
matches
.
*
Expects
the
Juno
board
revision
in
x0
.
*
--------------------------------------------------------------------
*/
.
macro
jump_to_handler
_revision
,
_handler
cmp
r0
,
#
\
_revision
beq
\
_handler
.
endm
/
*
--------------------------------------------------------------------
*
Helper
macro
that
reads
the
part
number
of
the
current
CPU
and
jumps
*
to
the
given
label
if
it
matches
the
CPU
MIDR
provided
.
*
*
Clobbers
r0
.
*
--------------------------------------------------------------------
*/
.
macro
jump_if_cpu_midr
_cpu_midr
,
_label
ldcopr
r0
,
MIDR
ubfx
r0
,
r0
,
#
MIDR_PN_SHIFT
,
#
12
ldr
r1
,
=((
\
_cpu_midr
>>
MIDR_PN_SHIFT
)
&
MIDR_PN_MASK
)
cmp
r0
,
r1
beq
\
_label
.
endm
/
*
--------------------------------------------------------------------
*
Platform
reset
handler
for
Juno
R0
.
*
*
Juno
R0
has
the
following
topology
:
*
-
Quad
core
Cortex
-
A53
processor
cluster
;
*
-
Dual
core
Cortex
-
A57
processor
cluster
.
*
*
This
handler
does
the
following
:
*
-
Implement
workaround
for
defect
id
831273
by
enabling
an
event
*
stream
every
65536
cycles
.
*
-
Set
the
L2
Data
RAM
latency
to
2
(
i
.
e
.
3
cycles
)
for
Cortex
-
A57
*
-
Set
the
L2
Tag
RAM
latency
to
2
(
i
.
e
.
3
cycles
)
for
Cortex
-
A57
*
--------------------------------------------------------------------
*/
func
JUNO_HANDLER
(0)
/
*
--------------------------------------------------------------------
*
Enable
the
event
stream
every
65536
cycles
*
--------------------------------------------------------------------
*/
mov
r0
,
#(
0xf
<<
EVNTI_SHIFT
)
orr
r0
,
r0
,
#
EVNTEN_BIT
stcopr
r0
,
CNTKCTL
/
*
--------------------------------------------------------------------
*
Nothing
else
to
do
on
Cortex
-
A53
.
*
--------------------------------------------------------------------
*/
jump_if_cpu_midr
CORTEX_A53_MIDR
,
1
f
/
*
--------------------------------------------------------------------
*
Cortex
-
A57
specific
settings
*
--------------------------------------------------------------------
*/
mov
r0
,
#((
L2_DATA_RAM_LATENCY_3_CYCLES
<<
L2CTLR_DATA_RAM_LATENCY_SHIFT
)
|
\
(
L2_TAG_RAM_LATENCY_3_CYCLES
<<
L2CTLR_TAG_RAM_LATENCY_SHIFT
))
stcopr
r0
,
L2CTLR
1
:
isb
bx
lr
endfunc
JUNO_HANDLER
(0)
/
*
--------------------------------------------------------------------
*
Platform
reset
handler
for
Juno
R1
.
*
*
Juno
R1
has
the
following
topology
:
*
-
Quad
core
Cortex
-
A53
processor
cluster
;
*
-
Dual
core
Cortex
-
A57
processor
cluster
.
*
*
This
handler
does
the
following
:
*
-
Set
the
L2
Data
RAM
latency
to
2
(
i
.
e
.
3
cycles
)
for
Cortex
-
A57
*
*
Note
that
:
*
-
The
default
value
for
the
L2
Tag
RAM
latency
for
Cortex
-
A57
is
*
suitable
.
*
-
Defect
#
831273
doesn
't affect Juno R1.
*
--------------------------------------------------------------------
*/
func
JUNO_HANDLER
(1)
/
*
--------------------------------------------------------------------
*
Nothing
to
do
on
Cortex
-
A53
.
*
--------------------------------------------------------------------
*/
jump_if_cpu_midr
CORTEX_A57_MIDR
,
A57
bx
lr
A57
:
/
*
--------------------------------------------------------------------
*
Cortex
-
A57
specific
settings
*
--------------------------------------------------------------------
*/
mov
r0
,
#(
L2_DATA_RAM_LATENCY_3_CYCLES
<<
L2CTLR_DATA_RAM_LATENCY_SHIFT
)
stcopr
r0
,
L2CTLR
isb
bx
lr
endfunc
JUNO_HANDLER
(1)
/
*
--------------------------------------------------------------------
*
Platform
reset
handler
for
Juno
R2
.
*
*
Juno
R2
has
the
following
topology
:
*
-
Quad
core
Cortex
-
A53
processor
cluster
;
*
-
Dual
core
Cortex
-
A72
processor
cluster
.
*
*
This
handler
does
the
following
:
*
-
Set
the
L2
Data
RAM
latency
to
2
(
i
.
e
.
3
cycles
)
for
Cortex
-
A72
*
-
Set
the
L2
Tag
RAM
latency
to
1
(
i
.
e
.
2
cycles
)
for
Cortex
-
A72
*
*
Note
that
:
*
-
Defect
#
831273
doesn
't affect Juno R2.
*
--------------------------------------------------------------------
*/
func
JUNO_HANDLER
(2)
/
*
--------------------------------------------------------------------
*
Nothing
to
do
on
Cortex
-
A53
.
*
--------------------------------------------------------------------
*/
jump_if_cpu_midr
CORTEX_A72_MIDR
,
A72
bx
lr
A72
:
/
*
--------------------------------------------------------------------
*
Cortex
-
A72
specific
settings
*
--------------------------------------------------------------------
*/
mov
r0
,
#((
L2_DATA_RAM_LATENCY_3_CYCLES
<<
L2CTLR_DATA_RAM_LATENCY_SHIFT
)
|
\
(
L2_TAG_RAM_LATENCY_2_CYCLES
<<
L2CTLR_TAG_RAM_LATENCY_SHIFT
))
stcopr
r0
,
L2CTLR
isb
bx
lr
endfunc
JUNO_HANDLER
(2)
/
*
--------------------------------------------------------------------
*
void
plat_reset_handler
(
void
)
;
*
*
Determine
the
Juno
board
revision
and
call
the
appropriate
reset
*
handler
.
*
--------------------------------------------------------------------
*/
func
plat_reset_handler
/
*
Read
the
V2M
SYS_ID
register
*/
ldr
r0
,
=(
V2M_SYSREGS_BASE
+
V2M_SYS_ID
)
ldr
r1
,
[
r0
]
/
*
Extract
board
revision
from
the
SYS_ID
*/
ubfx
r0
,
r1
,
#
V2M_SYS_ID_REV_SHIFT
,
#
4
JUMP_TO_HANDLER_IF_JUNO_R
(0)
JUMP_TO_HANDLER_IF_JUNO_R
(1)
JUMP_TO_HANDLER_IF_JUNO_R
(2)
/
*
Board
revision
is
not
supported
*/
no_ret
plat_panic_handler
endfunc
plat_reset_handler
/
*
-----------------------------------------------------
*
unsigned
int
plat_arm_calc_core_pos
(
u_register_t
mpidr
)
*
Helper
function
to
calculate
the
core
position
.
*
-----------------------------------------------------
*/
func
plat_arm_calc_core_pos
b
css_calc_core_pos_swap_cluster
endfunc
plat_arm_calc_core_pos
plat/arm/board/juno/aarch64/juno_helpers.S
View file @
484acce3
...
@@ -34,12 +34,18 @@
...
@@ -34,12 +34,18 @@
#include <cortex_a53.h>
#include <cortex_a53.h>
#include <cortex_a57.h>
#include <cortex_a57.h>
#include <cortex_a72.h>
#include <cortex_a72.h>
#include <cpu_macros.S>
#include <css_def.h>
#include <v2m_def.h>
#include <v2m_def.h>
#include "../juno_def.h"
#include "../juno_def.h"
.
globl
plat_reset_handler
.
globl
plat_reset_handler
.
globl
plat_arm_calc_core_pos
.
globl
plat_arm_calc_core_pos
#if JUNO_AARCH32_EL3_RUNTIME
.
globl
plat_get_my_entrypoint
.
globl
juno_reset_to_aarch32_state
#endif
#define JUNO_REVISION(rev) REV_JUNO_R##rev
#define JUNO_REVISION(rev) REV_JUNO_R##rev
#define JUNO_HANDLER(rev) plat_reset_handler_juno_r##rev
#define JUNO_HANDLER(rev) plat_reset_handler_juno_r##rev
...
@@ -205,6 +211,20 @@ func plat_reset_handler
...
@@ -205,6 +211,20 @@ func plat_reset_handler
endfunc
plat_reset_handler
endfunc
plat_reset_handler
/
*
-----------------------------------------------------
*
void
juno_do_reset_to_aarch32_state
(
void
)
;
*
*
Request
warm
reset
to
AArch32
mode
.
*
-----------------------------------------------------
*/
func
juno_do_reset_to_aarch32_state
mov
x0
,
#
RMR_EL3_RR_BIT
dsb
sy
msr
rmr_el3
,
x0
isb
wfi
endfunc
juno_do_reset_to_aarch32_state
/
*
-----------------------------------------------------
/
*
-----------------------------------------------------
*
unsigned
int
plat_arm_calc_core_pos
(
u_register_t
mpidr
)
*
unsigned
int
plat_arm_calc_core_pos
(
u_register_t
mpidr
)
*
Helper
function
to
calculate
the
core
position
.
*
Helper
function
to
calculate
the
core
position
.
...
@@ -213,3 +233,77 @@ endfunc plat_reset_handler
...
@@ -213,3 +233,77 @@ endfunc plat_reset_handler
func
plat_arm_calc_core_pos
func
plat_arm_calc_core_pos
b
css_calc_core_pos_swap_cluster
b
css_calc_core_pos_swap_cluster
endfunc
plat_arm_calc_core_pos
endfunc
plat_arm_calc_core_pos
#if JUNO_AARCH32_EL3_RUNTIME
/
*
---------------------------------------------------------------------
*
uintptr_t
plat_get_my_entrypoint
(
void
)
;
*
*
Main
job
of
this
routine
is
to
distinguish
between
a
cold
and
a
warm
*
boot
.
On
JUNO
platform
,
this
distinction
is
based
on
the
contents
of
*
the
Trusted
Mailbox
.
It
is
initialised
to
zero
by
the
SCP
before
the
*
AP
cores
are
released
from
reset
.
Therefore
,
a
zero
mailbox
means
*
it
's a cold reset. If it is a warm boot then a request to reset to
*
AArch32
state
is
issued
.
This
is
the
only
way
to
reset
to
AArch32
*
in
EL3
on
Juno
.
A
trampoline
located
at
the
high
vector
address
*
has
already
been
prepared
by
BL1
.
*
*
This
functions
returns
the
contents
of
the
mailbox
,
i
.
e
.
:
*
-
0
for
a
cold
boot
;
*
-
request
warm
reset
in
AArch32
state
for
warm
boot
case
;
*
---------------------------------------------------------------------
*/
func
plat_get_my_entrypoint
mov_imm
x0
,
PLAT_ARM_TRUSTED_MAILBOX_BASE
ldr
x0
,
[
x0
]
cbz
x0
,
return
b
juno_do_reset_to_aarch32_state
1
:
b
1
b
return
:
ret
endfunc
plat_get_my_entrypoint
/*
*
Emit
a
"movw r0, #imm16"
which
moves
the
lower
*
16
bits
of
`
_val
`
into
r0
.
*/
.
macro
emit_movw
_reg_d
,
_val
mov_imm
\
_reg_d
,
(
0xe3000000
|
\
((\
_val
&
0xfff
)
|
\
((\
_val
&
0xf000
)
<<
4
)))
.
endm
/*
*
Emit
a
"movt r0, #imm16"
which
moves
the
upper
*
16
bits
of
`
_val
`
into
r0
.
*/
.
macro
emit_movt
_reg_d
,
_val
mov_imm
\
_reg_d
,
(
0xe3400000
|
\
(((\
_val
&
0x0fff0000
)
>>
16
)
|
\
((\
_val
&
0xf0000000
)
>>
12
)))
.
endm
/*
*
This
function
writes
the
trampoline
code
at
HI
-
VEC
(
0xFFFF0000
)
*
address
which
loads
r0
with
the
entrypoint
address
for
*
BL32
(
a
.
k
.
a
SP_MIN
)
when
EL3
is
in
AArch32
mode
.
A
warm
reset
*
to
AArch32
mode
is
then
requested
by
writing
into
RMR_EL3
.
*/
func
juno_reset_to_aarch32_state
emit_movw
w0
,
BL32_BASE
emit_movt
w1
,
BL32_BASE
/
*
opcode
"bx r0"
to
branch
using
r0
in
AArch32
mode
*/
mov_imm
w2
,
0xe12fff10
/
*
Write
the
above
opcodes
at
HI
-
VECTOR
location
*/
mov_imm
x3
,
HI_VECTOR_BASE
str
w0
,
[
x3
],
#
4
str
w1
,
[
x3
],
#
4
str
w2
,
[
x3
]
bl
juno_do_reset_to_aarch32_state
1
:
b
1
b
endfunc
juno_reset_to_aarch32_state
#endif /* JUNO_AARCH32_EL3_RUNTIME */
plat/arm/board/juno/include/platform_def.h
View file @
484acce3
...
@@ -103,8 +103,8 @@
...
@@ -103,8 +103,8 @@
#endif
#endif
#ifdef IMAGE_BL32
#ifdef IMAGE_BL32
# define PLAT_ARM_MMAP_ENTRIES
4
# define PLAT_ARM_MMAP_ENTRIES
5
# define MAX_XLAT_TABLES
3
# define MAX_XLAT_TABLES
4
#endif
#endif
/*
/*
...
...
plat/arm/board/juno/juno_bl1_setup.c
View file @
484acce3
/*
/*
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015
-2016
, ARM Limited and Contributors. All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* modification, are permitted provided that the following conditions are met:
...
@@ -32,11 +32,15 @@
...
@@ -32,11 +32,15 @@
#include <errno.h>
#include <errno.h>
#include <platform.h>
#include <platform.h>
#include <plat_arm.h>
#include <plat_arm.h>
#include <sp805.h>
#include <tbbr_img_def.h>
#include <tbbr_img_def.h>
#include <v2m_def.h>
#include <v2m_def.h>
#define RESET_REASON_WDOG_RESET (0x2)
#define RESET_REASON_WDOG_RESET (0x2)
void
juno_reset_to_aarch32_state
(
void
);
/*******************************************************************************
/*******************************************************************************
* The following function checks if Firmware update is needed,
* The following function checks if Firmware update is needed,
* by checking if TOC in FIP image is valid or watchdog reset happened.
* by checking if TOC in FIP image is valid or watchdog reset happened.
...
@@ -85,3 +89,15 @@ __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved)
...
@@ -85,3 +89,15 @@ __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved)
while
(
1
)
while
(
1
)
wfi
();
wfi
();
}
}
#if JUNO_AARCH32_EL3_RUNTIME
void
bl1_plat_prepare_exit
(
entry_point_info_t
*
ep_info
)
{
#if !ARM_DISABLE_TRUSTED_WDOG
/* Disable watchdog before leaving BL1 */
sp805_stop
(
ARM_SP805_TWDG_BASE
);
#endif
juno_reset_to_aarch32_state
();
}
#endif
/* JUNO_AARCH32_EL3_RUNTIME */
plat/arm/board/juno/juno_bl2_setup.c
0 → 100644
View file @
484acce3
/*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <assert.h>
#include <bl_common.h>
#include <desc_image_load.h>
#include <plat_arm.h>
#if JUNO_AARCH32_EL3_RUNTIME
/*******************************************************************************
* This function changes the spsr for BL32 image to bypass
* the check in BL1 AArch64 exception handler. This is needed in the aarch32
* boot flow as the core comes up in aarch64 and to enter the BL32 image a warm
* reset in aarch32 state is required.
******************************************************************************/
int
bl2_plat_handle_post_image_load
(
unsigned
int
image_id
)
{
int
err
=
arm_bl2_handle_post_image_load
(
image_id
);
if
(
!
err
&&
(
image_id
==
BL32_IMAGE_ID
))
{
bl_mem_params_node_t
*
bl_mem_params
=
get_bl_mem_params_node
(
image_id
);
assert
(
bl_mem_params
);
bl_mem_params
->
ep_info
.
spsr
=
SPSR_64
(
MODE_EL3
,
MODE_SP_ELX
,
DISABLE_ALL_EXCEPTIONS
);
}
return
err
;
}
#endif
/* JUNO_AARCH32_EL3_RUNTIME */
plat/arm/board/juno/platform.mk
View file @
484acce3
...
@@ -48,8 +48,14 @@ endif
...
@@ -48,8 +48,14 @@ endif
PLAT_INCLUDES
:=
-Iplat
/arm/board/juno/include
PLAT_INCLUDES
:=
-Iplat
/arm/board/juno/include
PLAT_BL_COMMON_SOURCES
:=
plat/arm/board/juno/
aarch64
/juno_helpers.S
PLAT_BL_COMMON_SOURCES
:=
plat/arm/board/juno/
${ARCH}
/juno_helpers.S
# Flag to enable support for AArch32 state on JUNO
JUNO_AARCH32_EL3_RUNTIME
:=
0
$(eval
$(call
assert_boolean,JUNO_AARCH32_EL3_RUNTIME))
$(eval
$(call
add_define,JUNO_AARCH32_EL3_RUNTIME))
ifeq
(${ARCH},aarch64)
BL1_SOURCES
+=
lib/cpus/aarch64/cortex_a53.S
\
BL1_SOURCES
+=
lib/cpus/aarch64/cortex_a53.S
\
lib/cpus/aarch64/cortex_a57.S
\
lib/cpus/aarch64/cortex_a57.S
\
lib/cpus/aarch64/cortex_a72.S
\
lib/cpus/aarch64/cortex_a72.S
\
...
@@ -59,6 +65,7 @@ BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \
...
@@ -59,6 +65,7 @@ BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \
${JUNO_SECURITY_SOURCES}
${JUNO_SECURITY_SOURCES}
BL2_SOURCES
+=
plat/arm/board/juno/juno_err.c
\
BL2_SOURCES
+=
plat/arm/board/juno/juno_err.c
\
plat/arm/board/juno/juno_bl2_setup.c
\
${JUNO_SECURITY_SOURCES}
${JUNO_SECURITY_SOURCES}
BL2U_SOURCES
+=
${JUNO_SECURITY_SOURCES}
BL2U_SOURCES
+=
${JUNO_SECURITY_SOURCES}
...
@@ -71,6 +78,7 @@ BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \
...
@@ -71,6 +78,7 @@ BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \
${JUNO_GIC_SOURCES}
\
${JUNO_GIC_SOURCES}
\
${JUNO_INTERCONNECT_SOURCES}
\
${JUNO_INTERCONNECT_SOURCES}
\
${JUNO_SECURITY_SOURCES}
${JUNO_SECURITY_SOURCES}
endif
# Enable workarounds for selected Cortex-A53 and A57 errata.
# Enable workarounds for selected Cortex-A53 and A57 errata.
ERRATA_A53_855873
:=
1
ERRATA_A53_855873
:=
1
...
...
plat/arm/board/juno/sp_min/sp_min-juno.mk
0 → 100644
View file @
484acce3
#
# Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# Neither the name of ARM nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# SP_MIN source files specific to JUNO platform
BL32_SOURCES
+=
lib/cpus/aarch32/cortex_a53.S
\
lib/cpus/aarch32/cortex_a57.S
\
lib/cpus/aarch32/cortex_a72.S
\
plat/arm/board/juno/juno_pm.c
\
plat/arm/board/juno/juno_topology.c
\
plat/arm/css/common/css_pm.c
\
plat/arm/css/common/css_topology.c
\
plat/arm/soc/common/soc_css_security.c
\
plat/arm/css/drivers/scp/css_pm_scpi.c
\
plat/arm/css/drivers/scpi/css_mhu.c
\
plat/arm/css/drivers/scpi/css_scpi.c
\
${JUNO_GIC_SOURCES}
\
${JUNO_INTERCONNECT_SOURCES}
\
${JUNO_SECURITY_SOURCES}
include
plat/arm/common/sp_min/arm_sp_min.mk
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment