mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 19:23:54 +01:00 
			
		
		
		
	Add an IO Lib instance based on CPU IO2 Protocol.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10383 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									d4a622c488
								
							
						
					
					
						commit
						ba9f835144
					
				
							
								
								
									
										116
									
								
								MdePkg/Library/DxeIoLibCpuIo2/DxeCpuIo2LibInternal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								MdePkg/Library/DxeIoLibCpuIo2/DxeCpuIo2LibInternal.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | |||||||
|  | /** @file
 | ||||||
|  |   Internal include file of DXE CPU IO2 Library. | ||||||
|  |    | ||||||
|  |   Copyright (c) 2010, Intel Corporation. All rights reserved.<BR> | ||||||
|  |   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 _DXE_CPUIO2_LIB_INTERNAL_H_ | ||||||
|  | #define _DXE_CPUIO2_LIB_INTERNAL_H_ | ||||||
|  | 
 | ||||||
|  | #include <PiDxe.h> | ||||||
|  | 
 | ||||||
|  | #include <Protocol/CpuIo2.h> | ||||||
|  | 
 | ||||||
|  | #include <Library/IoLib.h> | ||||||
|  | #include <Library/UefiBootServicesTableLib.h> | ||||||
|  | #include <Library/DebugLib.h> | ||||||
|  | #include <Library/BaseLib.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Reads registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  |   Reads the I/O port specified by Port with registers width specified by Width. | ||||||
|  |   The read value is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all I/O read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Port          The base address of the I/O operation. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  | 
 | ||||||
|  |   @return Data read from registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoReadWorker ( | ||||||
|  |   IN      UINTN                     Port, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH Width | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Writes registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  |   Writes the I/O port specified by Port with registers width and value specified by Width | ||||||
|  |   and Data respectively.  Data is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all I/O read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Port          The base address of the I/O operation. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  |   @param  Data          The value to write to the I/O port. | ||||||
|  | 
 | ||||||
|  |   @return The paramter of Data. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoWriteWorker ( | ||||||
|  |   IN      UINTN                     Port, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH Width, | ||||||
|  |   IN      UINT64                    Data | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Reads memory-mapped registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  |   Reads the MMIO registers specified by Address with registers width specified by Width. | ||||||
|  |   The read value is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all MMIO read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Address       The MMIO register to read. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  | 
 | ||||||
|  |   @return Data read from registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | MmioReadWorker ( | ||||||
|  |   IN      UINTN                     Address, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH Width | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Writes memory-mapped registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  |   Writes the MMIO registers specified by Address with registers width and value specified by Width | ||||||
|  |   and Data respectively. Data is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all MMIO read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Address       The MMIO register to read. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  |   @param  Data          The value to write to the I/O port. | ||||||
|  |    | ||||||
|  |   @return Data read from registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteWorker ( | ||||||
|  |   IN      UINTN                     Address, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH Width, | ||||||
|  |   IN      UINT64                    Data | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										51
									
								
								MdePkg/Library/DxeIoLibCpuIo2/DxeIoLibCpuIo2.inf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								MdePkg/Library/DxeIoLibCpuIo2/DxeIoLibCpuIo2.inf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | ## @file | ||||||
|  | # I/O Library instance based on EFI_CPU_IO2_PROTOCOL. | ||||||
|  | # | ||||||
|  | # I/O Library implementation that uses the CPU I/O2 Protocol for I/O and MMIO operations. | ||||||
|  | # | ||||||
|  | # Copyright (c) 2010, Intel Corporation. All rights reserved. <BR> | ||||||
|  | # 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                      = DxeIoLibCpuIo2 | ||||||
|  |   FILE_GUID                      = 33D33BF3-349E-4768-9459-836A9F7558FB | ||||||
|  |   MODULE_TYPE                    = DXE_DRIVER | ||||||
|  |   VERSION_STRING                 = 1.0 | ||||||
|  |   LIBRARY_CLASS                  = IoLib|DXE_DRIVER DXE_SAL_DRIVER | ||||||
|  |   CONSTRUCTOR                    = IoLibConstructor | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # The following information is for reference only and not required by the build tools. | ||||||
|  | # | ||||||
|  | #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | [Sources] | ||||||
|  |   IoLibMmioBuffer.c | ||||||
|  |   DxeCpuIo2LibInternal.h | ||||||
|  |   IoHighLevel.c | ||||||
|  |   IoLib.c | ||||||
|  | 
 | ||||||
|  | [Packages] | ||||||
|  |   MdePkg/MdePkg.dec | ||||||
|  | 
 | ||||||
|  | [LibraryClasses] | ||||||
|  |   BaseLib | ||||||
|  |   DebugLib | ||||||
|  |   UefiBootServicesTableLib | ||||||
|  | 
 | ||||||
|  | [Protocols] | ||||||
|  |   gEfiCpuIo2ProtocolGuid         ## CONSUMES | ||||||
|  | 
 | ||||||
|  | [Depex] | ||||||
|  |   gEfiCpuIo2ProtocolGuid | ||||||
							
								
								
									
										2267
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoHighLevel.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2267
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoHighLevel.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										617
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoLib.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										617
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoLib.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,617 @@ | |||||||
|  | /** @file
 | ||||||
|  |   I/O Library instance based on EFI_CPU_IO2_PROTOCOL. | ||||||
|  |    | ||||||
|  |   Copyright (c) 2010, Intel Corporation. All rights reserved.<BR> | ||||||
|  |   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 "DxeCpuIo2LibInternal.h" | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Globle varible to cache pointer to CpuIo2 protocol.
 | ||||||
|  | //
 | ||||||
|  | EFI_CPU_IO2_PROTOCOL  *mCpuIo = NULL; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   The constructor function caches the pointer to CpuIo2 protocol. | ||||||
|  | 
 | ||||||
|  |   The constructor function locates CpuIo2 protocol from protocol database. | ||||||
|  |   It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. | ||||||
|  | 
 | ||||||
|  |   @param  ImageHandle   The firmware allocated handle for the EFI image. | ||||||
|  |   @param  SystemTable   A pointer to the EFI System Table. | ||||||
|  | 
 | ||||||
|  |   @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | EFI_STATUS | ||||||
|  | EFIAPI | ||||||
|  | IoLibConstructor ( | ||||||
|  |   IN      EFI_HANDLE                ImageHandle, | ||||||
|  |   IN      EFI_SYSTEM_TABLE          *SystemTable | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS  Status; | ||||||
|  | 
 | ||||||
|  |   Status = gBS->LocateProtocol (&gEfiCpuIo2ProtocolGuid, NULL, (VOID **) &mCpuIo); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  | 
 | ||||||
|  |   return Status; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Reads registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  |   Reads the I/O port specified by Port with registers width specified by Width. | ||||||
|  |   The read value is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all I/O read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Port          The base address of the I/O operation. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  | 
 | ||||||
|  |   @return Data read from registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoReadWorker ( | ||||||
|  |   IN      UINTN                      Port, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH  Width | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS                        Status; | ||||||
|  |   UINT64                            Data; | ||||||
|  | 
 | ||||||
|  |   Status = mCpuIo->Io.Read (mCpuIo, Width, Port, 1, &Data); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  | 
 | ||||||
|  |   return Data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Writes registers in the EFI CPU I/O space. | ||||||
|  | 
 | ||||||
|  |   Writes the I/O port specified by Port with registers width and value specified by Width | ||||||
|  |   and Data respectively.  Data is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all I/O read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Port          The base address of the I/O operation. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  |   @param  Data          The value to write to the I/O port. | ||||||
|  | 
 | ||||||
|  |   @return The paramter of Data. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoWriteWorker ( | ||||||
|  |   IN      UINTN                      Port, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH  Width, | ||||||
|  |   IN      UINT64                     Data | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS  Status; | ||||||
|  | 
 | ||||||
|  |   Status = mCpuIo->Io.Write (mCpuIo, Width, Port, 1, &Data); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  | 
 | ||||||
|  |   return Data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Reads memory-mapped registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  |   Reads the MMIO registers specified by Address with registers width specified by Width. | ||||||
|  |   The read value is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all MMIO read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Address       The MMIO register to read. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  | 
 | ||||||
|  |   @return Data read from registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | MmioReadWorker ( | ||||||
|  |   IN      UINTN                      Address, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH  Width | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS  Status; | ||||||
|  |   UINT64      Data; | ||||||
|  | 
 | ||||||
|  |   Status = mCpuIo->Mem.Read (mCpuIo, Width, Address, 1, &Data); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  | 
 | ||||||
|  |   return Data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Writes memory-mapped registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  |   Writes the MMIO registers specified by Address with registers width and value specified by Width | ||||||
|  |   and Data respectively. Data is returned. If such operations are not supported, then ASSERT(). | ||||||
|  |   This function must guarantee that all MMIO read and write operations are serialized. | ||||||
|  | 
 | ||||||
|  |   @param  Address       The MMIO register to read. | ||||||
|  |                         The caller is responsible for aligning the Address if required. | ||||||
|  |   @param  Width         The width of the I/O operation. | ||||||
|  |   @param  Data          The value to write to the I/O port. | ||||||
|  |    | ||||||
|  |   @return Data read from registers in the EFI system memory space. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteWorker ( | ||||||
|  |   IN      UINTN                      Address, | ||||||
|  |   IN      EFI_CPU_IO_PROTOCOL_WIDTH  Width, | ||||||
|  |   IN      UINT64                     Data | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   EFI_STATUS  Status; | ||||||
|  | 
 | ||||||
|  |   Status = mCpuIo->Mem.Write (mCpuIo, Width, Address, 1, &Data); | ||||||
|  |   ASSERT_EFI_ERROR (Status); | ||||||
|  | 
 | ||||||
|  |   return Data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   return (UINT8)IoReadWorker (Port, EfiCpuIoWidthUint8); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   return (UINT8)IoWriteWorker (Port, EfiCpuIoWidthUint8, 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 Port is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 16-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 1) == 0); | ||||||
|  |   return (UINT16)IoReadWorker (Port, EfiCpuIoWidthUint16); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Port is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 16-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 1) == 0); | ||||||
|  |   return (UINT16)IoWriteWorker (Port, EfiCpuIoWidthUint16, 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 Port is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 32-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 3) == 0); | ||||||
|  |   return (UINT32)IoReadWorker (Port, EfiCpuIoWidthUint32); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Port is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 32-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 3) == 0); | ||||||
|  |   return (UINT32)IoWriteWorker (Port, EfiCpuIoWidthUint32, 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 Port is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If 64-bit I/O port operations are not supported, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  Port  The I/O port to read. | ||||||
|  | 
 | ||||||
|  |   @return The value read. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoRead64 ( | ||||||
|  |   IN      UINTN                     Port | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 64-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 7) == 0); | ||||||
|  |   return IoReadWorker (Port, EfiCpuIoWidthUint64); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Port is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   If 64-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. | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 | ||||||
|  | EFIAPI | ||||||
|  | IoWrite64 ( | ||||||
|  |   IN      UINTN                     Port, | ||||||
|  |   IN      UINT64                    Value | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Port is aligned on a 64-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Port & 7) == 0); | ||||||
|  |   return IoWriteWorker (Port, EfiCpuIoWidthUint64, Value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   return (UINT8)MmioReadWorker (Address, EfiCpuIoWidthUint8); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   return (UINT8)MmioWriteWorker (Address, EfiCpuIoWidthUint8, 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 Address is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 16-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 1) == 0); | ||||||
|  |   return (UINT16)MmioReadWorker (Address, EfiCpuIoWidthUint16); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Address is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 16-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 1) == 0); | ||||||
|  |   return (UINT16)MmioWriteWorker (Address, EfiCpuIoWidthUint16, 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 Address is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  |    | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 32-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 3) == 0); | ||||||
|  |   return (UINT32)MmioReadWorker (Address, EfiCpuIoWidthUint32); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Address is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 32-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 3) == 0); | ||||||
|  |   return (UINT32)MmioWriteWorker (Address, EfiCpuIoWidthUint32, 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 Address is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 64-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 7) == 0); | ||||||
|  |   return (UINT64)MmioReadWorker (Address, EfiCpuIoWidthUint64); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   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 Address is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   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 | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   //
 | ||||||
|  |   // Make sure Address is aligned on a 64-bit boundary.
 | ||||||
|  |   //
 | ||||||
|  |   ASSERT ((Address & 7) == 0); | ||||||
|  |   return (UINT64)MmioWriteWorker (Address, EfiCpuIoWidthUint64, Value); | ||||||
|  | } | ||||||
							
								
								
									
										413
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoLibMmioBuffer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								MdePkg/Library/DxeIoLibCpuIo2/IoLibMmioBuffer.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,413 @@ | |||||||
|  | /** @file
 | ||||||
|  |   I/O Library MMIO Buffer Functions. | ||||||
|  | 
 | ||||||
|  |   Copyright (c) 2010, Intel Corporation. All rights reserved.<BR> | ||||||
|  |   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 "DxeCpuIo2LibInternal.h" | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from MMIO region to system memory by using 8-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from MMIO region specified by starting address StartAddress | ||||||
|  |   to system memory specified by Buffer by using 8-bit access. The total | ||||||
|  |   number of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied from. | ||||||
|  |   @param  Length          Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer receiving the data read. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT8 * | ||||||
|  | EFIAPI | ||||||
|  | MmioReadBuffer8 ( | ||||||
|  |   IN  UINTN       StartAddress, | ||||||
|  |   IN  UINTN       Length, | ||||||
|  |   OUT UINT8       *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT8   *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length-- > 0) { | ||||||
|  |     *(Buffer++) = MmioRead8 (StartAddress++); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from MMIO region to system memory by using 16-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from MMIO region specified by starting address StartAddress | ||||||
|  |   to system memory specified by Buffer by using 16-bit access. The total | ||||||
|  |   number of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  |    | ||||||
|  |   If Buffer is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied from. | ||||||
|  |   @param  Length          Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer receiving the data read. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT16 * | ||||||
|  | EFIAPI | ||||||
|  | MmioReadBuffer16 ( | ||||||
|  |   IN  UINTN       StartAddress, | ||||||
|  |   IN  UINTN       Length, | ||||||
|  |   OUT UINT16      *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT16    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT16) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     *(Buffer++) = MmioRead16 (StartAddress); | ||||||
|  |     StartAddress += sizeof (UINT16); | ||||||
|  |     Length -= sizeof (UINT16); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from MMIO region to system memory by using 32-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from MMIO region specified by starting address StartAddress | ||||||
|  |   to system memory specified by Buffer by using 32-bit access. The total | ||||||
|  |   number of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  |   If Buffer is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied from. | ||||||
|  |   @param  Length          Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer receiving the data read. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT32 * | ||||||
|  | EFIAPI | ||||||
|  | MmioReadBuffer32 ( | ||||||
|  |   IN  UINTN       StartAddress, | ||||||
|  |   IN  UINTN       Length, | ||||||
|  |   OUT UINT32      *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT32    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT32) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     *(Buffer++) = MmioRead32 (StartAddress); | ||||||
|  |     StartAddress += sizeof (UINT32); | ||||||
|  |     Length -= sizeof (UINT32); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from MMIO region to system memory by using 64-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from MMIO region specified by starting address StartAddress | ||||||
|  |   to system memory specified by Buffer by using 64-bit access. The total | ||||||
|  |   number of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  |   | ||||||
|  |   If Buffer is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied from. | ||||||
|  |   @param  Length          Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer receiving the data read. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 * | ||||||
|  | EFIAPI | ||||||
|  | MmioReadBuffer64 ( | ||||||
|  |   IN  UINTN       StartAddress, | ||||||
|  |   IN  UINTN       Length, | ||||||
|  |   OUT UINT64      *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT64    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT64) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     *(Buffer++) = MmioRead64 (StartAddress); | ||||||
|  |     StartAddress += sizeof (UINT64); | ||||||
|  |     Length -= sizeof (UINT64); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from system memory to MMIO region by using 8-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from system memory specified by Buffer to MMIO region specified | ||||||
|  |   by starting address StartAddress by using 8-bit access. The total number | ||||||
|  |   of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied to. | ||||||
|  |   @param  Length     Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer containing the data to write. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT8 * | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteBuffer8 ( | ||||||
|  |   IN  UINTN         StartAddress, | ||||||
|  |   IN  UINTN         Length, | ||||||
|  |   IN  CONST UINT8   *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   VOID* ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = (UINT8 *) Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length-- > 0) { | ||||||
|  |      MmioWrite8 (StartAddress++, *(Buffer++)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from system memory to MMIO region by using 16-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from system memory specified by Buffer to MMIO region specified | ||||||
|  |   by starting address StartAddress by using 16-bit access. The total number | ||||||
|  |   of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Buffer is not aligned on a 16-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied to. | ||||||
|  |   @param  Length     Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer containing the data to write. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT16 * | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteBuffer16 ( | ||||||
|  |   IN  UINTN        StartAddress, | ||||||
|  |   IN  UINTN        Length, | ||||||
|  |   IN  CONST UINT16 *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT16    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT16) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = (UINT16 *) Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     MmioWrite16 (StartAddress, *(Buffer++)); | ||||||
|  | 
 | ||||||
|  |     StartAddress += sizeof (UINT16); | ||||||
|  |     Length -= sizeof (UINT16); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from system memory to MMIO region by using 32-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from system memory specified by Buffer to MMIO region specified | ||||||
|  |   by starting address StartAddress by using 32-bit access. The total number | ||||||
|  |   of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Buffer is not aligned on a 32-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied to. | ||||||
|  |   @param  Length     Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer containing the data to write. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT32 * | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteBuffer32 ( | ||||||
|  |   IN  UINTN        StartAddress, | ||||||
|  |   IN  UINTN        Length, | ||||||
|  |   IN  CONST UINT32 *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT32    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT32) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = (UINT32 *) Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     MmioWrite32 (StartAddress, *(Buffer++)); | ||||||
|  | 
 | ||||||
|  |     StartAddress += sizeof (UINT32); | ||||||
|  |     Length -= sizeof (UINT32); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |   Copy data from system memory to MMIO region by using 64-bit access. | ||||||
|  | 
 | ||||||
|  |   Copy data from system memory specified by Buffer to MMIO region specified | ||||||
|  |   by starting address StartAddress by using 64-bit access. The total number | ||||||
|  |   of byte to be copied is specified by Length. Buffer is returned. | ||||||
|  | 
 | ||||||
|  |   If StartAddress is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). | ||||||
|  |   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Length is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   If Buffer is not aligned on a 64-bit boundary, then ASSERT(). | ||||||
|  | 
 | ||||||
|  |   @param  StartAddress    Starting address for the MMIO region to be copied to. | ||||||
|  |   @param  Length     Size in bytes of the copy. | ||||||
|  |   @param  Buffer          Pointer to a system memory buffer containing the data to write. | ||||||
|  | 
 | ||||||
|  |   @return Buffer | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | UINT64 * | ||||||
|  | EFIAPI | ||||||
|  | MmioWriteBuffer64 ( | ||||||
|  |   IN  UINTN        StartAddress, | ||||||
|  |   IN  UINTN        Length, | ||||||
|  |   IN  CONST UINT64 *Buffer | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   UINT64    *ReturnBuffer; | ||||||
|  | 
 | ||||||
|  |   ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress)); | ||||||
|  |   ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer)); | ||||||
|  | 
 | ||||||
|  |   ASSERT ((Length & (sizeof (UINT64) - 1)) == 0); | ||||||
|  |   ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0); | ||||||
|  | 
 | ||||||
|  |   ReturnBuffer = (UINT64 *) Buffer; | ||||||
|  | 
 | ||||||
|  |   while (Length > 0) { | ||||||
|  |     MmioWrite64 (StartAddress, *(Buffer++)); | ||||||
|  | 
 | ||||||
|  |     StartAddress += sizeof (UINT64); | ||||||
|  |     Length -= sizeof (UINT64); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ReturnBuffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -103,6 +103,7 @@ | |||||||
|   MdePkg/Library/DxeServicesLib/DxeServicesLib.inf |   MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | ||||||
|   MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf |   MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf | ||||||
|   MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf |   MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf | ||||||
|  |   MdePkg/Library/DxeIoLibCpuIo2/DxeIoLibCpuIo2.inf | ||||||
| 
 | 
 | ||||||
|   MdePkg/Library/DxeRuntimePciExpressLib/DxeRuntimePciExpressLib.inf |   MdePkg/Library/DxeRuntimePciExpressLib/DxeRuntimePciExpressLib.inf | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user