From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::231; helo=mail-wr0-x231.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x231.google.com (mail-wr0-x231.google.com [IPv6:2a00:1450:400c:c0c::231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 983B8220E8CBA for ; Fri, 13 Apr 2018 12:31:48 -0700 (PDT) Received: by mail-wr0-x231.google.com with SMTP id o3so10781169wri.2 for ; Fri, 13 Apr 2018 12:31:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=jOurOsU4guM30LLCHPnjUkIWrCoHF7uxDtxgbj5W+7A=; b=Ik6NlA/89eye6+i+/Vew1P/TlKf5xSBlpoJJ/TdIhTKQEYeHT/0wiF8W70vGkTHAfa YocfneiNho6FcqXJh26aZ7LoCsFMIfvOcM2EBe0FX0JAhg+/ebUTsFFabI7PSKkMS6lC nRir9fH+HjfGyouDc4gCooeKnQrwUEGryR5ec= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=jOurOsU4guM30LLCHPnjUkIWrCoHF7uxDtxgbj5W+7A=; b=TdIB7C0vGC8qsNukO8AJf4YURc19A8XKM8yJKcBZE4781jReNhwDsKiqU1Q/vzxcmL xDvvfHKIqWmvxYXNiX5Yz0E7D1nia9DjYLQpAnNIY8tVQqUpUWqhheJvpYS/byXwwB0N YQvn2rT0IBRv3dPslOCNk/BurW4HngiGGgwtvoPN9a/DuN5mIeboHxg94MbbML2+UMhd VV5qOIDNxEypTGO2l2RMLEE8Jb75JyIS3yx/O+HnZE2AfygQ2jmG4loyFhNAFDvR9zc+ CDHZEQSHr5KCdXY5irSN9bf5HihWK2ZQ7n7wR37eJKVXqEi9oulaW5mNv2HIoU5tNUrs r8UQ== X-Gm-Message-State: ALQs6tCYsvR/LmjgZ0ZdrUeiHnzkd15tGubiWgaJfoSTEuwwWIPiWqwZ EBgITTAUhqEas6FDOPaZp/LGhRBnPcs= X-Google-Smtp-Source: AIpwx48YLobmWDc6dpK7pllFv4QjUIxlWeJigWfQ7CuXKYsCUKrbkFkpmHSZIhrba9uat+KcaCphPw== X-Received: by 10.223.134.103 with SMTP id 36mr4768750wrw.23.1523647906637; Fri, 13 Apr 2018 12:31:46 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id g38sm9775988wra.77.2018.04.13.12.31.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 13 Apr 2018 12:31:45 -0700 (PDT) Date: Fri, 13 Apr 2018 20:31:44 +0100 From: Leif Lindholm To: "Kinney, Michael D" Cc: "edk2-devel@lists.01.org" , "Gao, Liming" , Laszlo Ersek , "udit.kumar@nxp.com" Message-ID: <20180413193143.t45tua3yi7sopk4d@bivouac.eciton.net> References: <20180413174211.858-1-leif.lindholm@linaro.org> MIME-Version: 1.0 In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) 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 19:31:49 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 ; > > 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 = 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.
> > +// > > +// 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 = 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 >