Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
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
0f22bef3
Commit
0f22bef3
authored
7 years ago
by
Scott Branden
Committed by
GitHub
7 years ago
Browse files
Options
Download
Plain Diff
Merge branch 'integration' into tf_issue_461
parents
53d9c9c8
dd454b40
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
v2.1
v2.1-rc1
v2.1-rc0
v2.0
v2.0-rc0
v1.6
v1.6-rc1
v1.6-rc0
v1.5
v1.5-rc3
v1.5-rc2
v1.5-rc1
v1.5-rc0
v1.4
v1.4-rc0
arm_cca_v0.2
arm_cca_v0.1
Changes
132
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
lib/psci/psci_suspend.c
+1
-1
lib/psci/psci_suspend.c
lib/psci/psci_system_off.c
+6
-1
lib/psci/psci_system_off.c
lib/stdlib/assert.c
+14
-6
lib/stdlib/assert.c
lib/xlat_tables/aarch32/xlat_tables.c
+3
-3
lib/xlat_tables/aarch32/xlat_tables.c
lib/xlat_tables/aarch64/xlat_tables.c
+2
-2
lib/xlat_tables/aarch64/xlat_tables.c
lib/xlat_tables/xlat_tables_common.c
+9
-8
lib/xlat_tables/xlat_tables_common.c
lib/xlat_tables_v2/aarch32/xlat_tables_arch.c
+2
-2
lib/xlat_tables_v2/aarch32/xlat_tables_arch.c
lib/xlat_tables_v2/aarch64/xlat_tables_arch.c
+2
-2
lib/xlat_tables_v2/aarch64/xlat_tables_arch.c
lib/xlat_tables_v2/xlat_tables_common.c
+2
-2
lib/xlat_tables_v2/xlat_tables_common.c
lib/xlat_tables_v2/xlat_tables_internal.c
+2
-2
lib/xlat_tables_v2/xlat_tables_internal.c
make_helpers/defaults.mk
+6
-0
make_helpers/defaults.mk
plat/arm/board/common/board_css_common.c
+3
-0
plat/arm/board/common/board_css_common.c
plat/arm/board/juno/aarch32/juno_helpers.S
+216
-0
plat/arm/board/juno/aarch32/juno_helpers.S
plat/arm/board/juno/aarch64/juno_helpers.S
+94
-0
plat/arm/board/juno/aarch64/juno_helpers.S
plat/arm/board/juno/include/platform_def.h
+2
-2
plat/arm/board/juno/include/platform_def.h
plat/arm/board/juno/juno_bl1_setup.c
+17
-1
plat/arm/board/juno/juno_bl1_setup.c
plat/arm/board/juno/juno_bl2_setup.c
+56
-0
plat/arm/board/juno/juno_bl2_setup.c
plat/arm/board/juno/platform.mk
+9
-2
plat/arm/board/juno/platform.mk
plat/arm/board/juno/sp_min/sp_min-juno.mk
+47
-0
plat/arm/board/juno/sp_min/sp_min-juno.mk
plat/arm/common/aarch32/arm_helpers.S
+17
-3
plat/arm/common/aarch32/arm_helpers.S
with
510 additions
and
37 deletions
+510
-37
lib/psci/psci_suspend.c
View file @
0f22bef3
...
...
@@ -302,7 +302,7 @@ void psci_cpu_suspend_finish(unsigned int cpu_idx,
*/
psci_plat_pm_ops
->
pwr_domain_suspend_finish
(
state_info
);
#if !HW_ASSISTED_COHERENCY
#if !
(
HW_ASSISTED_COHERENCY
|| WARMBOOT_ENABLE_DCACHE_EARLY)
/* Arch. management: Enable the data cache, stack memory maintenance. */
psci_do_pwrup_cache_maintenance
();
#endif
...
...
This diff is collapsed.
Click to expand it.
lib/psci/psci_system_off.c
View file @
0f22bef3
/*
* Copyright (c) 2014-201
6
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2014-201
7
, 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:
...
...
@@ -31,6 +31,7 @@
#include <stddef.h>
#include <arch_helpers.h>
#include <assert.h>
#include <console.h>
#include <debug.h>
#include <platform.h>
#include "psci_private.h"
...
...
@@ -46,6 +47,8 @@ void psci_system_off(void)
psci_spd_pm
->
svc_system_off
();
}
console_flush
();
/* Call the platform specific hook */
psci_plat_pm_ops
->
system_off
();
...
...
@@ -63,6 +66,8 @@ void psci_system_reset(void)
psci_spd_pm
->
svc_system_reset
();
}
console_flush
();
/* Call the platform specific hook */
psci_plat_pm_ops
->
system_reset
();
...
...
This diff is collapsed.
Click to expand it.
lib/stdlib/assert.c
View file @
0f22bef3
/*
* Copyright (c) 2013-201
4
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-201
7
, 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:
...
...
@@ -28,14 +28,22 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <console.h>
#include <debug.h>
#include <platform.h>
/*
* This is a basic implementation. This could be improved.
*/
void
__assert
(
const
char
*
function
,
const
char
*
file
,
unsigned
int
line
,
void
__assert
(
const
char
*
function
,
const
char
*
file
,
unsigned
int
line
,
const
char
*
assertion
)
{
#if LOG_LEVEL >= LOG_LEVEL_INFO
/*
* Only print the output if LOG_LEVEL is higher or equal to
* LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1.
*/
tf_printf
(
"ASSERT: %s <%d> : %s
\n
"
,
function
,
line
,
assertion
);
while
(
1
);
console_flush
();
#endif
plat_panic_handler
();
}
This diff is collapsed.
Click to expand it.
lib/xlat_tables/aarch32/xlat_tables.c
View file @
0f22bef3
/*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2016
-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:
...
...
@@ -85,13 +85,13 @@
static
uint64_t
base_xlation_table
[
NUM_BASE_LEVEL_ENTRIES
]
__aligned
(
NUM_BASE_LEVEL_ENTRIES
*
sizeof
(
uint64_t
));
#if
DEBUG
#if
ENABLE_ASSERTIONS
static
unsigned
long
long
get_max_supported_pa
(
void
)
{
/* Physical address space size for long descriptor format. */
return
(
1ULL
<<
40
)
-
1ULL
;
}
#endif
#endif
/* ENABLE_ASSERTIONS */
void
init_xlat_tables
(
void
)
{
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables/aarch64/xlat_tables.c
View file @
0f22bef3
...
...
@@ -127,7 +127,7 @@ static unsigned long long calc_physical_addr_size_bits(
return
TCR_PS_BITS_4GB
;
}
#if
DEBUG
#if
ENABLE_ASSERTIONS
/* Physical Address ranges supported in the AArch64 Memory Model */
static
const
unsigned
int
pa_range_bits_arr
[]
=
{
PARANGE_0000
,
PARANGE_0001
,
PARANGE_0010
,
PARANGE_0011
,
PARANGE_0100
,
...
...
@@ -144,7 +144,7 @@ static unsigned long long get_max_supported_pa(void)
return
(
1ULL
<<
pa_range_bits_arr
[
pa_range
])
-
1ULL
;
}
#endif
#endif
/* ENABLE_ASSERTIONS */
void
init_xlat_tables
(
void
)
{
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables/xlat_tables_common.c
View file @
0f22bef3
/*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2016
-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:
...
...
@@ -87,7 +87,7 @@ void print_mmap(void)
}
void
mmap_add_region
(
unsigned
long
long
base_pa
,
uintptr_t
base_va
,
size_t
size
,
unsigned
in
t
attr
)
size_t
size
,
mmap_attr_
t
attr
)
{
mmap_region_t
*
mm
=
mmap
;
mmap_region_t
*
mm_last
=
mm
+
ARRAY_SIZE
(
mmap
)
-
1
;
...
...
@@ -109,7 +109,7 @@ void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
assert
((
base_pa
+
(
unsigned
long
long
)
size
-
1ULL
)
<=
(
PLAT_PHY_ADDR_SPACE_SIZE
-
1
));
#if
DEBUG
#if
ENABLE_ASSERTIONS
/* Check for PAs and VAs overlaps with all other regions */
for
(
mm
=
mmap
;
mm
->
size
;
++
mm
)
{
...
...
@@ -154,7 +154,7 @@ void mmap_add_region(unsigned long long base_pa, uintptr_t base_va,
mm
=
mmap
;
/* Restore pointer to the start of the array */
#endif
/*
DEBUG
*/
#endif
/*
ENABLE_ASSERTIONS
*/
/* Find correct place in mmap to insert new region */
while
(
mm
->
base_va
<
base_va
&&
mm
->
size
)
...
...
@@ -199,7 +199,7 @@ void mmap_add(const mmap_region_t *mm)
}
}
static
uint64_t
mmap_desc
(
unsigned
attr
,
unsigned
long
long
addr_pa
,
static
uint64_t
mmap_desc
(
mmap_attr_t
attr
,
unsigned
long
long
addr_pa
,
int
level
)
{
uint64_t
desc
;
...
...
@@ -277,11 +277,11 @@ static uint64_t mmap_desc(unsigned attr, unsigned long long addr_pa,
* attributes of the innermost region that contains it. If there are partial
* overlaps, it returns -1, as a smaller size is needed.
*/
static
in
t
mmap_region_attr
(
mmap_region_t
*
mm
,
uintptr_t
base_va
,
static
mmap_attr_
t
mmap_region_attr
(
mmap_region_t
*
mm
,
uintptr_t
base_va
,
size_t
size
)
{
/* Don't assume that the area is contained in the first region */
in
t
attr
=
-
1
;
mmap_attr_
t
attr
=
-
1
;
/*
* Get attributes from last (innermost) region that contains the
...
...
@@ -360,7 +360,8 @@ static mmap_region_t *init_xlation_table_inner(mmap_region_t *mm,
* there are partially overlapping regions. On success,
* it will return the innermost region's attributes.
*/
int
attr
=
mmap_region_attr
(
mm
,
base_va
,
level_size
);
mmap_attr_t
attr
=
mmap_region_attr
(
mm
,
base_va
,
level_size
);
if
(
attr
>=
0
)
{
desc
=
mmap_desc
(
attr
,
base_va
-
mm
->
base_va
+
mm
->
base_pa
,
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables_v2/aarch32/xlat_tables_arch.c
View file @
0f22bef3
...
...
@@ -37,13 +37,13 @@
#include <xlat_tables_v2.h>
#include "../xlat_tables_private.h"
#if
DEBUG
#if
ENABLE_ASSERTIONS
static
unsigned
long
long
xlat_arch_get_max_supported_pa
(
void
)
{
/* Physical address space size for long descriptor format. */
return
(
1ull
<<
40
)
-
1ull
;
}
#endif
/*
DEBUG
*/
#endif
/*
ENABLE_ASSERTIONS
*/
int
is_mmu_enabled
(
void
)
{
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables_v2/aarch64/xlat_tables_arch.c
View file @
0f22bef3
...
...
@@ -77,7 +77,7 @@ static unsigned long long calc_physical_addr_size_bits(
return
TCR_PS_BITS_4GB
;
}
#if
DEBUG
#if
ENABLE_ASSERTIONS
/* Physical Address ranges supported in the AArch64 Memory Model */
static
const
unsigned
int
pa_range_bits_arr
[]
=
{
PARANGE_0000
,
PARANGE_0001
,
PARANGE_0010
,
PARANGE_0011
,
PARANGE_0100
,
...
...
@@ -94,7 +94,7 @@ unsigned long long xlat_arch_get_max_supported_pa(void)
return
(
1ull
<<
pa_range_bits_arr
[
pa_range
])
-
1ull
;
}
#endif
/*
DEBUG
*/
#endif
/*
ENABLE_ASSERTIONS
*/
int
is_mmu_enabled
(
void
)
{
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables_v2/xlat_tables_common.c
View file @
0f22bef3
...
...
@@ -92,7 +92,7 @@ xlat_ctx_t tf_xlat_ctx = {
};
void
mmap_add_region
(
unsigned
long
long
base_pa
,
uintptr_t
base_va
,
size_t
size
,
unsigned
in
t
attr
)
size_t
size
,
mmap_attr_
t
attr
)
{
mmap_region_t
mm
=
{
.
base_va
=
base_va
,
...
...
@@ -114,7 +114,7 @@ void mmap_add(const mmap_region_t *mm)
#if PLAT_XLAT_TABLES_DYNAMIC
int
mmap_add_dynamic_region
(
unsigned
long
long
base_pa
,
uintptr_t
base_va
,
size_t
size
,
unsigned
in
t
attr
)
uintptr_t
base_va
,
size_t
size
,
mmap_attr_
t
attr
)
{
mmap_region_t
mm
=
{
.
base_va
=
base_va
,
...
...
This diff is collapsed.
Click to expand it.
lib/xlat_tables_v2/xlat_tables_internal.c
View file @
0f22bef3
...
...
@@ -115,7 +115,7 @@ static uint64_t *xlat_table_get_empty(xlat_ctx_t *ctx)
#endif
/* PLAT_XLAT_TABLES_DYNAMIC */
/* Returns a block/page table descriptor for the given level and attributes. */
static
uint64_t
xlat_desc
(
unsigned
in
t
attr
,
unsigned
long
long
addr_pa
,
static
uint64_t
xlat_desc
(
mmap_attr_
t
attr
,
unsigned
long
long
addr_pa
,
int
level
)
{
uint64_t
desc
;
...
...
@@ -609,7 +609,7 @@ void print_mmap(mmap_region_t *const mmap)
*/
static
int
mmap_add_region_check
(
xlat_ctx_t
*
ctx
,
unsigned
long
long
base_pa
,
uintptr_t
base_va
,
size_t
size
,
unsigned
in
t
attr
)
mmap_attr_
t
attr
)
{
mmap_region_t
*
mm
=
ctx
->
mmap
;
unsigned
long
long
end_pa
=
base_pa
+
size
-
1
;
...
...
This diff is collapsed.
Click to expand it.
make_helpers/defaults.mk
View file @
0f22bef3
...
...
@@ -154,3 +154,9 @@ USE_COHERENT_MEM := 1
# Build verbosity
V
:=
0
# Whether to enable D-Cache early during warm boot. This is usually
# applicable for platforms wherein interconnect programming is not
# required to enable cache coherency after warm reset (eg: single cluster
# platforms).
WARMBOOT_ENABLE_DCACHE_EARLY
:=
0
This diff is collapsed.
Click to expand it.
plat/arm/board/common/board_css_common.c
View file @
0f22bef3
...
...
@@ -79,6 +79,9 @@ const mmap_region_t plat_arm_mmap[] = {
#endif
#ifdef IMAGE_BL32
const
mmap_region_t
plat_arm_mmap
[]
=
{
#ifdef AARCH32
ARM_MAP_SHARED_RAM
,
#endif
V2M_MAP_IOFPGA
,
CSS_MAP_DEVICE
,
SOC_CSS_MAP_DEVICE
,
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/aarch32/juno_helpers.S
0 → 100644
View file @
0f22bef3
/*
*
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
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/aarch64/juno_helpers.S
View file @
0f22bef3
...
...
@@ -34,12 +34,18 @@
#include <cortex_a53.h>
#include <cortex_a57.h>
#include <cortex_a72.h>
#include <cpu_macros.S>
#include <css_def.h>
#include <v2m_def.h>
#include "../juno_def.h"
.
globl
plat_reset_handler
.
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_HANDLER(rev) plat_reset_handler_juno_r##rev
...
...
@@ -205,6 +211,20 @@ func 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
)
*
Helper
function
to
calculate
the
core
position
.
...
...
@@ -213,3 +233,77 @@ endfunc plat_reset_handler
func
plat_arm_calc_core_pos
b
css_calc_core_pos_swap_cluster
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 */
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/include/platform_def.h
View file @
0f22bef3
...
...
@@ -103,8 +103,8 @@
#endif
#ifdef IMAGE_BL32
# define PLAT_ARM_MMAP_ENTRIES
4
# define MAX_XLAT_TABLES
3
# define PLAT_ARM_MMAP_ENTRIES
5
# define MAX_XLAT_TABLES
4
#endif
/*
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/juno_bl1_setup.c
View file @
0f22bef3
/*
* 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
* modification, are permitted provided that the following conditions are met:
...
...
@@ -32,11 +32,15 @@
#include <errno.h>
#include <platform.h>
#include <plat_arm.h>
#include <sp805.h>
#include <tbbr_img_def.h>
#include <v2m_def.h>
#define RESET_REASON_WDOG_RESET (0x2)
void
juno_reset_to_aarch32_state
(
void
);
/*******************************************************************************
* The following function checks if Firmware update is needed,
* 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)
while
(
1
)
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 */
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/juno_p
m
.c
→
plat/arm/board/juno/juno_
bl2_setu
p.c
View file @
0f22bef3
/*
* Copyright (c)
2015-
2016, ARM Limited and Contributors. All rights reserved.
* 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:
...
...
@@ -27,67 +27,30 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <css_pm.h>
#include <assert.h>
#include <bl_common.h>
#include <desc_image_load.h>
#include <plat_arm.h>
/*
* Custom `validate_power_state` handler for Juno. According to PSCI
* Specification, interrupts targeted to cores in PSCI CPU SUSPEND should
* be able to resume it. On Juno, when the system power domain is suspended,
* the GIC is also powered down. The SCP resumes the final core to be suspend
* when an external wake-up event is received. But the other cores cannot be
* woken up by a targeted interrupt, because GIC doesn't forward these
* interrupts to the SCP. Due to this hardware limitation, we down-grade PSCI
* CPU SUSPEND requests targeted to the system power domain level
* to cluster power domain level.
*
* The system power domain suspend on Juno is only supported only via
* PSCI SYSTEM SUSPEND API.
*/
static
int
juno_validate_power_state
(
unsigned
int
power_state
,
psci_power_state_t
*
req_state
)
#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
rc
;
rc
=
arm_validate_power_state
(
power_state
,
req_state
);
int
err
=
arm_bl2_handle_post_image_load
(
image_id
);
/*
* Ensure that the system power domain level is never suspended
* via PSCI CPU SUSPEND API. Currently system suspend is only
* supported via PSCI SYSTEM SUSPEND API.
*/
req_state
->
pwr_domain_state
[
ARM_PWR_LVL2
]
=
ARM_LOCAL_STATE_RUN
;
return
rc
;
}
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
);
}
/*
* Custom `translate_power_state_by_mpidr` handler for Juno. Unlike in the
* `juno_validate_power_state`, we do not down-grade the system power
* domain level request in `power_state` as it will be used to query the
* PSCI_STAT_COUNT/RESIDENCY at the system power domain level.
*/
static
int
juno_translate_power_state_by_mpidr
(
u_register_t
mpidr
,
unsigned
int
power_state
,
psci_power_state_t
*
output_state
)
{
return
arm_validate_power_state
(
power_state
,
output_state
);
return
err
;
}
/*******************************************************************************
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
* platform will take care of registering the handlers with PSCI.
******************************************************************************/
plat_psci_ops_t
plat_arm_psci_pm_ops
=
{
.
pwr_domain_on
=
css_pwr_domain_on
,
.
pwr_domain_on_finish
=
css_pwr_domain_on_finish
,
.
pwr_domain_off
=
css_pwr_domain_off
,
.
cpu_standby
=
css_cpu_standby
,
.
pwr_domain_suspend
=
css_pwr_domain_suspend
,
.
pwr_domain_suspend_finish
=
css_pwr_domain_suspend_finish
,
.
system_off
=
css_system_off
,
.
system_reset
=
css_system_reset
,
.
validate_power_state
=
juno_validate_power_state
,
.
validate_ns_entrypoint
=
arm_validate_ns_entrypoint
,
.
get_sys_suspend_power_state
=
css_get_sys_suspend_power_state
,
.
translate_power_state_by_mpidr
=
juno_translate_power_state_by_mpidr
,
.
get_node_hw_state
=
css_node_hw_state
};
#endif
/* JUNO_AARCH32_EL3_RUNTIME */
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/platform.mk
View file @
0f22bef3
...
...
@@ -48,8 +48,14 @@ endif
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
\
lib/cpus/aarch64/cortex_a57.S
\
lib/cpus/aarch64/cortex_a72.S
\
...
...
@@ -59,6 +65,7 @@ BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \
${JUNO_SECURITY_SOURCES}
BL2_SOURCES
+=
plat/arm/board/juno/juno_err.c
\
plat/arm/board/juno/juno_bl2_setup.c
\
${JUNO_SECURITY_SOURCES}
BL2U_SOURCES
+=
${JUNO_SECURITY_SOURCES}
...
...
@@ -66,11 +73,11 @@ BL2U_SOURCES += ${JUNO_SECURITY_SOURCES}
BL31_SOURCES
+=
lib/cpus/aarch64/cortex_a53.S
\
lib/cpus/aarch64/cortex_a57.S
\
lib/cpus/aarch64/cortex_a72.S
\
plat/arm/board/juno/juno_pm.c
\
plat/arm/board/juno/juno_topology.c
\
${JUNO_GIC_SOURCES}
\
${JUNO_INTERCONNECT_SOURCES}
\
${JUNO_SECURITY_SOURCES}
endif
# Enable workarounds for selected Cortex-A53 and A57 errata.
ERRATA_A53_855873
:=
1
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/juno/sp_min/sp_min-juno.mk
0 → 100644
View file @
0f22bef3
#
# 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
This diff is collapsed.
Click to expand it.
plat/arm/common/aarch32/arm_helpers.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2016
-
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
:
...
...
@@ -31,9 +31,10 @@
#include <platform_def.h>
.
weak
plat_arm_calc_core_pos
.
weak
plat_crash_console_init
.
weak
plat_crash_console_putc
.
weak
plat_my_core_pos
.
globl
plat_crash_console_init
.
globl
plat_crash_console_putc
.
globl
plat_crash_console_flush
/
*
-----------------------------------------------------
*
unsigned
int
plat_my_core_pos
(
void
)
...
...
@@ -85,3 +86,16 @@ func plat_crash_console_putc
ldr
r1
,
=
PLAT_ARM_CRASH_UART_BASE
b
console_core_putc
endfunc
plat_crash_console_putc
/
*
---------------------------------------------
*
int
plat_crash_console_flush
()
*
Function
to
force
a
write
of
all
buffered
*
data
that
hasn
't been output.
*
Out
:
return
-
1
on
error
else
return
0
.
*
Clobber
list
:
r0
-
r1
*
---------------------------------------------
*/
func
plat_crash_console_flush
ldr
r1
,
=
PLAT_ARM_CRASH_UART_BASE
b
console_core_flush
endfunc
plat_crash_console_flush
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
6
7
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
Menu
Projects
Groups
Snippets
Help