⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i810_main.c

📁 h内核
💻 C
📖 第 1 页 / 共 4 页
字号:
			par->cursor_heap.offset);	info->fbops->fb_blank(VESA_NO_BLANKING, info);	par->cur_state = 0;	return 0;}/*********************************************************************** *                  AGP resource allocation                            * ***********************************************************************/  static void __devinit i810_fix_pointers(struct i810fb_par *par){      	par->fb.physical = par->aperture.physical+(par->fb.offset << 12);	par->fb.virtual = par->aperture.virtual+(par->fb.offset << 12);	par->iring.physical = par->aperture.physical + 		(par->iring.offset << 12);	par->iring.virtual = par->aperture.virtual + 		(par->iring.offset << 12);	par->cursor_heap.virtual = par->aperture.virtual+		(par->cursor_heap.offset << 12);}static void __devinit i810_fix_offsets(struct i810fb_par *par){	if (vram + 1 > par->aperture.size >> 20)		vram = (par->aperture.size >> 20) - 1;	if (v_offset_default > (par->aperture.size >> 20))		v_offset_default = (par->aperture.size >> 20);	if (vram + v_offset_default + 1 > par->aperture.size >> 20)		v_offset_default = (par->aperture.size >> 20) - (vram + 1);	par->fb.size = vram << 20;	par->fb.offset = v_offset_default << 20;	par->fb.offset >>= 12;	par->iring.offset = par->fb.offset + (par->fb.size >> 12);	par->iring.size = RINGBUFFER_SIZE;	par->cursor_heap.offset = par->iring.offset + (RINGBUFFER_SIZE >> 12);	par->cursor_heap.size = 4096;}static int __devinit i810_alloc_agp_mem(struct fb_info *info){	struct i810fb_par *par = (struct i810fb_par *) info->par;	int size;		i810_fix_offsets(par);	size = par->fb.size + par->iring.size;	if (agp_backend_acquire()) {		printk("i810fb_alloc_fbmem: cannot acquire agpgart\n");		return -ENODEV;	}	if (!(par->i810_gtt.i810_fb_memory = 	      agp_allocate_memory(size >> 12, AGP_NORMAL_MEMORY))) {		printk("i810fb_alloc_fbmem: can't allocate framebuffer "		       "memory\n");		agp_backend_release();		return -ENOMEM;	}	if (agp_bind_memory(par->i810_gtt.i810_fb_memory,			    par->fb.offset)) {		printk("i810fb_alloc_fbmem: can't bind framebuffer memory\n");		agp_backend_release();		return -EBUSY;	}			if (!(par->i810_gtt.i810_cursor_memory = 	      agp_allocate_memory(par->cursor_heap.size >> 12,				  AGP_PHYSICAL_MEMORY))) {		printk("i810fb_alloc_cursormem:  can't allocate" 		       "cursor memory\n");		agp_backend_release();		return -ENOMEM;	}	if (agp_bind_memory(par->i810_gtt.i810_cursor_memory,			    par->cursor_heap.offset)) {		printk("i810fb_alloc_cursormem: cannot bind cursor memory\n");		agp_backend_release();		return -EBUSY;	}		par->cursor_heap.physical = par->i810_gtt.i810_cursor_memory->physical;	i810_fix_pointers(par);	agp_backend_release();	return 0;}/***************************************************************  *                    Initialization                           *  ***************************************************************//** * i810_init_monspecs * @info: pointer to device specific info structure * * DESCRIPTION: * Sets the the user monitor's horizontal and vertical * frequency limits */static void __devinit i810_init_monspecs(struct fb_info *info){	if (!hsync1)		hsync1 = HFMIN;	if (!hsync2) 		hsync2 = HFMAX;	if (!info->monspecs.hfmax)		info->monspecs.hfmax = hsync2;	if (!info->monspecs.hfmin)		info->monspecs.hfmin = hsync1;	if (hsync2 < hsync1)		info->monspecs.hfmin = hsync2;	if (!vsync1)		vsync1 = VFMIN;	if (!vsync2) 		vsync2 = VFMAX;	if (IS_DVT && vsync1 < 60)		vsync1 = 60;	if (!info->monspecs.vfmax)		info->monspecs.vfmax = vsync2;	if (!info->monspecs.vfmin)		info->monspecs.vfmin = vsync1;	if (vsync2 < vsync1) 		info->monspecs.vfmin = vsync2;}/** * i810_init_defaults - initializes default values to use * @par: pointer to i810fb_par structure * @info: pointer to current fb_info structure */static void __devinit i810_init_defaults(struct i810fb_par *par, 				      struct fb_info *info){	if (voffset) 		v_offset_default = voffset;	else if (par->aperture.size > 32 * 1024 * 1024)		v_offset_default = 16;	else		v_offset_default = 8;	if (!vram) 		vram = 1;	if (accel) 		par->dev_flags |= HAS_ACCELERATION;	if (sync) 		par->dev_flags |= ALWAYS_SYNC;	if (bpp < 8)		bpp = 8;		if (!vyres) 		vyres = (vram << 20)/(xres*bpp >> 3);	par->i810fb_ops = i810fb_ops;	info->var.xres = xres;	info->var.yres = yres;	info->var.yres_virtual = vyres;	info->var.bits_per_pixel = bpp;	if (dcolor)		info->var.nonstd = 1;	if (par->dev_flags & HAS_ACCELERATION) 		info->var.accel_flags = 1;	i810_init_monspecs(info);}	/** * i810_init_device - initialize device * @par: pointer to i810fb_par structure */static void __devinit i810_init_device(struct i810fb_par *par){	u8 reg;	u8 __iomem *mmio = par->mmio_start_virtual;	if (mtrr) set_mtrr(par);	i810_init_cursor(par);	/* mvo: enable external vga-connector (for laptops) */	if (ext_vga) {		i810_writel(HVSYNC, mmio, 0);		i810_writel(PWR_CLKC, mmio, 3);	}	pci_read_config_byte(par->dev, 0x50, &reg);	reg &= FREQ_MASK;	par->mem_freq = (reg) ? 133 : 100;}static int __devinit i810_allocate_pci_resource(struct i810fb_par *par, 			   const struct pci_device_id *entry){	int err;	if ((err = pci_enable_device(par->dev))) { 		printk("i810fb_init: cannot enable device\n");		return err;			}	par->res_flags |= PCI_DEVICE_ENABLED;	if (pci_resource_len(par->dev, 0) > 512 * 1024) {		par->aperture.physical = pci_resource_start(par->dev, 0);		par->aperture.size = pci_resource_len(par->dev, 0);		par->mmio_start_phys = pci_resource_start(par->dev, 1);	} else {		par->aperture.physical = pci_resource_start(par->dev, 1);		par->aperture.size = pci_resource_len(par->dev, 1);		par->mmio_start_phys = pci_resource_start(par->dev, 0);	}	if (!par->aperture.size) {		printk("i810fb_init: device is disabled\n");		return -ENOMEM;	}	if (!request_mem_region(par->aperture.physical, 				par->aperture.size, 				i810_pci_list[entry->driver_data])) {		printk("i810fb_init: cannot request framebuffer region\n");		return -ENODEV;	}	par->res_flags |= FRAMEBUFFER_REQ;	par->aperture.virtual = ioremap_nocache(par->aperture.physical, 					par->aperture.size);	if (!par->aperture.virtual) {		printk("i810fb_init: cannot remap framebuffer region\n");		return -ENODEV;	}  	if (!request_mem_region(par->mmio_start_phys, 				MMIO_SIZE, 				i810_pci_list[entry->driver_data])) {		printk("i810fb_init: cannot request mmio region\n");		return -ENODEV;	}	par->res_flags |= MMIO_REQ;	par->mmio_start_virtual = ioremap_nocache(par->mmio_start_phys, 						  MMIO_SIZE);	if (!par->mmio_start_virtual) {		printk("i810fb_init: cannot remap mmio region\n");		return -ENODEV;	}	return 0;}	int __init i810fb_setup(char *options){	char *this_opt, *suffix = NULL;	if (!options || !*options)		return 0;		while ((this_opt = strsep(&options, ",")) != NULL) {		if (!strncmp(this_opt, "mtrr", 4))			mtrr = 1;		else if (!strncmp(this_opt, "accel", 5))			accel = 1;		else if (!strncmp(this_opt, "ext_vga", 7))			ext_vga = 1;		else if (!strncmp(this_opt, "sync", 4))			sync = 1;		else if (!strncmp(this_opt, "vram:", 5))			vram = (simple_strtoul(this_opt+5, NULL, 0));		else if (!strncmp(this_opt, "voffset:", 8))			voffset = (simple_strtoul(this_opt+8, NULL, 0));		else if (!strncmp(this_opt, "xres:", 5))			xres = simple_strtoul(this_opt+5, NULL, 0);		else if (!strncmp(this_opt, "yres:", 5))			yres = simple_strtoul(this_opt+5, NULL, 0);		else if (!strncmp(this_opt, "vyres:", 6))			vyres = simple_strtoul(this_opt+6, NULL, 0);		else if (!strncmp(this_opt, "bpp:", 4))			bpp = simple_strtoul(this_opt+4, NULL, 0);		else if (!strncmp(this_opt, "hsync1:", 7)) {			hsync1 = simple_strtoul(this_opt+7, &suffix, 0);			if (strncmp(suffix, "H", 1)) 				hsync1 *= 1000;		} else if (!strncmp(this_opt, "hsync2:", 7)) {			hsync2 = simple_strtoul(this_opt+7, &suffix, 0);			if (strncmp(suffix, "H", 1)) 				hsync2 *= 1000;		} else if (!strncmp(this_opt, "vsync1:", 7)) 			vsync1 = simple_strtoul(this_opt+7, NULL, 0);		else if (!strncmp(this_opt, "vsync2:", 7))			vsync2 = simple_strtoul(this_opt+7, NULL, 0);		else if (!strncmp(this_opt, "dcolor", 6))			dcolor = 1;	}	return 0;}static int __devinit i810fb_init_pci (struct pci_dev *dev, 				   const struct pci_device_id *entry){	struct fb_info    *info;	struct i810fb_par *par = NULL;	int i, err = -1, vfreq, hfreq, pixclock;	i = 0;	info = framebuffer_alloc(sizeof(struct i810fb_par), &dev->dev);	if (!info)		return -ENOMEM;	par = (struct i810fb_par *) info->par;	par->dev = dev;	if (!(info->pixmap.addr = kmalloc(8*1024, GFP_KERNEL))) {		i810fb_release_resource(info, par);		return -ENOMEM;	}	memset(info->pixmap.addr, 0, 8*1024);	info->pixmap.size = 8*1024;	info->pixmap.buf_align = 8;	info->pixmap.flags = FB_PIXMAP_SYSTEM;	if ((err = i810_allocate_pci_resource(par, entry))) {		i810fb_release_resource(info, par);		return err;	}	i810_init_defaults(par, info);	if ((err = i810_alloc_agp_mem(info))) {		i810fb_release_resource(info, par);		return err;	}	i810_init_device(par);        	info->screen_base = par->fb.virtual;	info->fbops = &par->i810fb_ops;	info->pseudo_palette = par->pseudo_palette;	fb_alloc_cmap(&info->cmap, 256, 0);	if ((err = info->fbops->fb_check_var(&info->var, info))) {		i810fb_release_resource(info, par);		return err;	}	encode_fix(&info->fix, info); 	 	    	i810fb_init_ringbuffer(info);	err = register_framebuffer(info);	if (err < 0) {    		i810fb_release_resource(info, par); 		printk("i810fb_init: cannot register framebuffer device\n");    		return err;      	}   	pci_set_drvdata(dev, info);	pixclock = 1000000000/(info->var.pixclock);	pixclock *= 1000;	hfreq = pixclock/(info->var.xres + info->var.left_margin + 			  info->var.hsync_len + info->var.right_margin);	vfreq = hfreq/(info->var.yres + info->var.upper_margin +		       info->var.vsync_len + info->var.lower_margin);      	printk("I810FB: fb%d         : %s v%d.%d.%d%s\n"      	       "I810FB: Video RAM   : %dK\n" 	       "I810FB: Monitor     : H: %d-%d KHz V: %d-%d Hz\n"	       "I810FB: Mode        : %dx%d-%dbpp@%dHz\n",	       info->node,	       i810_pci_list[entry->driver_data],	       VERSION_MAJOR, VERSION_MINOR, VERSION_TEENIE, BRANCH_VERSION,	       (int) par->fb.size>>10, info->monspecs.hfmin/1000,	       info->monspecs.hfmax/1000, info->monspecs.vfmin,	       info->monspecs.vfmax, info->var.xres, 	       info->var.yres, info->var.bits_per_pixel, vfreq);	return 0;}/*************************************************************** *                     De-initialization                        * ***************************************************************/static void i810fb_release_resource(struct fb_info *info, 				    struct i810fb_par *par){	struct gtt_data *gtt = &par->i810_gtt;	unset_mtrr(par);	if (par->i810_gtt.i810_cursor_memory)		agp_free_memory(gtt->i810_cursor_memory);	if (par->i810_gtt.i810_fb_memory)		agp_free_memory(gtt->i810_fb_memory);	if (par->mmio_start_virtual)		iounmap(par->mmio_start_virtual);	if (par->aperture.virtual)		iounmap(par->aperture.virtual);	if (par->res_flags & FRAMEBUFFER_REQ)		release_mem_region(par->aperture.physical,				   par->aperture.size);	if (par->res_flags & MMIO_REQ)		release_mem_region(par->mmio_start_phys, MMIO_SIZE);	if (par->res_flags & PCI_DEVICE_ENABLED)		pci_disable_device(par->dev);	framebuffer_release(info);}static void __exit i810fb_remove_pci(struct pci_dev *dev){	struct fb_info *info = pci_get_drvdata(dev);	struct i810fb_par *par = (struct i810fb_par *) info->par;	unregister_framebuffer(info);  	i810fb_release_resource(info, par);	pci_set_drvdata(dev, NULL);	printk("cleanup_module:  unloaded i810 framebuffer device\n");}                                                	#ifndef MODULEint __init i810fb_init(void){	char *option = NULL;	if (fb_get_options("i810fb", &option))		return -ENODEV;	i810fb_setup(option);	return pci_register_driver(&i810fb_driver);}#endif /********************************************************************* *                          Modularization                           * *********************************************************************/#ifdef MODULEint __init i810fb_init(void){	hsync1 *= 1000;	hsync2 *= 1000;	return pci_register_driver(&i810fb_driver);}module_param(vram, int, 0);MODULE_PARM_DESC(vram, "System RAM to allocate to framebuffer in MiB" 		 " (default=4)");module_param(voffset, int, 0);MODULE_PARM_DESC(voffset, "at what offset to place start of framebuffer "                 "memory (0 to maximum aperture size), in MiB (default = 48)");module_param(bpp, int, 0);MODULE_PARM_DESC(bpp, "Color depth for display in bits per pixel"		 " (default = 8)");module_param(xres, int, 0);MODULE_PARM_DESC(xres, "Horizontal resolution in pixels (default = 640)");module_param(yres, int, 0);MODULE_PARM_DESC(yres, "Vertical resolution in scanlines (default = 480)");module_param(vyres,int, 0);MODULE_PARM_DESC(vyres, "Virtual vertical resolution in scanlines"		 " (default = 480)");module_param(hsync1, int, 0);MODULE_PARM_DESC(hsync1, "Minimum horizontal frequency of monitor in KHz"		 " (default = 31)");module_param(hsync2, int, 0);MODULE_PARM_DESC(hsync2, "Maximum horizontal frequency of monitor in KHz"		 " (default = 31)");module_param(vsync1, int, 0);MODULE_PARM_DESC(vsync1, "Minimum vertical frequency of monitor in Hz"		 " (default = 50)");module_param(vsync2, int, 0);MODULE_PARM_DESC(vsync2, "Maximum vertical frequency of monitor in Hz" 		 " (default = 60)");module_param(accel, bool, 0);MODULE_PARM_DESC(accel, "Use Acceleration (BLIT) engine (default = 0)");module_param(mtrr, bool, 0);MODULE_PARM_DESC(mtrr, "Use MTRR (default = 0)");module_param(ext_vga, bool, 0);MODULE_PARM_DESC(ext_vga, "Enable external VGA connector (default = 0)");module_param(sync, bool, 0);MODULE_PARM_DESC(sync, "wait for accel engine to finish drawing"		 " (default = 0)");module_param(dcolor, bool, 0);MODULE_PARM_DESC(dcolor, "use DirectColor visuals"		 " (default = 0 = TrueColor)");MODULE_AUTHOR("Tony A. Daplas");MODULE_DESCRIPTION("Framebuffer device for the Intel 810/815 and"		   " compatible cards");MODULE_LICENSE("GPL"); static void __exit i810fb_exit(void){	pci_unregister_driver(&i810fb_driver);}module_exit(i810fb_exit);#endif /* MODULE */module_init(i810fb_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -