change(esp_hw_support): use new retention api to implement gdma retention

This commit is contained in:
Li Shuai
2024-04-18 15:13:56 +08:00
parent b7b90fc394
commit 08a05ec562
5 changed files with 66 additions and 28 deletions

View File

@@ -10,39 +10,75 @@
#include "soc/soc_caps.h" #include "soc/soc_caps.h"
#include "esp_err.h" #include "esp_err.h"
#include "esp_check.h" #if CONFIG_GDMA_ENABLE_DEBUG_LOG
// The local log level must be defined before including esp_log.h
// Set the maximum log level for this source file
#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
#endif
#include "esp_log.h" #include "esp_log.h"
#include "esp_check.h"
#include "esp_private/sleep_retention.h" #include "esp_private/sleep_retention.h"
#include "esp_private/esp_regdma.h" #include "esp_private/esp_regdma.h"
#include "sleep_gdma_retention_context.inc" #include "hal/gdma_ll.h"
static const char *TAG = "gdma"; static const char *TAG = "gdma";
#define SLEEP_RETENTION_MODULE_GDMA_CH(group_id, pair_id) (SLEEP_RETENTION_MODULE_GDMA_CH0 << (SOC_GDMA_PAIRS_PER_GROUP * group_id) << pair_id) typedef struct {
int group_id;
int pair_id;
} gdma_channel_retention_arg_t;
static esp_err_t sleep_modem_gdma_channel_retention_init(sleep_retention_module_bitmap_t module) typedef struct gdma_chx_reg_ctx_link {
const sleep_retention_entries_config_t *link_list;
uint32_t link_num;
} gdma_chx_reg_ctx_link_t;
#include "sleep_gdma_retention_context.inc"
static esp_err_t sleep_gdma_channel_retention_init(void *arg)
{ {
uint32_t id = __builtin_ctz(module / SLEEP_RETENTION_MODULE_GDMA_CH0); gdma_channel_retention_arg_t *parg = (gdma_channel_retention_arg_t *)arg;
esp_err_t err = sleep_retention_entries_create(gdma_chx_regs_retention[id].link_list, gdma_chx_regs_retention[id].link_num, REGDMA_LINK_PRI_7, module); int group_id = parg->group_id;
int pair_id = parg->pair_id;
sleep_retention_module_bitmap_t module = GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id);
esp_err_t err = sleep_retention_entries_create(gdma_chx_regs_retention[group_id][pair_id].link_list, gdma_chx_regs_retention[group_id][pair_id].link_num, REGDMA_LINK_PRI_7, module);
if (err == ESP_OK) { if (err == ESP_OK) {
int group_id = id / SOC_GDMA_PAIRS_PER_GROUP; ESP_LOGD(TAG, "GDMA pair (%d, %d) retention initialization", group_id, pair_id);
int pair_id = id % SOC_GDMA_PAIRS_PER_GROUP;
ESP_LOGI(TAG, "GDMA pair (%d, %d) retention initialization", group_id, pair_id);
} }
ESP_RETURN_ON_ERROR(err, TAG, "Failed to create sleep retention linked list for GDMA pair (%d, %d) retention", group_id, pair_id);
return err; return err;
} }
esp_err_t gdma_sleep_retention_init(int group_id, int pair_id) esp_err_t gdma_sleep_retention_init(int group_id, int pair_id)
{ {
esp_err_t err = ESP_OK; gdma_channel_retention_arg_t arg = { .group_id = group_id, .pair_id = pair_id };
err = sleep_modem_gdma_channel_retention_init(SLEEP_RETENTION_MODULE_GDMA_CH(group_id, pair_id)); sleep_retention_module_init_param_t init_param = {
ESP_RETURN_ON_ERROR(err, TAG, "Failed to create sleep retention linked list for GDMA pair (%d, %d) retention", group_id, pair_id); .cbs = { .create = { .handle = sleep_gdma_channel_retention_init, .arg = &arg } },
.depends = BIT(SLEEP_RETENTION_MODULE_CLOCK_SYSTEM)
};
sleep_retention_module_bitmap_t module = GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id);
esp_err_t err = sleep_retention_module_init(module, &init_param);
if (err == ESP_OK) {
err = sleep_retention_module_allocate(module);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Failed to allocate sleep retention linked list for GDMA retention");
}
}
return err; return err;
} }
esp_err_t gdma_sleep_retention_deinit(int group_id, int pair_id) esp_err_t gdma_sleep_retention_deinit(int group_id, int pair_id)
{ {
sleep_retention_entries_destroy(SLEEP_RETENTION_MODULE_GDMA_CH(group_id, pair_id)); esp_err_t err = sleep_retention_module_free(GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id));
return ESP_OK;; if (err != ESP_OK) {
ESP_LOGW(TAG, "GDMA pair (%d, %d) retention destroy failed", group_id, pair_id);
}
err = sleep_retention_module_deinit(GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id));
if (err != ESP_OK) {
ESP_LOGW(TAG, "GDMA pair (%d, %d) retention deinit failed", group_id, pair_id);
}
return err;
} }

