From: Leif Lindholm <leif.lindholm@linaro.org>
To: edk2-devel@lists.01.org
Cc: Michael D Kinney <michael.d.kinney@intel.com>,
Liming Gao <liming.gao@intel.com>,
Laszlo Ersek <lersek@redhat.com>,
udit.kumar@nxp.com
Subject: [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib
Date: Fri, 13 Apr 2018 18:42:11 +0100 [thread overview]
Message-ID: <20180413174211.858-1-leif.lindholm@linaro.org> (raw)
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 <leif.lindholm@linaro.org>
---
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.<BR>
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+Copyright (c) 2018, Linaro ltd. All rights reserved.<BR>
+
+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.<BR>
+# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+#
+# 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.<BR>
+//
+// 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.<BR>
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+Copyright (c) 2018, Linaro ltd. All rights reserved.<BR>
+
+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 <Library/BaseLib.h>
+#include <Library/IoLib.h>
+
+#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
next reply other threads:[~2018-04-13 17:42 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-13 17:42 Leif Lindholm [this message]
2018-04-13 19:24 ` [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib Kinney, Michael D
2018-04-13 19:31 ` Leif Lindholm
2018-04-13 23:32 ` Kinney, Michael D
2018-04-16 10:07 ` Leif Lindholm
2018-04-16 14:10 ` Kinney, Michael D
2018-04-16 14:34 ` Michael Brown
2018-04-16 20:42 ` Laszlo Ersek
2018-04-16 22:14 ` Michael Brown
2018-04-17 8:01 ` Laszlo Ersek
2018-04-17 8:24 ` Michael Brown
2018-04-17 9:57 ` Laszlo Ersek
2018-04-17 13:26 ` Leif Lindholm
2018-04-17 15:20 ` Kinney, Michael D
2018-04-17 6:57 ` Udit Kumar
2018-04-16 19:32 ` Laszlo Ersek
2018-04-17 8:15 ` Udit Kumar
2018-04-17 9:42 ` Laszlo Ersek
2018-04-17 10:32 ` Udit Kumar
2018-04-17 13:55 ` (spawning off more style discussion) Leif Lindholm
2018-04-18 8:51 ` Laszlo Ersek
2018-04-16 4:39 ` [PATCH] MdePkg: add big-endian MMIO BaseBeIoLib Udit Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180413174211.858-1-leif.lindholm@linaro.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox