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;
111TagPtr NVDIATag;
112char *model_name = NULL, *match_id = NULL, *sub_id = NULL, *vram_size = NULL;
113uint32_t dev_id = 0, subdev_id = NV_SUB_IDS;
114uint64_t VramSize = 0;
115
116if ((NVDIATag = XMLCastArray(XMLGetProperty(bootInfo->chameleonConfig.dictionary, (const char*)"NVIDIA"))))
117{
118count = XMLTagCount(NVDIATag);
119
120for (i=0; i<count; i++)
121{
122TagPtr element = XMLGetElement( NVDIATag, i );
123if (element)
124{
125match_id = XMLCastString(XMLGetProperty(element, (const char*)"IOPCIPrimaryMatch")); //device-id
126sub_id = XMLCastString(XMLGetProperty(element, (const char*)"IOPCISubDevId")); //sub device-id
127model_name = XMLCastString(XMLGetProperty(element, (const char*)"Chipset Name"));
128vram_size = XMLCastString(XMLGetProperty(element, (const char*)"VRam Size"));
129
130if (match_id) {
131dev_id = strtoul(match_id, NULL, 16);
132}
133
134if (sub_id) {
135subdev_id = strtoul(sub_id, NULL, 16);
136}
137
138if (vram_size) {
139VramSize = strtoul(vram_size, NULL, 10);
140}
141
142add_card(model_name, dev_id, subdev_id, VramSize);
143}
144}
145}
146}
147

Archive Download this file

Revision: 2071