/** @file I/O library for non I/O read and write access (memory map I/O read and write only) architecture, such as ARM and RISC-V processor. Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
Copyright (c) 2017, AMD Incorporated. All rights reserved.
Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ // // Include common header file for this module. // #include "BaseIoLibIntrinsicInternal.h" /** Reads an 8-bit I/O port. Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned. This function must guarantee that all I/O read and write operations are serialized. If 8-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @return The value read. **/ UINT8 EFIAPI IoRead8 ( IN UINTN Port ) { ASSERT (FALSE); return 0; } /** Writes an 8-bit I/O port. Writes the 8-bit I/O port specified by Port with the value specified by Value and returns Value. This function must guarantee that all I/O read and write operations are serialized. If 8-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. @return The value written the I/O port. **/ UINT8 EFIAPI IoWrite8 ( IN UINTN Port, IN UINT8 Value ) { ASSERT (FALSE); return Value; } /** Reads a 16-bit I/O port. Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned. This function must guarantee that all I/O read and write operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @return The value read. **/ UINT16 EFIAPI IoRead16 ( IN UINTN Port ) { ASSERT (FALSE); return 0; } /** Writes a 16-bit I/O port. Writes the 16-bit I/O port specified by Port with the value specified by Value and returns Value. This function must guarantee that all I/O read and write operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. @return The value written the I/O port. **/ UINT16 EFIAPI IoWrite16 ( IN UINTN Port, IN UINT16 Value ) { ASSERT (FALSE); return Value; } /** Reads a 32-bit I/O port. Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned. This function must guarantee that all I/O read and write operations are serialized. If 32-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @return The value read. **/ UINT32 EFIAPI IoRead32 ( IN UINTN Port ) { ASSERT (FALSE); return 0; } /** Writes a 32-bit I/O port. Writes the 32-bit I/O port specified by Port with the value specified by Value and returns Value. This function must guarantee that all I/O read and write operations are serialized. If 32-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. @return The value written the I/O port. **/ UINT32 EFIAPI IoWrite32 ( IN UINTN Port, IN UINT32 Value ) { ASSERT (FALSE); return Value; } /** Reads a 64-bit I/O port. Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned. This function must guarantee that all I/O read and write operations are serialized. If 64-bit I/O port operations are not supported, then ASSERT(). If Port is not aligned on a 64-bit boundary, then ASSERT(). @param Port The I/O port to read. @return The value read. **/ UINT64 EFIAPI IoRead64 ( IN UINTN Port ) { ASSERT (FALSE); return 0; } /** Writes a 64-bit I/O port. Writes the 64-bit I/O port specified by Port with the value specified by Value and returns Value. This function must guarantee that all I/O read and write operations are serialized. If 64-bit I/O port operations are not supported, then ASSERT(). If Port is not aligned on a 64-bit boundary, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. @return The value written to the I/O port. **/ UINT64 EFIAPI IoWrite64 ( IN UINTN Port, IN UINT64 Value ) { ASSERT (FALSE); return 0; } /** Reads an 8-bit I/O port fifo into a block of memory. Reads the 8-bit I/O fifo port specified by Port. The port is read Count times, and the read data is stored in the provided Buffer. This function must guarantee that all I/O read and write operations are serialized. If 8-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @param Count The number of times to read I/O port. @param Buffer The buffer to store the read data into. **/ VOID EFIAPI IoReadFifo8 ( IN UINTN Port, IN UINTN Count, OUT VOID *Buffer ) { ASSERT (FALSE); } /** Writes a block of memory into an 8-bit I/O port fifo. Writes the 8-bit I/O fifo port specified by Port. The port is written Count times, and the write data is retrieved from the provided Buffer. This function must guarantee that all I/O write and write operations are serialized. If 8-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Count The number of times to write I/O port. @param Buffer The buffer to retrieve the write data from. **/ VOID EFIAPI IoWriteFifo8 ( IN UINTN Port, IN UINTN Count, IN VOID *Buffer ) { ASSERT (FALSE); } /** Reads a 16-bit I/O port fifo into a block of memory. Reads the 16-bit I/O fifo port specified by Port. The port is read Count times, and the read data is stored in the provided Buffer. This function must guarantee that all I/O read and write operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @param Count The number of times to read I/O port. @param Buffer The buffer to store the read data into. **/ VOID EFIAPI IoReadFifo16 ( IN UINTN Port, IN UINTN Count, OUT VOID *Buffer ) { ASSERT (FALSE); } /** Writes a block of memory into a 16-bit I/O port fifo. Writes the 16-bit I/O fifo port specified by Port. The port is written Count times, and the write data is retrieved from the provided Buffer. This function must guarantee that all I/O write and write operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Count The number of times to write I/O port. @param Buffer The buffer to retrieve the write data from. **/ VOID EFIAPI IoWriteFifo16 ( IN UINTN Port, IN UINTN Count, IN VOID *Buffer ) { ASSERT (FALSE); } /** Reads a 32-bit I/O port fifo into a block of memory. Reads the 32-bit I/O fifo port specified by Port. The port is read Count times, and the read data is stored in the provided Buffer. This function must guarantee that all I/O read and write operations are serialized. If 32-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to read. @param Count The number of times to read I/O port. @param Buffer The buffer to store the read data into. **/ VOID EFIAPI IoReadFifo32 ( IN UINTN Port, IN UINTN Count, OUT VOID *Buffer ) { ASSERT (FALSE); } /** Writes a block of memory into a 32-bit I/O port fifo. Writes the 32-bit I/O fifo port specified by Port. The port is written Count times, and the write data is retrieved from the provided Buffer. This function must guarantee that all I/O write and write operations are serialized. If 32-bit I/O port operations are not supported, then ASSERT(). @param Port The I/O port to write. @param Count The number of times to write I/O port. @param Buffer The buffer to retrieve the write data from. **/ VOID EFIAPI IoWriteFifo32 ( IN UINTN Port, IN UINTN Count, IN VOID *Buffer ) { ASSERT (FALSE); } /** Reads an 8-bit MMIO register. Reads the 8-bit MMIO register specified by Address. The 8-bit read value is returned. This function must guarantee that all MMIO read and write operations are serialized. If 8-bit MMIO register operations are not supported, then ASSERT(). @param Address The MMIO register to read. @return The value read. **/ UINT8 EFIAPI MmioRead8 ( IN UINTN Address ) { UINT8 Value; BOOLEAN Flag; Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value); if (Flag) { Value = *(volatile UINT8*)Address; } FilterAfterMmIoRead (FilterWidth8, Address, &Value); return Value; } /** Writes an 8-bit MMIO register. Writes the 8-bit MMIO register specified by Address with the value specified by Value and returns Value. This function must guarantee that all MMIO read and write operations are serialized. If 8-bit MMIO register operations are not supported, then ASSERT(). @param Address The MMIO register to write. @param Value The value to write to the MMIO register. **/ UINT8 EFIAPI MmioWrite8 ( IN UINTN Address, IN UINT8 Value ) { BOOLEAN Flag; Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value); if (Flag) { *(volatile UINT8*)Address = Value; } FilterAfterMmIoWrite (FilterWidth8, Address, &Value); return Value; } /** Reads a 16-bit MMIO register. Reads the 16-bit MMIO register specified by Address. The 16-bit read value 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(). @param Address The MMIO register to read. @return The value read. **/ UINT16 EFIAPI MmioRead16 ( IN UINTN Address ) { UINT16 Value; BOOLEAN Flag; ASSERT ((Address & 1) == 0); Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value); if (Flag) { Value = *(volatile UINT16*)Address; } FilterAfterMmIoRead (FilterWidth16, Address, &Value); return Value; } /** Writes a 16-bit MMIO register. Writes the 16-bit MMIO register specified by Address with the value specified 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(). @param Address The MMIO register to write. @param Value The value to write to the MMIO register. **/ UINT16 EFIAPI MmioWrite16 ( IN UINTN Address, IN UINT16 Value ) { BOOLEAN Flag; ASSERT ((Address & 1) == 0); Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value); if (Flag) { *(volatile UINT16*)Address = Value; } FilterAfterMmIoWrite (FilterWidth16, Address, &Value); return Value; } /** Reads a 32-bit MMIO register. Reads the 32-bit MMIO register specified by Address. The 32-bit read value 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(). @param Address The MMIO register to read. @return The value read. **/ UINT32 EFIAPI MmioRead32 ( IN UINTN Address ) { UINT32 Value; BOOLEAN Flag; ASSERT ((Address & 3) == 0); Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value); if (Flag) { Value = *(volatile UINT32*)Address; } FilterAfterMmIoRead (FilterWidth32, Address, &Value); return Value; } /** Writes a 32-bit MMIO register. Writes the 32-bit MMIO register specified by Address with the value specified 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(). @param Address The MMIO register to write. @param Value The value to write to the MMIO register. **/ UINT32 EFIAPI MmioWrite32 ( IN UINTN Address, IN UINT32 Value ) { BOOLEAN Flag; ASSERT ((Address & 3) == 0); Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value); if (Flag) { *(volatile UINT32*)Address = Value; } FilterAfterMmIoWrite (FilterWidth32, Address, &Value); return Value; } /** Reads a 64-bit MMIO register. Reads the 64-bit MMIO register specified by Address. The 64-bit read value 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(). @param Address The MMIO register to read. @return The value read. **/ UINT64 EFIAPI MmioRead64 ( IN UINTN Address ) { UINT64 Value; BOOLEAN Flag; ASSERT ((Address & 7) == 0); Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value); if (Flag) { Value = *(volatile UINT64*)Address; } FilterAfterMmIoRead (FilterWidth64, Address, &Value); return Value; } /** Writes a 64-bit MMIO register. Writes the 64-bit MMIO register specified by Address with the value specified 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(). @param Address The MMIO register to write. @param Value The value to write to the MMIO register. **/ UINT64 EFIAPI MmioWrite64 ( IN UINTN Address, IN UINT64 Value ) { BOOLEAN Flag; ASSERT ((Address & 7) == 0); Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value); if (Flag) { *(volatile UINT64*)Address = Value; } FilterAfterMmIoWrite (FilterWidth64, Address, &Value); return Value; }