|
|
|
@@ -180,7 +180,7 @@ struct module_sleep_retention_context {
|
|
|
|
|
#define SLEEP_RETENTION_REGDMA_LINK_NR_PRIORITIES (8u)
|
|
|
|
|
#define SLEEP_RETENTION_REGDMA_LINK_HIGHEST_PRIORITY (0)
|
|
|
|
|
#define SLEEP_RETENTION_REGDMA_LINK_LOWEST_PRIORITY (SLEEP_RETENTION_REGDMA_LINK_NR_PRIORITIES - 1)
|
|
|
|
|
#define SLEEP_RETENTION_MODULE_INVALID ((sleep_retention_module_t)(-1)) /* the final node does not belong to any module */
|
|
|
|
|
#define SLEEP_RETENTION_MODULE_INVALID ((sleep_retention_module_t)(SLEEP_RETENTION_MODULE_MAX)) /* the final node does not belong to any module */
|
|
|
|
|
struct {
|
|
|
|
|
sleep_retention_entries_t entries;
|
|
|
|
|
uint32_t entries_bitmap: REGDMA_LINK_ENTRY_NUM;
|
|
|
|
@@ -258,7 +258,7 @@ typedef struct {
|
|
|
|
|
|
|
|
|
|
void *final_default;
|
|
|
|
|
|
|
|
|
|
struct sleep_retention_module_object instance[SLEEP_RETENTION_MODULE_MAX + 1];
|
|
|
|
|
struct sleep_retention_module_object instance[SLEEP_RETENTION_MODULE_MAX];
|
|
|
|
|
|
|
|
|
|
#define EXTRA_LINK_NUM (REGDMA_LINK_ENTRY_NUM - 1)
|
|
|
|
|
} sleep_retention_t;
|
|
|
|
@@ -425,7 +425,7 @@ static void * entries_try_create_bonding(const regdma_link_config_t *config, uin
|
|
|
|
|
|
|
|
|
|
void sleep_retention_dump_modules(FILE *out)
|
|
|
|
|
{
|
|
|
|
|
for (int i = SLEEP_RETENTION_MODULE_MIN; i <= SLEEP_RETENTION_MODULE_MAX; i++) {
|
|
|
|
|
for (int i = SLEEP_RETENTION_MODULE_MIN; i < SLEEP_RETENTION_MODULE_MAX; i++) {
|
|
|
|
|
bool inited = sleep_retention_is_module_inited(i);
|
|
|
|
|
bool created = sleep_retention_is_module_created(i);
|
|
|
|
|
bool is_top = is_top_domain_module(i);
|
|
|
|
@@ -624,8 +624,10 @@ static void entries_do_destroy(sleep_retention_module_t module)
|
|
|
|
|
memset(&next_entries, 0, sizeof(sleep_retention_entries_t));
|
|
|
|
|
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
|
s_retention.retention_modules.bitmap[module >> 5] &= ~BIT(module % 32);
|
|
|
|
|
s_retention.created_modules.bitmap[module >> 5] &= ~BIT(module % 32);
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
s_retention.retention_modules.bitmap[module >> 5] &= ~BIT(module % 32);
|
|
|
|
|
s_retention.created_modules.bitmap[module >> 5] &= ~BIT(module % 32);
|
|
|
|
|
}
|
|
|
|
|
int index = module_runtime_attach(instance(module)) ? 1 : 0;
|
|
|
|
|
struct module_sleep_retention_context *ctx = &s_retention.context[index];
|
|
|
|
|
regdma_link_priority_t priority = 0;
|
|
|
|
@@ -647,7 +649,7 @@ static void entries_do_destroy(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
static void entries_destroy(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(SLEEP_RETENTION_MODULE_MIN <= module && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(SLEEP_RETENTION_MODULE_MIN <= module && module <= SLEEP_RETENTION_MODULE_INVALID);
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
|
if (!module_runtime_attach(instance(module))) {
|
|
|
|
|
retention_entries_join();
|
|
|
|
@@ -660,7 +662,7 @@ static void entries_destroy(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
static void sleep_retention_entries_destroy(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(SLEEP_RETENTION_MODULE_MIN <= module && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(SLEEP_RETENTION_MODULE_MIN <= module && module < SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
|
entries_destroy(module);
|
|
|
|
|
uint32_t created_modules = 0;
|
|
|
|
@@ -819,7 +821,7 @@ esp_err_t sleep_retention_entries_create(const sleep_retention_entries_config_t
|
|
|
|
|
if (priority >= SLEEP_RETENTION_REGDMA_LINK_NR_PRIORITIES) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
esp_err_t err = check_and_create_final_default();
|
|
|
|
@@ -857,7 +859,7 @@ sleep_retention_module_bitmap_t IRAM_ATTR sleep_retention_get_retained_modules(v
|
|
|
|
|
|
|
|
|
|
bool sleep_retention_is_module_inited(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -868,7 +870,7 @@ bool sleep_retention_is_module_inited(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
bool sleep_retention_is_module_created(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -879,7 +881,7 @@ bool sleep_retention_is_module_created(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
bool sleep_retention_is_module_attached(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -972,7 +974,7 @@ static esp_err_t module_action_wrapper(sleep_retention_module_t module, int arg,
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_init(sleep_retention_module_t module, sleep_retention_module_init_param_t *param)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
if (param == NULL || param->cbs.create.handle == NULL) {
|
|
|
|
@@ -1005,7 +1007,7 @@ esp_err_t sleep_retention_module_init(sleep_retention_module_t module, sleep_ret
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_deinit(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1036,7 +1038,7 @@ esp_err_t sleep_retention_module_deinit(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
static esp_err_t passive_module_allocate(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module < SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
|
|
|
|
|
esp_err_t err = ESP_OK;
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -1057,7 +1059,7 @@ static esp_err_t passive_module_allocate(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_allocate(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1084,7 +1086,7 @@ esp_err_t sleep_retention_module_allocate(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
static esp_err_t passive_module_free(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module < SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
|
|
|
|
|
esp_err_t err = ESP_OK;
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -1111,7 +1113,7 @@ static esp_err_t passive_module_free(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_free(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1161,7 +1163,7 @@ static void module_entries_move(sleep_retention_module_t module, struct module_s
|
|
|
|
|
|
|
|
|
|
static esp_err_t passive_module_attach(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module < SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
|
|
|
|
|
esp_err_t err = ESP_OK;
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -1180,7 +1182,7 @@ static esp_err_t passive_module_attach(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_attach(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1208,7 +1210,7 @@ esp_err_t sleep_retention_module_attach(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
static esp_err_t passive_module_detach(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module <= SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
assert(module >= SLEEP_RETENTION_MODULE_MIN && module < SLEEP_RETENTION_MODULE_MAX);
|
|
|
|
|
|
|
|
|
|
esp_err_t err = ESP_OK;
|
|
|
|
|
_lock_acquire_recursive(&s_retention.lock);
|
|
|
|
@@ -1229,7 +1231,7 @@ static esp_err_t passive_module_detach(sleep_retention_module_t module)
|
|
|
|
|
|
|
|
|
|
esp_err_t sleep_retention_module_detach(sleep_retention_module_t module)
|
|
|
|
|
{
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module > SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
if (module < SLEEP_RETENTION_MODULE_MIN || module >= SLEEP_RETENTION_MODULE_MAX) {
|
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|