feat(st-clock): do not refcount on non-secure clocks in bl32

This change removes reference counting support in clock gating
implementation for clocks that rely on non-secure only RCC resources.
As RCC registers are accessed straight by non-secure world for these
clocks, secure world cannot safely store the clock state and even
disabling such clock from secure world can jeopardize the non-secure
world clock management framework and drivers.

As a consequence, for such clocks, stm32_clock_enable() forces the clock
ON without any increment of a refcount and stm32_clock_disable() does
not disable the clock.

Change-Id: I0cc159b36a25dbc8676f05edf2668ae63c640537
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
This commit is contained in:
Yann Gautier 2021-10-27 18:21:11 +02:00
parent aaa09b713c
commit 3d69149a7e
1 changed files with 22 additions and 0 deletions

View File

@ -636,6 +636,13 @@ static const struct stm32mp1_clk_gate *gate_ref(unsigned int idx)
return &stm32mp1_clk_gate[idx];
}
#if defined(IMAGE_BL32)
static bool gate_is_non_secure(const struct stm32mp1_clk_gate *gate)
{
return gate->secure == N_S;
}
#endif
static const struct stm32mp1_clk_sel *clk_sel_ref(unsigned int idx)
{
return &stm32mp1_clk_sel[idx];
@ -1120,6 +1127,14 @@ static void __stm32mp1_clk_enable(unsigned long id, bool with_refcnt)
return;
}
#if defined(IMAGE_BL32)
if (gate_is_non_secure(gate)) {
/* Enable non-secure clock w/o any refcounting */
__clk_enable(gate);
return;
}
#endif
stm32mp1_clk_lock(&refcount_lock);
if (gate_refcounts[i] == 0U) {
@ -1157,6 +1172,13 @@ static void __stm32mp1_clk_disable(unsigned long id, bool with_refcnt)
return;
}
#if defined(IMAGE_BL32)
if (gate_is_non_secure(gate)) {
/* Don't disable non-secure clocks */
return;
}
#endif
stm32mp1_clk_lock(&refcount_lock);
if (gate_refcounts[i] == 0U) {