MdePkg: Add IOCSR operation for LoongArch

Add IoCsrRead8, IoCsrRead16, IoCsrRead32, IoCsrRead64, IoCsrWrite8,
IoCsrWrite16, IoCsrWrite32, IoCsrWrite64 to operate the IOCSR registers
of LoongArch architecture.

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4584

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Signed-off-by: Chao Li <lichao@loongson.cn>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
Chao Li 2023-10-12 11:35:11 +08:00 committed by Liming Gao
parent 0565a8e885
commit bc0b418cba
3 changed files with 233 additions and 0 deletions

View File

@ -396,6 +396,118 @@ CsrXChg (
IN UINTN Mask IN UINTN Mask
); );
/**
IO CSR read byte operation.
@param[in] Select IO CSR read instruction select values.
@return The return value of iocsrrd.b instruction.
**/
UINT8
IoCsrRead8 (
IN UINTN Select
);
/**
IO CSR read half word operation.
@param[in] Select IO CSR read instruction select values.
@return The return value of iocsrrd.h instruction.
**/
UINT16
IoCsrRead16 (
IN UINTN Select
);
/**
IO CSR read word operation.
@param[in] Select IO CSR read instruction select values.
@return The return value of iocsrrd.w instruction.
**/
UINT32
IoCsrRead32 (
IN UINTN Select
);
/**
IO CSR read double word operation. Only for LoongArch64.
@param[in] Select IO CSR read instruction select values.
@return The return value of iocsrrd.d instruction.
**/
UINT64
IoCsrRead64 (
IN UINTN Select
);
/**
IO CSR write byte operation.
@param[in] Select IO CSR write instruction select values.
@param[in] Value The iocsrwr.b will write the value.
@return VOID.
**/
VOID
IoCsrWrite8 (
IN UINTN Select,
IN UINT8 Value
);
/**
IO CSR write half word operation.
@param[in] Select IO CSR write instruction select values.
@param[in] Value The iocsrwr.h will write the value.
@return VOID.
**/
VOID
IoCsrWrite16 (
IN UINTN Select,
IN UINT16 Value
);
/**
IO CSR write word operation.
@param[in] Select IO CSR write instruction select values.
@param[in] Value The iocsrwr.w will write the value.
@return VOID.
**/
VOID
IoCsrWrite32 (
IN UINTN Select,
IN UINT32 Value
);
/**
IO CSR write double word operation. Only for LoongArch64.
@param[in] Select IO CSR write instruction select values.
@param[in] Value The iocsrwr.d will write the value.
@return VOID.
**/
VOID
IoCsrWrite64 (
IN UINTN Select,
IN UINT64 Value
);
#endif // defined (MDE_CPU_LOONGARCH64) #endif // defined (MDE_CPU_LOONGARCH64)
// //

View File

@ -413,6 +413,7 @@
LoongArch64/Csr.c LoongArch64/Csr.c
LoongArch64/InternalSwitchStack.c LoongArch64/InternalSwitchStack.c
LoongArch64/AsmCsr.S | GCC LoongArch64/AsmCsr.S | GCC
LoongArch64/IoCsr.S | GCC
LoongArch64/GetInterruptState.S | GCC LoongArch64/GetInterruptState.S | GCC
LoongArch64/EnableInterrupts.S | GCC LoongArch64/EnableInterrupts.S | GCC
LoongArch64/DisableInterrupts.S | GCC LoongArch64/DisableInterrupts.S | GCC

View File

@ -0,0 +1,120 @@
#------------------------------------------------------------------------------
#
# LoongArch ASM IO CSR operation functions
#
# Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX (IoCsrRead8)
ASM_GLOBAL ASM_PFX (IoCsrRead16)
ASM_GLOBAL ASM_PFX (IoCsrRead32)
ASM_GLOBAL ASM_PFX (IoCsrRead64)
ASM_GLOBAL ASM_PFX (IoCsrWrite8)
ASM_GLOBAL ASM_PFX (IoCsrWrite16)
ASM_GLOBAL ASM_PFX (IoCsrWrite32)
ASM_GLOBAL ASM_PFX (IoCsrWrite64)
#/**
# IO CSR read byte operation.
#
# @param[in] Select IO CSR read instruction select values.
#
# @return The return value of iocsrrd.b instruction.
#
#**/
ASM_PFX (IoCsrRead8):
iocsrrd.b $a0, $a0
jirl $zero, $ra, 0
#/**
# IO CSR read half word operation.
#
# @param[in] Select IO CSR read instruction select values.
#
# @return The return value of iocsrrd.h instruction.
#
#**/
ASM_PFX (IoCsrRead16):
iocsrrd.h $a0, $a0
jirl $zero, $ra, 0
#/**
# IO CSR read word operation.
#
# @param[in] Select IO CSR read instruction select values.
#
# @return The return value of iocsrrd.w instruction.
#
#**/
ASM_PFX (IoCsrRead32):
iocsrrd.w $a0, $a0
jirl $zero, $ra, 0
#/**
# IO CSR read double word operation. Only for LoongArch64.
#
# @param[in] Select IO CSR read instruction select values.
#
# @return The return value of iocsrrd.d instruction.
#
#**/
ASM_PFX (IoCsrRead64):
iocsrrd.d $a0, $a0
jirl $zero, $ra, 0
#/**
# IO CSR write byte operation.
#
# @param[in] Select IO CSR write instruction select values.
# @param[in] Value The iocsrwr.b will write the value.
#
# @return VOID.
#
#**/
ASM_PFX (IoCsrWrite8):
iocsrwr.b $a1, $a0
jirl $zero, $ra, 0
#/**
# IO CSR write half word operation.
#
# @param[in] Select IO CSR write instruction select values.
# @param[in] Value The iocsrwr.h will write the value.
#
# @return VOID.
#
#**/
ASM_PFX (IoCsrWrite16):
iocsrwr.h $a1, $a0
jirl $zero, $ra, 0
#/**
# IO CSR write word operation.
#
# @param[in] Select IO CSR write instruction select values.
# @param[in] Value The iocsrwr.w will write the value.
#
# @return VOID.
#
#**/
ASM_PFX (IoCsrWrite32):
iocsrwr.w $a1, $a0
jirl $zero, $ra, 0
#/**
# IO CSR write double word operation. Only for LoongArch64.
#
# @param[in] Select IO CSR write instruction select values.
# @param[in] Value The iocsrwr.d will write the value.
#
# @return VOID.
#
#**/
ASM_PFX (IoCsrWrite64):
iocsrwr.d $a1, $a0
jirl $zero, $ra, 0
.end