]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add generic module that produces the Framework CPU I/O Protocol using the services...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 18:57:44 +0000 (18:57 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 18:57:44 +0000 (18:57 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9755 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc
IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIo.c [new file with mode: 0644]
IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf [new file with mode: 0644]

index 669dcdb7b640516eb99192ad8de16a9bc30672df..468ab43762fe986bd2cc66bae478afef08c94eb2 100644 (file)
 \r
 [Components.IA32]\r
   IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf\r
+  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf {\r
+    <LibraryClasses>\r
+      IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf\r
+  }\r
 \r
 [Components.X64]\r
   IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf\r
+  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf {\r
+    <LibraryClasses>\r
+      IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf\r
+  }\r
+  \r
+[Components.IPF]\r
+  IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf {\r
+    <LibraryClasses>\r
+      IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf\r
+  }\r
diff --git a/IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIo.c b/IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIo.c
new file mode 100644 (file)
index 0000000..ed1a6df
--- /dev/null
@@ -0,0 +1,484 @@
+/** @file\r
+  Uses the services of the I/O Library to produce the CPU I/O Protocol\r
+\r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \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
+**/\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/CpuIo.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/IoLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#define MAX_IO_PORT_ADDRESS   0xFFFF\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+CpuMemoryServiceRead (\r
+  IN  EFI_CPU_IO_PROTOCOL        *This,\r
+  IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN  UINT64                     Address,\r
+  IN  UINTN                      Count,\r
+  OUT VOID                       *Buffer\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+CpuMemoryServiceWrite (\r
+  IN EFI_CPU_IO_PROTOCOL        *This,\r
+  IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN UINT64                     Address,\r
+  IN UINTN                      Count,\r
+  IN VOID                       *Buffer\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+CpuIoServiceRead (\r
+  IN  EFI_CPU_IO_PROTOCOL        *This,\r
+  IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN  UINT64                     Address,\r
+  IN  UINTN                      Count,\r
+  OUT VOID                       *Buffer\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+CpuIoServiceWrite (\r
+  IN EFI_CPU_IO_PROTOCOL        *This,\r
+  IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN UINT64                     Address,\r
+  IN UINTN                      Count,\r
+  IN VOID                       *Buffer\r
+  );\r
+\r
+//\r
+// Handle for the CPU I/O Protocol\r
+//\r
+EFI_HANDLE  mHandle = NULL;\r
+\r
+//\r
+// CPU I/O Protocol inatance\r
+//\r
+EFI_CPU_IO_PROTOCOL mCpuIo = {\r
+  {\r
+    CpuMemoryServiceRead,\r
+    CpuMemoryServiceWrite\r
+  },\r
+  {\r
+    CpuIoServiceRead,\r
+    CpuIoServiceWrite\r
+  }\r
+};\r
+\r
+//\r
+// Lookup table for increment values based on transfer widths\r
+//\r
+UINT8 mInStride[] = {\r
+  1, // EfiCpuIoWidthUint8\r
+  2, // EfiCpuIoWidthUint16\r
+  4, // EfiCpuIoWidthUint32\r
+  8, // EfiCpuIoWidthUint64\r
+  0, // EfiCpuIoWidthFifoUint8\r
+  0, // EfiCpuIoWidthFifoUint16\r
+  0, // EfiCpuIoWidthFifoUint32\r
+  0, // EfiCpuIoWidthFifoUint64\r
+  1, // EfiCpuIoWidthFillUint8\r
+  2, // EfiCpuIoWidthFillUint16\r
+  4, // EfiCpuIoWidthFillUint32\r
+  8  // EfiCpuIoWidthFillUint64\r
+};\r
+\r
+//\r
+// Lookup table for increment values based on transfer widths\r
+//\r
+UINT8 mOutStride[] = {\r
+  1, // EfiCpuIoWidthUint8\r
+  2, // EfiCpuIoWidthUint16\r
+  4, // EfiCpuIoWidthUint32\r
+  8, // EfiCpuIoWidthUint64\r
+  1, // EfiCpuIoWidthFifoUint8\r
+  2, // EfiCpuIoWidthFifoUint16\r
+  4, // EfiCpuIoWidthFifoUint32\r
+  8, // EfiCpuIoWidthFifoUint64\r
+  0, // EfiCpuIoWidthFillUint8\r
+  0, // EfiCpuIoWidthFillUint16\r
+  0, // EfiCpuIoWidthFillUint32\r
+  0  // EfiCpuIoWidthFillUint64\r
+};\r
+\r
+/**\r
+  Check parameters to a CPU I/O Protocol service request.\r
+\r
+  @param  Width                 Signifies the width of the I/O or Memory operation.\r
+  @param  Address               The base address of the I/O or Memory operation.\r
+  @param  Count                 The number of I/O or Memory operations to perform.\r
+                                The number of bytes moved is Width size * Count, starting at Address.\r
+  @param  Buffer                For read operations, the destination buffer to store the results.\r
+                                For write operations, the source buffer from which to write data.\r
+  @param  MmioOperation         TRUE for an MMIO operation, FALSE for I/O Port operation.\r
+\r
+  @retval EFI_SUCCESS           The parameters for this request pass the checks.\r
+  @retval EFI_INVALID_PARAMETER Buffer is NULL or Width is not valid.\r
+  @retval EFI_UNSUPPORTED       The address range specified by Address, Width, and Count exceeds Limit.\r
+                                The Buffer is not aligned for the given Width.\r
+\r
+**/\r
+EFI_STATUS\r
+CpuIoCheckParameter (\r
+  IN BOOLEAN                    MmioOperation,\r
+  IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN UINT64                     Address,\r
+  IN UINTN                      Count,\r
+  IN VOID                       *Buffer\r
+  )\r
+{\r
+  UINT64  MaxCount;\r
+  UINT64  Limit;\r
+  \r
+  //\r
+  // Check to see if Buffer is NULL\r
+  //\r
+  if (Buffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Check to see if Width is in the valid range\r
+  //\r
+  if (Width < 0 || Width >= EfiCpuIoWidthMaximum) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // For FIFO type, the target address won't increase during the access,\r
+  // so treat Count as 1\r
+  //\r
+  if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {\r
+    Count = 1;\r
+  }\r
+\r
+  //\r
+  // Check to see if Width is in the valid range for I/O Port operations\r
+  //\r
+  Width = Width & 0x03;\r
+  if (!MmioOperation && (Width == EfiCpuIoWidthUint64)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  //\r
+  // Check to see if any address associated with this transfer exceeds the maximum \r
+  // allowed address.  The maximum address implied by the parameters passed in is\r
+  // Address + Size * Count.  If the following condition is met, then the transfer\r
+  // is not supported.\r
+  //\r
+  //    Address + Size * Count > (MmioOperation ? MAX_ADDRESS : MAX_IO_PORT_ADDRESS) + 1\r
+  //\r
+  // Since MAX_ADDRESS can be the maximum integer value supported by the CPU and Count \r
+  // can also be the maximum integer value supported by the CPU, this range\r
+  // check must be adjusted to avoid all oveflow conditions.\r
+  //   \r
+  // The follwing form of the range check is equivalent but assumes that \r
+  // MAX_ADDRESS and MAX_IO_PORT_ADDRESS are of the form (2^n - 1).\r
+  //\r
+  Limit = (MmioOperation ? MAX_ADDRESS : MAX_IO_PORT_ADDRESS);\r
+  if (Count == 0) {\r
+    if (Address > Limit) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+  } else {  \r
+    MaxCount = RShiftU64 (Limit, Width);\r
+    if (MaxCount < (Count - 1)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+    if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+  }\r
+  \r
+  //\r
+  // Check to see if Buffer is alligned\r
+  //\r
+  if (((UINTN)Buffer & (mInStride[Width] - 1)) != 0) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Reads memory-mapped registers.\r
+\r
+  @param  This                  A pointer to the EFI_CPU_IO_PROTOCOL instance.\r
+  @param  Width                 Signifies the width of the I/O or Memory operation.\r
+  @param  Address               The base address of the I/O or Memoryoperation.\r
+  @param  Count                 The number of I/O or Memory operations to perform.\r
+                                The number of bytes moved is Width size * Count, starting at Address.\r
+  @param  Buffer                For read operations, the destination buffer to store the results.\r
+                                For write operations, the source buffer from which to write data.\r
+\r
+  @retval EFI_SUCCESS           The data was read from or written to the EFI system.\r
+  @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system.Or Buffer is NULL.\r
+  @retval EFI_UNSUPPORTED       The Buffer is not aligned for the given Width.\r
+                                Or,The address range specified by Address, Width, and Count is not valid for this EFI system.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CpuMemoryServiceRead (\r
+  IN  EFI_CPU_IO_PROTOCOL        *This,\r
+  IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN  UINT64                     Address,\r
+  IN  UINTN                      Count,\r
+  OUT VOID                       *Buffer\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8                      InStride;\r
+  UINT8                      OutStride;\r
+  EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;\r
+  UINT8       *Uint8Buffer;\r
+\r
+  Status = CpuIoCheckParameter (TRUE, Width, Address, Count, Buffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Select loop based on the width of the transfer\r
+  //\r
+  InStride = mInStride[Width];\r
+  OutStride = mOutStride[Width];\r
+  OperationWidth = Width & 0x03;\r
+  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {\r
+    if (OperationWidth == EfiCpuIoWidthUint8) {\r
+      *Uint8Buffer = MmioRead8 ((UINTN)Address);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint16) {\r
+      *((UINT16 *)Uint8Buffer) = MmioRead16 ((UINTN)Address);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint32) {\r
+      *((UINT32 *)Uint8Buffer) = MmioRead32 ((UINTN)Address);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint64) {\r
+      *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);\r
+    }\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Writes memory-mapped registers.\r
+\r
+  @param  This                  A pointer to the EFI_CPU_IO_PROTOCOL instance.\r
+  @param  Width                 Signifies the width of the I/O or Memory operation.\r
+  @param  Address               The base address of the I/O or Memoryoperation.\r
+  @param  Count                 The number of I/O or Memory operations to perform.\r
+                                The number of bytes moved is Width size * Count, starting at Address.\r
+  @param  Buffer                For read operations, the destination buffer to store the results.\r
+                                For write operations, the source buffer from which to write data.\r
+\r
+  @retval EFI_SUCCESS           The data was read from or written to the EFI system.\r
+  @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system.Or Buffer is NULL.\r
+  @retval EFI_UNSUPPORTED       The Buffer is not aligned for the given Width.\r
+                                Or,The address range specified by Address, Width, and Count is not valid for this EFI system.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CpuMemoryServiceWrite (\r
+  IN EFI_CPU_IO_PROTOCOL        *This,\r
+  IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN UINT64                     Address,\r
+  IN UINTN                      Count,\r
+  IN VOID                       *Buffer\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8                      InStride;\r
+  UINT8                      OutStride;\r
+  EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;\r
+  UINT8       *Uint8Buffer;\r
+\r
+  Status = CpuIoCheckParameter (TRUE, Width, Address, Count, Buffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Select loop based on the width of the transfer\r
+  //\r
+  InStride = mInStride[Width];\r
+  OutStride = mOutStride[Width];\r
+  OperationWidth = Width & 0x03;\r
+  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {\r
+    if (OperationWidth == EfiCpuIoWidthUint8) {\r
+      MmioWrite8 ((UINTN)Address, *Uint8Buffer);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint16) {\r
+      MmioWrite16 ((UINTN)Address, *((UINT16 *)Uint8Buffer));\r
+    } else if (OperationWidth == EfiCpuIoWidthUint32) {\r
+      MmioWrite32 ((UINTN)Address, *((UINT32 *)Uint8Buffer));\r
+    } else if (OperationWidth == EfiCpuIoWidthUint64) {\r
+      MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));\r
+    }\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Reads I/O registers.\r
+\r
+  @param  This                  A pointer to the EFI_CPU_IO_PROTOCOL instance.\r
+  @param  Width                 Signifies the width of the I/O or Memory operation.\r
+  @param  Address               The base address of the I/O or Memoryoperation.\r
+  @param  Count                 The number of I/O or Memory operations to perform.\r
+                                The number of bytes moved is Width size * Count, starting at Address.\r
+  @param  Buffer                For read operations, the destination buffer to store the results.\r
+                                For write operations, the source buffer from which to write data.\r
+\r
+  @retval EFI_SUCCESS           The data was read from or written to the EFI system.\r
+  @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system.Or Buffer is NULL.\r
+  @retval EFI_UNSUPPORTED       The Buffer is not aligned for the given Width.\r
+                                Or,The address range specified by Address, Width, and Count is not valid for this EFI system.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CpuIoServiceRead (\r
+  IN  EFI_CPU_IO_PROTOCOL        *This,\r
+  IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN  UINT64                     Address,\r
+  IN  UINTN                      Count,\r
+  OUT VOID                       *Buffer\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8                      InStride;\r
+  UINT8                      OutStride;\r
+  EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;\r
+  UINT8       *Uint8Buffer;\r
+\r
+  Status = CpuIoCheckParameter (FALSE, Width, Address, Count, Buffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Select loop based on the width of the transfer\r
+  //\r
+  InStride = mInStride[Width];\r
+  OutStride = mOutStride[Width];\r
+  OperationWidth = Width & 0x03;\r
+  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {\r
+    if (OperationWidth == EfiCpuIoWidthUint8) {\r
+      *Uint8Buffer = IoRead8 ((UINTN)Address);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint16) {\r
+      *((UINT16 *)Uint8Buffer) = IoRead16 ((UINTN)Address);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint32) {\r
+      *((UINT32 *)Uint8Buffer) = IoRead32 ((UINTN)Address);\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Write I/O registers.\r
+\r
+  @param  This                  A pointer to the EFI_CPU_IO_PROTOCOL instance.\r
+  @param  Width                 Signifies the width of the I/O or Memory operation.\r
+  @param  Address               The base address of the I/O or Memoryoperation.\r
+  @param  Count                 The number of I/O or Memory operations to perform.\r
+                                The number of bytes moved is Width size * Count, starting at Address.\r
+  @param  Buffer                For read operations, the destination buffer to store the results.\r
+                                For write operations, the source buffer from which to write data.\r
+\r
+  @retval EFI_SUCCESS           The data was read from or written to the EFI system.\r
+  @retval EFI_INVALID_PARAMETER Width is invalid for this EFI system.Or Buffer is NULL.\r
+  @retval EFI_UNSUPPORTED       The Buffer is not aligned for the given Width.\r
+                                Or,The address range specified by Address, Width, and Count is not valid for this EFI system.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CpuIoServiceWrite (\r
+  IN EFI_CPU_IO_PROTOCOL        *This,\r
+  IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,\r
+  IN UINT64                     Address,\r
+  IN UINTN                      Count,\r
+  IN VOID                       *Buffer\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8                      InStride;\r
+  UINT8                      OutStride;\r
+  EFI_CPU_IO_PROTOCOL_WIDTH  OperationWidth;\r
+  UINT8       *Uint8Buffer;\r
+\r
+  //\r
+  // Make sure the parameters are valid\r
+  //\r
+  Status = CpuIoCheckParameter (FALSE, Width, Address, Count, Buffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Select loop based on the width of the transfer\r
+  //\r
+  InStride = mInStride[Width];\r
+  OutStride = mOutStride[Width];\r
+  OperationWidth = Width & 0x03;\r
+  for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {\r
+    if (OperationWidth == EfiCpuIoWidthUint8) {\r
+      IoWrite8 ((UINTN)Address, *Uint8Buffer);\r
+    } else if (OperationWidth == EfiCpuIoWidthUint16) {\r
+      IoWrite16 ((UINTN)Address, *((UINT16 *)Uint8Buffer));\r
+    } else if (OperationWidth == EfiCpuIoWidthUint32) {\r
+      IoWrite32 ((UINTN)Address, *((UINT32 *)Uint8Buffer));\r
+    }\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  The user Entry Point for module CpuIo. The user code starts with this function.\r
+\r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] SystemTable    A pointer to the EFI System Table.\r
+  \r
+  @retval EFI_SUCCESS       The entry point is executed successfully.\r
+  @retval other             Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CpuIoInitialize (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS Status;\r
+\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIoProtocolGuid);\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mHandle,\r
+                  &gEfiCpuIoProtocolGuid, &mCpuIo,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
diff --git a/IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf b/IntelFrameworkModulePkg/Universal/CpuIoDxe/CpuIoDxe.inf
new file mode 100644 (file)
index 0000000..93d63ca
--- /dev/null
@@ -0,0 +1,46 @@
+#/** @file\r
+#  Module that produces the Framework CPU I/O Protocol using the services of the I/O Library\r
+#\r
+#  Copyright (c) 2006 - 2010, Intel Corporation.  <BR>\r
+#  All rights reserved. This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\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
+#**/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = CpuIoDxe\r
+  FILE_GUID                      = BAE7599F-3C6B-43b7-BDF0-9CE07AA91AA6\r
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  ENTRY_POINT                    = CpuIoInitialize\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64\r
+#\r
+\r
+[Sources]\r
+  CpuIo.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiDriverEntryPoint\r
+  BaseLib\r
+  DebugLib\r
+  IoLib\r
+  UefiBootServicesTableLib\r
+\r
+[Protocols]\r
+  gEfiCpuIoProtocolGuid                         # PROTOCOL SOMETIMES_PRODUCED\r
+\r
+[Depex]\r
+  TRUE\r