Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch/i386/libsaio/hda.c

1/*
2 *HDA injector / Audio Enabler
3 *
4 *Copyright (C) 2012Chameleon Team
5 *Edit by Fabio (ErmaC)
6 *HDA bus scans and codecs enumeration by Zenith432
7 *
8 *HDA injector is free software: you can redistribute it and/or modify
9 *it under the terms of the GNU General Public License as published by
10 *the Free Software Foundation, either version 3 of the License, or
11 *(at your option) any later version.
12 *
13 *HDA injector is distributed in the hope that it will be useful,
14 *but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 *GNU General Public License for more details.
17 *
18 *Alternatively you can choose to comply with APSL
19 *
20 *Permission is hereby granted, free of charge, to any person obtaining a
21 *copy of this software and associated documentation files (the "Software"),
22 *to deal in the Software without restriction, including without limitation
23 *the rights to use, copy, modify, merge, publish, distribute, sublicense,
24 *and/or sell copies of the Software, and to permit persons to whom the
25 *Software is furnished to do so, subject to the following conditions:
26 *
27 *The above copyright notice and this permission notice shall be included in
28 *all copies or substantial portions of the Software.
29 *
30 ******************************************************************************
31 * http://www.leidinger.net/FreeBSD/dox/dev_sound/html/df/d54/hdac_8c_source.html
32 *
33 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
34 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
35 * Copyright (c) 2008-2012 Alexander Motin <mav@FreeBSD.org>
36 * All rights reserved.
37 *
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
40 * are met:
41 * 1. Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright
44 * notice, this list of conditions and the following disclaimer in the
45 * documentation and/or other materials provided with the distribution.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * SUCH DAMAGE.
58 *
59 * Intel High Definition Audio (Controller) driver for FreeBSD.
60 *
61 ******************************************************************************/
62
63#include "config.h"
64#include "boot.h"
65#include "bootstruct.h"
66#include "cpu.h"
67#include "pci.h"
68#include "pci_root.h"
69#include "platform.h"
70#include "device_inject.h"
71#include "convert.h"
72#include "hda.h"
73
74#define STRINGIFY(x) #x
75#define TOSTRING(x) STRINGIFY(x)
76
77#define HEADER __FILE__ " [" TOSTRING(__LINE__) "]: "
78
79#if DEBUG_HDA
80#define DBG(x...) verbose(x)
81#else
82#define DBG(x...)
83#endif
84
85#if DEBUG_CODEC
86#define CDBG(x...) verbose(x)
87#else
88#define CDBG(x...)
89#endif
90
91#define UNKNOWN "Unknown "
92
93#define hdacc_lock(codec) snd_mtxlock((codec)->lock)
94#define hdacc_unlock(codec) snd_mtxunlock((codec)->lock)
95#define hdacc_lockassert(codec) snd_mtxassert((codec)->lock)
96#define hdacc_lockowned(codec) mtx_owned((codec)->lock)
97
98const char *hda_slot_name[]={ "AAPL,slot-name", "Built In" };
99
100uint8_t default_HDEF_layout_id[]={0x01, 0x00, 0x00, 0x00};
101#define HDEF_LEN ( sizeof(default_HDEF_layout_id) / sizeof(uint8_t) )
102uint8_t default_HDAU_layout_id[]={0x01, 0x00, 0x00, 0x00};
103#define HDAU_LEN ( sizeof(default_HDAU_layout_id) / sizeof(uint8_t) )
104static uint8_t connector_type_value[] ={0x00, 0x08, 0x00, 0x00};
105
106/* Structures */
107
108static hda_controller_devices know_hda_controller[] = {
109//8086 Intel Corporation
110{ HDA_INTEL_OAK,"Oaktrail"/*, 0, 0 */ },
111{ HDA_INTEL_BAY,"BayTrail"/*, 0, 0 */ },
112{ HDA_INTEL_HSW1,"Haswell"/*, 0, 0 */ },
113{ HDA_INTEL_SER8HDMI,"Haswell"/*, 0, 0 */ },
114{ HDA_INTEL_HSW3,"Haswell"/*, 0, 0 */ },
115{ HDA_INTEL_BDW,"Broadwell"/*, 0, 0 */ },
116{ HDA_INTEL_BROXTON_T,"Broxton-T"/*, 0, 0 */ },
117{ HDA_INTEL_CPT,"Cougar Point"/*, 0, 0 */ },
118{ HDA_INTEL_PATSBURG,"Patsburg"/*, 0, 0 */ },
119{ HDA_INTEL_PPT1,"Panther Point"/*, 0, 0 */ },
120{ HDA_INTEL_BRASWELL,"Braswell"/*, 0, 0 */ },
121{ HDA_INTEL_82801F,"82801F"/*, 0, 0 */ },
122{ HDA_INTEL_63XXESB,"631x/632xESB"/*, 0, 0 */ },
123{ HDA_INTEL_82801G,"82801G"/*, 0, 0 */ },
124{ HDA_INTEL_82801H,"82801H"/*, 0, 0 */ },
125{ HDA_INTEL_82801I,"82801I"/*, 0, 0 */ },
126{ HDA_INTEL_ICH9,"ICH9"/*, 0, 0 */ },
127{ HDA_INTEL_82801JI,"82801JI"/*, 0, 0 */ },
128{ HDA_INTEL_82801JD,"82801JD"/*, 0, 0 */ },
129{ HDA_INTEL_PCH,"5 Series/3400 Series"/*, 0, 0 */ },
130{ HDA_INTEL_PCH2,"5 Series/3400 Series"/*, 0, 0 */ },
131{ HDA_INTEL_BROXTON_P,"Apollolake"/*, 0, 0 */ }, // Broxton-P
132{ HDA_INTEL_SCH,"SCH"/*, 0, 0 */ },
133{ HDA_INTEL_LPT1,"Lynx Point"/*, 0, 0 */ },
134{ HDA_INTEL_LPT2,"Lynx Point"/*, 0, 0 */ },
135{ HDA_INTEL_WCPT,"Wildcat Point"/*, 0, 0 */ },
136{ HDA_INTEL_WELLS1,"Wellsburg"/*, 0, 0 */ },
137{ HDA_INTEL_WELLS2,"Wellsburg"/*, 0, 0 */ },
138{ HDA_INTEL_WCPTLP,"Wildcat Point-LP"/*, 0, 0 */ },
139{ HDA_INTEL_LPTLP1,"Lynx Point-LP"/*, 0, 0 */ },
140{ HDA_INTEL_LPTLP2,"Lynx Point-LP"/*, 0, 0 */ },
141{ HDA_INTEL_SRSPLP,"Sunrise Point-LP"/*, 0, 0 */ },
142{ HDA_INTEL_KABYLAKE_LP, "Kabylake-LP"/*, 0, 0 */ }, // Kabylake-LP
143{ HDA_INTEL_SRSP,"Sunrise Point"/*, 0, 0 */ },
144{ HDA_INTEL_KABYLAKE,"Kabylake"/*, 0, 0 */ }, // Kabylake
145{ HDA_INTEL_LEWISBURG1,"Lewisburg"/*, 0, 0 */ }, // Lewisburg
146{ HDA_INTEL_LEWISBURG2,"Lewisburg"/*, 0, 0 */ }, // Lewisburg
147{ HDA_INTEL_UNPT,"Union Point"/*, 0, 0 */ }, // Kabylake-H
148
149//10de NVIDIA Corporation
150{ HDA_NVIDIA_MCP51,"MCP51" /*, 0, HDAC_QUIRK_MSI */ },
151{ HDA_NVIDIA_MCP55,"MCP55" /*, 0, HDAC_QUIRK_MSI */ },
152{ HDA_NVIDIA_MCP61_1,"MCP61" /*, 0, 0 */ },
153{ HDA_NVIDIA_MCP61_2,"MCP61" /*, 0, 0 */ },
154{ HDA_NVIDIA_MCP65_1,"MCP65" /*, 0, 0 */ },
155{ HDA_NVIDIA_MCP65_2,"MCP65" /*, 0, 0 */ },
156{ HDA_NVIDIA_MCP67_1,"MCP67" /*, 0, 0 */ },
157{ HDA_NVIDIA_MCP67_2,"MCP67" /*, 0, 0 */ },
158{ HDA_NVIDIA_MCP73_1,"MCP73" /*, 0, 0 */ },
159{ HDA_NVIDIA_MCP73_2,"MCP73" /*, 0, 0 */ },
160{ HDA_NVIDIA_MCP78_1,"MCP78" /*, 0, HDAC_QUIRK_64BIT */ },
161{ HDA_NVIDIA_MCP78_2,"MCP78" /*, 0, HDAC_QUIRK_64BIT */ },
162{ HDA_NVIDIA_MCP78_3,"MCP78" /*, 0, HDAC_QUIRK_64BIT */ },
163{ HDA_NVIDIA_MCP78_4,"MCP78" /*, 0, HDAC_QUIRK_64BIT */ },
164{ HDA_NVIDIA_MCP79_1,"MCP79" /*, 0, 0 */ },
165{ HDA_NVIDIA_MCP79_2,"MCP79" /*, 0, 0 */ },
166{ HDA_NVIDIA_MCP79_3,"MCP79" /*, 0, 0 */ },
167{ HDA_NVIDIA_MCP79_4,"MCP79" /*, 0, 0 */ },
168{ HDA_NVIDIA_MCP89_1,"MCP89" /*, 0, 0 */ },
169{ HDA_NVIDIA_MCP89_2,"MCP89" /*, 0, 0 */ },
170{ HDA_NVIDIA_MCP89_3,"MCP89" /*, 0, 0 */ },
171{ HDA_NVIDIA_MCP89_4,"MCP89" /*, 0, 0 */ },
172{ HDA_NVIDIA_0BE2,"(0x0be2)" /*, 0, HDAC_QUIRK_MSI */ },
173{ HDA_NVIDIA_0BE3,"(0x0be3)" /*, 0, HDAC_QUIRK_MSI */ },
174{ HDA_NVIDIA_0BE4,"(0x0be4)" /*, 0, HDAC_QUIRK_MSI */ },
175{ HDA_NVIDIA_GT100,"GT100" /*, 0, HDAC_QUIRK_MSI */ },
176{ HDA_NVIDIA_GT104,"GT104" /*, 0, HDAC_QUIRK_MSI */ },
177{ HDA_NVIDIA_GT106,"GT106" /*, 0, HDAC_QUIRK_MSI */ },
178{ HDA_NVIDIA_GT108,"GT108" /*, 0, HDAC_QUIRK_MSI */ },
179{ HDA_NVIDIA_GT116,"GT116" /*, 0, HDAC_QUIRK_MSI */ },
180{ HDA_NVIDIA_GF119,"GF119" /*, 0, 0 */ },
181{ HDA_NVIDIA_GF110_1,"GF110" /*, 0, HDAC_QUIRK_MSI */ },
182{ HDA_NVIDIA_GF110_2,"GF110" /*, 0, HDAC_QUIRK_MSI */ },
183{ HDA_NVIDIA_GK110,"GK110" /*, 0, ? */ },
184{ HDA_NVIDIA_GK106,"GK106" /*, 0, ? */ },
185{ HDA_NVIDIA_GK107,"GK107" /*, 0, ? */ },
186{ HDA_NVIDIA_GK104,"GK104" /*, 0, ? */ },
187{ HDA_NVIDIA_GP104_2,"Pascal GP104-200" /*, 0, ? */ },
188{ HDA_NVIDIA_GM204_2,"Maxwell GP204-200" /*, 0, ? */ },
189
190//1002 Advanced Micro Devices [AMD] nee ATI Technologies Inc
191{ HDA_ATI_SB450,"SB4x0" /*, 0, 0 */ },
192{ HDA_ATI_SB600,"SB600" /*, 0, 0 */ },
193{ HDA_ATI_RS600,"RS600" /*, 0, 0 */ },
194{ HDA_ATI_HUDSON,"Hudson" /*, 0, 0 */ },
195{ HDA_ATI_RS690,"RS690" /*, 0, 0 */ },
196{ HDA_ATI_RS780,"RS780" /*, 0, 0 */ },
197{ HDA_ATI_RS880,"RS880" /*, 0, 0 */ },
198{ HDA_ATI_TRINITY,"Trinity" /*, 0, ? */ },
199{ HDA_ATI_R600,"R600" /*, 0, 0 */ },
200{ HDA_ATI_RV610,"RV610" /*, 0, 0 */ },
201{ HDA_ATI_RV620,"RV620" /*, 0, 0 */ },
202{ HDA_ATI_RV630,"RV630" /*, 0, 0 */ },
203{ HDA_ATI_RV635,"RV635" /*, 0, 0 */ },
204{ HDA_ATI_RV710,"RV710" /*, 0, 0 */ },
205{ HDA_ATI_RV730,"RV730" /*, 0, 0 */ },
206{ HDA_ATI_RV740,"RV740" /*, 0, 0 */ },
207{ HDA_ATI_RV770,"RV770" /*, 0, 0 */ },
208{ HDA_ATI_RV810,"RV810" /*, 0, 0 */ },
209{ HDA_ATI_RV830,"RV830" /*, 0, 0 */ },
210{ HDA_ATI_RV840,"RV840" /*, 0, 0 */ },
211{ HDA_ATI_RV870,"RV870" /*, 0, 0 */ },
212{ HDA_ATI_RV910,"RV910" /*, 0, 0 */ },
213{ HDA_ATI_RV930,"RV930" /*, 0, 0 */ },
214{ HDA_ATI_RV940,"RV940" /*, 0, 0 */ },
215{ HDA_ATI_RV970,"RV970" /*, 0, 0 */ },
216{ HDA_ATI_R1000,"R1000" /*, 0, 0 */ }, // HDMi
217{ HDA_ATI_SI,"SI" /*, 0, 0 */ },
218{ HDA_ATI_OLAND,"Cape Verde" /*, 0, ? */ }, // HDMi
219{ HDA_ATI_TAHITI,"Tahiti" /*, 0, ? */ }, // HDMi
220{ HDA_ATI_HAWAII,"Hawaii" /*, 0, ? */ }, // HDMi
221
222//17f3 RDC Semiconductor, Inc.
223{ HDA_RDC_M3010,"M3010" /*, 0, 0 */ },
224
225//1106 VIA Technologies, Inc.
226{ HDA_VIA_VT82XX,"VT8251/8237A" /*, 0, 0 */ },
227
228//1039 Silicon Integrated Systems [SiS]
229{ HDA_SIS_966,"966" /*, 0, 0 */ },
230
231//10b9 ULi Electronics Inc.(Split off ALi Corporation in 2003)
232{ HDA_ULI_M5461,"M5461" /*, 0, 0 */ },
233
234/* Unknown */
235{ HDA_INTEL_ALL,"Unknown Intel device" /*, 0, 0 */ },
236{ HDA_NVIDIA_ALL,"Unknown NVIDIA device" /*, 0, 0 */ },
237{ HDA_ATI_ALL,"Unknown ATI device" /*, 0, 0 */ },
238{ HDA_VIA_ALL,"Unknown VIA device" /*, 0, 0 */ },
239{ HDA_SIS_ALL,"Unknown SiS device" /*, 0, 0 */ },
240{ HDA_ULI_ALL,"Unknown ULI device" /*, 0, 0 */ },
241};
242#define HDAC_DEVICES_LEN (sizeof(know_hda_controller) / sizeof(know_hda_controller[0]))
243
244/* CODECs */
245/*
246 * ErmaC: There's definitely a lot of different versions of the same audio codec variant out there...
247 * in the next struct you will find a "generic" but IMHO detailed list of
248 * possible codec... anyway to specific a new one or find difference beetween revision
249 * check it under linux enviroment with:
250 * $cat /proc/asound/Intel/codec#0
251 * --------------------------------
252 * Codec: Analog Devices AD1989B
253 * Address: 0
254 * AFG Function Id: 0x1 (unsol 0)
255 * Vendor Id: 0x11d4989b
256 * Subsystem Id: 0x10438372
257 * Revision Id: 0x100300
258 * --------------------------------
259 * or
260 * $cat /proc/asound/NVidia/codec#0
261 * --------------------------------
262 * Codec: Nvidia GPU 14 HDMI/DP
263 * Address: 0
264 * AFG Function Id: 0x1 (unsol 0)
265 * Vendor Id: 0x10de0014
266 * Subsystem Id: 0x10de0101
267 * Revision Id: 0x100100
268 * --------------------------------
269 */
270
271static hdacc_codecs know_codecs[] = {
272{ HDA_CODEC_CS4206, 0,"CS4206" },
273{ HDA_CODEC_CS4207, 0,"CS4207" },
274{ HDA_CODEC_CS4208, 0,"CS4208" },
275{ HDA_CODEC_CS4210, 0,"CS4210" },
276{ HDA_CODEC_CS4213, 0, "CS4213" },
277
278{ HDA_CODEC_ALC221, 0, "ALC221" },
279{ HDA_CODEC_ALC231, 0, "ALC231" },
280{ HDA_CODEC_ALC233, 0, "ALC233" },
281{ HDA_CODEC_ALC233, 0x0003,"ALC3236" },
282{ HDA_CODEC_ALC235, 0, "ALC235" },
283{ HDA_CODEC_ALC255, 0, "ALC255" },
284{ HDA_CODEC_ALC256, 0, "ALC256" },
285{ HDA_CODEC_ALC260, 0, "ALC260" },
286//{ HDA_CODEC_ALC262, 0x0100,"ALC262" }, // Revision Id: 0x100100
287{ HDA_CODEC_ALC262, 0, "ALC262" },
288{ HDA_CODEC_ALC267, 0, "ALC267" },
289{ HDA_CODEC_ALC268, 0, "ALC268" },
290{ HDA_CODEC_ALC269, 0, "ALC269" },
291{ HDA_CODEC_ALC270, 0, "ALC270" },
292{ HDA_CODEC_ALC272, 0, "ALC272" },
293{ HDA_CODEC_ALC273, 0, "ALC273" },
294{ HDA_CODEC_ALC275, 0, "ALC275" },
295{ HDA_CODEC_ALC276, 0, "ALC276" },
296{ HDA_CODEC_ALC280, 0, "ALC280" },
297{ HDA_CODEC_ALC282, 0, "ALC282" },
298{ HDA_CODEC_ALC283, 0, "ALC283" },
299{ HDA_CODEC_ALC284, 0, "ALC284" },
300{ HDA_CODEC_ALC285, 0, "ALC285" },
301{ HDA_CODEC_ALC286, 0, "ALC286" },
302{ HDA_CODEC_ALC288, 0, "ALC288" },
303{ HDA_CODEC_ALC290, 0, "ALC290" },
304{ HDA_CODEC_ALC292, 0, "ALC292" },
305{ HDA_CODEC_ALC292, 0x0001, "ALC3232" },
306{ HDA_CODEC_ALC293, 0, "ALC293" },
307{ HDA_CODEC_ALC298, 0, "ALC298" },
308{ HDA_CODEC_ALC660, 0, "ALC660-VD" },
309{ HDA_CODEC_ALC662, 0, "ALC662" },
310{ HDA_CODEC_ALC662, 0x0101,"ALC662 rev1" },
311{ HDA_CODEC_ALC662, 0x0002,"ALC662 rev2" },
312{ HDA_CODEC_ALC662, 0x0300,"ALC662 rev3" },
313{ HDA_CODEC_ALC663, 0, "ALC663" },
314{ HDA_CODEC_ALC665, 0, "ALC665" },
315{ HDA_CODEC_ALC667, 0, "ALC667" },
316{ HDA_CODEC_ALC668, 0, "ALC668" },
317{ HDA_CODEC_ALC670, 0, "ALC670" },
318{ HDA_CODEC_ALC671, 0, "ALC671" },
319{ HDA_CODEC_ALC680, 0, "ALC680" },
320{ HDA_CODEC_ALC861, 0x0340,"ALC660" },
321{ HDA_CODEC_ALC861, 0, "ALC861" },
322{ HDA_CODEC_ALC861VD, 0, "ALC861-VD" },
323{ HDA_CODEC_ALC867, 0, "ALC891" },
324//{ HDA_CODEC_ALC880, 0x0800,"ALC880" }, // Revision Id: 0x100800
325{ HDA_CODEC_ALC880, 0, "ALC880" },
326{ HDA_CODEC_ALC882, 0, "ALC882" },
327{ HDA_CODEC_ALC883, 0, "ALC883" },
328{ HDA_CODEC_ALC885, 0x0101,"ALC889A" }, // Revision Id: 0x100101
329{ HDA_CODEC_ALC885, 0x0103,"ALC889A" }, // Revision Id: 0x100103
330{ HDA_CODEC_ALC885, 0, "ALC885" },
331{ HDA_CODEC_ALC886, 0, "ALC886" },
332{ HDA_CODEC_ALC887, 0, "ALC887" },
333{ HDA_CODEC_ALC888, 0x0101,"ALC1200" }, // Revision Id: 0x100101
334{ HDA_CODEC_ALC888, 0, "ALC888" },
335{ HDA_CODEC_ALC889, 0, "ALC889" },
336{ HDA_CODEC_ALC892, 0, "ALC892" },
337{ HDA_CODEC_ALC898, 0, "ALC898" },
338//{ HDA_CODEC_ALC899, 0,"ALC899" },
339{ HDA_CODEC_ALC900, 0, "ALC1150" },
340{ HDA_CODEC_ALCS1220A, 0,"ALCS1220A" },
341{ HDA_CODEC_ALC1220, 0, "ALC1220" },
342
343{ HDA_CODEC_AD1882, 0, "AD1882" },
344{ HDA_CODEC_AD1882A, 0, "AD1882A" },
345{ HDA_CODEC_AD1883, 0, "AD1883" },
346{ HDA_CODEC_AD1884, 0, "AD1884" },
347{ HDA_CODEC_AD1884A, 0, "AD1884A" },
348{ HDA_CODEC_AD1981HD, 0, "AD1981HD" },
349{ HDA_CODEC_AD1983, 0, "AD1983" },
350{ HDA_CODEC_AD1984, 0, "AD1984" },
351{ HDA_CODEC_AD1984A, 0, "AD1984A" },
352{ HDA_CODEC_AD1984B, 0, "AD1984B" },
353{ HDA_CODEC_AD1986A, 0, "AD1986A" },
354{ HDA_CODEC_AD1987, 0, "AD1987" },
355{ HDA_CODEC_AD1988, 0, "AD1988A" },
356{ HDA_CODEC_AD1988B, 0, "AD1988B" },
357{ HDA_CODEC_AD1989A, 0, "AD1989A" },
358{ HDA_CODEC_AD1989B, 0x0200,"AD2000B" }, // Revision Id: 0x100200
359{ HDA_CODEC_AD1989B, 0x0300,"AD2000B" }, // Revision Id: 0x100300
360{ HDA_CODEC_AD1989B, 0, "AD1989B" },
361
362{ HDA_CODEC_XFIEA, 0, "X-Fi Extreme A" },
363{ HDA_CODEC_XFIED, 0, "X-Fi Extreme D" },
364{ HDA_CODEC_CA0132, 0, "CA0132" },
365{ HDA_CODEC_SB0880, 0, "SB0880 X-Fi" },
366{ HDA_CODEC_CMI9880, 0, "CMI9880" },
367{ HDA_CODEC_CMI98802, 0, "CMI9880" },
368
369{ HDA_CODEC_CXD9872RDK, 0, "CXD9872RD/K" },
370{ HDA_CODEC_CXD9872AKD, 0, "CXD9872AKD" },
371{ HDA_CODEC_STAC9200D, 0, "STAC9200D" },
372{ HDA_CODEC_STAC9204X, 0, "STAC9204X" },
373{ HDA_CODEC_STAC9204D, 0, "STAC9204D" },
374{ HDA_CODEC_STAC9205X, 0, "STAC9205X" },
375{ HDA_CODEC_STAC9205D, 0, "STAC9205D" },
376{ HDA_CODEC_STAC9220, 0, "STAC9220" },
377{ HDA_CODEC_STAC9220_A1, 0, "STAC9220_A1" },
378{ HDA_CODEC_STAC9220_A2, 0, "STAC9220_A2" },
379{ HDA_CODEC_STAC9221, 0, "STAC9221" },
380{ HDA_CODEC_STAC9221_A2, 0, "STAC9221_A2" },
381{ HDA_CODEC_STAC9221D, 0, "STAC9221D" },
382{ HDA_CODEC_STAC922XD, 0, "STAC9220D/9223D" },
383{ HDA_CODEC_STAC9227X, 0, "STAC9227X" },
384{ HDA_CODEC_STAC9227D, 0, "STAC9227D" },
385{ HDA_CODEC_STAC9228X, 0, "STAC9228X" },
386{ HDA_CODEC_STAC9228D, 0, "STAC9228D" },
387{ HDA_CODEC_STAC9229X, 0, "STAC9229X" },
388{ HDA_CODEC_STAC9229D, 0, "STAC9229D" },
389{ HDA_CODEC_STAC9230X, 0, "STAC9230X" },
390{ HDA_CODEC_STAC9230D, 0, "STAC9230D" },
391{ HDA_CODEC_STAC9250, 0, "STAC9250" },
392{ HDA_CODEC_STAC9250D, 0,"STAC9250D" },
393{ HDA_CODEC_STAC9251, 0, "STAC9251" },
394{ HDA_CODEC_STAC9250D_1, 0,"STAC9250D" },
395{ HDA_CODEC_STAC9255, 0, "STAC9255" },
396{ HDA_CODEC_STAC9255D, 0, "STAC9255D" },
397{ HDA_CODEC_STAC9254, 0, "STAC9254" },
398{ HDA_CODEC_STAC9254D, 0, "STAC9254D" },
399{ HDA_CODEC_STAC9271X, 0, "STAC9271X" },
400{ HDA_CODEC_STAC9271D, 0, "STAC9271D" },
401{ HDA_CODEC_STAC9272X, 0, "STAC9272X" },
402{ HDA_CODEC_STAC9272D, 0, "STAC9272D" },
403{ HDA_CODEC_STAC9273X, 0, "STAC9273X" },
404{ HDA_CODEC_STAC9273D, 0, "STAC9273D" },
405{ HDA_CODEC_STAC9274, 0, "STAC9274" },
406{ HDA_CODEC_STAC9274D, 0, "STAC9274D" },
407{ HDA_CODEC_STAC9274X5NH, 0, "STAC9274X5NH" },
408{ HDA_CODEC_STAC9274D5NH, 0, "STAC9274D5NH" },
409{ HDA_CODEC_STAC9202, 0,"STAC9202" },
410{ HDA_CODEC_STAC9202D, 0,"STAC9202D" },
411{ HDA_CODEC_STAC9872AK, 0, "STAC9872AK" },
412
413{ HDA_CODEC_IDT92HD005, 0, "92HD005" },
414{ HDA_CODEC_IDT92HD005D, 0, "92HD005D" },
415{ HDA_CODEC_IDT92HD206X, 0, "92HD206X" },
416{ HDA_CODEC_IDT92HD206D, 0, "92HD206D" },
417{ HDA_CODEC_IDT92HD66B1X5, 0, "92HD66B1X5" },
418{ HDA_CODEC_IDT92HD66B2X5, 0, "92HD66B2X5" },
419{ HDA_CODEC_IDT92HD66B3X5, 0, "92HD66B3X5" },
420{ HDA_CODEC_IDT92HD66C1X5, 0, "92HD66C1X5" },
421{ HDA_CODEC_IDT92HD66C2X5, 0, "92HD66C2X5" },
422{ HDA_CODEC_IDT92HD66C3X5, 0, "92HD66C3X5" },
423{ HDA_CODEC_IDT92HD66B1X3, 0, "92HD66B1X3" },
424{ HDA_CODEC_IDT92HD66B2X3, 0, "92HD66B2X3" },
425{ HDA_CODEC_IDT92HD66B3X3, 0, "92HD66B3X3" },
426{ HDA_CODEC_IDT92HD66C1X3, 0, "92HD66C1X3" },
427{ HDA_CODEC_IDT92HD66C2X3, 0, "92HD66C2X3" },
428{ HDA_CODEC_IDT92HD66C3_65, 0, "92HD66C3_65" },
429{ HDA_CODEC_IDT92HD700X, 0, "92HD700X" },
430{ HDA_CODEC_IDT92HD700D, 0, "92HD700D" },
431{ HDA_CODEC_IDT92HD71B5, 0, "92HD71B5" },
432{ HDA_CODEC_IDT92HD71B5_2, 0, "92HD71B5" },
433{ HDA_CODEC_IDT92HD71B6, 0, "92HD71B6" },
434{ HDA_CODEC_IDT92HD71B6_2, 0, "92HD71B6" },
435{ HDA_CODEC_IDT92HD71B7, 0, "92HD71B7" },
436{ HDA_CODEC_IDT92HD71B7_2, 0, "92HD71B7" },
437{ HDA_CODEC_IDT92HD71B8, 0, "92HD71B8" },
438{ HDA_CODEC_IDT92HD71B8_2, 0, "92HD71B8" },
439{ HDA_CODEC_IDT92HD73C1, 0, "92HD73C1" },
440{ HDA_CODEC_IDT92HD73D1, 0, "92HD73D1" },
441{ HDA_CODEC_IDT92HD73E1, 0, "92HD73E1" },
442{ HDA_CODEC_IDT92HD95, 0,"92HD95" },
443{ HDA_CODEC_IDT92HD75B3, 0, "92HD75B3" },
444{ HDA_CODEC_IDT92HD88B3, 0, "92HD88B3" },
445{ HDA_CODEC_IDT92HD88B1, 0, "92HD88B1" },
446{ HDA_CODEC_IDT92HD88B2, 0, "92HD88B2" },
447{ HDA_CODEC_IDT92HD88B4, 0, "92HD88B4" },
448{ HDA_CODEC_IDT92HD75BX, 0, "92HD75BX" },
449{ HDA_CODEC_IDT92HD81B1C, 0, "92HD81B1C" },
450{ HDA_CODEC_IDT92HD81B1X, 0, "92HD81B1X" },
451{ HDA_CODEC_IDT92HD83C1C, 0, "92HD83C1C" },
452{ HDA_CODEC_IDT92HD83C1X, 0, "92HD83C1X" },
453{ HDA_CODEC_IDT92HD87B1_3, 0, "92HD87B1/3" },
454{ HDA_CODEC_IDT92HD87B2_4, 0, "92HD87B2/4" },
455{ HDA_CODEC_IDT92HD89C3, 0, "92HD89C3" },
456{ HDA_CODEC_IDT92HD89C2, 0, "92HD89C2" },
457{ HDA_CODEC_IDT92HD89C1, 0, "92HD89C1" },
458{ HDA_CODEC_IDT92HD89B3, 0, "92HD89B3" },
459{ HDA_CODEC_IDT92HD89B2, 0, "92HD89B2" },
460{ HDA_CODEC_IDT92HD89B1, 0, "92HD89B1" },
461{ HDA_CODEC_IDT92HD89E3, 0, "92HD89E3" },
462{ HDA_CODEC_IDT92HD89E2, 0, "92HD89E2" },
463{ HDA_CODEC_IDT92HD89E1, 0, "92HD89E1" },
464{ HDA_CODEC_IDT92HD89D3, 0, "92HD89D3" },
465{ HDA_CODEC_IDT92HD89D2, 0, "92HD89D2" },
466{ HDA_CODEC_IDT92HD89D1, 0, "92HD89D1" },
467{ HDA_CODEC_IDT92HD89F3, 0, "92HD89F3" },
468{ HDA_CODEC_IDT92HD89F2, 0, "92HD89F2" },
469{ HDA_CODEC_IDT92HD89F1, 0, "92HD89F1" },
470{ HDA_CODEC_IDT92HD90BXX, 0, "92HD90BXX" },
471{ HDA_CODEC_IDT92HD91BXX, 0, "92HD91BXX" },
472{ HDA_CODEC_IDT92HD93BXX, 0, "92HD93BXX" },
473{ HDA_CODEC_IDT92HD98BXX, 0, "92HD98BXX" },
474{ HDA_CODEC_IDT92HD99BXX, 0, "92HD99BXX" },
475
476{ HDA_CODEC_CX20549, 0, "CX20549 (Venice)" },
477{ HDA_CODEC_CX20551, 0, "CX20551 (Waikiki)" },
478{ HDA_CODEC_CX20561, 0, "CX20561 (Hermosa)" },
479{ HDA_CODEC_CX20582, 0, "CX20582 (Pebble)" },
480{ HDA_CODEC_CX20583, 0, "CX20583 (Pebble HSF)" },
481{ HDA_CODEC_CX20584, 0, "CX20584" },
482{ HDA_CODEC_CX20585, 0, "CX20585" },
483{ HDA_CODEC_CX20588, 0, "CX20588" },
484{ HDA_CODEC_CX20590, 0, "CX20590" },
485{ HDA_CODEC_CX20631, 0, "CX20631" },
486{ HDA_CODEC_CX20632, 0, "CX20632" },
487{ HDA_CODEC_CX20641, 0, "CX20641" },
488{ HDA_CODEC_CX20642, 0, "CX20642" },
489{ HDA_CODEC_CX20651, 0, "CX20651" },
490{ HDA_CODEC_CX20652, 0, "CX20652" },
491{ HDA_CODEC_CX20664, 0, "CX20664" },
492{ HDA_CODEC_CX20665, 0, "CX20665" },
493{ HDA_CODEC_CX20751, 0,"CX20751/2" },
494{ HDA_CODEC_CX20751_2, 0,"CX20751/2" },
495{ HDA_CODEC_CX20751_4, 0,"CX20753/4" },
496{ HDA_CODEC_CX20755, 0, "CX20755" },
497{ HDA_CODEC_CX20756, 0, "CX20756" },
498{ HDA_CODEC_CX20757, 0, "CX20757" },
499{ HDA_CODEC_CX20952, 0, "CX20952" },
500
501{ HDA_CODEC_VT1708_8, 0, "VT1708_8" },
502{ HDA_CODEC_VT1708_9, 0, "VT1708_9" },
503{ HDA_CODEC_VT1708_A, 0, "VT1708_A" },
504{ HDA_CODEC_VT1708_B, 0, "VT1708_B" },
505{ HDA_CODEC_VT1709_0, 0, "VT1709_0" },
506{ HDA_CODEC_VT1709_1, 0, "VT1709_1" },
507{ HDA_CODEC_VT1709_2, 0, "VT1709_2" },
508{ HDA_CODEC_VT1709_3, 0, "VT1709_3" },
509{ HDA_CODEC_VT1709_4, 0, "VT1709_4" },
510{ HDA_CODEC_VT1709_5, 0, "VT1709_5" },
511{ HDA_CODEC_VT1709_6, 0, "VT1709_6" },
512{ HDA_CODEC_VT1709_7, 0, "VT1709_7" },
513{ HDA_CODEC_VT1708B_0, 0, "VT1708B_0" },
514{ HDA_CODEC_VT1708B_1, 0, "VT1708B_1" },
515{ HDA_CODEC_VT1708B_2, 0, "VT1708B_2" },
516{ HDA_CODEC_VT1708B_3, 0, "VT1708B_3" },
517{ HDA_CODEC_VT1708B_4, 0, "VT1708B_4" },
518{ HDA_CODEC_VT1708B_5, 0, "VT1708B_5" },
519{ HDA_CODEC_VT1708B_6, 0, "VT1708B_6" },
520{ HDA_CODEC_VT1708B_7, 0, "VT1708B_7" },
521{ HDA_CODEC_VT1708S_0, 0, "VT1708S_0" },
522{ HDA_CODEC_VT1708S_1, 0, "VT1708S_1" },
523{ HDA_CODEC_VT1708S_2, 0, "VT1708S_2" },
524{ HDA_CODEC_VT1708S_3, 0, "VT1708S_3" },
525{ HDA_CODEC_VT1708S_4, 0, "VT1708S_4" },
526{ HDA_CODEC_VT1708S_5, 0, "VT1708S_5" },
527{ HDA_CODEC_VT1708S_6, 0, "VT1708S_6" },
528{ HDA_CODEC_VT1708S_7, 0, "VT1708S_7" },
529{ HDA_CODEC_VT1702_0, 0, "VT1702_0" },
530{ HDA_CODEC_VT1702_1, 0, "VT1702_1" },
531{ HDA_CODEC_VT1702_2, 0, "VT1702_2" },
532{ HDA_CODEC_VT1702_3, 0, "VT1702_3" },
533{ HDA_CODEC_VT1702_4, 0, "VT1702_4" },
534{ HDA_CODEC_VT1702_5, 0, "VT1702_5" },
535{ HDA_CODEC_VT1702_6, 0, "VT1702_6" },
536{ HDA_CODEC_VT1702_7, 0, "VT1702_7" },
537{ HDA_CODEC_VT1716S_0, 0, "VT1716S_0" },
538{ HDA_CODEC_VT1716S_1, 0, "VT1716S_1" },
539{ HDA_CODEC_VT1718S_0, 0, "VT1718S_0" },
540{ HDA_CODEC_VT1718S_1, 0, "VT1718S_1" },
541{ HDA_CODEC_VT1802_0, 0, "VT1802_0" },
542{ HDA_CODEC_VT1802_1, 0, "VT1802_1" },
543{ HDA_CODEC_VT1812, 0, "VT1812" },
544{ HDA_CODEC_VT1818S, 0, "VT1818S" },
545{ HDA_CODEC_VT1828S, 0, "VT1828S" },
546{ HDA_CODEC_VT2002P_0, 0, "VT2002P_0" },
547{ HDA_CODEC_VT2002P_1, 0, "VT2002P_1" },
548{ HDA_CODEC_VT2020, 0, "VT2020" },
549
550{ HDA_CODEC_ATIRS600_1, 0, "RS600" },
551{ HDA_CODEC_ATIRS600_2, 0, "RS600" },
552{ HDA_CODEC_ATIRS690, 0, "RS690/780" },
553{ HDA_CODEC_ATIR6XX, 0, "R6xx" },
554
555{ HDA_CODEC_NVIDIAMCP67, 0, "MCP67" },
556{ HDA_CODEC_NVIDIAMCP73, 0, "MCP73" },
557{ HDA_CODEC_NVIDIAMCP78, 0, "MCP78" },
558{ HDA_CODEC_NVIDIAMCP78_2, 0, "MCP78" },
559{ HDA_CODEC_NVIDIAMCP78_3, 0, "MCP78" },
560{ HDA_CODEC_NVIDIAMCP78_4, 0, "MCP78" },
561{ HDA_CODEC_NVIDIAMCP7A, 0, "MCP7A" },
562{ HDA_CODEC_NVIDIAGT220, 0, "GT220" },
563{ HDA_CODEC_NVIDIAGT21X, 0, "GT21x" },
564{ HDA_CODEC_NVIDIAMCP89, 0, "MCP89" },
565{ HDA_CODEC_NVIDIAGT240, 0, "GT240" },
566{ HDA_CODEC_NVIDIAGTS450, 0, "GTS450" },
567{ HDA_CODEC_NVIDIAGT440, 0, "GT440" }, // Revision Id: 0x100100
568{ HDA_CODEC_NVIDIAGTX470, 0, "GT470" },
569{ HDA_CODEC_NVIDIAGTX550, 0, "GTX550" },
570{ HDA_CODEC_NVIDIAGTX570, 0, "GTX570" },
571{ HDA_CODEC_NVIDIAGT610, 0,"GT610" },
572{ HDA_CODEC_NVIDIATEGRA30, 0,"TEGRA30" },
573{ HDA_CODEC_NVIDIATEGRA114, 0,"TEGRA114" },
574{ HDA_CODEC_NVIDIATEGRA124, 0,"TEGRA124" },
575{ HDA_CODEC_NVIDIATEGRA210, 0,"TEGRA210" },
576
577{ HDA_CODEC_INTELIP, 0, "Ibex Peak" },
578{ HDA_CODEC_INTELWB, 0, "Haswell" },
579{ HDA_CODEC_INTELBL, 0, "Bearlake" },
580{ HDA_CODEC_INTELCA, 0, "Cantiga" },
581{ HDA_CODEC_INTELEL, 0, "Eaglelake" },
582{ HDA_CODEC_INTELIP2, 0, "Ibex Peak" },
583{ HDA_CODEC_INTELCPT, 0, "Cougar Point" },
584{ HDA_CODEC_INTELPPT, 0, "Panther Point" },
585{ HDA_CODEC_INTELLLP, 0, "Haswell" },
586{ HDA_CODEC_INTELBRW, 0, "Broadwell" },
587{ HDA_CODEC_INTELSKL, 0, "Skylake" },
588{ HDA_CODEC_INTELBRO, 0, "Broxton" },
589{ HDA_CODEC_INTELKAB, 0, "Kabylake" },
590{ HDA_CODEC_INTELCDT, 0, "CedarTrail" },
591{ HDA_CODEC_INTELVLV, 0, "Valleyview2" },
592{ HDA_CODEC_INTELBSW, 0, "Braswell" },
593{ HDA_CODEC_INTELCL, 0, "Crestline" },
594
595{ HDA_CODEC_SII1390, 0, "SiI1390 HDMi" },
596{ HDA_CODEC_SII1392, 0, "SiI1392 HDMi" },
597
598// Unknown CODECs
599{ HDA_CODEC_ADXXXX, 0, "Analog Devices" },
600{ HDA_CODEC_AGEREXXXX, 0, "Lucent/Agere Systems" },
601{ HDA_CODEC_ALCXXXX, 0, "Realtek" },
602{ HDA_CODEC_ATIXXXX, 0, "ATI" },
603{ HDA_CODEC_CAXXXX, 0, "Creative" },
604{ HDA_CODEC_CMIXXXX, 0, "CMedia" },
605{ HDA_CODEC_CMIXXXX2, 0, "CMedia" },
606{ HDA_CODEC_CSXXXX, 0, "Cirrus Logic" },
607{ HDA_CODEC_CXXXXX, 0, "Conexant" },
608{ HDA_CODEC_CHXXXX, 0, "Chrontel" },
609//{ HDA_CODEC_LGXXXX, 0, "LG" },
610//{ HDA_CODEC_WMXXXX, 0, "Wolfson Microelectronics" },
611//{ HDA_CODEC_QEMUXXXX, 0, "QEMU" },
612{ HDA_CODEC_IDTXXXX, 0, "IDT" },
613{ HDA_CODEC_INTELXXXX, 0, "Intel" },
614{ HDA_CODEC_MOTOXXXX, 0, "Motorola" },
615{ HDA_CODEC_NVIDIAXXXX, 0, "NVIDIA" },
616{ HDA_CODEC_SIIXXXX, 0, "Silicon Image" },
617{ HDA_CODEC_STACXXXX, 0, "Sigmatel" },
618{ HDA_CODEC_VTXXXX, 0, "VIA" },
619};
620
621#define HDACC_CODECS_LEN (sizeof(know_codecs) / sizeof(know_codecs[0]))
622
623/*****************
624 * Device Methods
625 *****************/
626
627/* get HDA device name */
628static char *get_hda_controller_name(uint16_t controller_device_id, uint16_t controller_vendor_id)
629{
630static char desc[128];
631
632const char *name_format = "Unknown HD Audio device %s";
633uint32_t controller_model = ((controller_device_id << 16) | controller_vendor_id);
634int i;
635
636/* Get format for vendor ID */
637switch (controller_vendor_id)
638{
639case ATI_VENDORID:
640name_format = "ATI %s HDA Controller (HDMi)"; break;
641
642case INTEL_VENDORID:
643name_format = "Intel %s HDA Controller"; break;
644
645case NVIDIA_VENDORID:
646name_format = "nVidia %s HDA Controller (HDMi)"; break;
647
648case RDC_VENDORID:
649name_format = "RDC %s HDA Controller"; break;
650
651case SIS_VENDORID:
652name_format = "SiS %s HDA Controller"; break;
653
654case ULI_VENDORID:
655name_format = "ULI %s HDA Controller"; break;
656
657case VIA_VENDORID:
658name_format = "VIA %s HDA Controller"; break;
659
660default:
661break;
662}
663
664for (i = 0; i < HDAC_DEVICES_LEN; i++)
665{
666if (know_hda_controller[i].model == controller_model)
667{
668snprintf(desc, sizeof(desc), name_format, know_hda_controller[i].desc);
669return desc;
670}
671}
672
673/* Not in table */
674snprintf(desc, sizeof(desc), "Unknown HDA device, vendor %04x, model %04x",
675controller_vendor_id, controller_device_id);
676return desc;
677}
678
679/* get Codec name */
680static char *get_hda_codec_name( uint16_t codec_vendor_id, uint16_t codec_device_id, uint8_t codec_revision_id, uint8_t codec_stepping_id )
681{
682static char desc[128];
683
684char*lName_format = NULL;
685uint32_tlCodec_model = ((uint32_t)(codec_vendor_id) << 16) + (codec_device_id);
686uint32_tlCodec_rev = (((uint16_t)(codec_revision_id) << 8) + codec_stepping_id);
687int i;
688
689// Get format for vendor ID
690switch ( codec_vendor_id ) // uint16_t
691{
692case ANALOGDEVICES_VENDORID:
693lName_format = "Analog Devices %s"; break;
694
695case AGERE_VENDORID:
696lName_format = "Agere Systems %s "; break;
697
698case REALTEK_VENDORID:
699lName_format = "Realtek %s"; break;
700
701case ATI_VENDORID:
702lName_format = "ATI %s"; break;
703
704case CREATIVE_VENDORID:
705lName_format = "Creative %s"; break;
706
707case CMEDIA_VENDORID:
708case CMEDIA2_VENDORID:
709lName_format = "CMedia %s"; break;
710
711case CIRRUSLOGIC_VENDORID:
712lName_format = "Cirrus Logic %s"; break;
713
714case CONEXANT_VENDORID:
715lName_format = "Conexant %s"; break;
716
717case CHRONTEL_VENDORID:
718lName_format = "Chrontel %s"; break;
719
720case IDT_VENDORID:
721lName_format = "IDT %s"; break;
722
723case INTEL_VENDORID:
724lName_format = "Intel %s"; break;
725
726case MOTO_VENDORID:
727lName_format = "Motorola %s"; break;
728
729case NVIDIA_VENDORID:
730lName_format = "nVidia %s"; break;
731
732case SII_VENDORID:
733lName_format = "Silicon Image %s"; break;
734
735case SIGMATEL_VENDORID:
736lName_format = "Sigmatel %s"; break;
737
738case VIA_VENDORID:
739lName_format = "VIA %s"; break;
740
741default:
742lName_format = UNKNOWN; break;
743break;
744}
745
746for (i = 0; i < HDACC_CODECS_LEN; i++)
747{
748if ( know_codecs[i].id == lCodec_model )
749{
750if ( ( know_codecs[i].rev == 0x00000000 ) || ( know_codecs[i].rev == lCodec_rev ) )
751{
752//verbose("\tRevision in table (%06x) | burned chip revision (%06x).\n", know_codecs[i].rev, lCodec_rev );
753snprintf(desc, sizeof(desc), lName_format, know_codecs[i].name);
754return desc;
755}
756}
757}
758
759if ( ( lName_format != UNKNOWN ) && ( strstr(lName_format, "%s" ) != NULL ) )
760{
761// Dirty way to remove '%s' from the end of the lName_format
762int len = strlen(lName_format);
763lName_format[len-2] = '\0';
764}
765
766// Not in table
767snprintf(desc, sizeof(desc), "unknown %s Codec", lName_format);
768return desc;
769}
770
771bool setup_hda_devprop(pci_dt_t *hda_dev)
772{
773structDevPropDevice*device = NULL;
774char*devicepath = NULL;
775char*controller_name = NULL;
776intlen;
777uint8_tBuiltIn = 0x00;
778uint16_tcontroller_vendor_id = hda_dev->vendor_id;
779uint16_tcontroller_device_id = hda_dev->device_id;
780const char*value;
781
782// Skip keys
783bool do_skip_n_devprop = false;
784bool do_skip_a_devprop = false;
785getBoolForKey(kSkipNvidiaGfx, &do_skip_n_devprop, &bootInfo->chameleonConfig);
786getBoolForKey(kSkipAtiGfx, &do_skip_a_devprop, &bootInfo->chameleonConfig);
787
788verbose("\tClass code: [%04X]\n", hda_dev->class_id);
789
790devicepath = get_pci_dev_path(hda_dev);
791controller_name = get_hda_controller_name(controller_device_id, controller_vendor_id);
792
793if (!string)
794{
795string = devprop_create_string();
796if (!string)
797{
798return 0;
799}
800}
801
802if (!devicepath)
803{
804return 0;
805}
806
807device = devprop_add_device(string, devicepath);
808if (!device)
809{
810return 0;
811}
812
813verbose("\tModel name: %s [%04x:%04x] (rev %02x)\n\tSubsystem: [%04x:%04x]\n\t%s\n",
814 controller_name, hda_dev->vendor_id, hda_dev->device_id, hda_dev->revision_id,
815hda_dev->subsys_id.subsys.vendor_id, hda_dev->subsys_id.subsys.device_id, devicepath);
816
817probe_hda_bus(hda_dev->dev.addr);
818
819switch ((controller_device_id << 16) | controller_vendor_id)
820{
821
822/***********************************************************************
823* The above case are intended as for HDEF device at address 0x001B0000
824***********************************************************************/
825case HDA_INTEL_OAK:
826case HDA_INTEL_BAY:
827case HDA_INTEL_HSW1:
828case HDA_INTEL_SER8HDMI:
829case HDA_INTEL_HSW3:
830case HDA_INTEL_BDW:
831case HDA_INTEL_BROXTON_T:
832case HDA_INTEL_CPT:
833case HDA_INTEL_PATSBURG:
834case HDA_INTEL_PPT1:
835case HDA_INTEL_BRASWELL:
836case HDA_INTEL_82801F:
837case HDA_INTEL_63XXESB:
838case HDA_INTEL_82801G:
839case HDA_INTEL_82801H:
840case HDA_INTEL_82801I:
841case HDA_INTEL_ICH9:
842case HDA_INTEL_82801JI:
843case HDA_INTEL_82801JD:
844case HDA_INTEL_PCH:
845case HDA_INTEL_PCH2:
846case HDA_INTEL_BROXTON_P:
847case HDA_INTEL_SCH:
848case HDA_INTEL_LPT1:
849case HDA_INTEL_LPT2:
850case HDA_INTEL_WCPT:
851case HDA_INTEL_WELLS1:
852case HDA_INTEL_WELLS2:
853case HDA_INTEL_WCPTLP:
854case HDA_INTEL_LPTLP1:
855case HDA_INTEL_LPTLP2:
856case HDA_INTEL_SRSPLP:
857case HDA_INTEL_KABYLAKE_LP:
858case HDA_INTEL_SRSP:
859case HDA_INTEL_KABYLAKE:
860case HDA_INTEL_LEWISBURG1:
861case HDA_INTEL_LEWISBURG2:
862case HDA_INTEL_UNPT:
863
864
865/* if the key value kHDEFLayoutID as a value set that value, if not will assign a default layout */
866if (getValueForKey(kHDEFLayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDEF_LEN * 2)
867{
868uint8_t new_HDEF_layout_id[HDEF_LEN];
869if (hex2bin(value, new_HDEF_layout_id, HDEF_LEN) == 0)
870{
871memcpy(default_HDEF_layout_id, new_HDEF_layout_id, HDEF_LEN);
872verbose("\tUsing user supplied HDEF layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
873default_HDEF_layout_id[0], default_HDEF_layout_id[1], default_HDEF_layout_id[2], default_HDEF_layout_id[3]);
874}
875}
876else
877{
878verbose("\tUsing default HDEF layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
879default_HDEF_layout_id[0], default_HDEF_layout_id[1], default_HDEF_layout_id[2], default_HDEF_layout_id[3]);
880}
881devprop_add_value(device, "layout-id", default_HDEF_layout_id, HDEF_LEN);
882devprop_add_value(device, "AAPL,slot-name", (uint8_t *)"Built-in", sizeof("Built-in")); // 0x09
883devprop_add_value(device, "name", (uint8_t *)"audio", 6); // 0x06
884devprop_add_value(device, "device-type", (uint8_t *)"High Definition Audio Controller", sizeof("High Definition Audio Controller"));
885devprop_add_value(device, "device_type", (uint8_t *)"Sound", sizeof("Sound"));
886devprop_add_value(device, "built-in", &BuiltIn, 1);
887devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", sizeof("onboard-1")); // 0x0a
888// "AFGLowPowerState" = <03000000>
889break;
890
891/*****************************************************************************************************************
892 * The above case are intended as for HDAU (NVIDIA) device onboard audio for GFX card with Audio controller HDMi *
893 *****************************************************************************************************************/
894case HDA_NVIDIA_GK107:
895case HDA_NVIDIA_GF110_1:
896case HDA_NVIDIA_GF110_2:
897case HDA_NVIDIA_GK106:
898case HDA_NVIDIA_GK104:
899case HDA_NVIDIA_GF119:
900case HDA_NVIDIA_GT116:
901case HDA_NVIDIA_GT104:
902case HDA_NVIDIA_GT108:
903case HDA_NVIDIA_GT106:
904case HDA_NVIDIA_GT100:
905case HDA_NVIDIA_0BE4:
906case HDA_NVIDIA_0BE3:
907case HDA_NVIDIA_0BE2:
908if ( do_skip_n_devprop )
909{
910verbose("Skip Nvidia audio device!\n");
911}
912else
913{
914/* if the key value kHDAULayoutID as a value set that value, if not will assign a default layout */
915if (getValueForKey(kHDAULayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDAU_LEN * 2)
916{
917uint8_t new_HDAU_layout_id[HDAU_LEN];
918if (hex2bin(value, new_HDAU_layout_id, HDAU_LEN) == 0)
919{
920memcpy(default_HDAU_layout_id, new_HDAU_layout_id, HDAU_LEN);
921verbose("\tUsing user supplied HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
922default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
923}
924}
925else
926{
927verbose("\tUsing default HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
928default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
929}
930
931devprop_add_value(device, "layout-id", default_HDAU_layout_id, HDAU_LEN); /*FIX ME*/
932devprop_add_value(device, "@0,connector-type", connector_type_value, 4);
933devprop_add_value(device, "@1,connector-type", connector_type_value, 4);
934devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-2", sizeof("onboard-2"));
935devprop_add_value(device, "built-in", &BuiltIn, 1);
936}
937break;
938
939/**************************************************************************************************************
940 * The above case are intended as for HDAU (ATi) device onboard audio for GFX card with Audio controller HDMi *
941 **************************************************************************************************************/
942case HDA_ATI_SB450:
943case HDA_ATI_SB600:
944case HDA_ATI_HUDSON:
945case HDA_ATI_RS600:
946case HDA_ATI_RS690:
947case HDA_ATI_RS780:
948case HDA_ATI_R600:
949case HDA_ATI_RV630:
950case HDA_ATI_RV610:
951case HDA_ATI_RV670:
952case HDA_ATI_RV635:
953case HDA_ATI_RV620:
954case HDA_ATI_RV770:
955case HDA_ATI_RV730:
956case HDA_ATI_RV710:
957case HDA_ATI_RV740:
958case HDA_ATI_RV870:
959case HDA_ATI_RV840:
960case HDA_ATI_RV830:
961case HDA_ATI_RV810:
962case HDA_ATI_RV970:
963case HDA_ATI_RV940:
964case HDA_ATI_RV930:
965case HDA_ATI_RV910:
966case HDA_ATI_R1000:
967case HDA_ATI_SI:
968case HDA_ATI_OLAND:
969case HDA_ATI_TAHITI:
970case HDA_ATI_HAWAII:
971if ( do_skip_a_devprop )
972{
973verbose("Skip ATi/AMD audio device!\n");
974}
975else
976{
977/* if the key value kHDAULayoutID as a value set that value, if not will assign a default layout */
978if (getValueForKey(kHDAULayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDAU_LEN * 2)
979{
980uint8_t new_HDAU_layout_id[HDAU_LEN];
981if (hex2bin(value, new_HDAU_layout_id, HDAU_LEN) == 0)
982{
983memcpy(default_HDAU_layout_id, new_HDAU_layout_id, HDAU_LEN);
984verbose("\tUsing user supplied HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
985default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
986}
987}
988else
989{
990verbose("\tUsing default HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
991default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
992}
993
994devprop_add_value(device, "layout-id", default_HDAU_layout_id, HDAU_LEN); /*FIX ME*/
995devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-2", 10);
996devprop_add_value(device, "built-in", &BuiltIn, 1);
997}
998break;
999
1000default:
1001break;
1002}
1003
1004stringdata = malloc(sizeof(uint8_t) * string->length);
1005memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
1006stringlength = string->length;
1007
1008return true;
1009}
1010
1011/*
1012 * Structure of HDA MMIO Region
1013 */
1014struct HDARegs
1015{
1016uint16_t gcap;
1017uint8_t vmin;
1018uint8_t vmaj;
1019uint16_t outpay;
1020uint16_t inpay;
1021uint32_t gctl;
1022uint16_t wakeen;
1023uint16_t statests;
1024uint16_t gsts;
1025uint8_t rsvd0[6];
1026uint16_t outstrmpay;
1027uint16_t instrmpay;
1028uint8_t rsvd1[4];
1029uint32_t intctl;
1030uint32_t intsts;
1031uint8_t rsvd2[8];
1032uint32_t walclk;
1033uint8_t rsvd3[4];
1034uint32_t ssync;
1035uint8_t rsvd4[4];
1036uint32_t corblbase;
1037uint32_t corbubase;
1038uint16_t corbwp;
1039uint16_t corbrp;
1040uint8_t corbctl;
1041uint8_t corbsts;
1042uint8_t corbsize;
1043uint8_t rsvd5;
1044uint32_t rirblbase;
1045uint32_t rirbubase;
1046uint16_t rirbwp;
1047uint16_t rintcnt;
1048uint8_t rirbctl;
1049uint8_t rirbsts;
1050uint8_t rirbsize;
1051uint8_t rsvd6;
1052uint32_t icoi;
1053uint32_t icii;
1054uint16_t icis;
1055uint8_t rsvd7[6];
1056uint32_t dpiblbase;
1057uint32_t dpibubase;
1058uint8_t rsvd8[8];
1059/*
1060 * Stream Descriptors follow
1061 */
1062} __attribute__((aligned(16), packed));
1063
1064/*
1065 * Data to be discovered for HDA codecs
1066 */
1067
1068struct HDACodecInfo
1069{
1070uint16_t vendor_id;
1071uint16_t device_id;
1072uint8_t revision_id;
1073uint8_t stepping_id;
1074uint8_t maj_rev;
1075uint8_t min_rev;
1076uint8_t num_function_groups;
1077const char *name;
1078};
1079
1080/*
1081 * Timing Functions
1082 */
1083
1084static int wait_for_register_state_16(uint16_t const volatile* reg,
1085uint16_t target_mask,
1086uint16_t target_value,
1087uint32_t timeout_us,
1088uint32_t tsc_ticks_per_us)
1089{
1090uint64_t deadline = rdtsc64() + MultU32x32(timeout_us, tsc_ticks_per_us);
1091do
1092{
1093uint16_t value = *reg;
1094if ((value & target_mask) == target_value)
1095return 0;
1096CpuPause();
1097}
1098while (rdtsc64() < deadline);
1099return -1;
1100}
1101
1102static void delay_us(uint32_t timeout_us, uint32_t tsc_ticks_per_us)
1103{
1104uint64_t deadline = rdtsc64() + MultU32x32(timeout_us, tsc_ticks_per_us);
1105
1106do
1107{
1108CpuPause();
1109}
1110while (rdtsc64() < deadline);
1111}
1112
1113static struct HDARegs volatile* hdaMemory = NULL;
1114static uint32_t tsc_ticks_per_us = 0U;
1115
1116#define ICIS_ICB 1U
1117#define ICIS_IRV 2U
1118
1119static int immediate_command(uint32_t command, uint32_t* response)
1120{
1121/*
1122 * Wait up to 1ms for for ICB 0
1123 */
1124(void) wait_for_register_state_16(&hdaMemory->icis, ICIS_ICB, 0U, 1000U, tsc_ticks_per_us);
1125/*
1126 * Ignore timeout and force ICB to 0
1127 * Clear IRV while at it
1128 */
1129hdaMemory->icis = ICIS_IRV;
1130/*
1131 * Program command
1132 */
1133hdaMemory->icoi = command;
1134/*
1135 * Trigger command
1136 * Clear IRV again just in case
1137 */
1138hdaMemory->icis = ICIS_ICB | ICIS_IRV;
1139/*
1140 * Wait up to 1ms for response
1141 */
1142if (wait_for_register_state_16(&hdaMemory->icis, ICIS_IRV, ICIS_IRV, 1000U, tsc_ticks_per_us) < 0)
1143{
1144/*
1145 * response timed out
1146 */
1147return -1;
1148}
1149*response = hdaMemory->icii;
1150return 0;
1151}
1152
1153#define PACK_CID(x) ((x & 15U) << 28)
1154#define PACK_NID(x) ((x & 127U) << 20)
1155#define PACK_VERB_12BIT(x) ((x & 4095U) << 8)
1156#define PACK_PAYLOAD_8BIT(x) (x & UINT8_MAX)
1157#define VERB_GET_PARAMETER 0xF00U
1158
1159static uint32_t get_parameter(uint8_t codec_id, uint8_t node_id, uint8_t parameter_id)
1160{
1161uint32_t command, response;
1162
1163command = PACK_CID(codec_id) | PACK_NID(node_id) | PACK_VERB_12BIT(VERB_GET_PARAMETER) | PACK_PAYLOAD_8BIT(parameter_id);
1164response = UINT32_MAX;
1165
1166/*
1167 * Ignore timeout, return UINT32_MAX as error value
1168 */
1169(void) immediate_command(command, &response);
1170return response;
1171}
1172
1173#define PARAMETER_VID_DID 0U
1174#define PARAMETER_RID 2U
1175#define PARAMETER_NUM_NODES 4U
1176
1177static void probe_hda_codec(uint8_t codec_id, struct HDACodecInfo *codec_info)
1178{
1179uint32_t response;
1180CDBG("\tprobing codec %d\n", codec_id);
1181response = get_parameter(codec_id, 0U, PARAMETER_VID_DID);
1182codec_info->vendor_id = (response >> 16) & UINT16_MAX;
1183codec_info->device_id = response & UINT16_MAX;
1184response = get_parameter(codec_id, 0U, PARAMETER_RID);
1185codec_info->revision_id = (response >> 8) & UINT8_MAX;
1186codec_info->stepping_id = response & UINT8_MAX;
1187codec_info->maj_rev = (response >> 20) & 15U;
1188codec_info->min_rev = (response >> 16) & 15U;
1189response = get_parameter(codec_id, 0U, PARAMETER_NUM_NODES);
1190codec_info->num_function_groups = response & UINT8_MAX;
1191codec_info->name = get_hda_codec_name(codec_info->vendor_id, codec_info->device_id, codec_info->revision_id, codec_info->stepping_id);
1192
1193}
1194
1195static int getHDABar(uint32_t pci_addr, uint32_t* bar_phys_addr)
1196{
1197uint32_t barlow = pci_config_read32(pci_addr, PCI_BASE_ADDRESS_0);
1198
1199if ((barlow & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_MEMORY)
1200{
1201CDBG("\tBAR0 for HDA Controller 0x%x is not an MMIO space\n", pci_addr);
1202return -1;
1203}
1204
1205if ((barlow & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == PCI_BASE_ADDRESS_MEM_TYPE_64)
1206{
1207uint32_t barhigh = pci_config_read32(pci_addr, PCI_BASE_ADDRESS_1);
1208
1209if (barhigh)
1210{
1211//verbose("\tBAR0 for HDA Controller 0x%x is located ouside 32-bit physical address space (0x%x%08x)\n",
1212//pci_addr, barhigh, barlow & PCI_BASE_ADDRESS_MEM_MASK);
1213return -1;
1214}
1215}
1216
1217if (bar_phys_addr)
1218{
1219*bar_phys_addr = (barlow & PCI_BASE_ADDRESS_MEM_MASK);
1220}
1221return 0;
1222}
1223
1224void probe_hda_bus(uint32_t pci_addr)
1225{
1226uint64_t tsc_frequency;
1227uint32_t bar_phys_addr;
1228uint16_t pci_cmd, statests;
1229uint16_t const pci_cmd_wanted = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
1230uint8_t codec_id, original_reset_state;
1231struct HDACodecInfo codec_info;
1232
1233CDBG("\tlooking for HDA bar0 on pci_addr 0x%x\n", pci_addr);
1234if (getHDABar(pci_addr, &bar_phys_addr) < 0)
1235{
1236return;
1237}
1238
1239CDBG("\tfound HDA memory at 0x%x\n", bar_phys_addr);
1240hdaMemory = (struct HDARegs volatile*) bar_phys_addr;
1241
1242tsc_frequency = Platform.CPU.TSCFrequency;
1243tsc_ticks_per_us = DivU64x32(tsc_frequency, 1000000U); // TSC ticks per microsecond
1244CDBG("\ttsc_ticks_per_us %d\n", tsc_ticks_per_us);
1245
1246/*
1247 * Enable Memory Space and Bus Mastering
1248 */
1249pci_cmd = pci_config_read16(pci_addr, PCI_COMMAND);
1250if ((pci_cmd & pci_cmd_wanted) != pci_cmd_wanted)
1251{
1252pci_cmd |= pci_cmd_wanted;
1253pci_config_write16(pci_addr, PCI_COMMAND, pci_cmd);
1254}
1255
1256/*
1257 * Remember entering reset state
1258 */
1259original_reset_state = (hdaMemory->gctl & HDAC_GCTL_CRST) ? 1U : 0U;
1260
1261/*
1262 * Reset HDA Controller
1263 */
1264hdaMemory->wakeen = 0U;
1265hdaMemory->statests = UINT16_MAX;
1266hdaMemory->gsts = UINT16_MAX;
1267hdaMemory->intctl = 0U;
1268CDBG("\tStarting reset\n");
1269hdaMemory->gctl = 0U;
1270
1271/*
1272 * Wait up to 10ms to enter Reset
1273 */
1274if (wait_for_register_state_16((uint16_t volatile const*) &hdaMemory->gctl,
1275HDAC_GCTL_CRST,
12760U,
127710000U,
1278tsc_ticks_per_us) < 0)
1279{
1280CDBG("\tHDA Controller 0x%x timed out 10ms entering reset\n", pci_addr);
1281return;
1282}
1283CDBG("\tReset asserted, delay 100us\n");
1284
1285/*
1286 * Delay 2400 BCLK (100us)
1287 */
1288delay_us(100U, tsc_ticks_per_us);
1289CDBG("\tDeasserting reset\n");
1290
1291/*
1292 * Wait up to 10ms to exit Reset
1293 */
1294hdaMemory->gctl = HDAC_GCTL_CRST;
1295if (wait_for_register_state_16((uint16_t volatile const*) &hdaMemory->gctl,
1296HDAC_GCTL_CRST,
1297HDAC_GCTL_CRST,
129810000U,
1299tsc_ticks_per_us) < 0)
1300{
1301CDBG("\tHDA Controller 0x%x timed out 10ms exiting reset\n", pci_addr);
1302return;
1303}
1304CDBG("\tReset complete\n");
1305
1306/*
1307 * Wait 1ms for codecs to request enumeration (spec says 521us).
1308 */
1309delay_us(1000U, tsc_ticks_per_us);
1310
1311/*
1312 * See which codecs want enumeration
1313 */
1314statests = hdaMemory->statests;
1315hdaMemory->statests = statests; // clear statests
1316CDBG("\tstatests is now 0x%x\n", statests);
1317codec_id = 0U;
1318while (statests)
1319{
1320if (statests & 1U)
1321{
1322probe_hda_codec(codec_id, &codec_info);
1323
1324verbose("\tFound %s (%04x%04x), rev(%04x)",
1325codec_info.name,
1326codec_info.vendor_id,
1327codec_info.device_id,
1328codec_info.revision_id);
1329#if DEBUG_CODEC
1330verbose(", stepping 0x%x, major rev 0x%x, minor rev 0x%x, %d function groups",
1331codec_info.stepping_id,
1332codec_info.maj_rev,
1333codec_info.min_rev,
1334codec_info.num_function_groups);
1335#endif
1336verbose("\n");
1337}
1338++codec_id;
1339statests >>= 1;
1340}
1341
1342/*
1343 * Restore reset state entered with
1344 */
1345if (!original_reset_state)
1346{
1347hdaMemory->gctl = 0U;
1348}
1349}
1350

Archive Download this file

Revision: 2880