MiscOnboardDeviceFunction.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /** @file
  2. Onboard device information boot time changes.
  3. SMBIOS type 10.
  4. Copyright (c) 2013-2015 Intel Corporation.
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include "CommonHeader.h"
  8. #include "SmbiosMisc.h"
  9. /**
  10. This function makes boot time changes to the contents of the
  11. MiscOnboardDevice (Type 10).
  12. @param RecordData Pointer to copy of RecordData from the Data Table.
  13. @retval EFI_SUCCESS All parameters were valid.
  14. @retval EFI_UNSUPPORTED Unexpected RecordType value.
  15. @retval EFI_INVALID_PARAMETER Invalid parameter was found.
  16. **/
  17. MISC_SMBIOS_TABLE_FUNCTION(MiscOnboardDevice)
  18. {
  19. CHAR8 *OptionalStrStart;
  20. UINT8 StatusAndType;
  21. UINTN DescriptionStrLen;
  22. EFI_STRING DeviceDescription;
  23. STRING_REF TokenToGet;
  24. EFI_STATUS Status;
  25. EFI_SMBIOS_HANDLE SmbiosHandle;
  26. SMBIOS_TABLE_TYPE10 *SmbiosRecord;
  27. EFI_MISC_ONBOARD_DEVICE *ForType10InputData;
  28. ForType10InputData = (EFI_MISC_ONBOARD_DEVICE *)RecordData;
  29. //
  30. // First check for invalid parameters.
  31. //
  32. if (RecordData == NULL) {
  33. return EFI_INVALID_PARAMETER;
  34. }
  35. TokenToGet = 0;
  36. switch (ForType10InputData->OnBoardDeviceDescription) {
  37. case STR_MISC_ONBOARD_DEVICE_VIDEO:
  38. TokenToGet = STRING_TOKEN (STR_MISC_ONBOARD_DEVICE_VIDEO);
  39. break;
  40. case STR_MISC_ONBOARD_DEVICE_AUDIO:
  41. TokenToGet = STRING_TOKEN (STR_MISC_ONBOARD_DEVICE_AUDIO);
  42. break;
  43. }
  44. DeviceDescription = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
  45. DescriptionStrLen = StrLen(DeviceDescription);
  46. if (DescriptionStrLen > SMBIOS_STRING_MAX_LENGTH) {
  47. return EFI_UNSUPPORTED;
  48. }
  49. //
  50. // Two zeros following the last string.
  51. //
  52. SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE10) + DescriptionStrLen + 1 + 1);
  53. ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE10) + DescriptionStrLen + 1 + 1);
  54. SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION;
  55. SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE10);
  56. //
  57. // Make handle chosen by smbios protocol.add automatically.
  58. //
  59. SmbiosRecord->Hdr.Handle = 0;
  60. //
  61. // Status & Type: Bit 7 Devicen Status, Bits 6:0 Type of Device
  62. //
  63. StatusAndType = (UINT8) ForType10InputData->OnBoardDeviceStatus.DeviceType;
  64. if (ForType10InputData->OnBoardDeviceStatus.DeviceEnabled != 0) {
  65. StatusAndType |= 0x80;
  66. } else {
  67. StatusAndType &= 0x7F;
  68. }
  69. SmbiosRecord->Device[0].DeviceType = StatusAndType;
  70. SmbiosRecord->Device[0].DescriptionString = 1;
  71. OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
  72. UnicodeStrToAsciiStrS (DeviceDescription, OptionalStrStart, DescriptionStrLen + 1);
  73. //
  74. // Now we have got the full smbios record, call smbios protocol to add this record.
  75. //
  76. SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
  77. Status = Smbios-> Add(
  78. Smbios,
  79. NULL,
  80. &SmbiosHandle,
  81. (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
  82. );
  83. FreePool(SmbiosRecord);
  84. return Status;
  85. }