Hi Ard. 

> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Wednesday, February 21, 2018 11:39 PM
> To: Leif Lindholm <leif.lindh...@linaro.org>
> Cc: edk2-devel@lists.01.org; Michael D Kinney
> <michael.d.kin...@intel.com>; Liming Gao <liming....@intel.com>;
> Meenakshi Aggarwal <meenakshi.aggar...@nxp.com>; Udit Kumar
> <udit.ku...@nxp.com>; Varun Sethi <v.se...@nxp.com>
> Subject: Re: [RFC PATCH] MdePkg: add byte-swapping MMIO BaseIoLibSwap
> 
> On 21 February 2018 at 15:25, Leif Lindholm <leif.lindh...@linaro.org>
> wrote:
> > 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.
> >
> 
> As pointed out by Laszlo, 'opposite' is ill defined, as it is not a property 
> of
> the device nor is it a property of the CPU/platform (even though UEFI is
> likely to remain little endian for the foreseeable
> future)

Is this assumption, of part of UEFI specs ?
 
> So BigEndianIoLib seems more appropriate as a library class, and it does
> need to be a separate class so that a single driver can perform both LE and
> BE MMIO (which, as was pointed out, is the case for any driver that drives a
> BE MMIO peripheral but uses LE MMIO for serial port DEBUG output)

Yes, We need two lib here, we can discuss on name.

Thanks 
Udit 

