alder_lake_bios/Insyde/InsydeSamplePkg/UseVerbTableCfg/Modify/SkylakeChipsetPkg/InstallPchHdaVerbTablePei/InstallPchHdaVerbTablePei.c

204 lines
7.0 KiB
C

/** @file
A PEIM for installing gPchHdaVerbTablePpiGuid PPI.
;******************************************************************************
;* Copyright (c) 2016, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h>
#include <Library/PeiOemSvcKernelLib.h>
#include <Library/DebugLib.h>
#include <Ppi/PchHdaVerbTable.h>
#include <Ppi/VerbTable.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PeiVerbTableCfgLib.h>
///
/// Azalia codec verb table prototope
///
typedef struct {
PCH_HDA_VERB_TABLE_HEADER Header; ///< Azalia codec verb table header.
UINT32 Data[1]; ///< Verb table data
} PCH_HDA_VERB_TABLE_PPI;
HDAUDIO_VERB_TABLE HdaVerbTableDisplayAudio = {
//
// VerbTable:
// Revision ID = 0xFF
// Codec Vendor: 0x80862809
//
{
0x8086, // Vendor ID
0x2809, // Device ID
0xFF, // Revision ID (any)
0xFF, // SDI number (any)
3 * 4 + 2 // Data size in DWORDs
},
{
//
// Display Audio Verb Table
//
// Enable the third converter and Pin first (NID 08h)
0x00878101,
// Pin Widget 5 - PORT B - Configuration Default: 0x18560010
0x00571C10,
0x00571D00,
0x00571E56,
0x00571F18,
// Pin Widget 6 - PORT C - Configuration Default: 0x18560020
0x00671C20,
0x00671D00,
0x00671E56,
0x00671F18,
// Pin Widget 7 - PORT D - Configuration Default: 0x18560030
0x00771C30,
0x00771D00,
0x00771E56,
0x00771F18,
// Disable the third converter and third Pin (NID 08h)
0x00878100
}
};
STATIC
EFI_STATUS
InternalInstallVerbTable (
IN HDAUDIO_VERB_TABLE *VerbTable
)
{
EFI_PEI_PPI_DESCRIPTOR *VerbTablePpiDesc;
EFI_STATUS Status;
VerbTablePpiDesc = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
ASSERT (VerbTablePpiDesc != NULL);
if (VerbTablePpiDesc == NULL) {
return EFI_OUT_OF_RESOURCES;
}
VerbTablePpiDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
VerbTablePpiDesc->Guid = &gPchHdaVerbTablePpiGuid;
VerbTablePpiDesc->Ppi = VerbTable;
DEBUG ((DEBUG_INFO,
"PCH HD-Audio installing verb table for vendor = 0x%04X devId = 0x%04X (size = %d DWords)\n",
VerbTable->Header.VendorId,
VerbTable->Header.DeviceId,
VerbTable->Header.DataDwords));
Status = PeiServicesInstallPpi (VerbTablePpiDesc);
ASSERT_EFI_ERROR (Status);
return Status;
}
/**
A function for transfering the VerbTable header from common code format to RC format.
@param [in] CommonVerbTableHeader The VerbTable header gotten by OemSvcGetVerbTable() is in coommon code format.
@param [out] PchHdaVerbTableHeader The VerbTable header in RC format.
@retval EFI_SUCCESS
**/
EFI_STATUS
TransferVerbTableHeader (
IN COMMON_CHIPSET_AZALIA_VERB_TABLE_HEADER **CommonVerbTableHeader,
OUT PCH_HDA_VERB_TABLE_HEADER *PchHdaVerbTableHeader
)
{
COMMON_CHIPSET_AZALIA_VERB_TABLE_HEADER *CommonTransferHeader;
UINT16 TotalJackNum;
CommonTransferHeader = (COMMON_CHIPSET_AZALIA_VERB_TABLE_HEADER*)*CommonVerbTableHeader;
TotalJackNum = CommonTransferHeader->NumberOfRearJacks + CommonTransferHeader->NumberOfFrontJacks;
(*PchHdaVerbTableHeader).VendorId = (UINT16)(CommonTransferHeader->VendorDeviceId >> 16);
(*PchHdaVerbTableHeader).DeviceId = (UINT16)(CommonTransferHeader->VendorDeviceId & 0xFFFF);
(*PchHdaVerbTableHeader).RevisionId = CommonTransferHeader->RevisionId;
(*PchHdaVerbTableHeader).SdiNo = 0xFF;
(*PchHdaVerbTableHeader).DataDwords = TotalJackNum * 4;
(*PchHdaVerbTableHeader).Reserved = 0;
return EFI_SUCCESS;
}
/**
A PEIM for installing gPchHdaVerbTablePpiGuid PPI.
@param FileHandle Handle of the file being invoked.
@param PeiServices Pointer to PEI Services table.
@retval EFI_SUCCESS
**/
EFI_STATUS
PeimInstallPchHdaVerbTableEntry (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
UINT8 Index;
UINT16 DataDwords;
UINT32 DataIndex;
COMMON_CHIPSET_AZALIA_VERB_TABLE *OemVerbTableHeaderDataAddress;
COMMON_CHIPSET_AZALIA_VERB_TABLE_HEADER *OemVerbTableHeader;
UINT32 *OemVerbTableDataBuffer;
PCH_HDA_VERB_TABLE_HEADER PchHdaVerbTableHeader;
PCH_HDA_VERB_TABLE_PPI *OemVerbTablePpi;
EFI_PEI_PPI_DESCRIPTOR *OemVerbTablePpiDesc;
OemVerbTableHeaderDataAddress = NULL;
InternalInstallVerbTable (&HdaVerbTableDisplayAudio);
Status = GetVerbTable (&OemVerbTableHeaderDataAddress);
if (Status == EFI_NOT_FOUND || OemVerbTableHeaderDataAddress == NULL) {
return Status;
}
for (Index = 0; OemVerbTableHeaderDataAddress[Index].VerbTableHeader != NULL; Index++) {
OemVerbTableHeader = NULL;
OemVerbTablePpi = NULL;
OemVerbTablePpiDesc = NULL;
DataDwords = (UINT16)(OemVerbTableHeaderDataAddress[Index].VerbTableHeader->NumberOfFrontJacks + \
OemVerbTableHeaderDataAddress[Index].VerbTableHeader->NumberOfRearJacks) * 4;
Status = PeiServicesAllocatePool ((sizeof (PCH_HDA_VERB_TABLE_HEADER) + (DataDwords * sizeof(UINT32))), (VOID **)&OemVerbTablePpi);
if (EFI_ERROR(Status)) {
FreePool(OemVerbTableHeaderDataAddress);
return Status;
}
Status = PeiServicesAllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR), (VOID **)&OemVerbTablePpiDesc);
if (EFI_ERROR(Status)) {
FreePool(OemVerbTableHeaderDataAddress);
return Status;
}
OemVerbTablePpiDesc->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
OemVerbTablePpiDesc->Guid = &gPchHdaVerbTablePpiGuid;
OemVerbTablePpiDesc->Ppi = OemVerbTablePpi;
OemVerbTableHeader = OemVerbTableHeaderDataAddress[Index].VerbTableHeader;
OemVerbTableDataBuffer = OemVerbTableHeaderDataAddress[Index].VerbTableData;
TransferVerbTableHeader (&OemVerbTableHeader, &PchHdaVerbTableHeader);
OemVerbTablePpi->Header = PchHdaVerbTableHeader;
for (DataIndex = 0; DataIndex < OemVerbTablePpi->Header.DataDwords; DataIndex++) {
OemVerbTablePpi->Data[DataIndex] = *((UINT32 *)OemVerbTableDataBuffer + DataIndex);
}
Status = PeiServicesInstallPpi(OemVerbTablePpiDesc);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_INFO, "\n\nInstall VerbTable PPI : %r \n", Status));
}
}
FreePool(OemVerbTableHeaderDataAddress);
return Status;
}