Merge branch 'feat/pm-788' into 'master'

support sleep retention destroy callback

Closes PM-788

See merge request espressif/esp-idf!49568
This commit is contained in:
Li Shuai
2026-06-30 11:55:57 +08:00
2 changed files with 36 additions and 6 deletions
@@ -52,7 +52,13 @@ typedef struct {
} sleep_retention_create_callback_t;
typedef struct {
sleep_retention_create_callback_t create; /*!< A function handle is used to register the implementation of creating a sleep retention linked list and is executed when the corresponding module is created */
sleep_retention_callback_t handle;
void *arg;
} sleep_retention_destroy_callback_t;
typedef struct {
sleep_retention_create_callback_t create; /*!< A function handler is used to register the implementation of creating a sleep retention linked list and is executed when the corresponding module is created */
sleep_retention_destroy_callback_t destroy; /*!< The callback function handler is invoked after the sleep retention linked list is destroyed */
} sleep_retention_module_callbacks_t;
typedef enum {
+29 -5
View File
@@ -60,7 +60,10 @@ static inline void sleep_retention_module_object_ctor(struct sleep_retention_mod
static inline void sleep_retention_module_object_dtor(struct sleep_retention_module_object * const self)
{
self->cbs = (sleep_retention_module_callbacks_t) { .create = { .handle = NULL, .arg = NULL } };
self->cbs = (sleep_retention_module_callbacks_t) {
.create = { .handle = NULL, .arg = NULL },
.destroy = { .handle = NULL, .arg = NULL }
};
}
static inline void set_dependencies(struct sleep_retention_module_object * const self, sleep_retention_module_bitmap_t depends)
@@ -246,6 +249,7 @@ typedef struct {
regdma_link_priority_t highpri;
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;
@@ -259,6 +263,7 @@ static DRAM_ATTR __attribute__((unused)) sleep_retention_t s_retention = {
.highpri = (uint8_t)-1,
.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
};
@@ -459,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);
@@ -628,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);
}
@@ -785,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:
@@ -833,7 +843,7 @@ sleep_retention_module_bitmap_t IRAM_ATTR sleep_retention_get_created_modules(vo
sleep_retention_module_bitmap_t IRAM_ATTR sleep_retention_get_retained_modules(void)
{
return s_retention.retention_modules;
return s_retention.attached_modules;
}
bool sleep_retention_is_module_inited(sleep_retention_module_t module)
@@ -1075,7 +1085,12 @@ static esp_err_t passive_module_free(sleep_retention_module_t module)
if (!references_exist(instance(module))) {
if (!module_is_retained(module)) {
sleep_retention_entries_destroy(module);
err = module_action_wrapper(module, (BIT(31) | action(2)), passive_module_free);
if (instance(module)->cbs.destroy.handle) {
err = instance(module)->cbs.destroy.handle(instance(module)->cbs.destroy.arg);
}
if (err == ESP_OK) {
err = module_action_wrapper(module, (BIT(31) | action(2)), passive_module_free);
}
} else {
err = ESP_ERR_INVALID_STATE;
}
@@ -1096,7 +1111,12 @@ esp_err_t sleep_retention_module_free(sleep_retention_module_t module)
if (!module_is_passive(instance(module))) {
if (module_is_inited(module) && module_is_created(module) && !module_is_retained(module)) {
sleep_retention_entries_destroy(module);
err = module_action_wrapper(module, action(2), passive_module_free);
if (instance(module)->cbs.destroy.handle) {
err = instance(module)->cbs.destroy.handle(instance(module)->cbs.destroy.arg);
}
if (err == ESP_OK) {
err = module_action_wrapper(module, action(2), passive_module_free);
}
} else {
err = ESP_ERR_INVALID_STATE;
}
@@ -1141,6 +1161,7 @@ static esp_err_t passive_module_attach(sleep_retention_module_t module)
assert(module_is_inited(module) && "All passive module must be inited first!");
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);
}
@@ -1160,6 +1181,7 @@ esp_err_t sleep_retention_module_attach(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.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 {
@@ -1188,6 +1210,7 @@ static esp_err_t passive_module_detach(sleep_retention_module_t 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);
}
}
@@ -1208,6 +1231,7 @@ esp_err_t sleep_retention_module_detach(sleep_retention_module_t 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 {
err = ESP_ERR_NOT_SUPPORTED;