Chameleon

Chameleon Svn Source Tree

Root/branches/Bungo/i386/libsaio/hda.c

1/*
2 *HDA injector / Audio Enabler
3 *
4 *Copyright (C) 2012Chameleon Team
5 *Edit by Fabio (ErmaC)
6 *
7 *HDA injector is free software: you can redistribute it and/or modify
8 *it under the terms of the GNU General Public License as published by
9 *the Free Software Foundation, either version 3 of the License, or
10 *(at your option) any later version.
11 *
12 *HDA injector is distributed in the hope that it will be useful,
13 *but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 *GNU General Public License for more details.
16 *
17 *Alternatively you can choose to comply with APSL
18 *
19 *Permission is hereby granted, free of charge, to any person obtaining a
20 *copy of this software and associated documentation files (the "Software"),
21 *to deal in the Software without restriction, including without limitation
22 *the rights to use, copy, modify, merge, publish, distribute, sublicense,
23 *and/or sell copies of the Software, and to permit persons to whom the
24 *Software is furnished to do so, subject to the following conditions:
25 *
26 *The above copyright notice and this permission notice shall be included in
27 *all copies or substantial portions of the Software.
28 *
29 ******************************************************************************
30 * http://www.leidinger.net/FreeBSD/dox/dev_sound/html/df/d54/hdac_8c_source.html
31 *
32 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
33 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
34 * Copyright (c) 2008-2012 Alexander Motin <mav@FreeBSD.org>
35 * All rights reserved.
36 *
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
39 * are met:
40 * 1. Redistributions of source code must retain the above copyright
41 * notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 * notice, this list of conditions and the following disclaimer in the
44 * documentation and/or other materials provided with the distribution.
45 *
46 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 * SUCH DAMAGE.
57 *
58 * Intel High Definition Audio (Controller) driver for FreeBSD.
59 *
60 ******************************************************************************/
61
62#include "boot.h"
63#include "bootstruct.h"
64#include "pci.h"
65#include "pci_root.h"
66#include "platform.h"
67#include "device_inject.h"
68#include "hda.h"
69#include "aml_generator.h"
70
71#ifndef DEBUG_HDA
72#define DEBUG_HDA 0
73#endif
74
75#if DEBUG_HDA
76#define DBG(x...) verbose(x)
77#else
78#define DBG(x...)
79#endif
80
81extern uint32_t devices_number;
82
83const char *hda_slot_name[]={ "AAPL,slot-name", "Built In" };
84
85uint8_t default_HDEF_layout_id[]={0x0C, 0x00, 0x00, 0x00};
86#define HDEF_LEN ( sizeof(default_HDEF_layout_id) / sizeof(uint8_t) )
87uint8_t default_HDAU_layout_id[]={0x01, 0x00, 0x00, 0x00};
88#define HDAU_LEN ( sizeof(default_HDAU_layout_id) / sizeof(uint8_t) )
89uint8_t connector_type_value[] ={0x00, 0x08, 0x00, 0x00};
90
91/* Structures */
92
93static hda_controller_devices know_hda_controller[] = {
94//8086 Intel Corporation
95{ HDA_INTEL_HASWELL,"Haswell-ULT" },
96{ HDA_INTEL_HASWELL2,"Haswell" },
97{ HDA_INTEL_CRYSTAL,"Crystal Well" },
98{ HDA_INTEL_CPT,"6 Series/C200 Series Chipset Family" },
99{ HDA_INTEL_PATSBURG,"C600/X79 series chipset" },
100{ HDA_INTEL_PPT1,"7 Series/C210 Series Chipset Family" },
101{ HDA_INTEL_82801F,"82801FB/FBM/FR/FW/FRW (ICH6 Family)" },
102{ HDA_INTEL_63XXESB,"631x/631xESB/632xESB" },
103{ HDA_INTEL_82801G,"NM10/ICH7 Family" },
104{ HDA_INTEL_82801H,"82801H (ICH8 Family)" },
105{ HDA_INTEL_82801I,"82801I (ICH9 Family)" },
106{ HDA_INTEL_82801JI,"82801JI (ICH10 Family)" },
107{ HDA_INTEL_82801JD,"82801JD/DO (ICH10 Family) " },
108{ HDA_INTEL_PCH,"5 Series/3400 Series" },
109{ HDA_INTEL_PCH2,"5 Series/3400 Series" },
110{ HDA_INTEL_SCH,"System Controller Hub (SCH Poulsbo)" },
111{ HDA_INTEL_SCH2,"Wildcat Point" },
112{ HDA_INTEL_LPT1,"Wellsburg" },
113{ HDA_INTEL_LPT2,"Wellsburg" },
114{ HDA_INTEL_LYNX,"Lynx Point" },
115{ HDA_INTEL_LYNX2,"Lynx Point" },
116//10de NVIDIA Corporation
117{ HDA_NVIDIA_MCP51,"MCP51" },
118{ HDA_NVIDIA_MCP55,"MCP55" },
119{ HDA_NVIDIA_MCP61_1, "MCP61" },
120{ HDA_NVIDIA_MCP61_2, "MCP61" },
121{ HDA_NVIDIA_MCP65_1, "MCP65" },
122{ HDA_NVIDIA_MCP65_2, "MCP65" },
123{ HDA_NVIDIA_MCP67_1, "MCP67" },
124{ HDA_NVIDIA_MCP67_2, "MCP67" },
125{ HDA_NVIDIA_MCP73_1, "MCP73" },
126{ HDA_NVIDIA_MCP73_2, "MCP73" },
127{ HDA_NVIDIA_MCP78_1, "MCP78" },
128{ HDA_NVIDIA_MCP78_2, "MCP78" },
129{ HDA_NVIDIA_MCP78_3, "MCP78" },
130{ HDA_NVIDIA_MCP78_4, "MCP78" },
131{ HDA_NVIDIA_MCP79_1, "MCP79" },
132{ HDA_NVIDIA_MCP79_2, "MCP79" },
133{ HDA_NVIDIA_MCP79_3, "MCP79" },
134{ HDA_NVIDIA_MCP79_4, "MCP79" },
135{ HDA_NVIDIA_MCP89_1, "MCP89" },
136{ HDA_NVIDIA_MCP89_2, "MCP89" },
137{ HDA_NVIDIA_MCP89_3, "MCP89" },
138{ HDA_NVIDIA_MCP89_4, "MCP89" },
139{ HDA_NVIDIA_0BE2, "(0x0be2)" },
140{ HDA_NVIDIA_0BE3, "(0x0be3)" },
141{ HDA_NVIDIA_0BE4, "(0x0be4)" },
142{ HDA_NVIDIA_GT100, "GT100" },
143{ HDA_NVIDIA_GT104, "GT104" },
144{ HDA_NVIDIA_GT106, "GT106" },
145{ HDA_NVIDIA_GT108, "GT108" },
146{ HDA_NVIDIA_GT116, "GT116" },
147{ HDA_NVIDIA_GF119, "GF119" },
148{ HDA_NVIDIA_GF110, "GF110" },
149{ HDA_NVIDIA_GF114, "GF114" }, // HDMi
150{ HDA_NVIDIA_GK110, "GK110" },
151{ HDA_NVIDIA_GK106, "GK106" },
152{ HDA_NVIDIA_GK107, "GK107" },
153{ HDA_NVIDIA_GK104, "GK104" },
154//1002 Advanced Micro Devices [AMD] nee ATI Technologies Inc
155{ HDA_ATI_SB450, "IXP SB4x0" },
156{ HDA_ATI_SB600, "SB600" },
157{ HDA_ATI_RS600, "RS600" },
158{ HDA_ATI_RS690, "RS690" },
159{ HDA_ATI_RS780, "RS780" },
160{ HDA_ATI_RS880, "RS880" },
161{ HDA_ATI_TRINITY, "Trinity" },
162{ HDA_ATI_R600, "R600" },
163{ HDA_ATI_RV610, "RV610" },
164{ HDA_ATI_RV620, "RV620" },
165{ HDA_ATI_RV630, "RV630" },
166{ HDA_ATI_RV635, "RV635" },
167{ HDA_ATI_RV710, "RV710" },
168{ HDA_ATI_RV730, "RV730" },
169{ HDA_ATI_RV740, "RV740" },
170{ HDA_ATI_RV770, "RV770" },
171{ HDA_ATI_RV810, "RV810" },
172{ HDA_ATI_RV830, "RV830" },
173{ HDA_ATI_RV840, "RV840" },
174{ HDA_ATI_RV870, "RV870" },
175{ HDA_ATI_RV910, "Caicos" },
176{ HDA_ATI_RV930, "RV930" },
177{ HDA_ATI_RV940, "RV940" },
178{ HDA_ATI_RV970, "RV970" },
179{ HDA_ATI_R1000, "Tahiti XT" }, // HDMi
180{ HDA_ATI_VERDE, "Cape Verde" }, // HDMi
181//17f3 RDC Semiconductor, Inc.
182{ HDA_RDC_M3010, "M3010" },
183//1106 VIA Technologies, Inc.
184{ HDA_VIA_VT82XX, "VT8251/8237A" },
185//1039 Silicon Integrated Systems [SiS]
186{ HDA_SIS_966, "966" },
187//10b9 ULi Electronics Inc.(Split off ALi Corporation in 2003)
188{ HDA_ULI_M5461, "M5461" },
189/* Unknown */
190{ HDA_INTEL_ALL, "Unknown Intel device" },
191{ HDA_NVIDIA_ALL, "Unknown NVIDIA device" },
192{ HDA_ATI_ALL, "Unknown ATI device" },
193{ HDA_VIA_ALL, "Unknown VIA device" },
194{ HDA_SIS_ALL, "Unknown SiS device" },
195{ HDA_ULI_ALL, "Unknown ULI device" },
196};
197#define HDAC_DEVICES_LEN (sizeof(know_hda_controller) / sizeof(know_hda_controller[0]))
198
199/* CODECs */
200
201// ErmaC: TODO build function to probe the codecID
202/*
203static hdacc_codecs know_codecs[] = {
204 { HDA_CODEC_CS4206, 0, "Cirrus Logic CS4206" },
205 { HDA_CODEC_CS4207, 0, "Cirrus Logic CS4207" },
206 { HDA_CODEC_CS4210, 0, "Cirrus Logic CS4210" },
207 { HDA_CODEC_ALC221, 0, "Realtek ALC221" },
208 { HDA_CODEC_ALC260, 0, "Realtek ALC260" },
209 { HDA_CODEC_ALC262, 0, "Realtek ALC262" },
210 { HDA_CODEC_ALC267, 0, "Realtek ALC267" },
211 { HDA_CODEC_ALC268, 0, "Realtek ALC268" },
212 { HDA_CODEC_ALC269, 0, "Realtek ALC269" },
213 { HDA_CODEC_ALC270, 0, "Realtek ALC270" },
214 { HDA_CODEC_ALC272, 0, "Realtek ALC272" },
215 { HDA_CODEC_ALC273, 0, "Realtek ALC273" },
216 { HDA_CODEC_ALC275, 0, "Realtek ALC275" },
217 { HDA_CODEC_ALC276, 0, "Realtek ALC276" },
218 { HDA_CODEC_ALC660, 0, "Realtek ALC660-VD" },
219 { HDA_CODEC_ALC662, 0x0002, "Realtek ALC662 rev2" },
220 { HDA_CODEC_ALC662, 0, "Realtek ALC662" },
221 { HDA_CODEC_ALC663, 0, "Realtek ALC663" },
222 { HDA_CODEC_ALC665, 0, "Realtek ALC665" },
223 { HDA_CODEC_ALC670, 0, "Realtek ALC670" },
224 { HDA_CODEC_ALC680, 0, "Realtek ALC680" },
225 { HDA_CODEC_ALC861, 0x0340, "Realtek ALC660" },
226 { HDA_CODEC_ALC861, 0, "Realtek ALC861" },
227 { HDA_CODEC_ALC861VD, 0, "Realtek ALC861-VD" },
228 { HDA_CODEC_ALC880, 0, "Realtek ALC880" },
229 { HDA_CODEC_ALC882, 0, "Realtek ALC882" },
230 { HDA_CODEC_ALC883, 0, "Realtek ALC883" },
231 { HDA_CODEC_ALC885, 0x0101, "Realtek ALC889A" },
232 { HDA_CODEC_ALC885, 0x0103, "Realtek ALC889A" },
233 { HDA_CODEC_ALC885, 0, "Realtek ALC885" },
234 { HDA_CODEC_ALC887, 0, "Realtek ALC887" },
235 { HDA_CODEC_ALC888, 0x0101, "Realtek ALC1200" },
236 { HDA_CODEC_ALC888, 0, "Realtek ALC888" },
237 { HDA_CODEC_ALC889, 0, "Realtek ALC889" },
238 { HDA_CODEC_ALC892, 0, "Realtek ALC892" },
239 { HDA_CODEC_ALC898, 0, "Realtek ALC898" },
240 { HDA_CODEC_ALC899, 0, "Realtek ALC899" },
241 { HDA_CODEC_ALC900, 0, "Realtek ALC1150" },
242 { HDA_CODEC_AD1882, 0, "Analog Devices AD1882" },
243 { HDA_CODEC_AD1882A, 0, "Analog Devices AD1882A" },
244 { HDA_CODEC_AD1883, 0, "Analog Devices AD1883" },
245 { HDA_CODEC_AD1884, 0, "Analog Devices AD1884" },
246 { HDA_CODEC_AD1884A, 0, "Analog Devices AD1884A" },
247 { HDA_CODEC_AD1981HD, 0, "Analog Devices AD1981HD" },
248 { HDA_CODEC_AD1983, 0, "Analog Devices AD1983" },
249 { HDA_CODEC_AD1984, 0, "Analog Devices AD1984" },
250 { HDA_CODEC_AD1984A, 0, "Analog Devices AD1984A" },
251 { HDA_CODEC_AD1984B, 0, "Analog Devices AD1984B" },
252 { HDA_CODEC_AD1986A, 0, "Analog Devices AD1986A" },
253 { HDA_CODEC_AD1987, 0, "Analog Devices AD1987" },
254 { HDA_CODEC_AD1988, 0, "Analog Devices AD1988A" },
255 { HDA_CODEC_AD1988B, 0, "Analog Devices AD1988B" },
256 { HDA_CODEC_AD1989A, 0, "Analog Devices AD1989A" },
257 { HDA_CODEC_AD1989B, 0, "Analog Devices AD1989B" },
258 { HDA_CODEC_CA0110, 0, "Creative CA0110-IBG" },
259 { HDA_CODEC_CA0110_2, 0, "Creative CA0110-IBG" },
260 { HDA_CODEC_CA0132, 0, "Creative CA0132" },
261 { HDA_CODEC_SB0880, 0, "Creative SB0880 X-Fi" },
262 { HDA_CODEC_CMI9880, 0, "CMedia CMI9880" },
263 { HDA_CODEC_CMI98802, 0, "CMedia CMI9880" },
264 { HDA_CODEC_CXD9872RDK, 0, "Sigmatel CXD9872RD/K" },
265 { HDA_CODEC_CXD9872AKD, 0, "Sigmatel CXD9872AKD" },
266 { HDA_CODEC_STAC9200D, 0, "Sigmatel STAC9200D" },
267 { HDA_CODEC_STAC9204X, 0, "Sigmatel STAC9204X" },
268 { HDA_CODEC_STAC9204D, 0, "Sigmatel STAC9204D" },
269 { HDA_CODEC_STAC9205X, 0, "Sigmatel STAC9205X" },
270 { HDA_CODEC_STAC9205D, 0, "Sigmatel STAC9205D" },
271 { HDA_CODEC_STAC9220, 0, "Sigmatel STAC9220" },
272 { HDA_CODEC_STAC9220_A1, 0, "Sigmatel STAC9220_A1" },
273 { HDA_CODEC_STAC9220_A2, 0, "Sigmatel STAC9220_A2" },
274 { HDA_CODEC_STAC9221, 0, "Sigmatel STAC9221" },
275 { HDA_CODEC_STAC9221_A2, 0, "Sigmatel STAC9221_A2" },
276 { HDA_CODEC_STAC9221D, 0, "Sigmatel STAC9221D" },
277 { HDA_CODEC_STAC922XD, 0, "Sigmatel STAC9220D/9223D" },
278 { HDA_CODEC_STAC9227X, 0, "Sigmatel STAC9227X" },
279 { HDA_CODEC_STAC9227D, 0, "Sigmatel STAC9227D" },
280 { HDA_CODEC_STAC9228X, 0, "Sigmatel STAC9228X" },
281 { HDA_CODEC_STAC9228D, 0, "Sigmatel STAC9228D" },
282 { HDA_CODEC_STAC9229X, 0, "Sigmatel STAC9229X" },
283 { HDA_CODEC_STAC9229D, 0, "Sigmatel STAC9229D" },
284 { HDA_CODEC_STAC9230X, 0, "Sigmatel STAC9230X" },
285 { HDA_CODEC_STAC9230D, 0, "Sigmatel STAC9230D" },
286 { HDA_CODEC_STAC9250, 0, "Sigmatel STAC9250" },
287 { HDA_CODEC_STAC9251, 0, "Sigmatel STAC9251" },
288 { HDA_CODEC_STAC9255, 0, "Sigmatel STAC9255" },
289 { HDA_CODEC_STAC9255D, 0, "Sigmatel STAC9255D" },
290 { HDA_CODEC_STAC9254, 0, "Sigmatel STAC9254" },
291 { HDA_CODEC_STAC9254D, 0, "Sigmatel STAC9254D" },
292 { HDA_CODEC_STAC9271X, 0, "Sigmatel STAC9271X" },
293 { HDA_CODEC_STAC9271D, 0, "Sigmatel STAC9271D" },
294 { HDA_CODEC_STAC9272X, 0, "Sigmatel STAC9272X" },
295 { HDA_CODEC_STAC9272D, 0, "Sigmatel STAC9272D" },
296 { HDA_CODEC_STAC9273X, 0, "Sigmatel STAC9273X" },
297 { HDA_CODEC_STAC9273D, 0, "Sigmatel STAC9273D" },
298 { HDA_CODEC_STAC9274, 0, "Sigmatel STAC9274" },
299 { HDA_CODEC_STAC9274D, 0, "Sigmatel STAC9274D" },
300 { HDA_CODEC_STAC9274X5NH, 0, "Sigmatel STAC9274X5NH" },
301 { HDA_CODEC_STAC9274D5NH, 0, "Sigmatel STAC9274D5NH" },
302 { HDA_CODEC_STAC9872AK, 0, "Sigmatel STAC9872AK" },
303 { HDA_CODEC_IDT92HD005, 0, "IDT 92HD005" },
304 { HDA_CODEC_IDT92HD005D, 0, "IDT 92HD005D" },
305 { HDA_CODEC_IDT92HD206X, 0, "IDT 92HD206X" },
306 { HDA_CODEC_IDT92HD206D, 0, "IDT 92HD206D" },
307 { HDA_CODEC_IDT92HD66B1X5, 0, "IDT 92HD66B1X5" },
308 { HDA_CODEC_IDT92HD66B2X5, 0, "IDT 92HD66B2X5" },
309 { HDA_CODEC_IDT92HD66B3X5, 0, "IDT 92HD66B3X5" },
310 { HDA_CODEC_IDT92HD66C1X5, 0, "IDT 92HD66C1X5" },
311 { HDA_CODEC_IDT92HD66C2X5, 0, "IDT 92HD66C2X5" },
312 { HDA_CODEC_IDT92HD66C3X5, 0, "IDT 92HD66C3X5" },
313 { HDA_CODEC_IDT92HD66B1X3, 0, "IDT 92HD66B1X3" },
314 { HDA_CODEC_IDT92HD66B2X3, 0, "IDT 92HD66B2X3" },
315 { HDA_CODEC_IDT92HD66B3X3, 0, "IDT 92HD66B3X3" },
316 { HDA_CODEC_IDT92HD66C1X3, 0, "IDT 92HD66C1X3" },
317 { HDA_CODEC_IDT92HD66C2X3, 0, "IDT 92HD66C2X3" },
318 { HDA_CODEC_IDT92HD66C3_65, 0, "IDT 92HD66C3_65" },
319 { HDA_CODEC_IDT92HD700X, 0, "IDT 92HD700X" },
320 { HDA_CODEC_IDT92HD700D, 0, "IDT 92HD700D" },
321 { HDA_CODEC_IDT92HD71B5, 0, "IDT 92HD71B5" },
322 { HDA_CODEC_IDT92HD71B5_2, 0, "IDT 92HD71B5" },
323 { HDA_CODEC_IDT92HD71B6, 0, "IDT 92HD71B6" },
324 { HDA_CODEC_IDT92HD71B6_2, 0, "IDT 92HD71B6" },
325 { HDA_CODEC_IDT92HD71B7, 0, "IDT 92HD71B7" },
326 { HDA_CODEC_IDT92HD71B7_2, 0, "IDT 92HD71B7" },
327 { HDA_CODEC_IDT92HD71B8, 0, "IDT 92HD71B8" },
328 { HDA_CODEC_IDT92HD71B8_2, 0, "IDT 92HD71B8" },
329 { HDA_CODEC_IDT92HD73C1, 0, "IDT 92HD73C1" },
330 { HDA_CODEC_IDT92HD73D1, 0, "IDT 92HD73D1" },
331 { HDA_CODEC_IDT92HD73E1, 0, "IDT 92HD73E1" },
332 { HDA_CODEC_IDT92HD75B3, 0, "IDT 92HD75B3" },
333 { HDA_CODEC_IDT92HD75BX, 0, "IDT 92HD75BX" },
334 { HDA_CODEC_IDT92HD81B1C, 0, "IDT 92HD81B1C" },
335 { HDA_CODEC_IDT92HD81B1X, 0, "IDT 92HD81B1X" },
336 { HDA_CODEC_IDT92HD83C1C, 0, "IDT 92HD83C1C" },
337 { HDA_CODEC_IDT92HD83C1X, 0, "IDT 92HD83C1X" },
338 { HDA_CODEC_IDT92HD87B1_3, 0, "IDT 92HD87B1/3" },
339 { HDA_CODEC_IDT92HD87B2_4, 0, "IDT 92HD87B2/4" },
340 { HDA_CODEC_IDT92HD89C3, 0, "IDT 92HD89C3" },
341 { HDA_CODEC_IDT92HD89C2, 0, "IDT 92HD89C2" },
342 { HDA_CODEC_IDT92HD89C1, 0, "IDT 92HD89C1" },
343 { HDA_CODEC_IDT92HD89B3, 0, "IDT 92HD89B3" },
344 { HDA_CODEC_IDT92HD89B2, 0, "IDT 92HD89B2" },
345 { HDA_CODEC_IDT92HD89B1, 0, "IDT 92HD89B1" },
346 { HDA_CODEC_IDT92HD89E3, 0, "IDT 92HD89E3" },
347 { HDA_CODEC_IDT92HD89E2, 0, "IDT 92HD89E2" },
348 { HDA_CODEC_IDT92HD89E1, 0, "IDT 92HD89E1" },
349 { HDA_CODEC_IDT92HD89D3, 0, "IDT 92HD89D3" },
350 { HDA_CODEC_IDT92HD89D2, 0, "IDT 92HD89D2" },
351 { HDA_CODEC_IDT92HD89D1, 0, "IDT 92HD89D1" },
352 { HDA_CODEC_IDT92HD89F3, 0, "IDT 92HD89F3" },
353 { HDA_CODEC_IDT92HD89F2, 0, "IDT 92HD89F2" },
354 { HDA_CODEC_IDT92HD89F1, 0, "IDT 92HD89F1" },
355 { HDA_CODEC_IDT92HD90BXX, 0, "IDT 92HD90BXX" },
356 { HDA_CODEC_IDT92HD91BXX, 0, "IDT 92HD91BXX" },
357 { HDA_CODEC_IDT92HD93BXX, 0, "IDT 92HD93BXX" },
358 { HDA_CODEC_IDT92HD98BXX, 0, "IDT 92HD98BXX" },
359 { HDA_CODEC_IDT92HD99BXX, 0, "IDT 92HD99BXX" },
360 { HDA_CODEC_CX20549, 0, "Conexant CX20549 (Venice)" },
361 { HDA_CODEC_CX20551, 0, "Conexant CX20551 (Waikiki)" },
362 { HDA_CODEC_CX20561, 0, "Conexant CX20561 (Hermosa)" },
363 { HDA_CODEC_CX20582, 0, "Conexant CX20582 (Pebble)" },
364 { HDA_CODEC_CX20583, 0, "Conexant CX20583 (Pebble HSF)" },
365 { HDA_CODEC_CX20584, 0, "Conexant CX20584" },
366 { HDA_CODEC_CX20585, 0, "Conexant CX20585" },
367 { HDA_CODEC_CX20588, 0, "Conexant CX20588" },
368 { HDA_CODEC_CX20590, 0, "Conexant CX20590" },
369 { HDA_CODEC_CX20631, 0, "Conexant CX20631" },
370 { HDA_CODEC_CX20632, 0, "Conexant CX20632" },
371 { HDA_CODEC_CX20641, 0, "Conexant CX20641" },
372 { HDA_CODEC_CX20642, 0, "Conexant CX20642" },
373 { HDA_CODEC_CX20651, 0, "Conexant CX20651" },
374 { HDA_CODEC_CX20652, 0, "Conexant CX20652" },
375 { HDA_CODEC_CX20664, 0, "Conexant CX20664" },
376 { HDA_CODEC_CX20665, 0, "Conexant CX20665" },
377 { HDA_CODEC_VT1708_8, 0, "VIA VT1708_8" },
378 { HDA_CODEC_VT1708_9, 0, "VIA VT1708_9" },
379 { HDA_CODEC_VT1708_A, 0, "VIA VT1708_A" },
380 { HDA_CODEC_VT1708_B, 0, "VIA VT1708_B" },
381 { HDA_CODEC_VT1709_0, 0, "VIA VT1709_0" },
382 { HDA_CODEC_VT1709_1, 0, "VIA VT1709_1" },
383 { HDA_CODEC_VT1709_2, 0, "VIA VT1709_2" },
384 { HDA_CODEC_VT1709_3, 0, "VIA VT1709_3" },
385 { HDA_CODEC_VT1709_4, 0, "VIA VT1709_4" },
386 { HDA_CODEC_VT1709_5, 0, "VIA VT1709_5" },
387 { HDA_CODEC_VT1709_6, 0, "VIA VT1709_6" },
388 { HDA_CODEC_VT1709_7, 0, "VIA VT1709_7" },
389 { HDA_CODEC_VT1708B_0, 0, "VIA VT1708B_0" },
390 { HDA_CODEC_VT1708B_1, 0, "VIA VT1708B_1" },
391 { HDA_CODEC_VT1708B_2, 0, "VIA VT1708B_2" },
392 { HDA_CODEC_VT1708B_3, 0, "VIA VT1708B_3" },
393 { HDA_CODEC_VT1708B_4, 0, "VIA VT1708B_4" },
394 { HDA_CODEC_VT1708B_5, 0, "VIA VT1708B_5" },
395 { HDA_CODEC_VT1708B_6, 0, "VIA VT1708B_6" },
396 { HDA_CODEC_VT1708B_7, 0, "VIA VT1708B_7" },
397 { HDA_CODEC_VT1708S_0, 0, "VIA VT1708S_0" },
398 { HDA_CODEC_VT1708S_1, 0, "VIA VT1708S_1" },
399 { HDA_CODEC_VT1708S_2, 0, "VIA VT1708S_2" },
400 { HDA_CODEC_VT1708S_3, 0, "VIA VT1708S_3" },
401 { HDA_CODEC_VT1708S_4, 0, "VIA VT1708S_4" },
402 { HDA_CODEC_VT1708S_5, 0, "VIA VT1708S_5" },
403 { HDA_CODEC_VT1708S_6, 0, "VIA VT1708S_6" },
404 { HDA_CODEC_VT1708S_7, 0, "VIA VT1708S_7" },
405 { HDA_CODEC_VT1702_0, 0, "VIA VT1702_0" },
406 { HDA_CODEC_VT1702_1, 0, "VIA VT1702_1" },
407 { HDA_CODEC_VT1702_2, 0, "VIA VT1702_2" },
408 { HDA_CODEC_VT1702_3, 0, "VIA VT1702_3" },
409 { HDA_CODEC_VT1702_4, 0, "VIA VT1702_4" },
410 { HDA_CODEC_VT1702_5, 0, "VIA VT1702_5" },
411 { HDA_CODEC_VT1702_6, 0, "VIA VT1702_6" },
412 { HDA_CODEC_VT1702_7, 0, "VIA VT1702_7" },
413 { HDA_CODEC_VT1716S_0, 0, "VIA VT1716S_0" },
414 { HDA_CODEC_VT1716S_1, 0, "VIA VT1716S_1" },
415 { HDA_CODEC_VT1718S_0, 0, "VIA VT1718S_0" },
416 { HDA_CODEC_VT1718S_1, 0, "VIA VT1718S_1" },
417 { HDA_CODEC_VT1802_0, 0, "VIA VT1802_0" },
418 { HDA_CODEC_VT1802_1, 0, "VIA VT1802_1" },
419 { HDA_CODEC_VT1812, 0, "VIA VT1812" },
420 { HDA_CODEC_VT1818S, 0, "VIA VT1818S" },
421 { HDA_CODEC_VT1828S, 0, "VIA VT1828S" },
422 { HDA_CODEC_VT2002P_0, 0, "VIA VT2002P_0" },
423 { HDA_CODEC_VT2002P_1, 0, "VIA VT2002P_1" },
424 { HDA_CODEC_VT2020, 0, "VIA VT2020" },
425 { HDA_CODEC_ATIRS600_1, 0, "ATI RS600" },
426 { HDA_CODEC_ATIRS600_2, 0, "ATI RS600" },
427 { HDA_CODEC_ATIRS690, 0, "ATI RS690/780" },
428 { HDA_CODEC_ATIR6XX, 0, "ATI R6xx" },
429 { HDA_CODEC_NVIDIAMCP67, 0, "NVIDIA MCP67" },
430 { HDA_CODEC_NVIDIAMCP73, 0, "NVIDIA MCP73" },
431 { HDA_CODEC_NVIDIAMCP78, 0, "NVIDIA MCP78" },
432 { HDA_CODEC_NVIDIAMCP78_2, 0, "NVIDIA MCP78" },
433 { HDA_CODEC_NVIDIAMCP78_3, 0, "NVIDIA MCP78" },
434 { HDA_CODEC_NVIDIAMCP78_4, 0, "NVIDIA MCP78" },
435 { HDA_CODEC_NVIDIAMCP7A, 0, "NVIDIA MCP7A" },
436 { HDA_CODEC_NVIDIAGT220, 0, "NVIDIA GT220" },
437 { HDA_CODEC_NVIDIAGT21X, 0, "NVIDIA GT21x" },
438 { HDA_CODEC_NVIDIAMCP89, 0, "NVIDIA MCP89" },
439 { HDA_CODEC_NVIDIAGT240, 0, "NVIDIA GT240" },
440 { HDA_CODEC_NVIDIAGTS450, 0, "NVIDIA GTS450" },
441 { HDA_CODEC_NVIDIAGT440, 0, "NVIDIA GT440" },
442 { HDA_CODEC_NVIDIAGTX550, 0, "NVIDIA GTX550" },
443 { HDA_CODEC_NVIDIAGTX570, 0, "NVIDIA GTX570" },
444 { HDA_CODEC_INTELIP, 0, "Intel Ibex Peak" },
445 { HDA_CODEC_INTELBL, 0, "Intel Bearlake" },
446 { HDA_CODEC_INTELCA, 0, "Intel Cantiga" },
447 { HDA_CODEC_INTELEL, 0, "Intel Eaglelake" },
448 { HDA_CODEC_INTELIP2, 0, "Intel Ibex Peak" },
449 { HDA_CODEC_INTELCPT, 0, "Intel Cougar Point" },
450 { HDA_CODEC_INTELPPT, 0, "Intel Panther Point" },
451 { HDA_CODEC_INTELCL, 0, "Intel Crestline" },
452 { HDA_CODEC_SII1390, 0, "Silicon Image SiI1390" },
453 { HDA_CODEC_SII1392, 0, "Silicon Image SiI1392" },
454 // Unknown CODECs
455 { HDA_CODEC_ADXXXX, 0, "Analog Devices" },
456 { HDA_CODEC_AGEREXXXX, 0, "Lucent/Agere Systems" },
457 { HDA_CODEC_ALCXXXX, 0, "Realtek" },
458 { HDA_CODEC_ATIXXXX, 0, "ATI" },
459 { HDA_CODEC_CAXXXX, 0, "Creative" },
460 { HDA_CODEC_CMIXXXX, 0, "CMedia" },
461 { HDA_CODEC_CMIXXXX2, 0, "CMedia" },
462 { HDA_CODEC_CSXXXX, 0, "Cirrus Logic" },
463 { HDA_CODEC_CXXXXX, 0, "Conexant" },
464 { HDA_CODEC_CHXXXX, 0, "Chrontel" },
465 { HDA_CODEC_IDTXXXX, 0, "IDT" },
466 { HDA_CODEC_INTELXXXX, 0, "Intel" },
467 { HDA_CODEC_MOTOXXXX, 0, "Motorola" },
468 { HDA_CODEC_NVIDIAXXXX, 0, "NVIDIA" },
469 { HDA_CODEC_SIIXXXX, 0, "Silicon Image" },
470 { HDA_CODEC_STACXXXX, 0, "Sigmatel" },
471 { HDA_CODEC_VTXXXX, 0, "VIA" },
472};
473#define HDACC_CODECS_LEN (sizeof(know_codecs) / sizeof(know_codecs[0]))
474*/
475
476/*****************
477 * Device Methods
478 *****************/
479
480/* get HDA device name */
481static char *get_hda_controller_name(uint16_t controller_device_id, uint16_t controller_vendor_id)
482{
483static char desc[128];
484
485const char* name_format = "Unknown HD Audio device %s";
486uint32_t controller_model = ((controller_device_id << 16) | controller_vendor_id);
487int i;
488
489/* Get format for vendor ID */
490switch (controller_vendor_id)
491{
492case ATI_VENDORID:
493name_format = "ATI %s HDA Controller (HDMi)"; break;
494
495case INTEL_VENDORID:
496name_format = "Intel %s High Definition Audio Controller"; break;
497
498case NVIDIA_VENDORID:
499name_format = "nVidia %s HDA Controller (HDMi)"; break;
500
501case RDC_VENDORID:
502name_format = "RDC %s High Definition Audio Controller"; break;
503
504case SIS_VENDORID:
505name_format = "SiS %s HDA Controller"; break;
506
507case ULI_VENDORID:
508name_format = "ULI %s HDA Controller"; break;
509
510case VIA_VENDORID:
511name_format = "VIA %s HDA Controller"; break;
512
513default:
514break;
515}
516
517for (i = 0; i < HDAC_DEVICES_LEN; i++)
518{
519if (know_hda_controller[i].model == controller_model)
520{
521snprintf(desc, sizeof(desc), name_format, know_hda_controller[i].desc);
522return desc;
523}
524}
525
526/* Not in table */
527snprintf(desc, sizeof(desc),
528"Unknown HD Audio device, vendor %04x, model %04x",
529controller_vendor_id, controller_device_id);
530return desc;
531}
532
533static int devprop_add_hda_template(struct DevPropDevice *device)
534{
535if (!device)
536{
537return 0;
538}
539devices_number++;
540
541return 1;
542}
543
544bool setup_hda_devprop(pci_dt_t *hda_dev)
545{
546structDevPropDevice*device = NULL;
547char*devicepath = NULL;
548char*controller_name = NULL;
549int len;
550uint8_tBuiltIn = 0x00;
551uint16_tcontroller_vendor_id = hda_dev->vendor_id;
552uint16_tcontroller_device_id = hda_dev->device_id;
553const char*value;
554
555devicepath = get_pci_dev_path(hda_dev);
556controller_name = get_hda_controller_name(controller_device_id, controller_vendor_id);
557
558if (!string)
559{
560string = devprop_create_string();
561if (!string)
562{
563return 0;
564}
565}
566
567if (!devicepath)
568{
569return 0;
570}
571
572device = devprop_add_device(string, devicepath);
573if (!device)
574{
575return 0;
576}
577devprop_add_hda_template(device);
578
579verbose("\n--------------------------------\n");
580verbose("- AUDIO DEVICE INFO -\n");
581verbose("--------------------------------\n");
582
583switch ((controller_device_id << 16) | controller_vendor_id)
584{
585
586/***********************************************************************
587* The above case are intended as for HDEF device at address 0x001B0000
588***********************************************************************/
589case HDA_INTEL_HASWELL:
590case HDA_INTEL_HASWELL2:
591case HDA_INTEL_CRYSTAL:
592case HDA_INTEL_CPT:
593case HDA_INTEL_PATSBURG:
594case HDA_INTEL_PPT1:
595case HDA_INTEL_82801F:
596case HDA_INTEL_63XXESB:
597case HDA_INTEL_82801G:
598case HDA_INTEL_82801H:
599case HDA_INTEL_82801I:
600case HDA_INTEL_82801JI:
601case HDA_INTEL_82801JD:
602case HDA_INTEL_PCH:
603case HDA_INTEL_PCH2:
604case HDA_INTEL_SCH:
605case HDA_INTEL_SCH2:
606case HDA_INTEL_LPT1:
607case HDA_INTEL_LPT2:
608case HDA_INTEL_LYNX:
609case HDA_INTEL_LYNX2:
610/* if the key value kHDEFLayoutID as a value set that value, if not will assign a default layout */
611if (getValueForKey(kHDEFLayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDEF_LEN * 2)
612{
613uint8_t new_HDEF_layout_id[HDEF_LEN];
614if (hex2bin(value, new_HDEF_layout_id, HDEF_LEN) == 0)
615{
616memcpy(default_HDEF_layout_id, new_HDEF_layout_id, HDEF_LEN);
617verbose("Using user supplied HDEF layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
618default_HDEF_layout_id[0], default_HDEF_layout_id[1], default_HDEF_layout_id[2], default_HDEF_layout_id[3]);
619}
620}
621else
622{
623verbose("Using default HDEF layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
624 default_HDEF_layout_id[0], default_HDEF_layout_id[1], default_HDEF_layout_id[2], default_HDEF_layout_id[3]);
625}
626devprop_add_value(device, "layout-id", default_HDEF_layout_id, HDEF_LEN);
627devprop_add_value(device, "AAPL,slot-name", (uint8_t *)"Built-in", 9); // 0x09
628devprop_add_value(device, "name", (uint8_t *)"audio", 6); // 0x06
629devprop_add_value(device, "device_type", (uint8_t *)"High Definition Audio", 22); // 0x16
630devprop_add_value(device, "built-in", &BuiltIn, 1);
631devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); // 0x0a
632// "AFGLowPowerState" = <03000000>
633break;
634
635/****************************************************************************************************************
636* The above case are intended as for HDAU (NVIDIA) device onboard audio for GFX card with Audio controller HDMi
637****************************************************************************************************************/
638case HDA_NVIDIA_GK107:
639case HDA_NVIDIA_GF114:
640case HDA_NVIDIA_GK106:
641case HDA_NVIDIA_GK104:
642case HDA_NVIDIA_GF110:
643case HDA_NVIDIA_GF119:
644case HDA_NVIDIA_GT116:
645case HDA_NVIDIA_GT104:
646case HDA_NVIDIA_GT108:
647case HDA_NVIDIA_GT106:
648case HDA_NVIDIA_GT100:
649case HDA_NVIDIA_0BE4:
650case HDA_NVIDIA_0BE3:
651case HDA_NVIDIA_0BE2:
652
653/* if the key value kHDAULayoutID as a value set that value, if not will assign a default layout */
654if (getValueForKey(kHDAULayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDAU_LEN * 2)
655{
656uint8_t new_HDAU_layout_id[HDAU_LEN];
657if (hex2bin(value, new_HDAU_layout_id, HDAU_LEN) == 0)
658{
659memcpy(default_HDAU_layout_id, new_HDAU_layout_id, HDAU_LEN);
660verbose("Using user supplied HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
661 default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
662}
663}
664else
665{
666verbose("Using default HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
667 default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
668}
669
670 devprop_add_value(device, "layout-id", default_HDAU_layout_id, HDAU_LEN); /*FIX ME*/
671 devprop_add_value(device, "@0,connector-type", connector_type_value, 4);
672 devprop_add_value(device, "@1,connector-type", connector_type_value, 4);
673 devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-2", 10);
674 devprop_add_value(device, "built-in", &BuiltIn, 1);
675 break;
676
677/*************************************************************************************************************
678* The above case are intended as for HDAU (ATi) device onboard audio for GFX card with Audio controller HDMi
679*************************************************************************************************************/
680case HDA_ATI_SB450:
681case HDA_ATI_SB600:
682case HDA_ATI_RS600:
683case HDA_ATI_RS690:
684case HDA_ATI_RS780:
685case HDA_ATI_R600:
686case HDA_ATI_RV630:
687case HDA_ATI_RV610:
688case HDA_ATI_RV670:
689case HDA_ATI_RV635:
690case HDA_ATI_RV620:
691case HDA_ATI_RV770:
692case HDA_ATI_RV730:
693case HDA_ATI_RV710:
694case HDA_ATI_RV740:
695case HDA_ATI_RV870:
696case HDA_ATI_RV840:
697case HDA_ATI_RV830:
698case HDA_ATI_RV810:
699case HDA_ATI_RV970:
700case HDA_ATI_RV940:
701case HDA_ATI_RV930:
702case HDA_ATI_RV910:
703case HDA_ATI_R1000:
704case HDA_ATI_VERDE:
705
706 /* if the key value kHDAULayoutID as a value set that value, if not will assign a default layout */
707 if (getValueForKey(kHDAULayoutID, &value, &len, &bootInfo->chameleonConfig) && len == HDAU_LEN * 2)
708 {
709 uint8_t new_HDAU_layout_id[HDAU_LEN];
710 if (hex2bin(value, new_HDAU_layout_id, HDAU_LEN) == 0)
711 {
712 memcpy(default_HDAU_layout_id, new_HDAU_layout_id, HDAU_LEN);
713 verbose("Using user supplied HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
714 default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
715 }
716}
717else
718{
719verbose("Using default HDAU layout-id: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
720 default_HDAU_layout_id[0], default_HDAU_layout_id[1], default_HDAU_layout_id[2], default_HDAU_layout_id[3]);
721 }
722
723 devprop_add_value(device, "layout-id", default_HDAU_layout_id, HDAU_LEN); /*FIX ME*/
724 devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-2", 10);
725 devprop_add_value(device, "built-in", &BuiltIn, 1);
726 break;
727
728 default:
729 break;
730}
731
732verbose("Class code: [%04x]\nModel name: %s [%04x:%04x] (rev %02x)\nSubsystem: [%04x:%04x]\n%s\ndevice number: %d\n",
733hda_dev->class_id, controller_name, hda_dev->vendor_id, hda_dev->device_id, hda_dev->revision_id,
734hda_dev->subsys_id.subsys.vendor_id, hda_dev->subsys_id.subsys.device_id, devicepath, devices_number);
735
736verbose("--------------------------------\n");
737
738stringdata = malloc(sizeof(uint8_t) * string->length);
739memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
740stringlength = string->length;
741
742return true;
743}
744

Archive Download this file

Revision: 2839