]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnixPkg/CpuRuntimeDxe/Cpu.c
Update the copyright notice format
[mirror_edk2.git] / UnixPkg / CpuRuntimeDxe / Cpu.c
index dc25d4d8124f10b0f40d0673fbc53af066105c32..cfd5c008644ada9ca2340d4cdb4bf4264e2a570e 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2009, 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
@@ -22,10 +22,11 @@ Abstract:
 \r
 --*/\r
 #include <FrameworkDxe.h>\r
+#include <IndustryStandard/SmBios.h>\r
 #include <Protocol/Cpu.h>\r
-#include <Protocol/DataHub.h>\r
+#include <Protocol/Smbios.h>\r
 #include <Guid/DataHubRecords.h>\r
-#include <Protocol/CpuIo.h>\r
+#include <Protocol/CpuIo2.h>\r
 #include <Protocol/FrameworkHii.h>\r
 \r
 #include <Library/BaseLib.h>\r
@@ -58,27 +59,18 @@ CPU_ARCH_PROTOCOL_PRIVATE mCpuTemplate = {
     4\r
   },\r
   {\r
-    CpuMemoryServiceRead,\r
-    CpuMemoryServiceWrite,\r
-    CpuIoServiceRead,\r
-    CpuIoServiceWrite\r
+    {\r
+      CpuMemoryServiceRead,\r
+      CpuMemoryServiceWrite\r
+    },\r
+    {\r
+      CpuIoServiceRead,\r
+      CpuIoServiceWrite\r
+    }\r
   },\r
-  0,\r
   TRUE\r
 };\r
 \r
-typedef union {\r
-  EFI_CPU_DATA_RECORD *DataRecord;\r
-  UINT8               *Raw;\r
-} EFI_CPU_DATA_RECORD_BUFFER;\r
-\r
-EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {\r
-  EFI_PROCESSOR_SUBCLASS_VERSION,       // Version\r
-  sizeof (EFI_SUBCLASS_TYPE1_HEADER),   // Header Size\r
-  0,                                    // Instance, Initialize later\r
-  EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
-  0                                     // RecordType, Initialize later\r
-};\r
 \r
 //\r
 // Service routines for the driver\r
@@ -402,8 +394,36 @@ Returns:
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+\r
+\r
+/**\r
+  Logs SMBIOS record.\r
+\r
+  @param  Smbios   Pointer to SMBIOS protocol instance.\r
+  @param  Buffer   Pointer to the data buffer.\r
+\r
+**/\r
 VOID\r
