From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4001:c06::22b; helo=mail-io0-x22b.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-io0-x22b.google.com (mail-io0-x22b.google.com [IPv6:2607:f8b0:4001:c06::22b]) (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 E28502034D8C4 for ; Wed, 21 Feb 2018 10:03:09 -0800 (PST) Received: by mail-io0-x22b.google.com with SMTP id e7so3093133ioj.1 for ; Wed, 21 Feb 2018 10:09:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=04m479zuhcnNH0/e9MzegmmvjRwNl2ay13+jzvhdkDo=; b=Y92rY0qimDvEVSeXn/Cpu6k8vl8gTuRQksM3H0w3wDNMfM9q5CTUV34nWdYNPCBk6k W3x4Wfrhr5T8nxv4mnNy6xb+YP4P02P1DltWa8ezuyDE5YmCqiKosgEi7+tZj2OEuG/K ErkVel/+dHQIsk624ym+0yY6DG+f0a69sn0NQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=04m479zuhcnNH0/e9MzegmmvjRwNl2ay13+jzvhdkDo=; b=rK976oIi4C7amI4vUldvxk4lIH+BAG03LuBkk7UCmekAhyNrxIhkYFx9lECsU6CHDW ozIWE/7JQI0vTRAjnoUER9qcIAYNe9nAIRq3TcrdSu1fUJ3bg32AMTbTApuo4ukVlyo7 9uSi6oNvtJM14TT/tJOyQiTtptQTUedNh34V2y8HNJ/xXiO2DaOFUGaueYospynfr/AN /hkY5gwWulMw9eWA2JpMDTFeLZXFx5tP8BAZNqV+WIAh2W3/qVBswY8uo7L5UPTt53/7 m3bKt1XqxSKi/LgJHP9MIKoym9hia0IGFnon6Muc9F+rJoh97ggAhsKiNGAbKDoV38ej dE/w== X-Gm-Message-State: APf1xPCmd3QAEJtX/fTy7q8OnZ+TOeqg5ldLgX4j1HV4++skPxT47e7a RJ7qTIB0uJvCEgoBpolQbDXvbqfVJEpFa96/TleIMA== X-Google-Smtp-Source: AH8x225XyDGYmHSOoOcF8QzD7L31R7+gV8ErAoK0OQW3EndNoOJ/irpWJVPDj+R+TJiCNvKg83pRdDwzUDzhbzlGsmQ= X-Received: by 10.107.5.199 with SMTP id 190mr5507415iof.107.1519236547393; Wed, 21 Feb 2018 10:09:07 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.138.209 with HTTP; Wed, 21 Feb 2018 10:09:06 -0800 (PST) In-Reply-To: <20180221152525.23449-1-leif.lindholm@linaro.org> References: <20180221152525.23449-1-leif.lindholm@linaro.org> From: Ard Biesheuvel Date: Wed, 21 Feb 2018 18:09:06 +0000 Message-ID: To: Leif Lindholm Cc: "edk2-devel@lists.01.org" , Michael D Kinney , Liming Gao , Meenakshi Aggarwal , Udit Kumar , Varun Sethi Subject: Re: [RFC PATCH] MdePkg: add byte-swapping MMIO BaseIoLibSwap X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Feb 2018 18:03:10 -0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On 21 February 2018 at 15:25, Leif Lindholm wrot= e: > 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. > As pointed out by Laszlo, 'opposite' is ill defined, as it is not a property of the device nor is it a property of the CPU/platform (even though UEFI is likely to remain little endian for the foreseeable future) So BigEndianIoLib seems more appropriate as a library class, and it does need to be a separate class so that a single driver can perform both LE and BE MMIO (which, as was pointed out, is the case for any driver that drives a BE MMIO peripheral but uses LE MMIO for serial port DEBUG output) > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Leif Lindholm > --- > > As promised in the dark and distant past: > https://www.mail-archive.com/edk2-devel@lists.01.org/msg33447.html > > This starts out as a clone of MdePkg/Include/Library/IoLib.h, > implementing simple wrappers that depend on an IoLib instance to perform > any actual accesses. > > Comments are mostly nonsense, since they've not been changed from their > originals in IoLib.h. If people feel this library is a sensible approach, > I'll fix that up before I send a v1. > > I have explicitly excluded: > - non-MMIO accesses (could you really end up with mixed endianness in > such a system?) > - bitfields (would either require duplicating code or merging this all > into the BaseIoLibIntrinsic module, which is already a bit on the > bloated side) > - buffers operations (let's avoid those until we find we need them) > > MdePkg/Include/Library/IoLibSwap.h | 395 ++++++++++++++++++++ If you create a library class, please declare it in the .dec file > MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf | 44 +++ > MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni | 23 ++ > MdePkg/Library/BaseIoLibSwap/IoLibSwap.c | 491 +++++++++++++++++++= ++++++ > MdePkg/MdePkg.dec | 3 + > MdePkg/MdePkg.dsc | 1 + > 6 files changed, 957 insertions(+) > create mode 100644 MdePkg/Include/Library/IoLibSwap.h > create mode 100644 MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf > create mode 100644 MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni > create mode 100644 MdePkg/Library/BaseIoLibSwap/IoLibSwap.c > > diff --git a/MdePkg/Include/Library/IoLibSwap.h b/MdePkg/Include/Library/= IoLibSwap.h > new file mode 100644 > index 0000000000..f13c8d86e7 > --- /dev/null > +++ b/MdePkg/Include/Library/IoLibSwap.h > @@ -0,0 +1,395 @@ > +/** @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 BS= D License > +which accompanies this distribution. The full text of the license may b= e 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 IMP= LIED. > + > +**/ > + > +#ifndef __IO_LIB_SWAP_H__ > +#define __IO_LIB_SWAP_H__ > + > +/** > + Reads a 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address. The 16-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioRead16 ( > + IN UINTN Address > + ); > + > +/** > + Writes a 16-bit MMIO register. > + > + Writes the 16-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > + @return Value. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioWrite16 ( > + IN UINTN Address, > + IN UINT16 Value > + ); > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 16-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioOr16 ( > + IN UINTN Address, > + IN UINT16 OrData > + ); > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 16-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioAnd16 ( > + IN UINTN Address, > + IN UINT16 AndData > + ); > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 16-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioAndThenOr16 ( > + IN UINTN Address, > + IN UINT16 AndData, > + IN UINT16 OrData > + ); > + > +/** > + Reads a 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address. The 32-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioRead32 ( > + IN UINTN Address > + ); > + > +/** > + Writes a 32-bit MMIO register. > + > + Writes the 32-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > + @return Value. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioWrite32 ( > + IN UINTN Address, > + IN UINT32 Value > + ); > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 32-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioOr32 ( > + IN UINTN Address, > + IN UINT32 OrData > + ); > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 32-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioAnd32 ( > + IN UINTN Address, > + IN UINT32 AndData > + ); > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 32-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioAndThenOr32 ( > + IN UINTN Address, > + IN UINT32 AndData, > + IN UINT32 OrData > + ); > + > +/** > + Reads a 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address. The 64-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioRead64 ( > + IN UINTN Address > + ); > + > +/** > + Writes a 64-bit MMIO register. > + > + Writes the 64-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioWrite64 ( > + IN UINTN Address, > + IN UINT64 Value > + ); > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 64-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioOr64 ( > + IN UINTN Address, > + IN UINT64 OrData > + ); > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 64-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioAnd64 ( > + IN UINTN Address, > + IN UINT64 AndData > + ); > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 64-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioAndThenOr64 ( > + IN UINTN Address, > + IN UINT64 AndData, > + IN UINT64 OrData > + ); > + > +#endif > + > diff --git a/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf b/MdePkg/Libr= ary/BaseIoLibSwap/BaseIoLibSwap.inf > new file mode 100644 > index 0000000000..59d774dc97 > --- /dev/null > +++ b/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf > @@ -0,0 +1,44 @@ > +## @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 wri= tten > +# are byte-reversed to interact with peripherals of non-native endianne= ss. > +# > +# 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 BaseIoLibSwap > + MODULE_UNI_FILE =3D BaseIoLibSwap.uni > + FILE_GUID =3D 073c3fbd-ff0d-41b6-a209-1e42fd2a3ba= b > + MODULE_TYPE =3D BASE > + VERSION_STRING =3D 1.0 > + LIBRARY_CLASS =3D IoLibSwap > + > + > +# > +# VALID_ARCHITECTURES =3D IA32 X64 EBC IPF ARM AARCH64 > +# > + > +[Sources] > + IoLibSwap.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + BaseLib > +# DebugLib > + IoLib > diff --git a/MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.uni b/MdePkg/Libr= ary/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 wri= tten > +// are byte-reversed to interact with peripherals of non-native endianne= ss. > +// > +// 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 pl= ace 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/Ba= seIoLibSwap/IoLibSwap.c > new file mode 100644 > index 0000000000..6eb675de20 > --- /dev/null > +++ b/MdePkg/Library/BaseIoLibSwap/IoLibSwap.c > @@ -0,0 +1,491 @@ > +/** @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 BS= D License > +which accompanies this distribution. The full text of the license may b= e 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 IMP= LIED. > + > +**/ > + > +#include > +#include > + > +/** > + Reads a 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address. The 16-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioRead16 ( > + IN UINTN Address > + ) > +{ > + return SwapBytes16 (MmioRead16 (Address)); > +} > + > +/** > + Writes a 16-bit MMIO register. > + > + Writes the 16-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > + @return Value. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioWrite16 ( > + IN UINTN Address, > + IN UINT16 Value > + ) > +{ > + (VOID) MmioWrite16 (Address, SwapBytes16 (Value)); > + > + return Value; > +} > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 16-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioOr16 ( > + IN UINTN Address, > + IN UINT16 OrData > + ) > +{ > + UINT16 Value; > + > + Value =3D SwapMmioRead16 (Address); > + Value |=3D OrData; > + > + return SwapMmioWrite16 (Address, Value); > +} > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 16-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioAnd16 ( > + IN UINTN Address, > + IN UINT16 AndData > + ) > +{ > + UINT16 Value; > + > + Value =3D SwapMmioRead16 (Address); > + Value &=3D AndData; > + > + return SwapMmioWrite16 (Address, Value); > +} > + > +/** > + Reads a 16-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 16-bit MMIO register. > + > + Reads the 16-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 16-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 16-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 16-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT16 > +EFIAPI > +SwapMmioAndThenOr16 ( > + IN UINTN Address, > + IN UINT16 AndData, > + IN UINT16 OrData > + ) > +{ > + UINT16 Value; > + > + Value =3D SwapMmioRead16 (Address); > + Value &=3D AndData; > + Value |=3D OrData; > + > + return SwapMmioWrite16 (Address, Value); > +} > + > +/** > + Reads a 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address. The 32-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioRead32 ( > + IN UINTN Address > + ) > +{ > + return SwapBytes32 (MmioRead32 (Address)); > +} > + > +/** > + Writes a 32-bit MMIO register. > + > + Writes the 32-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > + @return Value. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioWrite32 ( > + IN UINTN Address, > + IN UINT32 Value > + ) > +{ > + (VOID) MmioWrite32 (Address, SwapBytes32 (Value)); > + > + return Value; > +} > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 32-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioOr32 ( > + IN UINTN Address, > + IN UINT32 OrData > + ) > +{ > + UINT32 Value; > + > + Value =3D SwapMmioRead32 (Address); > + Value |=3D OrData; > + > + return SwapMmioWrite32 (Address, Value); > +} > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 32-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioAnd32 ( > + IN UINTN Address, > + IN UINT32 AndData > + ) > +{ > + UINT32 Value; > + > + Value =3D SwapMmioRead32 (Address); > + Value &=3D AndData; > + > + return SwapMmioWrite32 (Address, Value); > +} > + > +/** > + Reads a 32-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 32-bit MMIO register. > + > + Reads the 32-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 32-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 32-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 32-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT32 > +EFIAPI > +SwapMmioAndThenOr32 ( > + IN UINTN Address, > + IN UINT32 AndData, > + IN UINT32 OrData > + ) > +{ > + UINT32 Value; > + > + Value =3D SwapMmioRead32 (Address); > + Value &=3D AndData; > + Value |=3D OrData; > + > + return SwapMmioWrite32 (Address, Value); > +} > + > +/** > + Reads a 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address. The 64-bit read v= alue is > + returned. This function must guarantee that all MMIO read and write > + operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to read. > + > + @return The value read. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioRead64 ( > + IN UINTN Address > + ) > +{ > + return SwapBytes64 (MmioRead64 (Address)); > +} > + > +/** > + Writes a 64-bit MMIO register. > + > + Writes the 64-bit MMIO register specified by Address with the value sp= ecified > + by Value and returns Value. This function must guarantee that all MMIO= read > + and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param Value The value to write to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioWrite64 ( > + IN UINTN Address, > + IN UINT64 Value > + ) > +{ > + (VOID) MmioWrite64 (Address, SwapBytes64 (Value)); > + > + return Value; > +} > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise OR, and writes the > + result back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e > + OR between the read result and the value specified by OrData, and > + writes the result to the 64-bit MMIO register specified by Address. Th= e value > + written to the MMIO register is returned. This function must guarantee= that > + all MMIO read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param OrData The value to OR with the read value from the MMIO regi= ster. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioOr64 ( > + IN UINTN Address, > + IN UINT64 OrData > + ) > +{ > + UINT64 Value; > + > + Value =3D SwapMmioRead64 (Address); > + Value |=3D OrData; > + > + return SwapMmioWrite64 (Address, Value); > +} > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise AND, and writes the r= esult > + back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e AND > + between the read result and the value specified by AndData, and writes= the > + result to the 64-bit MMIO register specified by Address. The value wri= tten to > + the MMIO register is returned. This function must guarantee that all M= MIO > + read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioAnd64 ( > + IN UINTN Address, > + IN UINT64 AndData > + ) > +{ > + UINT64 Value; > + > + Value =3D SwapMmioRead64 (Address); > + Value &=3D AndData; > + > + return SwapMmioWrite64 (Address, Value); > +} > + > +/** > + Reads a 64-bit MMIO register, performs a bitwise AND followed by a bit= wise > + OR, and writes the result back to the 64-bit MMIO register. > + > + Reads the 64-bit MMIO register specified by Address, performs a bitwis= e 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 speci= fied by > + OrData, and writes the result to the 64-bit MMIO register specified by > + Address. The value written to the MMIO register is returned. This func= tion > + must guarantee that all MMIO read and write operations are serialized. > + > + If 64-bit MMIO register operations are not supported, then ASSERT(). > + If Address is not aligned on a 64-bit boundary, then ASSERT(). > + > + @param Address The MMIO register to write. > + @param AndData The value to AND with the read value from the MMIO reg= ister. > + @param OrData The value to OR with the result of the AND operation. > + > + @return The value written back to the MMIO register. > + > +**/ > +UINT64 > +EFIAPI > +SwapMmioAndThenOr64 ( > + IN UINTN Address, > + IN UINT64 AndData, > + IN UINT64 OrData > + ) > +{ > + UINT64 Value; > + > + Value =3D SwapMmioRead64 (Address); > + Value &=3D AndData; > + Value |=3D OrData; > + > + return SwapMmioWrite64 (Address, Value); > +} > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec > index 0e64f22f4a..98016f47e9 100644 > --- a/MdePkg/MdePkg.dec > +++ b/MdePkg/MdePkg.dec > @@ -160,6 +160,9 @@ [LibraryClasses] > ## @libraryclass Provide services to access I/O Ports and MMIO regis= ters. > IoLib|Include/Library/IoLib.h > > + ## @libraryclass Provide byte-swapping services to access MMIO regis= ters. > + IoLibSwap|Include/Library/IoLibSwap.h > + > ## @libraryclass Provide services to create, get and update HSTI tab= le in AIP protocol. > HstiLib|Include/Library/HstiLib.h > > diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc > index 60efd722e9..a2f2696394 100644 > --- a/MdePkg/MdePkg.dsc > +++ b/MdePkg/MdePkg.dsc > @@ -60,6 +60,7 @@ [Components] > MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf > MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib= .inf > + MdePkg/Library/BaseIoLibSwap/BaseIoLibSwap.inf > MdePkg/Library/BaseLib/BaseLib.inf > MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf > MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollect= ionRedBlackTreeLib.inf > -- > 2.11.0 >