Skip to content

Commit c51b5e9

Browse files
committed
Merge branch 'feature/support_efuses_esp32p4_eco5_v5.5' into 'release/v5.5'
feat(efuse): Support efuses for ESP32-P4 ECO5 (v5.5) See merge request espressif/esp-idf!42651
2 parents 72d9925 + 0f22c81 commit c51b5e9

File tree

14 files changed

+5665
-6063
lines changed

14 files changed

+5665
-6063
lines changed

components/efuse/esp32p4/esp_efuse_table_v3.0.c

Lines changed: 2732 additions & 0 deletions
Large diffs are not rendered by default.

components/efuse/esp32p4/esp_efuse_table_v3.0.csv

Lines changed: 326 additions & 0 deletions
Large diffs are not rendered by default.

components/efuse/esp32p4/include/esp_efuse_chip.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

77
#pragma once
88

9+
#include "sdkconfig.h"
10+
911
#ifdef __cplusplus
1012
extern "C" {
1113
#endif
@@ -63,6 +65,11 @@ typedef enum {
6365
typedef enum {
6466
ESP_EFUSE_KEY_PURPOSE_USER = 0, /**< User purposes (software-only use) */
6567
ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY = 1, /**< ECDSA private key (Expected in little endian order)*/
68+
69+
#if CONFIG_ESP32P4_REV_MIN_FULL >= 300
70+
ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY_P256 = ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY, /**< ECDSA private key (P256) (Expected in little endian order)*/
71+
#endif
72+
6673
ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1 = 2, /**< XTS_AES_256_KEY_1 (flash/PSRAM encryption) */
6774
ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2 = 3, /**< XTS_AES_256_KEY_2 (flash/PSRAM encryption) */
6875
ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY = 4, /**< XTS_AES_128_KEY (flash/PSRAM encryption) */
@@ -74,7 +81,18 @@ typedef enum {
7481
ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST1 = 10, /**< SECURE_BOOT_DIGEST1 (Secure Boot key digest) */
7582
ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST2 = 11, /**< SECURE_BOOT_DIGEST2 (Secure Boot key digest) */
7683
ESP_EFUSE_KEY_PURPOSE_KM_INIT_KEY = 12, /**< KM_INIT_KEY */
84+
85+
#if CONFIG_ESP32P4_REV_MIN_FULL >= 300
86+
ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_PSRAM_KEY_1 = 13, /**< PSRAM encryption key (XTS_AES_256_KEY_1) */
87+
ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_PSRAM_KEY_2 = 14, /**< PSRAM encryption key (XTS_AES_256_KEY_2) */
88+
ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_PSRAM_KEY = 15, /**< PSRAM encryption key (XTS_AES_128_KEY) */
89+
ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY_P192 = 16, /**< ECDSA private key (P192) */
90+
ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY_P384_L = 17, /**< ECDSA private key (P384_L) */
91+
ESP_EFUSE_KEY_PURPOSE_ECDSA_KEY_P384_H = 18, /**< ECDSA private key (P384_H) */
92+
ESP_EFUSE_KEY_PURPOSE_MAX = 32, /**< MAX PURPOSE */
93+
#else
7794
ESP_EFUSE_KEY_PURPOSE_MAX = 16, /**< MAX PURPOSE */
95+
#endif
7896
} esp_efuse_purpose_t;
7997

8098
#ifdef __cplusplus

components/efuse/esp32p4/include/esp_efuse_table.h

Lines changed: 6 additions & 333 deletions
Large diffs are not rendered by default.

components/efuse/esp32p4/include/esp_efuse_table_v0.0_v2.0.h

Lines changed: 348 additions & 0 deletions
Large diffs are not rendered by default.

components/efuse/esp32p4/include/esp_efuse_table_v3.0.h

Lines changed: 361 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
1-
set(EFUSE_SOC_SRCS "esp_efuse_table.c"
2-
"esp_efuse_fields.c"
3-
"esp_efuse_rtc_calib.c"
4-
"esp_efuse_utility.c")
1+
set(EFUSE_SOC_SRCS
2+
"esp_efuse_utility.c"
3+
"esp_efuse_fields.c"
4+
)
5+
6+
if(CONFIG_ESP32P4_REV_MIN_FULL GREATER_EQUAL 300)
7+
list(APPEND EFUSE_SOC_SRCS
8+
"esp_efuse_table_v3.0.c"
9+
)
10+
else()
11+
list(APPEND EFUSE_SOC_SRCS
12+
"esp_efuse_table.c"
13+
"esp_efuse_rtc_calib.c"
14+
)
15+
endif()

components/efuse/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ esp_efuse_purpose_t esp_efuse_get_key_purpose(esp_efuse_block_t block)
177177
}
178178
unsigned idx = block - EFUSE_BLK_KEY0;
179179
uint8_t value = 0;
180-
esp_err_t err = esp_efuse_read_field_blob(s_table[idx].keypurpose, &value, s_table[idx].keypurpose[0]->bit_count);
180+
esp_err_t err = esp_efuse_read_field_blob(s_table[idx].keypurpose, &value, esp_efuse_get_field_size(s_table[idx].keypurpose));
181181
if (err != ESP_OK) {
182182
return ESP_EFUSE_KEY_PURPOSE_MAX;
183183
}
@@ -190,7 +190,7 @@ esp_err_t esp_efuse_set_key_purpose(esp_efuse_block_t block, esp_efuse_purpose_t
190190
return ESP_ERR_INVALID_ARG;
191191
}
192192
unsigned idx = block - EFUSE_BLK_KEY0;
193-
return esp_efuse_write_field_blob(s_table[idx].keypurpose, &purpose, s_table[idx].keypurpose[0]->bit_count);
193+
return esp_efuse_write_field_blob(s_table[idx].keypurpose, &purpose, esp_efuse_get_field_size(s_table[idx].keypurpose));
194194
}
195195

196196
bool esp_efuse_get_keypurpose_dis_write(esp_efuse_block_t block)

components/hal/esp32p4/include/hal/ecdsa_ll.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include "soc/ecdsa_reg.h"
1212
#include "soc/hp_sys_clkrst_struct.h"
1313
#include "soc/soc_caps.h"
14+
#include "soc/efuse_reg.h"
15+
#include "soc/efuse_struct.h"
1416
#include "hal/ecdsa_types.h"
1517

1618
#ifdef __cplusplus
@@ -440,6 +442,41 @@ static inline bool ecdsa_ll_is_deterministic_mode_supported(void)
440442
return true;
441443
}
442444

445+
/**
446+
* @brief Set the ECDSA key block in eFuse
447+
*
448+
* @param curve ECDSA curve type
449+
* @param efuse_blk eFuse block number
450+
*/
451+
__attribute__((always_inline)) static inline void ecdsa_ll_set_ecdsa_key_blk(ecdsa_curve_t curve, int efuse_blk)
452+
{
453+
#ifdef EFUSE_CFG_ECDSA_BLK
454+
(void) curve;
455+
EFUSE.conf.cfg_ecdsa_blk = efuse_blk;
456+
#else
457+
uint8_t efuse_blk_low = 0;
458+
uint8_t efuse_blk_high = 0;
459+
switch (curve) {
460+
case ECDSA_CURVE_SECP192R1:
461+
EFUSE.ecdsa.cfg_ecdsa_p192_blk = efuse_blk;
462+
break;
463+
case ECDSA_CURVE_SECP256R1:
464+
EFUSE.ecdsa.cfg_ecdsa_p256_blk = efuse_blk;
465+
break;
466+
case ECDSA_CURVE_SECP384R1:
467+
// ECDSA-p384 uses two efuse blocks to store the key. These two blocks are stored in a single integer
468+
// where the least significant 4 bits store the low key block number and the next 4 more significant bits store the high key block number.
469+
HAL_ECDSA_EXTRACT_KEY_BLOCKS(efuse_blk, efuse_blk_high, efuse_blk_low);
470+
EFUSE.ecdsa.cfg_ecdsa_p384_h_blk = efuse_blk_high;
471+
EFUSE.ecdsa.cfg_ecdsa_p384_l_blk = efuse_blk_low;
472+
break;
473+
default:
474+
HAL_ASSERT(false && "Unsupported curve");
475+
break;
476+
}
477+
#endif
478+
}
479+
443480
/**
444481
* @brief Check if the ECDSA peripheral uses MPI module's memory
445482
*/

components/hal/esp32p4/include/hal/efuse_ll.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "hal/assert.h"
1313
#include "rom/efuse.h"
1414
#include "hal/ecdsa_types.h"
15+
#include "hal/ecdsa_ll.h"
1516

1617
#ifdef __cplusplus
1718
extern "C" {
@@ -94,8 +95,7 @@ __attribute__((always_inline)) static inline uint32_t efuse_ll_get_chip_ver_pkg(
9495

9596
__attribute__((always_inline)) static inline void efuse_ll_set_ecdsa_key_blk(ecdsa_curve_t curve, int efuse_blk)
9697
{
97-
(void) curve;
98-
EFUSE.conf.cfg_ecdsa_blk = efuse_blk;
98+
ecdsa_ll_set_ecdsa_key_blk(curve, efuse_blk);
9999
}
100100

101101
/******************* eFuse control functions *************************/

0 commit comments

Comments
 (0)