1 /** @file
2   Header file for DxePchHdaNhltLib - NHLT structure definitions.
3 
4   Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 **/
7 
8 #ifndef _DXE_HDA_NHLT_H_
9 #define _DXE_HDA_NHLT_H_
10 
11 #include <IndustryStandard/Acpi.h>
12 
13 //
14 // ACPI support protocol instance signature definition.
15 //
16 #define NHLT_ACPI_TABLE_SIGNATURE  SIGNATURE_32 ('N', 'H', 'L', 'T')
17 
18 // MSFT defined structures
19 #define SPEAKER_FRONT_LEFT      0x1
20 #define SPEAKER_FRONT_RIGHT     0x2
21 #define SPEAKER_FRONT_CENTER    0x4
22 #define SPEAKER_BACK_LEFT       0x10
23 #define SPEAKER_BACK_RIGHT      0x20
24 
25 #define KSAUDIO_SPEAKER_MONO   (SPEAKER_FRONT_CENTER)
26 #define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
27 #define KSAUDIO_SPEAKER_QUAD   (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
28 
29 #define WAVE_FORMAT_EXTENSIBLE    0xFFFE /* Microsoft */
30 #define KSDATAFORMAT_SUBTYPE_PCM \
31         {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}
32 
33 #pragma pack (push, 1)
34 
35 typedef struct {
36   UINT16  wFormatTag;
37   UINT16  nChannels;
38   UINT32  nSamplesPerSec;
39   UINT32  nAvgBytesPerSec;
40   UINT16  nBlockAlign;
41   UINT16  wBitsPerSample;
42   UINT16  cbSize;
43 } WAVEFORMATEX;
44 
45 typedef struct {
46   WAVEFORMATEX Format;
47   union {
48     UINT16 wValidBitsPerSample;
49     UINT16 wSamplesPerBlock;
50     UINT16 wReserved;
51   } Samples;
52   UINT32       dwChannelMask;
53   GUID         SubFormat;
54 } WAVEFORMATEXTENSIBLE;
55 
56 //
57 // List of supported link type.
58 //
59 enum NHLT_LINK_TYPE
60 {
61   HdaNhltLinkHd   = 0,
62   HdaNhltLinkDsp  = 1,
63   HdaNhltLinkDmic = 2,
64   HdaNhltLinkSsp  = 3,
65   HdaNhltLinkInvalid
66 };
67 
68 //
69 // List of supported device type.
70 //
71 enum NHLT_SSP_DEVICE_TYPE
72 {
73   HdaNhltSspDeviceBt   = 0,
74   HdaNhltSspDeviceI2s  = 4,
75   HdaNhltSspDeviceInvalid
76 };
77 
78 enum NHLT_PDM_DEVICE_TYPE
79 {
80   HdaNhltPdmDeviceDmic = 0,
81   HdaNhltPdmDeviceInvalid
82 };
83 
84 typedef struct {
85   UINT32    CapabilitiesSize;
86   UINT8     Capabilities[1];
87 } SPECIFIC_CONFIG;
88 
89 typedef struct {
90   WAVEFORMATEXTENSIBLE Format;
91   SPECIFIC_CONFIG      FormatConfiguration;
92 } FORMAT_CONFIG;
93 
94 typedef struct {
95   UINT8           FormatsCount;
96   FORMAT_CONFIG   FormatsConfiguration[1];
97 } FORMATS_CONFIG;
98 
99 typedef struct {
100   UINT8           DeviceId[16];
101   UINT8           DeviceInstanceId;
102   UINT8           DevicePortId;
103 } DEVICE_INFO;
104 
105 typedef struct {
106   UINT8           DeviceInfoCount;
107   DEVICE_INFO     DeviceInformation[1];
108 } DEVICES_INFO;
109 
110 typedef struct {
111   UINT32          EndpointDescriptorLength;
112   UINT8           LinkType;
113   UINT8           InstanceId;
114   UINT16          HwVendorId;
115   UINT16          HwDeviceId;
116   UINT16          HwRevisionId;
117   UINT32          HwSubsystemId;
118   UINT8           DeviceType;
119   UINT8           Direction;
120   UINT8           VirtualBusId;
121   SPECIFIC_CONFIG EndpointConfig;
122   FORMATS_CONFIG  FormatsConfig;
123   DEVICES_INFO    DevicesInformation;
124 } ENDPOINT_DESCRIPTOR;
125 
126 //
127 // High Level Table structure
128 //
129 typedef struct {
130   EFI_ACPI_DESCRIPTION_HEADER Header; //{'N', 'H', 'L', 'T'}
131   UINT8                       EndpointCount;   // Actual number of endpoints
132   ENDPOINT_DESCRIPTOR         EndpointDescriptors[1];
133   SPECIFIC_CONFIG             OedConfiguration;
134 } NHLT_ACPI_TABLE;
135 
136 #pragma pack (pop)
137 
138 #endif // _DXE_PCH_HDA_NHLT_H_
139