/** IoAccessLib.c Provide MMIO APIs for BE modules. Copyright 2017-2020 NXP SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include /** MmioRead16 for Big-Endian modules. @param Address The MMIO register to read. @return The value read. **/ STATIC UINT16 EFIAPI SwapMmioRead16 ( IN UINTN Address ) { return SwapBytes16 (MmioRead16 (Address)); } /** MmioRead32 for Big-Endian modules. @param Address The MMIO register to read. @return The value read. **/ STATIC UINT32 EFIAPI SwapMmioRead32 ( IN UINTN Address ) { return SwapBytes32 (MmioRead32 (Address)); } /** MmioRead64 for Big-Endian modules. @param Address The MMIO register to read. @return The value read. **/ STATIC UINT64 EFIAPI SwapMmioRead64 ( IN UINTN Address ) { return SwapBytes64 (MmioRead64 (Address)); } /** MmioWrite16 for Big-Endian modules. @param Address The MMIO register to write. @param Value The value to write to the MMIO register. **/ STATIC UINT16 EFIAPI SwapMmioWrite16 ( 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. **/ STATIC UINT32 EFIAPI SwapMmioWrite32 ( 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. **/ STATIC UINT64 EFIAPI SwapMmioWrite64 ( IN UINTN Address, IN UINT64 Value ) { return MmioWrite64 (Address, SwapBytes64 (Value)); } /** 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. **/ STATIC UINT16 EFIAPI SwapMmioAndThenOr16 ( 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. **/ STATIC UINT32 EFIAPI SwapMmioAndThenOr32 ( 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. **/ STATIC UINT64 EFIAPI SwapMmioAndThenOr64 ( IN UINTN Address, IN UINT64 AndData, IN UINT64 OrData ) { AndData = SwapBytes64 (AndData); OrData = SwapBytes64 (OrData); return MmioAndThenOr64 (Address, AndData, 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. **/ STATIC UINT16 EFIAPI SwapMmioOr16 ( 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. **/ STATIC UINT32 EFIAPI SwapMmioOr32 ( 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. **/ STATIC UINT64 EFIAPI SwapMmioOr64 ( IN UINTN Address, IN UINT64 OrData ) { return MmioOr64 (Address, SwapBytes64 (OrData)); } /** 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. **/ STATIC UINT16 EFIAPI SwapMmioAnd16 ( 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. **/ STATIC UINT32 EFIAPI SwapMmioAnd32 ( 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. **/ STATIC UINT64 EFIAPI SwapMmioAnd64 ( IN UINTN Address, IN UINT64 AndData ) { return MmioAnd64 (Address, SwapBytes64 (AndData)); } STATIC MMIO_OPERATIONS SwappingFunctions = { SwapMmioRead16, SwapMmioWrite16, SwapMmioOr16, SwapMmioAnd16, SwapMmioAndThenOr16, SwapMmioRead32, SwapMmioWrite32, SwapMmioOr32, SwapMmioAnd32, SwapMmioAndThenOr32, SwapMmioRead64, SwapMmioWrite64, SwapMmioOr64, SwapMmioAnd64, SwapMmioAndThenOr64, }; STATIC MMIO_OPERATIONS NonSwappingFunctions = { MmioRead16, MmioWrite16, MmioOr16, MmioAnd16, MmioAndThenOr16, MmioRead32, MmioWrite32, MmioOr32, MmioAnd32, MmioAndThenOr32, MmioRead64, MmioWrite64, MmioOr64, MmioAnd64, MmioAndThenOr64, }; /** Function to return pointer to Mmio operations. @param Swap Flag to tell if Swap is needed or not on Mmio Operations. @return Pointer to Mmio Operations. **/ MMIO_OPERATIONS * GetMmioOperations (BOOLEAN Swap) { if (Swap) { return &SwappingFunctions; } else { return &NonSwappingFunctions; } }