📄 nvidia.c
字号:
int i; for (i = 0; i < specs->modedb_len; i++) { if (specs->modedb[i].flag & FB_MODE_IS_FIRST) { modedb = specs->modedb[i]; break; } } } else { /* otherwise, get first mode in database */ modedb = specs->modedb[0]; } fb_videomode_to_var(&nvidiafb_default_var, &modedb); nvidiafb_default_var.bits_per_pixel = 8; } else if (par->fpWidth && par->fpHeight) { char buf[16]; memset(buf, 0, 16); snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight); fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb, specs->modedb_len, &modedb, 8); } if (mode_option) fb_find_mode(&nvidiafb_default_var, info, mode_option, specs->modedb, specs->modedb_len, &modedb, 8); info->var = nvidiafb_default_var; info->fix.visual = (info->var.bits_per_pixel == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; info->pseudo_palette = par->pseudo_palette; fb_alloc_cmap(&info->cmap, 256, 0); fb_destroy_modedb(info->monspecs.modedb); info->monspecs.modedb = NULL; /* maximize virtual vertical length */ lpitch = info->var.xres_virtual * ((info->var.bits_per_pixel + 7) >> 3); info->var.yres_virtual = info->screen_size / lpitch; info->pixmap.scan_align = 4; info->pixmap.buf_align = 4; info->pixmap.access_align = 32; info->pixmap.size = 8 * 1024; info->pixmap.flags = FB_PIXMAP_SYSTEM; if (!hwcur) info->fbops->fb_cursor = soft_cursor; info->var.accel_flags = (!noaccel); switch (par->Architecture) { case NV_ARCH_04: info->fix.accel = FB_ACCEL_NV4; break; case NV_ARCH_10: info->fix.accel = FB_ACCEL_NV_10; break; case NV_ARCH_20: info->fix.accel = FB_ACCEL_NV_20; break; case NV_ARCH_30: info->fix.accel = FB_ACCEL_NV_30; break; case NV_ARCH_40: info->fix.accel = FB_ACCEL_NV_40; break; } NVTRACE_LEAVE(); return nvidiafb_check_var(&info->var, info);}static u32 __devinit nvidia_get_arch(struct pci_dev *pd){ u32 arch = 0; switch (pd->device & 0x0ff0) { case 0x0100: /* GeForce 256 */ case 0x0110: /* GeForce2 MX */ case 0x0150: /* GeForce2 */ case 0x0170: /* GeForce4 MX */ case 0x0180: /* GeForce4 MX (8x AGP) */ case 0x01A0: /* nForce */ case 0x01F0: /* nForce2 */ arch = NV_ARCH_10; break; case 0x0200: /* GeForce3 */ case 0x0250: /* GeForce4 Ti */ case 0x0280: /* GeForce4 Ti (8x AGP) */ arch = NV_ARCH_20; break; case 0x0300: /* GeForceFX 5800 */ case 0x0310: /* GeForceFX 5600 */ case 0x0320: /* GeForceFX 5200 */ case 0x0330: /* GeForceFX 5900 */ case 0x0340: /* GeForceFX 5700 */ arch = NV_ARCH_30; break; case 0x0040: case 0x00C0: case 0x0120: case 0x0130: case 0x0140: case 0x0160: case 0x01D0: case 0x0090: case 0x0210: case 0x0220: case 0x0230: arch = NV_ARCH_40; break; case 0x0020: /* TNT, TNT2 */ arch = NV_ARCH_04; break; default: /* unknown architecture */ break; } return arch;}static int __devinit nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent){ struct nvidia_par *par; struct fb_info *info; unsigned short cmd; NVTRACE_ENTER(); assert(pd != NULL); info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev); if (!info) goto err_out; par = (struct nvidia_par *)info->par; par->pci_dev = pd; info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL); if (info->pixmap.addr == NULL) goto err_out_kfree; memset(info->pixmap.addr, 0, 8 * 1024); if (pci_enable_device(pd)) { printk(KERN_ERR PFX "cannot enable PCI device\n"); goto err_out_enable; } if (pci_request_regions(pd, "nvidiafb")) { printk(KERN_ERR PFX "cannot request PCI regions\n"); goto err_out_request; } par->Architecture = nvidia_get_arch(pd); par->Chipset = (pd->vendor << 16) | pd->device; printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset); if (par->Architecture == 0) { printk(KERN_ERR PFX "unknown NV_ARCH\n"); goto err_out_free_base0; } sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4); par->FlatPanel = flatpanel; if (flatpanel == 1) printk(KERN_INFO PFX "flatpanel support enabled\n"); par->CRTCnumber = forceCRTC; par->FpScale = (!noscale); par->paneltweak = paneltweak; /* enable IO and mem if not already done */ pci_read_config_word(pd, PCI_COMMAND, &cmd); cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY); pci_write_config_word(pd, PCI_COMMAND, cmd); nvidiafb_fix.mmio_start = pci_resource_start(pd, 0); nvidiafb_fix.smem_start = pci_resource_start(pd, 1); nvidiafb_fix.mmio_len = pci_resource_len(pd, 0); par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len); if (!par->REGS) { printk(KERN_ERR PFX "cannot ioremap MMIO base\n"); goto err_out_free_base0; } NVCommonSetup(info); par->FbAddress = nvidiafb_fix.smem_start; par->FbMapSize = par->RamAmountKBytes * 1024; if (vram && vram * 1024 * 1024 < par->FbMapSize) par->FbMapSize = vram * 1024 * 1024; /* Limit amount of vram to 64 MB */ if (par->FbMapSize > 64 * 1024 * 1024) par->FbMapSize = 64 * 1024 * 1024; par->FbUsableSize = par->FbMapSize - (128 * 1024); par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 : 16 * 1024; par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize; info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize); info->screen_size = par->FbUsableSize; nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024; if (!info->screen_base) { printk(KERN_ERR PFX "cannot ioremap FB base\n"); goto err_out_free_base1; } par->FbStart = info->screen_base;#ifdef CONFIG_MTRR if (!nomtrr) { par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start, par->RamAmountKBytes * 1024, MTRR_TYPE_WRCOMB, 1); if (par->mtrr.vram < 0) { printk(KERN_ERR PFX "unable to setup MTRR\n"); } else { par->mtrr.vram_valid = 1; /* let there be speed */ printk(KERN_INFO PFX "MTRR set to ON\n"); } }#endif /* CONFIG_MTRR */ info->fbops = &nvidia_fb_ops; info->fix = nvidiafb_fix; if (nvidia_set_fbinfo(info) < 0) { printk(KERN_ERR PFX "error setting initial video mode\n"); goto err_out_iounmap_fb; } nvidia_save_vga(par, &par->SavedReg); if (register_framebuffer(info) < 0) { printk(KERN_ERR PFX "error registering nVidia framebuffer\n"); goto err_out_iounmap_fb; } pci_set_drvdata(pd, info); printk(KERN_INFO PFX "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n", info->fix.id, par->FbMapSize / (1024 * 1024), info->fix.smem_start);#ifdef CONFIG_PMAC_BACKLIGHT if (par->FlatPanel && _machine == _MACH_Pmac) register_backlight_controller(&nvidia_backlight_controller, par, "mnca");#endif NVTRACE_LEAVE(); return 0; err_out_iounmap_fb: iounmap(info->screen_base); err_out_free_base1: fb_destroy_modedb(info->monspecs.modedb); nvidia_delete_i2c_busses(par); iounmap(par->REGS); err_out_free_base0: pci_release_regions(pd); err_out_request: pci_disable_device(pd); err_out_enable: kfree(info->pixmap.addr); err_out_kfree: framebuffer_release(info); err_out: return -ENODEV;}static void __exit nvidiafb_remove(struct pci_dev *pd){ struct fb_info *info = pci_get_drvdata(pd); struct nvidia_par *par = info->par; NVTRACE_ENTER(); if (!info) return; unregister_framebuffer(info);#ifdef CONFIG_MTRR if (par->mtrr.vram_valid) mtrr_del(par->mtrr.vram, info->fix.smem_start, info->fix.smem_len);#endif /* CONFIG_MTRR */ iounmap(info->screen_base); fb_destroy_modedb(info->monspecs.modedb); nvidia_delete_i2c_busses(par); iounmap(par->REGS); pci_release_regions(pd); pci_disable_device(pd); kfree(info->pixmap.addr); framebuffer_release(info); pci_set_drvdata(pd, NULL); NVTRACE_LEAVE();}/* ------------------------------------------------------------------------- * * * initialization * * ------------------------------------------------------------------------- */#ifndef MODULEstatic int __devinit nvidiafb_setup(char *options){ char *this_opt; NVTRACE_ENTER(); if (!options || !*options) return 0; while ((this_opt = strsep(&options, ",")) != NULL) { if (!strncmp(this_opt, "forceCRTC", 9)) { char *p; p = this_opt + 9; if (!*p || !*(++p)) continue; forceCRTC = *p - '0'; if (forceCRTC < 0 || forceCRTC > 1) forceCRTC = -1; } else if (!strncmp(this_opt, "flatpanel", 9)) { flatpanel = 1; } else if (!strncmp(this_opt, "hwcur", 5)) { hwcur = 1; } else if (!strncmp(this_opt, "noaccel", 6)) { noaccel = 1; } else if (!strncmp(this_opt, "noscale", 7)) { noscale = 1; } else if (!strncmp(this_opt, "paneltweak:", 11)) { paneltweak = simple_strtoul(this_opt+11, NULL, 0); } else if (!strncmp(this_opt, "vram:", 5)) { vram = simple_strtoul(this_opt+5, NULL, 0);#ifdef CONFIG_MTRR } else if (!strncmp(this_opt, "nomtrr", 6)) { nomtrr = 1;#endif } else mode_option = this_opt; } NVTRACE_LEAVE(); return 0;}#endif /* !MODULE */static struct pci_driver nvidiafb_driver = { .name = "nvidiafb", .id_table = nvidiafb_pci_tbl, .probe = nvidiafb_probe, .remove = __exit_p(nvidiafb_remove),};/* ------------------------------------------------------------------------- * * * modularization * * ------------------------------------------------------------------------- */static int __devinit nvidiafb_init(void){#ifndef MODULE char *option = NULL; if (fb_get_options("nvidiafb", &option)) return -ENODEV; nvidiafb_setup(option);#endif return pci_register_driver(&nvidiafb_driver);}module_init(nvidiafb_init);#ifdef MODULEstatic void __exit nvidiafb_exit(void){ pci_unregister_driver(&nvidiafb_driver);}module_exit(nvidiafb_exit);module_param(flatpanel, int, 0);MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. " "(0 or 1=enabled) (default=0)");module_param(hwcur, int, 0);MODULE_PARM_DESC(hwcur, "Enables hardware cursor implementation. (0 or 1=enabled) " "(default=0)");module_param(noaccel, int, 0);MODULE_PARM_DESC(noaccel, "Disables hardware acceleration. (0 or 1=disable) " "(default=0)");module_param(noscale, int, 0);MODULE_PARM_DESC(noscale, "Disables screen scaleing. (0 or 1=disable) " "(default=0, do scaling)");module_param(paneltweak, int, 0);MODULE_PARM_DESC(paneltweak, "Tweak display settings for flatpanels. " "(default=0, no tweaks)");module_param(forceCRTC, int, 0);MODULE_PARM_DESC(forceCRTC, "Forces usage of a particular CRTC in case autodetection " "fails. (0 or 1) (default=autodetect)");module_param(vram, int, 0);MODULE_PARM_DESC(vram, "amount of framebuffer memory to remap in MiB" "(default=0 - remap entire memory)");#ifdef CONFIG_MTRRmodule_param(nomtrr, bool, 0);MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) " "(default=0)");#endifMODULE_AUTHOR("Antonino Daplas");MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");MODULE_LICENSE("GPL");#endif /* MODULE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -