Introduce support for nonstandard noncoherent systems in the RISC-V architecture. It enables function pointer support to handle cache management in such systems. This patch adds a new configuration option called "RISCV_NONSTANDARD_CACHE_OPS." This option is a boolean flag that depends on "RISCV_DMA_NONCOHERENT" and enables the function pointer support for cache management in nonstandard noncoherent systems. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Tested-by: Conor Dooley <conor.dooley@microchip.com> # tyre-kicking on a d1 Reviewed-by: Emil Renner Berthing <emil.renner.berthing@canonical.com> Tested-by: Emil Renner Berthing <emil.renner.berthing@canonical.com> # Link: https://lore.kernel.org/r/20230818135723.80612-4-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
34 lines
836 B
C
34 lines
836 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2022 Ventana Micro Systems Inc.
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
#include <linux/libnvdimm.h>
|
|
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/dma-noncoherent.h>
|
|
|
|
void arch_wb_cache_pmem(void *addr, size_t size)
|
|
{
|
|
#ifdef CONFIG_RISCV_NONSTANDARD_CACHE_OPS
|
|
if (unlikely(noncoherent_cache_ops.wback)) {
|
|
noncoherent_cache_ops.wback(virt_to_phys(addr), size);
|
|
return;
|
|
}
|
|
#endif
|
|
ALT_CMO_OP(clean, addr, size, riscv_cbom_block_size);
|
|
}
|
|
EXPORT_SYMBOL_GPL(arch_wb_cache_pmem);
|
|
|
|
void arch_invalidate_pmem(void *addr, size_t size)
|
|
{
|
|
#ifdef CONFIG_RISCV_NONSTANDARD_CACHE_OPS
|
|
if (unlikely(noncoherent_cache_ops.inv)) {
|
|
noncoherent_cache_ops.inv(virt_to_phys(addr), size);
|
|
return;
|
|
}
|
|
#endif
|
|
ALT_CMO_OP(inval, addr, size, riscv_cbom_block_size);
|
|
}
|
|
EXPORT_SYMBOL_GPL(arch_invalidate_pmem);
|