Hi Leif,

I think we need to look at the names.  I see a mix of
"Be" and "Swap".  We should pick one and use it 
consistently.

Mike

> -----Original Message-----
> From: Leif Lindholm [mailto:leif.lindh...@linaro.org]
> Sent: Friday, April 13, 2018 10:42 AM
> To: edk2-devel@lists.01.org
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>;
> Gao, Liming <liming....@intel.com>; Laszlo Ersek
> <ler...@redhat.com>; udit.ku...@nxp.com
> Subject: [PATCH] MdePkg: add big-endian MMIO
> BaseBeIoLib
> 
> When performing MMIO to a destination of the opposite
> endianness to the
> executing processor, this library provides automatic
> byte order reversal
> on inputs and outputs.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Leif Lindholm <leif.lindh...@linaro.org>
> ---
> 
> Udit, many apologies for this dragging out - back-to-
> back conferences,
> holidays, and lots of catching up.
> 
> This modified version introduces a single BeIoLib
> instance, backed by
> a source-file that could be used also for a
> hypothetical LeIoLib.
> There is no LeIoLib.h included though.
> 
> While this is arguably overengineered, I do feel
> reasonably strongly
> that code should be named for what it does, not for how
> it is used,
> and doing it this way lets me follow that rule.
> 
> I have not duplicated the .uni file together with the
> .inf, since
> this follows what is done in BaseIoLibIntrinsic.
> 
>  MdePkg/Include/Library/BeIoLib.h               | 376
> +++++++++++++++++++
>  MdePkg/Library/BaseIoLibSwap/BaseBeIoLib.inf   |  48
> +++
>  MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni |  23
> ++
>  MdePkg/Library/BaseIoLibSwap/IoLibSwap.c       | 477
> +++++++++++++++++++++++++
>  MdePkg/MdePkg.dec                              |   3 +
>  5 files changed, 927 insertions(+)
>  create mode 100644 MdePkg/Include/Library/BeIoLib.h
>  create mode 100644
> MdePkg/Library/BaseIoLibSwap/BaseBeIoLib.inf
>  create mode 100644
> MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni
>  create mode 100644
> MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> 
> diff --git a/MdePkg/Include/Library/BeIoLib.h
> b/MdePkg/Include/Library/BeIoLib.h
> new file mode 100644
> index 0000000000..5b2dc1a8e1
> --- /dev/null
> +++ b/MdePkg/Include/Library/BeIoLib.h
> @@ -0,0 +1,376 @@
> +/** @file
> +  Provide byte-swapping services to access MMIO
> registers.
> +
> +Copyright (c) 2006 - 2012, Intel Corporation. All
> rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights
> reserved.<BR>
> +Copyright (c) 2018, Linaro ltd. All rights
> reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and
> conditions of the BSD License
> +which accompanies this distribution.  The full text of
> the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN
> "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __BE_IO_LIB_H__
> +#define __BE_IO_LIB_H__
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness.
> +
> +  Reads the 16-bit MMIO register specified by Address.
> +  The 16-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> +  IN      UINTN                     Address
> +  );
> +
> +/**
> +  Writes a 16-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 16-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> the original Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +  @return Value.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    Value
> +  );
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 16-bit MMIO
> register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 16-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioOr16 (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    OrData
> +  );
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 16-bit MMIO
> register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 16-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAnd16 (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    AndData
> +  );
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 16-bit MMIO
> +  register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 16-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioAndThenOr16 (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    AndData,
> +  IN      UINT16                    OrData
> +  );
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness.
> +
> +  Reads the 32-bit MMIO register specified by Address.
> +  The 32-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> +  IN      UINTN                     Address
> +  );
> +
> +/**
> +  Writes a 32-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 32-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> the original Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +  @return Value.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    Value
> +  );
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 32-bit MMIO
> register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 32-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioOr32 (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    OrData
> +  );
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 32-bit MMIO
> register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 32-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAnd32 (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    AndData
> +  );
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 32-bit MMIO
> +  register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte reverses the read
> +  value, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 32-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioAndThenOr32 (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    AndData,
> +  IN      UINT32                    OrData
> +  );
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness.
> +
> +  Reads the 64-bit MMIO register specified by Address.
> +  The 64-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> +  IN      UINTN                     Address
> +  );
> +
> +/**
> +  Writes a 64-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 64-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioWrite64 (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    Value
> +  );
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 64-bit MMIO
> register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 64-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the
> +  MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioOr64 (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    OrData
> +  );
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 64-bit MMIO
> register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte-reverses the read
> +  value, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 64-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAnd64 (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    AndData
> +  );
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 64-bit MMIO
> +  register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 64-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioAndThenOr64 (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    AndData,
> +  IN      UINT64                    OrData
> +  );
> +
> +#endif
> diff --git
> a/MdePkg/Library/BaseIoLibSwap/BaseBeIoLib.inf
> b/MdePkg/Library/BaseIoLibSwap/BaseBeIoLib.inf
> new file mode 100644
> index 0000000000..fbd68b9929
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibSwap/BaseBeIoLib.inf
> @@ -0,0 +1,48 @@
> +## @file
> +#  Byte swapping I/O Library.
> +#
> +#  Byte swapping I/O Library for all architectures.
> Only MMIO supported. I/O
> +#  accesses take place through the normal IoLib, but
> values read and written
> +#  are byte-reversed to interact with peripherals of
> non-native endianness.
> +#
> +#  Copyright (c) 2007 - 2015, Intel Corporation. All
> rights reserved.<BR>
> +#  Portions copyright (c) 2008 - 2009, Apple Inc. All
> rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights
> reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and
> conditions of the BSD License
> +#  which accompanies this distribution. The full text
> of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php.
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON
> AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001a
> +  BASE_NAME                      = BaseBeIoLib
> +  MODULE_UNI_FILE                = BaseIoLibSwap.uni
> +  FILE_GUID                      = 073c3fbd-ff0d-41b6-
> a209-1e42fd2a3bab
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = BeIoLib
> +
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 EBC IPF
> ARM AARCH64
> +#
> +
> +[Sources]
> +  IoLibSwap.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  IoLib
> +
> +[BuildOptions]
> +  GCC:*_*_*_CC_FLAGS             = -D
> FUNCTION_PREFIX=Be
> +  INTEL:*_*_*_CC_FLAGS           = /D
> FUNCTION_PREFIX=Be
> +  MSFT:*_*_*_CC_FLAGS            = /D
> FUNCTION_PREFIX=Be
> diff --git
> a/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni
> b/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni
> new file mode 100644
> index 0000000000..e35b4abef7
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni
> @@ -0,0 +1,23 @@
> +// /** @file
> +// Byte swapping I/O Library.
> +//
> +// Byte swapping I/O Library for all architectures.
> Only MMIO supported. I/O
> +// accesses take place through the normal IoLib, but
> values read and written
> +// are byte-reversed to interact with peripherals of
> non-native endianness.
> +//
> +// Copyright (c) 2018, Linaro ltd. All rights
> reserved.<BR>
> +//
> +// This program and the accompanying materials
> +// are licensed and made available under the terms and
> conditions of the BSD License
> +// which accompanies this distribution. The full text
> of the license may be found at
> +// http://opensource.org/licenses/bsd-license.php.
> +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON
> AN "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +//
> +// **/
> +
> +
> +#string STR_MODULE_ABSTRACT             #language en-
> US "Byte swapping I/O Library"
> +
> +#string STR_MODULE_DESCRIPTION          #language en-
> US "Byte swapping I/O Library for all architectures.
> Only MMIO supported. I/O accesses take place through
> the normal IoLib, but values read and written are byte-
> reversed to interact with peripherals of non-native
> endianness."
> +
> diff --git a/MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> b/MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> new file mode 100644
> index 0000000000..f4f49f72d2
> --- /dev/null
> +++ b/MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> @@ -0,0 +1,477 @@
> +/** @file
> +  Provide byte-swapping services to access MMIO
> registers.
> +
> +Copyright (c) 2006 - 2012, Intel Corporation. All
> rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights
> reserved.<BR>
> +Copyright (c) 2018, Linaro ltd. All rights
> reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and
> conditions of the BSD License
> +which accompanies this distribution.  The full text of
> the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN
> "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Library/BaseLib.h>
> +#include <Library/IoLib.h>
> +
> +#define __CONCATENATE(a, b) a ## b
> +#define _CONCATENATE(a, b) __CONCATENATE(a, b)
> +#define ADD_PREFIX(name) _CONCATENATE
> (FUNCTION_PREFIX, name)
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness.
> +
> +  Reads the 16-bit MMIO register specified by Address.
> +  The 16-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +ADD_PREFIX (MmioRead16) (
> +  IN      UINTN                     Address
> +  )
> +{
> +  return SwapBytes16 (MmioRead16 (Address));
> +}
> +
> +/**
> +  Writes a 16-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 16-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> the original Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +  @return Value.
> +
> +**/
> +UINT16
> +EFIAPI
> +ADD_PREFIX (MmioWrite16) (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    Value
> +  )
> +{
> +  (VOID) MmioWrite16 (Address, SwapBytes16 (Value));
> +
> +  return Value;
> +}
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 16-bit MMIO
> register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 16-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +ADD_PREFIX (MmioOr16) (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    OrData
> +  )
> +{
> +  UINT16 Value;
> +
> +  Value = ADD_PREFIX (MmioRead16) (Address);
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite16) (Address, Value);
> +}
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 16-bit MMIO
> register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 16-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +ADD_PREFIX (MmioAnd16) (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    AndData
> +  )
> +{
> +  UINT16 Value;
> +
> +  Value = ADD_PREFIX (MmioRead16) (Address);
> +  Value &= AndData;
> +
> +  return ADD_PREFIX (MmioWrite16) (Address, Value);
> +}
> +
> +/**
> +  Reads a 16-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 16-bit MMIO
> +  register.
> +
> +  Reads the 16-bit MMIO register specified by Address,
> byte reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 16-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +ADD_PREFIX (MmioAndThenOr16) (
> +  IN      UINTN                     Address,
> +  IN      UINT16                    AndData,
> +  IN      UINT16                    OrData
> +  )
> +{
> +  UINT16 Value;
> +
> +  Value = ADD_PREFIX (MmioRead16) (Address);
> +  Value &= AndData;
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite16) (Address, Value);
> +}
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness.
> +
> +  Reads the 32-bit MMIO register specified by Address.
> +  The 32-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +ADD_PREFIX (MmioRead32) (
> +  IN      UINTN                     Address
> +  )
> +{
> +  return SwapBytes32 (MmioRead32 (Address));
> +}
> +
> +/**
> +  Writes a 32-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 32-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> the original Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +  @return Value.
> +
> +**/
> +UINT32
> +EFIAPI
> +ADD_PREFIX (MmioWrite32) (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    Value
> +  )
> +{
> +  (VOID) MmioWrite32 (Address, SwapBytes32 (Value));
> +
> +  return Value;
> +}
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 32-bit MMIO
> register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 32-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +ADD_PREFIX (MmioOr32) (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    OrData
> +  )
> +{
> +  UINT32 Value;
> +
> +  Value = ADD_PREFIX (MmioRead32) (Address);
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite32) (Address, Value);
> +}
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 32-bit MMIO
> register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 32-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +ADD_PREFIX (MmioAnd32) (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    AndData
> +  )
> +{
> +  UINT32 Value;
> +
> +  Value = ADD_PREFIX (MmioRead32) (Address);
> +  Value &= AndData;
> +
> +  return ADD_PREFIX (MmioWrite32) (Address, Value);
> +}
> +
> +/**
> +  Reads a 32-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 32-bit MMIO
> +  register.
> +
> +  Reads the 32-bit MMIO register specified by Address,
> byte reverses the read
> +  value, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 32-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +ADD_PREFIX (MmioAndThenOr32) (
> +  IN      UINTN                     Address,
> +  IN      UINT32                    AndData,
> +  IN      UINT32                    OrData
> +  )
> +{
> +  UINT32 Value;
> +
> +  Value = ADD_PREFIX (MmioRead32) (Address);
> +  Value &= AndData;
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite32) (Address, Value);
> +}
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness.
> +
> +  Reads the 64-bit MMIO register specified by Address.
> +  The 64-bit read value is returned in reversed byte
> order.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to read.
> +
> +  @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +ADD_PREFIX (MmioRead64) (
> +  IN      UINTN                     Address
> +  )
> +{
> +  return SwapBytes64 (MmioRead64 (Address));
> +}
> +
> +/**
> +  Writes a 64-bit MMIO register of opposite
> endianness.
> +
> +  Writes the 64-bit MMIO register specified by Address
> with the byte-reversed
> +  version of the value specified by Value and returns
> Value.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  Value   The value to write to the MMIO
> register.
> +
> +**/
> +UINT64
> +EFIAPI
> +ADD_PREFIX (MmioWrite64) (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    Value
> +  )
> +{
> +  (VOID) MmioWrite64 (Address, SwapBytes64 (Value));
> +
> +  return Value;
> +}
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise OR,
> +  and writes the result back to the 64-bit MMIO
> register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte reverses the read
> +  result, performs a bitwise OR between the read
> result and the value specified
> +  by OrData, byte-reverses the result, and writes the
> result to the 64-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the
> +  MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  OrData  The value to OR with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +ADD_PREFIX (MmioOr64) (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    OrData
> +  )
> +{
> +  UINT64 Value;
> +
> +  Value = ADD_PREFIX (MmioRead64) (Address);
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite64) (Address, Value);
> +}
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise AND,
> +  and writes the result back to the 64-bit MMIO
> register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte-reverses the read
> +  value, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, byte-reverses the result, and writes the
> result to the 64-bit MMIO
> +  register specified by Address. The pre-reversal
> value written to the MMIO
> +  register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +ADD_PREFIX (MmioAnd64) (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    AndData
> +  )
> +{
> +  UINT64 Value;
> +
> +  Value = ADD_PREFIX (MmioRead64) (Address);
> +  Value &= AndData;
> +
> +  return ADD_PREFIX (MmioWrite64) (Address, Value);
> +}
> +
> +/**
> +  Reads a 64-bit MMIO register of opposite endianness,
> performs a bitwise AND
> +  followed by a bitwise OR, and writes the result back
> to the 64-bit MMIO
> +  register.
> +
> +  Reads the 64-bit MMIO register specified by Address,
> byte-reverses the read
> +  result, performs a bitwise AND between the read
> result and the value specified
> +  by AndData, performs a bitwise OR between the result
> of the AND operation and
> +  the value specified by OrData, byte-reverses the
> result, and writes the result
> +  to the 64-bit MMIO register specified by Address.
> The pre-reversal value
> +  written to the MMIO register is returned.
> +  This function must guarantee that all MMIO read and
> write
> +  operations are serialized.
> +
> +  @param  Address The MMIO register to write.
> +  @param  AndData The value to AND with the read value
> from the MMIO register.
> +  @param  OrData  The value to OR with the result of
> the AND operation.
> +
> +  @return The value written back to the MMIO register.
> +
> +**/
> +UINT64
> +EFIAPI
> +ADD_PREFIX (MmioAndThenOr64) (
> +  IN      UINTN                     Address,
> +  IN      UINT64                    AndData,
> +  IN      UINT64                    OrData
> +  )
> +{
> +  UINT64 Value;
> +
> +  Value = ADD_PREFIX (MmioRead64) (Address);
> +  Value &= AndData;
> +  Value |= OrData;
> +
> +  return ADD_PREFIX (MmioWrite64) (Address, Value);
> +}
> diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
> index 0e64f22f4a..ae7c8dfa11 100644
> --- a/MdePkg/MdePkg.dec
> +++ b/MdePkg/MdePkg.dec
> @@ -160,6 +160,9 @@ [LibraryClasses]
>    ##  @libraryclass  Provide services to access I/O
> Ports and MMIO registers.
>    IoLib|Include/Library/IoLib.h
> 
> +  ##  @libraryclass  Provide big-endian services to
> access MMIO registers.
> +  BeIoLib|Include/Library/BeIoLib.h
> +
>    ##  @libraryclass  Provide services to create, get
> and update HSTI table in AIP protocol.
>    HstiLib|Include/Library/HstiLib.h
> 
> --
> 2.11.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to