Merge branch 'fix/fix_xip_power_reset_stuck_issue_p4_rev3_v5.4' into 'release/v5.4'

psram: fixed p4 rev3 xip stuck after board reset issue (v5.4)

See merge request espressif/esp-idf!42807
This commit is contained in:
morris
2025-11-11 16:35:29 +08:00
3 changed files with 84 additions and 8 deletions
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -24,6 +24,7 @@
#include "soc/spi1_mem_s_struct.h"
#include "soc/hp_sys_clkrst_struct.h"
#include "soc/clk_tree_defs.h"
#include "soc/hp_system_struct.h"
#include "rom/opi_flash.h"
#ifdef __cplusplus
@@ -353,18 +354,18 @@ static inline void _psram_ctrlr_ll_enable_module_clock(uint32_t mspi_id, bool en
* @param mspi_id mspi_id
*/
__attribute__((always_inline))
static inline void psram_ctrlr_ll_reset_module_clock(uint32_t mspi_id)
static inline void _psram_ctrlr_ll_reset_module_clock(uint32_t mspi_id)
{
(void)mspi_id;
HP_SYS_CLKRST.hp_rst_en0.reg_rst_en_dual_mspi_axi = 1;
HP_SYS_CLKRST.hp_rst_en0.reg_rst_en_dual_mspi_axi = 0;
HP_SYS_CLKRST.hp_rst_en0.reg_rst_en_dual_mspi_apb = 1;
HP_SYS_CLKRST.hp_rst_en0.reg_rst_en_dual_mspi_apb = 0;
HP_SYS_CLKRST.hp_rst_en0.reg_rst_en_dual_mspi_axi = 0;
}
/// use a macro to wrap the function, force the caller to use it in a critical section
/// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance
#define psram_ctrlr_ll_reset_module_clock(...) (void)__DECLARE_RCC_ATOMIC_ENV; psram_ctrlr_ll_reset_module_clock(__VA_ARGS__)
#define psram_ctrlr_ll_reset_module_clock(...) (void)__DECLARE_RCC_ATOMIC_ENV; _psram_ctrlr_ll_reset_module_clock(__VA_ARGS__)
/**
* @brief Select PSRAM clock source
@@ -814,6 +815,48 @@ static inline void psram_ctrlr_ll_wait_all_transaction_done(void)
}
}
/**
* @brief Backup PSRAM controller registers
*
* @param mspi_id mspi_id
* @param reg registers
*/
__attribute__((always_inline))
static inline void psram_ctrlr_ll_backup_registers(uint32_t mspi_id, spi_mem_s_dev_t *reg)
{
memcpy(reg, &SPIMEM2, sizeof(spi_mem_s_dev_t));
}
/**
* @brief Restore PSRAM controller registers
*
* @param mspi_id mspi_id
* @param reg registers
*/
__attribute__((always_inline))
static inline void psram_ctrlr_ll_restore_registers(uint32_t mspi_id, spi_mem_s_dev_t *reg)
{
memcpy(&SPIMEM2, reg, sizeof(spi_mem_s_dev_t));
}
/**
* @brief Disable core error response
*/
__attribute__((always_inline))
static inline void psram_ctrlr_ll_disable_core_err_resp(void)
{
HP_SYSTEM.core_err_resp_dis.val = 0x7;
}
/**
* @brief Enable core error response
*/
__attribute__((always_inline))
static inline void psram_ctrlr_ll_enable_core_err_resp(void)
{
HP_SYSTEM.core_err_resp_dis.val = 0x0;
}
#ifdef __cplusplus
}
#endif