View File

@@ -71,11 +71,10 @@ static const sleep_retention_entries_config_t gdma_g0p2_regs_retention[] = {
.owner = ENTRY(0) | ENTRY(2) }, .owner = ENTRY(0) | ENTRY(2) },
}; };
static const struct { const gdma_chx_reg_ctx_link_t gdma_chx_regs_retention[SOC_GDMA_GROUPS][SOC_GDMA_PAIRS_PER_GROUP] = {
const sleep_retention_entries_config_t *link_list; [0] = {
uint32_t link_num;
} gdma_chx_regs_retention[SOC_GDMA_PAIRS_PER_GROUP*SOC_GDMA_PAIRS_PER_GROUP] = {
[0] = {gdma_g0p0_regs_retention, ARRAY_SIZE(gdma_g0p0_regs_retention)}, [0] = {gdma_g0p0_regs_retention, ARRAY_SIZE(gdma_g0p0_regs_retention)},
[1] = {gdma_g0p1_regs_retention, ARRAY_SIZE(gdma_g0p1_regs_retention)}, [1] = {gdma_g0p1_regs_retention, ARRAY_SIZE(gdma_g0p1_regs_retention)},
[2] = {gdma_g0p2_regs_retention, ARRAY_SIZE(gdma_g0p2_regs_retention)} [2] = {gdma_g0p2_regs_retention, ARRAY_SIZE(gdma_g0p2_regs_retention)}
}
}; };

View File

@@ -71,11 +71,10 @@ static const sleep_retention_entries_config_t gdma_g0p2_regs_retention[] = {
.owner = ENTRY(0) | ENTRY(2) }, .owner = ENTRY(0) | ENTRY(2) },
}; };
static const struct { const gdma_chx_reg_ctx_link_t gdma_chx_regs_retention[SOC_GDMA_GROUPS][SOC_GDMA_PAIRS_PER_GROUP] = {
const sleep_retention_entries_config_t *link_list; [0] = {
uint32_t link_num;
} gdma_chx_regs_retention[SOC_GDMA_PAIRS_PER_GROUP*SOC_GDMA_PAIRS_PER_GROUP] = {
[0] = {gdma_g0p0_regs_retention, ARRAY_SIZE(gdma_g0p0_regs_retention)}, [0] = {gdma_g0p0_regs_retention, ARRAY_SIZE(gdma_g0p0_regs_retention)},
[1] = {gdma_g0p1_regs_retention, ARRAY_SIZE(gdma_g0p1_regs_retention)}, [1] = {gdma_g0p1_regs_retention, ARRAY_SIZE(gdma_g0p1_regs_retention)},
[2] = {gdma_g0p2_regs_retention, ARRAY_SIZE(gdma_g0p2_regs_retention)} [2] = {gdma_g0p2_regs_retention, ARRAY_SIZE(gdma_g0p2_regs_retention)}
}
}; };

View File

@@ -17,6 +17,8 @@
extern "C" { extern "C" {
#endif #endif
#define GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id) (SLEEP_RETENTION_MODULE_GDMA_CH0 + (SOC_GDMA_PAIRS_PER_GROUP * group_id) + pair_id)
#define GDMA_LL_GET_HW(id) (((id) == 0) ? (&GDMA) : NULL) #define GDMA_LL_GET_HW(id) (((id) == 0) ? (&GDMA) : NULL)
#define GDMA_LL_CHANNEL_MAX_PRIORITY 5 // supported priority levels: [0,5] #define GDMA_LL_CHANNEL_MAX_PRIORITY 5 // supported priority levels: [0,5]

View File

@@ -17,6 +17,8 @@
extern "C" { extern "C" {
#endif #endif
#define GDMA_CH_RETENTION_GET_MODULE_ID(group_id, pair_id) (SLEEP_RETENTION_MODULE_GDMA_CH0 + (SOC_GDMA_PAIRS_PER_GROUP * group_id) + pair_id)
#define GDMA_LL_GET_HW(id) (((id) == 0) ? (&GDMA) : NULL) #define GDMA_LL_GET_HW(id) (((id) == 0) ? (&GDMA) : NULL)
#define GDMA_LL_CHANNEL_MAX_PRIORITY 5 // supported priority levels: [0,5] #define GDMA_LL_CHANNEL_MAX_PRIORITY 5 // supported priority levels: [0,5]