Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Modules/i386/modules/NVIDIAGraphicsEnabler/nvidia.c

1/*
2 *NVidia injector
3 *
4 *Copyright (C) 2009Jasmin Fazlic, iNDi
5 *
6 *NVidia injector is free software: you can redistribute it and/or modify
7 *it under the terms of the GNU General Public License as published by
8 *the Free Software Foundation, either version 3 of the License, or
9 *(at your option) any later version.
10 *
11 *NVidia driver and injector is distributed in the hope that it will be useful,
12 *but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *GNU General Public License for more details.
15 *
16 *You should have received a copy of the GNU General Public License
17 *along with NVidia injector. If not, see <http://www.gnu.org/licenses/>.
18 */
19/*
20 * Alternatively you can choose to comply with APSL
21 */
22
23
24/*
25 * DCB-Table parsing is based on software (nouveau driver) originally distributed under following license:
26 *
27 *
28 * Copyright 2005-2006 Erik Waling
29 * Copyright 2006 Stephane Marchesin
30 * Copyright 2007-2009 Stuart Bennett
31 *
32 * Permission is hereby granted, free of charge, to any person obtaining a
33 * copy of this software and associated documentation files (the "Software"),
34 * to deal in the Software without restriction, including without limitation
35 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
36 * and/or sell copies of the Software, and to permit persons to whom the
37 * Software is furnished to do so, subject to the following conditions:
38 *
39 * The above copyright notice and this permission notice shall be included in
40 * all copies or substantial portions of the Software.
41 *
42 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
43 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
44 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
45 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
46 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
47 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
48 * SOFTWARE.
49 */
50
51//#include "boot.h"
52#include "libsa.h"
53#include "saio_internal.h"
54#include "bootstruct.h"
55#include "pci.h"
56#include "platform.h"
57#include "device_inject.h"
58#include "nvidia.h"
59
60#ifndef DEBUG_NVIDIA
61#define DEBUG_NVIDIA 0
62#endif
63
64#if DEBUG_NVIDIA
65#define DBG(x...)printf(x)
66#else
67#define DBG(x...)
68#endif
69
70#define kUseNvidiaROM"UseNvidiaROM"
71#define kVBIOS"VBIOS"
72#define kDcfg0"display_0"
73#define kDcfg1"display_1"
74
75#define NVIDIA_ROM_SIZE0x10000
76#define PATCH_ROM_SUCCESS1
77#define PATCH_ROM_SUCCESS_HAS_LVDS2
78#define PATCH_ROM_FAILED0
79#define MAX_NUM_DCB_ENTRIES16
80#define TYPE_GROUPED0xff
81
82extern uint32_t devices_number;
83
84const char *nvidia_compatible_0[] ={ "@0,compatible","NVDA,NVMac" };
85const char *nvidia_compatible_1[] ={ "@1,compatible","NVDA,NVMac" };
86const char *nvidia_device_type_0[] ={ "@0,device_type", "display" };
87const char *nvidia_device_type_1[] ={ "@1,device_type", "display" };
88const char *nvidia_device_type[] ={ "device_type","NVDA,Parent" };
89const char *nvidia_device_type_child[]={ "device_type","NVDA,Child" };
90const char *nvidia_name_0[] ={ "@0,name","NVDA,Display-A" };
91const char *nvidia_name_1[] ={ "@1,name","NVDA,Display-B" };
92const char *nvidia_slot_name[] ={ "AAPL,slot-name", "Slot-1" };
93
94static uint8_t default_NVCAP[]= {
950x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00,
960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
970x00, 0x00, 0x00, 0x00
98};
99
100#define NVCAP_LEN ( sizeof(default_NVCAP) / sizeof(uint8_t) )
101
102static uint8_t default_dcfg_0[]={0xff, 0xff, 0xff, 0xff};
103static uint8_t default_dcfg_1[]={0xff, 0xff, 0xff, 0xff};
104
105// uint8_t display_cfg_0[]={0x03, 0x01, 0x03, 0x00};
106// uint8_t display_cfg_1[]={0xff, 0xff, 0x00, 0x01};
107// uint8_t connector_type_1[]={0x00, 0x08, 0x00, 0x00};
108
109#define DCFG0_LEN ( sizeof(default_dcfg_0) / sizeof(uint8_t) )
110#define DCFG1_LEN ( sizeof(default_dcfg_1) / sizeof(uint8_t) )
111
112static uint8_t default_NVPM[]= {
113 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00
117};
118
119#define NVPM_LEN ( sizeof(default_NVPM) / sizeof(uint8_t) )
120
121static struct nv_chipsets_t NVKnownChipsets[] = {
122{ 0x00000000, "Unknown" },
123//========================================
124// 0000 - 0040
125//{ 0x10DE0001, "NVIDIA HDMI Audio" },
126//{ 0x10DE0002, "NVIDIA HDMI Audio" },
127//{ 0x10DE0003, "NVIDIA HDMI Audio" },
128//{ 0x10DE0005, "NVIDIA HDMI Audio" },
129//{ 0x10DE0006, "NVIDIA HDMI Audio" },
130//{ 0x10DE0007, "NVIDIA HDMI Audio" },
131//{ 0x10DE0008, "NVIDIA HDMI Audio" },
132//{ 0x10DE0009, "NVIDIA HDMI Audio" },
133//{ 0x10DE000A, "NVIDIA HDMI Audio" },
134//{ 0x10DE000B, "NVIDIA HDMI Audio" },
135//{ 0x10DE000C, "NVIDIA HDMI Audio" },
136//{ 0x10DE000D, "NVIDIA HDMI Audio" },
137//{ 0x10DE0010, "NVIDIA HDMI Audio" },
138//{ 0x10DE0011, "NVIDIA HDMI Audio" },
139//{ 0x10DE0012, "NVIDIA HDMI Audio" },
140//{ 0x10DE0014, "NVIDIA HDMI Audio" },
141//{ 0x10DE0018, "NVIDIA HDMI Audio" },
142// 0040 - 004F
143{ 0x10DE0040, "GeForce 6800 Ultra" },
144{ 0x10DE0041, "GeForce 6800" },
145{ 0x10DE0042, "GeForce 6800 LE" },
146{ 0x10DE0043, "GeForce 6800 XE" },
147{ 0x10DE0044, "GeForce 6800 XT" },
148{ 0x10DE0045, "GeForce 6800 GT" },
149{ 0x10DE0046, "GeForce 6800 GT" },
150{ 0x10DE0047, "GeForce 6800 GS" },
151{ 0x10DE0048, "GeForce 6800 XT" },
152{ 0x10DE004D, "Quadro FX 3400" },
153{ 0x10DE004E, "Quadro FX 4000" },
154// 0050 - 005F
155//{ 0x10DE0059, "CK804 AC'97 Audio Controller" },
156// 0060 - 006F
157//{ 0x10DE006A, "nForce2 AC97 Audio Controler (MCP)" },
158//{ 0x10DE0067, "NVIDIA HDMI Audio" },
159//{ 0x10DE0073, "NVIDIA HDMI Audio" },
160// 0070 - 007F
161// 0080 - 008F
162// 0090 - 009F
163{ 0x10DE0090, "GeForce 7800 GTX" },
164{ 0x10DE0091, "GeForce 7800 GTX" },
165{ 0x10DE0092, "GeForce 7800 GT" },
166{ 0x10DE0093, "GeForce 7800 GS" },
167{ 0x10DE0095, "GeForce 7800 SLI" },
168{ 0x10DE0098, "GeForce Go 7800" },
169{ 0x10DE0099, "GeForce Go 7800 GTX" },
170{ 0x10DE009D, "Quadro FX 4500" },
171// 00A0 - 00AF
172// 00B0 - 00BF
173// 00C0 - 00CF
174{ 0x10DE00C0, "GeForce 6800 GS" },
175{ 0x10DE00C1, "GeForce 6800" },
176{ 0x10DE00C2, "GeForce 6800 LE" },
177{ 0x10DE00C3, "GeForce 6800 XT" },
178{ 0x10DE00C8, "GeForce Go 6800" },
179{ 0x10DE00C9, "GeForce Go 6800 Ultra" },
180{ 0x10DE00CC, "Quadro FX Go1400" },
181{ 0x10DE00CD, "Quadro FX 3450/4000 SDI" },
182{ 0x10DE00CE, "Quadro FX 1400" },
183//{ 0x10DE00DA, "nForce3 Audio" },
184// 00D0 - 00DF
185// 00E0 - 00EF
186// 00F0 - 00FF
187{ 0x10DE00F1, "GeForce 6600 GT" },
188{ 0x10DE00F2, "GeForce 6600" },
189{ 0x10DE00F3, "GeForce 6200" },
190{ 0x10DE00F4, "GeForce 6600 LE" },
191{ 0x10DE00F5, "GeForce 7800 GS" },
192{ 0x10DE00F6, "GeForce 6800 GS/XT" },
193{ 0x10DE00F8, "Quadro FX 3400/4400" },
194{ 0x10DE00F9, "GeForce 6800 Series GPU" },
195// 0100 - 010F
196// 0110 - 011F
197// 0120 - 012F
198// 0130 - 013F
199// 0140 - 014F
200{ 0x10DE0140, "GeForce 6600 GT" },
201{ 0x10DE0141, "GeForce 6600" },
202{ 0x10DE0142, "GeForce 6600 LE" },
203{ 0x10DE0143, "GeForce 6600 VE" },
204{ 0x10DE0144, "GeForce Go 6600" },
205{ 0x10DE0145, "GeForce 6610 XL" },
206{ 0x10DE0146, "GeForce Go 6600 TE/6200 TE" },
207{ 0x10DE0147, "GeForce 6700 XL" },
208{ 0x10DE0148, "GeForce Go 6600" },
209{ 0x10DE0149, "GeForce Go 6600 GT" },
210{ 0x10DE014A, "Quadro NVS 440" },
211{ 0x10DE014C, "Quadro FX 550" },
212{ 0x10DE014D, "Quadro FX 550" },
213{ 0x10DE014E, "Quadro FX 540" },
214{ 0x10DE014F, "GeForce 6200" },
215// 0150 - 015F
216// 0160 - 016F
217{ 0x10DE0160, "GeForce 6500" },
218{ 0x10DE0161, "GeForce 6200 TurboCache(TM)" },
219{ 0x10DE0162, "GeForce 6200SE TurboCache(TM)" },
220{ 0x10DE0163, "GeForce 6200 LE" },
221{ 0x10DE0164, "GeForce Go 6200" },
222{ 0x10DE0165, "Quadro NVS 285" },
223{ 0x10DE0166, "GeForce Go 6400" },
224{ 0x10DE0167, "GeForce Go 6200" },
225{ 0x10DE0168, "GeForce Go 6400" },
226{ 0x10DE0169, "GeForce 6250" },
227{ 0x10DE016A, "GeForce 7100 GS" },
228{ 0x10DE016C, "NVIDIA NV44GLM" }, //
229{ 0x10DE016D, "NVIDIA NV44GLM" }, //
230// 0170 - 017F
231// 0180 - 018F
232// 0190 - 019F
233{ 0x10DE0191, "GeForce 8800 GTX" },
234{ 0x10DE0193, "GeForce 8800 GTS" },
235{ 0x10DE0194, "GeForce 8800 Ultra" },
236{ 0x10DE0197, "Tesla C870" },
237{ 0x10DE019D, "Quadro FX 5600" },
238{ 0x10DE019E, "Quadro FX 4600" },
239// 01A0 - 01AF
240// 01B0 - 01BF
241//{ 0x10DE01B1, "nForce AC'97 Audio Controller" },
242// 01C0 - 01CF
243// 01D0 - 01DF
244{ 0x10DE01D0, "GeForce 7350 LE" },
245{ 0x10DE01D1, "GeForce 7300 LE" },
246{ 0x10DE01D2, "GeForce 7550 LE" },
247{ 0x10DE01D3, "GeForce 7300 SE/7200 GS" },
248{ 0x10DE01D6, "GeForce Go 7200" },
249{ 0x10DE01D7, "GeForce Go 7300" },
250{ 0x10DE01D8, "GeForce Go 7400" },
251{ 0x10DE01D9, "GeForce Go 7400 GS" },
252{ 0x10DE01DA, "Quadro NVS 110M" },
253{ 0x10DE01DB, "Quadro NVS 120M" },
254{ 0x10DE01DC, "Quadro FX 350M" },
255{ 0x10DE01DD, "GeForce 7500 LE" },
256{ 0x10DE01DE, "Quadro FX 350" },
257{ 0x10DE01DF, "GeForce 7300 GS" },
258// 01E0 - 01EF
259// 01F0 - 01FF
260{ 0x10DE01F0, "GeForce4 MX" }, //
261// 0200 - 020F
262// 0210 - 021F
263{ 0x10DE0211, "GeForce 6800" },
264{ 0x10DE0212, "GeForce 6800 LE" },
265{ 0x10DE0215, "GeForce 6800 GT" },
266{ 0x10DE0218, "GeForce 6800 XT" },
267// 0220 - 022F
268{ 0x10DE0221, "GeForce 6200" },
269{ 0x10DE0222, "GeForce 6200 A-LE" },
270{ 0x10DE0228, "NVIDIA NV44M" }, //
271// 0230 - 023F
272// 0240 - 024F
273{ 0x10DE0240, "GeForce 6150" },
274{ 0x10DE0241, "GeForce 6150 LE" },
275{ 0x10DE0242, "GeForce 6100" },
276{ 0x10DE0243, "NVIDIA C51" }, //
277{ 0x10DE0244, "GeForce Go 6150" },
278{ 0x10DE0245, "Quadro NVS 210S / GeForce 6150LE" },
279{ 0x10DE0247, "GeForce Go 6100" },
280// 0250 - 025F
281{ 0x10DE025B, "Quadro4 700 XGL" }, //
282// 0260 - 026F
283// 0270 - 027F
284// 0280 - 028F
285// 0290 - 029F
286{ 0x10DE0290, "GeForce 7900 GTX" },
287{ 0x10DE0291, "GeForce 7900 GT/GTO" },
288{ 0x10DE0292, "GeForce 7900 GS" },
289{ 0x10DE0293, "GeForce 7950 GX2" },
290{ 0x10DE0294, "GeForce 7950 GX2" },
291{ 0x10DE0295, "GeForce 7950 GT" },
292{ 0x10DE0298, "GeForce Go 7900 GS" },
293{ 0x10DE0299, "GeForce Go 7900 GTX" },
294{ 0x10DE029A, "Quadro FX 2500M" },
295{ 0x10DE029B, "Quadro FX 1500M" },
296{ 0x10DE029C, "Quadro FX 5500" },
297{ 0x10DE029D, "Quadro FX 3500" },
298{ 0x10DE029E, "Quadro FX 1500" },
299{ 0x10DE029F, "Quadro FX 4500 X2" },
300// 02A0 - 02AF
301// 02B0 - 02BF
302// 02C0 - 02CF
303// 02D0 - 02DF
304// 02E0 - 02EF
305{ 0x10DE02E0, "GeForce 7600 GT" },
306{ 0x10DE02E1, "GeForce 7600 GS" },
307{ 0x10DE02E2, "GeForce 7300 GT" },
308{ 0x10DE02E3, "GeForce 7900 GS" },
309{ 0x10DE02E4, "GeForce 7950 GT" },
310// 02F0 - 02FF
311// 0300 - 030F
312{ 0x10DE0301, "GeForce FX 5800 Ultra" },
313{ 0x10DE0302, "GeForce FX 5800" },
314{ 0x10DE0308, "Quadro FX 2000" },
315{ 0x10DE0309, "Quadro FX 1000" },
316// 0310 - 031F
317{ 0x10DE0311, "GeForce FX 5600 Ultra" },
318{ 0x10DE0312, "GeForce FX 5600" },
319{ 0x10DE0314, "GeForce FX 5600XT" },
320{ 0x10DE031A, "GeForce FX Go5600" },
321{ 0x10DE031B, "GeForce FX Go5650" },
322{ 0x10DE031C, "Quadro FX Go700" },
323// 0320 - 032F
324{ 0x10DE0320, "GeForce FX 5200" }, //
325{ 0x10DE0321, "GeForce FX 5200 Ultra" }, //
326{ 0x10DE0322, "GeForce FX 5200" }, //
327{ 0x10DE0323, "GeForce FX 5200 LE" }, //
328{ 0x10DE0324, "GeForce FX Go5200" },
329{ 0x10DE0325, "GeForce FX Go5250" },
330{ 0x10DE0326, "GeForce FX 5500" },
331{ 0x10DE0328, "GeForce FX Go5200 32M/64M" },
332{ 0x10DE0329, "GeForce FX Go5200" }, //
333{ 0x10DE032A, "Quadro NVS 55/280 PCI" },
334{ 0x10DE032B, "Quadro FX 500/600 PCI" },
335{ 0x10DE032C, "GeForce FX Go53xx Series" },
336{ 0x10DE032D, "GeForce FX Go5100" },
337//{ 0x10DE032F, "NVIDIA NV34GL" },//
338// 0330 - 033F
339{ 0x10DE0330, "GeForce FX 5900 Ultra" },
340{ 0x10DE0331, "GeForce FX 5900" },
341{ 0x10DE0332, "GeForce FX 5900XT" },
342{ 0x10DE0333, "GeForce FX 5950 Ultra" },
343{ 0x10DE0334, "GeForce FX 5900ZT" },
344{ 0x10DE0338, "Quadro FX 3000" },
345{ 0x10DE033F, "Quadro FX 700" },
346// 0340 - 034F
347{ 0x10DE0341, "GeForce FX 5700 Ultra" },
348{ 0x10DE0342, "GeForce FX 5700" },
349{ 0x10DE0343, "GeForce FX 5700LE" },
350{ 0x10DE0344, "GeForce FX 5700VE" },
351//{ 0x10DE0345, "NVIDIA NV36.5" }, //
352{ 0x10DE0347, "GeForce FX Go5700" },
353{ 0x10DE0348, "GeForce FX Go5700" },
354//{ 0x10DE0349, "NVIDIA NV36M Pro" }, //
355//{ 0x10DE034B, "NVIDIA NV36MAP" }, //
356{ 0x10DE034C, "Quadro FX Go1000" },
357{ 0x10DE034E, "Quadro FX 1100" },
358//{ 0x10DE034F, "NVIDIA NV36GL" }, //
359// 0350 - 035F
360// 0360 - 036F
361// 0370 - 037F
362// 0380 - 038F
363{ 0x10DE038B, "GeForce 7650 GS" },
364// 0390 - 039F
365{ 0x10DE0390, "GeForce 7650 GS" },
366{ 0x10DE0391, "GeForce 7600 GT" },
367{ 0x10DE0392, "GeForce 7600 GS" },
368{ 0x10DE0393, "GeForce 7300 GT" },
369{ 0x10DE0394, "GeForce 7600 LE" },
370{ 0x10DE0395, "GeForce 7300 GT" },
371{ 0x10DE0397, "GeForce Go 7700" },
372{ 0x10DE0398, "GeForce Go 7600" },
373{ 0x10DE0399, "GeForce Go 7600 GT"},
374{ 0x10DE039A, "Quadro NVS 300M" },
375{ 0x10DE039B, "GeForce Go 7900 SE" },
376{ 0x10DE039C, "Quadro FX 560M" },
377{ 0x10DE039E, "Quadro FX 560" },
378// 03A0 - 03AF
379// 03B0 - 03BF
380// 03C0 - 03CF
381// 03D0 - 03DF
382{ 0x10DE03D0, "GeForce 6150SE nForce 430" },
383{ 0x10DE03D1, "GeForce 6100 nForce 405" },
384{ 0x10DE03D2, "GeForce 6100 nForce 400" },
385{ 0x10DE03D5, "GeForce 6100 nForce 420" },
386{ 0x10DE03D6, "GeForce 7025 / nForce 630a" },
387// 03E0 - 03EF
388// 03F0 - 03FF
389// 0400 - 040F
390{ 0x10DE0400, "GeForce 8600 GTS" },
391{ 0x10DE0401, "GeForce 8600 GT" },
392{ 0x10DE0402, "GeForce 8600 GT" },
393{ 0x10DE0403, "GeForce 8600 GS" },
394{ 0x10DE0404, "GeForce 8400 GS" },
395{ 0x10DE0405, "GeForce 9500M GS" },
396{ 0x10DE0406, "GeForce 8300 GS" },
397{ 0x10DE0407, "GeForce 8600M GT" },
398{ 0x10DE0408, "GeForce 9650M GS" },
399{ 0x10DE0409, "GeForce 8700M GT" },
400{ 0x10DE040A, "Quadro FX 370" },
401{ 0x10DE040B, "Quadro NVS 320M" },
402{ 0x10DE040C, "Quadro FX 570M" },
403{ 0x10DE040D, "Quadro FX 1600M" },
404{ 0x10DE040E, "Quadro FX 570" },
405{ 0x10DE040F, "Quadro FX 1700" },
406// 0410 - 041F
407{ 0x10DE0410, "GeForce GT 330" },
408// 0420 - 042F
409{ 0x10DE0420, "GeForce 8400 SE" },
410{ 0x10DE0421, "GeForce 8500 GT" },
411{ 0x10DE0422, "GeForce 8400 GS" },
412{ 0x10DE0423, "GeForce 8300 GS" },
413{ 0x10DE0424, "GeForce 8400 GS" },
414{ 0x10DE0425, "GeForce 8600M GS" },
415{ 0x10DE0426, "GeForce 8400M GT" },
416{ 0x10DE0427, "GeForce 8400M GS" },
417{ 0x10DE0428, "GeForce 8400M G" },
418{ 0x10DE0429, "Quadro NVS 140M" },
419{ 0x10DE042A, "Quadro NVS 130M" },
420{ 0x10DE042B, "Quadro NVS 135M" },
421{ 0x10DE042C, "GeForce 9400 GT" },
422{ 0x10DE042D, "Quadro FX 360M" },
423{ 0x10DE042E, "GeForce 9300M G" },
424{ 0x10DE042F, "Quadro NVS 290" },
425// 0430 - 043F
426// 0440 - 044F
427// 0450 - 045F
428// 0460 - 046F
429// 0470 - 047F
430// 0480 - 048F
431// 0490 - 049F
432// 04A0 - 04AF
433// 04B0 - 04BF
434// 04C0 - 04CF
435{ 0x10DE04C0, "NVIDIA G78" }, //
436{ 0x10DE04C1, "NVIDIA G78" }, //
437{ 0x10DE04C2, "NVIDIA G78" }, //
438{ 0x10DE04C3, "NVIDIA G78" }, //
439{ 0x10DE04C4, "NVIDIA G78" }, //
440{ 0x10DE04C5, "NVIDIA G78" }, //
441{ 0x10DE04C6, "NVIDIA G78" }, //
442{ 0x10DE04C7, "NVIDIA G78" }, //
443{ 0x10DE04C8, "NVIDIA G78" }, //
444{ 0x10DE04C9, "NVIDIA G78" }, //
445{ 0x10DE04CA, "NVIDIA G78" }, //
446{ 0x10DE04CB, "NVIDIA G78" }, //
447{ 0x10DE04CC, "NVIDIA G78" }, //
448{ 0x10DE04CD, "NVIDIA G78" }, //
449{ 0x10DE04CE, "NVIDIA G78" }, //
450{ 0x10DE04CF, "NVIDIA G78" }, //
451// 04D0 - 04DF
452// 04E0 - 04EF
453// 04F0 - 04FF
454// 0500 - 050F
455// 0510 - 051F
456// 0520 - 052F
457// 0530 - 053F
458{ 0x10DE0530, "GeForce 7190M / nForce 650M" },
459{ 0x10DE0531, "GeForce 7150M / nForce 630M" },
460{ 0x10DE0533, "GeForce 7000M / nForce 610M" },
461{ 0x10DE053A, "GeForce 7050 PV / nForce 630a" },
462{ 0x10DE053B, "GeForce 7050 PV / nForce 630a" },
463{ 0x10DE053E, "GeForce 7025 / nForce 630a" },
464// 0540 - 054F
465// 0550 - 055F
466// 0560 - 056F
467// 0570 - 057F
468// 0580 - 058F
469// 0590 - 059F
470// 05A0 - 05AF
471// 05B0 - 05BF
472// 05C0 - 05CF
473// 05D0 - 05DF
474// 05E0 - 05EF
475{ 0x10DE05E0, "GeForce GTX 295" },
476{ 0x10DE05E1, "GeForce GTX 280" },
477{ 0x10DE05E2, "GeForce GTX 260" },
478{ 0x10DE05E3, "GeForce GTX 285" },
479{ 0x10DE05E4, "NVIDIA GT200" }, //
480{ 0x10DE05E5, "NVIDIA GT200" }, //
481{ 0x10DE05E6, "GeForce GTX 275" },
482{ 0x10DE05E7, "Tesla C1060" },
483{ 0x10DE05E8, "NVIDIA GT200" }, //
484{ 0x10DE05E9, "NVIDIA GT200" }, //
485{ 0x10DE05EA, "GeForce GTX 260" },
486{ 0x10DE05EB, "GeForce GTX 295" },
487{ 0x10DE05EC, "NVIDIA GT200" }, //
488{ 0x10DE05ED, "Quadroplex 2200 D2" },
489{ 0x10DE05EE, "NVIDIA GT200" }, //
490{ 0x10DE05EF, "NVIDIA GT200" }, //
491// 05F0 - 05FF
492{ 0x10DE05F0, "NVIDIA GT200" }, //
493{ 0x10DE05F1, "NVIDIA GT200" }, //
494{ 0x10DE05F2, "NVIDIA GT200" }, //
495{ 0x10DE05F3, "NVIDIA GT200" }, //
496{ 0x10DE05F4, "NVIDIA GT200" }, //
497{ 0x10DE05F5, "NVIDIA GT200" }, //
498{ 0x10DE05F6, "NVIDIA GT200" }, //
499{ 0x10DE05F7, "NVIDIA GT200" }, //
500{ 0x10DE05F8, "Quadroplex 2200 S4" },
501{ 0x10DE05F9, "Quadro CX" },
502{ 0x10DE05FA, "NVIDIA GT200" }, //
503{ 0x10DE05FB, "NVIDIA GT200" }, //
504{ 0x10DE05FC, "NVIDIA GT200" }, //
505{ 0x10DE05FD, "Quadro FX 5800" },
506{ 0x10DE05FE, "Quadro FX 4800" },
507{ 0x10DE05FF, "Quadro FX 3800" },
508// 0600 - 060F
509{ 0x10DE0600, "GeForce 8800 GTS 512" },
510{ 0x10DE0601, "GeForce 9800 GT" },
511{ 0x10DE0602, "GeForce 8800 GT" },
512{ 0x10DE0603, "GeForce GT 230" },
513{ 0x10DE0604, "GeForce 9800 GX2" },
514{ 0x10DE0605, "GeForce 9800 GT" },
515{ 0x10DE0606, "GeForce 8800 GS" },
516{ 0x10DE0607, "GeForce GTS 240" },
517{ 0x10DE0608, "GeForce 9800M GTX" },
518{ 0x10DE0609, "GeForce 8800M GTS" },
519{ 0x10DE060A, "GeForce GTX 280M" },
520{ 0x10DE060B, "GeForce 9800M GT" },
521{ 0x10DE060C, "GeForce 8800M GTX" },
522{ 0x10DE060D, "GeForce 8800 GS" },
523{ 0x10DE060F, "GeForce GTX 285M" },
524// 0610 - 061F
525{ 0x10DE0610, "GeForce 9600 GSO" },
526{ 0x10DE0611, "GeForce 8800 GT" },
527{ 0x10DE0612, "GeForce 9800 GTX" },
528{ 0x10DE0613, "GeForce 9800 GTX+" },
529{ 0x10DE0614, "GeForce 9800 GT" },
530{ 0x10DE0615, "GeForce GTS 250" },
531{ 0x10DE0617, "GeForce 9800M GTX" },
532{ 0x10DE0618, "GeForce GTX 260M" }, // Subsystem Id: 1043 202B Asus GTX 680
533{ 0x10DE0619, "Quadro FX 4700 X2" },
534{ 0x10DE061A, "Quadro FX 3700" },
535{ 0x10DE061B, "Quadro VX 200" },
536{ 0x10DE061C, "Quadro FX 3600M" },
537{ 0x10DE061D, "Quadro FX 2800M" },
538{ 0x10DE061E, "Quadro FX 3700M" },
539{ 0x10DE061F, "Quadro FX 3800M" },
540// 0620 - 062F
541{ 0x10DE0620, "NVIDIA G94" }, // GeForce 8100/8200/8300
542{ 0x10DE0621, "GeForce GT 230" },
543{ 0x10DE0622, "GeForce 9600 GT" },
544{ 0x10DE0623, "GeForce 9600 GS" },
545{ 0x10DE0624, "NVIDIA G94" }, //
546{ 0x10DE0625, "GeForce 9600 GSO 512"},
547{ 0x10DE0626, "GeForce GT 130" },
548{ 0x10DE0627, "GeForce GT 140" },
549{ 0x10DE0628, "GeForce 9800M GTS" },
550{ 0x10DE0629, "NVIDIA G94" }, //
551{ 0x10DE062A, "GeForce 9700M GTS" },
552{ 0x10DE062B, "GeForce 9800M GS" },
553{ 0x10DE062C, "GeForce 9800M GTS" },
554{ 0x10DE062D, "GeForce 9600 GT" },
555{ 0x10DE062E, "GeForce 9600 GT" },
556{ 0x10DE062F, "GeForce 9800 S" }, //
557// 0630 - 063F
558{ 0x10DE0630, "NVIDIA G94" }, //
559{ 0x10DE0631, "GeForce GTS 160M" },
560{ 0x10DE0632, "GeForce GTS 150M" },
561{ 0x10DE0633, "NVIDIA G94" }, //
562{ 0x10DE0634, "NVIDIA G94" }, //
563{ 0x10DE0635, "GeForce 9600 GSO" },
564{ 0x10DE0636, "NVIDIA G94" }, //
565{ 0x10DE0637, "GeForce 9600 GT" },
566{ 0x10DE0638, "Quadro FX 1800" },
567{ 0x10DE0639, "NVIDIA G94" }, //
568{ 0x10DE063A, "Quadro FX 2700M" },
569{ 0x10DE063B, "NVIDIA G94" }, //
570{ 0x10DE063C, "NVIDIA G94" }, //
571{ 0x10DE063D, "NVIDIA G94" }, //
572{ 0x10DE063E, "NVIDIA G94" }, //
573{ 0x10DE063F, "NVIDIA G94" }, //
574// 0640 - 064F
575{ 0x10DE0640, "GeForce 9500 GT" },
576{ 0x10DE0641, "GeForce 9400 GT" },
577{ 0x10DE0642, "GeForce 8400 GS" },
578{ 0x10DE0643, "GeForce 9500 GT" },
579{ 0x10DE0644, "GeForce 9500 GS" },
580{ 0x10DE0645, "GeForce 9500 GS" },
581{ 0x10DE0646, "GeForce GT 120" },
582{ 0x10DE0647, "GeForce 9600M GT" },
583{ 0x10DE0648, "GeForce 9600M GS" },
584{ 0x10DE0649, "GeForce 9600M GT" },
585{ 0x10DE064A, "GeForce 9700M GT" },
586{ 0x10DE064B, "GeForce 9500M G" },
587{ 0x10DE064C, "GeForce 9650M GT" },
588// 0650 - 065F
589{ 0x10DE0650, "NVIDIA G96-825" }, //
590{ 0x10DE0651, "GeForce G 110M" },
591{ 0x10DE0652, "GeForce GT 130M" },
592{ 0x10DE0653, "GeForce GT 120M" },
593{ 0x10DE0654, "GeForce GT 220M" },
594{ 0x10DE0655, "GeForce GT 120" },
595{ 0x10DE0656, "GeForce 9650 S" },
596{ 0x10DE0657, "NVIDIA G96" }, //
597{ 0x10DE0658, "Quadro FX 380" },
598{ 0x10DE0659, "Quadro FX 580" },
599{ 0x10DE065A, "Quadro FX 1700M" },
600{ 0x10DE065B, "GeForce 9400 GT" },
601{ 0x10DE065C, "Quadro FX 770M" },
602{ 0x10DE065D, "NVIDIA G96" }, //
603{ 0x10DE065E, "NVIDIA G96" }, //
604{ 0x10DE065F, "GeForce G210" },
605// 0660 - 066F
606// 0670 - 067F
607// 0680 - 068F
608// 0690 - 069F
609// 06A0 - 06AF
610{ 0x10DE06A0, "NVIDIA GT214" }, //
611// 06B0 - 06BF
612{ 0x10DE06B0, "NVIDIA GT214" }, //
613// 06C0 - 06CF
614{ 0x10DE06C0, "GeForce GTX 480" },
615{ 0x10DE06C3, "GeForce GTX D12U" },
616{ 0x10DE06C4, "GeForce GTX 465" },
617{ 0x10DE06CA, "GeForce GTX 480M" },
618{ 0x10DE06CD, "GeForce GTX 470" },
619// 06D0 - 06DF
620{ 0x10DE06D1, "Tesla C2050" },// TODO: sub-device id: 0x0771
621{ 0x10DE06D1, "Tesla C2070" },// TODO: sub-device id: 0x0772
622{ 0x10DE06D2, "Tesla M2070" },
623{ 0x10DE06D8, "Quadro 6000" },
624{ 0x10DE06D9, "Quadro 5000" },
625{ 0x10DE06DA, "Quadro 5000M" },
626{ 0x10DE06DC, "Quadro 6000" },
627{ 0x10DE06DD, "Quadro 4000" },
628{ 0x10DE06DE, "Tesla M2050" },// TODO: sub-device id: 0x0846
629{ 0x10DE06DE, "Tesla M2070" },// TODO: sub-device id: ?
630{ 0x10DE06DF, "Tesla M2070-Q" },
631// 0x10DE06DE also applies to misc S2050, X2070, M2050, M2070
632// 06E0 - 06EF
633{ 0x10DE06E0, "GeForce 9300 GE" },
634{ 0x10DE06E1, "GeForce 9300 GS" },
635{ 0x10DE06E2, "GeForce 8400" },
636{ 0x10DE06E3, "GeForce 8400 SE" },
637{ 0x10DE06E4, "GeForce 8400 GS" },
638{ 0x10DE06E5, "GeForce 9300M GS" },
639{ 0x10DE06E6, "GeForce G100" },
640{ 0x10DE06E7, "GeForce 9300 SE" },
641{ 0x10DE06E8, "GeForce 9200M GS" },
642{ 0x10DE06E9, "GeForce 9300M GS" },
643{ 0x10DE06EA, "Quadro NVS 150M" },
644{ 0x10DE06EB, "Quadro NVS 160M" },
645{ 0x10DE06EC, "GeForce G 105M" },
646{ 0x10DE06ED, "NVIDIA G98" }, //
647{ 0x10DE06EF, "GeForce G 103M" },
648// 06F0 - 06FF
649{ 0x10DE06F0, "NVIDIA G98" }, //
650{ 0x10DE06F1, "GeForce G105M" },
651{ 0x10DE06F2, "NVIDIA G98" }, //
652{ 0x10DE06F3, "NVIDIA G98" }, //
653{ 0x10DE06F4, "NVIDIA G98" }, //
654{ 0x10DE06F5, "NVIDIA G98" }, //
655{ 0x10DE06F6, "NVIDIA G98" }, //
656{ 0x10DE06F7, "NVIDIA G98" }, //
657{ 0x10DE06F8, "Quadro NVS 420" },
658{ 0x10DE06F9, "Quadro FX 370 LP" },
659{ 0x10DE06FA, "Quadro NVS 450" },
660{ 0x10DE06FB, "Quadro FX 370M" },
661{ 0x10DE06FC, "NVIDIA G98" }, //
662{ 0x10DE06FD, "Quadro NVS 295" },
663{ 0x10DE06FE, "NVIDIA G98" }, //
664{ 0x10DE06FF, "HICx16 + Graphics" },
665// 0700 - 070F
666// 0710 - 071F
667// 0720 - 072F
668// 0730 - 073F
669// 0740 - 074F
670// 0750 - 075F
671//{ 0x10DE0759, "nVidia Standard Dual Channel PCI IDE Controller" },
672// 0760 - 076F
673// 0770 - 077F
674//{ 0x10DE0774, "nVidia Microsoft UAA Bus Driver for High Definition Audio" },
675//{ 0x10DE077B, "nVidia Standard OpenHCD USB Host Controller" },
676//{ 0x10DE077C, "nVidia Standard Enhanced PCI to USB Host Controller" },
677//{ 0x10DE077D, "nVidia Standard OpenHCD USB Host Controller" },
678//{ 0x10DE077E, "nVidia Standard Enhanced PCI to USB Host Controller" },
679// 0780 - 078F
680// 0790 - 079F
681// 07A0 - 07AF
682// 07B0 - 07BF
683// 07C0 - 07CF
684// 07D0 - 07DF
685// 07E0 - 07EF
686{ 0x10DE07E0, "GeForce 7150 / nForce 630i" },
687{ 0x10DE07E1, "GeForce 7100 / nForce 630i" },
688{ 0x10DE07E2, "GeForce 7050 / nForce 630i" },
689{ 0x10DE07E3, "GeForce 7050 / nForce 610i" },
690//{ 0x10DE07E4, "NVIDIA MCP73" },
691{ 0x10DE07E5, "GeForce 7050 / nForce 620i" },
692//{ 0x10DE07E6, "NVIDIA MCP73" },
693//{ 0x10DE07E7, "NVIDIA MCP73" },
694//{ 0x10DE07E8, "NVIDIA MCP73" },
695//{ 0x10DE07E9, "NVIDIA MCP73" },
696//{ 0x10DE07EA, "NVIDIA MCP73" },
697//{ 0x10DE07EB, "NVIDIA MCP73" },
698//{ 0x10DE07ED, "NVIDIA MCP73" },
699//{ 0x10DE07EE, "NVIDIA MCP73" },
700//{ 0x10DE07EF, "NVIDIA MCP73" },
701// 07F0 - 07FF
702// 0800 - 080F
703// 0810 - 081F
704// 0820 - 082F
705// 0830 - 083F
706// 0840 - 084F
707{ 0x10DE0840, "GeForce 8200M" },
708//{ 0x10DE0841, "NVIDIA MCP77/78" },
709//{ 0x10DE0842, "NVIDIA MCP77/78" },
710{ 0x10DE0844, "GeForce 9100M G" },
711{ 0x10DE0845, "GeForce 8200M G" },
712{ 0x10DE0846, "GeForce 9200" },
713{ 0x10DE0847, "GeForce 9100" },
714{ 0x10DE0848, "GeForce 8300" },
715{ 0x10DE0849, "GeForce 8200" },
716{ 0x10DE084A, "nForce 730a" },
717{ 0x10DE084B, "GeForce 9200" },
718{ 0x10DE084C, "nForce 980a/780a SLI" },
719{ 0x10DE084D, "nForce 750a SLI" },
720{ 0x10DE084F, "GeForce 8100 / nForce 720a" },
721// 0850 - 085F
722//{ 0x10DE0850, "NVIDIA MCP77/78" },
723//{ 0x10DE0851, "NVIDIA MCP77/78" },
724//{ 0x10DE0852, "NVIDIA MCP77/78" },
725//{ 0x10DE0853, "NVIDIA MCP77/78" },
726//{ 0x10DE0854, "NVIDIA MCP77/78" },
727//{ 0x10DE0855, "NVIDIA MCP77/78" },
728//{ 0x10DE0856, "NVIDIA MCP77/78" },
729//{ 0x10DE0857, "NVIDIA MCP77/78" },
730//{ 0x10DE0858, "NVIDIA MCP77/78" },
731//{ 0x10DE0859, "NVIDIA MCP77/78" },
732//{ 0x10DE085A, "NVIDIA MCP77/78" },
733//{ 0x10DE085B, "NVIDIA MCP77/78" },
734//{ 0x10DE085C, "NVIDIA MCP77/78" },
735//{ 0x10DE085D, "NVIDIA MCP77/78" },
736//{ 0x10DE085E, "NVIDIA MCP77/78" },
737//{ 0x10DE085F, "NVIDIA MCP77/78" },
738// 0860 - 086F
739{ 0x10DE0860, "GeForce 9300" }, //
740{ 0x10DE0861, "GeForce 9400" },
741{ 0x10DE0862, "GeForce 9400M G" },
742{ 0x10DE0863, "GeForce 9400M" },
743{ 0x10DE0864, "GeForce 9300" },
744{ 0x10DE0865, "GeForce 9300" }, //
745{ 0x10DE0866, "GeForce 9400M G" },
746{ 0x10DE0867, "GeForce 9400" },
747{ 0x10DE0868, "nForce 760i SLI" },
748{ 0x10DE0869, "GeForce 9400" },
749{ 0x10DE086A, "GeForce 9400" },
750{ 0x10DE086C, "GeForce 9300 / nForce 730i" },
751{ 0x10DE086D, "GeForce 9200" },
752{ 0x10DE086E, "GeForce 9100M G" },
753{ 0x10DE086F, "GeForce 8200M G" },
754// 0870 - 087F
755{ 0x10DE0870, "GeForce 9400M" },
756{ 0x10DE0871, "GeForce 9200" },
757{ 0x10DE0872, "GeForce G102M" },
758{ 0x10DE0873, "GeForce G102M" },
759{ 0x10DE0874, "ION 9300M" },
760{ 0x10DE0876, "ION 9400M" }, //
761{ 0x10DE087A, "GeForce 9400" },
762{ 0x10DE087D, "ION 9400M" },
763{ 0x10DE087E, "ION LE" },
764{ 0x10DE087F, "ION LE" },
765// 0880 - 088F
766// 0890 - 089F
767// 08A0 - 08AF
768{ 0x10DE08A0, "GeForce 320M" },
769//{ 0x10DE08A1, "NVIDIA MCP89-MZT" },
770//{ 0x10DE08A2, "NVIDIA MCP89-EPT" },
771{ 0x10DE08A3, "GeForce 320M" },
772{ 0x10DE08A4, "GeForce 320M" },
773{ 0x10DE08A5, "GeForce 320M" },
774// 08B0 - 08BF
775//{ 0x10DE08B0, "Unknown" },
776{ 0x10DE08B1, "GeForce 300M" },
777//{ 0x10DE08B2, "NVIDIA MCP83-MJ" },
778//{ 0x10DE08B3, "NVIDIA MCP89 MM9" },
779// 08C0 - 08CF
780// 08D0 - 08DF
781// 08E0 - 08EF
782// 08F0 - 08FF
783// 0900 - 090F
784// 0910 - 091F
785// 0920 - 092F
786// 0930 - 093F
787// 0940 - 094F
788// 0950 - 095F
789// 0960 - 096F
790// 0970 - 097F
791// 0980 - 098F
792// 0990 - 099F
793// 09A0 - 09AF
794// 09B0 - 09BF
795// 09C0 - 09CF
796// 09D0 - 09DF
797// 09E0 - 09EF
798// 09F0 - 09FF
799// 0A00 - 0A0F
800//{ 0x10DE0A00, "NVIDIA GT212" },
801// 0A10 - 0A1F
802//{ 0x10DE0A10, "NVIDIA GT212" },
803// 0A20 - 0A2F
804{ 0x10DE0A20, "GeForce GT 220" }, // subsystem 10de:0a20:1043:8311
805//{ 0x10DE0A21, "NVIDIA D10M2-20" },
806{ 0x10DE0A22, "GeForce 315" },
807{ 0x10DE0A23, "GeForce 210" },
808{ 0x10DE0A26, "GeForce 405" },
809{ 0x10DE0A27, "GeForce 405" },
810{ 0x10DE0A28, "GeForce GT 230M" },
811{ 0x10DE0A29, "GeForce GT 330M" },
812{ 0x10DE0A2A, "GeForce GT 230M" },
813{ 0x10DE0A2B, "GeForce GT 330M" },
814{ 0x10DE0A2C, "NVS 5100M" },
815{ 0x10DE0A2D, "GeForce GT 320M" },
816// 0A30 - 0A3F
817//{ 0x10DE0A30, "NVIDIA GT216" },
818{ 0x10DE0A34, "GeForce GT 240M" },
819{ 0x10DE0A35, "GeForce GT 325M" },
820{ 0x10DE0A38, "Quadro 400" },
821{ 0x10DE0A3C, "Quadro FX 880M" },
822//{ 0x10DE0A3D, "NVIDIA N10P-ES" },
823//{ 0x10DE0A3F, "NVIDIA GT216-INT" },
824// 0A40 - 0A4F
825// 0A50 - 0A5F
826// 0A60 - 0A6F
827{ 0x10DE0A60, "GeForce G210" },
828//{ 0x10DE0A61, "NVIDIA NVS 2100" },
829{ 0x10DE0A62, "GeForce 205" },
830{ 0x10DE0A63, "GeForce 310" },
831{ 0x10DE0A64, "ION" },
832{ 0x10DE0A65, "GeForce 210" }, // subsystem 10de:0a65:1043:8334
833{ 0x10DE0A66, "GeForce 310" },
834{ 0x10DE0A67, "GeForce 315" },
835{ 0x10DE0A68, "GeForce G105M" },
836{ 0x10DE0A69, "GeForce G105M" },
837{ 0x10DE0A6A, "NVS 2100M" },
838{ 0x10DE0A6C, "NVS 3100M" }, // subsystem 10de:0a6c:1028:040b & 10de:0a6c:17aa:2142
839{ 0x10DE0A6E, "GeForce 305M" },
840{ 0x10DE0A6F, "ION" },
841// 0A70 - 0A7F
842{ 0x10DE0A70, "GeForce 310M" },
843{ 0x10DE0A71, "GeForce 305M" },
844{ 0x10DE0A72, "GeForce 310M" },
845{ 0x10DE0A73, "GeForce 305M" },
846{ 0x10DE0A74, "GeForce G210M" },
847{ 0x10DE0A75, "GeForce G310M" },
848{ 0x10DE0A76, "ION" },
849{ 0x10DE0A78, "Quadro FX 380 LP" },
850//{ 0x10DE0A79, "Unknown" },
851{ 0x10DE0A7A, "GeForce 315M" },
852{ 0x10DE0A7C, "Quadro FX 380M" },
853//{ 0x10DE0A7D, "NVIDIA GT218-ES" },
854//{ 0x10DE0A7E, "NVIDIA GT218-INT-S" },
855//{ 0x10DE0A7F, "NVIDIA GT218-INT-B" },
856// 0A80 - 0A8F
857// 0A90 - 0A9F
858// 0AA0 - 0AAF
859// 0AB0 - 0ABF
860// 0AC0 - 0ACF
861// 0AD0 - 0ADF
862// 0AE0 - 0AEF
863// 0AF0 - 0AFF
864// 0B00 - 0B0F
865// 0B10 - 0B1F
866// 0B20 - 0B2F
867// 0B30 - 0B3F
868// 0B40 - 0B4F
869// 0B50 - 0B5F
870// 0B60 - 0B6F
871// 0B70 - 0B7F
872// 0B80 - 0B8F
873// 0B90 - 0B9F
874// 0BA0 - 0BAF
875// 0BB0 - 0BBF
876// 0BC0 - 0BCF
877// 0BD0 - 0BDF
878// 0BE0 - 0BEF
879//{ 0x10DE0BE4, "nVidia High Definition Audio Controller" },
880//{ 0x10DE0BE9, "nVidia High Definition Audio Controller" },
881// 0BF0 - 0BFF
882// 0C00 - 0C0F
883// 0C10 - 0C1F
884// 0C20 - 0C2F
885// 0C30 - 0C3F
886// 0C40 - 0C4F
887// 0C50 - 0C5F
888// 0C60 - 0C6F
889// 0C70 - 0C7F
890// 0C80 - 0C8F
891// 0C90 - 0C9F
892// 0CA0 - 0CAF
893{ 0x10DE0CA0, "GeForce GT 330 " },
894{ 0x10DE0CA2, "GeForce GT 320" },
895{ 0x10DE0CA3, "GeForce GT 240" },
896{ 0x10DE0CA4, "GeForce GT 340" },
897{ 0x10DE0CA5, "GeForce GT 220" },
898{ 0x10DE0CA7, "GeForce GT 330" },
899{ 0x10DE0CA8, "GeForce GTS 260M" },
900{ 0x10DE0CA9, "GeForce GTS 250M" },
901{ 0x10DE0CAC, "GeForce GT 220" },
902//{ 0x10DE0CAD, "NVIDIA N10E-ES" },
903//{ 0x10DE0CAE, "NVIDIA GT215-INT" },
904{ 0x10DE0CAF, "GeForce GT 335M" },
905// 0CB0 - 0CBF
906{ 0x10DE0CB0, "GeForce GTS 350M" },
907{ 0x10DE0CB1, "GeForce GTS 360M" },
908{ 0x10DE0CBC, "Quadro FX 1800M" },
909// 0CC0 - 0CCF
910// 0CD0 - 0CDF
911// 0CE0 - 0CEF
912// 0CF0 - 0CFF
913// 0D00 - 0D0F
914// 0D10 - 0D1F
915// 0D20 - 0D2F
916// 0D30 - 0D3F
917// 0D40 - 0D4F
918// 0D50 - 0D5F
919// 0D60 - 0D6F
920// 0D70 - 0D7F
921// 0D80 - 0D8F
922// 0D90 - 0D9F
923// 0DA0 - 0DAF
924// 0DB0 - 0DBF
925// 0DC0 - 0DCF
926{ 0x10DE0DC0, "GeForce GT 440" },
927{ 0x10DE0DC1, "D12-P1-35" },
928{ 0x10DE0DC2, "D12-P1-35" },
929{ 0x10DE0DC4, "GeForce GTS 450" },
930{ 0x10DE0DC5, "GeForce GTS 450" },
931{ 0x10DE0DC6, "GeForce GTS 450" },
932{ 0x10DE0DCA, "GF10x" },
933//{ 0x10DE0DCC, "Unknown" },
934{ 0x10DE0DCD, "GeForce GT 555M" },
935{ 0x10DE0DCE, "GeForce GT 555M" },
936//{ 0x10DE0DCF, "Unknown" },
937// 0DD0 - 0DDF
938//{ 0x10DE0DD0, "Unknown" },
939{ 0x10DE0DD1, "GeForce GTX 460M" }, // subsystem 10de:0dd1:1558:8687
940{ 0x10DE0DD2, "GeForce GT 445M" },
941{ 0x10DE0DD3, "GeForce GT 435M" },
942{ 0x10DE0DD6, "GeForce GT 550M" },
943{ 0x10DE0DD8, "Quadro 2000" },
944{ 0x10DE0DDA, "Quadro 2000M" },
945{ 0x10DE0DDE, "GF106-ES" },
946{ 0x10DE0DDF, "GF106-INT" },
947// 0DE0 - 0DEF
948{ 0x10DE0DE0, "GeForce GT 440" },
949{ 0x10DE0DE1, "GeForce GT 430" }, // subsystem 10de:0de1:3842:1430
950{ 0x10DE0DE2, "GeForce GT 420" },
951{ 0x10DE0DE4, "GeForce GT 520" },
952{ 0x10DE0DE5, "GeForce GT 530" },
953{ 0x10DE0DE8, "GeForce GT 620M" },
954{ 0x10DE0DE9, "GeForce GT 630M" },
955{ 0x10DE0DEA, "GeForce GT 610M" },
956{ 0x10DE0DEB, "GeForce GT 555M" },
957{ 0x10DE0DEC, "GeForce GT 525M" },
958{ 0x10DE0DED, "GeForce GT 520M" },
959{ 0x10DE0DEE, "GeForce GT 415M" },
960//{ 0x10DE0DEF, "Unknown" },
961// 0DF0 - 0DFF
962{ 0x10DE0DF0, "GeForce GT 425M" },
963{ 0x10DE0DF1, "GeForce GT 420M" },
964{ 0x10DE0DF2, "GeForce GT 435M" },
965{ 0x10DE0DF3, "GeForce GT 420M" },
966{ 0x10DE0DF4, "GeForce GT 540M" },
967{ 0x10DE0DF5, "GeForce GT 525M" },
968{ 0x10DE0DF6, "GeForce GT 550M" },
969{ 0x10DE0DF7, "GeForce GT 520M" },
970{ 0x10DE0DF8, "Quadro 600" },
971//{ 0x10DE0DF9, "Unknown" },
972{ 0x10DE0DFA, "Quadro 1000M" },
973{ 0x10DE0DFC, "NVS 5200M" },
974{ 0x10DE0DFE, "GF108 ES" },
975{ 0x10DE0DFF, "GF108 INT" },
976// 0E00 - 0E0F
977// 0E10 - 0E1F
978// 0E20 - 0E2F
979{ 0x10DE0E21, "D12U-25" },
980{ 0x10DE0E22, "GeForce GTX 460" }, // subsystem 10de:0e22:1462:2322
981{ 0x10DE0E23, "GeForce GTX 460 SE" },
982{ 0x10DE0E24, "GeForce GTX 460" },
983{ 0x10DE0E25, "D12U-50" },
984// 0E30 - 0E3F
985{ 0x10DE0E30, "GeForce GTX 470M" },
986{ 0x10DE0E31, "GeForce GTX 485M" },
987//{ 0x10DE0E32, "Unknown" },
988{ 0x10DE0E38, "GF104GL" },
989{ 0x10DE0E3A, "Quadro 3000M" },
990{ 0x10DE0E3B, "Quadro 4000M" },
991{ 0x10DE0E3E, "GF104-ES" },
992{ 0x10DE0E3F, "GF104-INT" },
993// 0E40 - 0E4F
994// 0E50 - 0E5F
995// 0E60 - 0E6F
996// 0E70 - 0E7F
997// 0E80 - 0E8F
998// 0E90 - 0E9F
999// 0EA0 - 0EAF
1000// 0EB0 - 0EBF
1001// 0EC0 - 0ECF
1002// 0ED0 - 0EDF
1003// 0EE0 - 0EEF
1004// 0EF0 - 0EFF
1005// 0F00 - 0F0F
1006// 0F10 - 0F1F
1007// 0F20 - 0F2F
1008// 0F30 - 0F3F
1009// 0F40 - 0F4F
1010// 0F50 - 0F5F
1011// 0F60 - 0F6F
1012// 0F70 - 0F7F
1013// 0F80 - 0F8F
1014// 0F90 - 0F9F
1015// 0FA0 - 0FAF
1016// 0FB0 - 0FBF
1017// 0FC0 - 0FCF
1018// 0FD0 - 0FDF
1019{ 0x10DE0FD1, "GeForce GT 650M" },
1020{ 0x10DE0FD2, "GeForce GT 640M" },
1021{ 0x10DE0FD4, "GeForce GTX 660M" },
1022// 0FE0 - 0FEF
1023// 0FF0 - 0FFF
1024// 1000 - 100F
1025// 1010 - 101F
1026// 1020 - 102F
1027// 1030 - 103F
1028// 1040 - 104F
1029{ 0x10DE1040, "GeForce GT 520" },
1030{ 0x10DE1042, "GeForce 510" },
1031{ 0x10DE1049, "GeForce GT 620" },
1032// 1050 - 105F
1033{ 0x10DE1050, "GeForce GT 520M" },
1034{ 0x10DE1051, "GeForce GT 520MX" },
1035//{ 0x10DE1052, "Unknown" },
1036{ 0x10DE1054, "GeForce GT 410M" },
1037{ 0x10DE1055, "GeForce 410M" },
1038{ 0x10DE1056, "Quadro NVS 4200M" },
1039{ 0x10DE1057, "Quadro NVS 4200M" },
1040{ 0x10DE1058, "GeForce 610M" },
1041//{ 0x10DE1059, "AUDIO" },
1042{ 0x10DE105A, "GeForce 610M" },
1043// 1060 - 106F
1044// 1070 - 107F
1045//{ 0x10DE107D, "Unknown" },
1046//{ 0x10DE107E, "Unknown" },
1047{ 0x10DE107F, "NVIDIA GF119-ES" },
1048// 1080 - 108F
1049{ 0x10DE1080, "GeForce GTX 580" },
1050{ 0x10DE1081, "GeForce GTX 570" }, // subsystem 10de:1081:10de:087e
1051{ 0x10DE1082, "GeForce GTX 560 Ti" },
1052{ 0x10DE1083, "D13U" },
1053{ 0x10DE1084, "GeForce GTX 560" },
1054{ 0x10DE1086, "GeForce GTX 570" },
1055{ 0x10DE1087, "GeForce GTX 560 Ti-448" },
1056{ 0x10DE1088, "GeForce GTX 590" },
1057{ 0x10DE1089, "GeForce GTX 580" },
1058{ 0x10DE108B, "GeForce GTX 590" },
1059// 1090 - 109F
1060{ 0x10DE1091, "Tesla M2090" },
1061{ 0x10DE1094, "Tesla M2075 Dual-Slot Computing Processor Module" },
1062{ 0x10DE1096, "Tesla C2075" },
1063{ 0x10DE1098, "D13U" },
1064{ 0x10DE109A, "Quadro 5010M" },
1065{ 0x10DE109B, "Quadro 7000" },
1066// 10A0 - 10AF
1067// 10B0 - 10BF
1068// 10C0 - 10CF
1069{ 0x10DE10C0, "GeForce 9300 GS" },
1070{ 0x10DE10C3, "GeForce 8400 GS" },
1071//{ 0x10DE10C4, "NVIDIA ION" },
1072{ 0x10DE10C5, "GeForce 405" },
1073// 10D0 - 10DF
1074{ 0x10DE10D8, "NVS 300" },
1075// 10E0 - 10EF
1076// 10F0 - 10FF
1077// 1100 - 110F
1078// 1110 - 111F
1079// 1120 - 112F
1080// 1130 - 113F
1081// 1140 - 114F
1082// 1150 - 115F
1083// 1160 - 116F
1084// 1170 - 117F
1085// 1180 - 118F
1086{ 0x10DE1180, "GeForce GTX 680" },
1087// 1190 - 119F
1088// 11A0 - 11AF
1089// 11B0 - 11BF
1090// 11C0 - 11CF
1091// 11D0 - 11DF
1092// 11E0 - 11EF
1093// 11F0 - 11FF
1094// 1200 - 120F
1095{ 0x10DE1200, "GeForce GTX 560 Ti" },
1096{ 0x10DE1201, "GeForce GTX 560" },
1097{ 0x10DE1203, "GeForce GTX 460 SE v2" },
1098{ 0x10DE1205, "GeForce GTX 460 v2" },
1099{ 0x10DE1208, "GeForce GTX 560 SE" },
1100{ 0x10DE1210, "GeForce GTX 570M" },
1101{ 0x10DE1211, "GeForce GTX 580M" },
1102{ 0x10DE1212, "GeForce GTX 675M" },
1103{ 0x10DE1213, "GeForce GTX 670M" },
1104{ 0x10DE1240, "GeForce GT 620M" },
1105{ 0x10DE1241, "GeForce GT 545" },
1106{ 0x10DE1243, "GeForce GT 545" },
1107{ 0x10DE1244, "GeForce GTX 550 Ti" },
1108{ 0x10DE1245, "GeForce GTS 450" },
1109{ 0x10DE1246, "GeForce GTX 550M" },
1110{ 0x10DE1247, "GeForce GT 635M" }, // Subsystem Id: 1043 212C Asus GeForce GT 635M
1111{ 0x10DE1248, "GeForce GTX 555M" },
1112{ 0x10DE124D, "GeForce GTX 555M" },
1113//{ 0x10DE1250, "Unknown" },
1114{ 0x10DE1251, "GeForce GTX 560M" },
1115// 1260 - 126F
1116// 1270 - 127F
1117// 1280 - 128F
1118// 1290 - 129F
1119// 12A0 - 12AF
1120// 12B0 - 12BF
1121// 12C0 - 12CF
1122// 12D0 - 12DF
1123// 12E0 - 12EF
1124// 12F0 - 12FF
1125//{ 0x10DE8001, "NVIDIA HDMI Audio" },
1126//{ 0x10DE8067, "NVIDIA HDMI Audio" },
1127//{ 0x10DE8073, "NVIDIA HDMI Audio" },
1128};
1129
1130static uint16_t swap16(uint16_t x)
1131{
1132return (((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8));
1133}
1134
1135static uint16_t read16(uint8_t *ptr, uint16_t offset)
1136{
1137uint8_t ret[2];
1138
1139ret[0] = ptr[offset+1];
1140ret[1] = ptr[offset];
1141
1142return *((uint16_t*)&ret);
1143}
1144
1145#if 0
1146static uint32_t swap32(uint32_t x)
1147{
1148return ((x & 0x000000FF) << 24) | ((x & 0x0000FF00) << 8 ) | ((x & 0x00FF0000) >> 8 ) | ((x & 0xFF000000) >> 24);
1149}
1150
1151static uint8_tread8(uint8_t *ptr, uint16_t offset)
1152{
1153return ptr[offset];
1154}
1155
1156static uint32_t read32(uint8_t *ptr, uint16_t offset)
1157{
1158uint8_t ret[4];
1159
1160ret[0] = ptr[offset+3];
1161ret[1] = ptr[offset+2];
1162ret[2] = ptr[offset+1];
1163ret[3] = ptr[offset];
1164
1165return *((uint32_t*)&ret);
1166}
1167#endif
1168
1169static int patch_nvidia_rom(uint8_t *rom)
1170{
1171if (!rom || (rom[0] != 0x55 && rom[1] != 0xaa)) {
1172printf("False ROM signature: 0x%02x%02x\n", rom[0], rom[1]);
1173return PATCH_ROM_FAILED;
1174}
1175
1176uint16_t dcbptr = swap16(read16(rom, 0x36));
1177
1178if (!dcbptr) {
1179printf("no dcb table found\n");
1180return PATCH_ROM_FAILED;
1181}
1182//else
1183//printf("dcb table at offset 0x%04x\n", dcbptr);
1184
1185uint8_t *dcbtable = &rom[dcbptr];
1186uint8_t dcbtable_version = dcbtable[0];
1187uint8_t headerlength = 0;
1188uint8_t numentries = 0;
1189uint8_t recordlength = 0;
1190
1191if (dcbtable_version >= 0x20)
1192{
1193uint32_t sig;
1194
1195if (dcbtable_version >= 0x30)
1196{
1197headerlength = dcbtable[1];
1198numentries = dcbtable[2];
1199recordlength = dcbtable[3];
1200
1201sig = *(uint32_t *)&dcbtable[6];
1202}
1203else
1204{
1205sig = *(uint32_t *)&dcbtable[4];
1206headerlength = 8;
1207}
1208
1209if (sig != 0x4edcbdcb)
1210{
1211printf("Bad display config block signature (0x%8x)\n", sig); //Azi: issue #48
1212return PATCH_ROM_FAILED;
1213}
1214}
1215else if (dcbtable_version >= 0x14) /* some NV15/16, and NV11+ */
1216{
1217char sig[8] = { 0 };
1218
1219strncpy(sig, (char *)&dcbtable[-7], 7);
1220recordlength = 10;
1221
1222if (strcmp(sig, "DEV_REC"))
1223{
1224printf("Bad Display Configuration Block signature (%s)\n", sig);
1225return PATCH_ROM_FAILED;
1226}
1227}
1228else
1229{
1230printf("ERROR: dcbtable_version is 0x%X\n", dcbtable_version);
1231return PATCH_ROM_FAILED;
1232}
1233
1234if (numentries >= MAX_NUM_DCB_ENTRIES)
1235numentries = MAX_NUM_DCB_ENTRIES;
1236
1237uint8_t num_outputs = 0, i = 0;
1238
1239struct dcbentry
1240{
1241uint8_t type;
1242uint8_t index;
1243uint8_t *heads;
1244} entries[numentries];
1245
1246for (i = 0; i < numentries; i++)
1247{
1248uint32_t connection;
1249connection = *(uint32_t *)&dcbtable[headerlength + recordlength * i];
1250
1251/* Should we allow discontinuous DCBs? Certainly DCB I2C tables can be discontinuous */
1252if ((connection & 0x0000000f) == 0x0000000f) /* end of records */
1253continue;
1254if (connection == 0x00000000) /* seen on an NV11 with DCB v1.5 */
1255continue;
1256if ((connection & 0xf) == 0x6) /* we skip type 6 as it doesnt appear on macbook nvcaps */
1257continue;
1258
1259entries[num_outputs].type = connection & 0xf;
1260entries[num_outputs].index = num_outputs;
1261entries[num_outputs++].heads = (uint8_t*)&(dcbtable[(headerlength + recordlength * i) + 1]);
1262}
1263
1264int has_lvds = false;
1265uint8_t channel1 = 0, channel2 = 0;
1266
1267for (i = 0; i < num_outputs; i++)
1268{
1269if (entries[i].type == 3)
1270{
1271has_lvds = true;
1272//printf("found LVDS\n");
1273channel1 |= ( 0x1 << entries[i].index);
1274entries[i].type = TYPE_GROUPED;
1275}
1276}
1277
1278// if we have a LVDS output, we group the rest to the second channel
1279if (has_lvds)
1280{
1281for (i = 0; i < num_outputs; i++)
1282{
1283if (entries[i].type == TYPE_GROUPED)
1284continue;
1285
1286channel2 |= ( 0x1 << entries[i].index);
1287entries[i].type = TYPE_GROUPED;
1288}
1289}
1290else
1291{
1292int x;
1293// we loop twice as we need to generate two channels
1294for (x = 0; x <= 1; x++)
1295{
1296for (i=0; i<num_outputs; i++)
1297{
1298if (entries[i].type == TYPE_GROUPED)
1299continue;
1300// if type is TMDS, the prior output is ANALOG
1301// we always group ANALOG and TMDS
1302// if there is a TV output after TMDS, we group it to that channel as well
1303if (i && entries[i].type == 0x2)
1304{
1305switch (x)
1306{
1307case 0:
1308//printf("group channel 1\n");
1309channel1 |= ( 0x1 << entries[i].index);
1310entries[i].type = TYPE_GROUPED;
1311
1312if ((entries[i-1].type == 0x0))
1313{
1314channel1 |= ( 0x1 << entries[i-1].index);
1315entries[i-1].type = TYPE_GROUPED;
1316}
1317// group TV as well if there is one
1318if ( ((i+1) < num_outputs) && (entries[i+1].type == 0x1) )
1319{
1320//printf("group tv1\n");
1321channel1 |= ( 0x1 << entries[i+1].index);
1322entries[i+1].type = TYPE_GROUPED;
1323}
1324break;
1325
1326case 1:
1327//printf("group channel 2 : %d\n", i);
1328channel2 |= ( 0x1 << entries[i].index);
1329entries[i].type = TYPE_GROUPED;
1330
1331if ((entries[i - 1].type == 0x0))
1332{
1333channel2 |= ( 0x1 << entries[i-1].index);
1334entries[i-1].type = TYPE_GROUPED;
1335}
1336// group TV as well if there is one
1337if ( ((i+1) < num_outputs) && (entries[i+1].type == 0x1) )
1338{
1339//printf("group tv2\n");
1340channel2 |= ( 0x1 << entries[i+1].index);
1341entries[i+1].type = TYPE_GROUPED;
1342}
1343break;
1344}
1345break;
1346}
1347}
1348}
1349}
1350
1351// if we have left ungrouped outputs merge them to the empty channel
1352uint8_t *togroup;// = (channel1 ? (channel2 ? NULL : &channel2) : &channel1);
1353togroup = &channel2;
1354
1355for (i = 0; i < num_outputs; i++)
1356{
1357if (entries[i].type != TYPE_GROUPED)
1358{
1359//printf("%d not grouped\n", i);
1360if (togroup)
1361{
1362*togroup |= ( 0x1 << entries[i].index);
1363}
1364entries[i].type = TYPE_GROUPED;
1365}
1366}
1367
1368if (channel1 > channel2)
1369{
1370uint8_t buff = channel1;
1371channel1 = channel2;
1372channel2 = buff;
1373}
1374
1375default_NVCAP[6] = channel1;
1376default_NVCAP[8] = channel2;
1377
1378// patching HEADS
1379for (i = 0; i < num_outputs; i++)
1380{
1381if (channel1 & (1 << i))
1382{
1383*entries[i].heads = 1;
1384}
1385else if(channel2 & (1 << i))
1386{
1387*entries[i].heads = 2;
1388}
1389}
1390return (has_lvds ? PATCH_ROM_SUCCESS_HAS_LVDS : PATCH_ROM_SUCCESS);
1391}
1392
1393static char *get_nvidia_model(uint32_t id)
1394{
1395int i;
1396
1397for (i = 1; i < (sizeof(NVKnownChipsets) / sizeof(NVKnownChipsets[0])); i++) {
1398if (NVKnownChipsets[i].device == id)
1399{
1400return NVKnownChipsets[i].name;
1401}
1402}
1403return NVKnownChipsets[0].name;
1404}
1405
1406static uint32_t load_nvidia_bios_file(const char *filename, uint8_t *buf, int bufsize)
1407{
1408int fd;
1409int size;
1410
1411if ((fd = open_bvdev("bt(0,0)", filename, 0)) < 0)
1412{
1413return 0;
1414}
1415
1416size = file_size(fd);
1417
1418if (size > bufsize)
1419{
1420printf("Filesize of %s is bigger than expected! Truncating to 0x%x Bytes!\n",
1421filename, bufsize);
1422size = bufsize;
1423}
1424size = read(fd, (char *)buf, size);
1425close(fd);
1426
1427return size > 0 ? size : 0;
1428}
1429
1430static int devprop_add_nvidia_template(struct DevPropDevice *device)
1431{
1432char tmp[16];
1433
1434if (!device)
1435return 0;
1436
1437if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_0))
1438return 0;
1439if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_0))
1440return 0;
1441if (!DP_ADD_TEMP_VAL(device, nvidia_name_0))
1442return 0;
1443if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_1))
1444return 0;
1445if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_1))
1446return 0;
1447if (!DP_ADD_TEMP_VAL(device, nvidia_name_1))
1448return 0;
1449if (devices_number == 1)
1450{
1451 if (!DP_ADD_TEMP_VAL(device, nvidia_device_type))
1452 return 0;
1453}
1454else
1455{
1456 if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_child))
1457 return 0;
1458}
1459
1460// Rek : Dont use sprintf return, it does not WORK !! our custom sprintf() always return 0!
1461// len = sprintf(tmp, "Slot-%x", devices_number);
1462sprintf(tmp, "Slot-%x",devices_number);
1463devprop_add_value(device, "AAPL,slot-name", (uint8_t *) tmp, strlen(tmp));
1464devices_number++;
1465
1466return 1;
1467}
1468
1469int hex2bin(const char *hex, uint8_t *bin, int len)
1470{
1471char*p;
1472inti;
1473charbuf[3];
1474
1475if (hex == NULL || bin == NULL || len <= 0 || strlen(hex) != len * 2) {
1476printf("[ERROR] bin2hex input error\n");
1477return -1;
1478}
1479
1480buf[2] = '\0';
1481p = (char *) hex;
1482
1483for (i = 0; i < len; i++)
1484{
1485if (p[0] == '\0' || p[1] == '\0' || !isxdigit(p[0]) || !isxdigit(p[1])) {
1486printf("[ERROR] bin2hex '%s' syntax error\n", hex);
1487return -2;
1488}
1489buf[0] = *p++;
1490buf[1] = *p++;
1491bin[i] = (unsigned char) strtoul(buf, NULL, 16);
1492}
1493return 0;
1494}
1495
1496unsigned long long mem_detect(volatile uint8_t *regs, uint8_t nvCardType, pci_dt_t *nvda_dev)
1497{
1498unsigned long long vram_size = 0;
1499
1500if (nvCardType < NV_ARCH_50)
1501{
1502vram_size = REG32(NV04_PFB_FIFO_DATA);
1503vram_size &= NV10_PFB_FIFO_DATA_RAM_AMOUNT_MB_MASK;
1504}
1505else if (nvCardType < NV_ARCH_C0)
1506{
1507vram_size = REG32(NV04_PFB_FIFO_DATA);
1508vram_size |= (vram_size & 0xff) << 32;
1509vram_size &= 0xffffffff00ll;
1510}
1511else // >= NV_ARCH_C0
1512{
1513vram_size = REG32(NVC0_MEM_CTRLR_RAM_AMOUNT) << 20;
1514vram_size *= REG32(NVC0_MEM_CTRLR_COUNT);
1515}
1516
1517// Workaround for 9600M GT, GT 210/420/430/440/525M & 540M
1518switch (nvda_dev->device_id)
1519{
1520case 0x0647: vram_size = 512*1024*1024; break;// 9600M GT 0647
1521case 0x0649: vram_size = 512*1024*1024; break;// 9600M GT 0649
1522case 0x0A65: vram_size = 1024*1024*1024; break; // GT 210
1523case 0x0DE0: vram_size = 1024*1024*1024; break; // GT 440
1524case 0x0DE1: vram_size = 1024*1024*1024; break; // GT 430
1525case 0x0DE2: vram_size = 1024*1024*1024; break; // GT 420
1526case 0x0DEC: vram_size = 1024*1024*1024; break; // GT 525M 0DEC
1527case 0x0DF4: vram_size = 1024*1024*1024; break; // GT 540M
1528case 0x0DF5: vram_size = 1024*1024*1024; break; // GT 525M 0DF5
1529default: break;
1530}
1531
1532return vram_size;
1533}
1534
1535bool setup_nvidia_devprop(pci_dt_t *nvda_dev)
1536{
1537struct DevPropDevice*device;
1538char*devicepath;
1539option_rom_pci_header_t *rom_pci_header;
1540volatile uint8_t*regs;
1541uint8_t*rom;
1542uint8_t*nvRom;
1543uint8_tnvCardType;
1544unsigned long longvideoRam;
1545uint32_tnvBiosOveride;
1546uint32_tbar[7];
1547uint32_tboot_display;
1548intnvPatch;
1549intlen;
1550charbiosVersion[32];
1551charnvFilename[32];
1552charkNVCAP[12];
1553char*model;
1554const char*value;
1555booldoit;
1556
1557devicepath = get_pci_dev_path(nvda_dev);
1558bar[0] = pci_config_read32(nvda_dev->dev.addr, 0x10 );
1559regs = (uint8_t *) (bar[0] & ~0x0f);
1560
1561// get card type
1562nvCardType = (REG32(0) >> 20) & 0x1ff;
1563
1564// Amount of VRAM in kilobytes
1565videoRam = mem_detect(regs, nvCardType, nvda_dev);
1566model = get_nvidia_model((nvda_dev->vendor_id << 16) | nvda_dev->device_id);
1567
1568verbose("nVidia %s %dMB NV%02x [%04x:%04x] :: %s\n",
1569model, (uint32_t)(videoRam / 1024 / 1024),
1570(REG32(0) >> 20) & 0x1ff, nvda_dev->vendor_id, nvda_dev->device_id,
1571devicepath);
1572
1573rom = malloc(NVIDIA_ROM_SIZE);
1574sprintf(nvFilename, "/Extra/%04x_%04x.rom", (uint16_t)nvda_dev->vendor_id,
1575(uint16_t)nvda_dev->device_id);
1576
1577if (getBoolForKey(kUseNvidiaROM, &doit, &bootInfo->chameleonConfig) && doit)
1578{
1579verbose("Looking for nvidia video bios file %s\n", nvFilename);
1580nvBiosOveride = load_nvidia_bios_file(nvFilename, rom, NVIDIA_ROM_SIZE);
1581
1582if (nvBiosOveride > 0)
1583{
1584verbose("Using nVidia Video BIOS File %s (%d Bytes)\n", nvFilename, nvBiosOveride);
1585DBG("%s Signature 0x%02x%02x %d bytes\n", nvFilename, rom[0], rom[1], nvBiosOveride);
1586}
1587else
1588{
1589printf("ERROR: unable to open nVidia Video BIOS File %s\n", nvFilename);
1590return false;
1591}
1592}
1593else
1594{
1595// Otherwise read bios from card
1596nvBiosOveride = 0;
1597
1598// TODO: we should really check for the signature before copying the rom, i think.
1599
1600// PRAMIN first
1601nvRom = (uint8_t*)&regs[NV_PRAMIN_OFFSET];
1602bcopy((uint32_t *)nvRom, rom, NVIDIA_ROM_SIZE);
1603
1604// Valid Signature ?
1605if (rom[0] != 0x55 && rom[1] != 0xaa)
1606{
1607// PROM next
1608// Enable PROM access
1609(REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_DISABLED;
1610
1611nvRom = (uint8_t*)&regs[NV_PROM_OFFSET];
1612bcopy((uint8_t *)nvRom, rom, NVIDIA_ROM_SIZE);
1613
1614// disable PROM access
1615(REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED;
1616
1617// Valid Signature ?
1618if (rom[0] != 0x55 && rom[1] != 0xaa)
1619{
1620// 0xC0000 last
1621bcopy((char *)0xc0000, rom, NVIDIA_ROM_SIZE);
1622
1623// Valid Signature ?
1624if (rom[0] != 0x55 && rom[1] != 0xaa)
1625{
1626printf("ERROR: Unable to locate nVidia Video BIOS\n");
1627return false;
1628}
1629else
1630{
1631DBG("ROM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]);
1632}
1633}
1634else
1635{
1636DBG("PROM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]);
1637}
1638}
1639else
1640{
1641DBG("PRAM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]);
1642}
1643}
1644
1645if ((nvPatch = patch_nvidia_rom(rom)) == PATCH_ROM_FAILED) {
1646printf("ERROR: nVidia ROM Patching Failed!\n");
1647//return false;
1648}
1649
1650rom_pci_header = (option_rom_pci_header_t*)(rom + *(uint16_t *)&rom[24]);
1651
1652// check for 'PCIR' sig
1653if (rom_pci_header->signature == 0x50434952)
1654{
1655if (rom_pci_header->device_id != nvda_dev->device_id)
1656{
1657// Get Model from the OpROM
1658model = get_nvidia_model((rom_pci_header->vendor_id << 16) | rom_pci_header->device_id);
1659}
1660else
1661{
1662printf("nVidia incorrect PCI ROM signature: 0x%x\n", rom_pci_header->signature);
1663}
1664}
1665
1666if (!string) {
1667string = devprop_create_string();
1668}
1669device = devprop_add_device(string, devicepath);
1670
1671/* FIXME: for primary graphics card only */
1672boot_display = 1;
1673if (devices_number == 1)
1674{
1675 devprop_add_value(device, "@0,AAPL,boot-display", (uint8_t*)&boot_display, 4);
1676}
1677
1678if (nvPatch == PATCH_ROM_SUCCESS_HAS_LVDS) {
1679uint8_t built_in = 0x01;
1680devprop_add_value(device, "@0,built-in", &built_in, 1);
1681}
1682
1683// get bios version
1684const int MAX_BIOS_VERSION_LENGTH = 32;
1685char* version_str = (char*)malloc(MAX_BIOS_VERSION_LENGTH);
1686
1687memset(version_str, 0, MAX_BIOS_VERSION_LENGTH);
1688
1689int i, version_start;
1690int crlf_count = 0;
1691
1692// only search the first 384 bytes
1693for (i = 0; i < 0x180; i++)
1694{
1695if (rom[i] == 0x0D && rom[i+1] == 0x0A)
1696{
1697crlf_count++;
1698// second 0x0D0A was found, extract bios version
1699if (crlf_count == 2)
1700{
1701if (rom[i-1] == 0x20) i--; // strip last " "
1702
1703for (version_start = i; version_start > (i-MAX_BIOS_VERSION_LENGTH); version_start--)
1704{
1705// find start
1706if (rom[version_start] == 0x00)
1707{
1708version_start++;
1709
1710// strip "Version "
1711if (strncmp((const char*)rom+version_start, "Version ", 8) == 0)
1712{
1713version_start += 8;
1714}
1715
1716strncpy(version_str, (const char*)rom+version_start, i-version_start);
1717break;
1718}
1719}
1720break;
1721}
1722}
1723}
1724
1725sprintf(biosVersion, "%s", (nvBiosOveride > 0) ? nvFilename : version_str);
1726sprintf(kNVCAP, "NVCAP_%04x", nvda_dev->device_id);
1727
1728if (getValueForKey(kNVCAP, &value, &len, &bootInfo->chameleonConfig) && len == NVCAP_LEN * 2)
1729{
1730uint8_t new_NVCAP[NVCAP_LEN];
1731
1732if (hex2bin(value, new_NVCAP, NVCAP_LEN) == 0)
1733{
1734verbose("Using user supplied NVCAP for %s :: %s\n", model, devicepath);
1735memcpy(default_NVCAP, new_NVCAP, NVCAP_LEN);
1736}
1737}
1738
1739if (getValueForKey(kDcfg0, &value, &len, &bootInfo->chameleonConfig) && len == DCFG0_LEN * 2)
1740{
1741uint8_t new_dcfg0[DCFG0_LEN];
1742
1743if (hex2bin(value, new_dcfg0, DCFG0_LEN) == 0)
1744{
1745memcpy(default_dcfg_0, new_dcfg0, DCFG0_LEN);
1746
1747verbose("Using user supplied @0,display-cfg\n");
1748printf("@0,display-cfg: %02x%02x%02x%02x\n",
1749 default_dcfg_0[0], default_dcfg_0[1], default_dcfg_0[2], default_dcfg_0[3]);
1750}
1751}
1752
1753if (getValueForKey(kDcfg1, &value, &len, &bootInfo->chameleonConfig) && len == DCFG1_LEN * 2)
1754{
1755uint8_t new_dcfg1[DCFG1_LEN];
1756
1757if (hex2bin(value, new_dcfg1, DCFG1_LEN) == 0)
1758{
1759memcpy(default_dcfg_1, new_dcfg1, DCFG1_LEN);
1760
1761verbose("Using user supplied @1,display-cfg\n");
1762printf("@1,display-cfg: %02x%02x%02x%02x\n",
1763 default_dcfg_1[0], default_dcfg_1[1], default_dcfg_1[2], default_dcfg_1[3]);
1764}
1765}
1766
1767#if DEBUG_NVCAP
1768printf("NVCAP: %02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x\n",
1769default_NVCAP[0], default_NVCAP[1], default_NVCAP[2], default_NVCAP[3],
1770default_NVCAP[4], default_NVCAP[5], default_NVCAP[6], default_NVCAP[7],
1771default_NVCAP[8], default_NVCAP[9], default_NVCAP[10], default_NVCAP[11],
1772default_NVCAP[12], default_NVCAP[13], default_NVCAP[14], default_NVCAP[15],
1773default_NVCAP[16], default_NVCAP[17], default_NVCAP[18], default_NVCAP[19]);
1774#endif
1775
1776devprop_add_nvidia_template(device);
1777devprop_add_value(device, "NVCAP", default_NVCAP, NVCAP_LEN);
1778devprop_add_value(device, "NVPM", default_NVPM, NVPM_LEN);
1779devprop_add_value(device, "VRAM,totalsize", (uint8_t*)&videoRam, 4);
1780devprop_add_value(device, "model", (uint8_t*)model, strlen(model) + 1);
1781devprop_add_value(device, "rom-revision", (uint8_t*)biosVersion, strlen(biosVersion) + 1);
1782 //devprop_add_value(device, "@1,connector-type", connector_type_1, 4); // fixme
1783 //devprop_add_value(device, "@0,display-cfg", display_cfg_0, 4);
1784 //devprop_add_value(device, "@1,display-cfg", display_cfg_1, 4);
1785devprop_add_value(device, "@0,display-cfg", default_dcfg_0, DCFG0_LEN);
1786devprop_add_value(device, "@1,display-cfg", default_dcfg_1, DCFG1_LEN);
1787
1788//add HDMI Audio back to nvidia
1789//http://forge.voodooprojects.org/p/chameleon/issues/67/
1790//uint8_t connector_type_1[]= {0x00, 0x08, 0x00, 0x00};
1791//devprop_add_value(device, "@1,connector-type",connector_type_1, 4);
1792//end Nvidia HDMI Audio
1793
1794if (getBoolForKey(kVBIOS, &doit, &bootInfo->chameleonConfig) && doit)
1795{
1796devprop_add_value(device, "vbios", rom, (nvBiosOveride > 0) ? nvBiosOveride : (rom[2] * 512));
1797}
1798
1799stringdata = malloc(sizeof(uint8_t) * string->length);
1800memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
1801stringlength = string->length;
1802
1803return true;
1804}
1805

Archive Download this file

Revision: 1920