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
b9c1d185
Commit
b9c1d185
authored
May 03, 2019
by
Soby Mathew
Committed by
TrustedFirmware Code Review
May 03, 2019
Browse files
Merge "SMMUv3: refactor the driver code" into integration
parents
8917380a
ccd4d475
Changes
3
Hide whitespace changes
Inline
Side-by-side
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
;
}
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
);
...
...
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
);
}
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