Chameleon

Chameleon Svn Source Tree

Root/trunk/i386/libsaio/nvidia_helper.c

1/*
2 * Copyright (c) 2012 cparm <armelcadetpetit@gmail.com>. All rights reserved.
3 *
4 */
5
6#include "libsaio.h"
7#include "bootstruct.h"
8#include "xml.h"
9#include "nvidia_helper.h"
10#include "pci.h"
11#include "nvidia.h"
12
13/*
14
15 NVIDIA card injection usage e.g (to be placed in the boot.plist):
16
17 <key>NVIDIA</key>
18<array>
19<dict>
20<key>Chipset Name</key>
21<string>Quadro FX 380</string>
22<key>IOPCIPrimaryMatch</key>
23<string>0x10DE0658</string>
24<key>VRam Size</key>
25<string>256</string>
26</dict>
27<dict>
28<key>Chipset Name</key>
29<string>YOUR_CARD_NAME</string>
30<key>IOPCIPrimaryMatch</key>
31<string>YOUR_CARD_ID</string>
32<key>IOPCISubDevId</key>
33<string>YOUR_CARD_SUB_ID(if necessary)</string>
34<key>VRam Size</key>
35<string>YOUR_CARD_VRAM_SIZE</string>
36</dict>
37<dict>
38<key>Chipset Name</key>
39<string>YOUR_SECOND_CARD_NAME</string>
40<key>IOPCIPrimaryMatch</key>
41<string>YOUR_SECOND_CARD_ID</string>
42<key>IOPCISubDevId</key>
43<string>YOUR_SECOND_CARD_SUB_ID(if necessary)</string>
44<key>VRam Size</key>
45<string>YOUR_SECOND_CARD_VRAM_SIZE</string>
46</dict>
47 .
48 .
49 .
50 .
51</array>
52
53 */
54
55cardList_t *cardList = NULL;
56
57void add_card(char *model, uint32_t id, uint32_t subid, uint64_t videoRam)
58{
59
60cardList_t *new_card = malloc(sizeof(cardList_t));
61if (new_card)
62{
63new_card->next = cardList;
64
65cardList = new_card;
66
67new_card->id= id;
68new_card->subid= subid;
69new_card->videoRam= videoRam;
70new_card->model= model;
71}
72}
73
74cardList_t *FindCardWithIds(uint32_t id, uint32_t subid)
75{
76cardList_t *entry = cardList;
77while(entry)
78{
79if((entry->id == id) && (entry->subid == subid))
80{
81return entry;
82}
83else
84{
85entry = entry->next;
86}
87
88}
89
90// LET A SECOND CHANCE by seaching only for the device-id
91entry = cardList;
92while(entry)
93{
94if(entry->id == id)
95{
96return entry;
97}
98else
99{
100entry = entry->next;
101}
102
103}
104
105return NULL;
106}
107
108void fill_card_list(void)
109{
110unsigned inti, count;
111TagPtrNVDIATag;
112char*model_name = NULL;
113char*match_id = NULL;
114char*sub_id = NULL;
115char*vram_size = NULL;
116uint32_tdev_id = 0;
117uint32_tsubdev_id = 0;
118uint64_tVramSize = 0;
119
120if ((NVDIATag = XMLCastArray(XMLGetProperty(bootInfo->chameleonConfig.dictionary, (const char *)"NVIDIA"))))
121{
122count = XMLTagCount(NVDIATag);
123
124for (i=0; i<count; i++)
125{
126TagPtr element = XMLGetElement( NVDIATag, i );
127if (element)
128{
129match_id = XMLCastString(XMLGetProperty(element, (const char*)"IOPCIPrimaryMatch")); //device-id
130sub_id = XMLCastString(XMLGetProperty(element, (const char*)"IOPCISubDevId")); //sub device-id
131model_name = XMLCastString(XMLGetProperty(element, (const char*)"Chipset Name"));
132vram_size = XMLCastString(XMLGetProperty(element, (const char*)"VRam Size"));
133
134if (match_id)
135{
136dev_id = strtoul(match_id, NULL, 16);
137}
138
139if (sub_id)
140{
141subdev_id = strtoul(sub_id, NULL, 16);
142}
143
144if (vram_size)
145{
146VramSize = strtoul(vram_size, NULL, 10);
147}
148
149add_card(model_name, dev_id, subdev_id, VramSize);
150}
151}
152}
153}
154

Archive Download this file

Revision: 2683