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
acc18c1f
Commit
acc18c1f
authored
5 years ago
by
Soby Mathew
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "SMMUv3: Abort DMA transactions" into integration
parents
c33aa45f
1461ad9f
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
drivers/arm/smmu/smmu_v3.c
+50
-13
drivers/arm/smmu/smmu_v3.c
include/drivers/arm/smmu_v3.h
+1
-0
include/drivers/arm/smmu_v3.h
plat/arm/board/fvp/fvp_bl1_setup.c
+12
-1
plat/arm/board/fvp/fvp_bl1_setup.c
plat/arm/board/fvp/platform.mk
+2
-1
plat/arm/board/fvp/platform.mk
plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c
+5
-0
plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c
plat/arm/common/arm_bl1_setup.c
+1
-7
plat/arm/common/arm_bl1_setup.c
with
71 additions
and
22 deletions
+71
-22
drivers/arm/smmu/smmu_v3.c
View file @
acc18c1f
...
...
@@ -29,6 +29,41 @@ static int __init smmuv3_poll(uintptr_t smmu_reg, uint32_t mask,
return
-
1
;
}
/*
* Abort all incoming transactions in order to implement a default
* deny policy on reset.
*/
int
__init
smmuv3_security_init
(
uintptr_t
smmu_base
)
{
/* Attribute update has completed when SMMU_(S)_GBPA.Update bit is 0 */
if
(
smmuv3_poll
(
smmu_base
+
SMMU_GBPA
,
SMMU_GBPA_UPDATE
,
0U
)
!=
0U
)
return
-
1
;
/*
* SMMU_(S)_CR0 resets to zero with all streams bypassing the SMMU,
* so just abort all incoming transactions.
*/
mmio_setbits_32
(
smmu_base
+
SMMU_GBPA
,
SMMU_GBPA_UPDATE
|
SMMU_GBPA_ABORT
);
if
(
smmuv3_poll
(
smmu_base
+
SMMU_GBPA
,
SMMU_GBPA_UPDATE
,
0U
)
!=
0U
)
return
-
1
;
/* Check if the SMMU supports secure state */
if
((
mmio_read_32
(
smmu_base
+
SMMU_S_IDR1
)
&
SMMU_S_IDR1_SECURE_IMPL
)
==
0U
)
return
0
;
/* Abort all incoming secure transactions */
if
(
smmuv3_poll
(
smmu_base
+
SMMU_S_GBPA
,
SMMU_S_GBPA_UPDATE
,
0U
)
!=
0U
)
return
-
1
;
mmio_setbits_32
(
smmu_base
+
SMMU_S_GBPA
,
SMMU_S_GBPA_UPDATE
|
SMMU_S_GBPA_ABORT
);
return
smmuv3_poll
(
smmu_base
+
SMMU_S_GBPA
,
SMMU_S_GBPA_UPDATE
,
0U
);
}
/*
* Initialize the SMMU by invalidating all secure caches and TLBs.
* Abort all incoming transactions in order to implement a default
...
...
@@ -36,20 +71,22 @@ static int __init smmuv3_poll(uintptr_t smmu_reg, uint32_t mask,
*/
int
__init
smmuv3_init
(
uintptr_t
smmu_base
)
{
/* Abort all incoming transactions */
if
(
smmuv3_security_init
(
smmu_base
)
!=
0
)
return
-
1
;
/* Check if the SMMU supports secure state */
if
((
mmio_read_32
(
smmu_base
+
SMMU_S_IDR1
)
&
SMMU_S_IDR1_SECURE_IMPL
)
==
0U
)
return
0
;
/*
* Invalidation of secure caches and TLBs
is required only
if the SMMU
* supports secure state. If not, it's implementation defined
as to how
* SMMU_S_INIT register is accessed.
* In
itiate in
validation of secure caches and TLBs if the SMMU
* supports secure state. If not, it's implementation defined
*
as to how
SMMU_S_INIT register is accessed.
*/
if
((
mmio_read_32
(
smmu_base
+
SMMU_S_IDR1
)
&
SMMU_S_IDR1_SECURE_IMPL
)
!=
0U
)
{
/* Initiate invalidation */
mmio_write_32
(
smmu_base
+
SMMU_S_INIT
,
SMMU_S_INIT_INV_ALL
);
mmio_write_32
(
smmu_base
+
SMMU_S_INIT
,
SMMU_S_INIT_INV_ALL
);
/* Wait for global invalidation operation to finish */
return
smmuv3_poll
(
smmu_base
+
SMMU_S_INIT
,
SMMU_S_INIT_INV_ALL
,
0U
);
}
return
0
;
/* Wait for global invalidation operation to finish */
return
smmuv3_poll
(
smmu_base
+
SMMU_S_INIT
,
SMMU_S_INIT_INV_ALL
,
0U
);
}
This diff is collapsed.
Click to expand it.
include/drivers/arm/smmu_v3.h
View file @
acc18c1f
...
...
@@ -31,5 +31,6 @@
#define SMMU_S_GBPA_ABORT (1UL << 20)
int
smmuv3_init
(
uintptr_t
smmu_base
);
int
smmuv3_security_init
(
uintptr_t
smmu_base
);
#endif
/* SMMU_V3_H */
This diff is collapsed.
Click to expand it.
plat/arm/board/fvp/fvp_bl1_setup.c
View file @
acc18c1f
/*
* Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common/tbbr/tbbr_img_def.h>
#include <drivers/arm/smmu_v3.h>
#include <drivers/arm/sp805.h>
#include <plat/arm/common/arm_config.h>
#include <plat/arm/common/plat_arm.h>
#include <plat/arm/common/arm_def.h>
#include <plat/common/platform.h>
...
...
@@ -41,3 +43,12 @@ void plat_arm_secure_wdt_stop(void)
{
sp805_stop
(
ARM_SP805_TWDG_BASE
);
}
void
bl1_platform_setup
(
void
)
{
arm_bl1_platform_setup
();
/* On FVP RevC, initialize SMMUv3 */
if
((
arm_config
.
flags
&
ARM_CONFIG_FVP_HAS_SMMUV3
)
!=
0U
)
smmuv3_security_init
(
PLAT_FVP_SMMUV3_BASE
);
}
This diff is collapsed.
Click to expand it.
plat/arm/board/fvp/platform.mk
View file @
acc18c1f
...
...
@@ -119,7 +119,8 @@ else
FVP_CPU_LIBS
+=
lib/cpus/aarch32/cortex_a32.S
endif
BL1_SOURCES
+=
drivers/arm/sp805/sp805.c
\
BL1_SOURCES
+=
drivers/arm/smmu/smmu_v3.c
\
drivers/arm/sp805/sp805.c
\
drivers/io/io_semihosting.c
\
lib/semihosting/semihosting.c
\
lib/semihosting/
${ARCH}
/semihosting_call.S
\
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/fvp_ve/fvp_ve_bl1_setup.c
View file @
acc18c1f
...
...
@@ -26,3 +26,8 @@ void plat_arm_secure_wdt_stop(void)
{
sp805_stop
(
ARM_SP805_TWDG_BASE
);
}
void
bl1_platform_setup
(
void
)
{
arm_bl1_platform_setup
();
}
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_bl1_setup.c
View file @
acc18c1f
/*
* Copyright (c) 2015-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -19,7 +19,6 @@
/* Weak definitions may be overridden in specific ARM standard platform */
#pragma weak bl1_early_platform_setup
#pragma weak bl1_plat_arch_setup
#pragma weak bl1_platform_setup
#pragma weak bl1_plat_sec_mem_layout
#pragma weak bl1_plat_prepare_exit
#pragma weak bl1_plat_get_next_image_id
...
...
@@ -162,11 +161,6 @@ void arm_bl1_platform_setup(void)
#endif
}
void
bl1_platform_setup
(
void
)
{
arm_bl1_platform_setup
();
}
void
bl1_plat_prepare_exit
(
entry_point_info_t
*
ep_info
)
{
#if !ARM_DISABLE_TRUSTED_WDOG
...
...
This diff is collapsed.
Click to expand it.
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