MiscBaseBoardManufacturerFunction.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /*++
  2. Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. MiscBaseBoardManufacturerFunction.c
  6. Abstract:
  7. BaseBoard manufacturer information boot time changes.
  8. SMBIOS type 2.
  9. --*/
  10. #include "CommonHeader.h"
  11. #include "MiscSubclassDriver.h"
  12. #include <Library/NetLib.h>
  13. #include "Library/DebugLib.h"
  14. #include <Uefi/UefiBaseType.h>
  15. #include <Guid/PlatformInfo.h>
  16. extern EFI_PLATFORM_INFO_HOB *mPlatformInfo;
  17. /**
  18. This function makes boot time changes to the contents of the
  19. MiscBaseBoardManufacturer (Type 2).
  20. @param RecordData Pointer to copy of RecordData from the Data Table.
  21. @retval EFI_SUCCESS All parameters were valid.
  22. @retval EFI_UNSUPPORTED Unexpected RecordType value.
  23. @retval EFI_INVALID_PARAMETER Invalid parameter was found.
  24. **/
  25. MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
  26. {
  27. CHAR8 *OptionalStrStart;
  28. UINTN ManuStrLen;
  29. UINTN ProductStrLen;
  30. UINTN VerStrLen;
  31. UINTN AssertTagStrLen;
  32. UINTN SerialNumStrLen;
  33. UINTN ChassisStrLen;
  34. EFI_STATUS Status;
  35. EFI_STRING Manufacturer;
  36. EFI_STRING Product;
  37. EFI_STRING Version;
  38. EFI_STRING SerialNumber;
  39. EFI_STRING AssertTag;
  40. EFI_STRING Chassis;
  41. STRING_REF TokenToGet;
  42. EFI_SMBIOS_HANDLE SmbiosHandle;
  43. SMBIOS_TABLE_TYPE2 *SmbiosRecord;
  44. EFI_MISC_BASE_BOARD_MANUFACTURER *ForType2InputData;
  45. CHAR16 *MacStr;
  46. EFI_HANDLE *Handles;
  47. UINTN BufferSize;
  48. CHAR16 Buffer[40];
  49. ForType2InputData = (EFI_MISC_BASE_BOARD_MANUFACTURER *)RecordData;
  50. //
  51. // First check for invalid parameters.
  52. //
  53. if (RecordData == NULL || mPlatformInfo == NULL) {
  54. return EFI_INVALID_PARAMETER;
  55. }
  56. if (BOARD_ID_MINNOW2_TURBOT == mPlatformInfo->BoardId) {
  57. UnicodeSPrint (Buffer, sizeof (Buffer),L"ADI");
  58. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_BASE_BOARD_MANUFACTURER), Buffer, NULL);
  59. }
  60. TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
  61. Manufacturer = SmbiosMiscGetString (TokenToGet);
  62. ManuStrLen = StrLen(Manufacturer);
  63. if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
  64. return EFI_UNSUPPORTED;
  65. }
  66. if (BOARD_ID_MINNOW2_TURBOT == mPlatformInfo->BoardId) {
  67. UnicodeSPrint (Buffer, sizeof (Buffer),L"MinnowBoard Turbot");
  68. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_BASE_BOARD_PRODUCT_NAME1), Buffer, NULL);
  69. }
  70. TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME1);
  71. Product = SmbiosMiscGetString (TokenToGet);
  72. ProductStrLen = StrLen(Product);
  73. if (ProductStrLen > SMBIOS_STRING_MAX_LENGTH) {
  74. return EFI_UNSUPPORTED;
  75. }
  76. TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
  77. Version = SmbiosMiscGetString (TokenToGet);
  78. VerStrLen = StrLen(Version);
  79. if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
  80. return EFI_UNSUPPORTED;
  81. }
  82. //
  83. //Get handle infomation
  84. //
  85. BufferSize = 0;
  86. Handles = NULL;
  87. Status = gBS->LocateHandle (
  88. ByProtocol,
  89. &gEfiSimpleNetworkProtocolGuid,
  90. NULL,
  91. &BufferSize,
  92. Handles
  93. );
  94. if (Status == EFI_BUFFER_TOO_SMALL) {
  95. Handles = AllocateZeroPool(BufferSize);
  96. if (Handles == NULL) {
  97. return (EFI_OUT_OF_RESOURCES);
  98. }
  99. Status = gBS->LocateHandle(
  100. ByProtocol,
  101. &gEfiSimpleNetworkProtocolGuid,
  102. NULL,
  103. &BufferSize,
  104. Handles
  105. );
  106. }
  107. //
  108. //Get the MAC string
  109. //
  110. Status = NetLibGetMacString (
  111. *Handles,
  112. NULL,
  113. &MacStr
  114. );
  115. if (EFI_ERROR (Status)) {
  116. MacStr = L"000000000000";
  117. }
  118. SerialNumber = MacStr;
  119. SerialNumStrLen = StrLen(SerialNumber);
  120. if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
  121. return EFI_UNSUPPORTED;
  122. }
  123. DEBUG ((EFI_D_ERROR, "MAC Address: %S\n", MacStr));
  124. TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
  125. AssertTag = SmbiosMiscGetString (TokenToGet);
  126. AssertTagStrLen = StrLen(AssertTag);
  127. if (AssertTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
  128. return EFI_UNSUPPORTED;
  129. }
  130. TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
  131. Chassis = SmbiosMiscGetString (TokenToGet);
  132. ChassisStrLen = StrLen(Chassis);
  133. if (ChassisStrLen > SMBIOS_STRING_MAX_LENGTH) {
  134. return EFI_UNSUPPORTED;
  135. }
  136. //
  137. // Two zeros following the last string.
  138. //
  139. SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE2) + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + ChassisStrLen +1 + 1);
  140. ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE2) + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + ChassisStrLen +1 + 1);
  141. SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION;
  142. SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);
  143. //
  144. // Make handle chosen by smbios protocol.add automatically.
  145. //
  146. SmbiosRecord->Hdr.Handle = 0;
  147. //
  148. // Manu will be the 1st optional string following the formatted structure.
  149. //
  150. SmbiosRecord->Manufacturer = 1;
  151. //
  152. // ProductName will be the 2st optional string following the formatted structure.
  153. //
  154. SmbiosRecord->ProductName = 2;
  155. //
  156. // Version will be the 3rd optional string following the formatted structure.
  157. //
  158. SmbiosRecord->Version = 3;
  159. //
  160. // SerialNumber will be the 4th optional string following the formatted structure.
  161. //
  162. SmbiosRecord->SerialNumber = 4;
  163. //
  164. // AssertTag will be the 5th optional string following the formatted structure.
  165. //
  166. SmbiosRecord->AssetTag = 5;
  167. //
  168. // LocationInChassis will be the 6th optional string following the formatted structure.
  169. //
  170. SmbiosRecord->LocationInChassis = 6;
  171. SmbiosRecord->FeatureFlag = (*(BASE_BOARD_FEATURE_FLAGS*)&(ForType2InputData->BaseBoardFeatureFlags));
  172. SmbiosRecord->ChassisHandle = 0;
  173. SmbiosRecord->BoardType = (UINT8)ForType2InputData->BaseBoardType;
  174. SmbiosRecord->NumberOfContainedObjectHandles = 0;
  175. OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
  176. //
  177. // Since we fill NumberOfContainedObjectHandles = 0 for simple, just after this filed to fill string
  178. //
  179. UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);
  180. UnicodeStrToAsciiStr(Product, OptionalStrStart + ManuStrLen + 1);
  181. UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1);
  182. UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1);
  183. UnicodeStrToAsciiStr(AssertTag, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);
  184. UnicodeStrToAsciiStr(Chassis, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1);
  185. //
  186. // Now we have got the full smbios record, call smbios protocol to add this record.
  187. //
  188. SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
  189. Status = Smbios-> Add(
  190. Smbios,
  191. NULL,
  192. &SmbiosHandle,
  193. (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
  194. );
  195. FreePool(SmbiosRecord);
  196. return Status;
  197. }