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
bc2910c1
Unverified
Commit
bc2910c1
authored
7 years ago
by
Dimitris Papastamos
Committed by
GitHub
7 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #1306 from JiafeiPan/master
layerscape: Initial ATF support for LS1043ardb
parents
c39afead
364e1342
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
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
43
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
plat/layerscape/board/ls1043/tsp/tsp-ls1043.mk
+12
-0
plat/layerscape/board/ls1043/tsp/tsp-ls1043.mk
plat/layerscape/common/aarch64/ls_bl2_mem_params_desc.c
+113
-0
plat/layerscape/common/aarch64/ls_bl2_mem_params_desc.c
plat/layerscape/common/aarch64/ls_console.S
+268
-0
plat/layerscape/common/aarch64/ls_console.S
plat/layerscape/common/aarch64/ls_helpers.S
+150
-0
plat/layerscape/common/aarch64/ls_helpers.S
plat/layerscape/common/include/fsl_csu.h
+33
-0
plat/layerscape/common/include/fsl_csu.h
plat/layerscape/common/include/ls_16550.h
+86
-0
plat/layerscape/common/include/ls_16550.h
plat/layerscape/common/include/plat_ls.h
+61
-0
plat/layerscape/common/include/plat_ls.h
plat/layerscape/common/include/soc.h
+18
-0
plat/layerscape/common/include/soc.h
plat/layerscape/common/include/tzc380.h
+19
-0
plat/layerscape/common/include/tzc380.h
plat/layerscape/common/ls_bl1_setup.c
+89
-0
plat/layerscape/common/ls_bl1_setup.c
plat/layerscape/common/ls_bl2_setup.c
+98
-0
plat/layerscape/common/ls_bl2_setup.c
plat/layerscape/common/ls_bl31_setup.c
+224
-0
plat/layerscape/common/ls_bl31_setup.c
plat/layerscape/common/ls_common.c
+199
-0
plat/layerscape/common/ls_common.c
plat/layerscape/common/ls_common.mk
+62
-0
plat/layerscape/common/ls_common.mk
plat/layerscape/common/ls_image_load.c
+33
-0
plat/layerscape/common/ls_image_load.c
plat/layerscape/common/ls_io_storage.c
+175
-0
plat/layerscape/common/ls_io_storage.c
plat/layerscape/common/ls_timer.c
+47
-0
plat/layerscape/common/ls_timer.c
plat/layerscape/common/ls_topology.c
+39
-0
plat/layerscape/common/ls_topology.c
plat/layerscape/common/ls_tzc380.c
+74
-0
plat/layerscape/common/ls_tzc380.c
plat/layerscape/common/ns_access.c
+37
-0
plat/layerscape/common/ns_access.c
with
1837 additions
and
0 deletions
+1837
-0
plat/layerscape/board/ls1043/tsp/tsp-ls1043.mk
0 → 100644
View file @
bc2910c1
#
# Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# TSP source files specific to FVP platform
BL32_SOURCES
+=
plat/layerscape/board/ls1043/ls1043_topology.c
\
plat/layerscape/board/ls1043/tsp/ls1043_tsp_setup.c
\
${LS1043_GIC_SOURCES}
include
plat/layerscape/common/tsp/ls_tsp.mk
This diff is collapsed.
Click to expand it.
plat/layerscape/common/aarch64/ls_bl2_mem_params_desc.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <bl_common.h>
#include <desc_image_load.h>
#include <platform.h>
#include <platform_def.h>
#include <debug.h>
#include <ls_def.h>
/*******************************************************************************
* Following descriptor provides BL image/ep information that gets used
* by BL2 to load the images and also subset of this information is
* passed to next BL image. The image loading sequence is managed by
* populating the images in required loading order. The image execution
* sequence is managed by populating the `next_handoff_image_id` with
* the next executable image id.
******************************************************************************/
static
bl_mem_params_node_t
bl2_mem_params_descs
[]
=
{
#ifdef EL3_PAYLOAD_BASE
/* Fill EL3 payload related information (BL31 is EL3 payload)*/
{
.
image_id
=
BL31_IMAGE_ID
,
SET_STATIC_PARAM_HEAD
(
ep_info
,
PARAM_EP
,
VERSION_2
,
entry_point_info_t
,
SECURE
|
EXECUTABLE
|
EP_FIRST_EXE
),
.
ep_info
.
pc
=
EL3_PAYLOAD_BASE
,
.
ep_info
.
spsr
=
SPSR_64
(
MODE_EL3
,
MODE_SP_ELX
,
DISABLE_ALL_EXCEPTIONS
),
SET_STATIC_PARAM_HEAD
(
image_info
,
PARAM_EP
,
VERSION_2
,
image_info_t
,
IMAGE_ATTRIB_PLAT_SETUP
|
IMAGE_ATTRIB_SKIP_LOADING
),
.
next_handoff_image_id
=
INVALID_IMAGE_ID
,
},
#else
/* EL3_PAYLOAD_BASE */
/* Fill BL31 related information */
{
.
image_id
=
BL31_IMAGE_ID
,
SET_STATIC_PARAM_HEAD
(
ep_info
,
PARAM_EP
,
VERSION_2
,
entry_point_info_t
,
SECURE
|
EXECUTABLE
|
EP_FIRST_EXE
),
.
ep_info
.
pc
=
BL31_BASE
,
.
ep_info
.
spsr
=
SPSR_64
(
MODE_EL3
,
MODE_SP_ELX
,
DISABLE_ALL_EXCEPTIONS
),
#if DEBUG
.
ep_info
.
args
.
arg1
=
LS_BL31_PLAT_PARAM_VAL
,
#endif
SET_STATIC_PARAM_HEAD
(
image_info
,
PARAM_EP
,
VERSION_2
,
image_info_t
,
IMAGE_ATTRIB_PLAT_SETUP
),
.
image_info
.
image_base
=
BL31_BASE
,
.
image_info
.
image_max_size
=
(
BL31_LIMIT
-
BL31_BASE
),
# ifdef BL32_BASE
.
next_handoff_image_id
=
BL32_IMAGE_ID
,
# else
.
next_handoff_image_id
=
BL33_IMAGE_ID
,
# endif
},
# ifdef BL32_BASE
/* Fill BL32 related information */
{
.
image_id
=
BL32_IMAGE_ID
,
SET_STATIC_PARAM_HEAD
(
ep_info
,
PARAM_EP
,
VERSION_2
,
entry_point_info_t
,
SECURE
|
EXECUTABLE
),
.
ep_info
.
pc
=
BL32_BASE
,
SET_STATIC_PARAM_HEAD
(
image_info
,
PARAM_EP
,
VERSION_2
,
image_info_t
,
0
),
.
image_info
.
image_base
=
BL32_BASE
,
.
image_info
.
image_max_size
=
(
BL32_LIMIT
-
BL32_BASE
),
.
next_handoff_image_id
=
BL33_IMAGE_ID
,
},
# endif
/* BL32_BASE */
/* Fill BL33 related information */
{
.
image_id
=
BL33_IMAGE_ID
,
SET_STATIC_PARAM_HEAD
(
ep_info
,
PARAM_EP
,
VERSION_2
,
entry_point_info_t
,
NON_SECURE
|
EXECUTABLE
),
# ifdef PRELOADED_BL33_BASE
.
ep_info
.
pc
=
PRELOADED_BL33_BASE
,
SET_STATIC_PARAM_HEAD
(
image_info
,
PARAM_EP
,
VERSION_2
,
image_info_t
,
IMAGE_ATTRIB_SKIP_LOADING
),
# else
.
ep_info
.
pc
=
BL33_BASE
,
SET_STATIC_PARAM_HEAD
(
image_info
,
PARAM_EP
,
VERSION_2
,
image_info_t
,
0
),
.
image_info
.
image_base
=
BL33_BASE
,
.
image_info
.
image_max_size
=
LS_NS_DRAM_SIZE
,
# endif
/* PRELOADED_BL33_BASE */
.
next_handoff_image_id
=
INVALID_IMAGE_ID
,
}
#endif
/* EL3_PAYLOAD_BASE */
};
REGISTER_BL_IMAGE_DESCS
(
bl2_mem_params_descs
)
This diff is collapsed.
Click to expand it.
plat/layerscape/common/aarch64/ls_console.S
0 → 100644
View file @
bc2910c1
/*
*
Copyright
(
c
)
2018
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
#include <arch.h>
#include <asm_macros.S>
#include <console_macros.S>
#include <assert_macros.S>
#include "ls_16550.h"
/
*
*
"core"
functions
are
low
-
level
implementations
that
don
't require
*
writable
memory
and
are
thus
safe
to
call
in
BL1
crash
context
.
*/
.
globl
console_ls_16550_core_init
.
globl
console_ls_16550_core_putc
.
globl
console_ls_16550_core_getc
.
globl
console_ls_16550_putc
.
globl
console_ls_16550_getc
.
globl
console_ls_16550_flush
/
*
-----------------------------------------------
*
int
console_ls_16550_core_init
(
uintptr_t
base_addr
,
*
unsigned
int
uart_clk
,
unsigned
int
baud_rate
)
*
Function
to
initialize
the
console
without
a
*
C
Runtime
to
print
debug
information
.
This
*
function
will
be
accessed
by
console_init
and
*
crash
reporting
.
*
In
:
x0
-
console
base
address
*
w1
-
Uart
clock
in
Hz
*
w2
-
Baud
rate
*
Out
:
return
1
on
success
,
0
on
error
*
Clobber
list
:
x1
,
x2
,
x3
*
-----------------------------------------------
*/
func
console_ls_16550_core_init
/
*
Check
the
input
base
address
*/
cbz
x0
,
init_fail
/
*
Check
baud
rate
and
uart
clock
for
sanity
*/
cbz
w1
,
init_fail
cbz
w2
,
init_fail
/
*
Program
the
baudrate
*/
/
*
Divisor
=
Uart
clock
/
(
16
*
baudrate
)
*/
lsl
w2
,
w2
,
#
4
udiv
w2
,
w1
,
w2
and
w1
,
w2
,
#
0xff
/*
w1
=
DLL
*/
lsr
w2
,
w2
,
#
8
and
w2
,
w2
,
#
0xff
/*
w2
=
DLLM
*/
ldrb
w3
,
[
x0
,
#
UARTLCR
]
orr
w3
,
w3
,
#
UARTLCR_DLAB
strb
w3
,
[
x0
,
#
UARTLCR
]
/*
enable
DLL
,
DLLM
programming
*/
strb
w1
,
[
x0
,
#
UARTDLL
]
/*
program
DLL
*/
strb
w2
,
[
x0
,
#
UARTDLLM
]
/*
program
DLLM
*/
mov
w2
,
#
~
UARTLCR_DLAB
and
w3
,
w3
,
w2
strb
w3
,
[
x0
,
#
UARTLCR
]
/*
disable
DLL
,
DLLM
programming
*/
/
*
8
n1
*/
mov
w3
,
#
3
strb
w3
,
[
x0
,
#
UARTLCR
]
/
*
no
interrupt
*/
mov
w3
,
#
0
strb
w3
,
[
x0
,
#
UARTIER
]
/
*
enable
fifo
,
DMA
*/
mov
w3
,
#(
UARTFCR_FIFOEN
|UARTFCR_TXCLR |
UARTFCR_RXCLR
)
strb
w3
,
[
x0
,
#
UARTFCR
]
/
*
DTR
+
RTS
*/
mov
w3
,
#
3
str
w3
,
[
x0
,
#
UARTMCR
]
mov
w0
,
#
1
ret
init_fail
:
mov
w0
,
#
0
ret
endfunc
console_ls_16550_core_init
#if MULTI_CONSOLE_API
.
globl
console_ls_16550_register
/
*
-----------------------------------------------
*
int
console_ls_16550_register
(
console_ls_16550_t
*
console
,
*
uintptr_t
base
,
uint32_t
clk
,
uint32_t
baud
)
*
Function
to
initialize
and
register
a
new
16550
*
console
.
Storage
passed
in
for
the
console
struct
*
*
must
*
be
persistent
(
i
.
e
.
not
from
the
stack
)
.
*
In
:
x0
-
UART
register
base
address
*
w1
-
UART
clock
in
Hz
*
w2
-
Baud
rate
*
x3
-
pointer
to
empty
console_ls_16550_t
struct
*
Out
:
return
1
on
success
,
0
on
error
*
Clobber
list
:
x0
,
x1
,
x2
,
x6
,
x7
,
x14
*
-----------------------------------------------
*/
func
console_ls_16550_register
mov
x7
,
x30
mov
x6
,
x3
cbz
x6
,
register_fail
str
x0
,
[
x6
,
#
CONSOLE_T_16550_BASE
]
bl
console_ls_16550_core_init
cbz
x0
,
register_fail
mov
x0
,
x6
mov
x30
,
x7
finish_console_register
ls_16550
register_fail
:
ret
x7
endfunc
console_ls_16550_register
#else
.
globl
console_core_init
.
globl
console_core_putc
.
globl
console_core_getc
.
globl
console_core_flush
.
equ
console_core_init
,
console_ls_16550_core_init
.
equ
console_core_putc
,
console_ls_16550_core_putc
.
equ
console_core_getc
,
console_ls_16550_core_getc
.
equ
console_core_flush
,
console_ls_16550_core_flush
#endif
/
*
--------------------------------------------------------
*
int
console_ls_16550_core_putc
(
int
c
,
uintptr_t
base_addr
)
*
Function
to
output
a
character
over
the
console
.
It
*
returns
the
character
printed
on
success
or
-
1
on
error
.
*
In
:
w0
-
character
to
be
printed
*
x1
-
console
base
address
*
Out
:
return
-
1
on
error
else
return
character
.
*
Clobber
list
:
x2
*
--------------------------------------------------------
*/
func
console_ls_16550_core_putc
#if ENABLE_ASSERTIONS
cmp
x1
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
/
*
Prepend
'\r'
to
'\n'
*/
cmp
w0
,
#
0xA
//
'\n'
b.ne
2
f
/
*
Check
if
the
transmit
FIFO
is
full
*/
1
:
ldrb
w2
,
[
x1
,
#
UARTLSR
]
and
w2
,
w2
,
#
UARTLSR_THRE
/*
#(
UARTLSR_TEMT
|
UARTLSR_THRE
)*/
cmp
w2
,
#(
UARTLSR_THRE
)
b.ne
1
b
mov
w2
,
#
0xD
/*
'\r'
*/
strb
w2
,
[
x1
,
#
UARTTX
]
ldrb
w2
,
[
x1
,
#
UARTFCR
]
orr
w2
,
w2
,
#
UARTFCR_TXCLR
/
*
Check
if
the
transmit
FIFO
is
full
*/
2
:
ldrb
w2
,
[
x1
,
#
UARTLSR
]
and
w2
,
w2
,
#(
UARTLSR_THRE
)
cmp
w2
,
#(
UARTLSR_THRE
)
b.ne
2
b
strb
w0
,
[
x1
,
#
UARTTX
]
ret
endfunc
console_ls_16550_core_putc
/
*
--------------------------------------------------------
*
int
console_16550_putc
(
int
c
,
console_ls_16550_t
*
console
)
*
Function
to
output
a
character
over
the
console
.
It
*
returns
the
character
printed
on
success
or
-
1
on
error
.
*
In
:
w0
-
character
to
be
printed
*
x1
-
pointer
to
console_t
structure
*
Out
:
return
-
1
on
error
else
return
character
.
*
Clobber
list
:
x2
*
--------------------------------------------------------
*/
func
console_ls_16550_putc
#if ENABLE_ASSERTIONS
cmp
x1
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
ldr
x1
,
[
x1
,
#
CONSOLE_T_16550_BASE
]
b
console_ls_16550_core_putc
endfunc
console_ls_16550_putc
/
*
---------------------------------------------
*
int
console_ls_16550_core_getc
(
uintptr_t
base_addr
)
*
Function
to
get
a
character
from
the
console
.
*
It
returns
the
character
grabbed
on
success
*
or
-
1
on
if
no
character
is
available
.
*
In
:
x0
-
console
base
address
*
Out
:
w0
-
character
if
available
,
else
-
1
*
Clobber
list
:
x0
,
x1
*
---------------------------------------------
*/
func
console_ls_16550_core_getc
#if ENABLE_ASSERTIONS
cmp
x0
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
/
*
Check
if
the
receive
FIFO
is
empty
*/
1
:
ldrb
w1
,
[
x0
,
#
UARTLSR
]
tbz
w1
,
#
UARTLSR_RDR
,
1
b
ldrb
w0
,
[
x0
,
#
UARTRX
]
ret
no_char
:
mov
w0
,
#
ERROR_NO_PENDING_CHAR
ret
endfunc
console_ls_16550_core_getc
/
*
---------------------------------------------
*
int
console_ls_16550_getc
(
console_ls_16550_t
*
console
)
*
Function
to
get
a
character
from
the
console
.
*
It
returns
the
character
grabbed
on
success
*
or
-
1
on
if
no
character
is
available
.
*
In
:
x0
-
pointer
to
console_t
structure
*
Out
:
w0
-
character
if
available
,
else
-
1
*
Clobber
list
:
x0
,
x1
*
---------------------------------------------
*/
func
console_ls_16550_getc
#if ENABLE_ASSERTIONS
cmp
x1
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
ldr
x0
,
[
x0
,
#
CONSOLE_T_16550_BASE
]
b
console_ls_16550_core_getc
endfunc
console_ls_16550_getc
/
*
---------------------------------------------
*
int
console_ls_16550_core_flush
(
uintptr_t
base_addr
)
*
Function
to
force
a
write
of
all
buffered
*
data
that
hasn
't been output.
*
In
:
x0
-
console
base
address
*
Out
:
return
-
1
on
error
else
return
0
.
*
Clobber
list
:
x0
,
x1
*
---------------------------------------------
*/
func
console_ls_16550_core_flush
#if ENABLE_ASSERTIONS
cmp
x0
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
/
*
Loop
until
the
transmit
FIFO
is
empty
*/
1
:
ldrb
w1
,
[
x0
,
#
UARTLSR
]
and
w1
,
w1
,
#(
UARTLSR_TEMT
|
UARTLSR_THRE
)
cmp
w1
,
#(
UARTLSR_TEMT
|
UARTLSR_THRE
)
b.ne
1
b
mov
w0
,
#
0
ret
endfunc
console_ls_16550_core_flush
/
*
---------------------------------------------
*
int
console_ls_16550_flush
(
console_ls_16550_t
*
console
)
*
Function
to
force
a
write
of
all
buffered
*
data
that
hasn
't been output.
*
In
:
x0
-
pointer
to
console_t
structure
*
Out
:
return
-
1
on
error
else
return
0
.
*
Clobber
list
:
x0
,
x1
*
---------------------------------------------
*/
func
console_ls_16550_flush
#if ENABLE_ASSERTIONS
cmp
x0
,
#
0
ASM_ASSERT
(
ne
)
#endif /* ENABLE_ASSERTIONS */
ldr
x0
,
[
x0
,
#
CONSOLE_T_16550_BASE
]
b
console_ls_16550_core_flush
endfunc
console_ls_16550_flush
This diff is collapsed.
Click to expand it.
plat/layerscape/common/aarch64/ls_helpers.S
0 → 100644
View file @
bc2910c1
/*
*
Copyright
(
c
)
2018
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
SPDX
-
License
-
Identifier
:
BSD
-
3
-
Clause
*/
#include <asm_macros.S>
#include <console.h>
#include <platform_def.h>
.
weak
plat_my_core_pos
.
globl
plat_crash_console_init
.
globl
plat_crash_console_putc
.
globl
plat_crash_console_flush
.
weak
platform_mem_init
.
globl
plat_ls_calc_core_pos
/
*
-----------------------------------------------------
*
unsigned
int
plat_my_core_pos
(
void
)
*
This
function
uses
the
plat_ls_calc_core_pos
()
*
definition
to
get
the
index
of
the
calling
CPU
.
*
-----------------------------------------------------
*/
func
plat_my_core_pos
mrs
x0
,
mpidr_el1
b
plat_ls_calc_core_pos
endfunc
plat_my_core_pos
/
*
-----------------------------------------------------
*
unsigned
int
plat_ls_calc_core_pos
(
u_register_t
mpidr
)
*
Helper
function
to
calculate
the
core
position
.
*
With
this
function
:
CorePos
=
(
ClusterId
*
4
)
+
*
CoreId
*
-----------------------------------------------------
*/
func
plat_ls_calc_core_pos
and
x1
,
x0
,
#
MPIDR_CPU_MASK
and
x0
,
x0
,
#
MPIDR_CLUSTER_MASK
add
x0
,
x1
,
x0
,
LSR
#
6
ret
endfunc
plat_ls_calc_core_pos
/
*
---------------------------------------------
*
int
plat_crash_console_init
(
void
)
*
Function
to
initialize
the
crash
console
*
without
a
C
Runtime
to
print
crash
report
.
*
Clobber
list
:
x0
-
x4
*
---------------------------------------------
*/
#if MULTI_CONSOLE_API
/
*
-----------------------------------------------------
*
int
plat_crash_console_init
(
void
)
*
Use
normal
console
by
default
.
Switch
it
to
crash
*
mode
so
serial
consoles
become
active
again
.
*
NOTE
:
This
default
implementation
will
only
work
for
*
crashes
that
occur
after
a
normal
console
(
marked
*
valid
for
the
crash
state
)
has
been
registered
with
*
the
console
framework
.
To
debug
crashes
that
occur
*
earlier
,
the
platform
has
to
override
these
functions
*
with
an
implementation
that
initializes
a
console
*
driver
with
hardcoded
parameters
.
See
*
docs
/
porting
-
guide
.
rst
for
more
information
.
*
-----------------------------------------------------
*/
func
plat_crash_console_init
#if defined(IMAGE_BL1)
/
*
*
BL1
code
can
possibly
crash
so
early
that
the
data
segment
is
not
yet
*
accessible
.
Don
't risk undefined behavior by trying to run the normal
*
console
framework
.
Platforms
that
want
to
debug
BL1
will
need
to
*
override
this
with
custom
functions
that
can
run
from
registers
only
.
*/
mov
x0
,
#
0
ret
#else /* IMAGE_BL1 */
mov
x3
,
x30
mov
x0
,
#
CONSOLE_FLAG_CRASH
bl
console_switch_state
mov
x0
,
#
1
ret
x3
#endif
endfunc
plat_crash_console_init
/
*
-----------------------------------------------------
*
void
plat_crash_console_putc
(
int
character
)
*
Output
through
the
normal
console
by
default
.
*
-----------------------------------------------------
*/
func
plat_crash_console_putc
b
console_putc
endfunc
plat_crash_console_putc
/
*
-----------------------------------------------------
*
void
plat_crash_console_flush
(
void
)
*
Flush
normal
console
by
default
.
*
-----------------------------------------------------
*/
func
plat_crash_console_flush
b
console_flush
endfunc
plat_crash_console_flush
#else /* MULTI_CONSOLE_API */
/
*
-----------------------------------------------------
*
In
the
old
API
these
are
all
no
-
op
stubs
that
need
to
*
be
overridden
by
the
platform
to
be
useful
.
*
-----------------------------------------------------
*/
func
plat_crash_console_init
mov_imm
x0
,
PLAT_LS1043_UART_BASE
mov_imm
x1
,
PLAT_LS1043_UART_CLOCK
mov_imm
x2
,
PLAT_LS1043_UART_BAUDRATE
b
console_core_init
endfunc
plat_crash_console_init
/
*
---------------------------------------------
*
int
plat_crash_console_putc
(
int
c
)
*
Function
to
print
a
character
on
the
crash
*
console
without
a
C
Runtime
.
*
Clobber
list
:
x1
,
x2
*
---------------------------------------------
*/
func
plat_crash_console_putc
mov_imm
x1
,
PLAT_LS1043_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
mov_imm
x1
,
PLAT_LS1043_UART_BASE
b
console_core_flush
endfunc
plat_crash_console_flush
#endif
/
*
---------------------------------------------------------------------
*
We
don
't need to carry out any memory initialization on LS
*
platforms
.
The
Secure
SRAM
is
accessible
straight
away
.
*
---------------------------------------------------------------------
*/
func
platform_mem_init
ret
endfunc
platform_mem_init
This diff is collapsed.
Click to expand it.
plat/layerscape/common/include/fsl_csu.h
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __FSL_CSU_H__
#define __FSL_CSU_H__
enum
csu_cslx_access
{
CSU_NS_SUP_R
=
0x08
,
CSU_NS_SUP_W
=
0x80
,
CSU_NS_SUP_RW
=
0x88
,
CSU_NS_USER_R
=
0x04
,
CSU_NS_USER_W
=
0x40
,
CSU_NS_USER_RW
=
0x44
,
CSU_S_SUP_R
=
0x02
,
CSU_S_SUP_W
=
0x20
,
CSU_S_SUP_RW
=
0x22
,
CSU_S_USER_R
=
0x01
,
CSU_S_USER_W
=
0x10
,
CSU_S_USER_RW
=
0x11
,
CSU_ALL_RW
=
0xff
,
};
struct
csu_ns_dev
{
uintptr_t
ind
;
uint32_t
val
;
};
void
enable_layerscape_ns_access
(
void
);
#endif
This diff is collapsed.
Click to expand it.
plat/layerscape/common/include/ls_16550.h
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __LS_16550_H__
#define __LS_16550_H__
#include <console.h>
/* UART16550 Registers */
#define UARTTX 0x0
#define UARTRX 0x0
#define UARTDLL 0x0
#define UARTIER 0x1
#define UARTDLLM 0x1
#define UARTFCR 0x2
#define UARTLCR 0x3
#define UARTLSR 0x5
#define UARTMCR 0x4
/* FIFO Control Register bits */
#define UARTFCR_FIFOMD_16450 (0 << 6)
#define UARTFCR_FIFOMD_16550 (1 << 6)
#define UARTFCR_RXTRIG_1 (0 << 6)
#define UARTFCR_RXTRIG_4 (1 << 6)
#define UARTFCR_RXTRIG_8 (2 << 6)
#define UARTFCR_RXTRIG_16 (3 << 6)
#define UARTFCR_TXTRIG_1 (0 << 4)
#define UARTFCR_TXTRIG_4 (1 << 4)
#define UARTFCR_TXTRIG_8 (2 << 4)
#define UARTFCR_TXTRIG_16 (3 << 4)
#define UARTFCR_DMAEN (1 << 3)
/* Enable DMA mode */
#define UARTFCR_TXCLR (1 << 2)
/* Clear contents of Tx FIFO */
#define UARTFCR_RXCLR (1 << 1)
/* Clear contents of Rx FIFO */
#define UARTFCR_FIFOEN (1 << 0)
/* Enable the Tx/Rx FIFO */
#define UARTFCR_64FIFO (1 << 5)
/* Line Control Register bits */
#define UARTLCR_DLAB (1 << 7)
/* Divisor Latch Access */
#define UARTLCR_SETB (1 << 6)
/* Set BREAK Condition */
#define UARTLCR_SETP (1 << 5)
/* Set Parity to LCR[4] */
#define UARTLCR_EVEN (1 << 4)
/* Even Parity Format */
#define UARTLCR_PAR (1 << 3)
/* Parity */
#define UARTLCR_STOP (1 << 2)
/* Stop Bit */
#define UARTLCR_WORDSZ_5 0
/* Word Length of 5 */
#define UARTLCR_WORDSZ_6 1
/* Word Length of 6 */
#define UARTLCR_WORDSZ_7 2
/* Word Length of 7 */
#define UARTLCR_WORDSZ_8 3
/* Word Length of 8 */
/* Line Status Register bits */
#define UARTLSR_RXFIFOEMT (1 << 9)
/* Rx Fifo Empty */
#define UARTLSR_TXFIFOFULL (1 << 8)
/* Tx Fifo Full */
#define UARTLSR_RXFIFOERR (1 << 7)
/* Rx Fifo Error */
#define UARTLSR_TEMT (1 << 6)
/* Tx Shift Register Empty */
#define UARTLSR_THRE (1 << 5)
/* Tx Holding Register Empty */
#define UARTLSR_BRK (1 << 4)
/* Break Condition Detected */
#define UARTLSR_FERR (1 << 3)
/* Framing Error */
#define UARTLSR_PERR (1 << 3)
/* Parity Error */
#define UARTLSR_OVRF (1 << 2)
/* Rx Overrun Error */
#define UARTLSR_RDR (1 << 2)
/* Rx Data Ready */
#define CONSOLE_T_16550_BASE CONSOLE_T_DRVDATA
#ifndef __ASSEMBLY__
#include <types.h>
typedef
struct
{
console_t
console
;
uintptr_t
base
;
}
console_ls_16550_t
;
/*
* Initialize a new 16550 console instance and register it with the console
* framework. The |console| pointer must point to storage that will be valid
* for the lifetime of the console, such as a global or static local variable.
* Its contents will be reinitialized from scratch.
*/
int
console_ls_16550_register
(
uintptr_t
baseaddr
,
uint32_t
clock
,
uint32_t
baud
,
console_ls_16550_t
*
console
);
#endif
/*__ASSEMBLY__*/
#endif
/* __LS_16550_H__ */
This diff is collapsed.
Click to expand it.
plat/layerscape/common/include/plat_ls.h
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __PLAT_LS_H__
#define __PLAT_LS_H__
#include <sys/types.h>
#include <cpu_data.h>
/* BL1 utility functions */
void
ls_bl1_platform_setup
(
void
);
void
ls_bl1_early_platform_setup
(
void
);
/* BL2 utility functions */
void
ls_bl2_early_platform_setup
(
meminfo_t
*
mem_layout
);
uint32_t
ls_get_spsr_for_bl32_entry
(
void
);
uint32_t
ls_get_spsr_for_bl33_entry
(
void
);
/* BL3 utility functions */
void
ls_bl31_early_platform_setup
(
void
*
from_bl2
,
void
*
plat_params_from_bl2
);
/* IO storage utility functions */
void
plat_ls_io_setup
(
void
);
void
ls_setup_page_tables
(
uintptr_t
total_base
,
size_t
total_size
,
uintptr_t
code_start
,
uintptr_t
code_limit
,
uintptr_t
rodata_start
,
uintptr_t
rodata_limit
#if USE_COHERENT_MEM
,
uintptr_t
coh_start
,
uintptr_t
coh_limit
#endif
);
/* PSCI utility functions */
int
ls_check_mpidr
(
u_register_t
mpidr
);
/* Security utility functions */
int
tzc380_setup
(
void
);
/* Timer utility functions */
uint64_t
ls_get_timer
(
uint64_t
start
);
void
ls_delay_timer_init
(
void
);
/* TSP utility functions */
void
ls_tsp_early_platform_setup
(
void
);
/* Helper functions */
unsigned
int
plat_ls_calc_core_pos
(
u_register_t
mpidr
);
/* others */
unsigned
int
plat_ls_get_cluster_core_count
(
u_register_t
mpidr
);
#endif
/* __PLAT_LS_H__ */
This diff is collapsed.
Click to expand it.
plat/layerscape/common/include/soc.h
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __LAYERSCAPE_SOC_H__
#define __LAYERSCAPE_SOC_H__
#include <stdint.h>
#define SVR_WO_E 0xFFFFFE
#define SVR_LS1043A 0x879204
#define SVR_LS1043AE 0x879200
void
get_gic_offset
(
uint32_t
*
gicc_base
,
uint32_t
*
gicd_base
);
#endif
/* __LAYERSCAPE_SOC_H__ */
This diff is collapsed.
Click to expand it.
plat/layerscape/common/include/tzc380.h
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __TZC380_H__
#define __TZC380_H__
struct
tzc380_reg
{
unsigned
int
secure
;
unsigned
int
enabled
;
unsigned
int
low_addr
;
unsigned
int
high_addr
;
unsigned
int
size
;
unsigned
int
sub_mask
;
};
#endif
/* __TZC380_H__ */
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_bl1_setup.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <debug.h>
#include "ls_16550.h"
#include "plat_ls.h"
#include "../../../bl1/bl1_private.h"
/* Data structure which holds the extents of the trusted SRAM for BL1*/
static
meminfo_t
bl1_tzram_layout
;
meminfo_t
*
bl1_plat_sec_mem_layout
(
void
)
{
return
&
bl1_tzram_layout
;
}
/*******************************************************************************
* BL1 specific platform actions shared between ARM standard platforms.
******************************************************************************/
void
ls_bl1_early_platform_setup
(
void
)
{
static
console_ls_16550_t
console
;
#if !LS1043_DISABLE_TRUSTED_WDOG
/* TODO: Enable watchdog */
#endif
/* Initialize the console to provide early debug support */
console_ls_16550_register
(
LS_TF_UART_BASE
,
LS_TF_UART_CLOCK
,
LS_TF_UART_BAUDRATE
,
&
console
);
/* Allow BL1 to see the whole Trusted RAM */
bl1_tzram_layout
.
total_base
=
LS_SRAM_BASE
;
bl1_tzram_layout
.
total_size
=
LS_SRAM_SIZE
;
}
/******************************************************************************
* Perform the very early platform specific architecture setup shared between
* ARM standard platforms. This only does basic initialization. Later
* architectural setup (bl1_arch_setup()) does not do anything platform
* specific.
*****************************************************************************/
void
ls_bl1_plat_arch_setup
(
void
)
{
ls_setup_page_tables
(
bl1_tzram_layout
.
total_base
,
bl1_tzram_layout
.
total_size
,
BL_CODE_BASE
,
BL1_CODE_END
,
BL1_RO_DATA_BASE
,
BL1_RO_DATA_END
#if USE_COHERENT_MEM
,
BL_COHERENT_RAM_BASE
,
BL_COHERENT_RAM_END
#endif
);
VERBOSE
(
"After setup the page tables
\n
"
);
#ifdef AARCH32
enable_mmu_secure
(
0
);
#else
enable_mmu_el3
(
0
);
#endif
/* AARCH32 */
VERBOSE
(
"After MMU enabled
\n
"
);
}
void
bl1_plat_arch_setup
(
void
)
{
ls_bl1_plat_arch_setup
();
}
/*
* Perform the platform specific architecture setup shared between
* ARM standard platforms.
*/
void
ls_bl1_platform_setup
(
void
)
{
/* Initialise the IO layer and register platform IO devices */
plat_ls_io_setup
();
}
void
bl1_plat_prepare_exit
(
entry_point_info_t
*
ep_info
)
{
#if !LS1043_DISABLE_TRUSTED_WDOG
/*TODO: Disable watchdog before leaving BL1 */
#endif
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_bl2_setup.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <bl_common.h>
#include <desc_image_load.h>
#include "ls_16550.h"
#include "plat_ls.h"
#include "ls_def.h"
/* Data structure which holds the extents of the trusted SRAM for BL2 */
static
meminfo_t
bl2_tzram_layout
__aligned
(
CACHE_WRITEBACK_GRANULE
);
/*******************************************************************************
* BL1 has passed the extents of the trusted SRAM that should be visible to BL2
* in x0. This memory layout is sitting at the base of the free trusted SRAM.
* Copy it to a safe location before its reclaimed by later BL2 functionality.
******************************************************************************/
void
ls_bl2_early_platform_setup
(
meminfo_t
*
mem_layout
)
{
static
console_ls_16550_t
console
;
/* Initialize the console to provide early debug support */
console_ls_16550_register
(
LS_TF_UART_BASE
,
LS_TF_UART_CLOCK
,
LS_TF_UART_BAUDRATE
,
&
console
);
/* Setup the BL2 memory layout */
bl2_tzram_layout
=
*
mem_layout
;
/* Initialise the IO layer and register platform IO devices */
plat_ls_io_setup
();
}
/*******************************************************************************
* Perform the very early platform specific architectural setup here. At the
* moment this is only initializes the mmu in a quick and dirty way.
******************************************************************************/
void
ls_bl2_plat_arch_setup
(
void
)
{
ls_setup_page_tables
(
bl2_tzram_layout
.
total_base
,
bl2_tzram_layout
.
total_size
,
BL_CODE_BASE
,
BL_CODE_END
,
BL_RO_DATA_BASE
,
BL_RO_DATA_END
#if USE_COHERENT_MEM
,
BL_COHERENT_RAM_BASE
,
BL_COHERENT_RAM_END
#endif
);
#ifdef AARCH32
enable_mmu_secure
(
0
);
#else
enable_mmu_el1
(
0
);
#endif
}
void
bl2_plat_arch_setup
(
void
)
{
ls_bl2_plat_arch_setup
();
}
int
ls_bl2_handle_post_image_load
(
unsigned
int
image_id
)
{
int
err
=
0
;
bl_mem_params_node_t
*
bl_mem_params
=
get_bl_mem_params_node
(
image_id
);
assert
(
bl_mem_params
);
switch
(
image_id
)
{
#ifdef AARCH64
case
BL32_IMAGE_ID
:
bl_mem_params
->
ep_info
.
spsr
=
ls_get_spsr_for_bl32_entry
();
break
;
#endif
case
BL33_IMAGE_ID
:
/* BL33 expects to receive the primary CPU MPID (through r0) */
bl_mem_params
->
ep_info
.
args
.
arg0
=
0xffff
&
read_mpidr
();
bl_mem_params
->
ep_info
.
spsr
=
ls_get_spsr_for_bl33_entry
();
break
;
}
return
err
;
}
/*******************************************************************************
* This function can be used by the platforms to update/use image
* information for given `image_id`.
******************************************************************************/
int
bl2_plat_handle_post_image_load
(
unsigned
int
image_id
)
{
return
ls_bl2_handle_post_image_load
(
image_id
);
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_bl31_setup.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <console.h>
#include <mmio.h>
#include <gicv2.h>
#include "ls_16550.h"
#include "plat_ls.h"
#include "soc.h"
#define BL31_END (uintptr_t)(&__BL31_END__)
/*
* Placeholder variables for copying the arguments that have been passed to
* BL31 from BL2.
*/
static
entry_point_info_t
bl32_image_ep_info
;
static
entry_point_info_t
bl33_image_ep_info
;
const
unsigned
int
g0_interrupt_array1
[]
=
{
9
};
gicv2_driver_data_t
ls_gic_data
=
{
.
gicd_base
=
GICD_BASE
,
.
gicc_base
=
GICC_BASE
,
.
g0_interrupt_num
=
ARRAY_SIZE
(
g0_interrupt_array1
),
.
g0_interrupt_array
=
g0_interrupt_array1
,
};
/*******************************************************************************
* Return a pointer to the 'entry_point_info' structure of the next image for the
* security state specified. BL33 corresponds to the non-secure image type
* while BL32 corresponds to the secure image type. A NULL pointer is returned
* if the image does not exist.
******************************************************************************/
entry_point_info_t
*
bl31_plat_get_next_image_ep_info
(
uint32_t
type
)
{
entry_point_info_t
*
next_image_info
;
assert
(
sec_state_is_valid
(
type
));
next_image_info
=
(
type
==
NON_SECURE
)
?
&
bl33_image_ep_info
:
&
bl32_image_ep_info
;
if
(
next_image_info
->
pc
)
return
next_image_info
;
else
return
NULL
;
}
/*******************************************************************************
* Perform any BL31 early platform setup common to Layerscape platforms.
* Here is an opportunity to copy parameters passed by the calling EL (S-EL1
* in BL2 & S-EL3 in BL1) before they are lost (potentially). This needs to be
* done before the MMU is initialized so that the memory layout can be used
* while creating page tables. BL2 has flushed this information to memory, so
* we are guaranteed to pick up good data.
******************************************************************************/
void
ls_bl31_early_platform_setup
(
void
*
from_bl2
,
void
*
plat_params_from_bl2
)
{
static
console_ls_16550_t
console
;
/* Initialize the console to provide early debug support */
console_ls_16550_register
(
LS_TF_UART_BASE
,
LS_TF_UART_CLOCK
,
LS_TF_UART_BAUDRATE
,
&
console
);
#if RESET_TO_BL31
/* There are no parameters from BL2 if BL31 is a reset vector */
assert
(
from_bl2
==
NULL
);
assert
(
plat_params_from_bl2
==
NULL
);
#ifdef BL32_BASE
/* Populate entry point information for BL32 */
SET_PARAM_HEAD
(
&
bl32_image_ep_info
,
PARAM_EP
,
VERSION_1
,
0
);
SET_SECURITY_STATE
(
bl32_image_ep_info
.
h
.
attr
,
SECURE
);
bl32_image_ep_info
.
pc
=
BL32_BASE
;
bl32_image_ep_info
.
spsr
=
ls_get_spsr_for_bl32_entry
();
#endif
/* BL32_BASE */
/* Populate entry point information for BL33 */
SET_PARAM_HEAD
(
&
bl33_image_ep_info
,
PARAM_EP
,
VERSION_1
,
0
);
/*
* Tell BL31 where the non-trusted software image
* is located and the entry state information
*/
bl33_image_ep_info
.
pc
=
plat_get_ns_image_entrypoint
();
bl33_image_ep_info
.
spsr
=
ls_get_spsr_for_bl33_entry
();
SET_SECURITY_STATE
(
bl33_image_ep_info
.
h
.
attr
,
NON_SECURE
);
#else
/* RESET_TO_BL31 */
/*
* In debug builds, we pass a special value in 'plat_params_from_bl2'
* to verify platform parameters from BL2 to BL31.
* In release builds, it's not used.
*/
assert
(((
unsigned
long
long
)
plat_params_from_bl2
)
==
LS_BL31_PLAT_PARAM_VAL
);
/*
* Check params passed from BL2 should not be NULL,
*/
bl_params_t
*
params_from_bl2
=
(
bl_params_t
*
)
from_bl2
;
assert
(
params_from_bl2
!=
NULL
);
assert
(
params_from_bl2
->
h
.
type
==
PARAM_BL_PARAMS
);
assert
(
params_from_bl2
->
h
.
version
>=
VERSION_2
);
bl_params_node_t
*
bl_params
=
params_from_bl2
->
head
;
/*
* Copy BL33 and BL32 (if present), entry point information.
* They are stored in Secure RAM, in BL2's address space.
*/
while
(
bl_params
)
{
if
(
bl_params
->
image_id
==
BL32_IMAGE_ID
)
bl32_image_ep_info
=
*
bl_params
->
ep_info
;
if
(
bl_params
->
image_id
==
BL33_IMAGE_ID
)
bl33_image_ep_info
=
*
bl_params
->
ep_info
;
bl_params
=
bl_params
->
next_params_info
;
}
if
(
bl33_image_ep_info
.
pc
==
0
)
panic
();
#endif
/* RESET_TO_BL31 */
}
/*******************************************************************************
* Perform any BL31 platform setup common to Layerscape platforms
******************************************************************************/
void
ls_bl31_platform_setup
(
void
)
{
uint32_t
gicc_base
,
gicd_base
;
NOTICE
(
FIRMWARE_WELCOME_STR_LS1043_BL31
);
/* Initialize the GIC driver, cpu and distributor interfaces */
get_gic_offset
(
&
gicc_base
,
&
gicd_base
);
ls_gic_data
.
gicd_base
=
(
uintptr_t
)
gicd_base
;
ls_gic_data
.
gicc_base
=
(
uintptr_t
)
gicc_base
;
gicv2_driver_init
(
&
ls_gic_data
);
gicv2_distif_init
();
gicv2_pcpu_distif_init
();
gicv2_cpuif_enable
();
#if RESET_TO_BL31
/*
* Do initial security configuration to allow DRAM/device access
* (if earlier BL has not already done so).
*/
plat_ls_security_setup
();
#endif
/* RESET_TO_BL31 */
/* Enable and initialize the System level generic timer */
mmio_write_32
(
LS1043_SYS_CNTCTL_BASE
+
CNTCR_OFF
,
CNTCR_FCREQ
(
0
)
|
CNTCR_EN
);
VERBOSE
(
"Leave arm_bl31_platform_setup
\n
"
);
}
/*******************************************************************************
* Perform any BL31 platform runtime setup prior to BL31 exit common to Layerscape
* platforms
******************************************************************************/
void
ls_bl31_plat_runtime_setup
(
void
)
{
static
console_ls_16550_t
console
;
/* Initialize the runtime console */
console_ls_16550_register
(
PLAT_LS1043_UART_BASE
,
PLAT_LS1043_UART_CLOCK
,
PLAT_LS1043_UART_BAUDRATE
,
&
console
);
}
void
bl31_platform_setup
(
void
)
{
ls_bl31_platform_setup
();
}
void
bl31_plat_runtime_setup
(
void
)
{
ls_bl31_plat_runtime_setup
();
}
/*******************************************************************************
* Perform the very early platform specific architectural setup shared between
* Layerscape platforms. This only does basic initialization. Later
* architectural setup (bl31_arch_setup()) does not do anything platform
* specific.
******************************************************************************/
void
ls_bl31_plat_arch_setup
(
void
)
{
ls_setup_page_tables
(
BL31_BASE
,
BL31_END
-
BL31_BASE
,
BL_CODE_BASE
,
BL_CODE_END
,
BL_RO_DATA_BASE
,
BL_RO_DATA_END
#if USE_COHERENT_MEM
,
BL_COHERENT_RAM_BASE
,
BL_COHERENT_RAM_END
#endif
);
enable_mmu_el3
(
0
);
}
void
bl31_plat_arch_setup
(
void
)
{
ls_bl31_plat_arch_setup
();
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_common.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <arch_helpers.h>
#include <xlat_tables_v2.h>
#include <assert.h>
#include <debug.h>
#include <mmio.h>
#include "platform_def.h"
const
mmap_region_t
*
plat_ls_get_mmap
(
void
);
/*
* Table of memory regions for various BL stages to map using the MMU.
* This doesn't include Trusted SRAM as ls_setup_page_tables() already
* takes care of mapping it.
*
* The flash needs to be mapped as writable in order to erase the FIP's Table of
* Contents in case of unrecoverable error (see plat_error_handler()).
*/
#ifdef IMAGE_BL1
const
mmap_region_t
plat_ls_mmap
[]
=
{
LS_MAP_FLASH0_RW
,
LS_MAP_NS_DRAM
,
LS_MAP_CCSR
,
{
0
}
};
#endif
#ifdef IMAGE_BL2
const
mmap_region_t
plat_ls_mmap
[]
=
{
LS_MAP_FLASH0_RW
,
LS_MAP_CCSR
,
LS_MAP_NS_DRAM
,
LS_MAP_TSP_SEC_MEM
,
{
0
}
};
#endif
#ifdef IMAGE_BL31
const
mmap_region_t
plat_ls_mmap
[]
=
{
LS_MAP_CCSR
,
LS_MAP_FLASH0_RW
,
LS_MAP_NS_DRAM
,
LS_MAP_TSP_SEC_MEM
,
{
0
}
};
#endif
#ifdef IMAGE_BL32
const
mmap_region_t
plat_ls_mmap
[]
=
{
LS_MAP_CCSR
,
LS_MAP_FLASH0_RW
,
LS_MAP_TSP_SEC_MEM
,
{
0
}
};
#endif
/*
* Set up the page tables for the generic and platform-specific memory regions.
* The extents of the generic memory regions are specified by the function
* arguments and consist of:
* - Trusted SRAM seen by the BL image;
* - Code section;
* - Read-only data section;
* - Coherent memory region, if applicable.
*/
void
ls_setup_page_tables
(
uintptr_t
total_base
,
size_t
total_size
,
uintptr_t
code_start
,
uintptr_t
code_limit
,
uintptr_t
rodata_start
,
uintptr_t
rodata_limit
#if USE_COHERENT_MEM
,
uintptr_t
coh_start
,
uintptr_t
coh_limit
#endif
)
{
/* Now (re-)map the platform-specific memory regions */
mmap_add
(
plat_ls_get_mmap
());
/*
* Map the Trusted SRAM with appropriate memory attributes.
* Subsequent mappings will adjust the attributes for specific regions.
*/
VERBOSE
(
"Trusted SRAM seen by this BL image: %p - %p
\n
"
,
(
void
*
)
total_base
,
(
void
*
)
(
total_base
+
total_size
));
mmap_add_region
(
total_base
,
total_base
,
total_size
,
MT_MEMORY
|
MT_RW
|
MT_SECURE
);
/* Re-map the code section */
VERBOSE
(
"Code region: %p - %p
\n
"
,
(
void
*
)
code_start
,
(
void
*
)
code_limit
);
mmap_add_region
(
code_start
,
code_start
,
code_limit
-
code_start
,
MT_CODE
|
MT_SECURE
);
/* Re-map the read-only data section */
VERBOSE
(
"Read-only data region: %p - %p
\n
"
,
(
void
*
)
rodata_start
,
(
void
*
)
rodata_limit
);
mmap_add_region
(
rodata_start
,
rodata_start
,
rodata_limit
-
rodata_start
,
MT_RO_DATA
|
MT_SECURE
);
#if USE_COHERENT_MEM
/* Re-map the coherent memory region */
VERBOSE
(
"Coherent region: %p - %p
\n
"
,
(
void
*
)
coh_start
,
(
void
*
)
coh_limit
);
mmap_add_region
(
coh_start
,
coh_start
,
coh_limit
-
coh_start
,
MT_DEVICE
|
MT_RW
|
MT_SECURE
);
#endif
/* Create the page tables to reflect the above mappings */
init_xlat_tables
();
}
uintptr_t
plat_get_ns_image_entrypoint
(
void
)
{
#ifdef PRELOADED_BL33_BASE
return
PRELOADED_BL33_BASE
;
#else
return
LS_NS_DRAM_BASE
;
#endif
}
/*******************************************************************************
* Gets SPSR for BL32 entry
******************************************************************************/
uint32_t
ls_get_spsr_for_bl32_entry
(
void
)
{
/*
* The Secure Payload Dispatcher service is responsible for
* setting the SPSR prior to entry into the BL32 image.
*/
return
0
;
}
/*******************************************************************************
* Gets SPSR for BL33 entry
******************************************************************************/
#ifndef AARCH32
uint32_t
ls_get_spsr_for_bl33_entry
(
void
)
{
unsigned
int
mode
;
uint32_t
spsr
;
/* Figure out what mode we enter the non-secure world in */
mode
=
EL_IMPLEMENTED
(
2
)
?
MODE_EL2
:
MODE_EL1
;
/*
* TODO: Consider the possibility of specifying the SPSR in
* the FIP ToC and allowing the platform to have a say as
* well.
*/
spsr
=
SPSR_64
(
mode
,
MODE_SP_ELX
,
DISABLE_ALL_EXCEPTIONS
);
return
spsr
;
}
#else
/*******************************************************************************
* Gets SPSR for BL33 entry
******************************************************************************/
uint32_t
ls_get_spsr_for_bl33_entry
(
void
)
{
unsigned
int
hyp_status
,
mode
,
spsr
;
hyp_status
=
GET_VIRT_EXT
(
read_id_pfr1
());
mode
=
(
hyp_status
)
?
MODE32_hyp
:
MODE32_svc
;
/*
* TODO: Consider the possibility of specifying the SPSR in
* the FIP ToC and allowing the platform to have a say as
* well.
*/
spsr
=
SPSR_MODE32
(
mode
,
plat_get_ns_image_entrypoint
()
&
0x1
,
SPSR_E_LITTLE
,
DISABLE_ALL_EXCEPTIONS
);
return
spsr
;
}
#endif
/* AARCH32 */
/*******************************************************************************
* Returns Layerscape platform specific memory map regions.
******************************************************************************/
const
mmap_region_t
*
plat_ls_get_mmap
(
void
)
{
return
plat_ls_mmap
;
}
unsigned
int
plat_get_syscnt_freq2
(
void
)
{
unsigned
int
counter_base_frequency
;
counter_base_frequency
=
COUNTER_FREQUENCY
;
return
counter_base_frequency
;
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_common.mk
0 → 100644
View file @
bc2910c1
#
# Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# Process LS1043_DISABLE_TRUSTED_WDOG flag
# TODO:Temparally disabled it on development phase, not implemented yet
LS1043_DISABLE_TRUSTED_WDOG
:=
1
# On Layerscape platforms, separate the code and read-only data sections to allow
# mapping the former as executable and the latter as execute-never.
SEPARATE_CODE_AND_RODATA
:=
1
# Enable new version of image loading on Layerscape platforms
LOAD_IMAGE_V2
:=
1
# Use generic OID definition (tbbr_oid.h)
USE_TBBR_DEFS
:=
1
COLD_BOOT_SINGLE_CPU
:=
1
PLAT_INCLUDES
+=
-Iinclude
/common/tbbr
PLAT_BL_COMMON_SOURCES
+=
plat/layerscape/common/
${ARCH}
/ls_helpers.S
\
plat/layerscape/common/ls_common.c
include
lib/xlat_tables_v2/xlat_tables.mk
PLAT_BL_COMMON_SOURCES
+=
${XLAT_TABLES_LIB_SRCS}
BL1_SOURCES
+=
\
drivers/io/io_fip.c
\
drivers/io/io_memmap.c
\
drivers/io/io_storage.c
\
plat/layerscape/common/ls_timer.c
\
plat/layerscape/common/ls_bl1_setup.c
\
plat/layerscape/common/ls_io_storage.c
BL2_SOURCES
+=
drivers/io/io_fip.c
\
drivers/io/io_memmap.c
\
drivers/io/io_storage.c
\
plat/layerscape/common/ls_timer.c
\
plat/layerscape/common/ls_bl2_setup.c
\
plat/layerscape/common/ls_io_storage.c
BL2_SOURCES
+=
plat/layerscape/common/
${ARCH}
/ls_bl2_mem_params_desc.c
BL2_SOURCES
+=
plat/layerscape/common/ls_image_load.c
\
common/desc_image_load.c
BL31_SOURCES
+=
plat/layerscape/common/ls_bl31_setup.c
\
plat/layerscape/common/ls_timer.c
\
plat/layerscape/common/ls_topology.c
\
plat/layerscape/common/ns_access.c
\
plat/common/plat_psci_common.c
# Verify build config
# -------------------
ifneq
(${LOAD_IMAGE_V2}, 1)
$(error Error
:
Layerscape needs LOAD_IMAGE_V2=1)
endif
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_image_load.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <desc_image_load.h>
#include "ls_def.h"
/*******************************************************************************
* This function flushes the data structures so that they are visible
* in memory for the next BL image.
******************************************************************************/
void
plat_flush_next_bl_params
(
void
)
{
flush_bl_params_desc
();
}
/*******************************************************************************
* This function returns the list of loadable images.
******************************************************************************/
bl_load_info_t
*
plat_get_bl_image_load_info
(
void
)
{
return
get_bl_load_info_from_mem_params_desc
();
}
/*******************************************************************************
* This function returns the list of executable images.
******************************************************************************/
bl_params_t
*
plat_get_next_bl_params
(
void
)
{
return
get_next_bl_params_from_mem_params_desc
();
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_io_storage.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <debug.h>
#include <firmware_image_package.h>
#include <io_driver.h>
#include <io_fip.h>
#include <io_memmap.h>
#include <io_storage.h>
#include "platform_def.h"
/* IO devices */
static
const
io_dev_connector_t
*
fip_dev_con
;
static
uintptr_t
fip_dev_handle
;
static
const
io_dev_connector_t
*
memmap_dev_con
;
static
uintptr_t
memmap_dev_handle
;
static
const
io_block_spec_t
fip_block_spec
=
{
.
offset
=
PLAT_LS_FIP_BASE
,
.
length
=
PLAT_LS_FIP_MAX_SIZE
};
static
const
io_uuid_spec_t
bl2_uuid_spec
=
{
.
uuid
=
UUID_TRUSTED_BOOT_FIRMWARE_BL2
,
};
static
const
io_uuid_spec_t
bl31_uuid_spec
=
{
.
uuid
=
UUID_EL3_RUNTIME_FIRMWARE_BL31
,
};
static
const
io_uuid_spec_t
bl32_uuid_spec
=
{
.
uuid
=
UUID_SECURE_PAYLOAD_BL32
,
};
static
const
io_uuid_spec_t
bl33_uuid_spec
=
{
.
uuid
=
UUID_NON_TRUSTED_FIRMWARE_BL33
,
};
static
int
open_fip
(
const
uintptr_t
spec
);
static
int
open_memmap
(
const
uintptr_t
spec
);
struct
plat_io_policy
{
uintptr_t
*
dev_handle
;
uintptr_t
image_spec
;
int
(
*
check
)(
const
uintptr_t
spec
);
};
static
const
struct
plat_io_policy
policies
[]
=
{
[
FIP_IMAGE_ID
]
=
{
&
memmap_dev_handle
,
(
uintptr_t
)
&
fip_block_spec
,
open_memmap
},
[
BL2_IMAGE_ID
]
=
{
&
fip_dev_handle
,
(
uintptr_t
)
&
bl2_uuid_spec
,
open_fip
},
[
BL31_IMAGE_ID
]
=
{
&
fip_dev_handle
,
(
uintptr_t
)
&
bl31_uuid_spec
,
open_fip
},
[
BL32_IMAGE_ID
]
=
{
&
fip_dev_handle
,
(
uintptr_t
)
&
bl32_uuid_spec
,
open_fip
},
[
BL33_IMAGE_ID
]
=
{
&
fip_dev_handle
,
(
uintptr_t
)
&
bl33_uuid_spec
,
open_fip
},
};
static
int
open_fip
(
const
uintptr_t
spec
)
{
int
result
;
uintptr_t
local_image_handle
;
/* See if a Firmware Image Package is available */
result
=
io_dev_init
(
fip_dev_handle
,
(
uintptr_t
)
FIP_IMAGE_ID
);
if
(
result
==
0
)
{
result
=
io_open
(
fip_dev_handle
,
spec
,
&
local_image_handle
);
if
(
result
==
0
)
{
VERBOSE
(
"Using FIP
\n
"
);
io_close
(
local_image_handle
);
}
}
return
result
;
}
static
int
open_memmap
(
const
uintptr_t
spec
)
{
int
result
;
uintptr_t
local_image_handle
;
result
=
io_dev_init
(
memmap_dev_handle
,
(
uintptr_t
)
NULL
);
if
(
result
==
0
)
{
result
=
io_open
(
memmap_dev_handle
,
spec
,
&
local_image_handle
);
if
(
result
==
0
)
{
VERBOSE
(
"Using Memmap
\n
"
);
io_close
(
local_image_handle
);
}
}
return
result
;
}
void
ls_io_setup
(
void
)
{
int
io_result
;
io_result
=
register_io_dev_fip
(
&
fip_dev_con
);
assert
(
io_result
==
0
);
io_result
=
register_io_dev_memmap
(
&
memmap_dev_con
);
assert
(
io_result
==
0
);
/* Open connections to devices and cache the handles */
io_result
=
io_dev_open
(
fip_dev_con
,
(
uintptr_t
)
NULL
,
&
fip_dev_handle
);
assert
(
io_result
==
0
);
io_result
=
io_dev_open
(
memmap_dev_con
,
(
uintptr_t
)
NULL
,
&
memmap_dev_handle
);
assert
(
io_result
==
0
);
/* Ignore improbable errors in release builds */
(
void
)
io_result
;
}
void
plat_ls_io_setup
(
void
)
{
ls_io_setup
();
}
int
plat_ls_get_alt_image_source
(
unsigned
int
image_id
__unused
,
uintptr_t
*
dev_handle
__unused
,
uintptr_t
*
image_spec
__unused
)
{
/* By default do not try an alternative */
return
-
ENOENT
;
}
/*
* Return an IO device handle and specification which can be used to access
* an image. Use this to enforce platform load policy.
*/
int
plat_get_image_source
(
unsigned
int
image_id
,
uintptr_t
*
dev_handle
,
uintptr_t
*
image_spec
)
{
int
result
;
const
struct
plat_io_policy
*
policy
;
assert
(
image_id
<
ARRAY_SIZE
(
policies
));
policy
=
&
policies
[
image_id
];
result
=
policy
->
check
(
policy
->
image_spec
);
if
(
result
==
0
)
{
*
image_spec
=
policy
->
image_spec
;
*
dev_handle
=
*
(
policy
->
dev_handle
);
}
else
{
VERBOSE
(
"Trying alternative IO
\n
"
);
result
=
plat_ls_get_alt_image_source
(
image_id
,
dev_handle
,
image_spec
);
}
return
result
;
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_timer.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <mmio.h>
#include <delay_timer.h>
#include <arch_helpers.h>
#define TIMER_BASE_ADDR 0x02B00000
uint64_t
ls_get_timer
(
uint64_t
start
)
{
return
read_cntpct_el0
()
*
1000
/
read_cntfrq_el0
()
-
start
;
}
static
uint32_t
ls_timeus_get_value
(
void
)
{
/*
* Generic delay timer implementation expects the timer to be a down
* counter. We apply bitwise NOT operator to the tick values returned
* by read_cntpct_el0() to simulate the down counter. The value is
* clipped from 64 to 32 bits.
*/
return
(
uint32_t
)(
~
read_cntpct_el0
());
}
static
const
timer_ops_t
ls_timer_ops
=
{
.
get_timer_value
=
ls_timeus_get_value
,
.
clk_mult
=
1
,
.
clk_div
=
25
,
};
/*
* Initialise the nxp layerscape on-chip free rolling us counter as the delay
* timer.
*/
void
ls_delay_timer_init
(
void
)
{
uintptr_t
cntcr
=
TIMER_BASE_ADDR
;
mmio_write_32
(
cntcr
,
0x1
);
timer_init
(
&
ls_timer_ops
);
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_topology.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "plat_ls.h"
/*******************************************************************************
* This function validates an MPIDR by checking whether it falls within the
* acceptable bounds. An error code (-1) is returned if an incorrect mpidr
* is passed.
******************************************************************************/
int
ls_check_mpidr
(
u_register_t
mpidr
)
{
unsigned
int
cluster_id
,
cpu_id
;
uint64_t
valid_mask
;
valid_mask
=
~
(
MPIDR_CLUSTER_MASK
|
MPIDR_CPU_MASK
);
cluster_id
=
(
mpidr
>>
MPIDR_AFF1_SHIFT
)
&
MPIDR_AFFLVL_MASK
;
cpu_id
=
(
mpidr
>>
MPIDR_AFF0_SHIFT
)
&
MPIDR_AFFLVL_MASK
;
mpidr
&=
MPIDR_AFFINITY_MASK
;
if
(
mpidr
&
valid_mask
)
return
-
1
;
if
(
cluster_id
>=
PLAT_LS_CLUSTER_COUNT
)
return
-
1
;
/*
* Validate cpu_id by checking whether it represents a CPU in
* one of the two clusters present on the platform.
*/
if
(
cpu_id
>=
plat_ls_get_cluster_core_count
(
mpidr
))
return
-
1
;
return
0
;
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ls_tzc380.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <debug.h>
#include <mmio.h>
#include <endian.h>
#include "platform_def.h"
#include "soc_tzasc.h"
int
tzc380_set_region
(
unsigned
int
tzasc_base
,
unsigned
int
region_id
,
unsigned
int
enabled
,
unsigned
int
low_addr
,
unsigned
int
high_addr
,
unsigned
int
size
,
unsigned
int
security
,
unsigned
int
subreg_disable_mask
)
{
unsigned
int
reg
;
unsigned
int
reg_base
;
unsigned
int
attr_value
;
reg_base
=
(
tzasc_base
+
TZASC_REGIONS_REG
+
(
region_id
<<
4
));
if
(
region_id
==
0
)
{
reg
=
(
reg_base
+
TZASC_REGION_ATTR_OFFSET
);
mmio_write_32
((
uintptr_t
)
reg
,
((
security
&
0xF
)
<<
28
));
}
else
{
reg
=
reg_base
+
TZASC_REGION_LOWADDR_OFFSET
;
mmio_write_32
((
uintptr_t
)
reg
,
(
low_addr
&
TZASC_REGION_LOWADDR_MASK
));
reg
=
reg_base
+
TZASC_REGION_HIGHADDR_OFFSET
;
mmio_write_32
((
uintptr_t
)
reg
,
high_addr
);
reg
=
reg_base
+
TZASC_REGION_ATTR_OFFSET
;
attr_value
=
((
security
&
0xF
)
<<
28
)
|
((
subreg_disable_mask
&
0xFF
)
<<
8
)
|
((
size
&
0x3F
)
<<
1
)
|
(
enabled
&
0x1
);
mmio_write_32
((
uintptr_t
)
reg
,
attr_value
);
}
return
0
;
}
int
tzc380_setup
(
void
)
{
int
reg_id
=
0
;
INFO
(
"Configuring TZASC-380
\n
"
);
/*
* Configure CCI control override register to terminate all barrier
* transactions
*/
mmio_write_32
(
PLAT_LS1043_CCI_BASE
,
CCI_TERMINATE_BARRIER_TX
);
/* Configure CSU secure access register to disable TZASC bypass mux */
mmio_write_32
((
uintptr_t
)(
CONFIG_SYS_FSL_CSU_ADDR
+
CSU_SEC_ACCESS_REG_OFFSET
),
bswap32
(
TZASC_BYPASS_MUX_DISABLE
));
for
(
reg_id
=
0
;
reg_id
<
MAX_NUM_TZC_REGION
;
reg_id
++
)
{
tzc380_set_region
(
CONFIG_SYS_FSL_TZASC_ADDR
,
reg_id
,
tzc380_reg_list
[
reg_id
].
enabled
,
tzc380_reg_list
[
reg_id
].
low_addr
,
tzc380_reg_list
[
reg_id
].
high_addr
,
tzc380_reg_list
[
reg_id
].
size
,
tzc380_reg_list
[
reg_id
].
secure
,
tzc380_reg_list
[
reg_id
].
sub_mask
);
}
return
0
;
}
This diff is collapsed.
Click to expand it.
plat/layerscape/common/ns_access.c
0 → 100644
View file @
bc2910c1
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <mmio.h>
#include <endian.h>
#include <debug.h>
#include "ns_access.h"
#include "platform_def.h"
static
void
enable_devices_ns_access
(
struct
csu_ns_dev
*
ns_dev
,
uint32_t
num
)
{
uint32_t
*
base
=
(
uint32_t
*
)
CONFIG_SYS_FSL_CSU_ADDR
;
uint32_t
*
reg
;
uint32_t
val
;
int
i
;
for
(
i
=
0
;
i
<
num
;
i
++
)
{
reg
=
base
+
ns_dev
[
i
].
ind
/
2
;
val
=
be32toh
(
mmio_read_32
((
uintptr_t
)
reg
));
if
(
ns_dev
[
i
].
ind
%
2
==
0
)
{
val
&=
0x0000ffff
;
val
|=
ns_dev
[
i
].
val
<<
16
;
}
else
{
val
&=
0xffff0000
;
val
|=
ns_dev
[
i
].
val
;
}
mmio_write_32
((
uintptr_t
)
reg
,
htobe32
(
val
));
}
}
void
enable_layerscape_ns_access
(
void
)
{
enable_devices_ns_access
(
ns_dev
,
ARRAY_SIZE
(
ns_dev
));
}
This diff is collapsed.
Click to expand it.
Prev
1
2
3
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