/** @file This file is SampleCode of the library for Intel HD Audio Verb Table configuration. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include extern HDAUDIO_VERB_TABLE HdaVerbTableDisplayAudio; extern HDAUDIO_VERB_TABLE HdaVerbTableAlc274; extern HDAUDIO_VERB_TABLE HdaVerbTableAlc700; extern HDAUDIO_VERB_TABLE HdaVerbTableAlc701; extern HDAUDIO_VERB_TABLE WhlHdaVerbTableAlc700; /** Add verb table helper function. This function calculates verbtable number and shows verb table information. @param[in,out] VerbTableEntryNum Input current VerbTable number and output the number after adding new table @param[in,out] VerbTableArray Pointer to array of VerbTable @param[in] VerbTable VerbTable which is going to add into array **/ STATIC VOID InternalAddVerbTable ( IN OUT UINT8 *VerbTableEntryNum, IN OUT UINT32 *VerbTableArray, IN HDAUDIO_VERB_TABLE *VerbTable ) { if (VerbTable == NULL) { DEBUG ((DEBUG_INFO, "InternalAddVerbTable wrong input: VerbTable == NULL\n")); return; } VerbTableArray[*VerbTableEntryNum] = (UINT32) VerbTable; *VerbTableEntryNum += 1; DEBUG ((DEBUG_INFO, "HDA: Add verb table for vendor = 0x%04X devId = 0x%04X (size = %d DWords)\n", VerbTable->Header.VendorId, VerbTable->Header.DeviceId, VerbTable->Header.DataDwords) ); } /** Add verb table function. This function update the verb table number and verb table ptr of policy. @param[in] HdAudioConfig HD Audio config block @param[out] VerbTableEntryNum Number of verb table entries @param[out] HdaVerbTablePtr Pointer to the verb table **/ VOID AddPlatformVerbTables ( IN UINT8 CodecType, OUT UINT8 *VerbTableEntryNum, OUT UINT32 *HdaVerbTablePtr ) { UINT8 VerbTableEntries; UINT32 VerbTableArray[6]; UINT32 *VerbTablePtr; VerbTableEntries = 0; InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdDisplayAudioHdaVerbTable)); if (CodecType == PchHdaCodecPlatformOnboard) { DEBUG ((DEBUG_INFO, "HDA Policy: Onboard codec selected\n")); InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable)); InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdHdaVerbTable2)); } else { DEBUG ((DEBUG_INFO, "HDA Policy: External codec kit selected\n")); InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable1)); InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable2)); InternalAddVerbTable (&VerbTableEntries, VerbTableArray, (VOID *) (UINTN) PcdGet32 (PcdCommonHdaVerbTable3)); } *VerbTableEntryNum = VerbTableEntries; VerbTablePtr = (UINT32 *) AllocateZeroPool (sizeof (UINT32) * VerbTableEntries); CopyMem (VerbTablePtr, VerbTableArray, sizeof (UINT32) * VerbTableEntries); *HdaVerbTablePtr = (UINT32) VerbTablePtr; } /** HDA VerbTable init function for PEI post memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS HdaVerbTableInit ( IN UINT16 BoardId ) { HDAUDIO_VERB_TABLE *VerbTable; HDAUDIO_VERB_TABLE *VerbTable2; VerbTable = NULL; VerbTable2 = NULL; switch (BoardId) { case BoardIdCometLakeULpddr3Rvp: VerbTable = &WhlHdaVerbTableAlc700; break; default: DEBUG ((DEBUG_INFO, "HDA: Init default verb tables (Realtek ALC700 and ALC701)\n")); VerbTable = &HdaVerbTableAlc700; VerbTable2 = &HdaVerbTableAlc701; break; } PcdSet32S (PcdHdaVerbTable, (UINT32) VerbTable); PcdSet32S (PcdHdaVerbTable2, (UINT32) VerbTable2); PcdSet32S (PcdDisplayAudioHdaVerbTable, (UINT32) &HdaVerbTableDisplayAudio); // Codecs - Realtek ALC700, ALC701, ALC274 (external - connected via HDA header) PcdSet32S (PcdCommonHdaVerbTable1, (UINT32) &HdaVerbTableAlc700); PcdSet32S (PcdCommonHdaVerbTable2, (UINT32) &HdaVerbTableAlc701); PcdSet32S (PcdCommonHdaVerbTable3, (UINT32) &HdaVerbTableAlc274); return EFI_SUCCESS; }