mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
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:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user