public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: Leif Lindholm <leif.lindholm@linaro.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	Laszlo Ersek <lersek@redhat.com>,
	"Gao, Liming" <liming.gao@intel.com>
Subject: Re: [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib
Date: Mon, 16 Apr 2018 14:10:52 +0000	[thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5B89CF92E@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <20180416100712.6v642ycksvmoffvt@bivouac.eciton.net>

Leif,

I agree that the opposite use case is a BE CPU
needing a LE operation. 

I think we only need a single lib class and lib
Instance that does the byte swap and we should
not use Le or Be in any of the names of the class,
instance, or APIs.  Just "Swap".

The 4 cases

* LE CPU, LE I/O.  Use BaseIoLib
* BE CPU, BE I/O.  Use BaseIoLib
* LE CPU, BE I/O.  Use BaseIoSwapLib
* BE CPU, LE I/O.  Use BaseIoSwapLib

Mike


> -----Original Message-----
> From: Leif Lindholm [mailto:leif.lindholm@linaro.org]
> Sent: Monday, April 16, 2018 3:07 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: edk2-devel@lists.01.org; Laszlo Ersek
> <lersek@redhat.com>; Gao, Liming <liming.gao@intel.com>
> Subject: Re: [edk2] [PATCH] MdePkg: add big-endian MMIO
> BaseBeIoLib
> 
> On Fri, Apr 13, 2018 at 11:32:35PM +0000, Kinney,
> Michael D wrote:
> > Leif,
> >
> > I am curious why a Swap class/instances is not
> sufficient.
> >
> > Currently EDK II follows the UEFI/PI specs, which for
> > all supported CPU architectures use little endian
> ABI.
> > The BaseIoLib follows the endianness of the CPU.  If
> > UEFI/PI added a CPU that was big endian, I would
> expect
> > BaseIoLib when built for that CPU would perform big
> endian
> > operations.
> >
> > Am I missing something?
> 
> If you did add a big-endian CPU, you could then find
> yourself in the
> exact opposite situation and require a little-endian
> i/o access
> library. Which would be implemented exactly as the
> contents of
> IoLibSwap.c.
> 
> The header file necessarily needs to be endianness-
> specific, and if
> the coding style had permitted functions in header
> files, my automatic
> reaction would have been to make all of these static
> inline helper
> functions (even with the code duplication).
> 
> /
>     Leif
> 
> > Mike
> >
> >
> > > -----Original Message-----
> > > From: edk2-devel [mailto:edk2-devel-
> > > bounces@lists.01.org] On Behalf Of Leif Lindholm
> > > Sent: Friday, April 13, 2018 12:32 PM
> > > To: Kinney, Michael D <michael.d.kinney@intel.com>
> > > Cc: edk2-devel@lists.01.org; Laszlo Ersek
> > > <lersek@redhat.com>; Gao, Liming
> <liming.gao@intel.com>
> > > Subject: Re: [edk2] [PATCH] MdePkg: add big-endian
> MMIO
> > > BaseBeIoLib
> > >
> > > On Fri, Apr 13, 2018 at 07:24:06PM +0000, Kinney,
> > > Michael D wrote:
> > > > 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.
> > >
> > > This was what I meant by the comments:
> > > ---
> > > 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.
> > > ---
> > >
> > > Clearly this is open for discussion, but the above
> is
> > > my opinion and
> > > the code intentionally reflects that.
> > >
> > > Regards,
> > >
> > > Leif
> > >
> > > > Mike
> > > >
> > > > > -----Original Message-----
> > > > > From: Leif Lindholm
> > > [mailto:leif.lindholm@linaro.org]
> > > > > Sent: Friday, April 13, 2018 10:42 AM
> > > > > To: edk2-devel@lists.01.org
> > > > > Cc: Kinney, Michael D
> <michael.d.kinney@intel.com>;
> > > > > Gao, Liming <liming.gao@intel.com>; Laszlo
> Ersek
> > > > > <lersek@redhat.com>; udit.kumar@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.lindholm@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	other threads:[~2018-04-16 14:10 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-13 17:42 [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib Leif Lindholm
2018-04-13 19:24 ` Kinney, Michael D
2018-04-13 19:31   ` Leif Lindholm
2018-04-13 23:32     ` Kinney, Michael D
2018-04-16 10:07       ` Leif Lindholm
2018-04-16 14:10         ` Kinney, Michael D [this message]
2018-04-16 14:34           ` Michael Brown
2018-04-16 20:42             ` Laszlo Ersek
2018-04-16 22:14               ` Michael Brown
2018-04-17  8:01                 ` Laszlo Ersek
2018-04-17  8:24                   ` Michael Brown
2018-04-17  9:57                     ` Laszlo Ersek
2018-04-17 13:26               ` Leif Lindholm
2018-04-17 15:20                 ` Kinney, Michael D
2018-04-17  6:57           ` Udit Kumar
2018-04-16 19:32         ` Laszlo Ersek
2018-04-17  8:15           ` Udit Kumar
2018-04-17  9:42             ` Laszlo Ersek
2018-04-17 10:32               ` Udit Kumar
2018-04-17 13:55           ` (spawning off more style discussion) Leif Lindholm
2018-04-18  8:51             ` Laszlo Ersek
2018-04-16  4:39 ` [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib Udit Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E92EE9817A31E24EB0585FDF735412F5B89CF92E@ORSMSX113.amr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox