MdePkg: Implement RISC-V Cache Management Operations

Implement Cache Management Operations (CMO) defined by
RISC-V spec https://github.com/riscv/riscv-CMOs.

Notes:
1. CMO only supports block based Operations. Meaning cache
   flush/invd/clean Operations are not available for the entire
   range. In that case we fallback on fence.i instructions.
2. Operations are implemented using Opcodes to make them compiler
   independent. binutils 2.39+ compilers support CMO instructions.

Test:
1. Ensured correct instructions are refelecting in asm
2. Qemu implements basic support for CMO operations in that it allwos
   instructions without exceptions. Verified it works properly in
   that sense.
3. SG2042Pkg implements CMO-like instructions. It was verified that
   CpuFlushCpuDataCache works fine. This more of less
   confirms that framework is alright.
4. TODO: Once Silicon is available with exact instructions, we will
   further verify this.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Cc: Sunil V L <sunilvl@ventanamicro.com>
Cc: Daniel Schaefer <git@danielschaefer.me>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Pedro Falcato <pedro.falcato@gmail.com>

Signed-off-by: Dhaval Sharma <dhaval@rivosinc.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Sunil V L <sunilvl@...>
Reviewed-by: Jingyu Li <jingyu.li01@...>
This commit is contained in:
Dhaval 2023-12-13 20:29:29 +05:30 committed by mergify[bot]
parent 30faafd024
commit 26727c2ae2
4 changed files with 70 additions and 1 deletions

View File

@ -226,6 +226,39 @@ RiscVInvalidateDataCacheFenceAsm (
VOID
);
/**
RISC-V flush cache block. Atomically perform a clean operation
followed by an invalidate operation
**/
VOID
EFIAPI
RiscVCpuCacheFlushCmoAsm (
IN UINTN
);
/**
Perform a write transfer to another cache or to memory if the
data in the copy of the cache block have been modified by a store
operation
**/
VOID
EFIAPI
RiscVCpuCacheCleanCmoAsm (
IN UINTN
);
/**
Deallocate the copy of the cache block
**/
VOID
EFIAPI
RiscVCpuCacheInvalCmoAsm (
IN UINTN
);
#endif // defined (MDE_CPU_RISCV64)
#if defined (MDE_CPU_LOONGARCH64)

View File

@ -0,0 +1,19 @@
/*
*
* RISC-V cache operation encoding.
* Copyright (c) 2023, Rivos Inc. All rights reserved.<BR>
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
*/
.macro RISCVCMOFLUSH
.word 0x25200f
.endm
.macro RISCVCMOINVALIDATE
.word 0x05200f
.endm
.macro RISCVCMOCLEAN
.word 0x15200f
.endm

View File

@ -400,7 +400,7 @@
RiscV64/RiscVCpuBreakpoint.S | GCC
RiscV64/RiscVCpuPause.S | GCC
RiscV64/RiscVInterrupt.S | GCC
RiscV64/FlushCache.S | GCC
RiscV64/RiscVCacheMgmt.S | GCC
RiscV64/CpuScratch.S | GCC
RiscV64/ReadTimer.S | GCC
RiscV64/RiscVMmu.S | GCC

View File

@ -3,10 +3,12 @@
// RISC-V cache operation.
//
// Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
// Copyright (c) 2023, Rivos Inc. All rights reserved.<BR>
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
//------------------------------------------------------------------------------
.include "RiscVasm.inc"
.align 3
ASM_GLOBAL ASM_PFX(RiscVInvalidateInstCacheFenceAsm)
@ -19,3 +21,18 @@ ASM_PFX(RiscVInvalidateInstCacheFenceAsm):
ASM_PFX(RiscVInvalidateDataCacheFenceAsm):
fence
ret
ASM_GLOBAL ASM_PFX (RiscVCpuCacheFlushCmoAsm)
ASM_PFX (RiscVCpuCacheFlushCmoAsm):
RISCVCMOFLUSH
ret
ASM_GLOBAL ASM_PFX (RiscVCpuCacheCleanCmoAsm)
ASM_PFX (RiscVCpuCacheCleanCmoAsm):
RISCVCMOCLEAN
ret
ASM_GLOBAL ASM_PFX (RiscVCpuCacheInvalCmoAsm)
ASM_PFX (RiscVCpuCacheInvalCmoAsm):
RISCVCMOINVALIDATE
ret