Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
0f22bef3
Commit
0f22bef3
authored
7 years ago
by
Scott Branden
Committed by
GitHub
7 years ago
Browse files
Options
Download
Plain Diff
Merge branch 'integration' into tf_issue_461
parents
53d9c9c8
dd454b40
Changes
132
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
plat/arm/common/aarch64/arm_helpers.S
+15
-1
plat/arm/common/aarch64/arm_helpers.S
plat/arm/common/arm_bl1_setup.c
+2
-1
plat/arm/common/arm_bl1_setup.c
plat/arm/common/arm_bl2_setup.c
+10
-5
plat/arm/common/arm_bl2_setup.c
plat/arm/common/arm_common.c
+1
-1
plat/arm/common/arm_common.c
plat/arm/common/arm_common.mk
+22
-5
plat/arm/common/arm_common.mk
plat/arm/css/common/aarch32/css_helpers.S
+106
-0
plat/arm/css/common/aarch32/css_helpers.S
plat/arm/css/common/css_common.mk
+2
-2
plat/arm/css/common/css_common.mk
plat/arm/css/common/css_pm.c
+46
-4
plat/arm/css/common/css_pm.c
plat/arm/css/drivers/scp/css_pm_scpi.c
+13
-0
plat/arm/css/drivers/scp/css_pm_scpi.c
plat/common/aarch32/platform_helpers.S
+33
-1
plat/common/aarch32/platform_helpers.S
plat/common/aarch64/platform_helpers.S
+11
-1
plat/common/aarch64/platform_helpers.S
plat/common/aarch64/platform_mp_stack.S
+3
-3
plat/common/aarch64/platform_mp_stack.S
plat/mediatek/common/drivers/uart/8250_console.S
+17
-1
plat/mediatek/common/drivers/uart/8250_console.S
plat/nvidia/tegra/common/aarch64/tegra_helpers.S
+6
-5
plat/nvidia/tegra/common/aarch64/tegra_helpers.S
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v1.c
+37
-12
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v1.c
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v2.c
+103
-242
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v2.c
plat/nvidia/tegra/common/drivers/smmu/smmu.c
+184
-0
plat/nvidia/tegra/common/drivers/smmu/smmu.c
plat/nvidia/tegra/common/tegra_bl31_setup.c
+10
-4
plat/nvidia/tegra/common/tegra_bl31_setup.c
plat/nvidia/tegra/common/tegra_common.mk
+2
-12
plat/nvidia/tegra/common/tegra_common.mk
plat/nvidia/tegra/common/tegra_platform.c
+8
-0
plat/nvidia/tegra/common/tegra_platform.c
with
631 additions
and
300 deletions
+631
-300
plat/arm/common/aarch64/arm_helpers.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2015
-
201
6
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2015
-
201
7
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
...
...
@@ -34,6 +34,7 @@
.
weak
plat_my_core_pos
.
globl
plat_crash_console_init
.
globl
plat_crash_console_putc
.
globl
plat_crash_console_flush
.
globl
platform_mem_init
...
...
@@ -88,6 +89,19 @@ func plat_crash_console_putc
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_ARM_CRASH_UART_BASE
b
console_core_flush
endfunc
plat_crash_console_flush
/
*
---------------------------------------------------------------------
*
We
don
't need to carry out any memory initialization on ARM
*
platforms
.
The
Secure
RAM
is
accessible
straight
away
.
...
...
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_bl1_setup.c
View file @
0f22bef3
...
...
@@ -30,13 +30,13 @@
#include <arch.h>
#include <arm_def.h>
#include <arm_xlat_tables.h>
#include <bl_common.h>
#include <console.h>
#include <platform_def.h>
#include <plat_arm.h>
#include <sp805.h>
#include <utils.h>
#include <xlat_tables_v2.h>
#include "../../../bl1/bl1_private.h"
/* Weak definitions may be overridden in specific ARM standard platform */
...
...
@@ -44,6 +44,7 @@
#pragma weak bl1_plat_arch_setup
#pragma weak bl1_platform_setup
#pragma weak bl1_plat_sec_mem_layout
#pragma weak bl1_plat_prepare_exit
/* Data structure which holds the extents of the trusted SRAM for BL1*/
...
...
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_bl2_setup.c
View file @
0f22bef3
...
...
@@ -249,11 +249,7 @@ void bl2_plat_arch_setup(void)
}
#if LOAD_IMAGE_V2
/*******************************************************************************
* 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
)
int
arm_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
);
...
...
@@ -286,6 +282,15 @@ int bl2_plat_handle_post_image_load(unsigned int image_id)
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
arm_bl2_handle_post_image_load
(
image_id
);
}
#else
/* LOAD_IMAGE_V2 */
/*******************************************************************************
...
...
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_common.c
View file @
0f22bef3
...
...
@@ -29,12 +29,12 @@
*/
#include <arch.h>
#include <arch_helpers.h>
#include <arm_xlat_tables.h>
#include <assert.h>
#include <debug.h>
#include <mmio.h>
#include <plat_arm.h>
#include <platform_def.h>
#include <xlat_tables_v2.h>
extern
const
mmap_region_t
plat_arm_mmap
[];
...
...
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_common.mk
View file @
0f22bef3
...
...
@@ -95,6 +95,11 @@ ARM_PLAT_MT := 0
$(eval
$(call
assert_boolean,ARM_PLAT_MT))
$(eval
$(call
add_define,ARM_PLAT_MT))
# Use translation tables library v2 by default
ARM_XLAT_TABLES_LIB_V1
:=
0
$(eval
$(call
assert_boolean,ARM_XLAT_TABLES_LIB_V1))
$(eval
$(call
add_define,ARM_XLAT_TABLES_LIB_V1))
# Enable PSCI_STAT_COUNT/RESIDENCY APIs on ARM platforms
ENABLE_PSCI_STAT
:=
1
ENABLE_PMF
:=
1
...
...
@@ -113,11 +118,17 @@ ifeq (${ARCH}, aarch64)
PLAT_INCLUDES
+=
-Iinclude
/plat/arm/common/aarch64
endif
PLAT_BL_COMMON_SOURCES
+=
plat/arm/common/
${ARCH}
/arm_helpers.S
\
plat/arm/common/arm_common.c
ifeq
(${ARM_XLAT_TABLES_LIB_V1}, 1)
PLAT_BL_COMMON_SOURCES
+=
lib/xlat_tables/xlat_tables_common.c
\
lib/xlat_tables/
${ARCH}
/xlat_tables.c
else
include
lib/xlat_tables_v2/xlat_tables.mk
PLAT_BL_COMMON_SOURCES
+=
${XLAT_TABLES_LIB_SRCS}
\
plat/arm/common/
${ARCH}
/arm_helpers.S
\
plat/arm/common/arm_common.c
PLAT_BL_COMMON_SOURCES
+=
${XLAT_TABLES_LIB_SRCS}
endif
BL1_SOURCES
+=
drivers/arm/sp805/sp805.c
\
drivers/io/io_fip.c
\
...
...
@@ -137,8 +148,14 @@ BL2_SOURCES += drivers/io/io_fip.c \
plat/arm/common/arm_bl2_setup.c
\
plat/arm/common/arm_io_storage.c
ifeq
(${LOAD_IMAGE_V2},1)
BL2_SOURCES
+=
plat/arm/common/
${ARCH}
/arm_bl2_mem_params_desc.c
\
plat/arm/common/arm_image_load.c
\
# Because BL1/BL2 execute in AArch64 mode but BL32 in AArch32 we need to use
# the AArch32 descriptors.
ifeq
(${JUNO_AARCH32_EL3_RUNTIME},1)
BL2_SOURCES
+=
plat/arm/common/aarch32/arm_bl2_mem_params_desc.c
else
BL2_SOURCES
+=
plat/arm/common/
${ARCH}
/arm_bl2_mem_params_desc.c
endif
BL2_SOURCES
+=
plat/arm/common/arm_image_load.c
\
common/desc_image_load.c
endif
...
...
This diff is collapsed.
Click to expand it.
plat/arm/css/common/aarch32/css_helpers.S
0 → 100644
View file @
0f22bef3
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <cpu_macros.S>
#include <css_def.h>
.
weak
plat_secondary_cold_boot_setup
.
weak
plat_get_my_entrypoint
.
globl
css_calc_core_pos_swap_cluster
.
weak
plat_is_my_cpu_primary
/
*
---------------------------------------------------------------------
*
void
plat_secondary_cold_boot_setup
(
void
)
;
*
In
the
normal
boot
flow
,
cold
-
booting
secondary
*
CPUs
is
not
yet
implemented
and
they
panic
.
*
---------------------------------------------------------------------
*/
func
plat_secondary_cold_boot_setup
/
*
TODO
:
Implement
secondary
CPU
cold
boot
setup
on
CSS
platforms
*/
cb_panic
:
b
cb_panic
endfunc
plat_secondary_cold_boot_setup
/
*
---------------------------------------------------------------------
*
uintptr_t
plat_get_my_entrypoint
(
void
)
;
*
*
Main
job
of
this
routine
is
to
distinguish
between
a
cold
and
a
warm
*
boot
.
On
CSS
platforms
,
this
distinction
is
based
on
the
contents
of
*
the
Trusted
Mailbox
.
It
is
initialised
to
zero
by
the
SCP
before
the
*
AP
cores
are
released
from
reset
.
Therefore
,
a
zero
mailbox
means
*
it
's a cold reset.
*
*
This
functions
returns
the
contents
of
the
mailbox
,
i
.
e
.
:
*
-
0
for
a
cold
boot
;
*
-
the
warm
boot
entrypoint
for
a
warm
boot
.
*
---------------------------------------------------------------------
*/
func
plat_get_my_entrypoint
ldr
r0
,
=
PLAT_ARM_TRUSTED_MAILBOX_BASE
ldr
r0
,
[
r0
]
bx
lr
endfunc
plat_get_my_entrypoint
/
*
-----------------------------------------------------------
*
unsigned
int
css_calc_core_pos_swap_cluster
(
u_register_t
mpidr
)
*
Utility
function
to
calculate
the
core
position
by
*
swapping
the
cluster
order
.
This
is
necessary
in
order
to
*
match
the
format
of
the
boot
information
passed
by
the
SCP
*
and
read
in
plat_is_my_cpu_primary
below
.
*
-----------------------------------------------------------
*/
func
css_calc_core_pos_swap_cluster
and
r1
,
r0
,
#
MPIDR_CPU_MASK
and
r0
,
r0
,
#
MPIDR_CLUSTER_MASK
eor
r0
,
r0
,
#(
1
<<
MPIDR_AFFINITY_BITS
)
//
swap
cluster
order
add
r0
,
r1
,
r0
,
LSR
#
6
bx
lr
endfunc
css_calc_core_pos_swap_cluster
/
*
-----------------------------------------------------
*
unsigned
int
plat_is_my_cpu_primary
(
void
)
;
*
*
Find
out
whether
the
current
cpu
is
the
primary
*
cpu
(
applicable
ony
after
a
cold
boot
)
*
-----------------------------------------------------
*/
func
plat_is_my_cpu_primary
mov
r10
,
lr
bl
plat_my_core_pos
ldr
r1
,
=
SCP_BOOT_CFG_ADDR
ldr
r1
,
[
r1
]
ubfx
r1
,
r1
,
#
PLAT_CSS_PRIMARY_CPU_SHIFT
,
\
#
PLAT_CSS_PRIMARY_CPU_BIT_WIDTH
cmp
r0
,
r1
moveq
r0
,
#
1
movne
r0
,
#
0
bx
r10
endfunc
plat_is_my_cpu_primary
This diff is collapsed.
Click to expand it.
plat/arm/css/common/css_common.mk
View file @
0f22bef3
...
...
@@ -36,7 +36,7 @@ PLAT_INCLUDES += -Iinclude/plat/arm/css/common \
-Iinclude
/plat/arm/css/common/aarch64
PLAT_BL_COMMON_SOURCES
+=
plat/arm/css/common/
aarch64
/css_helpers.S
PLAT_BL_COMMON_SOURCES
+=
plat/arm/css/common/
${ARCH}
/css_helpers.S
BL1_SOURCES
+=
plat/arm/css/common/css_bl1_setup.c
...
...
@@ -64,7 +64,7 @@ $(eval $(call assert_boolean,CSS_LOAD_SCP_IMAGES))
$(eval
$(call
add_define,CSS_LOAD_SCP_IMAGES))
ifeq
(${CSS_LOAD_SCP_IMAGES},1)
$(eval
$(call
FIP_ADD_IMG,SCP_BL2,--scp-fw))
NEED_SCP_BL2
:=
yes
ifneq
(${TRUSTED_BOARD_BOOT},0)
$(eval
$(call
FWU_FIP_ADD_IMG,SCP_BL2U,--scp-fwu-cfg))
endif
...
...
This diff is collapsed.
Click to expand it.
plat/arm/css/common/css_pm.c
View file @
0f22bef3
/*
* Copyright (c) 2015-201
6
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-201
7
, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
...
...
@@ -75,6 +75,13 @@ const unsigned int arm_pm_idle_states[] = {
CASSERT
(
PLAT_MAX_PWR_LVL
>=
ARM_PWR_LVL1
,
assert_max_pwr_lvl_supported_mismatch
);
/*
* Ensure that the PLAT_MAX_PWR_LVL is not greater than CSS_SYSTEM_PWR_DMN_LVL
* assumed by the CSS layer.
*/
CASSERT
(
PLAT_MAX_PWR_LVL
<=
CSS_SYSTEM_PWR_DMN_LVL
,
assert_max_pwr_lvl_higher_than_css_sys_lvl
);
/*******************************************************************************
* Handler called when a power domain is about to be turned on. The
* level and mpidr determine the affinity instance.
...
...
@@ -243,7 +250,7 @@ void css_get_sys_suspend_power_state(psci_power_state_t *req_state)
* System Suspend is supported only if the system power domain node
* is implemented.
*/
assert
(
PLAT_MAX_PWR_LVL
>
=
AR
M_PWR_LVL
2
);
assert
(
PLAT_MAX_PWR_LVL
=
=
CSS_SYSTE
M_PWR_
DMN_
LVL
);
for
(
i
=
ARM_PWR_LVL0
;
i
<=
PLAT_MAX_PWR_LVL
;
i
++
)
req_state
->
pwr_domain_state
[
i
]
=
ARM_LOCAL_STATE_OFF
;
...
...
@@ -257,6 +264,39 @@ int css_node_hw_state(u_register_t mpidr, unsigned int power_level)
return
css_scp_get_power_state
(
mpidr
,
power_level
);
}
/*
* The system power domain suspend is only supported only via
* PSCI SYSTEM_SUSPEND API. PSCI CPU_SUSPEND request to system power domain
* will be downgraded to the lower level.
*/
static
int
css_validate_power_state
(
unsigned
int
power_state
,
psci_power_state_t
*
req_state
)
{
int
rc
;
rc
=
arm_validate_power_state
(
power_state
,
req_state
);
/*
* Ensure that the system power domain level is never suspended
* via PSCI CPU SUSPEND API. Currently system suspend is only
* supported via PSCI SYSTEM SUSPEND API.
*/
req_state
->
pwr_domain_state
[
CSS_SYSTEM_PWR_DMN_LVL
]
=
ARM_LOCAL_STATE_RUN
;
return
rc
;
}
/*
* Custom `translate_power_state_by_mpidr` handler for CSS. Unlike in the
* `css_validate_power_state`, we do not downgrade the system power
* domain level request in `power_state` as it will be used to query the
* PSCI_STAT_COUNT/RESIDENCY at the system power domain level.
*/
static
int
css_translate_power_state_by_mpidr
(
u_register_t
mpidr
,
unsigned
int
power_state
,
psci_power_state_t
*
output_state
)
{
return
arm_validate_power_state
(
power_state
,
output_state
);
}
/*******************************************************************************
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
* platform will take care of registering the handlers with PSCI.
...
...
@@ -270,7 +310,9 @@ plat_psci_ops_t plat_arm_psci_pm_ops = {
.
pwr_domain_suspend_finish
=
css_pwr_domain_suspend_finish
,
.
system_off
=
css_system_off
,
.
system_reset
=
css_system_reset
,
.
validate_power_state
=
arm
_validate_power_state
,
.
validate_power_state
=
css
_validate_power_state
,
.
validate_ns_entrypoint
=
arm_validate_ns_entrypoint
,
.
get_node_hw_state
=
css_node_hw_state
.
translate_power_state_by_mpidr
=
css_translate_power_state_by_mpidr
,
.
get_node_hw_state
=
css_node_hw_state
,
.
get_sys_suspend_power_state
=
css_get_sys_suspend_power_state
};
This diff is collapsed.
Click to expand it.
plat/arm/css/drivers/scp/css_pm_scpi.c
View file @
0f22bef3
...
...
@@ -32,6 +32,7 @@
#include <assert.h>
#include <css_pm.h>
#include <debug.h>
#include <plat_arm.h>
#include "../scpi/css_scpi.h"
#include "css_scp.h"
...
...
@@ -134,6 +135,12 @@ void __dead2 css_scp_sys_shutdown(void)
{
uint32_t
response
;
/*
* Disable GIC CPU interface to prevent pending interrupt
* from waking up the AP from WFI.
*/
plat_arm_gic_cpuif_disable
();
/* Send the power down request to the SCP */
response
=
scpi_sys_power_state
(
scpi_system_shutdown
);
...
...
@@ -153,6 +160,12 @@ void __dead2 css_scp_sys_reboot(void)
{
uint32_t
response
;
/*
* Disable GIC CPU interface to prevent pending interrupt
* from waking up the AP from WFI.
*/
plat_arm_gic_cpuif_disable
();
/* Send the system reset request to the SCP */
response
=
scpi_sys_power_state
(
scpi_system_reboot
);
...
...
This diff is collapsed.
Click to expand it.
plat/common/aarch32/platform_helpers.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2016
-
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
...
...
@@ -31,11 +31,43 @@
#include <arch.h>
#include <asm_macros.S>
.
weak
plat_crash_console_init
.
weak
plat_crash_console_putc
.
weak
plat_crash_console_flush
.
weak
plat_reset_handler
.
weak
plat_disable_acp
.
weak
platform_mem_init
.
weak
plat_panic_handler
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
*
-----------------------------------------------------
*/
func
plat_crash_console_init
mov
r0
,
#
0
bx
lr
endfunc
plat_crash_console_init
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
*
-----------------------------------------------------
*/
func
plat_crash_console_putc
bx
lr
endfunc
plat_crash_console_putc
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
*
-----------------------------------------------------
*/
func
plat_crash_console_flush
mov
r0
,
#
0
bx
lr
endfunc
plat_crash_console_flush
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
...
...
This diff is collapsed.
Click to expand it.
plat/common/aarch64/platform_helpers.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2013
-
201
6
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2013
-
201
7
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
...
...
@@ -35,6 +35,7 @@
.
weak
plat_report_exception
.
weak
plat_crash_console_init
.
weak
plat_crash_console_putc
.
weak
plat_crash_console_flush
.
weak
plat_reset_handler
.
weak
plat_disable_acp
.
weak
bl1_plat_prepare_exit
...
...
@@ -96,6 +97,15 @@ func plat_crash_console_putc
ret
endfunc
plat_crash_console_putc
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
*
-----------------------------------------------------
*/
func
plat_crash_console_flush
ret
endfunc
plat_crash_console_flush
/
*
-----------------------------------------------------
*
Placeholder
function
which
should
be
redefined
by
*
each
platform
.
This
function
should
preserve
x19
-
x29
.
...
...
This diff is collapsed.
Click to expand it.
plat/common/aarch64/platform_mp_stack.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2014
-
201
6
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2014
-
201
7
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
...
...
@@ -131,7 +131,7 @@ endfunc platform_set_stack
*
-------------------------------------------------------
*/
func_deprecated
platform_get_stack
#if
ASM
_ASSERTION
#if
ENABLE
_ASSERTION
S
mrs
x1
,
mpidr_el1
cmp
x0
,
x1
ASM_ASSERT
(
eq
)
...
...
@@ -150,7 +150,7 @@ endfunc_deprecated platform_get_stack
*
-----------------------------------------------------
*/
func_deprecated
platform_set_stack
#if
ASM
_ASSERTION
#if
ENABLE
_ASSERTION
S
mrs
x1
,
mpidr_el1
cmp
x0
,
x1
ASM_ASSERT
(
eq
)
...
...
This diff is collapsed.
Click to expand it.
plat/mediatek/common/drivers/uart/8250_console.S
View file @
0f22bef3
/*
*
Copyright
(
c
)
2015
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
Copyright
(
c
)
2015
-
2017
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
...
...
@@ -33,6 +33,7 @@
.
globl
console_core_init
.
globl
console_core_putc
.
globl
console_core_getc
.
globl
console_core_flush
/
*
-----------------------------------------------
*
int
console_core_init
(
unsigned
long
base_addr
,
...
...
@@ -170,3 +171,18 @@ getc_error:
mov
w0
,
#-
1
ret
endfunc
console_core_getc
/
*
---------------------------------------------
*
int
console_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_core_flush
/
*
Placeholder
*/
mov
w0
,
#
0
ret
endfunc
console_core_flush
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/aarch64/tegra_helpers.S
View file @
0f22bef3
...
...
@@ -243,11 +243,12 @@ endfunc platform_mem_init
*
---------------------------------------------
*/
func
plat_crash_console_init
adr
x0
,
tegra_console_base
ldr
x0
,
[
x0
]
mov_imm
x1
,
TEGRA_BOOT_UART_CLK_IN_HZ
mov_imm
x2
,
TEGRA_CONSOLE_BAUDRATE
b
console_core_init
mov
x0
,
#
0
adr
x1
,
tegra_console_base
ldr
x1
,
[
x1
]
cbz
x1
,
1
f
mov
w0
,
#
1
1
:
ret
endfunc
plat_crash_console_init
/
*
---------------------------------------------
...
...
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v1.c
View file @
0f22bef3
...
...
@@ -37,7 +37,7 @@
#include <string.h>
#include <tegra_def.h>
#include <utils.h>
#include <xlat_tables.h>
#include <xlat_tables
_v2
.h>
#define TEGRA_GPU_RESET_REG_OFFSET 0x28c
#define GPU_RESET_BIT (1 << 24)
...
...
@@ -135,17 +135,18 @@ static void tegra_clear_videomem(uintptr_t non_overlap_area_start,
unsigned
long
long
non_overlap_area_size
)
{
/*
* Perform cache maintenance to ensure that the non-overlapping area is
* zeroed out. The first invalidation of this range ensures that
* possible evictions of dirty cache lines do not interfere with the
* 'zeromem' operation. Other CPUs could speculatively prefetch the
* main memory contents of this area between the first invalidation and
* the 'zeromem' operation. The second invalidation ensures that any
* such cache lines are removed as well.
* Map the NS memory first, clean it and then unmap it.
*/
inv_dcache_range
(
non_overlap_area_start
,
non_overlap_area_size
);
mmap_add_dynamic_region
(
non_overlap_area_start
,
/* PA */
non_overlap_area_start
,
/* VA */
non_overlap_area_size
,
/* size */
MT_NS
|
MT_RW
|
MT_EXECUTE_NEVER
);
/* attrs */
zeromem
((
void
*
)
non_overlap_area_start
,
non_overlap_area_size
);
inv_dcache_range
(
non_overlap_area_start
,
non_overlap_area_size
);
flush_dcache_range
(
non_overlap_area_start
,
non_overlap_area_size
);
mmap_remove_dynamic_region
(
non_overlap_area_start
,
non_overlap_area_size
);
}
/*
...
...
@@ -194,7 +195,6 @@ void tegra_memctrl_videomem_setup(uint64_t phys_base, uint32_t size_in_bytes)
*/
INFO
(
"Cleaning previous Video Memory Carveout
\n
"
);
disable_mmu_el3
();
if
(
phys_base
>
vmem_end_old
||
video_mem_base
>
vmem_end_new
)
{
tegra_clear_videomem
(
video_mem_base
,
video_mem_size
<<
20
);
}
else
{
...
...
@@ -207,7 +207,6 @@ void tegra_memctrl_videomem_setup(uint64_t phys_base, uint32_t size_in_bytes)
tegra_clear_videomem
(
vmem_end_new
,
non_overlap_area_size
);
}
}
enable_mmu_el3
(
0
);
done:
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_HI
,
(
uint32_t
)(
phys_base
>>
32
));
...
...
@@ -218,3 +217,29 @@ done:
video_mem_base
=
phys_base
;
video_mem_size
=
size_in_bytes
>>
20
;
}
/*
* During boot, USB3 and flash media (SDMMC/SATA) devices need access to
* IRAM. Because these clients connect to the MC and do not have a direct
* path to the IRAM, the MC implements AHB redirection during boot to allow
* path to IRAM. In this mode, accesses to a programmed memory address aperture
* are directed to the AHB bus, allowing access to the IRAM. The AHB aperture
* is defined by the IRAM_BASE_LO and IRAM_BASE_HI registers, which are
* initialized to disable this aperture.
*
* Once bootup is complete, we must program IRAM base to 0xffffffff and
* IRAM top to 0x00000000, thus disabling access to IRAM. DRAM is then
* potentially accessible in this address range. These aperture registers
* also have an access_control/lock bit. After disabling the aperture, the
* access_control register should be programmed to lock the registers.
*/
void
tegra_memctrl_disable_ahb_redirection
(
void
)
{
/* program the aperture registers */
tegra_mc_write_32
(
MC_IRAM_BASE_LO
,
0xFFFFFFFF
);
tegra_mc_write_32
(
MC_IRAM_TOP_LO
,
0
);
tegra_mc_write_32
(
MC_IRAM_BASE_TOP_HI
,
0
);
/* lock the aperture registers */
tegra_mc_write_32
(
MC_IRAM_REG_CTRL
,
MC_DISABLE_IRAM_CFG_WRITES
);
}
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v2.c
View file @
0f22bef3
/*
* Copyright (c) 2015-201
6
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-201
7
, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
...
...
@@ -30,6 +30,7 @@
#include <arch_helpers.h>
#include <assert.h>
#include <bl_common.h>
#include <debug.h>
#include <mce.h>
#include <memctrl.h>
...
...
@@ -48,193 +49,6 @@
static
uint64_t
video_mem_base
;
static
uint64_t
video_mem_size_mb
;
/* array to hold stream_id override config register offsets */
const
static
uint32_t
streamid_overrides
[]
=
{
MC_STREAMID_OVERRIDE_CFG_PTCR
,
MC_STREAMID_OVERRIDE_CFG_AFIR
,
MC_STREAMID_OVERRIDE_CFG_HDAR
,
MC_STREAMID_OVERRIDE_CFG_HOST1XDMAR
,
MC_STREAMID_OVERRIDE_CFG_NVENCSRD
,
MC_STREAMID_OVERRIDE_CFG_SATAR
,
MC_STREAMID_OVERRIDE_CFG_MPCORER
,
MC_STREAMID_OVERRIDE_CFG_NVENCSWR
,
MC_STREAMID_OVERRIDE_CFG_AFIW
,
MC_STREAMID_OVERRIDE_CFG_SATAW
,
MC_STREAMID_OVERRIDE_CFG_MPCOREW
,
MC_STREAMID_OVERRIDE_CFG_SATAW
,
MC_STREAMID_OVERRIDE_CFG_HDAW
,
MC_STREAMID_OVERRIDE_CFG_ISPRA
,
MC_STREAMID_OVERRIDE_CFG_ISPWA
,
MC_STREAMID_OVERRIDE_CFG_ISPWB
,
MC_STREAMID_OVERRIDE_CFG_XUSB_HOSTR
,
MC_STREAMID_OVERRIDE_CFG_XUSB_HOSTW
,
MC_STREAMID_OVERRIDE_CFG_XUSB_DEVR
,
MC_STREAMID_OVERRIDE_CFG_XUSB_DEVW
,
MC_STREAMID_OVERRIDE_CFG_TSECSRD
,
MC_STREAMID_OVERRIDE_CFG_TSECSWR
,
MC_STREAMID_OVERRIDE_CFG_GPUSRD
,
MC_STREAMID_OVERRIDE_CFG_GPUSWR
,
MC_STREAMID_OVERRIDE_CFG_SDMMCRA
,
MC_STREAMID_OVERRIDE_CFG_SDMMCRAA
,
MC_STREAMID_OVERRIDE_CFG_SDMMCR
,
MC_STREAMID_OVERRIDE_CFG_SDMMCRAB
,
MC_STREAMID_OVERRIDE_CFG_SDMMCWA
,
MC_STREAMID_OVERRIDE_CFG_SDMMCWAA
,
MC_STREAMID_OVERRIDE_CFG_SDMMCW
,
MC_STREAMID_OVERRIDE_CFG_SDMMCWAB
,
MC_STREAMID_OVERRIDE_CFG_VICSRD
,
MC_STREAMID_OVERRIDE_CFG_VICSWR
,
MC_STREAMID_OVERRIDE_CFG_VIW
,
MC_STREAMID_OVERRIDE_CFG_NVDECSRD
,
MC_STREAMID_OVERRIDE_CFG_NVDECSWR
,
MC_STREAMID_OVERRIDE_CFG_APER
,
MC_STREAMID_OVERRIDE_CFG_APEW
,
MC_STREAMID_OVERRIDE_CFG_NVJPGSRD
,
MC_STREAMID_OVERRIDE_CFG_NVJPGSWR
,
MC_STREAMID_OVERRIDE_CFG_SESRD
,
MC_STREAMID_OVERRIDE_CFG_SESWR
,
MC_STREAMID_OVERRIDE_CFG_ETRR
,
MC_STREAMID_OVERRIDE_CFG_ETRW
,
MC_STREAMID_OVERRIDE_CFG_TSECSRDB
,
MC_STREAMID_OVERRIDE_CFG_TSECSWRB
,
MC_STREAMID_OVERRIDE_CFG_GPUSRD2
,
MC_STREAMID_OVERRIDE_CFG_GPUSWR2
,
MC_STREAMID_OVERRIDE_CFG_AXISR
,
MC_STREAMID_OVERRIDE_CFG_AXISW
,
MC_STREAMID_OVERRIDE_CFG_EQOSR
,
MC_STREAMID_OVERRIDE_CFG_EQOSW
,
MC_STREAMID_OVERRIDE_CFG_UFSHCR
,
MC_STREAMID_OVERRIDE_CFG_UFSHCW
,
MC_STREAMID_OVERRIDE_CFG_NVDISPLAYR
,
MC_STREAMID_OVERRIDE_CFG_BPMPR
,
MC_STREAMID_OVERRIDE_CFG_BPMPW
,
MC_STREAMID_OVERRIDE_CFG_BPMPDMAR
,
MC_STREAMID_OVERRIDE_CFG_BPMPDMAW
,
MC_STREAMID_OVERRIDE_CFG_AONR
,
MC_STREAMID_OVERRIDE_CFG_AONW
,
MC_STREAMID_OVERRIDE_CFG_AONDMAR
,
MC_STREAMID_OVERRIDE_CFG_AONDMAW
,
MC_STREAMID_OVERRIDE_CFG_SCER
,
MC_STREAMID_OVERRIDE_CFG_SCEW
,
MC_STREAMID_OVERRIDE_CFG_SCEDMAR
,
MC_STREAMID_OVERRIDE_CFG_SCEDMAW
,
MC_STREAMID_OVERRIDE_CFG_APEDMAR
,
MC_STREAMID_OVERRIDE_CFG_APEDMAW
,
MC_STREAMID_OVERRIDE_CFG_NVDISPLAYR1
,
MC_STREAMID_OVERRIDE_CFG_VICSRD1
,
MC_STREAMID_OVERRIDE_CFG_NVDECSRD1
};
/* array to hold the security configs for stream IDs */
const
static
mc_streamid_security_cfg_t
sec_cfgs
[]
=
{
mc_make_sec_cfg
(
SCEW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AFIR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVDISPLAYR1
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
XUSB_DEVR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
VICSRD1
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVENCSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
TSECSRDB
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AXISW
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
SDMMCWAB
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AONDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSWR2
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
SATAW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
UFSHCW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AFIW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SCEDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
UFSHCR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCWAA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
MPCORER
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
PTCR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ETRW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSRD
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
VICSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SCEDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
HDAW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ISPWA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
EQOSW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
XUSB_HOSTW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
TSECSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCRAA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
VIW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AXISR
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
SDMMCW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ISPRA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVDECSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
XUSB_DEVW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVDECSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
MPCOREW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVDISPLAYR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVJPGSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVDECSRD1
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
TSECSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVJPGSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCWA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SCER
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
XUSB_HOSTR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
VICSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AONDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AONW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCRA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
HOST1XDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
EQOSR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SATAR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
HDAR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCRAB
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ETRR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AONR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVENCSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSWR
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
TSECSWRB
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ISPWB
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSRD2
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
APEDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APER
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
};
const
static
mc_txn_override_cfg_t
mc_override_cfgs
[]
=
{
mc_make_txn_override_cfg
(
BPMPW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
EQOSW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
NVJPGSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SDMMCWAA
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
MPCOREW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SCEDMAW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SDMMCW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
AXISW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
TSECSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
GPUSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
XUSB_HOSTW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
TSECSWRB
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
GPUSWR2
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
AONDMAW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
AONW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SESWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
BPMPDMAW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SDMMCWA
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
HDAW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
NVDECSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
UFSHCW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SATAW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
ETRW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
VICSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
NVENCSWR
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SDMMCWAB
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
ISPWB
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
APEW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
XUSB_DEVW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
AFIW
,
CGID_TAG_ADR
),
mc_make_txn_override_cfg
(
SCEW
,
CGID_TAG_ADR
),
};
static
void
tegra_memctrl_reconfig_mss_clients
(
void
)
{
#if ENABLE_ROC_FOR_ORDERING_CLIENT_REQUESTS
...
...
@@ -248,8 +62,10 @@ static void tegra_memctrl_reconfig_mss_clients(void)
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_CTRL0
);
assert
(
val
==
MC_CLIENT_HOTRESET_CTRL0_RESET_VAL
);
wdata_0
=
MC_CLIENT_HOTRESET_CTRL0_AFI_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_HDA_FLUSH_ENB
|
wdata_0
=
MC_CLIENT_HOTRESET_CTRL0_HDA_FLUSH_ENB
|
#if ENABLE_AFI_DEVICE
MC_CLIENT_HOTRESET_CTRL0_AFI_FLUSH_ENB
|
#endif
MC_CLIENT_HOTRESET_CTRL0_SATA_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_XUSB_HOST_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_XUSB_DEV_FLUSH_ENB
;
...
...
@@ -296,7 +112,9 @@ static void tegra_memctrl_reconfig_mss_clients(void)
* of control on overriding the memory type. So, remove TSA's
* memtype override.
*/
#if ENABLE_AFI_DEVICE
mc_set_tsa_passthrough
(
AFIW
);
#endif
mc_set_tsa_passthrough
(
HDAW
);
mc_set_tsa_passthrough
(
SATAW
);
mc_set_tsa_passthrough
(
XUSB_HOSTW
);
...
...
@@ -321,15 +139,19 @@ static void tegra_memctrl_reconfig_mss_clients(void)
* whose AXI IDs we know and trust.
*/
#if ENABLE_AFI_DEVICE
/* Match AFIW */
mc_set_forced_coherent_so_dev_cfg
(
AFIR
);
#endif
/*
* See bug 200131110 comment #35 - there are no normal requests
* and AWID for SO/DEV requests is hardcoded in RTL for a
* particular PCIE controller
*/
#if ENABLE_AFI_DEVICE
mc_set_forced_coherent_so_dev_cfg
(
AFIW
);
#endif
mc_set_forced_coherent_cfg
(
HDAR
);
mc_set_forced_coherent_cfg
(
HDAW
);
mc_set_forced_coherent_cfg
(
SATAR
);
...
...
@@ -374,7 +196,9 @@ static void tegra_memctrl_reconfig_mss_clients(void)
* boot and strongly ordered MSS clients
*/
val
=
MC_PCFIFO_CLIENT_CONFIG1_RESET_VAL
&
#if ENABLE_AFI_DEVICE
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
AFIW
)
&
#endif
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
HDAW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
SATAW
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG1
,
val
);
...
...
@@ -411,7 +235,9 @@ static void tegra_memctrl_reconfig_mss_clients(void)
* for boot and strongly ordered MSS clients
*/
val
=
MC_SMMU_CLIENT_CONFIG1_RESET_VAL
&
#if ENABLE_AFI_DEVICE
mc_set_smmu_unordered_boot_so_mss
(
1
,
AFIW
)
&
#endif
mc_set_smmu_unordered_boot_so_mss
(
1
,
HDAW
)
&
mc_set_smmu_unordered_boot_so_mss
(
1
,
SATAW
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG1
,
val
);
...
...
@@ -480,33 +306,95 @@ static void tegra_memctrl_reconfig_mss_clients(void)
#endif
}
static
void
tegra_memctrl_set_overrides
(
void
)
{
tegra_mc_settings_t
*
plat_mc_settings
=
tegra_get_mc_settings
();
const
mc_txn_override_cfg_t
*
mc_txn_override_cfgs
;
uint32_t
num_txn_override_cfgs
;
uint32_t
i
,
val
;
/* Get the settings from the platform */
assert
(
plat_mc_settings
);
mc_txn_override_cfgs
=
plat_mc_settings
->
txn_override_cfg
;
num_txn_override_cfgs
=
plat_mc_settings
->
num_txn_override_cfgs
;
/*
* Set the MC_TXN_OVERRIDE registers for write clients.
*/
if
((
tegra_chipid_is_t186
())
&&
(
!
tegra_platform_is_silicon
()
||
(
tegra_platform_is_silicon
()
&&
(
tegra_get_chipid_minor
()
==
1
))))
{
/*
* GPU and NVENC settings for Tegra186 simulation and
* Silicon rev. A01
*/
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_ZERO
);
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR2
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR2
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_ZERO
);
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_NVENCSWR
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_NVENCSWR
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_CLIENT_AXI_ID
);
}
else
{
/*
* Settings for Tegra186 silicon rev. A02 and onwards.
*/
for
(
i
=
0
;
i
<
num_txn_override_cfgs
;
i
++
)
{
val
=
tegra_mc_read_32
(
mc_txn_override_cfgs
[
i
].
offset
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
mc_txn_override_cfgs
[
i
].
offset
,
val
|
mc_txn_override_cfgs
[
i
].
cgid_tag
);
}
}
}
/*
* Init Memory controller during boot.
*/
void
tegra_memctrl_setup
(
void
)
{
uint32_t
val
;
uint32_t
num_overrides
=
sizeof
(
streamid_overrides
)
/
sizeof
(
uint32_t
);
uint32_t
num_sec_cfgs
=
sizeof
(
sec_cfgs
)
/
sizeof
(
mc_streamid_security_cfg_t
);
uint32_t
num_txn_overrides
=
sizeof
(
mc_override_cfgs
)
/
sizeof
(
mc_txn_override_cfg_t
);
int
i
;
const
uint32_t
*
mc_streamid_override_regs
;
uint32_t
num_streamid_override_regs
;
const
mc_streamid_security_cfg_t
*
mc_streamid_sec_cfgs
;
uint32_t
num_streamid_sec_cfgs
;
tegra_mc_settings_t
*
plat_mc_settings
=
tegra_get_mc_settings
();
uint32_t
i
;
INFO
(
"Tegra Memory Controller (v2)
\n
"
);
#if ENABLE_SMMU_DEVICE
/* Program the SMMU pagesize */
tegra_smmu_init
();
#endif
/* Get the settings from the platform */
assert
(
plat_mc_settings
);
mc_streamid_override_regs
=
plat_mc_settings
->
streamid_override_cfg
;
num_streamid_override_regs
=
plat_mc_settings
->
num_streamid_override_cfgs
;
mc_streamid_sec_cfgs
=
plat_mc_settings
->
streamid_security_cfg
;
num_streamid_sec_cfgs
=
plat_mc_settings
->
num_streamid_security_cfgs
;
/* Program all the Stream ID overrides */
for
(
i
=
0
;
i
<
num_overrides
;
i
++
)
tegra_mc_streamid_write_32
(
streamid_overrides
[
i
],
for
(
i
=
0
;
i
<
num_
streamid_
override
_reg
s
;
i
++
)
tegra_mc_streamid_write_32
(
mc_
streamid_override
_reg
s
[
i
],
MC_STREAM_ID_MAX
);
/* Program the security config settings for all Stream IDs */
for
(
i
=
0
;
i
<
num_sec_cfgs
;
i
++
)
{
val
=
sec_cfgs
[
i
].
override_enable
<<
16
|
sec_cfgs
[
i
].
override_client_inputs
<<
8
|
sec_cfgs
[
i
].
override_client_ns_flag
<<
0
;
tegra_mc_streamid_write_32
(
sec_cfgs
[
i
].
offset
,
val
);
for
(
i
=
0
;
i
<
num_
streamid_
sec_cfgs
;
i
++
)
{
val
=
mc_streamid_
sec_cfgs
[
i
].
override_enable
<<
16
|
mc_streamid_
sec_cfgs
[
i
].
override_client_inputs
<<
8
|
mc_streamid_
sec_cfgs
[
i
].
override_client_ns_flag
<<
0
;
tegra_mc_streamid_write_32
(
mc_streamid_
sec_cfgs
[
i
].
offset
,
val
);
}
/*
...
...
@@ -523,7 +411,7 @@ void tegra_memctrl_setup(void)
* mode, as it could be used to circumvent SMMU security checks.
*/
tegra_mc_write_32
(
MC_SMMU_BYPASS_CONFIG
,
MC_SMMU_BYPASS_CONFIG_SETTINGS
);
MC_SMMU_BYPASS_CONFIG_SETTINGS
);
/*
* Re-configure MSS to allow ROC to deal with ordering of the
...
...
@@ -533,39 +421,8 @@ void tegra_memctrl_setup(void)
*/
tegra_memctrl_reconfig_mss_clients
();
/*
* Set the MC_TXN_OVERRIDE registers for write clients.
*/
if
(
!
tegra_platform_is_silicon
()
||
(
tegra_platform_is_silicon
()
&&
tegra_get_chipid_minor
()
==
1
))
{
/* GPU and NVENC settings for rev. A01 */
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_ZERO
);
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR2
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR2
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_ZERO
);
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_NVENCSWR
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
MC_TXN_OVERRIDE_CONFIG_NVENCSWR
,
val
|
MC_TXN_OVERRIDE_CGID_TAG_CLIENT_AXI_ID
);
}
else
{
/* settings for rev. A02 */
for
(
i
=
0
;
i
<
num_txn_overrides
;
i
++
)
{
val
=
tegra_mc_read_32
(
mc_override_cfgs
[
i
].
offset
);
val
&=
~
MC_TXN_OVERRIDE_CGID_TAG_MASK
;
tegra_mc_write_32
(
mc_override_cfgs
[
i
].
offset
,
val
|
mc_override_cfgs
[
i
].
cgid_tag
);
}
}
/* Program overrides for MC transactions */
tegra_memctrl_set_overrides
();
}
/*
...
...
@@ -581,6 +438,9 @@ void tegra_memctrl_restore_settings(void)
*/
tegra_memctrl_reconfig_mss_clients
();
/* Program overrides for MC transactions */
tegra_memctrl_set_overrides
();
/* video memory carveout region */
if
(
video_mem_base
)
{
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_LO
,
...
...
@@ -658,13 +518,6 @@ void tegra_memctrl_tzram_setup(uint64_t phys_base, uint32_t size_in_bytes)
index
+=
4
)
tegra_mc_write_32
(
index
,
0
);
/*
* Allow CPU read/write access to the aperture
*/
tegra_mc_write_32
(
MC_TZRAM_CARVEOUT_CLIENT_ACCESS_CFG1
,
TZRAM_CARVEOUT_CPU_WRITE_ACCESS_BIT
|
TZRAM_CARVEOUT_CPU_READ_ACCESS_BIT
);
/*
* Set the TZRAM base. TZRAM base must be 4k aligned, at least.
*/
...
...
@@ -743,3 +596,11 @@ void tegra_memctrl_videomem_setup(uint64_t phys_base, uint32_t size_in_bytes)
*/
mce_update_gsc_videomem
();
}
/*
* This feature exists only for v1 of the Tegra Memory Controller.
*/
void
tegra_memctrl_disable_ahb_redirection
(
void
)
{
;
/* do nothing */
}
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/drivers/smmu/smmu.c
0 → 100644
View file @
0f22bef3
/*
* Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <assert.h>
#include <bl_common.h>
#include <debug.h>
#include <platform_def.h>
#include <smmu.h>
#include <string.h>
#include <tegra_private.h>
/* SMMU IDs currently supported by the driver */
enum
{
TEGRA_SMMU0
,
TEGRA_SMMU1
,
TEGRA_SMMU2
};
static
uint32_t
tegra_smmu_read_32
(
uint32_t
smmu_id
,
uint32_t
off
)
{
#if defined(TEGRA_SMMU0_BASE)
if
(
smmu_id
==
TEGRA_SMMU0
)
return
mmio_read_32
(
TEGRA_SMMU0_BASE
+
off
);
#endif
#if defined(TEGRA_SMMU1_BASE)
if
(
smmu_id
==
TEGRA_SMMU1
)
return
mmio_read_32
(
TEGRA_SMMU1_BASE
+
off
);
#endif
#if defined(TEGRA_SMMU2_BASE)
if
(
smmu_id
==
TEGRA_SMMU2
)
return
mmio_read_32
(
TEGRA_SMMU2_BASE
+
off
);
#endif
return
0
;
}
static
void
tegra_smmu_write_32
(
uint32_t
smmu_id
,
uint32_t
off
,
uint32_t
val
)
{
#if defined(TEGRA_SMMU0_BASE)
if
(
smmu_id
==
TEGRA_SMMU0
)
mmio_write_32
(
TEGRA_SMMU0_BASE
+
off
,
val
);
#endif
#if defined(TEGRA_SMMU1_BASE)
if
(
smmu_id
==
TEGRA_SMMU1
)
mmio_write_32
(
TEGRA_SMMU1_BASE
+
off
,
val
);
#endif
#if defined(TEGRA_SMMU2_BASE)
if
(
smmu_id
==
TEGRA_SMMU2
)
mmio_write_32
(
TEGRA_SMMU2_BASE
+
off
,
val
);
#endif
}
/*
* Save SMMU settings before "System Suspend" to TZDRAM
*/
void
tegra_smmu_save_context
(
uint64_t
smmu_ctx_addr
)
{
uint32_t
i
,
num_entries
=
0
;
smmu_regs_t
*
smmu_ctx_regs
;
plat_params_from_bl2_t
*
params_from_bl2
=
bl31_get_plat_params
();
uint64_t
tzdram_base
=
params_from_bl2
->
tzdram_base
;
uint64_t
tzdram_end
=
tzdram_base
+
params_from_bl2
->
tzdram_size
;
uint32_t
reg_id1
,
pgshift
,
cb_size
;
/* sanity check SMMU settings c*/
reg_id1
=
mmio_read_32
((
TEGRA_SMMU0_BASE
+
SMMU_GNSR0_IDR1
));
pgshift
=
(
reg_id1
&
ID1_PAGESIZE
)
?
16
:
12
;
cb_size
=
(
2
<<
pgshift
)
*
\
(
1
<<
(((
reg_id1
>>
ID1_NUMPAGENDXB_SHIFT
)
&
ID1_NUMPAGENDXB_MASK
)
+
1
));
assert
(
!
((
pgshift
!=
PGSHIFT
)
||
(
cb_size
!=
CB_SIZE
)));
assert
((
smmu_ctx_addr
>=
tzdram_base
)
&&
(
smmu_ctx_addr
<=
tzdram_end
));
/* get SMMU context table */
smmu_ctx_regs
=
plat_get_smmu_ctx
();
assert
(
smmu_ctx_regs
);
/*
* smmu_ctx_regs[0].val contains the size of the context table minus
* the last entry. Sanity check the table size before we start with
* the context save operation.
*/
while
(
smmu_ctx_regs
[
num_entries
].
val
!=
0xFFFFFFFFU
)
{
num_entries
++
;
}
/* panic if the sizes do not match */
if
(
num_entries
!=
smmu_ctx_regs
[
0
].
val
)
panic
();
/* save SMMU register values */
for
(
i
=
1
;
i
<
num_entries
;
i
++
)
smmu_ctx_regs
[
i
].
val
=
mmio_read_32
(
smmu_ctx_regs
[
i
].
reg
);
/* increment by 1 to take care of the last entry */
num_entries
++
;
/* Save SMMU config settings */
memcpy16
((
void
*
)(
uintptr_t
)
smmu_ctx_addr
,
(
void
*
)
smmu_ctx_regs
,
(
sizeof
(
smmu_regs_t
)
*
num_entries
));
/* save the SMMU table address */
mmio_write_32
(
TEGRA_SCRATCH_BASE
+
SECURE_SCRATCH_RSV11_LO
,
(
uint32_t
)
smmu_ctx_addr
);
mmio_write_32
(
TEGRA_SCRATCH_BASE
+
SECURE_SCRATCH_RSV11_HI
,
(
uint32_t
)(
smmu_ctx_addr
>>
32
));
}
#define SMMU_NUM_CONTEXTS 64
#define SMMU_CONTEXT_BANK_MAX_IDX 64
/*
* Init SMMU during boot or "System Suspend" exit
*/
void
tegra_smmu_init
(
void
)
{
uint32_t
val
,
cb_idx
,
smmu_id
,
ctx_base
;
for
(
smmu_id
=
0
;
smmu_id
<
NUM_SMMU_DEVICES
;
smmu_id
++
)
{
/* Program the SMMU pagesize and reset CACHE_LOCK bit */
val
=
tegra_smmu_read_32
(
smmu_id
,
SMMU_GSR0_SECURE_ACR
);
val
|=
SMMU_GSR0_PGSIZE_64K
;
val
&=
~
SMMU_ACR_CACHE_LOCK_ENABLE_BIT
;
tegra_smmu_write_32
(
smmu_id
,
SMMU_GSR0_SECURE_ACR
,
val
);
/* reset CACHE LOCK bit for NS Aux. Config. Register */
val
=
tegra_smmu_read_32
(
smmu_id
,
SMMU_GNSR_ACR
);
val
&=
~
SMMU_ACR_CACHE_LOCK_ENABLE_BIT
;
tegra_smmu_write_32
(
smmu_id
,
SMMU_GNSR_ACR
,
val
);
/* disable TCU prefetch for all contexts */
ctx_base
=
(
SMMU_GSR0_PGSIZE_64K
*
SMMU_NUM_CONTEXTS
)
+
SMMU_CBn_ACTLR
;
for
(
cb_idx
=
0
;
cb_idx
<
SMMU_CONTEXT_BANK_MAX_IDX
;
cb_idx
++
)
{
val
=
tegra_smmu_read_32
(
smmu_id
,
ctx_base
+
(
SMMU_GSR0_PGSIZE_64K
*
cb_idx
));
val
&=
~
SMMU_CBn_ACTLR_CPRE_BIT
;
tegra_smmu_write_32
(
smmu_id
,
ctx_base
+
(
SMMU_GSR0_PGSIZE_64K
*
cb_idx
),
val
);
}
/* set CACHE LOCK bit for NS Aux. Config. Register */
val
=
tegra_smmu_read_32
(
smmu_id
,
SMMU_GNSR_ACR
);
val
|=
SMMU_ACR_CACHE_LOCK_ENABLE_BIT
;
tegra_smmu_write_32
(
smmu_id
,
SMMU_GNSR_ACR
,
val
);
/* set CACHE LOCK bit for S Aux. Config. Register */
val
=
tegra_smmu_read_32
(
smmu_id
,
SMMU_GSR0_SECURE_ACR
);
val
|=
SMMU_ACR_CACHE_LOCK_ENABLE_BIT
;
tegra_smmu_write_32
(
smmu_id
,
SMMU_GSR0_SECURE_ACR
,
val
);
}
}
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/tegra_bl31_setup.c
View file @
0f22bef3
...
...
@@ -202,9 +202,6 @@ void bl31_early_platform_setup(bl31_params_t *from_bl2,
*/
console_init
(
tegra_console_base
,
TEGRA_BOOT_UART_CLK_IN_HZ
,
TEGRA_CONSOLE_BAUDRATE
);
/* Initialise crash console */
plat_crash_console_init
();
}
/*
...
...
@@ -299,7 +296,16 @@ void bl31_platform_setup(void)
******************************************************************************/
void
bl31_plat_runtime_setup
(
void
)
{
;
/* do nothing */
/*
* During boot, USB3 and flash media (SDMMC/SATA) devices need
* access to IRAM. Because these clients connect to the MC and
* do not have a direct path to the IRAM, the MC implements AHB
* redirection during boot to allow path to IRAM. In this mode
* accesses to a programmed memory address aperture are directed
* to the AHB bus, allowing access to the IRAM. This mode must be
* disabled before we jump to the non-secure world.
*/
tegra_memctrl_disable_ahb_redirection
();
}
/*******************************************************************************
...
...
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/tegra_common.mk
View file @
0f22bef3
...
...
@@ -28,22 +28,12 @@
# POSSIBILITY OF SUCH DAMAGE.
#
CRASH_REPORTING
:=
1
$(eval
$(call
add_define,CRASH_REPORTING))
ASM_ASSERTION
:=
1
$(eval
$(call
add_define,ASM_ASSERTION))
USE_COHERENT_MEM
:=
0
SEPARATE_CODE_AND_RODATA
:=
1
PLAT_INCLUDES
:=
-Iplat
/nvidia/tegra/include/drivers
\
-Iplat
/nvidia/tegra/include
\
-Iplat
/nvidia/tegra/include/
${TARGET_SOC}
PLAT_BL_COMMON_SOURCES
:=
lib/xlat_tables/xlat_tables
_common.c
\
lib/xlat_tables/aarch64/xlat_tables.c
include
lib/xlat_tables
_v2
/xlat_tables
.mk
PLAT_BL_COMMON_SOURCES
+=
${XLAT_TABLES_LIB_SRCS}
COMMON_DIR
:=
plat/nvidia/tegra/common
...
...
This diff is collapsed.
Click to expand it.
plat/nvidia/tegra/common/tegra_platform.c
View file @
0f22bef3
...
...
@@ -69,6 +69,7 @@ typedef enum tegra_platform {
typedef
enum
tegra_chipid
{
TEGRA_CHIPID_TEGRA13
=
0x13
,
TEGRA_CHIPID_TEGRA21
=
0x21
,
TEGRA_CHIPID_TEGRA18
=
0x18
,
}
tegra_chipid_t
;
/*
...
...
@@ -109,6 +110,13 @@ uint8_t tegra_chipid_is_t210(void)
return
(
chip_id
==
TEGRA_CHIPID_TEGRA21
);
}
uint8_t
tegra_chipid_is_t186
(
void
)
{
uint32_t
chip_id
=
(
tegra_get_chipid
()
>>
CHIP_ID_SHIFT
)
&
CHIP_ID_MASK
;
return
(
chip_id
==
TEGRA_CHIPID_TEGRA18
);
}
/*
* Read the chip ID value and derive the platform
*/
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
6
7
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help