PeiHdaVerbTableLib.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /** @file
  2. This file is SampleCode of the library for Intel HD Audio Verb Table configuration.
  3. Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <ConfigBlock.h>
  7. #include <PlatformBoardId.h>
  8. #include <Library/BaseMemoryLib.h>
  9. #include <Library/DebugLib.h>
  10. #include <Library/HdaVerbTableLib.h>
  11. #include <Library/MemoryAllocationLib.h>
  12. #include <Library/PcdLib.h>
  13. extern HDAUDIO_VERB_TABLE HdaVerbTableDisplayAudio;
  14. extern HDAUDIO_VERB_TABLE HdaVerbTableAlc274;
  15. extern HDAUDIO_VERB_TABLE HdaVerbTableAlc700;
  16. extern HDAUDIO_VERB_TABLE HdaVerbTableAlc701;
  17. extern HDAUDIO_VERB_TABLE WhlHdaVerbTableAlc700;
  18. /**
  19. Add verb table helper function.
  20. This function calculates verbtable number and shows verb table information.
  21. @param[in,out] VerbTableEntryNum Input current VerbTable number and output the number after adding new table
  22. @param[in,out] VerbTableArray Pointer to array of VerbTable
  23. @param[in] VerbTable VerbTable which is going to add into array
  24. **/
  25. STATIC
  26. VOID
  27. InternalAddVerbTable (
  28. IN OUT UINT8 *VerbTableEntryNum,
  29. IN OUT UINT32 *VerbTableArray,
  30. IN HDAUDIO_VERB_TABLE *VerbTable
  31. )
  32. {
  33. if (VerbTable == NULL) {
  34. DEBUG ((DEBUG_INFO, "InternalAddVerbTable wrong input: VerbTable == NULL\n"));
  35. return;
  36. }
  37. VerbTableArray[*VerbTableEntryNum] = (UINT32) VerbTable;
  38. *VerbTableEntryNum += 1;
  39. DEBUG ((DEBUG_INFO,
  40. "HDA: Add verb table for vendor = 0x%04X devId = 0x%04X (size = %d DWords)\n",
  41. VerbTable->Header.VendorId,
  42. VerbTable->Header.DeviceId,
  43. VerbTable->Header.DataDwords)
  44. );
  45. }
  46. /**
  47. Add verb table function.
  48. This function update the verb table number and verb table ptr of policy.
  49. @param[in] HdAudioConfig HD Audio config block
  50. @param[out] VerbTableEntryNum Number of verb table entries
  51. @param[out] HdaVerbTablePtr Pointer to the verb table
  52. **/
  53. VOID
  54. AddPlatformVerbTables (
  55. IN UINT8 CodecType,
  56. OUT UINT8 *VerbTableEntryNum,
  57. OUT UINT32 *HdaVerbTablePtr
  58. )
  59. {
  60. UINT8 VerbTableEntries;
  61. UINT32 VerbTableArray[6];
  62. UINT32 *VerbTablePtr;
  63. VerbTableEntries = 0;
  64. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdDisplayAudioHdaVerbTable));
  65. if (CodecType == PchHdaCodecPlatformOnboard) {
  66. DEBUG ((DEBUG_INFO, "HDA Policy: Onboard codec selected\n"));
  67. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable));
  68. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable2));
  69. } else {
  70. DEBUG ((DEBUG_INFO, "HDA Policy: External codec kit selected\n"));
  71. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable1));
  72. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable2));
  73. InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable3));
  74. }
  75. *VerbTableEntryNum = VerbTableEntries;
  76. VerbTablePtr = (UINT32 *) AllocateZeroPool (sizeof (UINT32) * VerbTableEntries);
  77. CopyMem (VerbTablePtr, VerbTableArray, sizeof (UINT32) * VerbTableEntries);
  78. *HdaVerbTablePtr = (UINT32) VerbTablePtr;
  79. }
  80. /**
  81. HDA VerbTable init function for PEI post memory phase.
  82. @param[in] BoardId An unsigned integrer represent the board id.
  83. @retval EFI_SUCCESS The function completed successfully.
  84. **/
  85. EFI_STATUS
  86. HdaVerbTableInit (
  87. IN UINT16 BoardId
  88. )
  89. {
  90. HDAUDIO_VERB_TABLE *VerbTable;
  91. HDAUDIO_VERB_TABLE *VerbTable2;
  92. VerbTable = NULL;
  93. VerbTable2 = NULL;
  94. switch (BoardId) {
  95. case BoardIdCometLakeULpddr3Rvp:
  96. VerbTable = &WhlHdaVerbTableAlc700;
  97. break;
  98. default:
  99. DEBUG ((DEBUG_INFO, "HDA: Init default verb tables (Realtek ALC700 and ALC701)\n"));
  100. VerbTable = &HdaVerbTableAlc700;
  101. VerbTable2 = &HdaVerbTableAlc701;
  102. break;
  103. }
  104. PcdSet32S (PcdHdaVerbTable, (UINT32) VerbTable);
  105. PcdSet32S (PcdHdaVerbTable2, (UINT32) VerbTable2);
  106. PcdSet32S (PcdDisplayAudioHdaVerbTable, (UINT32) &HdaVerbTableDisplayAudio);
  107. // Codecs - Realtek ALC700, ALC701, ALC274 (external - connected via HDA header)
  108. PcdSet32S (PcdCommonHdaVerbTable1, (UINT32) &HdaVerbTableAlc700);
  109. PcdSet32S (PcdCommonHdaVerbTable2, (UINT32) &HdaVerbTableAlc701);
  110. PcdSet32S (PcdCommonHdaVerbTable3, (UINT32) &HdaVerbTableAlc274);
  111. return EFI_SUCCESS;
  112. }