␉default_NVCAP[8] = channel2;␊ |
␉␊ |
␉// patching HEADS␊ |
␉for (i = 0; i < num_outputs; i++) {␊ |
␉␉if (channel1 & (1 << i)) {␊ |
␉for (i = 0; i < num_outputs; i++)␊ |
␉{␊ |
␉␉if (channel1 & (1 << i))␊ |
␉␉{␊ |
␉␉␉*entries[i].heads = 1;␊ |
␉␉} else if(channel2 & (1 << i)) {␊ |
␉␉}␊ |
␉␉else if(channel2 & (1 << i))␊ |
␉␉{␊ |
␉␉␉*entries[i].heads = 2;␊ |
␉␉}␊ |
␉}␊ |
|
␊ |
␉// First check in the plist, (for e.g this can override any hardcoded devices)␊ |
␉cardList_t * nvcard = FindCardWithIds(device_id, subsys_id);␊ |
␉if (nvcard) {␊ |
␉␉if (nvcard->model) {␊ |
␉if (nvcard)␊ |
␉{␊ |
␉␉if (nvcard->model)␊ |
␉␉{␊ |
␉␉␉return nvcard->model;␊ |
␉␉}␊ |
␉}␊ |
␊ |
␉//ErmaC added selector for Chameleon "old" style in System Profiler␊ |
␉if (getBoolForKey(kNvidiaGeneric, &showGeneric, &bootInfo->chameleonConfig)) {␊ |
␉if (getBoolForKey(kNvidiaGeneric, &showGeneric, &bootInfo->chameleonConfig))␊ |
␉{␊ |
␉␉verbose("NvidiaGeneric = Yes\n");␊ |
␊ |
␉␉for (i = 1; i < (sizeof(nvidia_card_generic) / sizeof(nvidia_card_generic[0])); i++) {␊ |
␉␉␉if (nvidia_card_generic[i].device == device_id) {␊ |
␉␉for (i = 1; i < (sizeof(nvidia_card_generic) / sizeof(nvidia_card_generic[0])); i++)␊ |
␉␉{␊ |
␉␉␉if (nvidia_card_generic[i].device == device_id)␊ |
␉␉␉{␊ |
␉␉␉␉return nvidia_card_generic[i].name;␊ |
␉␉␉}␊ |
␉␉}␊ |
|
␉}␊ |
␊ |
␉// Then check the exceptions table␊ |
␉if (subsys_id) {␊ |
␉␉for (i = 0; i < (sizeof(nvidia_card_exceptions) / sizeof(nvidia_card_exceptions[0])); i++) {␊ |
␉␉␉if ((nvidia_card_exceptions[i].device == device_id) && (nvidia_card_exceptions[i].subdev == subsys_id))␉{␊ |
␉if (subsys_id)␊ |
␉{␊ |
␉␉for (i = 0; i < (sizeof(nvidia_card_exceptions) / sizeof(nvidia_card_exceptions[0])); i++)␊ |
␉␉{␊ |
␉␉␉if ((nvidia_card_exceptions[i].device == device_id) && (nvidia_card_exceptions[i].subdev == subsys_id))␊ |
␉␉␉{␊ |
␉␉␉␉return nvidia_card_exceptions[i].name;␊ |
␉␉␉}␊ |
␉␉}␊ |
␉}␊ |
␊ |
␉// At last try the generic names␊ |
␉for (i = 1; i < (sizeof(nvidia_card_generic) / sizeof(nvidia_card_generic[0])); i++) {␊ |
␉if (nvidia_card_generic[i].device == device_id) {␊ |
␉␉␉if (subsys_id) {␊ |
␉␉␉␉for (j = 0; j < (sizeof(nvidia_card_vendors) / sizeof(nvidia_card_vendors[0])); j++) {␊ |
␉␉␉␉␉if (nvidia_card_vendors[j].device == (subsys_id & 0xffff0000)) {␊ |
␉for (i = 1; i < (sizeof(nvidia_card_generic) / sizeof(nvidia_card_generic[0])); i++)␊ |
␉{␊ |
␉␉if (nvidia_card_generic[i].device == device_id)␊ |
␉␉{␊ |
␉␉␉if (subsys_id)␊ |
␉␉␉{␊ |
␉␉␉␉for (j = 0; j < (sizeof(nvidia_card_vendors) / sizeof(nvidia_card_vendors[0])); j++)␊ |
␉␉␉␉{␊ |
␉␉␉␉␉if (nvidia_card_vendors[j].device == (subsys_id & 0xffff0000))␊ |
␉␉␉␉␉{␊ |
␉␉␉␉␉␉snprintf(generic_name, 128, "%s %s", // sizeof(generic_name), "%s %s",␊ |
␉␉␉␉␉␉␉nvidia_card_vendors[j].name, nvidia_card_generic[i].name);␊ |
␉␉␉␉␉␉return &generic_name[0];␊ |
|
␉int fd;␊ |
␉int size;␊ |
␊ |
␉if ((fd = open_bvdev("bt(0,0)", filename, 0)) < 0) {␊ |
␉if ((fd = open_bvdev("bt(0,0)", filename, 0)) < 0)␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉size = file_size(fd);␊ |
␊ |
␉if (size) {␊ |
␉if (size)␊ |
␉{␊ |
␉␉*buf = malloc(size);␊ |
␉␉size = read(fd, (char *)buf, size);␊ |
␉}␊ |
|
␉␉return 0;␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_0))␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_0))␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_name_0))␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_compatible_1))␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_1))␊ |
␉{␊ |
␉␉return 0;␊ |
␉}␊ |
␊ |
␉if (!DP_ADD_TEMP_VAL(device, nvidia_name_1))␊ |
␉{␊ |
␉␉return 0;␊ |
␉if (devices_number == 1) {␊ |
␉}␊ |
␊ |
␉if (devices_number == 1)␊ |
␉{␊ |
␉␉if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_parent))␊ |
␉␉{␊ |
␉␉␉return 0;␊ |
␉} else {␊ |
␉␉}␊ |
␉}␊ |
␉else␊ |
␉{␊ |
␉␉if (!DP_ADD_TEMP_VAL(device, nvidia_device_type_child))␊ |
␉␉{␊ |
␉␉␉return 0;␊ |
␉␉}␊ |
␉}␊ |
␊ |
␉// Rek : Dont use sprintf return, it does not WORK !! our custom sprintf() always return 0!␊ |
|
␉␉␉// 10DE0F0014583544 2GB VRAM␊ |
␉␉␉//if (((nvda_dev->subsys_id.subsys.vendor_id << 16) | nvda_dev->subsys_id.subsys.device_id) == 0x14583544 )␊ |
␉␉␉//{␊ |
␉␉␉␉vram_size = -2147483648UL;//2147483648;␊ |
␉␉␉␉vram_size = -2147483648UL; // 2147483648;␊ |
␉␉␉//}␊ |
␉␉␉break;␊ |
␉␉case 0x11C6:␉// GTX650TI 11C6␊ |
|
␉␉␉break;␊ |
␉}␊ |
␊ |
␉if (!vram_size)␉{ // Finally, if vram_size still not set do the calculation with our own method␊ |
␉␉if (nvCardType < NV_ARCH_50) {␊ |
␉if (!vram_size)␊ |
␉{ // Finally, if vram_size still not set do the calculation with our own method␊ |
␉␉if (nvCardType < NV_ARCH_50)␊ |
␉␉{␊ |
␉␉␉vram_size = REG32(NV04_PFB_FIFO_DATA);␊ |
␉␉␉vram_size &= NV10_PFB_FIFO_DATA_RAM_AMOUNT_MB_MASK;␊ |
␉␉} else if (nvCardType < NV_ARCH_C0) {␊ |
␉␉}␊ |
␉␉else if (nvCardType < NV_ARCH_C0)␊ |
␉␉{␊ |
␉␉␉vram_size = REG32(NV04_PFB_FIFO_DATA);␊ |
␉␉␉vram_size |= (vram_size & 0xff) << 32;␊ |
␉␉␉vram_size &= 0xffffffff00ll;␊ |
␉␉} else { // >= NV_ARCH_C0␊ |
␉␉}␊ |
␉␉else␊ |
␉␉{ // >= NV_ARCH_C0␊ |
␉␉␉vram_size = REG32(NVC0_MEM_CTRLR_RAM_AMOUNT) << 20;␊ |
␉␉␉vram_size *= REG32(NVC0_MEM_CTRLR_COUNT);␊ |
␉␉}␊ |
|
␉␉verbose("Looking for nvidia video bios file %s\n", nvFilename);␊ |
␉␉nvBiosOveride = load_nvidia_bios_file(nvFilename, &rom);␊ |
␊ |
␉␉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);␊ |
␉␉␉free(rom);␊ |
␉␉␉return false;␊ |
␉␉}␊ |
␉} else {␊ |
␉}␊ |
␉else␊ |
␉{␊ |
␉␉uint8_t␉*nvRom;␊ |
␉␉rom = malloc(NVIDIA_ROM_SIZE);␊ |
␉␉// Otherwise read bios from card␊ |
|
␉␉nvRom = (uint8_t*)®s[NV_PROM_OFFSET];␊ |
␊ |
␉␉// Valid Signature ?␊ |
␉␉if (checkNvRomSig(nvRom)) {␊ |
␉␉if (checkNvRomSig(nvRom))␊ |
␉␉{␊ |
␉␉␉bcopy((uint8_t *)nvRom, rom, NVIDIA_ROM_SIZE);␊ |
␉␉␉DBG("PROM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]);␊ |
␉␉} else {␊ |
␉␉}␊ |
␉␉else␊ |
␉␉{␊ |
␊ |
␉␉␉// disable PROM access␊ |
␉␉␉(REG32(NV_PBUS_PCI_NV_20)) = NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED;␊ |
|
␉␉␉//PRAM next␊ |
␉␉␉nvRom = (uint8_t*)®s[NV_PRAMIN_OFFSET];␊ |
␊ |
␉␉␉if(checkNvRomSig(nvRom)) {␊ |
␉␉␉if(checkNvRomSig(nvRom))␊ |
␉␉␉{␊ |
␉␉␉␉bcopy((uint32_t *)nvRom, rom, NVIDIA_ROM_SIZE);␊ |
␉␉␉␉DBG("PRAM Address 0x%x Signature 0x%02x%02x\n", nvRom, rom[0], rom[1]);␊ |
␉␉␉} else {␊ |
␉␉␉}␊ |
␉␉␉else␊ |
␉␉␉{␊ |
␉␉␉␉// 0xC0000 last␊ |
␉␉␉␉bcopy((char *)0xc0000, rom, NVIDIA_ROM_SIZE);␊ |
␊ |
␉␉␉␉// Valid Signature ?␊ |
␉␉␉␉if (!checkNvRomSig(rom)) {␊ |
␉␉␉␉if (!checkNvRomSig(rom))␊ |
␉␉␉␉{␊ |
␉␉␉␉␉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]);␊ |
␉␉}␊ |
␉␉}//end PRAM check␊ |
}//end PROM check␊ |
␉}//end load rom from bios␊ |
␊ |
␉if ((nvPatch = patch_nvidia_rom(rom)) == PATCH_ROM_FAILED) {␊ |
␉if ((nvPatch = patch_nvidia_rom(rom)) == PATCH_ROM_FAILED)␊ |
␉{␊ |
␉␉printf("ERROR: nVidia ROM Patching Failed!\n");␊ |
␉␉free(rom);␊ |
␉␉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), 0);␊ |
␊ |
␉␉␉// Get VRAM again␊ |
␉␉␉videoRam = mem_detect(regs, nvCardType, nvda_dev, ((rom_pci_header->vendor_id << 16) | rom_pci_header->device_id), 0);␊ |
␊ |
␉␉} else {␊ |
␉␉}␊ |
␉␉else␊ |
␉␉{␊ |
␉␉␉printf("nVidia incorrect PCI ROM signature: 0x%x\n", rom_pci_header->signature);␊ |
␉␉}␊ |
␉}␊ |
|
␉␉␉nvda_dev->subsys_id.subsys.vendor_id, nvda_dev->subsys_id.subsys.device_id,␊ |
␉␉␉devicepath, devices_number);␊ |
␊ |
␉if (!string) {␊ |
␉if (!string)␊ |
␉{␊ |
␉␉string = devprop_create_string();␊ |
␉}␊ |
␉device = devprop_add_device(string, devicepath);␊ |
␊ |
␉/* FIXME: for primary graphics card only */␊ |
␉boot_display = 1;␊ |
␉if (devices_number == 1) {␊ |
␉␉devprop_add_value(device, "@0,AAPL,boot-display", (uint8_t*)&boot_display, 4);␊ |
␉if (devices_number == 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);␊ |
␉}␊ |
|
␉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 (crlf_count == 2)␊ |
␉␉␉{␊ |
␉␉␉␉if (rom[i-1] == 0x20) i--; // strip last " "␊ |
␊ |
␉␉␉␉for (version_start = i; version_start > (i-MAX_BIOS_VERSION_LENGTH); version_start--) {␊ |
␉␉␉␉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;␊ |
␉␉␉␉␉␉}␊ |
␊ |
|
␉snprintf(biosVersion, sizeof(biosVersion), "%s", (nvBiosOveride > 0) ? nvFilename : version_str);␊ |
␉snprintf(kNVCAP, sizeof(kNVCAP), "NVCAP_%04x", nvda_dev->device_id);␊ |
␊ |
␉if (getValueForKey(kNVCAP, &value, &len, &bootInfo->chameleonConfig) && len == NVCAP_LEN * 2) {␊ |
␉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 (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) {␊ |
␉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) {␊ |
␉␉if (hex2bin(value, new_dcfg0, DCFG0_LEN) == 0)␊ |
␉␉{␊ |
␉␉␉memcpy(default_dcfg_0, new_dcfg0, DCFG0_LEN);␊ |
␊ |
␉␉␉verbose("Using user supplied @0,display-cfg\n");␊ |
|
␉␉}␊ |
␉}␊ |
␊ |
␉if (getValueForKey(kDcfg1, &value, &len, &bootInfo->chameleonConfig) && len == DCFG1_LEN * 2) {␊ |
␉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) {␊ |
␉␉if (hex2bin(value, new_dcfg1, DCFG1_LEN) == 0)␊ |
␉␉{␊ |
␉␉␉memcpy(default_dcfg_1, new_dcfg1, DCFG1_LEN);␊ |
␊ |
␉␉␉verbose("Using user supplied @1,display-cfg\n");␊ |
|
␉/******************** Added Marchrius.**********************/␊ |
␉// For the AppleBacklightDisplay //␊ |
␉/***********************************************************/␊ |
␉if (getBoolForKey(kEnableBacklight, &doit, &bootInfo->chameleonConfig) && doit)␉{␊ |
␉if (getBoolForKey(kEnableBacklight, &doit, &bootInfo->chameleonConfig) && doit)␊ |
␉{␊ |
␉␉uint8_t AAPL_value[] = {0x01, 0x00, 0x00, 0x00}; //Is the same for all␊ |
␉␉devprop_add_value(device, "AAPL,HasPanel", AAPL_value, 4);␊ |
␉␉devprop_add_value(device, "AAPL,Haslid", AAPL_value, 4);␊ |
|
␉/***********************************************************/␊ |
␉// For the DualLink //␊ |
␉/***********************************************************/␊ |
␉if (getBoolForKey(kEnableDualLink, &doit, &bootInfo->chameleonConfig) && doit) {␊ |
␉if (getBoolForKey(kEnableDualLink, &doit, &bootInfo->chameleonConfig) && doit)␊ |
␉{␊ |
␉␉uint8_t AAPL00_value[] = {0x01, 0x00, 0x00, 0x00};␊ |
␉␉devprop_add_value(device, "AAPL00,DualLink", AAPL00_value, 4);␊ |
␉}␊ |
|
␉/************************ HDMI Audio ***********************/␊ |
␉doit = false;␊ |
␉//http://forge.voodooprojects.org/p/chameleon/issues/67/␊ |
␉if(getBoolForKey(kEnableHDMIAudio, &doit, &bootInfo->chameleonConfig) && doit) {␊ |
␉if(getBoolForKey(kEnableHDMIAudio, &doit, &bootInfo->chameleonConfig) && doit)␊ |
␉{␊ |
␉␉static uint8_t connector_type_1[]= {0x00, 0x08, 0x00, 0x00};␊ |
␉␉devprop_add_value(device, "@0,connector-type",connector_type_1, 4);␊ |
␉␉//devprop_add_value(device, "@0,connector-type",connector_type_1, 4);␊ |
␉␉devprop_add_value(device, "@1,connector-type",connector_type_1, 4);␊ |
␉␉devprop_add_value(device, "@2,connector-type",connector_type_1, 4);␊ |
␉␉devprop_add_value(device, "@3,connector-type",connector_type_1, 4);␊ |
␉␉//devprop_add_value(device, "@2,connector-type",connector_type_1, 4);␊ |
␉␉//devprop_add_value(device, "@3,connector-type",connector_type_1, 4);␊ |
␉}␊ |
␉/************************ End Audio *************************/␊ |
␊ |
␉if (getBoolForKey(kVBIOS, &doit, &bootInfo->chameleonConfig) && doit) {␊ |
␉if (getBoolForKey(kVBIOS, &doit, &bootInfo->chameleonConfig) && doit)␊ |
␉{␊ |
␉␉devprop_add_value(device, "vbios", rom, (nvBiosOveride > 0) ? nvBiosOveride : (rom[2] * 512));␊ |
␉}␊ |
␊ |