From 1f8f0a52851df9d610daea8c6a92cb9f3ef7c629 Mon Sep 17 00:00:00 2001 From: Armando Date: Sun, 8 Oct 2023 16:26:37 +0800 Subject: [PATCH] feat(cache): added private API to get cache alignment requirements --- components/esp_mm/esp_cache.c | 30 +++++++++++++++---- .../include/esp_private/esp_cache_private.h | 16 ++++++++-- components/hal/cache_hal.c | 9 +++++- components/hal/esp32/cache_hal_esp32.c | 9 +++++- components/hal/include/hal/cache_hal.h | 2 +- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/components/esp_mm/esp_cache.c b/components/esp_mm/esp_cache.c index 350d81ee04..4b8fbf20b6 100644 --- a/components/esp_mm/esp_cache.c +++ b/components/esp_mm/esp_cache.c @@ -108,15 +108,11 @@ esp_err_t esp_cache_aligned_malloc(size_t size, uint32_t flags, void **out_ptr, } } -#if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE data_cache_line_size = cache_hal_get_cache_line_size(cache_level, CACHE_TYPE_DATA); -#else - if (cache_level == CACHE_LL_LEVEL_EXT_MEM) { - data_cache_line_size = cache_hal_get_cache_line_size(cache_level, CACHE_TYPE_DATA); - } else { + if (data_cache_line_size == 0) { + //default alignment data_cache_line_size = 4; } -#endif size = ALIGN_UP_BY(size, data_cache_line_size); ptr = heap_caps_aligned_alloc(data_cache_line_size, size, heap_caps); @@ -150,3 +146,25 @@ esp_err_t esp_cache_aligned_calloc(size_t n, size_t size, uint32_t flags, void * return ret; } + +esp_err_t esp_cache_get_alignment(uint32_t flags, size_t *out_alignment) +{ + ESP_RETURN_ON_FALSE(out_alignment, ESP_ERR_INVALID_ARG, TAG, "null pointer"); + + uint32_t cache_level = CACHE_LL_LEVEL_INT_MEM; + uint32_t data_cache_line_size = 0; + + if (flags & ESP_CACHE_MALLOC_FLAG_PSRAM) { + cache_level = CACHE_LL_LEVEL_EXT_MEM; + } + + data_cache_line_size = cache_hal_get_cache_line_size(cache_level, CACHE_TYPE_DATA); + if (data_cache_line_size == 0) { + //default alignment + data_cache_line_size = 4; + } + + *out_alignment = data_cache_line_size; + + return ESP_OK; +} diff --git a/components/esp_mm/include/esp_private/esp_cache_private.h b/components/esp_mm/include/esp_private/esp_cache_private.h index 624e6dd087..cbad00163f 100644 --- a/components/esp_mm/include/esp_private/esp_cache_private.h +++ b/components/esp_mm/include/esp_private/esp_cache_private.h @@ -28,7 +28,7 @@ extern "C" { #define ESP_CACHE_MALLOC_FLAG_DMA BIT(1) /** - * @brief Helper function for malloc a cache aligned memory buffer + * @brief Helper function for malloc a cache aligned data memory buffer * * @param[in] size Size in bytes, the amount of memory to allocate * @param[in] flags Flags, see `ESP_CACHE_MALLOC_FLAG_x` @@ -43,7 +43,7 @@ extern "C" { esp_err_t esp_cache_aligned_malloc(size_t size, uint32_t flags, void **out_ptr, size_t *actual_size); /** - * @brief Helper function for calloc a cache aligned memory buffer + * @brief Helper function for calloc a cache aligned data memory buffer * * @param[in] n Number of continuing chunks of memory to allocate * @param[in] size Size of one chunk, in bytes @@ -58,6 +58,18 @@ esp_err_t esp_cache_aligned_malloc(size_t size, uint32_t flags, void **out_ptr, */ esp_err_t esp_cache_aligned_calloc(size_t n, size_t size, uint32_t flags, void **out_ptr, size_t *actual_size); +/** + * @brief Get Cache alignment requirement for data + * + * @param[in] flags Flags, see `ESP_CACHE_MALLOC_FLAG_x` + * @param[out] out_alignment Alignment + * + * @return + * - ESP_OK: + * - ESP_ERR_INVALID_ARG: Invalid argument + */ +esp_err_t esp_cache_get_alignment(uint32_t flags, size_t *out_alignment); + #ifdef __cplusplus } #endif diff --git a/components/hal/cache_hal.c b/components/hal/cache_hal.c index 6252970e43..ea6d3e485f 100644 --- a/components/hal/cache_hal.c +++ b/components/hal/cache_hal.c @@ -287,8 +287,15 @@ void cache_hal_unfreeze(uint32_t cache_level, cache_type_t type) uint32_t cache_hal_get_cache_line_size(uint32_t cache_level, cache_type_t type) { HAL_ASSERT(cache_level && (cache_level <= CACHE_LL_LEVEL_NUMS)); + uint32_t line_size = 0; - uint32_t line_size = cache_ll_get_line_size(cache_level, type, CACHE_LL_ID_ALL); +#if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE + line_size = cache_ll_get_line_size(cache_level, type, CACHE_LL_ID_ALL); +#else + if (cache_level == CACHE_LL_LEVEL_EXT_MEM) { + line_size = cache_ll_get_line_size(cache_level, type, CACHE_LL_ID_ALL); + } +#endif return line_size; } diff --git a/components/hal/esp32/cache_hal_esp32.c b/components/hal/esp32/cache_hal_esp32.c index 6b4fd2037d..e8acd52831 100644 --- a/components/hal/esp32/cache_hal_esp32.c +++ b/components/hal/esp32/cache_hal_esp32.c @@ -56,7 +56,14 @@ bool cache_hal_vaddr_to_cache_level_id(uint32_t vaddr_start, uint32_t len, uint3 uint32_t cache_hal_get_cache_line_size(uint32_t cache_level, cache_type_t type) { HAL_ASSERT(cache_level && (cache_level <= CACHE_LL_LEVEL_NUMS)); - return 4; + + uint32_t line_size = 0; + + if (cache_level == CACHE_LL_LEVEL_EXT_MEM) { + line_size = 4; + } + + return line_size; } bool cache_hal_invalidate_addr(uint32_t vaddr, uint32_t size) diff --git a/components/hal/include/hal/cache_hal.h b/components/hal/include/hal/cache_hal.h index 36926976c7..5a4f0b86aa 100644 --- a/components/hal/include/hal/cache_hal.h +++ b/components/hal/include/hal/cache_hal.h @@ -129,7 +129,7 @@ void cache_hal_unfreeze(uint32_t cache_level, cache_type_t type); * @param cache_level Level of the Cache(s) * @param type see `cache_type_t` * - * @return cache line size, in bytes + * @return cache line size, in bytes. 0 stands for no such cache in this type or level */ uint32_t cache_hal_get_cache_line_size(uint32_t cache_level, cache_type_t type);