Index: trunk/i386/libsaio/nvidia.c =================================================================== --- trunk/i386/libsaio/nvidia.c (revision 1157) +++ trunk/i386/libsaio/nvidia.c (revision 1158) @@ -1,26 +1,26 @@ /* - * NVidia injector + * NVidia injector * - * Copyright (C) 2009 Jasmin Fazlic, iNDi + * Copyright (C) 2009 Jasmin Fazlic, iNDi * - * NVidia injector is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * NVidia injector is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * NVidia driver and injector is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * NVidia driver and injector is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with NVidia injector. If not, see . + * You should have received a copy of the GNU General Public License + * along with NVidia injector. If not, see . */ /* * Alternatively you can choose to comply with APSL */ - - + + /* * DCB-Table parsing is based on software (nouveau driver) originally distributed under following license: * @@ -48,7 +48,6 @@ * SOFTWARE. */ -#include "libsaio.h" #include "boot.h" #include "bootstruct.h" #include "pci.h" @@ -66,27 +65,23 @@ #define DBG(x...) #endif -#define NVIDIA_ROM_SIZE 0x10000 -#define PATCH_ROM_SUCCESS 1 -#define PATCH_ROM_SUCCESS_HAS_LVDS 2 -#define PATCH_ROM_FAILED 0 -#define MAX_NUM_DCB_ENTRIES 16 +#define NVIDIA_ROM_SIZE 0x10000 +#define PATCH_ROM_SUCCESS 1 +#define PATCH_ROM_SUCCESS_HAS_LVDS 2 +#define PATCH_ROM_FAILED 0 +#define MAX_NUM_DCB_ENTRIES 16 +#define TYPE_GROUPED 0xff - - -#define TYPE_GROUPED 0xff - extern uint32_t devices_number; -const char *nvidia_compatible_0[] = { "@0,compatible", "NVDA,NVMac" }; -const char *nvidia_compatible_1[] = { "@1,compatible", "NVDA,NVMac" }; -const char *nvidia_device_type_0[] = { "@0,device_type", "display" }; -const char *nvidia_device_type_1[] = { "@1,device_type", "display" }; -const char *nvidia_device_type[] = { "device_type", "NVDA,Parent" }; -const char *nvidia_name_0[] = { "@0,name", "NVDA,Display-A" }; -const char *nvidia_name_1[] = { "@1,name", "NVDA,Display-B" }; -const char *nvidia_slot_name[] = { "AAPL,slot-name", "Slot-1" }; -//const char *nvidia_display_cfg_0[] = { "@0,display-cfg +const char *nvidia_compatible_0[] = { "@0,compatible", "NVDA,NVMac" }; +const char *nvidia_compatible_1[] = { "@1,compatible", "NVDA,NVMac" }; +const char *nvidia_device_type_0[] = { "@0,device_type", "display" }; +const char *nvidia_device_type_1[] = { "@1,device_type", "display" }; +const char *nvidia_device_type[] = { "device_type", "NVDA,Parent" }; +const char *nvidia_name_0[] = { "@0,name", "NVDA,Display-A" }; +const char *nvidia_name_1[] = { "@1,name", "NVDA,Display-B" }; +const char *nvidia_slot_name[] = { "AAPL,slot-name", "Slot-1" }; static uint8_t default_NVCAP[]= { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, @@ -104,6 +99,10 @@ static struct nv_chipsets_t NVKnownChipsets[] = { { 0x00000000, "Unknown" }, +// temporary placement + { 0x10DE0DF4, "GeForce GT 450M" }, //Azi + issue #99 + { 0x10DE1251, "GeForce GTX 560M" }, // Asus G74SX +//======================================== // 0040 - 004F { 0x10DE0040, "GeForce 6800 Ultra" }, { 0x10DE0041, "GeForce 6800" }, @@ -831,8 +830,10 @@ static uint16_t read16(uint8_t *ptr, uint16_t offset) { uint8_t ret[2]; + ret[0] = ptr[offset+1]; ret[1] = ptr[offset]; + return *((uint16_t*)&ret); } @@ -842,7 +843,7 @@ return ((x & 0x000000FF) << 24) | ((x & 0x0000FF00) << 8 ) | ((x & 0x00FF0000) >> 8 ) | ((x & 0xFF000000) >> 24); } -static uint8_t read8(uint8_t *ptr, uint16_t offset) +static uint8_t read8(uint8_t *ptr, uint16_t offset) { return ptr[offset]; } @@ -850,10 +851,12 @@ static uint32_t read32(uint8_t *ptr, uint16_t offset) { uint8_t ret[4]; + ret[0] = ptr[offset+3]; ret[1] = ptr[offset+2]; ret[2] = ptr[offset+1]; ret[3] = ptr[offset]; + return *((uint32_t*)&ret); } #endif @@ -866,62 +869,80 @@ } uint16_t dcbptr = swap16(read16(rom, 0x36)); - if(!dcbptr) { + + if (!dcbptr) { printf("no dcb table found\n"); return PATCH_ROM_FAILED; - }/* else - printf("dcb table at offset 0x%04x\n", dcbptr); - */ - uint8_t *dcbtable = &rom[dcbptr]; + } +// else +// printf("dcb table at offset 0x%04x\n", dcbptr); + + uint8_t *dcbtable = &rom[dcbptr]; uint8_t dcbtable_version = dcbtable[0]; - uint8_t headerlength = 0; - uint8_t recordlength = 0; - uint8_t numentries = 0; + uint8_t headerlength = 0; + uint8_t numentries = 0; + uint8_t recordlength = 0; - if(dcbtable_version >= 0x20) { + if (dcbtable_version >= 0x20) + { uint32_t sig; - if(dcbtable_version >= 0x30) { + if (dcbtable_version >= 0x30) + { headerlength = dcbtable[1]; - numentries = dcbtable[2]; + numentries = dcbtable[2]; recordlength = dcbtable[3]; + sig = *(uint32_t *)&dcbtable[6]; - } else { + } + else + { sig = *(uint32_t *)&dcbtable[4]; headerlength = 8; } - if (sig != 0x4edcbdcb) { - //Azi: match this with one below and add line number ? - printf("Bad display config block signature (0x%8x)\n", sig); + + if (sig != 0x4edcbdcb) + { + printf("Bad display config block signature (0x%8x)\n", sig); //Azi: issue #48 return PATCH_ROM_FAILED; } - } else if (dcbtable_version >= 0x14) { /* some NV15/16, and NV11+ */ + } + else if (dcbtable_version >= 0x14) /* some NV15/16, and NV11+ */ + { char sig[8] = { 0 }; strncpy(sig, (char *)&dcbtable[-7], 7); recordlength = 10; - if (strcmp(sig, "DEV_REC")) { + + if (strcmp(sig, "DEV_REC")) + { printf("Bad Display Configuration Block signature (%s)\n", sig); return PATCH_ROM_FAILED; } - } else { + } + else + { printf("ERROR: dcbtable_version is 0x%X\n", dcbtable_version); return PATCH_ROM_FAILED; } - if(numentries >= MAX_NUM_DCB_ENTRIES) + if (numentries >= MAX_NUM_DCB_ENTRIES) numentries = MAX_NUM_DCB_ENTRIES; - uint8_t num_outputs = 0, i=0; - struct dcbentry { + uint8_t num_outputs = 0, i = 0; + + struct dcbentry + { uint8_t type; uint8_t index; uint8_t *heads; } entries[numentries]; - for (i = 0; i < numentries; i++) { + for (i = 0; i < numentries; i++) + { uint32_t connection; connection = *(uint32_t *)&dcbtable[headerlength + recordlength * i]; + /* Should we allow discontinuous DCBs? Certainly DCB I2C tables can be discontinuous */ if ((connection & 0x0000000f) == 0x0000000f) /* end of records */ continue; @@ -933,72 +954,88 @@ entries[num_outputs].type = connection & 0xf; entries[num_outputs].index = num_outputs; entries[num_outputs++].heads = (uint8_t*)&(dcbtable[(headerlength + recordlength * i) + 1]); - } int has_lvds = false; uint8_t channel1 = 0, channel2 = 0; - for(i=0; i channel2) { + if (channel1 > channel2) + { uint8_t buff = channel1; channel1 = channel2; channel2 = buff; @@ -1027,21 +1071,27 @@ default_NVCAP[8] = channel2; // patching HEADS - for(i=0; i bufsize) { - printf("Filesize of %s is bigger than expected! Truncating to 0x%x Bytes!\n", filename, bufsize); + + if (size > bufsize) + { + printf("Filesize of %s is bigger than expected! Truncating to 0x%x Bytes!\n", + filename, bufsize); size = bufsize; } size = read(fd, (char *)buf, size); close(fd); + return size > 0 ? size : 0; } static int devprop_add_nvidia_template(struct DevPropDevice *device) { - char tmp[16]; - - if(!device) + char tmp[16]; + + if (!device) return 0; - - if(!DP_ADD_TEMP_VAL(device, nvidia_compatible_0)) + + if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_0)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_device_type_0)) + if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_0)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_name_0)) + if (!DP_ADD_TEMP_VAL(device, nvidia_name_0)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_compatible_1)) + if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_1)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_device_type_1)) + if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_1)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_name_1)) + if (!DP_ADD_TEMP_VAL(device, nvidia_name_1)) return 0; - if(!DP_ADD_TEMP_VAL(device, nvidia_device_type)) + if (!DP_ADD_TEMP_VAL(device, nvidia_device_type)) return 0; + // Rek : Dont use sprintf return, it does not WORK !! our custom sprintf() always return 0! // len = sprintf(tmp, "Slot-%x", devices_number); sprintf(tmp, "Slot-%x",devices_number); devprop_add_value(device, "AAPL,slot-name", (uint8_t *) tmp, strlen(tmp)); devices_number++; - + return 1; } int hex2bin(const char *hex, uint8_t *bin, int len) { char *p; - int i; + int i; char buf[3]; if (hex == NULL || bin == NULL || len <= 0 || strlen(hex) != len * 2) { @@ -1109,7 +1166,9 @@ buf[2] = '\0'; p = (char *) hex; - for (i=0; i= NV_ARCH_C0 + else // >= NV_ARCH_C0 + { vram_size = REG32(NVC0_MEM_CTRLR_RAM_AMOUNT) << 20; vram_size *= REG32(NVC0_MEM_CTRLR_COUNT); } - + // Workaround for GT 420/430 & 9600M GT switch (nvda_dev->device_id) { case 0x0DE1: vram_size = 1024*1024*1024; break; // GT 430 case 0x0DE2: vram_size = 1024*1024*1024; break; // GT 420 - case 0x0649: vram_size = 512*1024*1024; break; // 9600M GT + case 0x0649: vram_size = 512*1024*1024; break; // 9600M GT default: break; } @@ -1153,124 +1215,145 @@ bool setup_nvidia_devprop(pci_dt_t *nvda_dev) { - struct DevPropDevice *device; - char *devicepath; - option_rom_pci_header_t *rom_pci_header; - volatile uint8_t *regs; - uint8_t *rom; - uint8_t *nvRom; - uint8_t nvCardType; - unsigned long long videoRam; - uint32_t nvBiosOveride; - uint32_t bar[7]; - uint32_t boot_display; - int nvPatch; - int len; - char biosVersion[32]; - char nvFilename[32]; - char kNVCAP[12]; - char *model; - const char *value; - bool doit; - - + struct DevPropDevice *device; + char *devicepath; + option_rom_pci_header_t *rom_pci_header; + volatile uint8_t *regs; + uint8_t *rom; + uint8_t *nvRom; + uint8_t nvCardType; + unsigned long long videoRam; + uint32_t nvBiosOveride; + uint32_t bar[7]; + uint32_t boot_display; + int nvPatch; + int len; + char biosVersion[32]; + char nvFilename[32]; + char kNVCAP[12]; + char *model; + const char *value; + bool doit; + devicepath = get_pci_dev_path(nvda_dev); bar[0] = pci_config_read32(nvda_dev->dev.addr, 0x10 ); regs = (uint8_t *) (bar[0] & ~0x0f); // get card type nvCardType = (REG32(0) >> 20) & 0x1ff; - + // Amount of VRAM in kilobytes videoRam = mem_detect(regs, nvCardType, nvda_dev); model = get_nvidia_model((nvda_dev->vendor_id << 16) | nvda_dev->device_id); - verbose("nVidia %s %dMB NV%02x [%04x:%04x] :: %s\n", + verbose("nVidia %s %dMB NV%02x [%04x:%04x] :: %s\n", model, (uint32_t)(videoRam / 1024 / 1024), (REG32(0) >> 20) & 0x1ff, nvda_dev->vendor_id, nvda_dev->device_id, devicepath); - + rom = malloc(NVIDIA_ROM_SIZE); - sprintf(nvFilename, "/Extra/%04x_%04x.rom", (uint16_t)nvda_dev->vendor_id, (uint16_t)nvda_dev->device_id); - if (getBoolForKey(kUseNvidiaROM, &doit, &bootInfo->chameleonConfig) && doit) { + sprintf(nvFilename, "/Extra/%04x_%04x.rom", (uint16_t)nvda_dev->vendor_id, + (uint16_t)nvda_dev->device_id); + + if (getBoolForKey(kUseNvidiaROM, &doit, &bootInfo->chameleonConfig) && doit) + { verbose("Looking for nvidia video bios file %s\n", nvFilename); nvBiosOveride = load_nvidia_bios_file(nvFilename, rom, NVIDIA_ROM_SIZE); - if (nvBiosOveride > 0) { + + if (nvBiosOveride > 0) + { verbose("Using nVidia Video BIOS File %s (%d Bytes)\n", nvFilename, nvBiosOveride); DBG("%s Signature 0x%02x%02x %d bytes\n", nvFilename, rom[0], rom[1], nvBiosOveride); - } else { + } + else + { printf("ERROR: unable to open nVidia Video BIOS File %s\n", nvFilename); return false; } - } else { + } + else + { // Otherwise read bios from card nvBiosOveride = 0; - + // TODO: we should really check for the signature before copying the rom, i think. - + // PRAMIN first nvRom = (uint8_t*)®s[NV_PRAMIN_OFFSET]; bcopy((uint32_t *)nvRom, rom, NVIDIA_ROM_SIZE); // Valid Signature ? - if (rom[0] != 0x55 && rom[1] != 0xaa) { + if (rom[0] != 0x55 && rom[1] != 0xaa) + { // PROM next // Enable PROM access (REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_DISABLED; - + nvRom = (uint8_t*)®s[NV_PROM_OFFSET]; bcopy((uint8_t *)nvRom, rom, NVIDIA_ROM_SIZE); // disable PROM access - (REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED; - + (REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED; + // Valid Signature ? - if (rom[0] != 0x55 && rom[1] != 0xaa) { + if (rom[0] != 0x55 && rom[1] != 0xaa) + { // 0xC0000 last bcopy((char *)0xc0000, rom, NVIDIA_ROM_SIZE); // Valid Signature ? - if (rom[0] != 0x55 && rom[1] != 0xaa) { + if (rom[0] != 0x55 && rom[1] != 0xaa) + { printf("ERROR: Unable to locate nVidia Video BIOS\n"); return false; - } else { + } + else + { DBG("ROM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]); } - } else { + } + else + { DBG("PROM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]); } - } else { + } + else + { DBG("PRAM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]); } } - + if ((nvPatch = patch_nvidia_rom(rom)) == PATCH_ROM_FAILED) { printf("ERROR: nVidia ROM Patching Failed!\n"); //return false; } - + rom_pci_header = (option_rom_pci_header_t*)(rom + *(uint16_t *)&rom[24]); - + // check for 'PCIR' sig - if (rom_pci_header->signature == 0x50434952) { - if (rom_pci_header->device_id != nvda_dev->device_id) { + if (rom_pci_header->signature == 0x50434952) + { + if (rom_pci_header->device_id != nvda_dev->device_id) + { // Get Model from the OpROM model = get_nvidia_model((rom_pci_header->vendor_id << 16) | rom_pci_header->device_id); - } else { + } + else + { printf("nVidia incorrect PCI ROM signature: 0x%x\n", rom_pci_header->signature); } } - + if (!string) { string = devprop_create_string(); } device = devprop_add_device(string, devicepath); - + /* FIXME: for primary graphics card only */ boot_display = 1; devprop_add_value(device, "@0,AAPL,boot-display", (uint8_t*)&boot_display, 4); - - if(nvPatch == PATCH_ROM_SUCCESS_HAS_LVDS) { + + if (nvPatch == PATCH_ROM_SUCCESS_HAS_LVDS) { uint8_t built_in = 0x01; devprop_add_value(device, "@0,built-in", &built_in, 1); } @@ -1278,23 +1361,33 @@ // get bios version const int MAX_BIOS_VERSION_LENGTH = 32; char* version_str = (char*)malloc(MAX_BIOS_VERSION_LENGTH); + memset(version_str, 0, MAX_BIOS_VERSION_LENGTH); + int i, version_start; int crlf_count = 0; + // only search the first 384 bytes - for(i = 0; i < 0x180; i++) { - if(rom[i] == 0x0D && rom[i+1] == 0x0A) { + for (i = 0; i < 0x180; i++) + { + if (rom[i] == 0x0D && rom[i+1] == 0x0A) + { crlf_count++; // second 0x0D0A was found, extract bios version - if(crlf_count == 2) { - if(rom[i-1] == 0x20) i--; // strip last " " - for(version_start = i; version_start > (i-MAX_BIOS_VERSION_LENGTH); version_start--) { + if (crlf_count == 2) + { + if (rom[i-1] == 0x20) i--; // strip last " " + + for (version_start = i; version_start > (i-MAX_BIOS_VERSION_LENGTH); version_start--) + { // find start - if(rom[version_start] == 0x00) { + if (rom[version_start] == 0x00) + { version_start++; // strip "Version " - if(strncmp((const char*)rom+version_start, "Version ", 8) == 0) { + if (strncmp((const char*)rom+version_start, "Version ", 8) == 0) + { version_start += 8; } @@ -1308,60 +1401,54 @@ } sprintf(biosVersion, "%s", (nvBiosOveride > 0) ? nvFilename : version_str); - sprintf(kNVCAP, "NVCAP_%04x", nvda_dev->device_id); - if (getValueForKey(kNVCAP, &value, &len, &bootInfo->chameleonConfig) && len == NVCAP_LEN * 2) { - uint8_t new_NVCAP[NVCAP_LEN]; - - if (hex2bin(value, new_NVCAP, NVCAP_LEN) == 0) { + + if (getValueForKey(kNVCAP, &value, &len, &bootInfo->chameleonConfig) && len == NVCAP_LEN * 2) + { + uint8_t new_NVCAP[NVCAP_LEN]; + + if (hex2bin(value, new_NVCAP, NVCAP_LEN) == 0) + { verbose("Using user supplied NVCAP for %s :: %s\n", model, devicepath); memcpy(default_NVCAP, new_NVCAP, NVCAP_LEN); } } - - if (getValueForKey(kDcfg0, &value, &len, &bootInfo->chameleonConfig) && len == DCFG0_LEN * 2){ - - uint8_t new_dcfg0[DCFG0_LEN]; - - if (hex2bin(value, new_dcfg0, DCFG0_LEN) == 0) - { - - memcpy(default_dcfg_0, new_dcfg0, DCFG0_LEN); - - verbose("Using user supplied @0,display-cfg\n"); - printf("@0,display-cfg: %02x%02x%02x%02x\n", - default_dcfg_0[0], default_dcfg_0[1], default_dcfg_0[2], default_dcfg_0[3]); - - - } - } - - - if (getValueForKey(kDcfg1, &value, &len, &bootInfo->chameleonConfig) && len == DCFG1_LEN * 2){ - - uint8_t new_dcfg1[DCFG1_LEN]; - - if (hex2bin(value, new_dcfg1, DCFG1_LEN) == 0) - { - memcpy(default_dcfg_1, new_dcfg1, DCFG1_LEN); - - verbose("Using user supplied @1,display-cfg\n"); - printf("@1,display-cfg: %02x%02x%02x%02x\n", - default_dcfg_1[0], default_dcfg_1[1], default_dcfg_1[2], default_dcfg_1[3]); - - } - - } - - - - #if DEBUG_NVCAP - printf("NVCAP: %02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x\n", - default_NVCAP[0], default_NVCAP[1], default_NVCAP[2], default_NVCAP[3], - default_NVCAP[4], default_NVCAP[5], default_NVCAP[6], default_NVCAP[7], - default_NVCAP[8], default_NVCAP[9], default_NVCAP[10], default_NVCAP[11], - default_NVCAP[12], default_NVCAP[13], default_NVCAP[14], default_NVCAP[15], - default_NVCAP[16], default_NVCAP[17], default_NVCAP[18], default_NVCAP[19]); + + if (getValueForKey(kDcfg0, &value, &len, &bootInfo->chameleonConfig) && len == DCFG0_LEN * 2) + { + uint8_t new_dcfg0[DCFG0_LEN]; + + if (hex2bin(value, new_dcfg0, DCFG0_LEN) == 0) + { + memcpy(default_dcfg_0, new_dcfg0, DCFG0_LEN); + + verbose("Using user supplied @0,display-cfg\n"); + printf("@0,display-cfg: %02x%02x%02x%02x\n", + default_dcfg_0[0], default_dcfg_0[1], default_dcfg_0[2], default_dcfg_0[3]); + } + } + + if (getValueForKey(kDcfg1, &value, &len, &bootInfo->chameleonConfig) && len == DCFG1_LEN * 2) + { + uint8_t new_dcfg1[DCFG1_LEN]; + + if (hex2bin(value, new_dcfg1, DCFG1_LEN) == 0) + { + memcpy(default_dcfg_1, new_dcfg1, DCFG1_LEN); + + verbose("Using user supplied @1,display-cfg\n"); + printf("@1,display-cfg: %02x%02x%02x%02x\n", + default_dcfg_1[0], default_dcfg_1[1], default_dcfg_1[2], default_dcfg_1[3]); + } + } + +#if DEBUG_NVCAP + printf("NVCAP: %02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x%02x%02x\n", + default_NVCAP[0], default_NVCAP[1], default_NVCAP[2], default_NVCAP[3], + default_NVCAP[4], default_NVCAP[5], default_NVCAP[6], default_NVCAP[7], + default_NVCAP[8], default_NVCAP[9], default_NVCAP[10], default_NVCAP[11], + default_NVCAP[12], default_NVCAP[13], default_NVCAP[14], default_NVCAP[15], + default_NVCAP[16], default_NVCAP[17], default_NVCAP[18], default_NVCAP[19]); #endif devprop_add_nvidia_template(device); @@ -1369,22 +1456,23 @@ devprop_add_value(device, "VRAM,totalsize", (uint8_t*)&videoRam, 4); devprop_add_value(device, "model", (uint8_t*)model, strlen(model) + 1); devprop_add_value(device, "rom-revision", (uint8_t*)biosVersion, strlen(biosVersion) + 1); - devprop_add_value(device, "@0,display-cfg", default_dcfg_0, DCFG0_LEN); - devprop_add_value(device, "@1,display-cfg", default_dcfg_1, DCFG1_LEN); - - //add HDMI Audio back to nvidia - //http://forge.voodooprojects.org/p/chameleon/issues/67/ -// uint8_t connector_type_1[]= {0x00, 0x08, 0x00, 0x00}; -// devprop_add_value(device, "@1,connector-type",connector_type_1, 4); - //end Nvidia HDMI Audio - - if (getBoolForKey(kVBIOS, &doit, &bootInfo->chameleonConfig) && doit) { + devprop_add_value(device, "@0,display-cfg", default_dcfg_0, DCFG0_LEN); + devprop_add_value(device, "@1,display-cfg", default_dcfg_1, DCFG1_LEN); + + //add HDMI Audio back to nvidia + //http://forge.voodooprojects.org/p/chameleon/issues/67/ +// uint8_t connector_type_1[]= {0x00, 0x08, 0x00, 0x00}; +// devprop_add_value(device, "@1,connector-type",connector_type_1, 4); + //end Nvidia HDMI Audio + + if (getBoolForKey(kVBIOS, &doit, &bootInfo->chameleonConfig) && doit) + { devprop_add_value(device, "vbios", rom, (nvBiosOveride > 0) ? nvBiosOveride : (rom[2] * 512)); } - + stringdata = malloc(sizeof(uint8_t) * string->length); memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length); stringlength = string->length; - + return true; } Index: trunk/i386/libsaio/ati.c =================================================================== --- trunk/i386/libsaio/ati.c (revision 1157) +++ trunk/i386/libsaio/ati.c (revision 1158) @@ -5,8 +5,6 @@ * */ -#include "libsa.h" -#include "saio_internal.h" #include "boot.h" #include "bootstruct.h" #include "pci.h"