CC maintainers

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Abner Chang
> Sent: Monday, September 23, 2019 8:32 AM
> To: devel@edk2.groups.io
> Cc: Chang, Abner (HPS SW/FW Technologist) <abner.ch...@hpe.com>
> Subject: [edk2-devel] [edk2-staging/RISC-V-V2 PATCH v2 12/29]
> MdePkg/BaseSynchronizationLib: RISC-V cache related code.
> 
> Support RISC-V cache related functions.
> 
> Signed-off-by: Abner Chang <abner.ch...@hpe.com>
> ---
>  .../BaseSynchronizationLib.inf                     |   6 +
>  .../RiscV64/Synchronization.c                      | 183 
> +++++++++++++++++++++
>  .../RiscV64/SynchronizationAsm.S                   |  78 +++++++++
>  3 files changed, 267 insertions(+)
>  create mode 100644
> MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c
>  create mode 100644
> MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.S
> 
> diff --git
> a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
> b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
> index 446bc19..c16ef9d 100755
> --- a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
> +++ b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
> @@ -3,6 +3,7 @@
>  #
>  #  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>  #
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +#  Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development
> +LP. All rights reserved.<BR>
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent  # @@ -78,6 +79,11 @@
>    AArch64/Synchronization.S     | GCC
>    AArch64/Synchronization.asm   | MSFT
> 
> +[Sources.RISCV64]
> +  Synchronization.c
> +  RiscV64/Synchronization.c  | GCC
> +  RiscV64/SynchronizationAsm.S
> +
>  [Packages]
>    MdePkg/MdePkg.dec
> 
> diff --git
> a/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c
> b/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c
> new file mode 100644
> index 0000000..e210b74
> --- /dev/null
> +++ b/MdePkg/Library/BaseSynchronizationLib/RiscV64/Synchronization.c
> @@ -0,0 +1,183 @@
> +/** @file
> +  Implementation of synchronization functions on RISC-V
> +
> +  Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development LP.
> + All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent **/
> +
> +#include <Library/DebugLib.h>
> +
> +UINT32
> +SyncCompareExchange32 (
> +  IN volatile UINT32           *Value,
> +  IN UINT32                    CompareValue,
> +  IN UINT32                    ExchangeValue
> +);
> +
> +UINT64
> +SyncCompareExchange64 (
> +  IN volatile UINT64           *Value,
> +  IN UINT64                    CompareValue,
> +  IN UINT64                    ExchangeValue
> +);
> +
> +UINT32
> +SyncSyncIncrement32 (
> +  IN volatile UINT32           *Value
> +  );
> +
> +UINT32
> +SyncSyncDecrement32 (
> +  IN volatile UINT32           *Value
> +  );
> +
> +/**
> +  Performs an atomic compare exchange operation on a 16-bit
> +  unsigned integer.
> +
> +  Performs an atomic compare exchange operation on the 16-bit  unsigned
> + integer specified by Value.  If Value is equal to  CompareValue, then
> + Value is set to ExchangeValue and  CompareValue is returned.  If Value
> + is not equal to  CompareValue, then Value is returned. The compare
> + exchange  operation must be performed using MP safe mechanisms.
> +
> +  @param  Value         A pointer to the 16-bit value for the
> +                        compare exchange operation.
> +  @param  CompareValue  16-bit value used in compare operation.
> +  @param  ExchangeValue 16-bit value used in exchange operation.
> +
> +  @return The original *Value before exchange.
> +
> +**/
> +UINT16
> +EFIAPI
> +InternalSyncCompareExchange16 (
> +  IN      volatile UINT16           *Value,
> +  IN      UINT16                    CompareValue,
> +  IN      UINT16                    ExchangeValue
> +  )
> +{
> +  DEBUG((DEBUG_ERROR, "%a:RISC-V does not support 16-bit AMO
> +operation\n", __FUNCTION__));
> +  ASSERT (FALSE);
> +  return 0;
> +}
> +
> +/**
> +  Performs an atomic compare exchange operation on a 32-bit
> +  unsigned integer.
> +
> +  Performs an atomic compare exchange operation on the 32-bit  unsigned
> + integer specified by Value.  If Value is equal to  CompareValue, then
> + Value is set to ExchangeValue and  CompareValue is returned.  If Value
> + is not equal to  CompareValue, then Value is returned. The compare
> + exchange  operation must be performed using MP safe mechanisms.
> +
> +  @param  Value         A pointer to the 32-bit value for the
> +                        compare exchange operation.
> +  @param  CompareValue  32-bit value used in compare operation.
> +  @param  ExchangeValue 32-bit value used in exchange operation.
> +
> +  @return The original *Value before exchange.
> +
> +**/
> +UINT32
> +EFIAPI
> +InternalSyncCompareExchange32 (
> +  IN      volatile UINT32           *Value,
> +  IN      UINT32                    CompareValue,
> +  IN      UINT32                    ExchangeValue
> +  )
> +{
> +
> +  if (((UINTN)Value % sizeof (UINT32)) != 0) {
> +      DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural
> address.\n", __FUNCTION__));
> +      ASSERT (FALSE);
> +  }
> +  return SyncCompareExchange32(Value, CompareValue, ExchangeValue); }
> +
> +/**
> +  Performs an atomic compare exchange operation on a 64-bit unsigned
> integer.
> +
> +  Performs an atomic compare exchange operation on the 64-bit unsigned
> + integer specified  by Value.  If Value is equal to CompareValue, then
> + Value is set to ExchangeValue and  CompareValue is returned.  If Value is
> not equal to CompareValue, then Value is returned.
> +  The compare exchange operation must be performed using MP safe
> mechanisms.
> +
> +  @param  Value         A pointer to the 64-bit value for the compare 
> exchange
> +                        operation.
> +  @param  CompareValue  64-bit value used in compare operation.
> +  @param  ExchangeValue 64-bit value used in exchange operation.
> +
> +  @return The original *Value before exchange.
> +
> +**/
> +UINT64
> +EFIAPI
> +InternalSyncCompareExchange64 (
> +  IN      volatile UINT64           *Value,
> +  IN      UINT64                    CompareValue,
> +  IN      UINT64                    ExchangeValue
> +  )
> +{
> +  if (((UINTN)Value % sizeof (UINT64)) != 0) {
> +      DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural
> address.\n", __FUNCTION__));
> +      ASSERT (FALSE);
> +  }
> +  return SyncCompareExchange64 (Value, CompareValue, ExchangeValue); }
> +
> +/**
> +  Performs an atomic increment of an 32-bit unsigned integer.
> +
> +  Performs an atomic increment of the 32-bit unsigned integer specified
> + by  Value and returns the incremented value. The increment operation
> + must be  performed using MP safe mechanisms. The state of the return
> + value is not  guaranteed to be MP safe.
> +
> +  @param  Value A pointer to the 32-bit value to increment.
> +
> +  @return The incremented value.
> +
> +**/
> +UINT32
> +EFIAPI
> +InternalSyncIncrement (
> +  IN volatile UINT32 *Value
> +  )
> +{
> +  if (((UINTN)Value % sizeof (UINT32)) != 0) {
> +      DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural
> address.\n", __FUNCTION__));
> +      ASSERT (FALSE);
> +  }
> +  return SyncSyncIncrement32 (Value);
> +}
> +
> +/**
> +  Performs an atomic decrement of an 32-bit unsigned integer.
> +
> +  Performs an atomic decrement of the 32-bit unsigned integer specified
> + by  Value and returns the decrement value. The decrement operation
> + must be  performed using MP safe mechanisms. The state of the return
> + value is not  guaranteed to be MP safe.
> +
> +  @param  Value A pointer to the 32-bit value to decrement.
> +
> +  @return The decrement value.
> +
> +**/
> +UINT32
> +EFIAPI
> +InternalSyncDecrement (
> +  IN volatile UINT32 *Value
> +  )
> +{
> +  if (((UINTN)Value % sizeof (UINT32)) != 0) {
> +      DEBUG((DEBUG_ERROR, "%a:Value pointer must aligned at natural
> address.\n", __FUNCTION__));
> +      ASSERT (FALSE);
> +  }
> +  return SyncSyncDecrement32 (Value);
> +}
> diff --git
> a/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.S
> b/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.S
> new file mode 100644
> index 0000000..943e274
> --- /dev/null
> +++
> b/MdePkg/Library/BaseSynchronizationLib/RiscV64/SynchronizationAsm.S
> @@ -0,0 +1,78 @@
> +//---------------------------------------------------------------------
> +---------
> +//
> +// RISC-V synchronization functions.
> +//
> +// Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development
> +LP. All rights reserved.<BR> // // SPDX-License-Identifier:
> +BSD-2-Clause-Patent //
> +//---------------------------------------------------------------------
> +---------
> +#include <Base.h>
> +
> +.data
> +
> +.text
> +.align 3
> +
> +.global ASM_PFX(SyncCompareExchange32)
> +.global ASM_PFX(SyncCompareExchange64)
> +.global ASM_PFX(SyncSyncIncrement32)
> +.global ASM_PFX(SyncSyncDecrement32)
> +
> +//
> +// ompare and xchange a 32-bit value.
> +//
> +// @param a0 : Pointer to 32-bit value.
> +// @param a1 : Compare value.
> +// @param a2 : Exchange value.
> +//
> +ASM_PFX (SyncCompareExchange32):
> +    lr.w  a3, (a0)        // Load the value from a0 and make
> +                          // the reservation of address.
> +    bne   a3, a1, exit
> +    sc.w  a3, a2, (a0)    // Write the value back to the address.
> +    mv    a3, a1
> +exit:
> +    mv    a0, a3
> +    ret
> +
> +.global ASM_PFX(SyncCompareExchange64)
> +
> +//
> +// Compare and xchange a 64-bit value.
> +//
> +// @param a0 : Pointer to 64-bit value.
> +// @param a1 : Compare value.
> +// @param a2 : Exchange value.
> +//
> +ASM_PFX (SyncCompareExchange64):
> +    lr.d  a3, (a0)       // Load the value from a0 and make
> +                         // the reservation of address.
> +    bne   a3, a1, exit
> +    sc.d  a3, a2, (a0)   // Write the value back to the address.
> +    mv    a3, a1
> +exit2:
> +    mv    a0, a3
> +    ret
> +
> +//
> +// Performs an atomic increment of an 32-bit unsigned integer.
> +//
> +// @param a0 : Pointer to 32-bit value.
> +//
> +ASM_PFX (SyncSyncIncrement32):
> +    li  a1, 1
> +    amoadd.w  a2, a1, (a0)
> +    mv  a0, a2
> +    ret
> +
> +//
> +// Performs an atomic decrement of an 32-bit unsigned integer.
> +//
> +// @param a0 : Pointer to 32-bit value.
> +//
> +ASM_PFX (SyncSyncDecrement32):
> +    li  a1, -1
> +    amoadd.w  a2, a1, (a0)
> +    mv  a0, a2
> +    ret
> --
> 2.7.4
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#47899): https://edk2.groups.io/g/devel/message/47899
Mute This Topic: https://groups.io/mt/34271983/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to