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::233; helo=mail-wr0-x233.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x233.google.com (mail-wr0-x233.google.com [IPv6:2a00:1450:400c:c0c::233]) (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 CC8DD22497F5D for ; Mon, 16 Apr 2018 03:07:17 -0700 (PDT) Received: by mail-wr0-x233.google.com with SMTP id z73so24291209wrb.0 for ; Mon, 16 Apr 2018 03:07:17 -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=Lle1PJS5b9ExLax1vwJJL2RmVG40SzaUg8Pyrgpb1Gw=; b=QRZbdcJov17M6rYeZ/SGqCTf2URXpmxJuU549vfSJUHYEPtg8crqHRReX3srWcVSLZ ui4pgfjpcIa+ur8Ebved4DAh8FnSZ0fh5nQuAHUSnJF27N8RrD6GQljKkyAvMMpwZV5T xPHzvZImUXFGtBgSv4+Kp/BVPaV57jW3vntW4= 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=Lle1PJS5b9ExLax1vwJJL2RmVG40SzaUg8Pyrgpb1Gw=; b=gKHF2LroCBtVuLTzCsPe/0ZwVLWCF4DT3vvpDFjepqrkstqSmLeZlviFzn6hJpsvv0 2QPJ8ikFHhlPOi9Ox8wJ7zngwJ+dKY3PrFxE9marzi6MIaZ8GPZ2oao6D36XemTnzTDI ewTdYdhEwTRh4ELxFgJhQ4d1UrC4RETtqu5KCJgQBkwM5TQAk8DpY6bW5fxdsOkj9Ld0 2rpiCuVw/Ai4xb0V21eb5X7Tui/BHGerLv2EJT1HO2Rdt98qZQFLqCU69CNwnPhkzpxx A0HHmaPDgr1PvDgLS9nFEt1HU4jGv7dz+J3DoPHeLaa2UNz1LE2TvZ69LY18V88sqtiw +c9A== X-Gm-Message-State: ALQs6tAj5q+nVixFtN8j6OwyBJ7U79vJn8ChzerE2ggxzivNu06D5ZkJ ST7KiQI6IJnhrdKEF0fg04A21w== X-Google-Smtp-Source: AIpwx48T/jti0PNE2nhVOXOY7cA8sxNc/f271rdpiEVU2x/EhezxRuNW5DZhXsVkGJfikWwVpFxbSg== X-Received: by 10.28.127.203 with SMTP id a194mr1286911wmd.57.1523873235297; Mon, 16 Apr 2018 03:07:15 -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 r200sm19106116wmb.39.2018.04.16.03.07.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 16 Apr 2018 03:07:14 -0700 (PDT) Date: Mon, 16 Apr 2018 11:07:12 +0100 From: Leif Lindholm To: "Kinney, Michael D" Cc: "edk2-devel@lists.01.org" , Laszlo Ersek , "Gao, Liming" Message-ID: <20180416100712.6v642ycksvmoffvt@bivouac.eciton.net> References: <20180413174211.858-1-leif.lindholm@linaro.org> <20180413193143.t45tua3yi7sopk4d@bivouac.eciton.net> 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: Mon, 16 Apr 2018 10:07:18 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Apr 13, 2018 at 11:32:35PM +0000, Kinney, Michael D wrote: > Leif, > > I am curious why a Swap class/instances is not sufficient. > > Currently EDK II follows the UEFI/PI specs, which for > all supported CPU architectures use little endian ABI. > The BaseIoLib follows the endianness of the CPU. If > UEFI/PI added a CPU that was big endian, I would expect > BaseIoLib when built for that CPU would perform big endian > operations. > > Am I missing something? If you did add a big-endian CPU, you could then find yourself in the exact opposite situation and require a little-endian i/o access library. Which would be implemented exactly as the contents of IoLibSwap.c. The header file necessarily needs to be endianness-specific, and if the coding style had permitted functions in header files, my automatic reaction would have been to make all of these static inline helper functions (even with the code duplication). / Leif > Mike > > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel- > > bounces@lists.01.org] On Behalf Of Leif Lindholm > > Sent: Friday, April 13, 2018 12:32 PM > > To: Kinney, Michael D > > Cc: edk2-devel@lists.01.org; Laszlo Ersek > > ; Gao, Liming > > Subject: Re: [edk2] [PATCH] MdePkg: add big-endian MMIO > > BaseBeIoLib > > > > On Fri, Apr 13, 2018 at 07:24:06PM +0000, Kinney, > > Michael D wrote: > > > Hi Leif, > > > > > > I think we need to look at the names. I see a mix of > > > "Be" and "Swap". We should pick one and use it > > > consistently. > > > > This was what I meant by the comments: > > --- > > This modified version introduces a single BeIoLib > > instance, backed by > > a source-file that could be used also for a > > hypothetical LeIoLib. > > There is no LeIoLib.h included though. > > > > While this is arguably overengineered, I do feel > > reasonably strongly > > that code should be named for what it does, not for how > > it is used, > > and doing it this way lets me follow that rule. > > --- > > > > Clearly this is open for discussion, but the above is > > my opinion and > > the code intentionally reflects that. > > > > Regards, > > > > Leif > > > > > Mike > > > > > > > -----Original Message----- > > > > From: Leif Lindholm > > [mailto:leif.lindholm@linaro.org] > > > > Sent: Friday, April 13, 2018 10:42 AM > > > > To: edk2-devel@lists.01.org > > > > Cc: Kinney, Michael D ; > > > > 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 > > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel