/** @file\r
- I/O Library.\r
+ I/O Library. The implementations are based on EFI_PEI_SERVICE->CpuIo interface.\r
\r
Copyright (c) 2006, Intel Corporation<BR>\r
All rights reserved. This program and the accompanying materials\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
- Module Name: IoLib.c\r
-\r
**/\r
\r
+\r
+#include <PiPei.h>\r
+\r
+#include <Library/IoLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/PeiServicesTablePointerLib.h>\r
+\r
/**\r
Reads an 8-bit I/O port.\r
\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT8\r
IN UINTN Port\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
\r
return CpuIo->IoRead8 (PeiServices, CpuIo, (UINT64) Port);\r
IN UINT8 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
\r
CpuIo->IoWrite8 (PeiServices, CpuIo, (UINT64) Port, Value);\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT16\r
IN UINTN Port\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Port & 1) == 0);\r
return CpuIo->IoRead16 (PeiServices, CpuIo, (UINT64) Port);\r
}\r
\r
IN UINT16 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Port & 1) == 0);\r
CpuIo->IoWrite16 (PeiServices, CpuIo, (UINT64) Port, Value);\r
return Value;\r
}\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT32\r
IN UINTN Port\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Port & 3) == 0);\r
return CpuIo->IoRead32 (PeiServices, CpuIo, (UINT64) Port);\r
}\r
\r
IN UINT32 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Port & 3) == 0);\r
CpuIo->IoWrite32 (PeiServices, CpuIo, (UINT64) Port, Value);\r
return Value;\r
}\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT64\r
IN UINTN Port\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 64-bit boundary.\r
+ //\r
+ ASSERT ((Port & 7) == 0);\r
return CpuIo->IoRead64 (PeiServices, CpuIo, (UINT64) Port);\r
}\r
\r
IN UINT64 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Port is aligned on a 64-bit boundary.\r
+ //\r
+ ASSERT ((Port & 7) == 0);\r
CpuIo->IoWrite64 (PeiServices, CpuIo, (UINT64) Port, Value);\r
return Value;;\r
}\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT8\r
IN UINTN Address\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
\r
return CpuIo->MemRead8 (PeiServices, CpuIo, (UINT64) Address);\r
\r
@param Address The MMIO register to write.\r
@param Value The value to write to the MMIO register.\r
-\r
+ \r
+ @return The Value written back to Mmio register.\r
**/\r
UINT8\r
EFIAPI\r
IN UINT8 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
\r
CpuIo->MemWrite8 (PeiServices, CpuIo, (UINT64) Address, Value);\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT16\r
IN UINTN Address\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Address & 1) == 0);\r
return CpuIo->MemRead16 (PeiServices, CpuIo, (UINT64) Address);\r
\r
}\r
\r
@param Address The MMIO register to write.\r
@param Value The value to write to the MMIO register.\r
+ \r
+ @return The Value written back to Mmio register\r
\r
**/\r
UINT16\r
IN UINT16 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Address & 1) == 0);\r
CpuIo->MemWrite16 (PeiServices, CpuIo, (UINT64) Address, Value);\r
return Value;\r
}\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT32\r
IN UINTN Address\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Address & 3) == 0);\r
return CpuIo->MemRead32 (PeiServices, CpuIo, (UINT64) Address);\r
\r
}\r
\r
@param Address The MMIO register to write.\r
@param Value The value to write to the MMIO register.\r
+ \r
+ @return The Value written back to Mmio register\r
\r
**/\r
UINT32\r
IN UINT32 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Address & 3) == 0);\r
CpuIo->MemWrite32 (PeiServices, CpuIo, (UINT64) Address, Value);\r
return Value;\r
}\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT64\r
IN UINTN Address\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 64-bit boundary.\r
+ //\r
+ ASSERT ((Address & (sizeof (UINT64) - 1)) == 0);\r
return CpuIo->MemRead64 (PeiServices, CpuIo, (UINT64) Address);\r
\r
}\r
@param Address The MMIO register to write.\r
@param Value The value to write to the MMIO register.\r
\r
+ @return The Value written back to Mmio register\r
**/\r
UINT64\r
EFIAPI\r
IN UINT64 Value\r
)\r
{\r
- EFI_PEI_SERVICES **PeiServices;\r
+ CONST EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
\r
- PeiServices = GetPeiServicesTablePointer ();\r
+ PeiServices = (CONST EFI_PEI_SERVICES **) GetPeiServicesTablePointer ();\r
CpuIo = (*PeiServices)->CpuIo;\r
-\r
ASSERT (CpuIo != NULL);\r
-\r
+ //\r
+ // Make sure Address is aligned on a 64-bit boundary.\r
+ //\r
+ ASSERT ((Address & 7) == 0);\r
CpuIo->MemWrite64 (PeiServices, CpuIo, (UINT64) Address, Value);\r
return Value;\r
}\r