blob: 0e602779b2dddd0187aaa2fcfcf1cc7b25953fbe [file] [log] [blame]
/*
* Non-standard CVA6 cache management operations.
*
* Copyright(c) 2024, CISPA Helmholtz Center for Information Security
* SPDX-License-Identifier: Apache-2.0
*/
#include <stddef.h>
#include <zephyr/arch/cache.h>
#include <zephyr/arch/riscv/csr.h>
#include <zephyr/kernel.h>
#include "cva6.h"
void __weak arch_dcache_enable(void)
{
csr_write(SOC_CVA6_CUSTOM_CSR_DCACHE, SOC_CVA6_CUSTOM_CSR_DCACHE_ENABLE);
}
void __weak arch_dcache_disable(void)
{
csr_write(SOC_CVA6_CUSTOM_CSR_DCACHE, SOC_CVA6_CUSTOM_CSR_DCACHE_DISABLE);
}
int __weak arch_dcache_flush_all(void)
{
arch_dcache_disable();
arch_dcache_enable();
return 0;
}
int __weak arch_dcache_invd_all(void)
{
return arch_dcache_flush_all();
}
int __weak arch_dcache_flush_and_invd_all(void)
{
return arch_dcache_flush_all();
}
/* FIXME currently not supported by all CVA6 - overwrite at board or SoC level */
int __weak arch_dcache_flush_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_dcache_flush_all();
}
int __weak arch_dcache_invd_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_dcache_flush_all();
}
int __weak arch_dcache_flush_and_invd_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_dcache_flush_all();
}
void __weak arch_icache_enable(void)
{
csr_write(SOC_CVA6_CUSTOM_CSR_ICACHE, SOC_CVA6_CUSTOM_CSR_ICACHE_ENABLE);
}
void __weak arch_icache_disable(void)
{
csr_write(SOC_CVA6_CUSTOM_CSR_ICACHE, SOC_CVA6_CUSTOM_CSR_ICACHE_DISABLE);
}
int __weak arch_icache_flush_all(void)
{
arch_icache_disable();
arch_icache_enable();
return 0;
}
int __weak arch_icache_invd_all(void)
{
return arch_icache_flush_all();
}
int __weak arch_icache_flush_and_invd_all(void)
{
return arch_icache_flush_all();
}
/* FIXME currently not supported by all CVA6 - overwrite at board or SoC level */
int __weak arch_icache_flush_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_icache_flush_all();
}
int __weak arch_icache_invd_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_icache_flush_all();
}
int __weak arch_icache_flush_and_invd_range(void *addr, size_t size)
{
ARG_UNUSED(addr);
ARG_UNUSED(size);
return arch_icache_flush_all();
}
/* FIXME there is no common implementation for RISC-V, so we provide a SoC-level definition */
/* this prevents a linker error when the function is not defined */
void __weak arch_cache_init(void)
{
}