From 3ca55ed48d354ef2a34b05c7f83330ff151d1bc0 Mon Sep 17 00:00:00 2001 From: xli24 Date: Mon, 7 Dec 2009 03:09:04 +0000 Subject: Check in driver to produce CPU I/O 2 Protocol for IA32 and X64 architecture. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9522 6f19259b-4bc3-4df7-8a09-765794883524 --- UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c | 562 +++++++++++++++++++++++++++++++++++++ UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h | 142 ++++++++++ UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf | 50 ++++ UefiCpuPkg/CpuIoDxe/CpuIo.c | 531 ----------------------------------- UefiCpuPkg/CpuIoDxe/CpuIo.h | 244 ---------------- UefiCpuPkg/CpuIoDxe/CpuIo.inf | 51 ---- UefiCpuPkg/UefiCpuPkg.dsc | 2 +- 7 files changed, 755 insertions(+), 827 deletions(-) create mode 100644 UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c create mode 100644 UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h create mode 100644 UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf delete mode 100644 UefiCpuPkg/CpuIoDxe/CpuIo.c delete mode 100644 UefiCpuPkg/CpuIoDxe/CpuIo.h delete mode 100644 UefiCpuPkg/CpuIoDxe/CpuIo.inf (limited to 'UefiCpuPkg') diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c new file mode 100644 index 0000000000..a688f3bb8e --- /dev/null +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.c @@ -0,0 +1,562 @@ +/** @file + Produces the CPU I/O 2 Protocol. + +Copyright (c) 2009, Intel Corporation +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. + +**/ + +#include "CpuIo2Dxe.h" + +EFI_HANDLE mHandle = NULL; +EFI_CPU_IO2_PROTOCOL mCpuIo = { + { + CpuMemoryServiceRead, + CpuMemoryServiceWrite + }, + { + CpuIoServiceRead, + CpuIoServiceWrite + } +}; + +/** + Worker function to check the validation of parameters for CPU I/O interface functions. + + This function check the validation of parameters for CPU I/O interface functions. + + @param Width Width of the Mmio/Io operation + @param Address Base address of the Mmio/Io operation + @param Count Count of the number of accesses to perform + @param Buffer Pointer to the buffer to read from memory + @param Limit Maximum address supported + + @retval EFI_INVALID_PARAMETER Buffer is NULL + @retval EFI_UNSUPPORTED The address range specified by Width, Address and Count is invalid + @retval EFI_UNSUPPORTED The memory buffer is not aligned + @retval EFI_SUCCESS Parameters are valid + +**/ +EFI_STATUS +CpuIoCheckParameter ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer, + IN UINT64 Limit + ) +{ + UINTN AlignMask; + + if (Buffer == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (Address > Limit) { + return EFI_UNSUPPORTED; + } + + // + // For FiFo type, the target address won't increase during the access, + // so treat count as 1 + // + if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { + Count = 1; + } + + Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + if (Address - 1 + (UINT32)(1 << Width) * Count > Limit) { + return EFI_UNSUPPORTED; + } + + AlignMask = (1 << Width) - 1; + if ((UINTN) Buffer & AlignMask) { + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +/** + Worker function to update access width and count for access to the unaligned address. + Unaligned Io/MmIo address access, break up the request into word by word or byte by byte. + + @param Address Base address of the Mmio/Io operation + @param PtrWidth Pointer to width of the Mmio/Io operation + Out, this value will be updated for access to the unaligned address. + @param PtrCount Pointer to count of the number of accesses to perform + Out, this value will be updated for access to the unaligned address. +**/ +VOID +CpuIoUpdateWidthCount ( + IN UINT64 Address, + IN OUT EFI_CPU_IO_PROTOCOL_WIDTH *PtrWidth, + IN OUT UINTN *PtrCount + ) +{ + EFI_CPU_IO_PROTOCOL_WIDTH BufferWidth; + UINTN BufferCount; + + BufferWidth = *PtrWidth; + BufferCount = *PtrCount; + + switch (BufferWidth) { + case EfiCpuIoWidthUint8: + break; + + case EfiCpuIoWidthUint16: + if ((Address & 0x01) == 0) { + break; + } else { + BufferCount = BufferCount * 2; + BufferWidth = EfiCpuIoWidthUint8; + } + break; + + case EfiCpuIoWidthUint32: + if ((Address & 0x03) == 0) { + break; + } else if ((Address & 0x01) == 0) { + BufferCount = BufferCount * 2; + BufferWidth = EfiCpuIoWidthUint16; + } else { + BufferCount = BufferCount * 4; + BufferWidth = EfiCpuIoWidthUint8; + } + break; + + case EfiCpuIoWidthUint64: + if ((Address & 0x07) == 0) { + break; + } else if ((Address & 0x03) == 0) { + BufferCount = BufferCount * 2; + BufferWidth = EfiCpuIoWidthUint32; + } else if ((Address & 0x01) == 0) { + BufferCount = BufferCount * 4; + BufferWidth = EfiCpuIoWidthUint16; + } else { + BufferCount = BufferCount * 8; + BufferWidth = EfiCpuIoWidthUint8; + } + break; + + default: + return; + } + + *PtrWidth = BufferWidth; + *PtrCount = BufferCount; + + return; +} + +/** + Worker function to perform memory mapped I/O read/write + + This function provides private services to perform memory mapped I/O read/write. + + @param Width Width of the memory mapped I/O operation + @param Count Count of the number of accesses to perform + @param DestinationStrideFlag Boolean flag indicates if the destination is to be incremented + @param Destination Destination of the memory mapped I/O operation + @param SourceStrideFlag Boolean flag indicates if the source is to be incremented + @param Source Source of the memory mapped I/O operation + + @retval EFI_SUCCESS Successful operation + @retval EFI_INVALID_PARAMETER Width is invalid + +**/ +EFI_STATUS +CpuIoMemRW ( + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINTN Count, + IN BOOLEAN DestinationStrideFlag, + OUT PTR Destination, + IN BOOLEAN SourceStrideFlag, + IN PTR Source + ) +{ + UINTN Stride; + UINTN DestinationStride; + UINTN SourceStride; + + Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + Stride = (UINT32)(1 << Width); + DestinationStride = DestinationStrideFlag ? Stride : 0; + SourceStride = SourceStrideFlag ? Stride : 0; + + // + // Loop for each iteration and move the data + // + switch (Width) { + case EfiCpuIoWidthUint8: + for (; Count > 0; Count--, Destination.Buf += DestinationStride, Source.Buf += SourceStride) { + MmioWrite8((UINTN)Destination.Ui8 , MmioRead8((UINTN)Source.Ui8)); + } + break; + + case EfiCpuIoWidthUint16: + for (; Count > 0; Count--, Destination.Buf += DestinationStride, Source.Buf += SourceStride) { + MmioWrite16((UINTN)Destination.Ui16 , MmioRead16((UINTN)Source.Ui16)); + } + break; + + case EfiCpuIoWidthUint32: + for (; Count > 0; Count--, Destination.Buf += DestinationStride, Source.Buf += SourceStride) { + MmioWrite32((UINTN)Destination.Ui32 , MmioRead32((UINTN)Source.Ui32)); + } + break; + + case EfiCpuIoWidthUint64: + for (; Count > 0; Count--, Destination.Buf += DestinationStride, Source.Buf += SourceStride) { + MmioWrite64((UINTN)Destination.Ui64 , MmioRead64((UINTN)Source.Ui64)); + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +/** + Enables a driver to read memory-mapped registers in the PI System memory space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the memory operation. + @param[in] Address The base address of the memory operation. + @param[in] Count The number of memory operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[out] Buffer The destination buffer to store the results. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuMemoryServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + OUT VOID *Buffer + ) +{ + PTR Source; + PTR Destination; + EFI_STATUS Status; + EFI_CPU_IO_PROTOCOL_WIDTH BufferWidth; + + Status = CpuIoCheckParameter (Width, Address, Count, Buffer, MAX_ADDRESS); + if (EFI_ERROR (Status)) { + return Status; + } + + Destination.Buf = Buffer; + Source.Buf = (VOID *) (UINTN) Address; + + // + // Support access to unaligned mmio address. + // Break up the request into byte by byte + // + BufferWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + CpuIoUpdateWidthCount (Address, &BufferWidth, &Count); + + if (Width >= EfiCpuIoWidthUint8 && Width <= EfiCpuIoWidthUint64) { + return CpuIoMemRW (BufferWidth, Count, TRUE, Destination, TRUE, Source); + } + + if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { + return CpuIoMemRW (BufferWidth, Count, TRUE, Destination, FALSE, Source); + } + + if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { + return CpuIoMemRW (BufferWidth, Count, FALSE, Destination, TRUE, Source); + } + + return EFI_INVALID_PARAMETER; +} + +/** + Enables a driver to write memory-mapped registers in the PI System memory space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the memory operation. + @param[in] Address The base address of the memory operation. + @param[in] Count The number of memory operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[in] Buffer The source buffer from which to write data. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuMemoryServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer + ) +{ + PTR Source; + PTR Destination; + EFI_STATUS Status; + EFI_CPU_IO_PROTOCOL_WIDTH BufferWidth; + + Status = CpuIoCheckParameter (Width, Address, Count, Buffer, MAX_ADDRESS); + if (EFI_ERROR (Status)) { + return Status; + } + + Destination.Buf = (VOID *) (UINTN) Address; + Source.Buf = Buffer; + + // + // Support access to unaligned mmio address. + // Break up the request into byte by byte + // + BufferWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + CpuIoUpdateWidthCount (Address, &BufferWidth, &Count); + + if (Width >= EfiCpuIoWidthUint8 && Width <= EfiCpuIoWidthUint64) { + return CpuIoMemRW (BufferWidth, Count, TRUE, Destination, TRUE, Source); + } + + if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { + return CpuIoMemRW (BufferWidth, Count, FALSE, Destination, TRUE, Source); + } + + if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { + return CpuIoMemRW (BufferWidth, Count, TRUE, Destination, FALSE, Source); + } + + return EFI_INVALID_PARAMETER; +} + +/** + Enables a driver to read registers in the PI CPU I/O space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the I/O operation. + @param[in] UserAddress The base address of the I/O operation. The caller is responsible + for aligning the Address if required. + @param[in] Count The number of I/O operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[out] UserBuffer The destination buffer to store the results. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuIoServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 UserAddress, + IN UINTN Count, + OUT VOID *UserBuffer + ) +{ + UINTN InStride; + UINTN OutStride; + UINTN Address; + PTR Buffer; + EFI_STATUS Status; + EFI_CPU_IO_PROTOCOL_WIDTH BufferWidth; + + Buffer.Buf = (UINT8 *) UserBuffer; + + if (Width >= EfiCpuIoWidthMaximum) { + return EFI_INVALID_PARAMETER; + } + + Status = CpuIoCheckParameter (Width, UserAddress, Count, UserBuffer, IA32_MAX_IO_ADDRESS); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Support access to unaligned IO address. + // Break up the request into byte by byte + // + BufferWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + CpuIoUpdateWidthCount (UserAddress, &BufferWidth, &Count); + + Address = (UINTN) UserAddress; + InStride = (UINT32)(1 << (BufferWidth & 0x03)); + OutStride = InStride; + if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { + InStride = 0; + } + + if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { + OutStride = 0; + } + + // + // Loop for each iteration and move the data + // + switch (BufferWidth) { + case EfiCpuIoWidthUint8: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + *Buffer.Ui8 = IoRead8 (Address); + } + break; + + case EfiCpuIoWidthUint16: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + *Buffer.Ui16 = IoRead16 (Address); + } + break; + + case EfiCpuIoWidthUint32: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + *Buffer.Ui32 = IoRead32 (Address); + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +/** + Enables a driver to write registers in the PI CPU I/O space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the I/O operation. + @param[in] UserAddress The base address of the I/O operation. The caller is responsible + for aligning the Address if required. + @param[in] Count The number of I/O operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[in] UserBuffer The source buffer from which to write data. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuIoServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 UserAddress, + IN UINTN Count, + IN VOID *UserBuffer + ) +{ + UINTN InStride; + UINTN OutStride; + UINTN Address; + PTR Buffer; + EFI_STATUS Status; + EFI_CPU_IO_PROTOCOL_WIDTH BufferWidth; + + Buffer.Buf = (UINT8 *) UserBuffer; + + if (Width >= EfiCpuIoWidthMaximum) { + return EFI_INVALID_PARAMETER; + } + + Status = CpuIoCheckParameter (Width, UserAddress, Count, UserBuffer, IA32_MAX_IO_ADDRESS); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Support access to unaligned IO address. + // Break up the request into byte by byte + // + BufferWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); + CpuIoUpdateWidthCount (UserAddress, &BufferWidth, &Count); + + Address = (UINTN) UserAddress; + InStride = (UINT32)(1 << (BufferWidth & 0x03)); + OutStride = InStride; + if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { + InStride = 0; + } + + if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { + OutStride = 0; + } + + // + // Loop for each iteration and move the data + // + switch (BufferWidth) { + case EfiCpuIoWidthUint8: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + IoWrite8 (Address, *Buffer.Ui8); + } + break; + + case EfiCpuIoWidthUint16: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + IoWrite16 (Address, *Buffer.Ui16); + } + break; + + case EfiCpuIoWidthUint32: + for (; Count > 0; Count--, Buffer.Buf += OutStride, Address += InStride) { + IoWrite32 (Address, *Buffer.Ui32); + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +/** + Entrypoint of CPU I/O 2 DXE module. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + +**/ +EFI_STATUS +EFIAPI +CpuIo2Initialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->InstallProtocolInterface ( + &mHandle, + &gEfiCpuIo2ProtocolGuid, + EFI_NATIVE_INTERFACE, + &mCpuIo + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h new file mode 100644 index 0000000000..31d12b3bd5 --- /dev/null +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.h @@ -0,0 +1,142 @@ +/** @file + Internal include file for the CPU I/O 2 Protocol implementation. + +Copyright (c) 2009, Intel Corporation +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. + +**/ + +#ifndef _CPU_IO2_H_ +#define _CPU_IO2_H_ + +#include + +#include +#include +#include +#include + +#define IA32_MAX_IO_ADDRESS 0xFFFF + +typedef union { + UINT8 volatile *Buf; + UINT8 volatile *Ui8; + UINT16 volatile *Ui16; + UINT32 volatile *Ui32; + UINT64 volatile *Ui64; + UINTN volatile Ui; +} PTR; + +/** + Enables a driver to read memory-mapped registers in the PI System memory space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the memory operation. + @param[in] Address The base address of the memory operation. + @param[in] Count The number of memory operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[out] Buffer The destination buffer to store the results. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuMemoryServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + OUT VOID *Buffer + ); + +/** + Enables a driver to write memory-mapped registers in the PI System memory space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the memory operation. + @param[in] Address The base address of the memory operation. + @param[in] Count The number of memory operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[in] Buffer The source buffer from which to write data. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuMemoryServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer + ); + +/** + Enables a driver to read registers in the PI CPU I/O space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the I/O operation. + @param[in] UserAddress The base address of the I/O operation. The caller is responsible + for aligning the Address if required. + @param[in] Count The number of I/O operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[out] UserBuffer The destination buffer to store the results. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuIoServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 UserAddress, + IN UINTN Count, + OUT VOID *UserBuffer + ); + +/** + Enables a driver to write registers in the PI CPU I/O space. + + @param[in] This A pointer to the EFI_CPU_IO2_PROTOCOL instance. + @param[in] Width Signifies the width of the I/O operation. + @param[in] UserAddress The base address of the I/O operation. The caller is responsible + for aligning the Address if required. + @param[in] Count The number of I/O operations to perform. The number of bytes moved + is Width size * Count, starting at Address. + @param[in] UserBuffer The source buffer from which to write data. + + @retval EFI_SUCCESS The data was read from or written to the EFI system. + @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system. Or Buffer is NULL. + @retval EFI_UNSUPPORTED The Buffer is not aligned for the given Width. + Or,The address range specified by Address, Width, and Count is not valid for this EFI system. + +**/ +EFI_STATUS +EFIAPI +CpuIoServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 UserAddress, + IN UINTN Count, + IN VOID *UserBuffer + ); + +#endif diff --git a/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf new file mode 100644 index 0000000000..c026b6c238 --- /dev/null +++ b/UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf @@ -0,0 +1,50 @@ +#/** @file +# Produces the CPU I/O 2 Protocol. +# +# This DXE driver produces of the CPU I/O 2 Protocol, as introduced by PI 1.2. +# +# Copyright (c) 2009, Intel Corporation +# 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 = 0x00010005 + BASE_NAME = CpuIo2Dxe + FILE_GUID = A19B1FE7-C1BC-49F8-875F-54A5D542443F + MODULE_TYPE = DXE_DRIVER + + ENTRY_POINT = CpuIo2Initialize + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources.common] + CpuIo2Dxe.h + CpuIo2Dxe.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + UefiDriverEntryPoint + IoLib + DebugLib + + +[Protocols] + gEfiCpuIo2ProtocolGuid ## PRODUCES + +[Depex] + TRUE + diff --git a/UefiCpuPkg/CpuIoDxe/CpuIo.c b/UefiCpuPkg/CpuIoDxe/CpuIo.c deleted file mode 100644 index 729f556e46..0000000000 --- a/UefiCpuPkg/CpuIoDxe/CpuIo.c +++ /dev/null @@ -1,531 +0,0 @@ -/*++ - -Copyright (c) 2004 - 2007, Intel Corporation -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. - -Module Name: - CpuIo.c - -Abstract: - - This is the code that publishes the CPU I/O Protocol. - The intent herein is to have a single I/O service that can load - as early as possible, extend into runtime, and be layered upon by - the implementations of architectural protocols and the PCI Root - Bridge I/O Protocol. - ---*/ - -#include "CpuIo.h" - -#define IA32_MAX_IO_ADDRESS 0xFFFF - -EFI_CPU_IO_PROTOCOL mCpuIo = { - { - CpuMemoryServiceRead, - CpuMemoryServiceWrite - }, - { - CpuIoServiceRead, - CpuIoServiceWrite - } -}; - -EFI_STATUS -CpuIoMemRW ( - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINTN Count, - IN BOOLEAN DestinationStrideFlag, - OUT PTR Destination, - IN BOOLEAN SourceStrideFlag, - IN PTR Source - ) -/*++ - -Routine Description: - - Private service to perform memory mapped I/O read/write - -Arguments: - - Width - Width of the memory mapped I/O operation - Count - Count of the number of accesses to perform - DestinationStrideFlag - Boolean flag indicates if the destination is to be incremented - Destination - Destination of the memory mapped I/O operation - SourceStrideFlag - Boolean flag indicates if the source is to be incremented - Source - Source of the memory mapped I/O operation - -Returns: - - EFI_SUCCESS - Successful operation - EFI_INVALID_PARAMETER - Width is invalid - ---*/ -{ - UINTN Stride; - UINTN DestinationStride; - UINTN SourceStride; - - Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); - Stride = (UINTN)1 << Width; - DestinationStride = DestinationStrideFlag ? Stride : 0; - SourceStride = SourceStrideFlag ? Stride : 0; - - // - // Loop for each iteration and move the data - // - switch (Width) { - case EfiCpuIoWidthUint8: - for (; Count > 0; Count--, Destination.buf += DestinationStride, Source.buf += SourceStride) { - MemoryFence(); - *Destination.ui8 = *Source.ui8; - MemoryFence(); - } - break; - - case EfiCpuIoWidthUint16: - for (; Count > 0; Count--, Destination.buf += DestinationStride, Source.buf += SourceStride) { - MemoryFence (); - *Destination.ui16 = *Source.ui16; - MemoryFence (); - } - break; - - case EfiCpuIoWidthUint32: - for (; Count > 0; Count--, Destination.buf += DestinationStride, Source.buf += SourceStride) { - MemoryFence (); - *Destination.ui32 = *Source.ui32; - MemoryFence (); - } - break; - - case EfiCpuIoWidthUint64: - for (; Count > 0; Count--, Destination.buf += DestinationStride, Source.buf += SourceStride) { - MemoryFence (); - *Destination.ui64 = *Source.ui64; - MemoryFence (); - } - break; - - default: - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -EFIAPI -CpuMemoryServiceRead ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - OUT VOID *Buffer - ) -/*++ - -Routine Description: - - Perform the memory mapped I/O read service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the memory mapped I/O operation - Address - Base address of the memory mapped I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the destination buffer to store the results - -Returns: - - EFI_SUCCESS - The data was read. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -{ - PTR Source; - PTR Destination; - EFI_STATUS Status; - - Status = CpuIoCheckParameter (Width, Address, Count, Buffer, MAX_ADDRESS); - if (EFI_ERROR (Status)) { - return Status; - } - - Destination.buf = Buffer; - Source.buf = (VOID *) (UINTN) Address; - - if (Width >= EfiCpuIoWidthUint8 && Width <= EfiCpuIoWidthUint64) { - return CpuIoMemRW (Width, Count, TRUE, Destination, TRUE, Source); - } - - if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { - return CpuIoMemRW (Width, Count, TRUE, Destination, FALSE, Source); - } - - if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { - return CpuIoMemRW (Width, Count, FALSE, Destination, TRUE, Source); - } - - return EFI_INVALID_PARAMETER; -} - -EFI_STATUS -EFIAPI -CpuMemoryServiceWrite ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN VOID *Buffer - ) -/*++ - -Routine Description: - - Perform the memory mapped I/O write service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the memory mapped I/O operation - Address - Base address of the memory mapped I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the source buffer from which to write data - -Returns: - - EFI_SUCCESS - The data was written. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -{ - PTR Source; - PTR Destination; - EFI_STATUS Status; - - Status = CpuIoCheckParameter (Width, Address, Count, Buffer, MAX_ADDRESS); - if (EFI_ERROR (Status)) { - return Status; - } - - Destination.buf = (VOID *) (UINTN) Address; - Source.buf = Buffer; - - if (Width >= EfiCpuIoWidthUint8 && Width <= EfiCpuIoWidthUint64) { - return CpuIoMemRW (Width, Count, TRUE, Destination, TRUE, Source); - } - - if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { - return CpuIoMemRW (Width, Count, FALSE, Destination, TRUE, Source); - } - - if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { - return CpuIoMemRW (Width, Count, TRUE, Destination, FALSE, Source); - } - - return EFI_INVALID_PARAMETER; -} - -EFI_STATUS -EFIAPI -CpuIoServiceRead ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - OUT VOID *UserBuffer - ) -/*++ - -Routine Description: - - Perform the port I/O read service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the port I/O operation - Address - Base address of the port I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the destination buffer to store the results - -Returns: - - EFI_SUCCESS - The data was read. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -{ - UINTN InStride; - UINTN OutStride; - UINTN Address; - PTR Buffer; - EFI_STATUS Status; - - Buffer.buf = (UINT8 *) UserBuffer; - - if (Width >= EfiCpuIoWidthMaximum) { - return EFI_INVALID_PARAMETER; - } - - Status = CpuIoCheckParameter (Width, UserAddress, Count, UserBuffer, IA32_MAX_IO_ADDRESS); - if (EFI_ERROR (Status)) { - return Status; - } - - Address = (UINTN) UserAddress; - InStride = (UINTN)1 << (Width & 0x03); - OutStride = InStride; - if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { - InStride = 0; - } - - if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { - OutStride = 0; - } - - Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); - - // - // Loop for each iteration and move the data - // - switch (Width) { - case EfiCpuIoWidthUint8: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - *Buffer.ui8 = IoRead8 ((UINTN) Address); - } - break; - - case EfiCpuIoWidthUint16: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - *Buffer.ui16 = IoRead16 ((UINTN) Address); - } - break; - - case EfiCpuIoWidthUint32: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - *Buffer.ui32 = IoRead32 ((UINTN) Address); - } - break; - - default: - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -EFIAPI -CpuIoServiceWrite ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - IN VOID *UserBuffer - ) -/*++ - -Routine Description: - - Perform the port I/O write service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the port I/O operation - Address - Base address of the port I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the source buffer from which to write data - -Returns: - - EFI_SUCCESS - The data was written. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -{ - UINTN InStride; - UINTN OutStride; - UINTN Address; - PTR Buffer; - EFI_STATUS Status; - - Buffer.buf = (UINT8 *) UserBuffer; - - if (Width >= EfiCpuIoWidthMaximum) { - return EFI_INVALID_PARAMETER; - } - - Status = CpuIoCheckParameter (Width, UserAddress, Count, UserBuffer, IA32_MAX_IO_ADDRESS); - if (EFI_ERROR (Status)) { - return Status; - } - - Address = (UINTN) UserAddress; - InStride = (UINTN)1 << (Width & 0x03); - OutStride = InStride; - if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { - InStride = 0; - } - - if (Width >= EfiCpuIoWidthFillUint8 && Width <= EfiCpuIoWidthFillUint64) { - OutStride = 0; - } - - Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); - - // - // Loop for each iteration and move the data - // - switch (Width) { - case EfiCpuIoWidthUint8: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - IoWrite8 ((UINTN) Address, *Buffer.ui8); - } - break; - - case EfiCpuIoWidthUint16: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - IoWrite16 ((UINTN) Address, *Buffer.ui16); - } - break; - - case EfiCpuIoWidthUint32: - for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { - IoWrite32 ((UINTN) Address, *Buffer.ui32); - } - break; - - default: - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -EFIAPI -CpuIoInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -/*++ - -Routine Description: - - CpuIo driver entry point. - -Arguments: - - ImageHandle - The firmware allocated handle for the EFI image. - SystemTable - A pointer to the EFI System Table. - -Returns: - - EFI_SUCCESS - The driver was initialized. - EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of resources. - ---*/ -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - - Handle = NULL; - Status = SystemTable->BootServices->InstallProtocolInterface ( - &Handle, - &gEfiCpuIoProtocolGuid, - EFI_NATIVE_INTERFACE, - &mCpuIo - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -EFI_STATUS -CpuIoCheckParameter ( - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN VOID *Buffer, - IN UINT64 Limit - ) -/*++ - -Routine Description: - - Check the validation of parameters for CPU I/O interface functions. - -Arguments: - - Width - Width of the Memory Access - Address - Address of the Memory access - Count - Count of the number of accesses to perform - Buffer - Pointer to the buffer to read from memory - Buffer - Memory buffer for the I/O operation - Limit - Maximum address supported - -Returns: - - EFI_INVALID_PARAMETER - Buffer is NULL - EFI_UNSUPPORTED - The address range specified by Width, Address and Count is invalid - EFI_UNSUPPORTED - The memory buffer is not aligned - EFI_SUCCESS - Parameters are OK - ---*/ -{ - UINTN AlignMask; - - if (Buffer == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (Address > Limit) { - return EFI_UNSUPPORTED; - } - - // - // For FiFo type, the target address won't increase during the access, - // so treat count as 1 - // - if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) { - Count = 1; - } - - Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03); - if (Address - 1 + ((UINTN)1 << Width) * Count > Limit) { - return EFI_UNSUPPORTED; - } - - AlignMask = ((UINTN)1 << Width) - 1; - if ((UINTN) Buffer & AlignMask) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} diff --git a/UefiCpuPkg/CpuIoDxe/CpuIo.h b/UefiCpuPkg/CpuIoDxe/CpuIo.h deleted file mode 100644 index 350d80cf44..0000000000 --- a/UefiCpuPkg/CpuIoDxe/CpuIo.h +++ /dev/null @@ -1,244 +0,0 @@ -/*++ - -Copyright (c) 2004, Intel Corporation -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. - -Module Name: - CpuIo.h - -Abstract: - *.h file for the driver - - Note: the EFIAPI on the CpuIo functions is used to glue MASM (assembler) code - into C code. By making the MASM functions EFIAPI it ensures that a standard - C calling convention is assumed by the compiler, reguardless of the compiler - flags. - - ---*/ - -#ifndef _CPU_IO_H -#define _CPU_IO_H - -#include - -#include - -#include -#include -#include - -typedef union { - UINT8 volatile *buf; - UINT8 volatile *ui8; - UINT16 volatile *ui16; - UINT32 volatile *ui32; - UINT64 volatile *ui64; - UINTN volatile ui; -} PTR; - -EFI_STATUS -EFIAPI -CpuIoInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -/*++ - -Routine Description: - - CpuIo driver entry point. - -Arguments: - - ImageHandle - The firmware allocated handle for the EFI image. - SystemTable - A pointer to the EFI System Table. - -Returns: - - EFI_SUCCESS - The driver was initialized. - EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of resources. - ---*/ -; - -EFI_STATUS -EFIAPI -CpuMemoryServiceRead ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - OUT VOID *Buffer - ) -/*++ - -Routine Description: - - Perform the memory mapped I/O read service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the memory mapped I/O operation - Address - Base address of the memory mapped I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the destination buffer to store the results - -Returns: - - EFI_SUCCESS - The data was read. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -; - -EFI_STATUS -EFIAPI -CpuMemoryServiceWrite ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN VOID *Buffer - ) -/*++ - -Routine Description: - - Perform the memory mapped I/O write service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the memory mapped I/O operation - Address - Base address of the memory mapped I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the source buffer from which to write data - -Returns: - - EFI_SUCCESS - The data was written. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -; - -EFI_STATUS -EFIAPI -CpuIoServiceRead ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - OUT VOID *UserBuffer - ) -/*++ - -Routine Description: - - Perform the port I/O read service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the port I/O operation - Address - Base address of the port I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the destination buffer to store the results - -Returns: - - EFI_SUCCESS - The data was read. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -; - -EFI_STATUS -EFIAPI -CpuIoServiceWrite ( - IN EFI_CPU_IO_PROTOCOL *This, - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - IN VOID *UserBuffer - ) -/*++ - -Routine Description: - - Perform the port I/O write service - -Arguments: - - This - Pointer to an instance of the CPU I/O Protocol - Width - Width of the port I/O operation - Address - Base address of the port I/O operation - Count - Count of the number of accesses to perform - Buffer - Pointer to the source buffer from which to write data - -Returns: - - EFI_SUCCESS - The data was written. - EFI_INVALID_PARAMETER - Width is invalid. - EFI_INVALID_PARAMETER - Buffer is NULL. - EFI_UNSUPPORTED - The Buffer is not aligned for the given Width. - EFI_UNSUPPORTED - The address range specified by Address, Width, - and Count is not valid. - ---*/ -; - -EFI_STATUS -CpuIoCheckParameter ( - IN EFI_CPU_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN VOID *Buffer, - IN UINT64 Limit - ) -/*++ - -Routine Description: - - Check the validation of parameters for CPU I/O interface functions. - -Arguments: - - Width - Width of the Memory Access - Address - Address of the Memory access - Count - Count of the number of accesses to perform - Buffer - Pointer to the buffer to read from memory - Buffer - Memory buffer for the I/O operation - Limit - Maximum address supported - -Returns: - - EFI_INVALID_PARAMETER - Buffer is NULL - EFI_UNSUPPORTED - The address range specified by Width, Address and Count is invalid - EFI_UNSUPPORTED - The memory buffer is not aligned - EFI_SUCCESS - Parameters are OK - ---*/ -; - -#endif diff --git a/UefiCpuPkg/CpuIoDxe/CpuIo.inf b/UefiCpuPkg/CpuIoDxe/CpuIo.inf deleted file mode 100644 index 14f0b8d71a..0000000000 --- a/UefiCpuPkg/CpuIoDxe/CpuIo.inf +++ /dev/null @@ -1,51 +0,0 @@ -#/*++ -# -# Copyright (c) 2004, Intel Corporation -# 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. -# -# Module Name: -# -# CpuIo.inf -# -# Abstract: -# -# Component description file for CpuIo module -# -#--*/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = CpuIo - FILE_GUID = BAE7599F-3C6B-43b7-BDF0-9CE07AA91AA6 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - EDK_RELEASE_VERSION = 0x00020000 - EFI_SPECIFICATION_VERSION = 0x00020000 - - ENTRY_POINT = CpuIoInitialize - -[Packages] - MdePkg/MdePkg.dec - IntelFrameworkPkg/IntelFrameworkPkg.dec - -[LibraryClasses] - BaseLib - DebugLib - UefiDriverEntryPoint - IoLib - -[Sources.common] - CpuIo.c - CpuIo.h - -[Protocols] - gEfiCpuIoProtocolGuid - -[Depex] - TRUE diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index ab8a4640de..1b978396fa 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -49,5 +49,5 @@ # [Components.common] - UefiCpuPkg/CpuIoDxe/CpuIo.inf + UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf -- cgit v1.2.3