/** @file
PCH HD Audio Library implementation.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
/**
Returns pointer to Endpoint ENDPOINT_DESCRIPTOR structure.
@param[in] *NhltTable Endpoint for which Format address is retrieved
@param[in] FormatIndex Index of Format to be retrieved
@retval Pointer to ENDPOINT_DESCRIPTOR structure with given index
**/
ENDPOINT_DESCRIPTOR *
GetNhltEndpoint (
IN CONST NHLT_ACPI_TABLE *NhltTable,
IN CONST UINT8 EndpointIndex
)
{
UINT8 i;
ENDPOINT_DESCRIPTOR *Endpoint;
Endpoint = (ENDPOINT_DESCRIPTOR*) (NhltTable->EndpointDescriptors);
if (EndpointIndex > NhltTable->EndpointCount) {
return NULL;
}
for (i = 0; i < EndpointIndex; i++) {
Endpoint = (ENDPOINT_DESCRIPTOR*) ((UINT8*) (Endpoint) + Endpoint->EndpointDescriptorLength);
}
return Endpoint;
}
/**
Returns pointer to Endpoint Specific Configuration SPECIFIC_CONFIG structure.
@param[in] *Endpoint Endpoint for which config address is retrieved
@retval Pointer to SPECIFIC_CONFIG structure with endpoint's capabilities
**/
SPECIFIC_CONFIG *
GetNhltEndpointDeviceCapabilities (
IN CONST ENDPOINT_DESCRIPTOR *Endpoint
)
{
return (SPECIFIC_CONFIG*) (&Endpoint->EndpointConfig);
}
/**
Returns pointer to all Formats Configuration FORMATS_CONFIG structure.
@param[in] *Endpoint Endpoint for which Formats address is retrieved
@retval Pointer to FORMATS_CONFIG structure
**/
FORMATS_CONFIG *
GetNhltEndpointFormatsConfig (
IN CONST ENDPOINT_DESCRIPTOR *Endpoint
)
{
FORMATS_CONFIG *FormatsConfig;
FormatsConfig = (FORMATS_CONFIG*) ((UINT8*) (&Endpoint->EndpointConfig)
+ sizeof (Endpoint->EndpointConfig.CapabilitiesSize)
+ Endpoint->EndpointConfig.CapabilitiesSize);
return FormatsConfig;
}
/**
Returns pointer to Format Configuration FORMAT_CONFIG structure.
@param[in] *Endpoint Endpoint for which Format address is retrieved
@param[in] FormatIndex Index of Format to be retrieved
@retval Pointer to FORMAT_CONFIG structure with given index
**/
FORMAT_CONFIG *
GetNhltEndpointFormat (
IN CONST ENDPOINT_DESCRIPTOR *Endpoint,
IN CONST UINT8 FormatIndex
)
{
UINT8 i;
UINT32 Length;
FORMATS_CONFIG *FormatsConfig;
FORMAT_CONFIG *Format;
Length = 0;
FormatsConfig = GetNhltEndpointFormatsConfig (Endpoint);
Format = FormatsConfig->FormatsConfiguration;
if (FormatIndex > FormatsConfig->FormatsCount) {
return NULL;
}
for (i = 0; i < FormatIndex; i++) {
Length = sizeof (Format->Format) + Format->FormatConfiguration.CapabilitiesSize
+ sizeof (Format->FormatConfiguration.CapabilitiesSize);
Format = (FORMAT_CONFIG*) ((UINT8*) (Format) + Length);
}
return Format;
}
/**
Returns pointer to OED Configuration SPECIFIC_CONFIG structure.
@param[in] *NhltTable NHLT table for which OED address is retrieved
@retval Pointer to SPECIFIC_CONFIG structure with NHLT capabilities
**/
SPECIFIC_CONFIG *
GetNhltOedConfig (
IN CONST NHLT_ACPI_TABLE *NhltTable
)
{
ENDPOINT_DESCRIPTOR *Endpoint;
SPECIFIC_CONFIG *OedConfig;
Endpoint = GetNhltEndpoint (NhltTable, (NhltTable->EndpointCount));
OedConfig = (SPECIFIC_CONFIG*) ((UINT8*) (Endpoint));
return OedConfig;
}
/**
Prints Format configuration.
@param[in] *Format Format to be printed
@retval None
**/
VOID
NhltFormatDump (
IN CONST FORMAT_CONFIG *Format
)
{
UINT32 i;
DEBUG ((DEBUG_INFO, "------------------------------- FORMAT -------------------------------\n"));
DEBUG ((DEBUG_INFO, " Format->Format.Format.wFormatTag = 0x%x\n", Format->Format.Format.wFormatTag));
DEBUG ((DEBUG_INFO, " Format->Format.Format.nChannels = %d\n", Format->Format.Format.nChannels));
DEBUG ((DEBUG_INFO, " Format->Format.Format.nSamplesPerSec = %d\n", Format->Format.Format.nSamplesPerSec));
DEBUG ((DEBUG_INFO, " Format->Format.Format.nAvgBytesPerSec = %d\n", Format->Format.Format.nAvgBytesPerSec));
DEBUG ((DEBUG_INFO, " Format->Format.Format.nBlockAlign = %d\n", Format->Format.Format.nBlockAlign));
DEBUG ((DEBUG_INFO, " Format->Format.Format.wBitsPerSample = %d\n", Format->Format.Format.wBitsPerSample));
DEBUG ((DEBUG_INFO, " Format->Format.Format.cbSize = %d\n", Format->Format.Format.cbSize));
DEBUG ((DEBUG_INFO, " Format->Format.Samples = %d\n", Format->Format.Samples));
DEBUG ((DEBUG_INFO, " Format->Format.dwChannelMask = 0x%x\n", Format->Format.dwChannelMask));
DEBUG ((DEBUG_INFO, " Format->Format.SubFormat = %g\n", Format->Format.SubFormat));
DEBUG ((DEBUG_INFO, " Format->FormatConfiguration.CapabilitiesSize = %d B\n", Format->FormatConfiguration.CapabilitiesSize));
DEBUG ((DEBUG_VERBOSE, " Format->FormatConfiguration.Capabilities:"));
for (i = 0; i < ( Format->FormatConfiguration.CapabilitiesSize ) ; i++) {
if (i % 16 == 0) {
DEBUG ((DEBUG_VERBOSE, "\n"));
}
DEBUG ((DEBUG_VERBOSE, "0x%02x, ", Format->FormatConfiguration.Capabilities[i]));
}
DEBUG ((DEBUG_VERBOSE, "\n"));
}
/**
Prints Endpoint configuration.
@param[in] *Endpoint Endpoint to be printed
@retval None
**/
VOID
NhltEndpointDump (
IN CONST ENDPOINT_DESCRIPTOR *Endpoint
)
{
UINT8 i;
FORMATS_CONFIG *FormatsConfigs;
FORMAT_CONFIG *Format;
DEBUG ((DEBUG_INFO, "------------------------------ ENDPOINT ------------------------------\n"));
DEBUG ((DEBUG_INFO, " Endpoint->DeviceDescriptorLength = %d B\n", Endpoint->EndpointDescriptorLength));
DEBUG ((DEBUG_INFO, " Endpoint->LinkType = 0x%x\n", Endpoint->LinkType));
DEBUG ((DEBUG_INFO, " Endpoint->InstanceId = 0x%x\n", Endpoint->InstanceId));
DEBUG ((DEBUG_INFO, " Endpoint->HwVendorId = 0x%x\n", Endpoint->HwVendorId));
DEBUG ((DEBUG_INFO, " Endpoint->HwDeviceId = 0x%x\n", Endpoint->HwDeviceId));
DEBUG ((DEBUG_INFO, " Endpoint->HwRevisionId = 0x%x\n", Endpoint->HwRevisionId));
DEBUG ((DEBUG_INFO, " Endpoint->HwSubsystemId = 0x%x\n", Endpoint->HwSubsystemId));
DEBUG ((DEBUG_INFO, " Endpoint->DeviceType = 0x%x\n", Endpoint->DeviceType));
DEBUG ((DEBUG_INFO, " Endpoint->Direction = 0x%x\n", Endpoint->Direction));
DEBUG ((DEBUG_INFO, " Endpoint->VirtualBusId = 0x%x\n", Endpoint->VirtualBusId));
DEBUG ((DEBUG_INFO, " Endpoint->EndpointConfig.CapabilitiesSize = %d B\n", Endpoint->EndpointConfig.CapabilitiesSize));
DEBUG ((DEBUG_VERBOSE, " Endpoint->EndpointConfig.Capabilities:"));
for (i = 0; i < (Endpoint->EndpointConfig.CapabilitiesSize ) ; i++) {
if (i % 16 == 0) DEBUG ((DEBUG_VERBOSE, "\n"));
DEBUG ((DEBUG_VERBOSE, "0x%02x, ", Endpoint->EndpointConfig.Capabilities[i]));
}
FormatsConfigs = GetNhltEndpointFormatsConfig (Endpoint);
DEBUG ((DEBUG_INFO, "\n"));
DEBUG ((DEBUG_INFO, " Endpoint->FormatsConfig.FormatsCount = %d\n", FormatsConfigs->FormatsCount));
for (i = 0; i < FormatsConfigs->FormatsCount; i++) {
Format = GetNhltEndpointFormat (Endpoint, i);
if (Format != NULL) {
NhltFormatDump (Format);
}
}
DEBUG ((DEBUG_VERBOSE, "\n"));
}
/**
Prints OED (Offload Engine Driver) configuration.
@param[in] *OedConfig OED to be printed
@retval None
**/
VOID
NhltOedConfigDump (
IN CONST SPECIFIC_CONFIG *OedConfig
)
{
UINT8 i;
DEBUG ((DEBUG_INFO, "-------------------------- OED CONFIGURATION -------------------------\n"));
DEBUG ((DEBUG_INFO, " OedConfig->CapabilitiesSize = %d B\n", OedConfig->CapabilitiesSize));
DEBUG ((DEBUG_VERBOSE, " OedConfig->Capabilities:"));
for (i = 0; i < (OedConfig->CapabilitiesSize) ; i++) {
if (i % 16 == 0) DEBUG ((DEBUG_VERBOSE, "\n"));
DEBUG ((DEBUG_VERBOSE, "0x%02x, ", OedConfig->Capabilities[i]));
}
DEBUG ((DEBUG_VERBOSE, "\n"));
}
/**
Prints NHLT (Non HDA-Link Table) to be exposed via ACPI (aka. OED (Offload Engine Driver) Configuration Table).
@param[in] *NhltTable The NHLT table to print
@retval None
**/
VOID
NhltAcpiTableDump (
IN NHLT_ACPI_TABLE *NhltTable
)
{
DEBUG_CODE_BEGIN ();
UINT8 i;
DEBUG ((DEBUG_INFO, "\n"));
DEBUG ((DEBUG_INFO, "--- NHLT ACPI Table Dump [OED (Offload Engine Driver) Configuration] ---\n"));
DEBUG ((DEBUG_INFO, "sizeof NHLT_ACPI_TABLE = %d B\n", sizeof (NHLT_ACPI_TABLE)));
DEBUG ((DEBUG_INFO, "sizeof EFI_ACPI_DESCRIPTION_HEADER = %d B\n", sizeof (EFI_ACPI_DESCRIPTION_HEADER)));
DEBUG ((DEBUG_INFO, "sizeof ENDPOINT_DESCRIPTOR = %d B\n", sizeof (ENDPOINT_DESCRIPTOR)));
DEBUG ((DEBUG_INFO, "sizeof SPECIFIC_CONFIG = %d B\n", sizeof (SPECIFIC_CONFIG)));
DEBUG ((DEBUG_INFO, "sizeof FORMATS_CONFIG = %d B\n", sizeof (FORMATS_CONFIG)));
DEBUG ((DEBUG_INFO, "sizeof FORMAT_CONFIG = %d B\n", sizeof (FORMAT_CONFIG)));
DEBUG ((DEBUG_INFO, "sizeof WAVEFORMATEXTENSIBLE = %d B\n", sizeof (WAVEFORMATEXTENSIBLE)));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.Signature = 0x%08x\n", NhltTable->Header.Signature));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.Length = 0x%08x\n", NhltTable->Header.Length));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.Revision = 0x%02x\n", NhltTable->Header.Revision));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.Checksum = 0x%02x\n", NhltTable->Header.Checksum));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.OemId = %a\n", NhltTable->Header.OemId));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.OemTableId = 0x%lx\n", NhltTable->Header.OemTableId));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.OemRevision = 0x%08x\n", NhltTable->Header.OemRevision));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.CreatorId = 0x%08x\n", NhltTable->Header.CreatorId));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE Header.CreatorRevision = 0x%08x\n", NhltTable->Header.CreatorRevision));
DEBUG ((DEBUG_INFO, "\n"));
DEBUG ((DEBUG_INFO, " NHLT_ACPI_TABLE EndpointCount = %d\n", NhltTable->EndpointCount));
for (i = 0; i < NhltTable->EndpointCount; i++) {
NhltEndpointDump (GetNhltEndpoint (NhltTable, i));
}
NhltOedConfigDump (GetNhltOedConfig (NhltTable));
DEBUG ((DEBUG_INFO, "----------------------------------------------------------------------\n"));
DEBUG_CODE_END ();
}
/**
Constructs FORMATS_CONFIGS structure based on given formats list.
@param[in][out] *Endpoint Endpoint for which format structures are created
@param[in] FormatBitmask Bitmask of formats supported for given endpoint
@retval Size of created FORMATS_CONFIGS structure
**/
UINT32
NhltFormatsConstructor (
IN OUT ENDPOINT_DESCRIPTOR *Endpoint,
IN CONST UINT32 FormatsBitmask
)
{
FORMATS_CONFIG *FormatsConfig;
FORMAT_CONFIG *Format;
UINT8 FormatIndex;
UINT32 FormatsConfigLength;
DEBUG ((DEBUG_INFO, "NhltFormatsConstructor() Start, FormatsBitmask = 0x%08x\n", FormatsBitmask));
FormatsConfig = NULL;
FormatIndex = 0;
FormatsConfigLength = 0;
if (!FormatsBitmask) {
DEBUG ((DEBUG_WARN, "No supported format found!\n"));
return 0;
}
FormatsConfig = GetNhltEndpointFormatsConfig (Endpoint);
FormatsConfig->FormatsCount = 0;
if (FormatsBitmask & B_HDA_DMIC_2CH_48KHZ_16BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_DMIC_2CH_48KHZ_16BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz16bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = DmicStereo16BitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, DmicStereo16BitFormatConfig, DmicStereo16BitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_DMIC_2CH_48KHZ_32BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_DMIC_2CH_48KHZ_32BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz32bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = DmicStereo32BitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, DmicStereo32BitFormatConfig, DmicStereo32BitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_DMIC_4CH_48KHZ_16BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_DMIC_4CH_48KHZ_16BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch4_48kHz16bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = DmicQuad16BitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, DmicQuad16BitFormatConfig, DmicQuad16BitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_DMIC_4CH_48KHZ_32BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_DMIC_4CH_48KHZ_32BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch4_48kHz32bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = DmicQuad32BitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, DmicQuad32BitFormatConfig, DmicQuad32BitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_DMIC_1CH_48KHZ_16BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_DMIC_1CH_48KHZ_16BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch1_48kHz16bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = DmicMono16BitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, DmicMono16BitFormatConfig, DmicMono16BitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_BT_NARROWBAND_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_BT_NARROWBAND_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &NarrowbandFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = BtFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, BtFormatConfig, BtFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_BT_WIDEBAND_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_BT_WIDEBAND_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &WidebandFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = BtFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, BtFormatConfig, BtFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_BT_A2DP_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_BT_A2DP_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &A2dpFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = BtFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, BtFormatConfig, BtFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_RTK298_RENDER_4CH_48KHZ_24BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_RTK298_RENDER_4CH_48KHZ_24BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz24bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sRtk298Render4ch48kHz24bitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sRtk298Render4ch48kHz24bitFormatConfig, I2sRtk298Render4ch48kHz24bitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_RTK298_CAPTURE_4CH_48KHZ_24BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_RTK298_CAPTURE_4CH_48KHZ_24BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz24bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sRtk298Capture4ch48kHz24bitFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sRtk298Capture4ch48kHz24bitFormatConfig, I2sRtk298Capture4ch48kHz24bitFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_RTK286S_2CH_48KHZ_24BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_RTK286S_2CH_48KHZ_24BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz24bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sRtk286S2ch48kHzFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sRtk286S2ch48kHzFormatConfig, I2sRtk286S2ch48kHzFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_ADI_4CH_48KHZ_32BIT_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_ADI_4CH_48KHZ_32BIT_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch4_48kHz32bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sAdi4ch48kHzFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sAdi4ch48kHzFormatConfig, I2sAdi4ch48kHzFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_48KHZ_24BIT_MASTER_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_48KHZ_24BIT_MASTER_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz24bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2s48kHz24bitMasterFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2s48kHz24bitMasterFormatConfig, I2s48kHz24bitMasterFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_48KHZ_24BIT_SLAVE_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_48KHZ_24BIT_SLAVE_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &Ch2_48kHz24bitFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2s48kHz24bitSlaveFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2s48kHz24bitSlaveFormatConfig, I2s48kHz24bitSlaveFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_PCM_8KHZ_16BIT_MASTER_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_PCM_8KHZ_16BIT_MASTER_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &NarrowbandFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sPcm8kHz16bitMasterFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sPcm8kHz16bitMasterFormatConfig, I2sPcm8kHz16bitMasterFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
if (FormatsBitmask & B_HDA_I2S_PCM_8KHZ_16BIT_SLAVE_FORMAT) {
DEBUG ((DEBUG_INFO, "Format: B_HDA_I2S_PCM_8KHZ_16BIT_SLAVE_FORMAT\n"));
Format = GetNhltEndpointFormat (Endpoint, FormatIndex++);
if (Format != NULL) {
CopyMem (&(Format->Format), &NarrowbandFormat, sizeof (WAVEFORMATEXTENSIBLE));
Format->FormatConfiguration.CapabilitiesSize = I2sPcm8kHz16bitSlaveFormatConfigSize;
CopyMem (Format->FormatConfiguration.Capabilities, I2sPcm8kHz16bitSlaveFormatConfig, I2sPcm8kHz16bitSlaveFormatConfigSize);
FormatsConfigLength += sizeof (*Format)
- sizeof (Format->FormatConfiguration.Capabilities)
+ Format->FormatConfiguration.CapabilitiesSize;
FormatsConfig->FormatsCount++;
}
}
DEBUG ((DEBUG_INFO, "NhltFormatsConstructor() End, FormatsCount = %d, FormatsConfigLength = %d B\n", FormatsConfig->FormatsCount, FormatsConfigLength));
return FormatsConfigLength;
}
/**
Constructs NHLT_ENDPOINT structure based on given endpoint type.
@param[in][out] *NhltTable NHLT table for which endpoint is created
@param[in] EndpointType Type of endpoint to be created
@param[in] EndpointFormatsBitmask Bitmask of formats supported by endpoint
@param[in] EndpointIndex Endpoint index in NHLT table
@retval Size of created NHLT_ENDPOINT structure
**/
UINT32
NhltEndpointConstructor (
IN OUT NHLT_ACPI_TABLE *NhltTable,
IN NHLT_ENDPOINT EndpointType,
IN UINT32 EndpointFormatsBitmask,
IN UINT8 EndpointIndex
)
{
ENDPOINT_DESCRIPTOR *Endpoint;
SPECIFIC_CONFIG *EndpointConfig;
CONST UINT8 *EndpointConfigBuffer;
UINT32 EndpointConfigBufferSize;
UINT32 EndpointDescriptorLength;
DEBUG ((DEBUG_INFO, "NhltEndpointConstructor() Start, EndpointIndex = %d\n", EndpointIndex));
EndpointDescriptorLength = 0;
Endpoint = GetNhltEndpoint (NhltTable, EndpointIndex);
if (Endpoint == NULL) {
return 0;
}
EndpointDescriptorLength = sizeof (ENDPOINT_DESCRIPTOR)
- sizeof (SPECIFIC_CONFIG)
- sizeof (FORMAT_CONFIG);
switch (EndpointType) {
case HdaDmicX1:
DEBUG ((DEBUG_INFO, "Endpoint: HdaDmicX1\n"));
CopyMem (Endpoint, &HdaEndpointDmicX1, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = DmicX1Config;
EndpointConfigBufferSize = DmicX1ConfigSize;
break;
case HdaDmicX2:
DEBUG ((DEBUG_INFO, "Endpoint: HdaDmicX2\n"));
CopyMem (Endpoint, &HdaEndpointDmicX2, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = DmicX2Config;
EndpointConfigBufferSize = DmicX2ConfigSize;
break;
case HdaDmicX4:
DEBUG ((DEBUG_INFO, "Endpoint: HdaDmicX4\n"));
CopyMem (Endpoint, &HdaEndpointDmicX4, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = DmicX4Config;
EndpointConfigBufferSize = DmicX4ConfigSize;
break;
case HdaBtRender:
DEBUG ((DEBUG_INFO, "Endpoint: HdaBtRender\n"));
CopyMem (Endpoint, &HdaEndpointBtRender, sizeof (ENDPOINT_DESCRIPTOR));
if (GetPchSeries () == PchH) {
Endpoint->VirtualBusId = 0;
}
EndpointConfigBuffer = BtConfig;
EndpointConfigBufferSize = BtConfigSize;
break;
case HdaBtCapture:
DEBUG ((DEBUG_INFO, "Endpoint: HdaBtCapture\n"));
CopyMem (Endpoint, &HdaEndpointBtCapture, sizeof (ENDPOINT_DESCRIPTOR));
if (GetPchSeries () == PchH) {
Endpoint->VirtualBusId = 0;
}
EndpointConfigBuffer = BtConfig;
EndpointConfigBufferSize = BtConfigSize;
break;
case HdaI2sRender1:
DEBUG ((DEBUG_INFO, "Endpoint: HdaI2sRender1\n"));
CopyMem (Endpoint, &HdaEndpointI2sRender, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = I2sRender1Config;
EndpointConfigBufferSize = I2sRender1ConfigSize;
break;
case HdaI2sRender2:
DEBUG ((DEBUG_INFO, "Endpoint: HdaI2sRender2\n"));
CopyMem (Endpoint, &HdaEndpointI2sRender, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = I2sRender2Config;
EndpointConfigBufferSize = I2sRender2ConfigSize;
break;
case HdaI2sCapture:
DEBUG ((DEBUG_INFO, "Endpoint: HdaI2sCapture\n"));
CopyMem (Endpoint, &HdaEndpointI2sCapture, sizeof (ENDPOINT_DESCRIPTOR));
EndpointConfigBuffer = I2sCaptureConfig;
EndpointConfigBufferSize = I2sCaptureConfigSize;
break;
default:
DEBUG ((DEBUG_WARN, "Unknown endpoint!\n"));
return 0;
}
EndpointConfig = GetNhltEndpointDeviceCapabilities (Endpoint);
EndpointConfig->CapabilitiesSize = EndpointConfigBufferSize;
CopyMem (EndpointConfig->Capabilities, EndpointConfigBuffer, EndpointConfig->CapabilitiesSize);
EndpointDescriptorLength += sizeof (*EndpointConfig)
- sizeof (EndpointConfig->Capabilities)
+ EndpointConfig->CapabilitiesSize;
EndpointDescriptorLength += NhltFormatsConstructor (Endpoint, EndpointFormatsBitmask);
Endpoint->EndpointDescriptorLength = EndpointDescriptorLength;
DEBUG ((DEBUG_INFO, "NhltEndpointConstructor() End, EndpointDescriptorLength = %d B\n", Endpoint->EndpointDescriptorLength));
return Endpoint->EndpointDescriptorLength;
}
/**
Constructs SPECIFIC_CONFIG structure for OED configuration.
@param[in][out] *NhltTable NHLT table for which OED config is created
@retval Size of created SPECIFIC_CONFIG structure
**/
UINT32
NhltOedConfigConstructor (
IN OUT NHLT_ACPI_TABLE *NhltTable
)
{
SPECIFIC_CONFIG *OedConfig;
UINT32 OedConfigLength;
OedConfigLength = 0;
OedConfig = GetNhltOedConfig (NhltTable);
OedConfig->CapabilitiesSize = NhltConfigurationSize;
CopyMem (OedConfig->Capabilities, (UINT8*) NhltConfiguration, NhltConfigurationSize);
OedConfigLength = sizeof (*OedConfig)
- sizeof (OedConfig->Capabilities)
+ OedConfig->CapabilitiesSize;
return OedConfigLength;
}
/**
Constructs NHLT_ACPI_TABLE structure based on given Endpoints list.
@param[in] *EndpointTable List of endpoints for NHLT
@param[in][out] **NhltTable NHLT table to be created
@param[in][out] *NhltTableSize Size of created NHLT table
@retval EFI_SUCCESS NHLT created successfully
@retval EFI_BAD_BUFFER_SIZE Not enough resources to allocate NHLT
**/
EFI_STATUS
NhltConstructor (
IN PCH_HDA_NHLT_ENDPOINTS *EndpointTable,
IN OUT NHLT_ACPI_TABLE **NhltTable,
IN OUT UINT32 *NhltTableSize
)
{
EFI_STATUS Status;
UINT8 Index;
UINT32 TableSize;
UINT32 EndpointDescriptorsLength;
UINT32 OedConfigLength;
NHLT_ACPI_TABLE *Table;
Status = EFI_SUCCESS;
TableSize = PCH_HDA_NHLT_TABLE_SIZE;
EndpointDescriptorsLength = 0;
OedConfigLength = 0;
Table = AllocateZeroPool (TableSize);
if (Table == NULL) {
return EFI_BAD_BUFFER_SIZE;
}
Table->EndpointCount = 0;
for (Index = 0; Index < HdaEndpointMax; Index++) {
if (EndpointTable[Index].Enable == TRUE) {
EndpointDescriptorsLength += NhltEndpointConstructor (Table,
EndpointTable[Index].EndpointType,
EndpointTable[Index].EndpointFormatsBitmask,
Table->EndpointCount++);
}
}
DEBUG ((DEBUG_INFO, "NhltConstructor: EndpointCount = %d, All EndpointDescriptorsLength = %d B\n", Table->EndpointCount, EndpointDescriptorsLength));
OedConfigLength = NhltOedConfigConstructor (Table);
DEBUG ((DEBUG_INFO, "NhltConstructor: OedConfigLength = %d B\n", OedConfigLength));
TableSize = EndpointDescriptorsLength + OedConfigLength;
*NhltTableSize = TableSize;
*NhltTable = Table;
return Status;
}
/**
Constructs EFI_ACPI_DESCRIPTION_HEADER structure for NHLT table.
@param[in][out] *NhltTable NHLT table for which header will be created
@param[in] NhltTableSize Size of NHLT table
@retval None
**/
VOID
NhltAcpiHeaderConstructor (
IN OUT NHLT_ACPI_TABLE *NhltTable,
IN UINT32 NhltTableSize
)
{
DEBUG ((DEBUG_INFO, "NhltAcpiHeaderConstructor() Start\n"));
// Header
NhltTable->Header.Signature = NHLT_ACPI_TABLE_SIGNATURE;
NhltTable->Header.Length = (UINT32) (NhltTableSize + sizeof (NHLT_ACPI_TABLE) - sizeof (ENDPOINT_DESCRIPTOR) - sizeof (SPECIFIC_CONFIG));
NhltTable->Header.Revision = 0x0;
NhltTable->Header.Checksum = 0x0;
CopyMem (NhltTable->Header.OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (NhltTable->Header.OemId));
NhltTable->Header.OemTableId = PcdGet64 (PcdAcpiDefaultOemTableId);
NhltTable->Header.OemRevision = PcdGet32 (PcdAcpiDefaultOemRevision);
NhltTable->Header.CreatorId = PcdGet32 (PcdAcpiDefaultCreatorId);
NhltTable->Header.CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision);
DEBUG ((DEBUG_INFO, "NhltAcpiHeaderConstructor(), NhltAcpiTable->Header.Length = %d B\n", NhltTable->Header.Length));
}