Merge branch 'bugfix/lp_mailbox_interrupt_fix_v6.0' into 'release/v6.0'

fix(lp_mailbox): Fixed LP mailbox operation when LP core interrupts are enabled (v6.0)

See merge request espressif/esp-idf!44965
This commit is contained in:
Jiang Jiang Jian
2026-01-12 20:49:01 +08:00
4 changed files with 16 additions and 12 deletions
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -95,7 +95,7 @@ static inline bool lp_core_mailbox_check_timeout(uint32_t start_cycle, int32_t t
static void ulp_lp_core_mailbox_intr_handler(void)
{
lp_message_t received[LP_MAILBOX_RX_MSG_COUNT];
lp_message_t received[LP_MAILBOX_RX_MSG_COUNT / 2];
int received_count = 0;
/* `s_isr_arg` cannot be NULL but let's be safe and test it */
@@ -109,14 +109,15 @@ static void ulp_lp_core_mailbox_intr_handler(void)
uint32_t clr_mask = 0;
for (int i = 0; i < LP_MAILBOX_RX_MSG_COUNT; i += 2) {
const uint32_t mask = BIT(i);
const uint32_t mask = BIT(LP_MAILBOX_RX_MSG_IDX + i);
if (status & mask) {
clr_mask |= mask;
received[received_count] = lp_core_mailbox_impl_get_message(s_isr_arg->mb_ctx, LP_MAILBOX_RX_MSG_IDX + i);
/* Acknowledge reception */
const int ack_msg_idx = LP_MAILBOX_RX_MSG_IDX + lp_core_next_msg_idx(i);
lp_core_mailbox_impl_set_message(s_isr_arg->mb_ctx, ack_msg_idx, LP_MAILBOX_ACK);
lp_core_mailbox_impl_intr_clear(s_isr_arg->mb_ctx, ack_msg_idx);
/* Clear ACK self-interrupt (writing ACK sets LP's own interrupt bit) */
lp_core_mailbox_impl_intr_clear(s_isr_arg->mb_ctx, BIT(ack_msg_idx));
received_count++;
/* We must not acknowledge more messages than what the caller needs */
s_isr_arg->rcv_remaining--;
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -16,9 +16,11 @@
/* Implementation agnostic interrupt handler */
static void (*s_intr_handler)(void);
static void LP_CORE_ISR_ATTR ulp_lp_core_mailbox_intr_handler(void)
void LP_CORE_ISR_ATTR ulp_lp_core_mailbox_intr_handler(void)
{
s_intr_handler();
if (s_intr_handler) {
s_intr_handler();
}
}
lp_core_mailbox_ctx_t lp_core_mailbox_impl_get_context(void)
@@ -30,7 +30,7 @@ lp_core_mailbox_impl_sw_t g_lp_core_mailbox_impl_sw_ctx;
/* Implementation agnostic interrupt handler */
static void (*s_intr_handler)(void);
static void LP_CORE_ISR_ATTR ulp_lp_core_sw_intr_handler(void)
void LP_CORE_ISR_ATTR ulp_lp_core_sw_intr_handler(void)
{
if (s_intr_handler) {
s_intr_handler();
+5 -4
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -33,7 +33,7 @@
#define LP_MAILBOX_RX_MSG_COUNT (LP_MAILBOX_MSG_COUNT / 2)
/**
* @brief Mask for the HP -> LP messages
* @brief Mask for the LP -> HP messages
*/
#define LP_MAILBOX_RX_MSG_MASK (((1U << LP_MAILBOX_RX_MSG_COUNT) - 1U) << LP_MAILBOX_RX_MSG_IDX)
@@ -106,7 +106,7 @@ static void lp_core_mailbox_intr_handler(void* arg)
portYIELD_FROM_ISR();
}
} else {
lp_message_t received[LP_MAILBOX_RX_MSG_COUNT];
lp_message_t received[LP_MAILBOX_RX_MSG_COUNT / 2];
int received_count = 0;
/* Acknowledge all the received message as fast as possible */
@@ -123,7 +123,8 @@ static void lp_core_mailbox_intr_handler(void* arg)
/* Acknowledge reception by writing to the next message */
const int ack_msg_idx = LP_MAILBOX_RX_MSG_IDX + lp_core_next_msg_idx(i);
lp_core_mailbox_impl_set_message(mailbox->mb_ctx, ack_msg_idx, LP_MAILBOX_ACK);
lp_core_mailbox_impl_intr_clear(mailbox->mb_ctx, ack_msg_idx);
/* Clear ACK self-interrupt (writing ACK sets HP's own interrupt bit) */
lp_core_mailbox_impl_intr_clear(mailbox->mb_ctx, BIT(ack_msg_idx));
received_count++;
mailbox->rcv_remaining--;
if (mailbox->rcv_remaining == 0) {