Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 1920