From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 365EE220E8CB4 for ; Fri, 13 Apr 2018 16:32:38 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Apr 2018 16:32:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,446,1517904000"; d="scan'208";a="46801057" Received: from orsmsx105.amr.corp.intel.com ([10.22.225.132]) by fmsmga001.fm.intel.com with ESMTP; 13 Apr 2018 16:32:38 -0700 Received: from orsmsx155.amr.corp.intel.com (10.22.240.21) by ORSMSX105.amr.corp.intel.com (10.22.225.132) with Microsoft SMTP Server (TLS) id 14.3.319.2; Fri, 13 Apr 2018 16:32:37 -0700 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.55]) by ORSMSX155.amr.corp.intel.com ([169.254.7.64]) with mapi id 14.03.0319.002; Fri, 13 Apr 2018 16:32:36 -0700 From: "Kinney, Michael D" To: Leif Lindholm , "Kinney, Michael D" CC: "edk2-devel@lists.01.org" , Laszlo Ersek , "Gao, Liming" Thread-Topic: [edk2] [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib Thread-Index: AQHT007FDvjdHbPkR0WQ38GOtMXuhKP/EwwggAB3ywD//8uvEA== Date: Fri, 13 Apr 2018 23:32:35 +0000 Message-ID: References: <20180413174211.858-1-leif.lindholm@linaro.org> <20180413193143.t45tua3yi7sopk4d@bivouac.eciton.net> In-Reply-To: <20180413193143.t45tua3yi7sopk4d@bivouac.eciton.net> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.22.254.139] MIME-Version: 1.0 Subject: Re: [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Apr 2018 23:32:39 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 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? 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 > Cc: edk2-devel@lists.01.org; Laszlo Ersek > ; Gao, Liming > Subject: Re: [edk2] [PATCH] MdePkg: add big-endian MMIO > BaseBeIoLib >=20 > 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. >=20 > 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. >=20 > 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. > --- >=20 > Clearly this is open for discussion, but the above is > my opinion and > the code intentionally reflects that. >=20 > Regards, >=20 > Leif >=20 > > 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 ; > > > Gao, Liming ; Laszlo Ersek > > > ; 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 > > > > --- > > > > > > 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.
> > > +Copyright (c) 2017, AMD Incorporated. All rights > > > reserved.
> > > +Copyright (c) 2018, Linaro ltd. All rights > > > reserved.
> > > + > > > +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.
> > > +# Portions copyright (c) 2008 - 2009, Apple Inc. > All > > > rights reserved.
> > > +# Copyright (c) 2017, AMD Incorporated. All > rights > > > reserved.
> > > +# > > > +# 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 =3D 0x0001001a > > > + BASE_NAME =3D BaseBeIoLib > > > + MODULE_UNI_FILE =3D > BaseIoLibSwap.uni > > > + FILE_GUID =3D 073c3fbd-ff0d- > 41b6- > > > a209-1e42fd2a3bab > > > + MODULE_TYPE =3D BASE > > > + VERSION_STRING =3D 1.0 > > > + LIBRARY_CLASS =3D BeIoLib > > > + > > > + > > > +# > > > +# VALID_ARCHITECTURES =3D IA32 X64 EBC > IPF > > > ARM AARCH64 > > > +# > > > + > > > +[Sources] > > > + IoLibSwap.c > > > + > > > +[Packages] > > > + MdePkg/MdePkg.dec > > > + > > > +[LibraryClasses] > > > + BaseLib > > > + IoLib > > > + > > > +[BuildOptions] > > > + GCC:*_*_*_CC_FLAGS =3D -D > > > FUNCTION_PREFIX=3DBe > > > + INTEL:*_*_*_CC_FLAGS =3D /D > > > FUNCTION_PREFIX=3DBe > > > + MSFT:*_*_*_CC_FLAGS =3D /D > > > FUNCTION_PREFIX=3DBe > > > 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.
> > > +// > > > +// 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.
> > > +Copyright (c) 2017, AMD Incorporated. All rights > > > reserved.
> > > +Copyright (c) 2018, Linaro ltd. All rights > > > reserved.
> > > + > > > +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 > > > +#include > > > + > > > +#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 =3D ADD_PREFIX (MmioRead16) (Address); > > > + Value |=3D 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 =3D ADD_PREFIX (MmioRead16) (Address); > > > + Value &=3D 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 =3D ADD_PREFIX (MmioRead16) (Address); > > > + Value &=3D AndData; > > > + Value |=3D 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 =3D ADD_PREFIX (MmioRead32) (Address); > > > + Value |=3D 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 =3D ADD_PREFIX (MmioRead32) (Address); > > > + Value &=3D 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 =3D ADD_PREFIX (MmioRead32) (Address); > > > + Value &=3D AndData; > > > + Value |=3D 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 =3D ADD_PREFIX (MmioRead64) (Address); > > > + Value |=3D 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 =3D ADD_PREFIX (MmioRead64) (Address); > > > + Value &=3D 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 =3D ADD_PREFIX (MmioRead64) (Address); > > > + Value &=3D AndData; > > > + Value |=3D 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