From 54bd807967f8100bb59515a2bc5e4d2cdd998b8f Mon Sep 17 00:00:00 2001 From: xli24 Date: Mon, 7 Dec 2009 03:12:13 +0000 Subject: Check in thunk driver for CPU I/O 2 Protocol. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9523 6f19259b-4bc3-4df7-8a09-765794883524 --- .../CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.c | 214 +++++++++++++++++++++ .../CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.h | 130 +++++++++++++ .../CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf | 53 +++++ EdkCompatibilityPkg/EdkCompatibilityPkg.dsc | 1 + 4 files changed, 398 insertions(+) create mode 100644 EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.c create mode 100644 EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.h create mode 100644 EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf (limited to 'EdkCompatibilityPkg') diff --git a/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.c b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.c new file mode 100644 index 0000000000..261d6cd97a --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.c @@ -0,0 +1,214 @@ +/** @file + Implementation of CPU I/O 2 Protocol based on Framework CPU I/O Protocol. + + Intel's Framework CPU I/O Protocol is replaced by CPU I/O 2 Protocol in PI. + This module produces PI CPU I/O 2 Protocol on top of Framework CPU I/O 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 "CpuIo2OnCpuIoThunk.h" + +EFI_HANDLE mCpuIo2Handle = NULL; +EFI_CPU_IO_PROTOCOL *mCpuIo; +EFI_CPU_IO2_PROTOCOL mCpuIo2 = { + { + CpuMemoryServiceRead, + CpuMemoryServiceWrite + }, + { + CpuIoServiceRead, + CpuIoServiceWrite + } +}; + +/** + 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 + ) +{ + return mCpuIo->Mem.Read ( + mCpuIo, + Width, + Address, + Count, + 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 + ) +{ + return mCpuIo->Mem.Write ( + mCpuIo, + Width, + Address, + Count, + 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] Address 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] 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 +CpuIoServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + OUT VOID *Buffer + ) +{ + return mCpuIo->Io.Read ( + mCpuIo, + Width, + Address, + Count, + Buffer + ); +} + +/** + 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] Address 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] 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 +CpuIoServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN VOID *Buffer + ) +{ + return mCpuIo->Io.Write ( + mCpuIo, + Width, + Address, + Count, + Buffer + ); +} + +/** + Entrypoint of CPU I/O 2 DXE thunk 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 +CpuIo2OnCpuIoThunkInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Locate and cache Framework CPU I/O Protocol. + // + Status = gBS->LocateProtocol ( + &gEfiCpuIoProtocolGuid, + NULL, + (VOID **) &mCpuIo + ); + ASSERT_EFI_ERROR (Status); + + // + // Install the CPU I/O 2 Protocol on a new handle. + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &mCpuIo2Handle, + &gEfiCpuIo2ProtocolGuid, &mCpuIo2, + NULL + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.h b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.h new file mode 100644 index 0000000000..5c8760e9fa --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.h @@ -0,0 +1,130 @@ +/** @file + Internal include file for the CPU I/O 2 Protocol thunk driver. + +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_ON_CPU_IO_H__ +#define __CPU_IO2_ON_CPU_IO_H__ + +#include +#include + +#include +#include + +/** + 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, + IN 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 OUT 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] Address 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] 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 +CpuIoServiceRead ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ); + +/** + 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] Address 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] 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 +CpuIoServiceWrite ( + IN EFI_CPU_IO2_PROTOCOL *This, + IN EFI_CPU_IO_PROTOCOL_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ); + +#endif diff --git a/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf new file mode 100644 index 0000000000..c3668e074e --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf @@ -0,0 +1,53 @@ +#/** @file +# Implementation of CPU I/O 2 Protocol based on Framework CPU I/O Protocol. +# +# Intel's Framework CPU I/O Protocol is replaced by CPU I/O 2 Protocol in PI. +# This module produces PI CPU I/O 2 Protocol on top of Framework CPU I/O 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. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = CpuIo2OnCpuIoThunk + FILE_GUID = 503E70FE-047A-410B-A55F-4F63C9382C1E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = CpuIo2OnCpuIoThunkInitialize + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources] + CpuIo2OnCpuIoThunk.c + CpuIo2OnCpuIoThunk.h + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + EdkCompatibilityPkg/EdkCompatibilityPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DebugLib + UefiBootServicesTableLib + +[Protocols] + gEfiCpuIo2ProtocolGuid ## PRODUCES + gEfiCpuIoProtocolGuid ## CONSUMES + +[Depex] + gEfiCpuIoProtocolGuid diff --git a/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc b/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc index cba517dca3..98c79b107a 100644 --- a/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc +++ b/EdkCompatibilityPkg/EdkCompatibilityPkg.dsc @@ -242,6 +242,7 @@ define GCC_MACRO = -DEFI_SPECIFICATION_VERSION=0x00020000 -DPI_S EdkCompatibilityPkg/Compatibility/UcOnUc2Thunk/UcOnUc2Thunk.inf EdkCompatibilityPkg/Compatibility/PrintThunk/PrintThunk.inf EdkCompatibilityPkg/Compatibility/LegacyRegion2OnLegacyRegionThunk/LegacyRegion2OnLegacyRegionThunk.inf + EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf # # User needs to turn on the compatibility switches for VFRC and EDK II build tool for Framework HII modules -- cgit v1.2.3