Commit 0348ee49 authored by Manish Pandey's avatar Manish Pandey Committed by TrustedFirmware Code Review
Browse files

Merge "Workaround for Hercules erratum 1688305" into integration

parents 2b4c5e4b 83e95524
...@@ -227,6 +227,12 @@ For Cortex-A76, the following errata build flags are defined : ...@@ -227,6 +227,12 @@ For Cortex-A76, the following errata build flags are defined :
- ``ERRATA_A76_1275112``: This applies errata 1275112 workaround to Cortex-A76 - ``ERRATA_A76_1275112``: This applies errata 1275112 workaround to Cortex-A76
CPU. This needs to be enabled only for revision <= r3p0 of the CPU. CPU. This needs to be enabled only for revision <= r3p0 of the CPU.
For Hercules, the following errata build flags are defined :
- ``ERRATA_HERCULES_1688305``: This applies errata 1688305 workaround to
Hercules CPU. This needs to be enabled only for revision r0p0 - r1p0 of
the CPU.
For Neoverse N1, the following errata build flags are defined : For Neoverse N1, the following errata build flags are defined :
- ``ERRATA_N1_1073348``: This applies errata 1073348 workaround to Neoverse-N1 - ``ERRATA_N1_1073348``: This applies errata 1073348 workaround to Neoverse-N1
......
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
******************************************************************************/ ******************************************************************************/
#define CORTEX_HERCULES_ACTLR_TAM_BIT (ULL(1) << 30) #define CORTEX_HERCULES_ACTLR_TAM_BIT (ULL(1) << 30)
#define CORTEX_HERCULES_ACTLR2_EL1 S3_0_C15_C1_1
#define CORTEX_HERCULES_ACTLR2_EL1_BIT_1 (ULL(1) << 1)
/******************************************************************************* /*******************************************************************************
* CPU Activity Monitor Unit register specific definitions. * CPU Activity Monitor Unit register specific definitions.
******************************************************************************/ ******************************************************************************/
......
...@@ -16,12 +16,49 @@ ...@@ -16,12 +16,49 @@
#error "cortex_hercules must be compiled with HW_ASSISTED_COHERENCY enabled" #error "cortex_hercules must be compiled with HW_ASSISTED_COHERENCY enabled"
#endif #endif
/* --------------------------------------------------
* Errata Workaround for Hercules Erratum 1688305.
* This applies to revision r0p0 and r1p0 of Hercules.
* Inputs:
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17
* --------------------------------------------------
*/
func errata_hercules_1688305_wa
/* Compare x0 against revision r1p0 */
mov x17, x30
bl check_errata_1688305
cbz x0, 1f
mrs x1, CORTEX_HERCULES_ACTLR2_EL1
orr x1, x1, CORTEX_HERCULES_ACTLR2_EL1_BIT_1
msr CORTEX_HERCULES_ACTLR2_EL1, x1
isb
1:
ret x17
endfunc errata_hercules_1688305_wa
func check_errata_1688305
/* Applies to r0p0 and r1p0 */
mov x1, #0x10
b cpu_rev_var_ls
endfunc check_errata_1688305
/* ------------------------------------------------- /* -------------------------------------------------
* The CPU Ops reset function for Cortex-Hercules * The CPU Ops reset function for Cortex-Hercules
* ------------------------------------------------- * -------------------------------------------------
*/ */
#if ENABLE_AMU
func cortex_hercules_reset_func func cortex_hercules_reset_func
mov x19, x30
bl cpu_get_rev_var
mov x18, x0
#if ERRATA_HERCULES_1688305
mov x0, x18
bl errata_hercules_1688305_wa
#endif
#if ENABLE_AMU
/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
mrs x0, actlr_el3 mrs x0, actlr_el3
bic x0, x0, #CORTEX_HERCULES_ACTLR_TAM_BIT bic x0, x0, #CORTEX_HERCULES_ACTLR_TAM_BIT
...@@ -39,11 +76,11 @@ func cortex_hercules_reset_func ...@@ -39,11 +76,11 @@ func cortex_hercules_reset_func
/* Enable group1 counters */ /* Enable group1 counters */
mov x0, #CORTEX_HERCULES_AMU_GROUP1_MASK mov x0, #CORTEX_HERCULES_AMU_GROUP1_MASK
msr CPUAMCNTENSET1_EL0, x0 msr CPUAMCNTENSET1_EL0, x0
isb #endif
ret isb
ret x19
endfunc cortex_hercules_reset_func endfunc cortex_hercules_reset_func
#endif
/* --------------------------------------------- /* ---------------------------------------------
* HW will do the cache maintenance while powering down * HW will do the cache maintenance while powering down
...@@ -66,6 +103,18 @@ endfunc cortex_hercules_core_pwr_dwn ...@@ -66,6 +103,18 @@ endfunc cortex_hercules_core_pwr_dwn
*/ */
#if REPORT_ERRATA #if REPORT_ERRATA
func cortex_hercules_errata_report func cortex_hercules_errata_report
stp x8, x30, [sp, #-16]!
bl cpu_get_rev_var
mov x8, x0
/*
* Report all errata. The revision-variant information is passed to
* checking functions of each errata.
*/
report_errata ERRATA_HERCULES_1688305, cortex_hercules, 1688305
ldp x8, x30, [sp], #16
ret ret
endfunc cortex_hercules_errata_report endfunc cortex_hercules_errata_report
#endif #endif
...@@ -89,12 +138,6 @@ func cortex_hercules_cpu_reg_dump ...@@ -89,12 +138,6 @@ func cortex_hercules_cpu_reg_dump
ret ret
endfunc cortex_hercules_cpu_reg_dump endfunc cortex_hercules_cpu_reg_dump
#if ENABLE_AMU
#define HERCULES_RESET_FUNC cortex_hercules_reset_func
#else
#define HERCULES_RESET_FUNC CPU_NO_RESET_FUNC
#endif
declare_cpu_ops cortex_hercules, CORTEX_HERCULES_MIDR, \ declare_cpu_ops cortex_hercules, CORTEX_HERCULES_MIDR, \
HERCULES_RESET_FUNC, \ cortex_hercules_reset_func, \
cortex_hercules_core_pwr_dwn cortex_hercules_core_pwr_dwn
...@@ -234,6 +234,10 @@ ERRATA_A76_1275112 ?=0 ...@@ -234,6 +234,10 @@ ERRATA_A76_1275112 ?=0
# only to revision <= r3p0 of the Cortex A76 cpu. # only to revision <= r3p0 of the Cortex A76 cpu.
ERRATA_A76_1286807 ?=0 ERRATA_A76_1286807 ?=0
# Flag to apply erratum 1688305 workaround during reset. This erratum applies
# to revisions r0p0 - r1p0 of the Hercules cpu.
ERRATA_HERCULES_1688305 ?=0
# Flag to apply T32 CLREX workaround during reset. This erratum applies # Flag to apply T32 CLREX workaround during reset. This erratum applies
# only to r0p0 and r1p0 of the Neoverse N1 cpu. # only to r0p0 and r1p0 of the Neoverse N1 cpu.
ERRATA_N1_1043202 ?=1 ERRATA_N1_1043202 ?=1
...@@ -467,6 +471,10 @@ $(eval $(call add_define,ERRATA_A76_1275112)) ...@@ -467,6 +471,10 @@ $(eval $(call add_define,ERRATA_A76_1275112))
$(eval $(call assert_boolean,ERRATA_A76_1286807)) $(eval $(call assert_boolean,ERRATA_A76_1286807))
$(eval $(call add_define,ERRATA_A76_1286807)) $(eval $(call add_define,ERRATA_A76_1286807))
# Process ERRATA_HERCULES_1688305 flag
$(eval $(call assert_boolean,ERRATA_HERCULES_1688305))
$(eval $(call add_define,ERRATA_HERCULES_1688305))
# Process ERRATA_N1_1043202 flag # Process ERRATA_N1_1043202 flag
$(eval $(call assert_boolean,ERRATA_N1_1043202)) $(eval $(call assert_boolean,ERRATA_N1_1043202))
$(eval $(call add_define,ERRATA_N1_1043202)) $(eval $(call add_define,ERRATA_N1_1043202))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment