diff --git a/soc/espressif/common/Kconfig b/soc/espressif/common/Kconfig index 555085435c3..329e138fcfe 100644 --- a/soc/espressif/common/Kconfig +++ b/soc/espressif/common/Kconfig @@ -62,6 +62,7 @@ endif rsource "Kconfig.amp" rsource "Kconfig.console" +rsource "Kconfig.efuse" rsource "Kconfig.spiram" rsource "Kconfig.esptool" rsource "Kconfig.flash" diff --git a/soc/espressif/common/Kconfig.efuse b/soc/espressif/common/Kconfig.efuse new file mode 100644 index 00000000000..4553108b57e --- /dev/null +++ b/soc/espressif/common/Kconfig.efuse @@ -0,0 +1,47 @@ +# Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. +# SPDX-License-Identifier: Apache-2.0 + +if SOC_FAMILY_ESPRESSIF_ESP32 + +config ESP32_EFUSE_VIRTUAL + bool "Simulate eFuse operations in RAM" + help + If "y" - The virtual mode is enabled and all eFuse operations (read and write) are redirected + to RAM instead of eFuse registers, all permanent changes (via eFuse) are disabled. + + If it is "y", then SECURE_FLASH_ENCRYPTION_MODE_RELEASE cannot be used. + Because the EFUSE VIRT mode is for testing only. + + During startup, the eFuses are copied into RAM. This mode is useful for fast tests. + +config ESP32_EFUSE_VIRTUAL_KEEP_IN_FLASH + bool "Keep eFuses in flash" + depends on ESP32_EFUSE_VIRTUAL + help + In addition to the "Simulate eFuse operations in RAM" option, this option just adds + a feature to keep eFuses after reboots in flash memory. To use this mode the partition_table + should have the `sys_partition` partition. + + During startup, the eFuses are copied from flash or, + in case if flash is empty, from real eFuse to RAM and then update flash. + This mode is useful when need to keep changes after reboot + (testing secure_boot and flash_encryption). + +config ESP32_EFUSE_VIRTUAL_OFFSET + hex + depends on ESP32_EFUSE_VIRTUAL_KEEP_IN_FLASH + default $(dt_nodelabel_reg_addr_hex,sys_partition) if $(dt_nodelabel_exists,sys_partition) + default 0x0 + +config ESP32_EFUSE_VIRTUAL_SIZE + hex + depends on ESP32_EFUSE_VIRTUAL_KEEP_IN_FLASH + default 0x2000 if $(dt_nodelabel_exists,sys_partition) + default 0x0 + +config ESP32_EFUSE_MAX_BLK_LEN + int + default 192 if SOC_SERIES_ESP32 + default 256 + +endif # SOC_FAMILY_ESPRESSIF_ESP32 diff --git a/soc/espressif/common/include/efuse_virtual.h b/soc/espressif/common/include/efuse_virtual.h new file mode 100644 index 00000000000..d65b391c130 --- /dev/null +++ b/soc/espressif/common/include/efuse_virtual.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +static inline void esp_efuse_init_virtual(void) +{ +#if CONFIG_ESP32_EFUSE_VIRTUAL +#if CONFIG_ESP32_EFUSE_VIRTUAL_KEEP_IN_FLASH + esp_efuse_init_virtual_mode_in_flash(CONFIG_ESP32_EFUSE_VIRTUAL_OFFSET, + CONFIG_ESP32_EFUSE_VIRTUAL_SIZE); +#else + esp_efuse_init_virtual_mode_in_ram(); +#endif +#endif +} diff --git a/soc/espressif/esp32/soc.c b/soc/espressif/esp32/soc.c index 69c359a92f9..6aacc61b0e1 100644 --- a/soc/espressif/esp32/soc.c +++ b/soc/espressif/esp32/soc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + #if CONFIG_ESP_SPIRAM esp_init_psram(); diff --git a/soc/espressif/esp32c2/soc.c b/soc/espressif/esp32c2/soc.c index 5d0df3e0360..c20f02f3734 100644 --- a/soc/espressif/esp32c2/soc.c +++ b/soc/espressif/esp32c2/soc.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + /* Start Zephyr */ z_cstart(); diff --git a/soc/espressif/esp32c3/soc.c b/soc/espressif/esp32c3/soc.c index 485891e2c6c..ee6227338a9 100644 --- a/soc/espressif/esp32c3/soc.c +++ b/soc/espressif/esp32c3/soc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + /* Start Zephyr */ z_cstart(); diff --git a/soc/espressif/esp32c6/soc.c b/soc/espressif/esp32c6/soc.c index fb02f77c3b4..4fc7c10c0fa 100644 --- a/soc/espressif/esp32c6/soc.c +++ b/soc/espressif/esp32c6/soc.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + /* Start Zephyr */ z_cstart(); diff --git a/soc/espressif/esp32s2/soc.c b/soc/espressif/esp32s2/soc.c index bbb4fa973c5..8f673a13096 100644 --- a/soc/espressif/esp32s2/soc.c +++ b/soc/espressif/esp32s2/soc.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + #if CONFIG_ESP_SPIRAM esp_init_psram(); diff --git a/soc/espressif/esp32s3/soc.c b/soc/espressif/esp32s3/soc.c index 4e7f9bffc44..7aef841382d 100644 --- a/soc/espressif/esp32s3/soc.c +++ b/soc/espressif/esp32s3/soc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -54,6 +55,8 @@ void IRAM_ATTR __esp_platform_app_start(void) esp_flash_config(); + esp_efuse_init_virtual(); + #if CONFIG_ESP_SPIRAM esp_init_psram();