Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch/i386/libsaio/pci_setup.c

1#include "libsaio.h"
2#include "boot.h"
3#include "bootstruct.h"
4#include "pci.h"
5//#include "gma.h"
6//#include "nvidia.h"
7//#include "hda.h"
8#include "modules.h"
9//#include "device_inject.h"
10
11extern bool setup_ati_devprop(pci_dt_t *ati_dev);
12extern bool setup_nvidia_devprop(pci_dt_t *nvda_dev);
13extern bool setup_gma_devprop(pci_dt_t *gma_dev);
14extern bool setup_hda_devprop(pci_dt_t *hda_dev);
15extern void setup_eth_builtin(pci_dt_t *eth_dev);
16extern void setup_wifi_airport(pci_dt_t *wifi_dev);
17extern bool set_usb_devprop(pci_dt_t *usb_dev);
18extern void notify_usb_dev(pci_dt_t *pci_dev);
19extern void force_enable_hpet(pci_dt_t *lpc_dev);
20extern pci_dt_t *dram_controller_dev;
21
22void setup_pci_devs(pci_dt_t *pci_dt)
23{
24char *devicepath;
25bool doit, do_eth_devprop, do_wifi_devprop, do_usb_devprop, do_gfx_devprop, do_enable_hpet, do_hda_devprop = false;
26pci_dt_t *current = pci_dt;
27
28//do_eth_devprop = do_wifi_devprop = do_usb_devprop = do_gfx_devprop = do_enable_hpet = do_hda_devprop = false;
29
30getBoolForKey(kEthernetBuiltIn, &do_eth_devprop, &bootInfo->chameleonConfig);
31getBoolForKey(kEnableWifi, &do_wifi_devprop, &bootInfo->chameleonConfig);
32getBoolForKey(kGraphicsEnabler, &do_gfx_devprop, &bootInfo->chameleonConfig);
33getBoolForKey(kUsbInject, &do_usb_devprop, &bootInfo->chameleonConfig);
34getBoolForKey(kHDAEnabler, &do_hda_devprop, &bootInfo->chameleonConfig);
35getBoolForKey(kForceHPET, &do_enable_hpet, &bootInfo->chameleonConfig);
36
37/* tennisgeek http://forum.voodooprojects.org/index.php/topic,1333.0.html
38// Get some PCI stuff
39if (hasPciToEfiMapping == -1) {
40hasPciToEfiMapping = (loadSystemConfig("", &bootInfo->pciConfig, "pci.plist", true) == 0 ? 1 : 0);
41if (hasPciToEfiMapping) {
42verbose("pci.plist is found.\n");
43}
44}
45
46if (hasPciToEfiMapping) {
47// Device ID override injection
48memset(id_array, sizeof(id_array), 0);
49sprintf(override_key, "pci%04x,%04x", current->vendor_id, current->device_id);
50id_count = PciToEfiOverride(override_key, id_array, 4);
51device = NULL;
52for (i = 0; i < id_count; i++) {
53uint8_t fourOctets[4];
54uint32_t id = id_array[i];
55if (id == 0) {
56if (i == 0) {
57id = current->vendor_id;
58} else if (i == 1) {
59id = current->device_id;
60} else {
61continue;
62}
63}
64
65fourOctets[0] = id;
66fourOctets[1] = id >> 8;
67fourOctets[2] = 0;
68fourOctets[3] = 0;
69if (id != 0) {
70if (device == NULL) {
71device = devprop_find_device(devicepath);
72if (device == NULL) {
73deviceString = devprop_create_string();
74device = devprop_add_device(deviceString, devicepath);
75}
76}
77devprop_add_value(device, id_keys[i], fourOctets, sizeof(fourOctets));
78verbose("%s: %s 0x%02x\n", override_key, id_keys[i], id);
79}
80}
81current = current->next;
82}
83*/ // tennisgeek http://forum.voodooprojects.org/index.php/topic,1333.0.html
84
85while (current) {
86devicepath = get_pci_dev_path(current);
87
88switch (current->class_id) {
89case PCI_CLASS_BRIDGE_HOST:
90//DBG("Setup BRIDGE_HOST \n");
91if (current->dev.addr == PCIADDR(0, 0, 0)) {
92dram_controller_dev = current;
93}
94break;
95
96case PCI_CLASS_NETWORK_ETHERNET:
97//DBG("Setup ETHERNET %s enabled\n", do_eth_devprop?"":"no");
98if (do_eth_devprop) {
99setup_eth_builtin(current);
100}
101break;
102
103case PCI_CLASS_NETWORK_OTHER:
104//DBG("Setup WIRELESS %s enabled\n", do_wifi_devprop?"":"no");
105if (do_wifi_devprop) {
106setup_wifi_airport(current);
107}
108break;
109
110case PCI_CLASS_DISPLAY_VGA:
111//DBG("GraphicsEnabler %s enabled\n", do_gfx_devprop?"":"no");
112if (do_gfx_devprop) {
113switch (current->vendor_id) {
114case PCI_VENDOR_ID_ATI:
115if (getBoolForKey(kSkipAtiGfx, &doit, &bootInfo->chameleonConfig) && doit) {
116verbose("Skip ATi/AMD gfx device!\n");
117} else {
118setup_ati_devprop(current);
119}
120break;
121
122case PCI_VENDOR_ID_INTEL:
123if (getBoolForKey(kSkipIntelGfx, &doit, &bootInfo->chameleonConfig) && doit) {
124verbose("Skip Intel gfx device!\n");
125} else {
126setup_gma_devprop(current);
127}
128break;
129
130case PCI_VENDOR_ID_NVIDIA:
131if (getBoolForKey(kSkipNvidiaGfx, &doit, &bootInfo->chameleonConfig) && doit) {
132verbose("Skip Nvidia gfx device!\n");
133} else {
134setup_nvidia_devprop(current);
135}
136break;
137}
138}
139break;
140
141
142case PCI_CLASS_MULTIMEDIA_AUDIO_DEV:
143//DBG("Setup HDEF %s enabled\n", do_hda_devprop?"":"no");
144if (do_hda_devprop) {
145setup_hda_devprop(current);
146}
147break;
148
149case PCI_CLASS_SERIAL_USB:
150//DBG("USB fix \n");
151notify_usb_dev(current);
152 /*if (do_usb_devprop) {
153 set_usb_devprop(current);
154 }*/
155break;
156
157case PCI_CLASS_BRIDGE_ISA:
158//DBG("Force HPET %s enabled\n", do_enable_hpet?"":"no");
159if (do_enable_hpet) {
160force_enable_hpet(current);
161}
162break;
163}
164
165execute_hook("PCIDevice", current, NULL, NULL, NULL);
166//DBG("setup_pci_devs current devID=%08x\n", current->device_id);
167setup_pci_devs(current->children);
168current = current->next;
169}
170}
171

Archive Download this file

Revision: 2323