mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 10:04:26 +00:00
Merge "feat(cpus): make cache ops conditional" into integration
This commit is contained in:
commit
20a43156f7
6 changed files with 71 additions and 0 deletions
2
Makefile
2
Makefile
|
@ -1080,6 +1080,7 @@ $(eval $(call assert_booleans,\
|
||||||
SIMICS_BUILD \
|
SIMICS_BUILD \
|
||||||
FEATURE_DETECTION \
|
FEATURE_DETECTION \
|
||||||
TRNG_SUPPORT \
|
TRNG_SUPPORT \
|
||||||
|
CONDITIONAL_CMO \
|
||||||
)))
|
)))
|
||||||
|
|
||||||
$(eval $(call assert_numerics,\
|
$(eval $(call assert_numerics,\
|
||||||
|
@ -1241,6 +1242,7 @@ $(eval $(call add_defines,\
|
||||||
FEATURE_DETECTION \
|
FEATURE_DETECTION \
|
||||||
TWED_DELAY \
|
TWED_DELAY \
|
||||||
ENABLE_FEAT_TWED \
|
ENABLE_FEAT_TWED \
|
||||||
|
CONDITIONAL_CMO \
|
||||||
)))
|
)))
|
||||||
|
|
||||||
ifeq (${SANITIZE_UB},trap)
|
ifeq (${SANITIZE_UB},trap)
|
||||||
|
|
|
@ -1032,6 +1032,12 @@ Common build options
|
||||||
functionalities). When enabled (``1``), a mocked version of the APIs are used.
|
functionalities). When enabled (``1``), a mocked version of the APIs are used.
|
||||||
The default value is 0.
|
The default value is 0.
|
||||||
|
|
||||||
|
- ``CONDITIONAL_CMO``: Boolean option to enable call to platform-defined routine
|
||||||
|
``plat_can_cmo`` which will return zero if cache management operations should
|
||||||
|
be skipped and non-zero otherwise. By default, this option is disabled which
|
||||||
|
means platform hook won't be checked and CMOs will always be performed when
|
||||||
|
related functions are called.
|
||||||
|
|
||||||
GICv3 driver options
|
GICv3 driver options
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|
|
@ -1461,6 +1461,22 @@ When the MEASURED_BOOT flag is enabled:
|
||||||
|
|
||||||
When the MEASURED_BOOT flag is disabled, this function doesn't do anything.
|
When the MEASURED_BOOT flag is disabled, this function doesn't do anything.
|
||||||
|
|
||||||
|
Function : plat_can_cmo()
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
Argument : void
|
||||||
|
Return : uint64_t
|
||||||
|
|
||||||
|
When CONDITIONAL_CMO flag is enabled:
|
||||||
|
|
||||||
|
- This function indicates whether cache management operations should be
|
||||||
|
performed. It returns 0 if CMOs should be skipped and non-zero
|
||||||
|
otherwise.
|
||||||
|
- The function must not clobber x2 and x3. It's also not safe to rely on stack.
|
||||||
|
Otherwise obey AAPCS.
|
||||||
|
|
||||||
Modifications specific to a Boot Loader stage
|
Modifications specific to a Boot Loader stage
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -37,12 +37,27 @@ exit_loop_\op:
|
||||||
bx lr
|
bx lr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro check_plat_can_cmo
|
||||||
|
#if CONDITIONAL_CMO
|
||||||
|
mov r3, lr
|
||||||
|
mov r2, r0
|
||||||
|
bl plat_can_cmo
|
||||||
|
mov lr, r3
|
||||||
|
cmp r0, #0
|
||||||
|
bne 1f
|
||||||
|
bx lr
|
||||||
|
1:
|
||||||
|
mov r0, r2
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
/* ------------------------------------------
|
/* ------------------------------------------
|
||||||
* Clean+Invalidate from base address till
|
* Clean+Invalidate from base address till
|
||||||
* size. 'r0' = addr, 'r1' = size
|
* size. 'r0' = addr, 'r1' = size
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func flush_dcache_range
|
func flush_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva cimvac, DCCIMVAC
|
do_dcache_maintenance_by_mva cimvac, DCCIMVAC
|
||||||
endfunc flush_dcache_range
|
endfunc flush_dcache_range
|
||||||
|
|
||||||
|
@ -52,6 +67,7 @@ endfunc flush_dcache_range
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func clean_dcache_range
|
func clean_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva cmvac, DCCMVAC
|
do_dcache_maintenance_by_mva cmvac, DCCMVAC
|
||||||
endfunc clean_dcache_range
|
endfunc clean_dcache_range
|
||||||
|
|
||||||
|
@ -61,6 +77,7 @@ endfunc clean_dcache_range
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func inv_dcache_range
|
func inv_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva imvac, DCIMVAC
|
do_dcache_maintenance_by_mva imvac, DCIMVAC
|
||||||
endfunc inv_dcache_range
|
endfunc inv_dcache_range
|
||||||
|
|
||||||
|
@ -168,6 +185,7 @@ endfunc do_dcsw_op
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_louis
|
func dcsw_op_louis
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op #LOUIS_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
dcsw_op #LOUIS_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
||||||
endfunc dcsw_op_louis
|
endfunc dcsw_op_louis
|
||||||
|
|
||||||
|
@ -180,6 +198,7 @@ endfunc dcsw_op_louis
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_all
|
func dcsw_op_all
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op #LOC_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
dcsw_op #LOC_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
||||||
endfunc dcsw_op_all
|
endfunc dcsw_op_all
|
||||||
|
|
||||||
|
@ -205,6 +224,7 @@ endfunc dcsw_op_all
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level1
|
func dcsw_op_level1
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(1 << LEVEL_SHIFT)
|
dcsw_op_level #(1 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level1
|
endfunc dcsw_op_level1
|
||||||
|
|
||||||
|
@ -217,6 +237,7 @@ endfunc dcsw_op_level1
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level2
|
func dcsw_op_level2
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(2 << LEVEL_SHIFT)
|
dcsw_op_level #(2 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level2
|
endfunc dcsw_op_level2
|
||||||
|
|
||||||
|
@ -229,5 +250,6 @@ endfunc dcsw_op_level2
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level3
|
func dcsw_op_level3
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(3 << LEVEL_SHIFT)
|
dcsw_op_level #(3 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level3
|
endfunc dcsw_op_level3
|
||||||
|
|
|
@ -35,6 +35,19 @@ loop_\op:
|
||||||
dsb sy
|
dsb sy
|
||||||
exit_loop_\op:
|
exit_loop_\op:
|
||||||
ret
|
ret
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro check_plat_can_cmo
|
||||||
|
#if CONDITIONAL_CMO
|
||||||
|
mov x3, x30
|
||||||
|
mov x2, x0
|
||||||
|
bl plat_can_cmo
|
||||||
|
mov x30, x3
|
||||||
|
cbnz x0, 1f
|
||||||
|
ret
|
||||||
|
1:
|
||||||
|
mov x0, x2
|
||||||
|
#endif
|
||||||
.endm
|
.endm
|
||||||
/* ------------------------------------------
|
/* ------------------------------------------
|
||||||
* Clean+Invalidate from base address till
|
* Clean+Invalidate from base address till
|
||||||
|
@ -42,6 +55,7 @@ exit_loop_\op:
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func flush_dcache_range
|
func flush_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva civac
|
do_dcache_maintenance_by_mva civac
|
||||||
endfunc flush_dcache_range
|
endfunc flush_dcache_range
|
||||||
|
|
||||||
|
@ -51,6 +65,7 @@ endfunc flush_dcache_range
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func clean_dcache_range
|
func clean_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva cvac
|
do_dcache_maintenance_by_mva cvac
|
||||||
endfunc clean_dcache_range
|
endfunc clean_dcache_range
|
||||||
|
|
||||||
|
@ -60,6 +75,7 @@ endfunc clean_dcache_range
|
||||||
* ------------------------------------------
|
* ------------------------------------------
|
||||||
*/
|
*/
|
||||||
func inv_dcache_range
|
func inv_dcache_range
|
||||||
|
check_plat_can_cmo
|
||||||
do_dcache_maintenance_by_mva ivac
|
do_dcache_maintenance_by_mva ivac
|
||||||
endfunc inv_dcache_range
|
endfunc inv_dcache_range
|
||||||
|
|
||||||
|
@ -79,6 +95,7 @@ endfunc inv_dcache_range
|
||||||
func flush_dcache_to_popa_range
|
func flush_dcache_to_popa_range
|
||||||
/* Exit early if size is zero */
|
/* Exit early if size is zero */
|
||||||
cbz x1, exit_loop_dc_cipapa
|
cbz x1, exit_loop_dc_cipapa
|
||||||
|
check_plat_can_cmo
|
||||||
dcache_line_size x2, x3
|
dcache_line_size x2, x3
|
||||||
sub x3, x2, #1
|
sub x3, x2, #1
|
||||||
bic x0, x0, x3
|
bic x0, x0, x3
|
||||||
|
@ -205,6 +222,7 @@ endfunc dcsw_op_louis
|
||||||
|
|
||||||
|
|
||||||
func dcsw_op_all
|
func dcsw_op_all
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op #LOC_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
dcsw_op #LOC_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT
|
||||||
endfunc dcsw_op_all
|
endfunc dcsw_op_all
|
||||||
|
|
||||||
|
@ -228,6 +246,7 @@ endfunc dcsw_op_all
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level1
|
func dcsw_op_level1
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(1 << LEVEL_SHIFT)
|
dcsw_op_level #(1 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level1
|
endfunc dcsw_op_level1
|
||||||
|
|
||||||
|
@ -239,6 +258,7 @@ endfunc dcsw_op_level1
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level2
|
func dcsw_op_level2
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(2 << LEVEL_SHIFT)
|
dcsw_op_level #(2 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level2
|
endfunc dcsw_op_level2
|
||||||
|
|
||||||
|
@ -250,5 +270,6 @@ endfunc dcsw_op_level2
|
||||||
* ---------------------------------------------------------------
|
* ---------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
func dcsw_op_level3
|
func dcsw_op_level3
|
||||||
|
check_plat_can_cmo
|
||||||
dcsw_op_level #(3 << LEVEL_SHIFT)
|
dcsw_op_level #(3 << LEVEL_SHIFT)
|
||||||
endfunc dcsw_op_level3
|
endfunc dcsw_op_level3
|
||||||
|
|
|
@ -480,3 +480,7 @@ PLAT_RSS_NOT_SUPPORTED := 0
|
||||||
|
|
||||||
# Dynamic Root of Trust for Measurement support
|
# Dynamic Root of Trust for Measurement support
|
||||||
DRTM_SUPPORT := 0
|
DRTM_SUPPORT := 0
|
||||||
|
|
||||||
|
# Check platform if cache management operations should be performed.
|
||||||
|
# Disabled by default.
|
||||||
|
CONDITIONAL_CMO := 0
|
||||||
|
|
Loading…
Add table
Reference in a new issue