public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: "Gao, Liming" <liming.gao@intel.com>,
	Bhupesh Sharma <bhupesh.sharma@nxp.com>,
	"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [PATCH 1/1] MdePkg/IoLib: Add support for big-endian MMIO
Date: Mon, 17 Oct 2016 04:10:47 +0000	[thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5648251CA@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14B49505E@shsmsx102.ccr.corp.intel.com>

Bhupesh,

It is also possible to add an ARM specific PCD to select endianness and update
MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c to use that PCD in MmioRead/Write() 
APIs in that file to support both endian types.  You can use the SwapBytesxx()
functions from BaseLib(as Laszlo suggested) based on the setting of this ARM 
specific PCD.

Modules that link against this lib can select endianness by setting PCD in the 
scope of that module.

The IPF version of IoLib uses an IPF specific PCD to translate I/O port accesses
to MMIO accesses.  So there is already an example of an arch specific PCD in this
lib instance.

Mike

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Gao, Liming
> Sent: Monday, October 17, 2016 11:10 AM
> To: Bhupesh Sharma <bhupesh.sharma@nxp.com>; edk2-devel@ml01.01.org
> Subject: Re: [edk2] [PATCH 1/1] MdePkg/IoLib: Add support for big-endian MMIO
> 
> Bhupesh:
>   In this patch, five class APIs are new added. They are
> MmioReadBe16(),MmioWriteBe16(),MmioClearSetBe16(),MmioSetBitsBe16(),MmioClearBitsBe16
> (). In fact, they can map to the existing MMIO APIs. Below is their mapping. And, I
> understand some hardware uses little-endian MMIO interfaces, other hardware use big-
> endian MMIO interfaces. But, there are no hardware to require little-endian and big-
> endian at the same time. If so, we don't need to expose MmioRead16() and
> MmioReadBe16() API both in the same library instances. For your case, I suggest to
> add new IoLib library instance that implement the existing MMIO APIs with the big-
> endian way. This library instance can be placed into ARM device package.
> 
> MmioReadBe16()  --> MmioRead16()
> MmioWriteBe16() --> MmioWrite16()
> MmioClearSetBe16() -->  MmioAndThenOr16()
> MmioSetBitsBe16() -->     MmioOr16()
> MmioClearBitsBe16() -->  MmioAnd16()
> 
> Thanks
> Liming
> > -----Original Message-----
> > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> > Bhupesh Sharma
> > Sent: Friday, October 14, 2016 5:34 PM
> > To: edk2-devel@ml01.01.org
> > Subject: [edk2] [PATCH 1/1] MdePkg/IoLib: Add support for big-endian
> > MMIO
> >
> > Various IPs on NXP/FSL SoCs having ARM64 cores have big-endian
> > MMIO interfaces.
> >
> > This implies that a byte-swap operation is needed to read/write
> > such BE MMIO registers from the LE ARM64 cores.
> >
> > This patch adds the support for the same.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com>
> > Signed-off-by: Bhupesh Sharma <bhupesh.sharma@nxp.com>
> > ---
> >  MdePkg/Include/Library/IoLib.h               | 364 ++++++++++++++++++++
> >  MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c | 479
> > +++++++++++++++++++++++++++
> >  2 files changed, 843 insertions(+)
> >
> > diff --git a/MdePkg/Include/Library/IoLib.h
> > b/MdePkg/Include/Library/IoLib.h
> > index a0dd16b..f5842e6 100644
> > --- a/MdePkg/Include/Library/IoLib.h
> > +++ b/MdePkg/Include/Library/IoLib.h
> > @@ -2658,6 +2658,370 @@ MmioWriteBuffer64 (
> >    IN  CONST UINT64 *Buffer
> >    );
> >
> > +/**
> > +  Reads a 16-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioReadBe16 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +/**
> > +  Writes a 16-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioWriteBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Value
> > +  );
> > +
> > +/**
> > +  Reads a 32-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioReadBe32 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +/**
> > +  Writes a 32-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioWriteBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Value
> > +  );
> > +
> > +
> > +/**
> > +  Reads a 64-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioReadBe64 (
> > +  IN      UINTN                     Address
> > +  );
> > +
> > +
> > +/**
> > +  Writes a 64-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioWriteBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Value
> > +  );
> > +
> > +/**
> > +  Clear and set a 8-bit MMIO register.
> > +
> > +  Mask the 8-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 8-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioClearSet8 (
> > +  IN      UINTN                    Address,
> > +  IN      UINT8                    Mask,
> > +  IN      UINT8                    Value
> > +  );
> > +
> > +/**
> > +  Clear and set a 16-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 16-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 16-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioClearSetBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Mask,
> > +  IN      UINT16                    Value
> > +  );
> > +
> > +/**
> > +  Clear and set a 32-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 32-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 32-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioClearSetBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Mask,
> > +  IN      UINT32                    Value
> > +  );
> > +
> > +/**
> > +  Clear and set a 64-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 64-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 64-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioClearSetBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Mask,
> > +  IN      UINT64                    Value
> > +  );
> > +
> > +/**
> > +  Set a 8-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 8-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 8-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioSetBits8 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT8                     Bits
> > +  );
> > +
> > +/**
> > +  Set a 16-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 16-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioSetBitsBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Bits
> > +  );
> > +
> > +/**
> > +  Set a 32-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 32-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioSetBitsBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Bits
> > +  );
> > +
> > +/**
> > +  Set a 64-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 64-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioSetBitsBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Bits
> > +  );
> > +
> > +/**
> > +  Clear bits of the 8-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 8-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioClearBits8 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT8                     Mask
> > +  );
> > +
> > +/**
> > +  Clear bits of the 16-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioClearBitsBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Mask
> > +  );
> > +
> > +/**
> > +  Clear bits of the 32-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioClearBitsBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Mask
> > +  );
> > +
> > +/**
> > +  Clear bits of the 64-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioClearBitsBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Mask
> > +  );
> >
> >  #endif
> >
> > diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> > b/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> > index b9f4c5e..f2179d1 100644
> > --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> > +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibArm.c
> > @@ -19,6 +19,26 @@
> >  //
> >  #include "BaseIoLibIntrinsicInternal.h"
> >
> > +
> > +#define Uswap16(X) \
> > +       ((((X) & 0xff00) >> 8) | \
> > +        (((X) & 0x00ff) << 8))
> > +#define Uswap32(X) \
> > +       ((((X) & 0xff000000) >> 24) | \
> > +        (((X) & 0x00ff0000) >>  8) | \
> > +        (((X) & 0x0000ff00) <<  8) | \
> > +        (((X) & 0x000000ff) << 24))
> > +#define Uswap64(X) \
> > +       ((((X) & 0xff00000000000000) >> 56) | \
> > +        (((X) & 0x00ff000000000000) >> 40) | \
> > +        (((X) & 0x0000ff0000000000) >> 24) | \
> > +        (((X) & 0x000000ff00000000) >>  8) | \
> > +        (((X) & 0x00000000ff000000) <<  8) | \
> > +        (((X) & 0x0000000000ff0000) << 24) | \
> > +        (((X) & 0x000000000000ff00) << 40) | \
> > +        (((X) & 0x00000000000000ff) << 56))
> > +
> > +
> >  /**
> >    Reads an 8-bit I/O port.
> >
> > @@ -428,3 +448,462 @@ MmioWrite64 (
> >    return Value;
> >  }
> >
> > +
> > +/**
> > +  Reads a 16-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioReadBe16 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  UINT16                            Value;
> > +
> > +  ASSERT ((Address & 1) == 0);
> > +  Value = *(volatile UINT16*)Address;
> > +  return Uswap16(Value);
> > +}
> > +
> > +/**
> > +  Writes a 16-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioWriteBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 1) == 0);
> > +  *(volatile UINT16*)Address = Uswap16(Value);
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Reads a 32-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioReadBe32 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  UINT32                            Value;
> > +
> > +  ASSERT ((Address & 3) == 0);
> > +  Value = *(volatile UINT32*)Address;
> > +  return Uswap32(Value);
> > +}
> > +
> > +/**
> > +  Writes a 32-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioWriteBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 3) == 0);
> > +  *(volatile UINT32*)Address = Uswap32(Value);
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Reads a 64-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to read.
> > +
> > +  @return The value read.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioReadBe64 (
> > +  IN      UINTN                     Address
> > +  )
> > +{
> > +  UINT64                            Value;
> > +
> > +  ASSERT ((Address & 7) == 0);
> > +  Value = *(volatile UINT64*)Address;
> > +  return Uswap64(Value);
> > +}
> > +
> > +/**
> > +  Writes a 64-bit MMIO register in Big Endian format.
> > +
> > +  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().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioWriteBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 7) == 0);
> > +  *(volatile UINT64*)Address = Uswap64(Value);
> > +  return Value;
> > +}
> > +
> > +/**
> > +  Clear and set a 8-bit MMIO register.
> > +
> > +  Mask the 8-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 8-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioClearSet8 (
> > +  IN      UINTN                    Address,
> > +  IN      UINT8                    Mask,
> > +  IN      UINT8                    Value
> > +  )
> > +{
> > +  *(volatile UINT8*)Address = (*(volatile UINT8*)Address & ~Mask) | Value;
> > +  return *(volatile UINT8*)Address;
> > +}
> > +
> > +/**
> > +  Clear and set a 16-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 16-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 16-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioClearSetBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Mask,
> > +  IN      UINT16                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 1) == 0);
> > +  *(volatile UINT16*)Address = (*(volatile UINT16*)Address &
> > Uswap16(~Mask))
> > +								 |
> > Uswap16(Value);
> > +  return *(volatile UINT16*)Address;
> > +}
> > +
> > +/**
> > +  Clear and set a 32-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 32-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 32-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioClearSetBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Mask,
> > +  IN      UINT32                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 3) == 0);
> > +  *(volatile UINT32*)Address = (*(volatile UINT32*)Address &
> > Uswap32(~Mask))
> > +								 |
> > Uswap32(Value);
> > +  return *(volatile UINT32*)Address;
> > +}
> > +
> > +/**
> > +  Clear and set a 64-bit MMIO register in Big Endian format.
> > +
> > +  Mask the 64-bit MMIO register specified by Address with the mask
> > specified
> > +  by Mask and then Writes the 64-bit MMIO register specified by Address
> > with
> > +  the value specified by Value and returns current value on register. This
> > +  function must guarantee that all MMIO read and write operations are
> > serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Mask to clear the MMIO register.
> > +  @param  Value   The value to write to the MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioClearSetBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Mask,
> > +  IN      UINT64                    Value
> > +  )
> > +{
> > +  ASSERT ((Address & 7) == 0);
> > +  *(volatile UINT64*)Address = (*(volatile UINT64*)Address &
> > Uswap64(~Mask))
> > +								|
> > Uswap64(Value);
> > +  return *(volatile UINT64*)Address;
> > +}
> > +
> > +/**
> > +  Set a 8-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 8-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 8-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioSetBits8 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT8                     Bits
> > +  )
> > +{
> > +  *(volatile UINT8*)Address = *(volatile UINT8*)Address | Bits;
> > +  return *(volatile UINT8*)Address;
> > +}
> > +
> > +/**
> > +  Set a 16-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 16-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioSetBitsBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Bits
> > +  )
> > +{
> > +  ASSERT ((Address & 1) == 0);
> > +  *(volatile UINT16*)Address = *(volatile UINT16*)Address | Uswap16(Bits);
> > +  return *(volatile UINT16*)Address;
> > +}
> > +
> > +/**
> > +  Set a 32-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 32-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioSetBitsBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Bits
> > +  )
> > +{
> > +  ASSERT ((Address & 3) == 0);
> > +  *(volatile UINT32*)Address = *(volatile UINT32*)Address | Uswap32(Bits);
> > +  return *(volatile UINT32*)Address;
> > +}
> > +
> > +/**
> > +  Set a 64-bit MMIO register in Big Endian format.
> > +
> > +  Set bits of the 64-bit MMIO register specified by Address with the Bits
> > +  specified by Bits and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Bits    The Bits to set in MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioSetBitsBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Bits
> > +  )
> > +{
> > +  ASSERT ((Address & 7) == 0);
> > +  *(volatile UINT64*)Address = *(volatile UINT64*)Address | Uswap64(Bits);
> > +  return *(volatile UINT64*)Address;
> > +}
> > +
> > +/**
> > +  Clear bits of the 8-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 8-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT8
> > +EFIAPI
> > +MmioClearBits8 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT8                     Mask
> > +  )
> > +{
> > +  *(volatile UINT8*)Address = *(volatile UINT8*)Address & (~Mask);
> > +  return *(volatile UINT8*)Address;
> > +}
> > +
> > +/**
> > +  Clear bits of the 16-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 16-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT16
> > +EFIAPI
> > +MmioClearBitsBe16 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT16                    Mask
> > +  )
> > +{
> > +  ASSERT ((Address & 1) == 0);
> > +  *(volatile UINT16*)Address = *(volatile UINT16*)Address &
> > Uswap16(~Mask);
> > +  return *(volatile UINT16*)Address;
> > +}
> > +
> > +/**
> > +  Clear bits of the 32-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 32-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT32
> > +EFIAPI
> > +MmioClearBitsBe32 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT32                    Mask
> > +  )
> > +{
> > +  ASSERT ((Address & 3) == 0);
> > +  *(volatile UINT32*)Address = *(volatile UINT32*)Address &
> > Uswap32(~Mask);
> > +  return *(volatile UINT32*)Address;
> > +}
> > +
> > +/**
> > +  Clear bits of the 64-bit MMIO register specified by Address with the Mask
> > +  specified by Mask and returns register content. This function must
> > +  guarantee that all MMIO read and write operations are serialized.
> > +
> > +  If 64-bit MMIO register operations are not supported, then ASSERT().
> > +
> > +  @param  Address The MMIO register to write.
> > +  @param  Mask    The Bits to clear in MMIO register.
> > +
> > +**/
> > +UINT64
> > +EFIAPI
> > +MmioClearBitsBe64 (
> > +  IN      UINTN                     Address,
> > +  IN      UINT64                    Mask
> > +  )
> > +{
> > +  ASSERT ((Address & 7) == 0);
> > +  *(volatile UINT64*)Address = *(volatile UINT64*)Address &
> > Uswap64(~Mask);
> > +  return *(volatile UINT64*)Address;
> > +}
> > --
> > 1.9.1
> >
> >
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


  reply	other threads:[~2016-10-17  4:10 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-14  9:33 [PATCH 1/1] MdePkg/IoLib: Add support for big-endian MMIO Bhupesh Sharma
2016-10-14 12:06 ` Laszlo Ersek
2016-10-14 13:17   ` Bhupesh Sharma
2016-10-14 13:32     ` Laszlo Ersek
2016-10-17  3:10 ` Gao, Liming
2016-10-17  4:10   ` Kinney, Michael D [this message]
2016-10-17  7:42     ` Ard Biesheuvel
2016-10-17  9:57       ` Bhupesh Sharma
2017-10-13  6:07         ` Meenakshi Aggarwal
2017-10-16  3:17           ` Gao, Liming
2017-10-23  7:07             ` Udit Kumar
2017-11-27  6:06               ` Meenakshi Aggarwal
2017-11-27 11:07                 ` Leif Lindholm
2017-11-29 12:51                 ` Leif Lindholm
2017-11-29 19:25                   ` Kinney, Michael D
2017-11-29 19:48                     ` Leif Lindholm
2017-11-30  4:15                       ` Meenakshi Aggarwal
2017-12-01 10:57                         ` Leif Lindholm
2017-12-01 17:57                           ` Udit Kumar
2017-12-01 22:41                             ` Kinney, Michael D
2017-12-04  6:18                               ` Meenakshi Aggarwal
2017-12-04 12:36                               ` Leif Lindholm
2017-12-04 15:31                                 ` Kinney, Michael D
2017-12-04 15:54                                   ` Leif Lindholm
2017-12-04 16:19                                     ` Kinney, Michael D

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=E92EE9817A31E24EB0585FDF735412F5648251CA@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