亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ps3fb.c

?? Linux環境下視頻顯示卡設備的驅動程序源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	default:		retval = -ENOIOCTLCMD;		break;	}	return retval;}static int ps3fbd(void *arg){	struct fb_info *info = arg;	set_freezable();	while (!kthread_should_stop()) {		try_to_freeze();		set_current_state(TASK_INTERRUPTIBLE);		if (ps3fb.is_kicked) {			ps3fb.is_kicked = 0;			acquire_console_sem();			ps3fb_sync(info, 0);	/* single buffer */			release_console_sem();		}		schedule();	}	return 0;}static irqreturn_t ps3fb_vsync_interrupt(int irq, void *ptr){	struct device *dev = ptr;	u64 v1;	int status;	struct display_head *head = &ps3fb.dinfo->display_head[1];	status = lv1_gpu_context_intr(ps3fb.context_handle, &v1);	if (status) {		dev_err(dev, "%s: lv1_gpu_context_intr failed: %d\n", __func__,			status);		return IRQ_NONE;	}	if (v1 & (1 << GPU_INTR_STATUS_VSYNC_1)) {		/* VSYNC */		ps3fb.vblank_count = head->vblank_count;		if (ps3fb.task && !ps3fb.is_blanked &&		    !atomic_read(&ps3fb.ext_flip)) {			ps3fb.is_kicked = 1;			wake_up_process(ps3fb.task);		}		wake_up_interruptible(&ps3fb.wait_vsync);	}	return IRQ_HANDLED;}static int ps3fb_vsync_settings(struct gpu_driver_info *dinfo,				struct device *dev){	int error;	dev_dbg(dev, "version_driver:%x\n", dinfo->version_driver);	dev_dbg(dev, "irq outlet:%x\n", dinfo->irq.irq_outlet);	dev_dbg(dev,		"version_gpu: %x memory_size: %x ch: %x core_freq: %d "		"mem_freq:%d\n",		dinfo->version_gpu, dinfo->memory_size, dinfo->hardware_channel,		dinfo->nvcore_frequency/1000000, dinfo->memory_frequency/1000000);	if (dinfo->version_driver != GPU_DRIVER_INFO_VERSION) {		dev_err(dev, "%s: version_driver err:%x\n", __func__,			dinfo->version_driver);		return -EINVAL;	}	error = ps3_irq_plug_setup(PS3_BINDING_CPU_ANY, dinfo->irq.irq_outlet,				   &ps3fb.irq_no);	if (error) {		dev_err(dev, "%s: ps3_alloc_irq failed %d\n", __func__, error);		return error;	}	error = request_irq(ps3fb.irq_no, ps3fb_vsync_interrupt, IRQF_DISABLED,			    DEVICE_NAME, dev);	if (error) {		dev_err(dev, "%s: request_irq failed %d\n", __func__, error);		ps3_irq_plug_destroy(ps3fb.irq_no);		return error;	}	dinfo->irq.mask = (1 << GPU_INTR_STATUS_VSYNC_1) |			  (1 << GPU_INTR_STATUS_FLIP_1);	return 0;}static int ps3fb_xdr_settings(u64 xdr_lpar, struct device *dev){	int status;	status = lv1_gpu_context_iomap(ps3fb.context_handle, GPU_IOIF,				       xdr_lpar, ps3fb_videomemory.size, 0);	if (status) {		dev_err(dev, "%s: lv1_gpu_context_iomap failed: %d\n",			__func__, status);		return -ENXIO;	}	dev_dbg(dev, "video:%p ioif:%lx lpar:%llx size:%lx\n",		ps3fb_videomemory.address, GPU_IOIF, xdr_lpar,		ps3fb_videomemory.size);	status = lv1_gpu_context_attribute(ps3fb.context_handle,					   L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP,					   xdr_lpar, GPU_CMD_BUF_SIZE,					   GPU_IOIF, 0);	if (status) {		dev_err(dev,			"%s: lv1_gpu_context_attribute FB_SETUP failed: %d\n",			__func__, status);		return -ENXIO;	}	return 0;}static struct fb_ops ps3fb_ops = {	.fb_open	= ps3fb_open,	.fb_release	= ps3fb_release,	.fb_read        = fb_sys_read,	.fb_write       = fb_sys_write,	.fb_check_var	= ps3fb_check_var,	.fb_set_par	= ps3fb_set_par,	.fb_setcolreg	= ps3fb_setcolreg,	.fb_pan_display	= ps3fb_pan_display,	.fb_fillrect	= sys_fillrect,	.fb_copyarea	= sys_copyarea,	.fb_imageblit	= sys_imageblit,	.fb_mmap	= ps3fb_mmap,	.fb_blank	= ps3fb_blank,	.fb_ioctl	= ps3fb_ioctl,	.fb_compat_ioctl = ps3fb_ioctl};static struct fb_fix_screeninfo ps3fb_fix __initdata = {	.id =		DEVICE_NAME,	.type =		FB_TYPE_PACKED_PIXELS,	.visual =	FB_VISUAL_TRUECOLOR,	.accel =	FB_ACCEL_NONE,};static int ps3fb_set_sync(struct device *dev){	int status;#ifdef HEAD_A	status = lv1_gpu_context_attribute(0x0,					   L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,					   0, L1GPU_DISPLAY_SYNC_VSYNC, 0, 0);	if (status) {		dev_err(dev,			"%s: lv1_gpu_context_attribute DISPLAY_SYNC failed: "			"%d\n",			__func__, status);		return -1;	}#endif#ifdef HEAD_B	status = lv1_gpu_context_attribute(0x0,					   L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,					   1, L1GPU_DISPLAY_SYNC_VSYNC, 0, 0);	if (status) {		dev_err(dev,			"%s: lv1_gpu_context_attribute DISPLAY_SYNC failed: "			"%d\n",			__func__, status);		return -1;	}#endif	return 0;}static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev){	struct fb_info *info;	struct ps3fb_par *par;	int retval = -ENOMEM;	u64 ddr_lpar = 0;	u64 lpar_dma_control = 0;	u64 lpar_driver_info = 0;	u64 lpar_reports = 0;	u64 lpar_reports_size = 0;	u64 xdr_lpar;	void *fb_start;	int status;	struct task_struct *task;	unsigned long max_ps3fb_size;	if (ps3fb_videomemory.size < GPU_CMD_BUF_SIZE) {		dev_err(&dev->core, "%s: Not enough video memory\n", __func__);		return -ENOMEM;	}	status = ps3_open_hv_device(dev);	if (status) {		dev_err(&dev->core, "%s: ps3_open_hv_device failed\n",			__func__);		goto err;	}	if (!ps3fb_mode)		ps3fb_mode = ps3av_get_mode();	dev_dbg(&dev->core, "ps3fb_mode: %d\n", ps3fb_mode);	atomic_set(&ps3fb.f_count, -1);	/* fbcon opens ps3fb */	atomic_set(&ps3fb.ext_flip, 0);	/* for flip with vsync */	init_waitqueue_head(&ps3fb.wait_vsync);	ps3fb_set_sync(&dev->core);	max_ps3fb_size = _ALIGN_UP(GPU_IOIF, 256*1024*1024) - GPU_IOIF;	if (ps3fb_videomemory.size > max_ps3fb_size) {		dev_info(&dev->core, "Limiting ps3fb mem size to %lu bytes\n",			 max_ps3fb_size);		ps3fb_videomemory.size = max_ps3fb_size;	}	/* get gpu context handle */	status = lv1_gpu_memory_allocate(ps3fb_videomemory.size, 0, 0, 0, 0,					 &ps3fb.memory_handle, &ddr_lpar);	if (status) {		dev_err(&dev->core, "%s: lv1_gpu_memory_allocate failed: %d\n",			__func__, status);		goto err;	}	dev_dbg(&dev->core, "ddr:lpar:0x%llx\n", ddr_lpar);	status = lv1_gpu_context_allocate(ps3fb.memory_handle, 0,					  &ps3fb.context_handle,					  &lpar_dma_control, &lpar_driver_info,					  &lpar_reports, &lpar_reports_size);	if (status) {		dev_err(&dev->core,			"%s: lv1_gpu_context_attribute failed: %d\n", __func__,			status);		goto err_gpu_memory_free;	}	/* vsync interrupt */	ps3fb.dinfo = (void __force *)ioremap(lpar_driver_info, 128 * 1024);	if (!ps3fb.dinfo) {		dev_err(&dev->core, "%s: ioremap failed\n", __func__);		goto err_gpu_context_free;	}	retval = ps3fb_vsync_settings(ps3fb.dinfo, &dev->core);	if (retval)		goto err_iounmap_dinfo;	/* Clear memory to prevent kernel info leakage into userspace */	memset(ps3fb_videomemory.address, 0, ps3fb_videomemory.size);	xdr_lpar = ps3_mm_phys_to_lpar(__pa(ps3fb_videomemory.address));	retval = ps3fb_xdr_settings(xdr_lpar, &dev->core);	if (retval)		goto err_free_irq;	info = framebuffer_alloc(sizeof(struct ps3fb_par), &dev->core);	if (!info)		goto err_free_irq;	par = info->par;	par->mode_id = ~ps3fb_mode;	/* != ps3fb_mode, to trigger change */	par->new_mode_id = ps3fb_mode;	par->num_frames = 1;	info->fbops = &ps3fb_ops;	info->fix = ps3fb_fix;	/*	 * The GPU command buffer is at the start of video memory	 * As we don't use the full command buffer, we can put the actual	 * frame buffer at offset GPU_FB_START and save some precious XDR	 * memory	 */	fb_start = ps3fb_videomemory.address + GPU_FB_START;	info->screen_base = (char __force __iomem *)fb_start;	info->fix.smem_start = virt_to_abs(fb_start);	info->fix.smem_len = ps3fb_videomemory.size - GPU_FB_START;	info->pseudo_palette = par->pseudo_palette;	info->flags = FBINFO_DEFAULT | FBINFO_READS_FAST |		      FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;	retval = fb_alloc_cmap(&info->cmap, 256, 0);	if (retval < 0)		goto err_framebuffer_release;	if (!fb_find_mode(&info->var, info, mode_option, ps3fb_modedb,			  ARRAY_SIZE(ps3fb_modedb),			  ps3fb_vmode(par->new_mode_id), 32)) {		retval = -EINVAL;		goto err_fb_dealloc;	}	fb_videomode_to_modelist(ps3fb_modedb, ARRAY_SIZE(ps3fb_modedb),				 &info->modelist);	retval = register_framebuffer(info);	if (retval < 0)		goto err_fb_dealloc;	dev->core.driver_data = info;	dev_info(info->device, "%s %s, using %u KiB of video memory\n",		 dev_driver_string(info->dev), info->dev->bus_id,		 info->fix.smem_len >> 10);	task = kthread_run(ps3fbd, info, DEVICE_NAME);	if (IS_ERR(task)) {		retval = PTR_ERR(task);		goto err_unregister_framebuffer;	}	ps3fb.task = task;	return 0;err_unregister_framebuffer:	unregister_framebuffer(info);err_fb_dealloc:	fb_dealloc_cmap(&info->cmap);err_framebuffer_release:	framebuffer_release(info);err_free_irq:	free_irq(ps3fb.irq_no, &dev->core);	ps3_irq_plug_destroy(ps3fb.irq_no);err_iounmap_dinfo:	iounmap((u8 __force __iomem *)ps3fb.dinfo);err_gpu_context_free:	lv1_gpu_context_free(ps3fb.context_handle);err_gpu_memory_free:	lv1_gpu_memory_free(ps3fb.memory_handle);err:	return retval;}static int ps3fb_shutdown(struct ps3_system_bus_device *dev){	int status;	struct fb_info *info = dev->core.driver_data;	dev_dbg(&dev->core, " -> %s:%d\n", __func__, __LINE__);	atomic_inc(&ps3fb.ext_flip);	/* flip off */	ps3fb.dinfo->irq.mask = 0;	if (ps3fb.task) {		struct task_struct *task = ps3fb.task;		ps3fb.task = NULL;		kthread_stop(task);	}	if (ps3fb.irq_no) {		free_irq(ps3fb.irq_no, &dev->core);		ps3_irq_plug_destroy(ps3fb.irq_no);	}	if (info) {		unregister_framebuffer(info);		fb_dealloc_cmap(&info->cmap);		framebuffer_release(info);		info = dev->core.driver_data = NULL;	}	iounmap((u8 __force __iomem *)ps3fb.dinfo);	status = lv1_gpu_context_free(ps3fb.context_handle);	if (status)		dev_dbg(&dev->core, "lv1_gpu_context_free failed: %d\n",			status);	status = lv1_gpu_memory_free(ps3fb.memory_handle);	if (status)		dev_dbg(&dev->core, "lv1_gpu_memory_free failed: %d\n",			status);	ps3_close_hv_device(dev);	dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);	return 0;}static struct ps3_system_bus_driver ps3fb_driver = {	.match_id	= PS3_MATCH_ID_GPU,	.match_sub_id	= PS3_MATCH_SUB_ID_GPU_FB,	.core.name	= DEVICE_NAME,	.core.owner	= THIS_MODULE,	.probe		= ps3fb_probe,	.remove		= ps3fb_shutdown,	.shutdown	= ps3fb_shutdown,};static int __init ps3fb_setup(void){	char *options;#ifdef MODULE	return 0;#endif	if (fb_get_options(DEVICE_NAME, &options))		return -ENXIO;	if (!options || !*options)		return 0;	while (1) {		char *this_opt = strsep(&options, ",");		if (!this_opt)			break;		if (!*this_opt)			continue;		if (!strncmp(this_opt, "mode:", 5))			ps3fb_mode = simple_strtoul(this_opt + 5, NULL, 0);		else			mode_option = this_opt;	}	return 0;}static int __init ps3fb_init(void){	if (!ps3fb_videomemory.address ||  ps3fb_setup())		return -ENXIO;	return ps3_system_bus_driver_register(&ps3fb_driver);}static void __exit ps3fb_exit(void){	pr_debug(" -> %s:%d\n", __func__, __LINE__);	ps3_system_bus_driver_unregister(&ps3fb_driver);	pr_debug(" <- %s:%d\n", __func__, __LINE__);}module_init(ps3fb_init);module_exit(ps3fb_exit);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PS3 GPU Frame Buffer Driver");MODULE_AUTHOR("Sony Computer Entertainment Inc.");MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_FB);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜亚洲福利老司机| 日韩视频一区二区| 国产精品成人免费精品自在线观看 | 国产精品成人免费精品自在线观看| 精品一区二区三区影院在线午夜| 亚洲精品一线二线三线 | 国产99久久久久久免费看农村| 精品国产百合女同互慰| 国产盗摄一区二区| 国产精品成人一区二区艾草 | 欧美日韩国产一级| 青青草精品视频| 国产视频一区二区三区在线观看| 不卡视频在线看| 亚洲一区影音先锋| 精品乱码亚洲一区二区不卡| 成人免费视频一区| 亚洲一区二区高清| 欧美mv日韩mv| 日韩欧美一区在线| 豆国产96在线|亚洲| 亚洲不卡av一区二区三区| 精品国产乱码久久久久久牛牛| 99精品视频在线免费观看| 亚洲风情在线资源站| 久久先锋影音av鲁色资源网| 91免费在线视频观看| 久久99这里只有精品| 亚洲欧美日韩人成在线播放| 日韩三级视频在线观看| 91丨porny丨在线| 九九精品视频在线看| 亚洲欧美福利一区二区| 精品国产免费久久| 欧美午夜电影在线播放| 国产美女主播视频一区| 亚洲不卡一区二区三区| 国产精品毛片久久久久久久| 日韩一区二区三区视频在线观看| 白白色亚洲国产精品| 久久99精品视频| 亚洲gay无套男同| 中文字幕一区二区三| 欧美videofree性高清杂交| 91搞黄在线观看| 成人av电影在线播放| 国产一区二区三区免费观看| 亚洲国产日韩在线一区模特| 国产精品天美传媒沈樵| 日韩欧美国产一二三区| 欧美视频在线播放| 欧美一区二区视频免费观看| caoporn国产精品| 国产福利视频一区二区三区| 另类调教123区| 亚洲国产你懂的| 亚洲最大成人网4388xx| 综合久久久久综合| 亚洲国产精华液网站w| 26uuu国产电影一区二区| 欧美一区二区三区日韩| 欧美伦理视频网站| 欧美中文字幕一区二区三区亚洲| 不卡电影一区二区三区| 懂色一区二区三区免费观看| 国产高清亚洲一区| 国内不卡的二区三区中文字幕| 午夜a成v人精品| 香港成人在线视频| 亚洲综合激情小说| 亚洲国产成人精品视频| 亚洲一区二区在线免费看| 亚洲精品成人在线| 亚洲综合丁香婷婷六月香| 亚洲综合在线第一页| 亚洲国产一区二区视频| 亚洲超碰精品一区二区| 日韩电影免费在线看| 日韩福利视频网| 麻豆精品在线看| 激情小说欧美图片| 国产91精品在线观看| 成人黄色国产精品网站大全在线免费观看| 国产美女在线观看一区| 国产v日产∨综合v精品视频| 成人黄色大片在线观看| 色综合婷婷久久| 欧美在线观看一区| 制服丝袜国产精品| 久久综合九色综合97_久久久| 国产日韩综合av| 17c精品麻豆一区二区免费| 亚洲激情图片qvod| 日韩精品乱码av一区二区| 韩国欧美一区二区| 精品国产一区二区三区不卡 | 视频一区视频二区在线观看| 奇米影视在线99精品| 精品一区二区成人精品| 成人深夜在线观看| 欧美在线视频你懂得| 欧美一区三区二区| 国产日产欧产精品推荐色| 亚洲欧美在线另类| 日韩二区三区四区| 国产成人免费在线观看不卡| 在线视频你懂得一区| 日韩精品最新网址| 亚洲天堂2016| 免费视频最近日韩| eeuss影院一区二区三区| 欧美三级在线视频| 国产日韩精品一区二区三区在线| 亚洲日本青草视频在线怡红院| 日韩在线卡一卡二| 国产精品888| 久久久久99精品国产片| 亚洲欧洲精品成人久久奇米网| 洋洋成人永久网站入口| 蜜臀久久久久久久| 91视频xxxx| 精品国产亚洲在线| 亚洲一二三四在线| 国产成人av电影在线| 在线国产亚洲欧美| 欧美tickling网站挠脚心| 亚洲综合激情另类小说区| 国产在线精品免费| 在线免费观看不卡av| 久久这里只有精品首页| 午夜精品一区二区三区三上悠亚| 国产精品一二三在| 这里只有精品电影| 亚洲人成在线播放网站岛国| 国模冰冰炮一区二区| 欧美日韩国产免费| 亚洲美女屁股眼交| 床上的激情91.| 精品国产髙清在线看国产毛片| 一区二区三区丝袜| 99精品热视频| 国产亚洲综合av| 麻豆精品一区二区综合av| 欧美日韩亚洲综合一区二区三区| 中文字幕日韩一区二区| 国产99久久精品| 精品国产一二三| 久久99热99| 欧美一卡二卡三卡| 日韩精品久久久久久| 欧美日韩中字一区| 亚洲一区二区三区四区五区黄| av不卡在线播放| 日本一区二区三区在线观看| 国产曰批免费观看久久久| 日韩精品一区在线| 久久精品国产精品亚洲综合| 欧美丰满少妇xxxxx高潮对白| 一卡二卡三卡日韩欧美| 91在线精品秘密一区二区| 中文幕一区二区三区久久蜜桃| 国产精品亚洲第一| 久久久精品黄色| 国产凹凸在线观看一区二区| 国产午夜久久久久| 国产成人精品影院| 国产精品久久久久久久久图文区| 国产成人综合自拍| 欧美韩国日本不卡| aaa国产一区| 亚洲老妇xxxxxx| 欧美日韩日本视频| 香蕉影视欧美成人| 日韩欧美在线网站| 国产一区欧美二区| 国产精品国产三级国产有无不卡 | 久久精品国产免费| 久久蜜臀精品av| 成人深夜视频在线观看| 亚洲视频在线观看三级| 在线观看三级视频欧美| 午夜精品一区二区三区免费视频| 欧美精品v日韩精品v韩国精品v| 爽爽淫人综合网网站| 精品美女一区二区| 成人国产精品免费观看视频| 亚洲色图一区二区三区| 欧美在线影院一区二区| 美腿丝袜一区二区三区| 欧美国产精品久久| 在线亚洲免费视频| 捆绑调教美女网站视频一区| 中文字幕av资源一区| 在线观看不卡视频| 精品影视av免费| 国产精品国产三级国产专播品爱网| 一本大道av伊人久久综合| 日韩高清一区二区| 国产精品美女www爽爽爽| 欧美猛男超大videosgay|