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

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

?? s3c2510-pcibuf.c

?? VxWorks BSP for S3C2510A
?? C
字號:
/* *  linux/arch/arm/mach-s3c2510.c             *  Special pci_map/unmap_single routines for S3C2510  *  * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 as *  published by the Free Software Foundation. * */#include <linux/config.h>#include <linux/module.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/pci.h>//#include "usb_pcipool.h"		// 20030107 remarked by drsohn#include <asm/arch/usb_pcipool.h>		// 20030107 modified by drsohn#include <asm/arch/s3c2510-pcibuf.h>	// 20030107 added by drsohn/* * simple buffer allocator for copying of unsafe to safe buffers * uses __alloc/__free for actual buffers * keeps track of safe buffers we've allocated so we can recover the * unsafe buffers. */#define MAX_SAFE	32#define SIZE_SMALL	1024#define SIZE_LARGE	(16*1024)static long mapped_alloc_size;static char *safe_buffers[MAX_SAFE][2];static struct pci_pool *small_buffer_cache, *large_buffer_cache;static intinit_safe_buffers(struct pci_dev *dev){	small_buffer_cache = usb_pci_pool_create("pci_small_buffer",					    dev,					    SIZE_SMALL,					    0 /* byte alignment */,					    0 /* no page-crossing issues */,					    GFP_KERNEL | GFP_DMA);	if (small_buffer_cache == 0)		return -1;	large_buffer_cache = usb_pci_pool_create("pci_large_buffer",					    dev,					    SIZE_LARGE,					    0 /* byte alignment */,					    0 /* no page-crossing issues */,					    GFP_KERNEL | GFP_DMA);	if (large_buffer_cache == 0)		return -1;	return 0;}/* allocate a 'safe' buffer and keep track of it */static char *alloc_safe_buffer(char *unsafe, int size, dma_addr_t *pbus){	char *safe;	dma_addr_t busptr;	struct pci_pool *pool;	int i;	if (0) printk("alloc_safe_buffer(size=%d)\n", size);	if (size <= SIZE_SMALL)		pool = small_buffer_cache;	else		if (size < SIZE_LARGE)			pool = large_buffer_cache;				else					return 0;	safe = usb_pci_pool_alloc(pool, SLAB_ATOMIC, &busptr);	if (safe == 0)		return 0;	for (i = 0; i < MAX_SAFE; i++)		if (safe_buffers[i][0] == 0) {			break;		}	if (i == MAX_SAFE) {		panic(__FILE__ ": exceeded MAX_SAFE buffers");	}	/* place the size index and the old buffer ptr in the first 8 bytes	 * and return a ptr + 12 to caller	 */	((int *)safe)[0] = i;	((char **)safe)[1] = (char *)pool;	((char **)safe)[2] = unsafe;	busptr += sizeof(int) + sizeof(char *) + sizeof(char *);	safe_buffers[i][0] = (void *)busptr;	safe_buffers[i][1] = (void *)safe;	safe += sizeof(int) + sizeof(char *) + sizeof(char *);	*pbus = busptr;	return safe;}/* determine if a buffer is from our "safe" pool */static char *find_safe_buffer(char *busptr, char **unsafe){	int i;	char *buf;		for (i = 0; i < MAX_SAFE; i++) {		if (safe_buffers[i][0] == busptr) {			if (0) printk("find_safe_buffer(%p) found @ %d\n", busptr, i);			buf = safe_buffers[i][1];			*unsafe = ((char **)buf)[2];			return buf + sizeof(int) + sizeof(char *) + sizeof(char *);		}	}	return (char *)0;}static voidfree_safe_buffer(char *buf){	int index;	struct pci_pool *pool;	char *dma;		if (0) printk("free_safe_buffer(buf=%p)\n", buf);	/* retrieve the buffer size index */	buf -= sizeof(int) + sizeof(char*) + sizeof(char*);	index = ((int *)buf)[0];	pool = (struct pci_pool *)((char **)buf)[1];	if (0) printk("free_safe_buffer(%p) index %d\n",		      buf, index);	if (index < 0 || index >= MAX_SAFE) {		printk(__FILE__ ": free_safe_buffer() corrupt buffer\n");		return;	}	dma = safe_buffers[index][0];	safe_buffers[index][0] = 0;	usb_pci_pool_free(pool, buf, (u32)dma);}/*  NOTE:  replace pci_map/unmap_single with local routines which will  do buffer copies if buffer is above 1mb...*//* * see if a buffer address is in an 'unsafe' range.  if it is * allocate a 'safe' buffer and copy the unsafe buffer into it. * substitute the safe buffer for the unsafe one. * (basically move the buffer from an unsafe area to a safe one) * * we assume calls to map_single are symmetric with calls to unmap_single... */dma_addr_ts3c2510_map_single(struct pci_dev *hwdev, void *virtptr,	       size_t size, int direction){	dma_addr_t busptr;	mapped_alloc_size += size;	if (0) printk("pci_map_single(hwdev=%p,ptr=%p,size=%d,dir=%x) "		      "alloced=%ld\n",		      hwdev, virtptr, size, direction, mapped_alloc_size);	busptr = virt_to_bus(virtptr);	/* we assume here that a buffer will never be >=64k */	if ( (((unsigned long)busptr) & 0x100000) ||	     ((((unsigned long)busptr)+size) & 0x100000) )	{		char *safe;		safe = alloc_safe_buffer(virtptr, size, &busptr);		if (safe == 0) {			printk("unable to map unsafe buffer %p!\n", virtptr);			return 0;		}		if (0) printk("unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",			      virtptr, (void *)virt_to_bus(virtptr),			      safe, (void *)busptr);		memcpy(safe, virtptr, size);		consistent_sync(safe, size, direction);		return busptr;	}	consistent_sync(virtptr, size, direction);	return busptr;}/* * see if a mapped address was really a "safe" buffer and if so, * copy the data from the safe buffer back to the unsafe buffer * and free up the safe buffer. * (basically return things back to the way they should be) */voids3c2510_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,		 size_t size, int direction){	char *safe, *unsafe;	void *buf;	/* hack; usb-ohci.c never sends hwdev==NULL, all others do */	if (hwdev == NULL) {		return;	}	mapped_alloc_size -= size;	if (0) printk("pci_unmap_single(hwdev=%p,ptr=%p,size=%d,dir=%x) "		      "alloced=%ld\n",		      hwdev, (void *)dma_addr, size, direction,		      mapped_alloc_size);	if ((safe = find_safe_buffer((void *)dma_addr, &unsafe))) {		if (0) printk("copyback unsafe %p, safe %p, size %d\n",			      unsafe, safe, size);		consistent_sync(safe, size, PCI_DMA_FROMDEVICE);		memcpy(unsafe, safe, size);		free_safe_buffer(safe);	} else {		/* assume this is normal memory */		buf = bus_to_virt(dma_addr);		consistent_sync(buf, size, PCI_DMA_FROMDEVICE);	}}EXPORT_SYMBOL(s3c2510_map_single);EXPORT_SYMBOL(s3c2510_unmap_single);static int __init s3c2510_init_safe_buffers(void){	printk("Initializing S3C2510 buffer pool for DMA workaround\n");	init_safe_buffers(NULL);	return 0;}static void free_safe_buffers(void){		usb_pci_pool_destroy(small_buffer_cache);	usb_pci_pool_destroy(large_buffer_cache);}module_init(s3c2510_init_safe_buffers);module_exit(free_safe_buffers);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国精品在线观看| 老司机午夜精品| 国产精品久久国产精麻豆99网站| 日韩欧美在线123| 欧美白人最猛性xxxxx69交| 91精品国模一区二区三区| 欧美日韩国产a| 欧美一级艳片视频免费观看| 91精品国产综合久久福利软件| 欧美日韩激情在线| 日韩精品最新网址| 久久久久久久免费视频了| 国产丝袜欧美中文另类| 中文字幕av资源一区| 国产精品国产三级国产三级人妇| 亚洲视频小说图片| 亚洲一卡二卡三卡四卡五卡| 日韩福利视频网| 国产一区二区美女| 99r精品视频| 制服丝袜成人动漫| 久久一二三国产| 日韩伦理av电影| 亚洲第四色夜色| 国产精品亚洲第一区在线暖暖韩国 | 亚洲精品成a人| 五月天网站亚洲| 国产一区二区三区在线观看精品 | 中文字幕制服丝袜一区二区三区| 一区二区在线观看av| 日韩电影在线一区| 岛国av在线一区| 欧美一级二级在线观看| 国产精品福利一区| 美女视频黄久久| 91免费观看视频| 精品国产一二三区| 亚洲精品国产a久久久久久| 美女任你摸久久| 一本久道中文字幕精品亚洲嫩 | 国产成人精品在线看| 欧美日韩一区二区三区高清| 精品91自产拍在线观看一区| 亚洲激情图片一区| 国产成人精品免费网站| 日韩一区二区三区高清免费看看| 欧美激情一区二区三区蜜桃视频 | 精品欧美一区二区三区精品久久| 亚洲欧美激情一区二区| 国产在线视频精品一区| 欧美亚洲高清一区二区三区不卡| 国产欧美日韩一区二区三区在线观看 | 国产成人免费视频一区| 欧美日韩免费观看一区三区| 中国av一区二区三区| 韩国一区二区三区| 欧美成人r级一区二区三区| 一区二区三区免费网站| 成人爱爱电影网址| 久久精品视频一区二区三区| 日本网站在线观看一区二区三区| 91视频免费播放| 中文字幕在线不卡视频| 国产精品99久久不卡二区| 欧美成人午夜电影| 欧美aaaaaa午夜精品| 91精品久久久久久久久99蜜臂| 亚洲高清视频在线| 在线观看成人免费视频| 成人免费视频在线观看| 不卡欧美aaaaa| 亚洲欧洲精品一区二区三区| 成人丝袜18视频在线观看| 久久精品男人的天堂| 国产成人福利片| 国产精品嫩草影院av蜜臀| 高清久久久久久| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 色综合色综合色综合色综合色综合 | 成人综合在线观看| 久久精品一区二区三区av| 国产成人亚洲精品狼色在线| 欧美国产日韩一二三区| 不卡一区二区三区四区| 亚洲毛片av在线| 欧美日韩黄色影视| 久久精品久久99精品久久| 337p粉嫩大胆噜噜噜噜噜91av| 狠狠色狠狠色合久久伊人| 精品理论电影在线| 丁香啪啪综合成人亚洲小说| 亚洲欧美偷拍三级| 欧美日韩亚洲综合一区二区三区 | 国产精品毛片高清在线完整版| 成人av资源在线| 午夜a成v人精品| 日韩免费看的电影| 99久久精品一区二区| 亚洲国产精品影院| 26uuu久久天堂性欧美| 色综合久久久久综合体| 日本亚洲欧美天堂免费| 国产精品视频一区二区三区不卡| 色婷婷激情久久| 国内精品国产成人国产三级粉色| 国产精品免费久久久久| 欧美日韩五月天| 成人福利在线看| 天堂av在线一区| 国产精品国产精品国产专区不片| 欧美日韩国产高清一区二区| 国产成人h网站| 日本va欧美va欧美va精品| 国产精品丝袜一区| 日韩欧美不卡在线观看视频| 91原创在线视频| 国内精品自线一区二区三区视频| 亚洲综合视频在线| 欧美激情艳妇裸体舞| 在线综合视频播放| 不卡的av电影| 国产一区二区三区日韩| 一区二区三区蜜桃| 国产精品久久久久永久免费观看 | 国产亚洲自拍一区| 欧美日韩国产一级片| 99国产精品久久久久久久久久久| 麻豆精品一区二区三区| 亚洲第一综合色| 伊人一区二区三区| 中文字幕乱码一区二区免费| 精品久久久久久久人人人人传媒| 欧美制服丝袜第一页| 96av麻豆蜜桃一区二区| 久久99久久久久| 蜜桃av一区二区| 五月婷婷激情综合| 天天综合天天做天天综合| 亚洲永久免费视频| 亚洲永久免费av| 亚洲国产精品久久艾草纯爱| 一区二区三区波多野结衣在线观看| 欧美激情艳妇裸体舞| 中文字幕欧美国产| 国产精品沙发午睡系列990531| 国产午夜一区二区三区| 国产视频911| 久久久久久久精| 中文字幕欧美区| 亚洲视频一区二区免费在线观看| 中文字幕欧美激情| 综合久久国产九一剧情麻豆| 亚洲人快播电影网| 有坂深雪av一区二区精品| 一区二区三区欧美久久| 亚洲一区二区三区四区在线观看| 亚洲精品免费电影| 亚洲 欧美综合在线网络| 午夜精品在线视频一区| 琪琪一区二区三区| 国产精品一区久久久久| 99久久久久久| 欧美日韩性生活| 日韩欧美成人一区| 欧美激情一区在线观看| 亚洲少妇30p| 日本色综合中文字幕| 狠狠色丁香婷婷综合| 国产成人精品亚洲777人妖| 91在线观看高清| 91.com视频| 国产精品久久久久影院亚瑟| 亚洲一区二区三区中文字幕| 久久91精品国产91久久小草| 粉嫩在线一区二区三区视频| 在线亚洲人成电影网站色www| 欧美疯狂性受xxxxx喷水图片| 欧美电影精品一区二区| 中文无字幕一区二区三区 | 麻豆国产欧美日韩综合精品二区 | 九九九精品视频| 99在线精品免费| 制服.丝袜.亚洲.中文.综合| 国产天堂亚洲国产碰碰| 亚洲一区视频在线| 国产乱码精品一品二品| 91浏览器在线视频| 精品欧美久久久| 一区二区三区精品视频| 精品一区二区三区欧美| 91成人看片片| 欧美激情一区二区三区| 日韩av一区二| 欧美在线一区二区| 国产三级精品在线| 日本人妖一区二区| 91国产免费看| 中文字幕亚洲区| 国产精品一区二区三区网站| 91精品久久久久久久99蜜桃|