mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
feat(esp_security): make esp32h4 esp32h21 on-demand crypto clock management optional
This commit is contained in:
@@ -2,7 +2,7 @@ menu "ESP Security Specific"
|
|||||||
|
|
||||||
config ESP_CRYPTO_CLK_ON_DEMAND
|
config ESP_CRYPTO_CLK_ON_DEMAND
|
||||||
bool "Enable on-demand crypto clock management"
|
bool "Enable on-demand crypto clock management"
|
||||||
depends on IDF_TARGET_ESP32S31
|
depends on IDF_TARGET_ESP32S31 || IDF_TARGET_ESP32H4 || IDF_TARGET_ESP32H21
|
||||||
default y if PM_ENABLE
|
default y if PM_ENABLE
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
|
|||||||
@@ -4,10 +4,72 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include "sdkconfig.h"
|
||||||
#include "esp_crypto_clk.h"
|
#include "esp_crypto_clk.h"
|
||||||
|
#include "soc/clk_tree_defs.h"
|
||||||
|
#include "hal/clk_gate_ll.h"
|
||||||
|
#include "esp_private/esp_clk_tree_common.h"
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
#include "esp_private/critical_section.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
DEFINE_CRIT_SECTION_LOCK_STATIC(s_crypto_common_clk_mux);
|
||||||
|
#define CRYPTO_CLK_LOCK() esp_os_enter_critical_safe(&s_crypto_common_clk_mux)
|
||||||
|
#define CRYPTO_CLK_UNLOCK() esp_os_exit_critical_safe(&s_crypto_common_clk_mux)
|
||||||
|
#else
|
||||||
|
#define CRYPTO_CLK_LOCK()
|
||||||
|
#define CRYPTO_CLK_UNLOCK()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void esp_crypto_pll_f96m_enable(bool enable)
|
||||||
|
{
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
esp_clk_tree_enable_src(SOC_MOD_CLK_PLL_F96M, enable);
|
||||||
|
#else
|
||||||
|
/* Bootloader: no esp_clk_tree; toggle the ref gate directly. */
|
||||||
|
_clk_gate_ll_ref_96m_clk_en(enable);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_ESP_CRYPTO_CLK_ON_DEMAND
|
||||||
|
|
||||||
|
static int s_crypto_common_clk_ref_cnt;
|
||||||
|
|
||||||
void esp_crypto_common_clk_enable(bool enable)
|
void esp_crypto_common_clk_enable(bool enable)
|
||||||
{
|
{
|
||||||
(void)enable;
|
CRYPTO_CLK_LOCK();
|
||||||
|
if (enable) {
|
||||||
|
if (s_crypto_common_clk_ref_cnt++ == 0) {
|
||||||
|
/* Parent: PLL_F96M (see esp_crypto_clk_init() sec_clk_sel). */
|
||||||
|
esp_crypto_pll_f96m_enable(true);
|
||||||
|
}
|
||||||
|
} else if (s_crypto_common_clk_ref_cnt > 0 && --s_crypto_common_clk_ref_cnt == 0) {
|
||||||
|
esp_crypto_pll_f96m_enable(false);
|
||||||
|
}
|
||||||
|
CRYPTO_CLK_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* !CONFIG_ESP_CRYPTO_CLK_ON_DEMAND */
|
||||||
|
|
||||||
|
static bool s_crypto_clk_always_on_done;
|
||||||
|
|
||||||
|
static void esp_crypto_clk_always_on(void)
|
||||||
|
{
|
||||||
|
CRYPTO_CLK_LOCK();
|
||||||
|
if (!s_crypto_clk_always_on_done) {
|
||||||
|
esp_crypto_pll_f96m_enable(true);
|
||||||
|
s_crypto_clk_always_on_done = true;
|
||||||
|
}
|
||||||
|
CRYPTO_CLK_UNLOCK();
|
||||||
|
}
|
||||||
|
|
||||||
|
void esp_crypto_common_clk_enable(bool enable)
|
||||||
|
{
|
||||||
|
/* Keep clocks always on: enable once, ignore disable. */
|
||||||
|
if (enable) {
|
||||||
|
esp_crypto_clk_always_on();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ESP_CRYPTO_CLK_ON_DEMAND */
|
||||||
|
|||||||
@@ -4,20 +4,21 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "soc/soc.h"
|
|
||||||
#include "soc/pcr_reg.h"
|
|
||||||
#include "esp_private/esp_clk_tree_common.h"
|
|
||||||
#include "hal/sec_ll.h"
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "hal/sec_ll.h"
|
||||||
|
#include "soc/clk_tree_defs.h"
|
||||||
|
|
||||||
void esp_crypto_common_clk_enable(bool enable);
|
void esp_crypto_common_clk_enable(bool enable);
|
||||||
|
|
||||||
static inline void esp_crypto_clk_init(void)
|
static inline void esp_crypto_clk_init(void)
|
||||||
{
|
{
|
||||||
|
#if !CONFIG_ESP_CRYPTO_CLK_ON_DEMAND
|
||||||
|
/* Keep crypto clocks always on for better crypto performance. */
|
||||||
|
esp_crypto_common_clk_enable(true);
|
||||||
|
#endif
|
||||||
// Set crypto clock (`clk_sec`) to use 96M PLL clock
|
// Set crypto clock (`clk_sec`) to use 96M PLL clock
|
||||||
esp_clk_tree_enable_src(SOC_MOD_CLK_PLL_F96M, true);
|
|
||||||
sec_ll_crypto_clk_src_sel(SOC_MOD_CLK_PLL_F96M);
|
sec_ll_crypto_clk_src_sel(SOC_MOD_CLK_PLL_F96M);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,72 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include "sdkconfig.h"
|
||||||
#include "esp_crypto_clk.h"
|
#include "esp_crypto_clk.h"
|
||||||
|
#include "soc/clk_tree_defs.h"
|
||||||
|
#include "hal/clk_gate_ll.h"
|
||||||
|
#include "esp_private/esp_clk_tree_common.h"
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
#include "esp_private/critical_section.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
DEFINE_CRIT_SECTION_LOCK_STATIC(s_crypto_common_clk_mux);
|
||||||
|
#define CRYPTO_CLK_LOCK() esp_os_enter_critical_safe(&s_crypto_common_clk_mux)
|
||||||
|
#define CRYPTO_CLK_UNLOCK() esp_os_exit_critical_safe(&s_crypto_common_clk_mux)
|
||||||
|
#else
|
||||||
|
#define CRYPTO_CLK_LOCK()
|
||||||
|
#define CRYPTO_CLK_UNLOCK()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void esp_crypto_pll_f96m_enable(bool enable)
|
||||||
|
{
|
||||||
|
#if !NON_OS_BUILD
|
||||||
|
esp_clk_tree_enable_src(SOC_MOD_CLK_PLL_F96M, enable);
|
||||||
|
#else
|
||||||
|
/* Bootloader: no esp_clk_tree; toggle the ref gate directly. */
|
||||||
|
_clk_gate_ll_ref_96m_clk_en(enable);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_ESP_CRYPTO_CLK_ON_DEMAND
|
||||||
|
|
||||||
|
static int s_crypto_common_clk_ref_cnt;
|
||||||
|
|
||||||
void esp_crypto_common_clk_enable(bool enable)
|
void esp_crypto_common_clk_enable(bool enable)
|
||||||
{
|
{
|
||||||
(void)enable;
|
CRYPTO_CLK_LOCK();
|
||||||
|
if (enable) {
|
||||||
|
if (s_crypto_common_clk_ref_cnt++ == 0) {
|
||||||
|
/* Parent: PLL_F96M (see esp_crypto_clk_init() sec_clk_sel). */
|
||||||
|
esp_crypto_pll_f96m_enable(true);
|
||||||
|
}
|
||||||
|
} else if (s_crypto_common_clk_ref_cnt > 0 && --s_crypto_common_clk_ref_cnt == 0) {
|
||||||
|
esp_crypto_pll_f96m_enable(false);
|
||||||
|
}
|
||||||
|
CRYPTO_CLK_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* !CONFIG_ESP_CRYPTO_CLK_ON_DEMAND */
|
||||||
|
|
||||||
|
static bool s_crypto_clk_always_on_done;
|
||||||
|
|
||||||
|
static void esp_crypto_clk_always_on(void)
|
||||||
|
{
|
||||||
|
CRYPTO_CLK_LOCK();
|
||||||
|
if (!s_crypto_clk_always_on_done) {
|
||||||
|
esp_crypto_pll_f96m_enable(true);
|
||||||
|
s_crypto_clk_always_on_done = true;
|
||||||
|
}
|
||||||
|
CRYPTO_CLK_UNLOCK();
|
||||||
|
}
|
||||||
|
|
||||||
|
void esp_crypto_common_clk_enable(bool enable)
|
||||||
|
{
|
||||||
|
/* Keep clocks always on: enable once, ignore disable. */
|
||||||
|
if (enable) {
|
||||||
|
esp_crypto_clk_always_on();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ESP_CRYPTO_CLK_ON_DEMAND */
|
||||||
|
|||||||
@@ -4,20 +4,21 @@
|
|||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "soc/soc.h"
|
|
||||||
#include "soc/pcr_reg.h"
|
|
||||||
#include "esp_private/esp_clk_tree_common.h"
|
|
||||||
#include "hal/sec_ll.h"
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "hal/sec_ll.h"
|
||||||
|
#include "soc/clk_tree_defs.h"
|
||||||
|
|
||||||
void esp_crypto_common_clk_enable(bool enable);
|
void esp_crypto_common_clk_enable(bool enable);
|
||||||
|
|
||||||
static inline void esp_crypto_clk_init(void)
|
static inline void esp_crypto_clk_init(void)
|
||||||
{
|
{
|
||||||
|
#if !CONFIG_ESP_CRYPTO_CLK_ON_DEMAND
|
||||||
|
/* Keep crypto clocks always on for better crypto performance. */
|
||||||
|
esp_crypto_common_clk_enable(true);
|
||||||
|
#endif
|
||||||
// Set crypto clock (`clk_sec`) to use 96M PLL clock
|
// Set crypto clock (`clk_sec`) to use 96M PLL clock
|
||||||
esp_clk_tree_enable_src(SOC_MOD_CLK_PLL_F96M, true);
|
|
||||||
sec_ll_crypto_clk_src_sel(SOC_MOD_CLK_PLL_F96M);
|
sec_ll_crypto_clk_src_sel(SOC_MOD_CLK_PLL_F96M);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user