blob: cb83054cff19fe436ee6e51c1e06b4f834d5b6b4 [file] [edit]
/*
* Copyright (c) 2026 Espressif Systems (Shanghai) Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/drivers/cache.h>
#include <esp_cache.h>
#include <esp_err.h>
static inline size_t cache_line_size(const void *addr)
{
size_t line = esp_cache_get_line_size_by_addr(addr);
return line ? line : sizeof(void *);
}
void cache_data_enable(void)
{
/* Cache is enabled by the bootloader */
}
void cache_data_disable(void)
{
/* Not supported */
}
int cache_data_flush_all(void)
{
return -ENOTSUP;
}
int cache_data_invd_all(void)
{
return -ENOTSUP;
}
int cache_data_flush_and_invd_all(void)
{
return -ENOTSUP;
}
int cache_data_flush_range(void *addr, size_t size)
{
esp_err_t ret;
ret = esp_cache_msync(addr, size,
ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED);
return (ret == ESP_OK || ret == ESP_ERR_NOT_SUPPORTED) ? 0 : -EIO;
}
int cache_data_invd_range(void *addr, size_t size)
{
esp_err_t ret;
size_t line = cache_line_size(addr);
uintptr_t aligned_addr = (uintptr_t)addr & ~(line - 1);
size_t aligned_size = (((uintptr_t)addr + size + line - 1) & ~(line - 1)) - aligned_addr;
ret = esp_cache_msync((void *)aligned_addr, aligned_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C);
return (ret == ESP_OK || ret == ESP_ERR_NOT_SUPPORTED) ? 0 : -EIO;
}
int cache_data_flush_and_invd_range(void *addr, size_t size)
{
esp_err_t ret;
ret = esp_cache_msync(addr, size,
ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_INVALIDATE |
ESP_CACHE_MSYNC_FLAG_UNALIGNED);
return (ret == ESP_OK || ret == ESP_ERR_NOT_SUPPORTED) ? 0 : -EIO;
}