Apologies for dropping the ball on this series during my sabbatical.
For this particular patch, I would still like to see a core library
provide the needed functionality. I just sent out an RFC of a possible
implementation.
Regardless, a key point is that this isn't about "big-endian", it is
about endianness opposite to the executing processor.
/
Leif
On Fri, Feb 16, 2018 at 02:19:57PM +0530, Meenakshi wrote:
> From: Meenakshi Aggarwal <[email protected]>
>
> This library add supports for BE read/write and other
> MMIO helper function.
> In this data swapped after reading from MMIO and before
> write using MMIO.
> It can be used by any module with BE address space.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <[email protected]>
> ---
> Silicon/NXP/Include/Library/BeIoLib.h | 332 ++++++++++++++++++++++++++
> Silicon/NXP/Library/BeIoLib/BeIoLib.c | 400
> ++++++++++++++++++++++++++++++++
> Silicon/NXP/Library/BeIoLib/BeIoLib.inf | 31 +++
> 3 files changed, 763 insertions(+)
> create mode 100644 Silicon/NXP/Include/Library/BeIoLib.h
> create mode 100644 Silicon/NXP/Library/BeIoLib/BeIoLib.c
> create mode 100644 Silicon/NXP/Library/BeIoLib/BeIoLib.inf
>
> diff --git a/Silicon/NXP/Include/Library/BeIoLib.h
> b/Silicon/NXP/Include/Library/BeIoLib.h
> new file mode 100644
> index 0000000..a58883a
> --- /dev/null
> +++ b/Silicon/NXP/Include/Library/BeIoLib.h
> @@ -0,0 +1,332 @@
> +/** BeIoLib.h
> + *
> + * Copyright 2017 NXP
> + *
> + * 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_IOLIB_H__
> +#define __BE_IOLIB_H__
> +
> +#include <Base.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + );
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + );
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + );
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + );
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + );
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + );
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @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
> + );
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @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
> + );
> +
> +#endif /* _BE_IOLIB_H */
> diff --git a/Silicon/NXP/Library/BeIoLib/BeIoLib.c
> b/Silicon/NXP/Library/BeIoLib/BeIoLib.c
> new file mode 100644
> index 0000000..b4b12ac
> --- /dev/null
> +++ b/Silicon/NXP/Library/BeIoLib/BeIoLib.c
> @@ -0,0 +1,400 @@
> +/** BeIoLib.c
> +
> + Provide MMIO APIs for BE modules.
> +
> + Copyright 2017 NXP
> +
> + 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 <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/IoLib.h>
> +
> +/**
> + MmioRead8 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioRead8 (
> + IN UINTN Address
> + )
> +{
> + return MmioRead8 (Address);
> +}
> +
> +/**
> + MmioRead16 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioRead16 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes16 (MmioRead16 (Address));
> +}
> +
> +/**
> + MmioRead32 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioRead32 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes32 (MmioRead32 (Address));
> +}
> +
> +/**
> + MmioRead64 for Big-Endian modules.
> +
> + @param Address The MMIO register to read.
> +
> + @return The value read.
> +
> +**/
> +UINT64
> +EFIAPI
> +BeMmioRead64 (
> + IN UINTN Address
> + )
> +{
> + return SwapBytes64 (MmioRead64 (Address));
> +}
> +
> +/**
> + MmioWrite8 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioWrite8 (
> + IN UINTN Address,
> + IN UINT8 Value
> + )
> +{
> + return MmioWrite8 (Address, Value);
> +}
> +
> +/**
> + MmioWrite16 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT16
> +EFIAPI
> +BeMmioWrite16 (
> + IN UINTN Address,
> + IN UINT16 Value
> + )
> +{
> + return MmioWrite16 (Address, SwapBytes16 (Value));
> +}
> +
> +/**
> + MmioWrite32 for Big-Endian modules.
> +
> + @param Address The MMIO register to write.
> + @param Value The value to write to the MMIO register.
> +
> +**/
> +UINT32
> +EFIAPI
> +BeMmioWrite32 (
> + IN UINTN Address,
> + IN UINT32 Value
> + )
> +{
> + return MmioWrite32 (Address, SwapBytes32 (Value));
> +}
> +
> +/**
> + MmioWrite64 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioWrite64 (Address, SwapBytes64 (Value));
> +}
> +
> +/**
> + MmioAndThenOr8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAndThenOr8 (
> + IN UINTN Address,
> + IN UINT8 AndData,
> + IN UINT8 OrData
> + )
> +{
> + return MmioAndThenOr8 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr16 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + AndData = SwapBytes16 (AndData);
> + OrData = SwapBytes16 (OrData);
> +
> + return MmioAndThenOr16 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr32 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + AndData = SwapBytes32 (AndData);
> + OrData = SwapBytes32 (OrData);
> +
> + return MmioAndThenOr32 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioAndThenOr64 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + AndData = SwapBytes64 (AndData);
> + OrData = SwapBytes64 (OrData);
> +
> + return MmioAndThenOr64 (Address, AndData, OrData);
> +}
> +
> +/**
> + MmioOr8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioOr8 (
> + IN UINTN Address,
> + IN UINT8 OrData
> + )
> +{
> + return MmioOr8 (Address, OrData);
> +}
> +
> +/**
> + MmioOr16 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioOr16 (Address, SwapBytes16 (OrData));
> +}
> +
> +/**
> + MmioOr32 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioOr32 (Address, SwapBytes32 (OrData));
> +}
> +
> +/**
> + MmioOr64 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioOr64 (Address, SwapBytes64 (OrData));
> +}
> +
> +/**
> + MmioAnd8 for Big-Endian modules.
> +
> + @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.
> +
> +**/
> +UINT8
> +EFIAPI
> +BeMmioAnd8 (
> + IN UINTN Address,
> + IN UINT8 AndData
> + )
> +{
> + return MmioAnd8 (Address, AndData);
> +}
> +
> +/**
> + MmioAnd16 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioAnd16 (Address, SwapBytes16 (AndData));
> +}
> +
> +/**
> + MmioAnd32 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioAnd32 (Address, SwapBytes32 (AndData));
> +}
> +
> +/**
> + MmioAnd64 for Big-Endian modules.
> +
> + @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
> + )
> +{
> + return MmioAnd64 (Address, SwapBytes64 (AndData));
> +}
> diff --git a/Silicon/NXP/Library/BeIoLib/BeIoLib.inf
> b/Silicon/NXP/Library/BeIoLib/BeIoLib.inf
> new file mode 100644
> index 0000000..a1c19d0
> --- /dev/null
> +++ b/Silicon/NXP/Library/BeIoLib/BeIoLib.inf
> @@ -0,0 +1,31 @@
> +## @BeIoLib.inf
> +
> +# Copyright 2017 NXP
> +#
> +# 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 = BeIoLib
> + FILE_GUID = 28d77333-77eb-4faf-8735-130e5eb3e343
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = BeIoLib
> +
> +[Sources.common]
> + BeIoLib.c
> +
> +[Packages]
> + MdeModulePkg/MdeModulePkg.dec
> + MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> + IoLib
> --
> 1.9.1
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel