diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/arm/gic/v3/gicv3_helpers.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/arm/gic/v3/gicv3_helpers.c b/drivers/arm/gic/v3/gicv3_helpers.c index 710532e3..d599596c 100644 --- a/drivers/arm/gic/v3/gicv3_helpers.c +++ b/drivers/arm/gic/v3/gicv3_helpers.c @@ -10,6 +10,7 @@ #include <arch_helpers.h> #include <common/debug.h> #include <common/interrupt_props.h> +#include <drivers/arm/arm_gicv3_common.h> #include <drivers/arm/gic_common.h> #include "../common/gic_common_private.h" @@ -284,6 +285,19 @@ void gicv3_rdistif_mark_core_awake(uintptr_t gicr_base) */ assert((gicr_read_waker(gicr_base) & WAKER_CA_BIT) != 0U); + /* + * ProcessorSleep bit can ONLY be set to zero when + * Quiescent bit and Sleep bit are both zero, so + * need to make sure Quiescent bit and Sleep bit + * are zero before clearing ProcessorSleep bit. + */ + if (gicr_read_waker(gicr_base) & WAKER_QSC_BIT) { + gicr_write_waker(gicr_base, gicr_read_waker(gicr_base) & ~WAKER_SL_BIT); + /* Wait till the WAKER_QSC_BIT changes to 0 */ + while ((gicr_read_waker(gicr_base) & WAKER_QSC_BIT) != 0U) + ; + } + /* Mark the connected core as awake */ gicr_write_waker(gicr_base, gicr_read_waker(gicr_base) & ~WAKER_PS_BIT); |