From 1fbbf73adec07c9e2e830eb2ed7d3d135d8271c0 Mon Sep 17 00:00:00 2001 From: sibeibei Date: Wed, 15 Apr 2026 12:22:05 +0800 Subject: [PATCH] fix(wifi): IRAM for regdma path used in modem pd light sleep --- components/esp_hw_support/linker.lf | 12 ++++++++++++ components/esp_hw_support/port/regdma_link.c | 18 +++++++++--------- components/esp_wifi/esp32c6/esp_adapter.c | 4 ++-- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index 243cb05b550..73fdb4ea14b 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -54,6 +54,18 @@ entries: sar_periph_ctrl (noflash) else: sar_periph_ctrl: sar_periph_ctrl_power_enable (noflash) + if SOC_PM_MODEM_RETENTION_BY_REGDMA = y && ESP_PHY_MAC_BB_PD = y: + sleep_retention:sleep_retention_find_link_by_id (noflash) + regdma_link:regdma_find_link_by_id (noflash) + regdma_link:regdma_link_get_next (noflash) + regdma_link:regdma_link_get_next_continuous_wrapper (noflash) + regdma_link:regdma_link_get_next_addr_map_wrapper (noflash) + regdma_link:regdma_link_get_next_write_wait_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_continuous_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_addr_map_wrapper (noflash) + regdma_link:regdma_link_get_next_branch_write_wait_wrapper (noflash) + regdma_link:regdma_link_set_write_wait_content (noflash) + regdma_link:regdma_link_get_instance (noflash) [mapping:soc_pm] archive: libsoc.a diff --git a/components/esp_hw_support/port/regdma_link.c b/components/esp_hw_support/port/regdma_link.c index 11b59482942..f72c99e13d2 100644 --- a/components/esp_hw_support/port/regdma_link.c +++ b/components/esp_hw_support/port/regdma_link.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -318,43 +318,43 @@ void * regdma_link_init(const regdma_link_config_t *config, bool branch, int mod return link; } -static void * regdma_link_get_next_continuous_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_continuous_wrapper(void *link) { regdma_link_continuous_t *continuous = __containerof(link, regdma_link_continuous_t, head); return (void *)(continuous->body.next); } -static void * regdma_link_get_next_addr_map_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_addr_map_wrapper(void *link) { regdma_link_addr_map_t *addr_map = __containerof(link, regdma_link_addr_map_t, head); return (void *)(addr_map->body.next); } -static void * regdma_link_get_next_write_wait_wrapper(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_next_write_wait_wrapper(void *link) { regdma_link_write_wait_t *write_wait = __containerof(link, regdma_link_write_wait_t, head); return (void *)(write_wait->body.next); } -static regdma_entry_buf_t * regdma_link_get_next_branch_continuous_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_continuous_wrapper(void *link) { regdma_link_branch_continuous_t *branch_continuous = __containerof(link, regdma_link_branch_continuous_t, head); return &branch_continuous->body.next; } -static regdma_entry_buf_t * regdma_link_get_next_branch_addr_map_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_addr_map_wrapper(void *link) { regdma_link_branch_addr_map_t *branch_addr_map = __containerof(link, regdma_link_branch_addr_map_t, head); return &branch_addr_map->body.next; } -static regdma_entry_buf_t * regdma_link_get_next_branch_write_wait_wrapper(void *link) +__attribute__((used, noinline)) static regdma_entry_buf_t * regdma_link_get_next_branch_write_wait_wrapper(void *link) { regdma_link_branch_write_wait_t *branch_write_wait = __containerof(link, regdma_link_branch_write_wait_t, head); return &branch_write_wait->body.next; } -static void * regdma_link_get_next(void *link, int entry) +__attribute__((used, noinline)) static void * regdma_link_get_next(void *link, int entry) { if (link) { regdma_link_head_t head = REGDMA_LINK_HEAD(link); @@ -407,7 +407,7 @@ void * regdma_link_recursive(void *link, int entry, void (*hook)(void *, int, in return regdma_link_recursive_impl(link, entry, 0, hook); } -static void * regdma_link_get_instance(void *link) +__attribute__((used, noinline)) static void * regdma_link_get_instance(void *link) { void * container_memaddr[] = { (void *)__containerof(link, regdma_link_continuous_t, head), diff --git a/components/esp_wifi/esp32c6/esp_adapter.c b/components/esp_wifi/esp32c6/esp_adapter.c index 07c46725f93..91b2bc47e9b 100644 --- a/components/esp_wifi/esp32c6/esp_adapter.c +++ b/components/esp_wifi/esp32c6/esp_adapter.c @@ -568,12 +568,12 @@ static void esp_phy_disable_wrapper(void) } #if SOC_PM_MODEM_RETENTION_BY_REGDMA -static void regdma_link_set_write_wait_content_wrapper(void *addr, uint32_t value, uint32_t mask) +static void IRAM_ATTR regdma_link_set_write_wait_content_wrapper(void *addr, uint32_t value, uint32_t mask) { regdma_link_set_write_wait_content(addr, value, mask); } -static void *sleep_retention_find_link_by_id_wrapper(int id) +static void *IRAM_ATTR sleep_retention_find_link_by_id_wrapper(int id) { return sleep_retention_find_link_by_id(id); }