PeiPchPolicyUpdate.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /** @file
  2. This file is SampleCode of the library for Intel PCH PEI Policy initialization.
  3. Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "PeiPchPolicyUpdate.h"
  7. #include <Library/BaseMemoryLib.h>
  8. #include <Library/MemoryAllocationLib.h>
  9. #include <Library/HobLib.h>
  10. #include <Guid/GlobalVariable.h>
  11. #include <Library/PchGbeLib.h>
  12. #include <Library/PchInfoLib.h>
  13. #include <Library/PchPcrLib.h>
  14. #include <Library/PchHsioLib.h>
  15. #include <Library/PchSerialIoLib.h>
  16. #include <Library/PchPcieRpLib.h>
  17. #include <GpioConfig.h>
  18. #include <GpioPinsSklH.h>
  19. #include <Library/DebugLib.h>
  20. #include <Library/PchGbeLib.h>
  21. extern PCH_PCIE_DEVICE_OVERRIDE mPcieDeviceTable[];
  22. /**
  23. Add verb table helper function.
  24. This function calculates verbtable number and shows verb table information.
  25. @param[in,out] VerbTableEntryNum Input current VerbTable number and output the number after adding new table
  26. @param[in,out] VerbTableArray Pointer to array of VerbTable
  27. @param[in] VerbTable VerbTable which is going to add into array
  28. **/
  29. STATIC
  30. VOID
  31. InternalAddVerbTable (
  32. IN OUT UINT8 *VerbTableEntryNum,
  33. IN OUT UINT32 *VerbTableArray,
  34. IN HDAUDIO_VERB_TABLE *VerbTable
  35. )
  36. {
  37. if (VerbTable == NULL) {
  38. DEBUG ((DEBUG_ERROR, "InternalAddVerbTable wrong input: VerbTable == NULL\n"));
  39. return;
  40. }
  41. VerbTableArray[*VerbTableEntryNum] = (UINT32) VerbTable;
  42. *VerbTableEntryNum += 1;
  43. DEBUG ((DEBUG_INFO,
  44. "Add verb table for vendor = 0x%04X devId = 0x%04X (size = %d DWords)\n",
  45. VerbTable->Header.VendorId,
  46. VerbTable->Header.DeviceId,
  47. VerbTable->Header.DataDwords)
  48. );
  49. }
  50. enum HDAUDIO_CODEC_SELECT {
  51. PchHdaCodecPlatformOnboard = 0,
  52. PchHdaCodecExternalKit = 1
  53. };
  54. /**
  55. Add verb table function.
  56. This function update the verb table number and verb table ptr of policy.
  57. @param[in] HdAudioConfig HDAudie config block
  58. @param[in] CodecType Platform codec type indicator
  59. @param[in] AudioConnectorType Platform audio connector type
  60. **/
  61. STATIC
  62. VOID
  63. InternalAddPlatformVerbTables (
  64. IN OUT FSPS_UPD *FspsUpd,
  65. IN UINT8 CodecType,
  66. IN UINT8 AudioConnectorType
  67. )
  68. {
  69. UINT8 VerbTableEntryNum;
  70. UINT32 VerbTableArray[32];
  71. UINT32 *VerbTablePtr;
  72. VerbTableEntryNum = 0;
  73. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdDisplayAudioHdaVerbTable));
  74. if (CodecType == PchHdaCodecPlatformOnboard) {
  75. DEBUG ((DEBUG_INFO, "HDA Policy: Onboard codec selected\n"));
  76. if ((VOID *) (UINTN) PcdGet32 (PcdExtHdaVerbTable) != NULL) {
  77. if (AudioConnectorType == 0) { //Type-C Audio connector selected in Bios Setup menu
  78. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdExtHdaVerbTable));
  79. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, NULL);
  80. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, NULL);
  81. DEBUG ((DEBUG_INFO, "HDA: Type-C Audio connector selected!\n"));
  82. } else { //Stacked Jack Audio connector selected in Bios Setup menu
  83. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable));
  84. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable2));
  85. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, NULL);
  86. DEBUG ((DEBUG_INFO, "HDA: Stacked-Jack Audio connector selected!\n"));
  87. }
  88. } else {
  89. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable));
  90. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable2));
  91. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, NULL);
  92. }
  93. } else {
  94. DEBUG ((DEBUG_INFO, "HDA Policy: External codec kit selected\n"));
  95. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable1));
  96. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable2));
  97. InternalAddVerbTable (&VerbTableEntryNum, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable3));
  98. }
  99. FspsUpd->FspsConfig.PchHdaVerbTableEntryNum = VerbTableEntryNum;
  100. VerbTablePtr = (UINT32 *) AllocateZeroPool (sizeof (UINT32) * VerbTableEntryNum);
  101. CopyMem (VerbTablePtr, VerbTableArray, sizeof (UINT32) * VerbTableEntryNum);
  102. FspsUpd->FspsConfig.PchHdaVerbTablePtr = (UINT32) VerbTablePtr;
  103. }
  104. /**
  105. Performs FSP PCH PEI Policy initialization.
  106. @param[in][out] FspsUpd Pointer to FSP UPD Data.
  107. @retval EFI_SUCCESS FSP UPD Data is updated.
  108. @retval EFI_NOT_FOUND Fail to locate required PPI.
  109. @retval Other FSP UPD Data update process fail.
  110. **/
  111. EFI_STATUS
  112. EFIAPI
  113. PeiFspPchPolicyUpdate (
  114. IN OUT FSPS_UPD *FspsUpd
  115. )
  116. {
  117. FspsUpd->FspsConfig.PchSubSystemVendorId = V_PCH_INTEL_VENDOR_ID;
  118. FspsUpd->FspsConfig.PchSubSystemId = V_PCH_DEFAULT_SID;
  119. FspsUpd->FspsConfig.PchPcieDeviceOverrideTablePtr = (UINT32) mPcieDeviceTable;
  120. InternalAddPlatformVerbTables (FspsUpd, PchHdaCodecPlatformOnboard, PcdGet8 (PcdAudioConnector));
  121. DEBUG_CODE_BEGIN();
  122. if ((PcdGet8 (PcdSerialIoUartDebugEnable) == 1) &&
  123. FspsUpd->FspsConfig.SerialIoDevMode[PchSerialIoIndexUart0 + PcdGet8 (PcdSerialIoUartNumber)] == PchSerialIoDisabled ) {
  124. FspsUpd->FspsConfig.SerialIoDevMode[PchSerialIoIndexUart0 + PcdGet8 (PcdSerialIoUartNumber)] = PchSerialIoLegacyUart;
  125. }
  126. DEBUG_CODE_END();
  127. return EFI_SUCCESS;
  128. }