From a9f278d9ba28a6ada0cacb0040e2cd0f708c05bd Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Thu, 11 Jun 2026 11:59:34 +0800 Subject: [PATCH] change(esp_hw_support): maintain runtime retention module information --- components/esp_hw_support/sleep_retention.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/sleep_retention.c b/components/esp_hw_support/sleep_retention.c index d2534d800f1..2203adba39c 100644 --- a/components/esp_hw_support/sleep_retention.c +++ b/components/esp_hw_support/sleep_retention.c @@ -250,6 +250,7 @@ typedef struct { sleep_retention_module_bitmap_t inited_modules; sleep_retention_module_bitmap_t created_modules; sleep_retention_module_bitmap_t attached_modules; + sleep_retention_module_bitmap_t retention_modules; void *final_default; @@ -263,6 +264,7 @@ static DRAM_ATTR __attribute__((unused)) sleep_retention_t s_retention = { .inited_modules = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } }, .created_modules = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } }, .attached_modules = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } }, + .retention_modules = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } }, .final_default = NULL }; @@ -462,7 +464,10 @@ void * sleep_retention_find_link_by_id(int id) if (s_retention.highpri >= SLEEP_RETENTION_REGDMA_LINK_HIGHEST_PRIORITY && s_retention.highpri <= SLEEP_RETENTION_REGDMA_LINK_LOWEST_PRIORITY) { for (int entry = 0; (link == NULL && entry < ARRAY_SIZE(s_retention.retention.lists[s_retention.highpri].entries)); entry++) { - link = regdma_find_link_by_id(s_retention.retention.lists[s_retention.highpri].entries[entry], entry, id); + link = regdma_find_link_by_id(s_retention.context[0].lists[s_retention.highpri].entries[entry], entry, id); + } + for (int entry = 0; (link == NULL && entry < ARRAY_SIZE(s_retention.retention.lists[s_retention.highpri].entries)); entry++) { + link = regdma_find_link_by_id(s_retention.context[1].lists[s_retention.highpri].entries[entry], entry, id); } } _lock_release_recursive(&s_retention.lock); @@ -631,6 +636,7 @@ static void entries_do_destroy(sleep_retention_module_t module) priority++; } } while (priority < SLEEP_RETENTION_REGDMA_LINK_NR_PRIORITIES); + s_retention.retention_modules.bitmap[module >> 5] &= ~BIT(module % 32); s_retention.created_modules.bitmap[module >> 5] &= ~BIT(module % 32); _lock_release_recursive(&s_retention.lock); } @@ -788,6 +794,7 @@ static esp_err_t entries_create_wrapper(const sleep_retention_entries_config_t r if(err) goto error; s_retention.created_modules.bitmap[module >> 5] |= BIT(module % 32); if (!module_runtime_attach(instance(module))) { + s_retention.retention_modules.bitmap[module >> 5] |= BIT(module % 32); retention_entries_join(); } error: @@ -1155,6 +1162,7 @@ static esp_err_t passive_module_attach(sleep_retention_module_t module) if (module_is_inited(module) && module_is_created(module) && !module_is_retained(module)) { module_entries_move(module, &s_retention.context[1], &s_retention.retention); s_retention.attached_modules.bitmap[module >> 5] |= BIT(module % 32); + s_retention.retention_modules.bitmap[module >> 5] |= BIT(module % 32); err = module_action_wrapper(module, (BIT(31) | action(3)), passive_module_attach); } _lock_release_recursive(&s_retention.lock); @@ -1174,6 +1182,7 @@ esp_err_t sleep_retention_module_attach(sleep_retention_module_t module) if (module_runtime_attach(instance(module))) { module_entries_move(module, &s_retention.context[1], &s_retention.retention); s_retention.attached_modules.bitmap[module >> 5] |= BIT(module % 32); + s_retention.retention_modules.bitmap[module >> 5] |= BIT(module % 32); err = module_action_wrapper(module, action(3), passive_module_attach); } else { err = ESP_ERR_NOT_SUPPORTED; @@ -1200,6 +1209,7 @@ static esp_err_t passive_module_detach(sleep_retention_module_t module) if (module_is_inited(module) && module_is_created(module) && module_is_retained(module)) { if (refarray_zero(instance(module), 1)) { module_entries_move(module, &s_retention.retention, &s_retention.context[1]); + s_retention.retention_modules.bitmap[module >> 5] &= ~BIT(module % 32); s_retention.attached_modules.bitmap[module >> 5] &= ~BIT(module % 32); err = module_action_wrapper(module, (BIT(31) | action(4)), passive_module_detach); } @@ -1220,6 +1230,7 @@ esp_err_t sleep_retention_module_detach(sleep_retention_module_t module) if (module_is_inited(module) && module_is_created(module) && module_is_retained(module)) { if (module_runtime_attach(instance(module))) { module_entries_move(module, &s_retention.retention, &s_retention.context[1]); + s_retention.retention_modules.bitmap[module >> 5] &= ~BIT(module % 32); s_retention.attached_modules.bitmap[module >> 5] &= ~BIT(module % 32); err = module_action_wrapper(module, action(4), passive_module_detach); } else {