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
b9c1d185
Commit
b9c1d185
authored
6 years ago
by
Soby Mathew
Committed by
TrustedFirmware Code Review
6 years ago
Browse files
Options
Download
Plain Diff
Merge "SMMUv3: refactor the driver code" into integration
parents
8917380a
ccd4d475
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
drivers/arm/smmu/smmu_v3.c
+28
-33
drivers/arm/smmu/smmu_v3.c
include/drivers/arm/smmu_v3.h
+12
-5
include/drivers/arm/smmu_v3.h
plat/arm/board/fvp/fvp_bl31_setup.c
+1
-1
plat/arm/board/fvp/fvp_bl31_setup.c
with
41 additions
and
39 deletions
+41
-39
drivers/arm/smmu/smmu_v3.c
View file @
b9c1d185
/*
* Copyright (c) 2017-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common/debug.h>
#include <cdefs.h>
#include <stdbool.h>
#include <drivers/arm/smmu_v3.h>
#include <lib/mmio.h>
static
inline
uint32_t
__init
smmuv3_read_s_idr1
(
uintptr_t
base
)
{
return
mmio_read_32
(
base
+
SMMU_S_IDR1
);
}
/* SMMU poll number of retries */
#define SMMU_POLL_RETRY 1000000
static
inline
uint32_t
__init
smmuv3_read_s_init
(
uintptr_t
base
)
static
int
__init
smmuv3_poll
(
uintptr_t
smmu_reg
,
uint32_t
mask
,
uint32_t
value
)
{
return
mmio_read_32
(
base
+
SMMU_S_INIT
)
;
}
static
inline
void
__init
smmuv3_write_s_init
(
uintptr_t
base
,
uint32_t
value
)
{
mmio_write_32
(
base
+
SMMU_S_INIT
,
value
)
;
}
/* Test for pending invalidate */
static
inline
bool
smmuv3_inval_pending
(
uintptr_t
base
)
{
return
(
smmuv3_read_s_init
(
base
)
&
SMMU_S_INIT_INV_ALL_MASK
)
!=
0U
;
uint32_t
reg_val
,
retries
=
SMMU_POLL_RETRY
;
do
{
reg_val
=
mmio_read_32
(
smmu_reg
);
if
((
reg_val
&
mask
)
==
value
)
return
0
;
}
while
(
--
retries
!=
0U
);
ERROR
(
"Failed to poll SMMUv3 register @%p
\n
"
,
(
void
*
)
smmu_reg
);
ERROR
(
"Read value 0x%x, expected 0x%x
\n
"
,
reg_val
,
value
==
0U
?
reg_val
&
~
mask
:
reg_val
|
mask
);
return
-
1
;
}
/*
* Initialize the SMMU by invalidating all secure caches and TLBs.
*
*
Returns 0 on success, and -1 on failure.
*
Abort all incoming transactions in order to implement a default
*
deny policy on reset
*/
int
__init
smmuv3_init
(
uintptr_t
smmu_base
)
{
uint32_t
idr1_reg
;
/*
* 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.
*/
idr1_reg
=
smmuv3_read_s_idr1
(
smmu_base
);
if
(((
idr1_reg
>>
SMMU_S_IDR1_SECURE_IMPL_SHIFT
)
&
SMMU_S_IDR1_SECURE_IMPL_MASK
)
==
0U
)
{
return
-
1
;
}
if
((
mmio_read_32
(
smmu_base
+
SMMU_S_IDR1
)
&
SMMU_S_IDR1_SECURE_IMPL
)
!=
0U
)
{
/* Initiate invalidation, and wait for it to finish */
smmuv3_write_s_init
(
smmu_base
,
SMMU_S_INIT_INV_ALL_MASK
);
while
(
smmuv3_inval_pending
(
smmu_base
))
;
/* Initiate invalidation */
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
;
}
This diff is collapsed.
Click to expand it.
include/drivers/arm/smmu_v3.h
View file @
b9c1d185
/*
* Copyright (c) 2017-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -8,20 +8,27 @@
#define SMMU_V3_H
#include <stdint.h>
#include <lib/utils_def.h>
/* SMMUv3 register offsets from device base */
#define SMMU_GBPA U(0x0044)
#define SMMU_S_IDR1 U(0x8004)
#define SMMU_S_INIT U(0x803c)
#define SMMU_S_GBPA U(0x8044)
/* SMMU_GBPA register fields */
#define SMMU_GBPA_UPDATE (1UL << 31)
#define SMMU_GBPA_ABORT (1UL << 20)
/* SMMU_S_IDR1 register fields */
#define SMMU_S_IDR1_SECURE_IMPL_SHIFT 31
#define SMMU_S_IDR1_SECURE_IMPL_MASK U(0x1)
#define SMMU_S_IDR1_SECURE_IMPL (1UL << 31)
/* SMMU_S_INIT register fields */
#define SMMU_S_INIT_INV_ALL
_MASK U(0x1
)
#define SMMU_S_INIT_INV_ALL
(1UL << 0
)
/* SMMU_S_GBPA register fields */
#define SMMU_S_GBPA_UPDATE (1UL << 31)
#define SMMU_S_GBPA_ABORT (1UL << 20)
int
smmuv3_init
(
uintptr_t
smmu_base
);
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/fvp/fvp_bl31_setup.c
View file @
b9c1d185
...
...
@@ -34,7 +34,7 @@ void __init bl31_early_platform_setup2(u_register_t arg0,
*/
fvp_interconnect_enable
();
/* On FVP RevC, intialize SMMUv3 */
/* On FVP RevC, in
i
tialize SMMUv3 */
if
((
arm_config
.
flags
&
ARM_CONFIG_FVP_HAS_SMMUV3
)
!=
0U
)
smmuv3_init
(
PLAT_FVP_SMMUV3_BASE
);
}
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