/** @file
HDAUDIO policy
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _HDAUDIO_CONFIG_H_
#define _HDAUDIO_CONFIG_H_
#define HDAUDIO_CONFIG_REVISION 2
extern EFI_GUID gHdAudioConfigGuid;
#pragma pack (push,1)
///
/// The PCH_HDAUDIO_CONFIG block describes the expected configuration of the Intel HD Audio feature.
///
#define PCH_HDAUDIO_AUTO 2
#define HDAUDIO_VERB_TABLE_VIDDID(Vid,Did) (UINT32)((UINT16)Vid | ((UINT16)Did << 16))
#define HDAUDIO_VERB_TABLE_RID_SDI_SIZE(Rid,Sdi,VerbTableSize) (UINT32)((UINT8)Rid | ((UINT8)Sdi << 8) | ((UINT16)VerbTableSize << 16))
#define HDAUDIO_VERB_TABLE_CMD_SIZE(VerbTable) ((sizeof (VerbTable) - sizeof (PCH_HDA_VERB_TABLE_HEADER)) / (sizeof (UINT32)))
///
/// Use this macro to create HDAUDIO_VERB_TABLE and populate size automatically
///
#define HDAUDIO_VERB_TABLE_INIT(Vid,Did,Rid,Sdi,...) \
{ \
{ Vid, Did, Rid, Sdi, (sizeof((UINT32[]){__VA_ARGS__})/sizeof(UINT32)) }, \
{ __VA_ARGS__ } \
}
/**
Azalia verb table header
Every verb table should contain this defined header and followed by azalia verb commands.
**/
typedef struct {
UINT16 VendorId; ///< Codec Vendor ID
UINT16 DeviceId; ///< Codec Device ID
UINT8 RevisionId; ///< Revision ID of the codec. 0xFF matches any revision.
UINT8 SdiNum; ///< SDI number, 0xFF matches any SDI.
UINT16 DataDwords; ///< Number of data DWORDs following the header.
} PCH_HDA_VERB_TABLE_HEADER;
#ifdef _MSC_VER
//
// Disable "zero-sized array in struct/union" extension warning.
// Used for neater verb table definitions.
//
#pragma warning (push)
#pragma warning (disable: 4200)
#endif
typedef struct {
PCH_HDA_VERB_TABLE_HEADER Header;
UINT32 Data[];
} HDAUDIO_VERB_TABLE;
#ifdef _MSC_VER
#pragma warning (pop)
#endif
enum PCH_HDAUDIO_IO_BUFFER_OWNERSHIP {
PchHdaIoBufOwnerHdaLink = 0, ///< HD-Audio link owns all the I/O buffers.
PchHdaIoBufOwnerHdaLinkI2sPort = 1, ///< HD-Audio link owns 4 and I2S port owns 4 of the I/O buffers.
PchHdaIoBufOwnerI2sPort = 3 ///< I2S0 and I2S1 ports own all the I/O buffers.
};
enum PCH_HDAUDIO_IO_BUFFER_VOLTAGE {
PchHdaIoBuf33V = 0,
PchHdaIoBuf18V = 1
};
enum PCH_HDAUDIO_VC_TYPE {
PchHdaVc0 = 0,
PchHdaVc1 = 1
};
enum PCH_HDAUDIO_DMIC_TYPE {
PchHdaDmicDisabled = 0,
PchHdaDmic2chArray = 1,
PchHdaDmic4chArray = 2,
PchHdaDmic1chArray = 3
};
typedef enum {
PchHdaLinkFreq6MHz = 0,
PchHdaLinkFreq12MHz = 1,
PchHdaLinkFreq24MHz = 2,
PchHdaLinkFreq48MHz = 3,
PchHdaLinkFreq96MHz = 4,
PchHdaLinkFreqInvalid
} PCH_HDAUDIO_LINK_FREQUENCY;
typedef enum {
PchHdaIDispMode2T = 0,
PchHdaIDispMode1T = 1
} PCH_HDAUDIO_IDISP_TMODE;
/**
This structure contains the policies which are related to HD Audio device (cAVS).
Revision 1:
- Inital version.
Revision 2:
- Deprecate DspPpModuleMask: Pre/Post-processing modules (3rd Party IP) support moved to Platform Package.
**/
typedef struct {
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
/**
This member describes whether or not Intel HD Audio (Azalia) should be enabled.
If enabled (in Auto mode) and no codec exists the reference code will automatically disable
the HD Audio device.
0: Disable, 1: Enable, 2: Auto (enabled if codec detected and initialized, disabled otherwise)
**/
UINT32 Enable : 2;
UINT32 DspEnable : 1; ///< DSP enablement: 0: Disable; 1: Enable
UINT32 Pme : 1; ///< Azalia wake-on-ring, 0: Disable; 1: Enable
UINT32 IoBufferOwnership : 2; ///< I/O Buffer Ownership Select: 0: HD-A Link; 1: Shared, HD-A Link and I2S Port; 3: I2S Ports
UINT32 IoBufferVoltage : 1; ///< I/O Buffer Voltage Mode Select: 0: 3.3V; 1: 1.8V
UINT32 VcType : 1; ///< Virtual Channel Type Select: 0: VC0, 1: VC1
UINT32 HdAudioLinkFrequency : 4; ///< HDA-Link frequency (PCH_HDAUDIO_LINK_FREQUENCY enum): 2: 24MHz, 1: 12MHz, 0: 6MHz
UINT32 IDispLinkFrequency : 4; ///< iDisp-Link frequency (PCH_HDAUDIO_LINK_FREQUENCY enum): 4: 96MHz, 3: 48MHz
UINT32 IDispLinkTmode : 1; ///< iDisp-Link T-Mode (PCH_HDAUDIO_IDISP_TMODE enum): 0: 2T, 1: 1T
/**
Universal Audio Architecture compliance for DSP enabled system:
0: Not-UAA Compliant (Intel SST driver supported only),
1: UAA Compliant (HDA Inbox driver or SST driver supported)
**/
UINT32 DspUaaCompliance : 1;
UINT32 IDispCodecDisconnect : 1; ///< iDisplay Audio Codec disconnection, 0: Not disconnected, enumerable; 1: Disconnected SDI, not enumerable
UINT32 RsvdBits0 : 13; ///< Reserved bits 1
/**
Bitmask of supported DSP endpoint configuration exposed via NHLT ACPI table:
**/
UINT32 DspEndpointDmic : 2; ///< DMIC Select (PCH_HDAUDIO_DMIC_TYPE enum): 0: Disable; 1: 2ch array; 2: 4ch array; 3: 1ch array
UINT32 DspEndpointBluetooth : 1; ///< Bluetooth enablement: 0: Disable; 1: Enable
UINT32 DspEndpointI2s : 1; ///< I2S enablement: 0: Disable; 1: Enable
UINT32 RsvdBits1 : 28; ///< Reserved bits 2
/**
Bitmask of supported DSP features:
[BIT0] - WoV; [BIT1] - BT Sideband; [BIT2] - Codec VAD; [BIT5] - BT Intel HFP; [BIT6] - BT Intel A2DP
[BIT7] - DSP based speech pre-processing disabled; [BIT8] - 0: Intel WoV, 1: Windows Voice Activation
Default is zero.
**/
UINT32 DspFeatureMask;
/**
@deprecated from revision 2.
Bitmask of supported DSP Pre/Post-Processing Modules.
Specific pre/post-processing module bit position must be coherent with the ACPI implementation:
\_SB.PCI0.HDAS._DSM Function 3: Query Pre/Post Processing Module Support.
DspPpModuleMask is passed to ACPI as 'ADPM' NVS variable
Default is zero.
**/
UINT32 DspPpModuleMask;
UINT16 ResetWaitTimer; ///< (Test) The delay timer after Azalia reset, the value is number of microseconds. Default is 600.
UINT8 Rsvd0; ///< Reserved bytes, align to multiple 4
/**
Number of the verb table entry defined in VerbTablePtr.
Each entry points to a verb table which contains HDAUDIO_VERB_TABLE structure and verb command blocks.
**/
UINT8 VerbTableEntryNum;
/**
Pointer to a verb table array.
This pointer points to 32bits address, and is only eligible and consumed in post mem phase.
Each entry points to a verb table which contains HDAUDIO_VERB_TABLE structure and verb command blocks.
The prototype of this is:
HDAUDIO_VERB_TABLE **VerbTablePtr;
**/
UINT32 VerbTablePtr;
} PCH_HDAUDIO_CONFIG;
#pragma pack (pop)
#endif // _HDAUDIO_CONFIG_H_