> 
> 
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Leif Lindholm <leif.lindh...@linaro.org>
> > ---
> >
> > As promised in the dark and distant past:
> >
> https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
> w
> > .mail-archive.com%2Fedk2-
> devel%40lists.01.org%2Fmsg33447.html&data=02%
> >
> 7C01%7Cudit.kumar%40nxp.com%7C503430fe81e544d1df8b08d57956346f%7
> C686ea
> >
> 1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C636548333521065509&sdata=
> AR1g64t
> > C4ag8V18MYGN5bimkXe7FQj%2BEYbzONr%2BLFXM%3D&reserved=0
> >
> > This starts out as a clone of MdePkg/Include/Library/IoLib.h,
> > implementing simple wrappers that depend on an IoLib instance to
> > perform any actual accesses.
> >
> > Comments are mostly nonsense, since they've not been changed from
> > their originals in IoLib.h. If people feel this library is a sensible
> > approach, I'll fix that up before I send a v1.
> >
> > I have explicitly excluded:
> > - non-MMIO accesses (could you really end up with mixed endianness in
> >   such a system?)
> > - bitfields (would either require duplicating code or merging this all
> >   into the BaseIoLibIntrinsic module, which is already a bit on the
> >   bloated side)
> > - buffers operations (let's avoid those until we find we need them)
> >
> > MdePkg/Include/Library/IoLibSwap.h             | 395 ++++++++++++++++++++
> 
> If you create a library class, please declare it in the .dec file
> 
> >  MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf |  44 +++
> > MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni |  23 ++
> >  MdePkg/Library/BaseIoLibSwap/IoLibSwap.c       | 491
> +++++++++++++++++++++++++
> >  MdePkg/MdePkg.dec                              |   3 +
> >  MdePkg/MdePkg.dsc                              |   1 +
> >  6 files changed, 957 insertions(+)
> >  create mode 100644 MdePkg/Include/Library/IoLibSwap.h
> >  create mode 100644 MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf
> >  create mode 100644 MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni
> >  create mode 100644 MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> >
> > diff --git a/MdePkg/Include/Library/IoLibSwap.h
> > b/MdePkg/Include/Library/IoLibSwap.h
> > new file mode 100644
> > index 0000000000..f13c8d86e7
> > --- /dev/null
> > +++ b/MdePkg/Include/Library/IoLibSwap.h
> > @@ -0,0 +1,395 @@
> > +/** @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
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fope
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cudit.kumar%40
> >
> +nxp.com%7C503430fe81e544d1df8b08d57956346f%7C686ea1d3bc2b4c6fa9
> 2cd99c
> >
> +5c301635%7C0%7C0%7C636548333521065509&sdata=gW0hj%2FR0rTXl%2Bl
> Jr6mAiu
> > +aGSy7ZHoxOiy35WIRO26JE%3D&reserved=0
> > +
> > +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 __IO_LIB_SWAP_H__
> > +#define __IO_LIB_SWAP_H__
> > +
> > +/**
> > +  Reads a 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address. The 16-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +SwapMmioRead16 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +/**
> > +  Writes a 16-bit MMIO register.
> > +
> > +  Writes the 16-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +  @return Value.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +SwapMmioWrite16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Value
> > +  );
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 16-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    OrData
> > +  );
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 16-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    AndData
> > +  );
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, 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, 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, and writes the result
> > + to the 16-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    AndData,
> > +  IN      UINT16                    OrData
> > +  );
> > +
> > +/**
> > +  Reads a 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address. The 32-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +SwapMmioRead32 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +/**
> > +  Writes a 32-bit MMIO register.
> > +
> > +  Writes the 32-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +  @return Value.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +SwapMmioWrite32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Value
> > +  );
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 32-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    OrData
> > +  );
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 32-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    AndData
> > +  );
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, 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, 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, and writes the result
> > + to the 32-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    AndData,
> > +  IN      UINT32                    OrData
> > +  );
> > +
> > +/**
> > +  Reads a 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address. The 64-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +SwapMmioRead64 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +/**
> > +  Writes a 64-bit MMIO register.
> > +
> > +  Writes the 64-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +SwapMmioWrite64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Value
> > +  );
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 64-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    OrData
> > +  );
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 64-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    AndData
> > +  );
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, 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, 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, and writes the result
> > + to the 64-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    AndData,
> > +  IN      UINT64                    OrData
> > +  );
> > +
> > +#endif
> > +
> > diff --git a/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf
> > b/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf
> > new file mode 100644
> > index 0000000000..59d774dc97
> > --- /dev/null
> > +++ b/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf
> > @@ -0,0 +1,44 @@
> > +## @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 #
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fopen
> source.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cudit.kumar%40nxp.com%7C503430fe81e544d
> 1df8b08d57956346f%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C6
> 36548333521065509&sdata=gW0hj%2FR0rTXl%2BlJr6mAiuaGSy7ZHoxOiy35W
> IRO26JE%3D&reserved=0.
> > +#  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                      = BaseIoLibSwap
> > +  MODULE_UNI_FILE                = BaseIoLibSwap.uni
> > +  FILE_GUID                      = 073c3fbd-ff0d-41b6-a209-1e42fd2a3bab
> > +  MODULE_TYPE                    = BASE
> > +  VERSION_STRING                 = 1.0
> > +  LIBRARY_CLASS                  = IoLibSwap
> > +
> > +
> > +#
> > +#  VALID_ARCHITECTURES           = IA32 X64 EBC IPF ARM AARCH64
> > +#
> > +
> > +[Sources]
> > +  IoLibSwap.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +
> > +[LibraryClasses]
> > +  BaseLib
> > +#  DebugLib
> > +  IoLib
> > 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 //
> https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fopen
> source.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cudit.kumar%40nxp.com%7C503430fe81e544d
> 1df8b08d57956346f%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C6
> 36548333521065509&sdata=gW0hj%2FR0rTXl%2BlJr6mAiuaGSy7ZHoxOiy35W
> IRO26JE%3D&reserved=0.
> > +// 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..6eb675de20
> > --- /dev/null
> > +++ b/MdePkg/Library/BaseIoLibSwap/IoLibSwap.c
> > @@ -0,0 +1,491 @@
> > +/** @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
> >
> +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fope
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cudit.kumar%40
> >
> +nxp.com%7C503430fe81e544d1df8b08d57956346f%7C686ea1d3bc2b4c6fa9
> 2cd99c
> >
> +5c301635%7C0%7C0%7C636548333521065509&sdata=gW0hj%2FR0rTXl%2Bl
> Jr6mAiu
> > +aGSy7ZHoxOiy35WIRO26JE%3D&reserved=0
> > +
> > +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>
> > +
> > +/**
> > +  Reads a 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address. The 16-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +SwapMmioRead16 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  return SwapBytes16 (MmioRead16 (Address)); }
> > +
> > +/**
> > +  Writes a 16-bit MMIO register.
> > +
> > +  Writes the 16-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +  @return Value.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +SwapMmioWrite16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Value
> > +  )
> > +{
> > +  (VOID) MmioWrite16 (Address, SwapBytes16 (Value));
> > +
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 16-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    OrData
> > +  )
> > +{
> > +  UINT16 Value;
> > +
> > +  Value = SwapMmioRead16 (Address);
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite16 (Address, Value); }
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 16-bit MMIO register.
> > +
> > +  Reads the 16-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 16-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    AndData
> > +  )
> > +{
> > +  UINT16 Value;
> > +
> > +  Value = SwapMmioRead16 (Address);
> > +  Value &= AndData;
> > +
> > +  return SwapMmioWrite16 (Address, Value); }
> > +
> > +/**
> > +  Reads a 16-bit MMIO register, 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, 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, and writes the result
> > + to the 16-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 16-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    AndData,
> > +  IN      UINT16                    OrData
> > +  )
> > +{
> > +  UINT16 Value;
> > +
> > +  Value = SwapMmioRead16 (Address);
> > +  Value &= AndData;
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite16 (Address, Value); }
> > +
> > +/**
> > +  Reads a 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address. The 32-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +SwapMmioRead32 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  return SwapBytes32 (MmioRead32 (Address)); }
> > +
> > +/**
> > +  Writes a 32-bit MMIO register.
> > +
> > +  Writes the 32-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +  @return Value.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +SwapMmioWrite32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Value
> > +  )
> > +{
> > +  (VOID) MmioWrite32 (Address, SwapBytes32 (Value));
> > +
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 32-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    OrData
> > +  )
> > +{
> > +  UINT32 Value;
> > +
> > +  Value = SwapMmioRead32 (Address);
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite32 (Address, Value); }
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 32-bit MMIO register.
> > +
> > +  Reads the 32-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 32-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    AndData
> > +  )
> > +{
> > +  UINT32 Value;
> > +
> > +  Value = SwapMmioRead32 (Address);
> > +  Value &= AndData;
> > +
> > +  return SwapMmioWrite32 (Address, Value); }
> > +
> > +/**
> > +  Reads a 32-bit MMIO register, 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, 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, and writes the result
> > + to the 32-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 32-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    AndData,
> > +  IN      UINT32                    OrData
> > +  )
> > +{
> > +  UINT32 Value;
> > +
> > +  Value = SwapMmioRead32 (Address);
> > +  Value &= AndData;
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite32 (Address, Value); }
> > +
> > +/**
> > +  Reads a 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address. The 64-bit
> > + read value is  returned. This function must guarantee that all MMIO
> > + read and write  operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +SwapMmioRead64 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  return SwapBytes64 (MmioRead64 (Address)); }
> > +
> > +/**
> > +  Writes a 64-bit MMIO register.
> > +
> > +  Writes the 64-bit MMIO register specified by Address with the value
> > + specified  by Value and returns Value. This function must guarantee
> > + that all MMIO read  and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +SwapMmioWrite64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Value
> > +  )
> > +{
> > +  (VOID) MmioWrite64 (Address, SwapBytes64 (Value));
> > +
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, performs a bitwise OR, and writes the
> > +  result back to the 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address, performs a
> > + bitwise  OR between the read result and the value specified by
> > + OrData, and  writes the result to the 64-bit MMIO register specified
> > + by Address. The value  written to the MMIO register is returned.
> > + This function must guarantee that  all MMIO read and write operations
> are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioOr64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    OrData
> > +  )
> > +{
> > +  UINT64 Value;
> > +
> > +  Value = SwapMmioRead64 (Address);
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite64 (Address, Value); }
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, performs a bitwise AND, and writes
> > +the result
> > +  back to the 64-bit MMIO register.
> > +
> > +  Reads the 64-bit MMIO register specified by Address, performs a
> > + bitwise AND  between the read result and the value specified by
> > + AndData, and writes the  result to the 64-bit MMIO register
> > + specified by Address. The value written to  the MMIO register is
> > + returned. This function must guarantee that all MMIO  read and write
> operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAnd64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    AndData
> > +  )
> > +{
> > +  UINT64 Value;
> > +
> > +  Value = SwapMmioRead64 (Address);
> > +  Value &= AndData;
> > +
> > +  return SwapMmioWrite64 (Address, Value); }
> > +
> > +/**
> > +  Reads a 64-bit MMIO register, 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, 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, and writes the result
> > + to the 64-bit MMIO register specified by  Address. The value written
> > + to the MMIO register is returned. This function  must guarantee that all
> MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +  If Address is not aligned on a 64-bit boundary, then ASSERT().
> > +
> > +  @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
> > +SwapMmioAndThenOr64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    AndData,
> > +  IN      UINT64                    OrData
> > +  )
> > +{
> > +  UINT64 Value;
> > +
> > +  Value = SwapMmioRead64 (Address);
> > +  Value &= AndData;
> > +  Value |= OrData;
> > +
> > +  return SwapMmioWrite64 (Address, Value); }
> > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index
> > 0e64f22f4a..98016f47e9 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 byte-swapping services to access MMIO
> registers.
> > +  IoLibSwap|Include/Library/IoLibSwap.h
> > +
> >    ##  @libraryclass  Provide services to create, get and update HSTI table 
> > in
> AIP protocol.
> >    HstiLib|Include/Library/HstiLib.h
> >
> > diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index
> > 60efd722e9..a2f2696394 100644
> > --- a/MdePkg/MdePkg.dsc
> > +++ b/MdePkg/MdePkg.dsc
> > @@ -60,6 +60,7 @@ [Components]
> >    MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
> >    MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
> >
> > MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib
> > .inf
> > +  MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf
> >    MdePkg/Library/BaseLib/BaseLib.inf
> >    MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
> >
> >
> MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollect
> > ionRedBlackTreeLib.inf
> > --
> > 2.11.0
> >
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to