From c69dd9dfad3eb97d5e21f520f3ba35d102ec4cfa Mon Sep 17 00:00:00 2001 From: klu2 Date: Thu, 17 Apr 2008 05:48:13 +0000 Subject: Porting Duet module from EDKI to EDKII git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5076 6f19259b-4bc3-4df7-8a09-765794883524 --- DuetPkg/CpuIoDxe/CpuIo.c | 533 ++++++++++++++++++++++++++++++++++ DuetPkg/CpuIoDxe/CpuIo.h | 245 ++++++++++++++++ DuetPkg/CpuIoDxe/CpuIo.inf | 56 ++++ DuetPkg/CpuIoDxe/CpuIoAccess.h | 216 ++++++++++++++ DuetPkg/CpuIoDxe/Ia32/CpuIoAccess.asm | 120 ++++++++ DuetPkg/CpuIoDxe/Ia32CpuIo.dxs | 26 ++ DuetPkg/CpuIoDxe/x64/CpuIoAccess.asm | 111 +++++++ 7 files changed, 1307 insertions(+) create mode 100644 DuetPkg/CpuIoDxe/CpuIo.c create mode 100644 DuetPkg/CpuIoDxe/CpuIo.h create mode 100644 DuetPkg/CpuIoDxe/CpuIo.inf create mode 100644 DuetPkg/CpuIoDxe/CpuIoAccess.h create mode 100644 DuetPkg/CpuIoDxe/Ia32/CpuIoAccess.asm create mode 100644 DuetPkg/CpuIoDxe/Ia32CpuIo.dxs create mode 100644 DuetPkg/CpuIoDxe/x64/CpuIoAccess.asm (limited to 'DuetPkg/CpuIoDxe') diff --git a/DuetPkg/CpuIoDxe/CpuIo.c b/DuetPkg/CpuIoDxe/CpuIo.c new file mode 100644 index 0000000000..f95697130c --- /dev/null +++ b/DuetPkg/CpuIoDxe/CpuIo.c @@ -0,0 +1,533 @@ +/*++ + +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" +#include "CpuIoAccess.h" + +#define IA32_MAX_IO_ADDRESS 0xFFFF + +EFI_CPU_IO_PROTOCOL mCpuIo = { + { + CpuMemoryServiceRead, + CpuMemoryServiceWrite + }, + { + CpuIoServiceRead, + CpuIoServiceWrite + } +}; + +STATIC +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 = 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, EFI_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, EFI_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 = 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 = CpuIoRead8 ((UINT16) Address); + } + break; + + case EfiCpuIoWidthUint16: + for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { + *Buffer.ui16 = CpuIoRead16 ((UINT16) Address); + } + break; + + case EfiCpuIoWidthUint32: + for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { + *Buffer.ui32 = CpuIoRead32 ((UINT16) 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 = Width & 0x03; + + // + // Loop for each iteration and move the data + // + switch (Width) { + case EfiCpuIoWidthUint8: + for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { + CpuIoWrite8 ((UINT16) Address, *Buffer.ui8); + } + break; + + case EfiCpuIoWidthUint16: + for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { + CpuIoWrite16 ((UINT16) Address, *Buffer.ui16); + } + break; + + case EfiCpuIoWidthUint32: + for (; Count > 0; Count--, Buffer.buf += OutStride, Address += InStride) { + CpuIoWrite32 ((UINT16) 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 = 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/DuetPkg/CpuIoDxe/CpuIo.h b/DuetPkg/CpuIoDxe/CpuIo.h new file mode 100644 index 0000000000..622cc1560f --- /dev/null +++ b/DuetPkg/CpuIoDxe/CpuIo.h @@ -0,0 +1,245 @@ +/*++ + +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 + +#define VOLATILE volatile + +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/DuetPkg/CpuIoDxe/CpuIo.inf b/DuetPkg/CpuIoDxe/CpuIo.inf new file mode 100644 index 0000000000..9deda69ce0 --- /dev/null +++ b/DuetPkg/CpuIoDxe/CpuIo.inf @@ -0,0 +1,56 @@ +#/*++ +# +# 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] + DuetPkg/DuetPkg.dec + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + UefiDriverEntryPoint + IoLib + +[Sources.common] + CpuIo.c + CpuIo.h + CpuIoAccess.h + +[Sources.IA32] + IA32\CpuIoAccess.asm + +[Sources.X64] + X64\CpuIoAccess.asm + +[Protocols] + gEfiCpuIoProtocolGuid \ No newline at end of file diff --git a/DuetPkg/CpuIoDxe/CpuIoAccess.h b/DuetPkg/CpuIoDxe/CpuIoAccess.h new file mode 100644 index 0000000000..3983ec8f73 --- /dev/null +++ b/DuetPkg/CpuIoDxe/CpuIoAccess.h @@ -0,0 +1,216 @@ +/*++ +# +# 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: + + CpuIoAccess.h + +Abstract: + +--*/ + +#ifndef _CPU_IO_ACCESS_H +#define _CPU_IO_ACCESS_H + + +#define IA32API __cdecl + +UINT8 +IA32API +CpuIoRead8 ( + IN UINT16 Port + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O read port +Arguments: + Port: - Port number to read +Returns: + Return read 8 bit value +--*/ +UINT16 +IA32API +CpuIoRead16 ( + IN UINT16 Port + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O read port +Arguments: + Port: - Port number to read +Returns: + Return read 16 bit value +--*/ +UINT32 +IA32API +CpuIoRead32 ( + IN UINT16 Port + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O read port +Arguments: + Port: - Port number to read +Returns: + Return read 32 bit value +--*/ +VOID +IA32API +CpuIoWrite8 ( + IN UINT16 Port, + IN UINT32 Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O write 8 bit data to port +Arguments: + Port: - Port number to read + Data: - Data to write to the Port +Returns: + None +--*/ +VOID +IA32API +CpuIoWrite16 ( + IN UINT16 Port, + IN UINT32 Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O write 16 bit data to port +Arguments: + Port: - Port number to read + Data: - Data to write to the Port +Returns: + None +--*/ +VOID +IA32API +CpuIoWrite32 ( + IN UINT16 Port, + IN UINT32 Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Port - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +; + +/*++ +Routine Description: + Cpu I/O write 32 bit data to port +Arguments: + Port: - Port number to read + Data: - Data to write to the Port +Returns: + None +--*/ +#endif diff --git a/DuetPkg/CpuIoDxe/Ia32/CpuIoAccess.asm b/DuetPkg/CpuIoDxe/Ia32/CpuIoAccess.asm new file mode 100644 index 0000000000..07b14ea554 --- /dev/null +++ b/DuetPkg/CpuIoDxe/Ia32/CpuIoAccess.asm @@ -0,0 +1,120 @@ + title CpuIoAccess.asm +;------------------------------------------------------------------------------ +;* +;* Copyright (c) 2005, 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: +;* CpuIoAccess.asm +;* +;* Abstract: +;* Supports IA32 CPU IO operation +;* +;------------------------------------------------------------------------------ +; +; +;------------------------------------------------------------------------------ + + .686 + .MODEL FLAT,C + .CODE + + +UINT8 TYPEDEF BYTE +UINT16 TYPEDEF WORD +UINT32 TYPEDEF DWORD +UINT64 TYPEDEF QWORD +UINTN TYPEDEF UINT32 + + + +;------------------------------------------------------------------------------ +; UINT8 +; CpuIoRead8 ( +; IN UINT16 Port +; ) +;------------------------------------------------------------------------------ +CpuIoRead8 PROC PUBLIC Port:UINT16 + mov dx, Port + in al, dx + ret +CpuIoRead8 ENDP + +;------------------------------------------------------------------------------ +; UINT16 +; CpuIoRead16 ( +; IN UINT16 Port +; ) +;------------------------------------------------------------------------------ +CpuIoRead16 PROC PUBLIC Port:UINT16 + mov dx, Port + in ax, dx + ret +CpuIoRead16 ENDP + +;------------------------------------------------------------------------------ +; UINT32 +; CpuIoRead32 ( +; IN UINT16 Port +; ) +;------------------------------------------------------------------------------ +CpuIoRead32 PROC PUBLIC Port:UINT16 + mov dx, Port + in eax, dx + ret +CpuIoRead32 ENDP + + + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite8 ( +; IN UINT16 Port, +; IN UINT32 Data +; ) +;------------------------------------------------------------------------------ +CpuIoWrite8 PROC PUBLIC Port:UINT16, Data:UINT32 + mov eax, Data + mov dx, Port + out dx, al + ret +CpuIoWrite8 ENDP + + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite16 ( +; IN UINT16 Port, +; IN UINT32 Data +; ) +;------------------------------------------------------------------------------ +CpuIoWrite16 PROC PUBLIC Port:UINT16, Data:UINT32 + mov eax, Data + mov dx, Port + out dx, ax + ret +CpuIoWrite16 ENDP + + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite32 ( +; IN UINT16 Port, +; IN UINT32 Data +; ) +;------------------------------------------------------------------------------ +CpuIoWrite32 PROC PUBLIC Port:UINT16, Data:UINT32 + mov eax, Data + mov dx, Port + out dx, eax + ret +CpuIoWrite32 ENDP + + +END \ No newline at end of file diff --git a/DuetPkg/CpuIoDxe/Ia32CpuIo.dxs b/DuetPkg/CpuIoDxe/Ia32CpuIo.dxs new file mode 100644 index 0000000000..874f333985 --- /dev/null +++ b/DuetPkg/CpuIoDxe/Ia32CpuIo.dxs @@ -0,0 +1,26 @@ +/*++ + +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: + Ia32CpuIo.dxs + +Abstract: + + Dependency expression source file. + +--*/ + +#include "EfiDepex.h" + + +DEPENDENCY_START + TRUE +DEPENDENCY_END diff --git a/DuetPkg/CpuIoDxe/x64/CpuIoAccess.asm b/DuetPkg/CpuIoDxe/x64/CpuIoAccess.asm new file mode 100644 index 0000000000..fa71762877 --- /dev/null +++ b/DuetPkg/CpuIoDxe/x64/CpuIoAccess.asm @@ -0,0 +1,111 @@ + title CpuIoAccess.asm + +;------------------------------------------------------------------------------ +;* +;* Copyright (c) 2005 - 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: +;* CpuIoAccess.asm +;* +;* Abstract: +;* Supports x64 CPU IO operation +;* +;------------------------------------------------------------------------------ +; +; +; +; Abstract: +; +; +;------------------------------------------------------------------------------ + +.CODE + +;------------------------------------------------------------------------------ +; UINT8 +; CpuIoRead8 ( +; UINT16 Port // rcx +; ) +;------------------------------------------------------------------------------ +CpuIoRead8 PROC PUBLIC + xor eax, eax + mov dx, cx + in al, dx + ret +CpuIoRead8 ENDP + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite8 ( +; UINT16 Port, // rcx +; UINT32 Data // rdx +; ) +;------------------------------------------------------------------------------ +CpuIoWrite8 PROC PUBLIC + mov eax, edx + mov dx, cx + out dx, al + ret +CpuIoWrite8 ENDP + +;------------------------------------------------------------------------------ +; UINT16 +; CpuIoRead16 ( +; UINT16 Port // rcx +; ) +;------------------------------------------------------------------------------ +CpuIoRead16 PROC PUBLIC + xor eax, eax + mov dx, cx + in ax, dx + ret +CpuIoRead16 ENDP + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite16 ( +; UINT16 Port, // rcx +; UINT32 Data // rdx +; ) +;------------------------------------------------------------------------------ +CpuIoWrite16 PROC PUBLIC + mov eax, edx + mov dx, cx + out dx, ax + ret +CpuIoWrite16 ENDP + +;------------------------------------------------------------------------------ +; UINT32 +; CpuIoRead32 ( +; UINT16 Port // rcx +; ) +;------------------------------------------------------------------------------ +CpuIoRead32 PROC PUBLIC + mov dx, cx + in eax, dx + ret +CpuIoRead32 ENDP + +;------------------------------------------------------------------------------ +; VOID +; CpuIoWrite32 ( +; UINT16 Port, // rcx +; UINT32 Data // rdx +; ) +;------------------------------------------------------------------------------ +CpuIoWrite32 PROC PUBLIC + mov eax, edx + mov dx, cx + out dx, eax + ret +CpuIoWrite32 ENDP + +END -- cgit v1.2.3