MiscSystemManufacturerFunction.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*++
  2. Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. MiscSystemManufacturerFunction.c
  6. Abstract:
  7. This driver parses the mMiscSubclassDataTable structure and reports
  8. any generated data.
  9. --*/
  10. #include "CommonHeader.h"
  11. #include "MiscSubclassDriver.h"
  12. #include <Protocol/DxeSmmReadyToLock.h>
  13. #include <Library/NetLib.h>
  14. #include "Library/DebugLib.h"
  15. #include <Uefi/UefiBaseType.h>
  16. #include <Guid/PlatformInfo.h>
  17. extern EFI_PLATFORM_INFO_HOB *mPlatformInfo;
  18. /**
  19. Publish the smbios type 1.
  20. @param Event Event whose notification function is being invoked (gEfiDxeSmmReadyToLockProtocolGuid).
  21. @param Context Pointer to the notification functions context, which is implementation dependent.
  22. @retval None
  23. **/
  24. EFI_STATUS
  25. EFIAPI
  26. AddSmbiosManuCallback (
  27. IN EFI_EVENT Event,
  28. IN VOID *Context
  29. )
  30. {
  31. CHAR8 *OptionalStrStart;
  32. UINTN OptionalStrSize;
  33. UINTN ManuStrLen;
  34. UINTN VerStrLen;
  35. UINTN PdNameStrLen;
  36. UINTN SerialNumStrLen;
  37. UINTN SkuNumberStrLen;
  38. UINTN FamilyNameStrLen;
  39. EFI_STATUS Status;
  40. EFI_STRING Manufacturer;
  41. EFI_STRING ProductName;
  42. EFI_STRING Version;
  43. EFI_STRING SerialNumber;
  44. EFI_STRING SkuNumber;
  45. EFI_STRING FamilyName;
  46. STRING_REF TokenToGet;
  47. EFI_SMBIOS_HANDLE SmbiosHandle;
  48. SMBIOS_TABLE_TYPE1 *SmbiosRecord;
  49. EFI_MISC_SYSTEM_MANUFACTURER *ForType1InputData;
  50. EFI_SMBIOS_PROTOCOL *Smbios;
  51. CHAR16 Buffer[40];
  52. CHAR16 *MacStr;
  53. EFI_HANDLE *Handles;
  54. UINTN BufferSize;
  55. CHAR16 PlatformNameBuffer[40];
  56. ForType1InputData = (EFI_MISC_SYSTEM_MANUFACTURER *)Context;
  57. //
  58. // First check for invalid parameters.
  59. //
  60. if (Context == NULL || mPlatformInfo == NULL) {
  61. return EFI_INVALID_PARAMETER;
  62. }
  63. Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID *) &Smbios);
  64. ASSERT_EFI_ERROR (Status);
  65. if (BOARD_ID_MINNOW2_TURBOT == mPlatformInfo->BoardId) {
  66. // Detect the board is Turbot board platform
  67. UnicodeSPrint (PlatformNameBuffer, sizeof (PlatformNameBuffer),L"%s",L"Minnowboard Turbot ");
  68. } else {
  69. UnicodeSPrint (PlatformNameBuffer, sizeof (PlatformNameBuffer),L"%s",L"Minnowboard Max ");
  70. }
  71. //
  72. // Silicon Steppings
  73. //
  74. switch (PchStepping()) {
  75. case PchA0:
  76. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"A0 PLATFORM");
  77. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  78. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"A0");
  79. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  80. DEBUG ((EFI_D_ERROR, "A0 Stepping Detected\n"));
  81. break;
  82. case PchA1:
  83. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"A1 PLATFORM");
  84. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  85. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"A1");
  86. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  87. DEBUG ((EFI_D_ERROR, "A1 Stepping Detected\n"));
  88. break;
  89. case PchB0:
  90. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B0 PLATFORM");
  91. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  92. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B0");
  93. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  94. DEBUG ((EFI_D_ERROR, "B0 Stepping Detected\n"));
  95. break;
  96. case PchB1:
  97. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B1 PLATFORM");
  98. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  99. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B1");
  100. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  101. DEBUG ((EFI_D_ERROR, "B1 Stepping Detected\n"));
  102. break;
  103. case PchB2:
  104. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B2 PLATFORM");
  105. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  106. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B2");
  107. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  108. DEBUG ((EFI_D_ERROR, "B2 Stepping Detected\n"));
  109. break;
  110. case PchB3:
  111. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B3 PLATFORM");
  112. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  113. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B3");
  114. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  115. DEBUG ((EFI_D_ERROR, "B3 Stepping Detected\n"));
  116. break;
  117. case PchC0:
  118. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"C0 PLATFORM");
  119. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  120. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"C0");
  121. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  122. DEBUG ((EFI_D_ERROR, "C0 Stepping Detected\n"));
  123. break;
  124. case PchD0:
  125. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"D0 PLATFORM");
  126. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
  127. UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"D0");
  128. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
  129. DEBUG ((EFI_D_ERROR, "D0 Stepping Detected\n"));
  130. break;
  131. default:
  132. DEBUG ((EFI_D_ERROR, "Unknow Stepping Detected\n"));
  133. break;
  134. }
  135. if (BOARD_ID_MINNOW2_TURBOT == mPlatformInfo->BoardId) {
  136. UnicodeSPrint (Buffer, sizeof (Buffer),L"ADI");
  137. HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_MANUFACTURER), Buffer, NULL);
  138. }
  139. TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER);
  140. Manufacturer = SmbiosMiscGetString (TokenToGet);
  141. ManuStrLen = StrLen(Manufacturer);
  142. if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
  143. return EFI_UNSUPPORTED;
  144. }
  145. TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);
  146. ProductName = SmbiosMiscGetString (TokenToGet);
  147. PdNameStrLen = StrLen(ProductName);
  148. if (PdNameStrLen > SMBIOS_STRING_MAX_LENGTH) {
  149. return EFI_UNSUPPORTED;
  150. }
  151. TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);
  152. Version = SmbiosMiscGetString (TokenToGet);
  153. VerStrLen = StrLen(Version);
  154. if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
  155. return EFI_UNSUPPORTED;
  156. }
  157. //
  158. //Get handle infomation
  159. //
  160. BufferSize = 0;
  161. Handles = NULL;
  162. Status = gBS->LocateHandle (
  163. ByProtocol,
  164. &gEfiSimpleNetworkProtocolGuid,
  165. NULL,
  166. &BufferSize,
  167. Handles
  168. );
  169. if (Status == EFI_BUFFER_TOO_SMALL) {
  170. Handles = AllocateZeroPool(BufferSize);
  171. if (Handles == NULL) {
  172. return (EFI_OUT_OF_RESOURCES);
  173. }
  174. Status = gBS->LocateHandle(
  175. ByProtocol,
  176. &gEfiSimpleNetworkProtocolGuid,
  177. NULL,
  178. &BufferSize,
  179. Handles
  180. );
  181. }
  182. //
  183. //Get the MAC string
  184. //
  185. if (Handles == NULL) {
  186. Status = EFI_NOT_FOUND;
  187. } else {
  188. Status = NetLibGetMacString (
  189. *Handles,
  190. NULL,
  191. &MacStr
  192. );
  193. }
  194. if (EFI_ERROR (Status)) {
  195. MacStr = L"000000000000";
  196. }
  197. SerialNumber = MacStr;
  198. SerialNumStrLen = StrLen(SerialNumber);
  199. if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
  200. return EFI_UNSUPPORTED;
  201. }
  202. TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER);
  203. SkuNumber = SmbiosMiscGetString (TokenToGet);
  204. SkuNumberStrLen = StrLen(SkuNumber);
  205. if (SkuNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
  206. return EFI_UNSUPPORTED;
  207. }
  208. TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_FAMILY_NAME1);
  209. FamilyName = SmbiosMiscGetString (TokenToGet);
  210. FamilyNameStrLen = StrLen(FamilyName);
  211. if (FamilyNameStrLen > SMBIOS_STRING_MAX_LENGTH) {
  212. return EFI_UNSUPPORTED;
  213. }
  214. //
  215. // Two zeros following the last string.
  216. //
  217. OptionalStrSize = ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + SkuNumberStrLen + 1 + FamilyNameStrLen + 1 + 1;
  218. SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE1) + OptionalStrSize);
  219. ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE1) + OptionalStrSize);
  220. SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_INFORMATION;
  221. SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1);
  222. //
  223. // Make handle chosen by smbios protocol.add automatically.
  224. //
  225. SmbiosRecord->Hdr.Handle = 0;
  226. //
  227. // Manu will be the 1st optional string following the formatted structure.
  228. //
  229. SmbiosRecord->Manufacturer = 1;
  230. //
  231. // ProductName will be the 2nd optional string following the formatted structure.
  232. //
  233. SmbiosRecord->ProductName = 2;
  234. //
  235. // Version will be the 3rd optional string following the formatted structure.
  236. //
  237. SmbiosRecord->Version = 3;
  238. //
  239. // Version will be the 4th optional string following the formatted structure.
  240. //
  241. SmbiosRecord->SerialNumber = 4;
  242. SmbiosRecord->SKUNumber= 5;
  243. SmbiosRecord->Family= 6;
  244. //
  245. // Unique UUID
  246. //
  247. ForType1InputData->SystemUuid.Data1 = PcdGet32 (PcdProductSerialNumber);
  248. ForType1InputData->SystemUuid.Data4[0] = PcdGet8 (PcdEmmcManufacturerId);
  249. CopyMem ((UINT8 *) (&SmbiosRecord->Uuid),&ForType1InputData->SystemUuid,16);
  250. SmbiosRecord->WakeUpType = (UINT8)ForType1InputData->SystemWakeupType;
  251. OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
  252. UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, OptionalStrSize);
  253. OptionalStrStart += (ManuStrLen + 1);
  254. OptionalStrSize -= (ManuStrLen + 1);
  255. UnicodeStrToAsciiStrS (ProductName, OptionalStrStart, OptionalStrSize);
  256. OptionalStrStart += (PdNameStrLen + 1);
  257. OptionalStrSize -= (PdNameStrLen + 1);
  258. UnicodeStrToAsciiStrS (Version, OptionalStrStart, OptionalStrSize);
  259. OptionalStrStart += (VerStrLen + 1);
  260. OptionalStrSize -= (VerStrLen + 1);
  261. UnicodeStrToAsciiStrS (SerialNumber, OptionalStrStart, OptionalStrSize);
  262. OptionalStrStart += (SerialNumStrLen + 1);
  263. OptionalStrSize -= (SerialNumStrLen + 1);
  264. UnicodeStrToAsciiStrS (SkuNumber, OptionalStrStart, OptionalStrSize);
  265. OptionalStrStart += (SkuNumberStrLen + 1);
  266. OptionalStrSize -= (SkuNumberStrLen + 1);
  267. UnicodeStrToAsciiStrS (FamilyName, OptionalStrStart, OptionalStrSize);
  268. //
  269. // Now we have got the full smbios record, call smbios protocol to add this record.
  270. //
  271. SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
  272. Status = Smbios-> Add(
  273. Smbios,
  274. NULL,
  275. &SmbiosHandle,
  276. (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
  277. );
  278. FreePool(SmbiosRecord);
  279. return Status;
  280. }
  281. /**
  282. This function makes boot time changes to the contents of the
  283. MiscSystemManufacturer (Type 1).
  284. @param RecordData Pointer to copy of RecordData from the Data Table.
  285. @retval EFI_SUCCESS All parameters were valid.
  286. @retval EFI_UNSUPPORTED Unexpected RecordType value.
  287. @retval EFI_INVALID_PARAMETER Invalid parameter was found.
  288. **/
  289. MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer)
  290. {
  291. EFI_STATUS Status;
  292. static BOOLEAN CallbackIsInstalledManu = FALSE;
  293. VOID *AddSmbiosManuCallbackNotifyReg;
  294. EFI_EVENT AddSmbiosManuCallbackEvent;
  295. if (CallbackIsInstalledManu == FALSE) {
  296. CallbackIsInstalledManu = TRUE; // Prevent more than 1 callback.
  297. DEBUG ((EFI_D_INFO, "Create Smbios Manu callback.\n"));
  298. //
  299. // gEfiDxeSmmReadyToLockProtocolGuid is ready
  300. //
  301. Status = gBS->CreateEvent (
  302. EVT_NOTIFY_SIGNAL,
  303. TPL_CALLBACK,
  304. (EFI_EVENT_NOTIFY)AddSmbiosManuCallback,
  305. RecordData,
  306. &AddSmbiosManuCallbackEvent
  307. );
  308. ASSERT_EFI_ERROR (Status);
  309. if (EFI_ERROR (Status)) {
  310. return Status;
  311. }
  312. Status = gBS->RegisterProtocolNotify (
  313. &gEfiDxeSmmReadyToLockProtocolGuid,
  314. AddSmbiosManuCallbackEvent,
  315. &AddSmbiosManuCallbackNotifyReg
  316. );
  317. return Status;
  318. }
  319. return EFI_SUCCESS;
  320. }