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
bc2910c1
Unverified
Commit
bc2910c1
authored
Apr 10, 2018
by
Dimitris Papastamos
Committed by
GitHub
Apr 10, 2018
Browse files
Merge pull request #1306 from JiafeiPan/master
layerscape: Initial ATF support for LS1043ardb
parents
c39afead
364e1342
Changes
43
Show whitespace changes
Inline
Side-by-side
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
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
)
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
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
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
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__ */
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__ */
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__ */
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__ */
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
}
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
);
}
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
();
}
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
;
}
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
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
();
}
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
;
}
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
);
}
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
;
}
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
;
}
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
));
}
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