-CpuUpdateDataHub (\r
+LogSmbiosData (\r
+  IN  EFI_SMBIOS_PROTOCOL        *Smbios,\r
+  IN  UINT8                      *Buffer\r
+  )\r
+{\r
+  EFI_STATUS         Status;\r
+  EFI_SMBIOS_HANDLE  SmbiosHandle;\r
+  \r
+  SmbiosHandle = 0;\r
+  Status = Smbios->Add (\r
+                     Smbios,\r
+                     NULL,\r
+                     &SmbiosHandle,\r
+                     (EFI_SMBIOS_TABLE_HEADER*)Buffer\r
+                     );\r
+  ASSERT_EFI_ERROR (Status);\r
+}\r
+\r
+VOID\r
+CpuUpdateSmbios (\r
   VOID\r
   )\r
 /*++\r
@@ -421,31 +441,24 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                  Status;\r
-  EFI_CPU_DATA_RECORD_BUFFER  RecordBuffer;\r
-  UINT32                      HeaderSize;\r
+  EFI_SMBIOS_PROTOCOL         *Smbios;\r
   UINT32                      TotalSize;\r
-  EFI_DATA_HUB_PROTOCOL       *DataHub;\r
   EFI_HII_HANDLE              HiiHandle;\r
+  STRING_REF                  Token;\r
+  UINTN                       CpuVerStrLen;\r
+  EFI_STRING                  CpuVerStr;\r
+  SMBIOS_TABLE_TYPE4          *SmbiosRecord;\r
+  CHAR8                       *OptionalStrStart;\r
 \r
   //\r
-  // Locate DataHub protocol.\r
+  // Locate Smbios protocol.\r
   //\r
-  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub);\r
+  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);\r
+  \r
   if (EFI_ERROR (Status)) {\r
     return;\r
   }\r
 \r
-  //\r
-  // Initialize data record header\r
-  //\r
-  mCpuDataRecordHeader.Instance = 1;\r
-  HeaderSize                    = sizeof (EFI_SUBCLASS_TYPE1_HEADER);\r
-\r
-  RecordBuffer.Raw              = AllocatePool (HeaderSize + EFI_CPU_DATA_MAXIMUM_LENGTH);\r
-  if (RecordBuffer.Raw == NULL) {\r
-    return ;\r
-  }\r
-\r
   //\r
   // Initialize strings to HII database\r
   //\r
@@ -457,40 +470,39 @@ Returns:
                 );\r
   ASSERT (HiiHandle != NULL);\r
 \r
-  CopyMem (RecordBuffer.Raw, &mCpuDataRecordHeader, HeaderSize);\r
 \r
+  Token  = STRING_TOKEN (STR_INTEL_GENUINE_PROCESSOR);\r
+  CpuVerStr = HiiGetPackageString(&gEfiCallerIdGuid, Token, NULL);\r
+  CpuVerStrLen = StrLen(CpuVerStr);\r
+  ASSERT (CpuVerStrLen <= SMBIOS_STRING_MAX_LENGTH);\r
 \r
-  RecordBuffer.DataRecord->DataRecordHeader.RecordType      = ProcessorVersionRecordType;\r
-  RecordBuffer.DataRecord->VariableRecord.ProcessorVersion  = STRING_TOKEN (STR_INTEL_GENUINE_PROCESSOR);\r
-  TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_VERSION_DATA);\r
-\r
-  Status = DataHub->LogData (\r
-                      DataHub,\r
-                      &gEfiProcessorSubClassGuid,\r
-                      &gEfiCallerIdGuid,\r
-                      EFI_DATA_RECORD_CLASS_DATA,\r
-                      RecordBuffer.Raw,\r
-                      TotalSize\r
-                      );\r
+  TotalSize = sizeof(SMBIOS_TABLE_TYPE4) + CpuVerStrLen + 1 + 1;\r
+  SmbiosRecord = AllocatePool(TotalSize);\r
+  ZeroMem(SmbiosRecord, TotalSize);\r
 \r
+  SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION;\r
+  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE4);\r
+  //\r
+  // Make handle chosen by smbios protocol.add automatically.\r
+  //\r
+  SmbiosRecord->Hdr.Handle = 0;  \r
+  //\r
+  // Processor version is the 1st string.\r
+  //\r
+  SmbiosRecord->ProcessorVersion = 1;\r
   //\r
   // Store CPU frequency data record to data hub - It's an emulator so make up a value\r
   //\r
-  RecordBuffer.DataRecord->DataRecordHeader.RecordType                    = ProcessorCoreFrequencyRecordType;\r
-  RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Value    = 1234;\r
-  RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Exponent = 6;\r
-  TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_CORE_FREQUENCY_DATA);\r
-\r
-  Status = DataHub->LogData (\r
-                      DataHub,\r
-                      &gEfiProcessorSubClassGuid,\r
-                      &gEfiCallerIdGuid,\r
-                      EFI_DATA_RECORD_CLASS_DATA,\r
-                      RecordBuffer.Raw,\r
-                      TotalSize\r
-                      );\r
-\r
-  FreePool (RecordBuffer.Raw);\r
+  SmbiosRecord->CurrentSpeed  = 1234;\r
+\r
+  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
+  UnicodeStrToAsciiStr(CpuVerStr, OptionalStrStart);\r
+\r
+  //\r
+  // Now we have got the full smbios record, call smbios protocol to add this record.\r
+  //\r
+  LogSmbiosData(Smbios, (UINT8 *) SmbiosRecord);\r
+  FreePool (SmbiosRecord);\r
 }\r
 \r
 EFI_STATUS\r
@@ -523,12 +535,12 @@ Returns:
 {\r
   EFI_STATUS                Status;\r
 \r
-  CpuUpdateDataHub ();\r
+  CpuUpdateSmbios ();\r
 \r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &mCpuTemplate.Handle,\r
                   &gEfiCpuArchProtocolGuid,   &mCpuTemplate.Cpu,\r
-                  &gEfiCpuIoProtocolGuid,     &mCpuTemplate.CpuIo,\r
+                  &gEfiCpuIo2ProtocolGuid,    &mCpuTemplate.CpuIo,\r
                   NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r