Merge "feat(cpus): make cache ops conditional" into integration

This commit is contained in:
Bipin Ravi 2022-11-11 17:49:20 +01:00 committed by TrustedFirmware Code Review
commit 20a43156f7
6 changed files with 71 additions and 0 deletions

View file

@ -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)

View file

@ -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
-------------------- --------------------

View file

@ -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
--------------------------------------------- ---------------------------------------------

View file

@ -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

View file

@ -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

View file

@ -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