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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ccio-dma.c

?? 內(nèi)核linux2.4.20,可跟rtlinux3.2打補(bǔ)丁 組成實(shí)時(shí)linux系統(tǒng),編譯內(nèi)核
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
	unsigned long flags;	struct ccio_device *ioa = ccio_list;	spin_lock_irqsave(&ioa->ccio_lock, flags);	ccio_free_size += get_order(size);	spin_unlock_irqrestore(&ioa->ccio_lock, flags);	ccio_unmap_single(hwdev, dma_handle, size, 0);	free_pages((unsigned long) vaddr, get_order(size));}static int ccio_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direction){	int tmp = nents;	DBG_RUN(KERN_WARNING __FUNCTION__ " START\n");        /* KISS: map each buffer seperately. */	while (nents) {		sg_dma_address(sglist) = ccio_map_single(dev, sglist->address, sglist->length, direction);		sg_dma_len(sglist) = sglist->length;		nents--;		sglist++;	}	DBG_RUN(KERN_WARNING __FUNCTION__ " DONE\n");	return tmp;}static void ccio_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, int direction){	DBG_RUN(KERN_WARNING __FUNCTION__ " : unmapping %d entries\n", nents);	while (nents) {		ccio_unmap_single(dev, sg_dma_address(sglist), sg_dma_len(sglist), direction);		nents--;		sglist++;	}	return;}static struct pci_dma_ops ccio_ops = {	ccio_dma_supported,	ccio_alloc_consistent,	ccio_free_consistent,	ccio_map_single,	ccio_unmap_single,	ccio_map_sg,	ccio_unmap_sg,	NULL,                   /* dma_sync_single : NOP for U2/Uturn */	NULL,                   /* dma_sync_sg     : ditto */};#if 0/* GRANT -  is this needed for U2 or not? *//*** Get the size of the I/O TLB for this I/O MMU.**** If spa_shift is non-zero (ie probably U2),** then calculate the I/O TLB size using spa_shift.**** Otherwise we are supposed to get the IODC entry point ENTRY TLB** and execute it. However, both U2 and Uturn firmware supplies spa_shift.** I think only Java (K/D/R-class too?) systems don't do this.*/static intccio_get_iotlb_size(struct hp_device *d){	if(d->spa_shift == 0) {		panic(__FUNCTION__ ": Can't determine I/O TLB size.\n");	}	return(1 << d->spa_shift);}#else/* Uturn supports 256 TLB entries */#define CCIO_CHAINID_SHIFT	8#define CCIO_CHAINID_MASK	0xff#endif /* 0 *//*** Figure out how big the I/O PDIR should be and alloc it.** Also sets variables which depend on pdir size.*/static voidccio_alloc_pdir(struct ccio_device *ioa){	extern unsigned long mem_max;          /* arch.../setup.c */	u32 iova_space_size = 0;	void * pdir_base;	int pdir_size, iov_order;	/*	** Determine IOVA Space size from memory size.	** Using "mem_max" is a kluge.	**	** Ideally, PCI drivers would register the maximum number	** of DMA they can have outstanding for each device they	** own.  Next best thing would be to guess how much DMA	** can be outstanding based on PCI Class/sub-class. Both	** methods still require some "extra" to support PCI	** Hot-Plug/Removal of PCI cards. (aka PCI OLARD).	*/	/* limit IOVA space size to 1MB-1GB */	if (mem_max < (ccio_mem_ratio*1024*1024)) {		iova_space_size = 1024*1024;#ifdef __LP64__	} else if (mem_max > (ccio_mem_ratio*512*1024*1024)) {		iova_space_size = 512*1024*1024;#endif	} else {		iova_space_size = (u32) (mem_max/ccio_mem_ratio);	}	/*	** iova space must be log2() in size.	** thus, pdir/res_map will also be log2().	*/	/* We could use larger page sizes in order to *decrease* the number	** of mappings needed.  (ie 8k pages means 1/2 the mappings).        **	** Note: Grant Grunder says "Using 8k I/O pages isn't trivial either	**   since the pages must also be physically contiguous - typically	**   this is the case under linux."	*/	iov_order = get_order(iova_space_size);	ASSERT(iov_order <= (30 - IOVP_SHIFT));   /* iova_space_size <= 1GB */	ASSERT(iov_order >= (20 - IOVP_SHIFT));   /* iova_space_size >= 1MB */	iova_space_size = 1 << (iov_order + IOVP_SHIFT);	ioa->pdir_size = pdir_size = (iova_space_size/IOVP_SIZE) * sizeof(u64);	ASSERT(pdir_size < 4*1024*1024);   /* max pdir size < 4MB */	/* Verify it's a power of two */	ASSERT((1 << get_order(pdir_size)) == (pdir_size >> PAGE_SHIFT));	DBG_INIT(__FUNCTION__ " hpa 0x%p mem %dMB IOV %dMB (%d bits)\n    PDIR size 0x%0x",		ioa->ccio_hpa, (int) (mem_max>>20), iova_space_size>>20,		iov_order + PAGE_SHIFT, pdir_size);	ioa->pdir_base =	pdir_base = (void *) __get_free_pages(GFP_KERNEL, get_order(pdir_size));	if (NULL == pdir_base)	{		panic(__FILE__ ":" __FUNCTION__ "() could not allocate I/O Page Table\n");	}	memset(pdir_base, 0, pdir_size);	ASSERT((((unsigned long) pdir_base) & PAGE_MASK) == (unsigned long) pdir_base);	DBG_INIT(" base %p", pdir_base);	/*	** Chainid is the upper most bits of an IOVP used to determine	** which TLB entry an IOVP will use.	*/	ioa->chainid_shift = get_order(iova_space_size)+PAGE_SHIFT-CCIO_CHAINID_SHIFT;	DBG_INIT(" chainid_shift 0x%x\n", ioa->chainid_shift);}static voidccio_hw_init(struct ccio_device *ioa){	int i;	/*	** Initialize IOA hardware	*/	WRITE_U32(CCIO_CHAINID_MASK << ioa->chainid_shift, &ioa->ccio_hpa->io_chain_id_mask);	WRITE_U32(virt_to_phys(ioa->pdir_base), &ioa->ccio_hpa->io_pdir_base);	/*	** Go to "Virtual Mode"	*/	WRITE_U32(IOA_NORMAL_MODE, &ioa->ccio_hpa->io_control);	/*	** Initialize all I/O TLB entries to 0 (Valid bit off).	*/	WRITE_U32(0, &ioa->ccio_hpa->io_tlb_entry_m);	WRITE_U32(0, &ioa->ccio_hpa->io_tlb_entry_l);	for (i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {		WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioa->chainid_shift)),					&ioa->ccio_hpa->io_command);	}}static voidccio_resmap_init(struct ccio_device *ioa){	u32 res_size;	/*	** Ok...we do more than just init resource map	*/	ioa->ccio_lock = SPIN_LOCK_UNLOCKED;	ioa->res_hint = 16;    /* next available IOVP - circular search */	/* resource map size dictated by pdir_size */	res_size = ioa->pdir_size/sizeof(u64); /* entries */	res_size >>= 3;	/* convert bit count to byte count */	DBG_INIT(__FUNCTION__ "() res_size 0x%x\n", res_size);	ioa->res_size = res_size;	ioa->res_map = (char *) __get_free_pages(GFP_KERNEL, get_order(res_size));	if (NULL == ioa->res_map)	{		panic(__FILE__ ":" __FUNCTION__ "() could not allocate resource map\n");	}	memset(ioa->res_map, 0, res_size);}/* CUJO20 KLUDGE start */static struct {		u16 hversion;		u8  spa;		u8  type;		u32     foo[3];	/* 16 bytes total */} cujo_iodc __attribute__ ((aligned (64)));static unsigned long cujo_result[32] __attribute__ ((aligned (16))) = {0,0,0,0};/*** CUJO 2.0 incorrectly decodes a memory access for specific** pages (every page at specific iotlb locations dependent** upon where the cujo is flexed - diff on raven/firehawk.** resulting in an hpmc and/or silent data corruption.** Workaround is to prevent use of those I/O TLB entries** by marking the suspect bitmap range entries as busy.*/static voidccio_cujo20_hack(struct ccio_device *ioa){	unsigned long status;	unsigned int idx;	u8 *res_ptr = ioa->res_map;	u32 iovp=0x0;	unsigned long mask;	status = pdc_iodc_read( &cujo_result, (void *) CUJO_RAVEN_LOC, 0, &cujo_iodc, 16);	if (status == 0) {		if (cujo_iodc.hversion==CUJO_20_BADHVERS)			iovp = CUJO_20_BADPAGE1;	} else {		status = pdc_iodc_read( &cujo_result, (void *) CUJO_FIREHAWK_LOC, 0, &cujo_iodc, 16);		if (status == 0) {			if (cujo_iodc.hversion==CUJO_20_BADHVERS)				iovp = CUJO_20_BADPAGE2;		} else {			/* not a defective system */			return;		}	}	printk(MODULE_NAME ": Cujo 2.0 bug needs a work around\n");	ccio_cujo_bug = 1;	/*	** mark bit entries that match "bad page"	*/	idx = PDIR_INDEX(iovp)>>3;	mask = 0xff;		while(idx * sizeof(u8) < ioa->res_size) {		res_ptr[idx] |= mask;		idx += (PDIR_INDEX(CUJO_20_STEP)>>3);		ccio_used_pages += 8;		ccio_used_bytes += 1;	}}/* CUJO20 KLUDGE end */#ifdef CONFIG_PROC_FSstatic int ccio_proc_info(char *buf, char **start, off_t offset, int len){	unsigned long i = 0;	struct ccio_device *ioa = ccio_list;	unsigned long *res_ptr = (unsigned long *)ioa->res_map;	unsigned long total_pages = ioa->res_size << 3;            /* 8 bits per byte */	sprintf(buf, "%s\nCujo 2.0 bug    : %s\n",		parisc_getHWdescription(ioa->iodc->hw_type, ioa->iodc->hversion,					ioa->iodc->sversion),		(ccio_cujo_bug ? "yes" : "no"));	sprintf(buf, "%sIO pdir size    : %d bytes (%d entries)\n",		buf, ((ioa->res_size << 3) * sizeof(u64)), /* 8 bits per byte */		ioa->res_size << 3);                       /* 8 bits per byte */		sprintf(buf, "%sResource bitmap : %d bytes (%d pages)\n", 		buf, ioa->res_size, ioa->res_size << 3);   /* 8 bits per byte */	strcat(buf,  "     	  total:    free:    used:   % used:\n");	sprintf(buf, "%sblocks  %8d %8ld %8ld %8ld%%\n", buf, ioa->res_size,		ioa->res_size - ccio_used_bytes, ccio_used_bytes,		(ccio_used_bytes * 100) / ioa->res_size);	sprintf(buf, "%spages   %8ld %8ld %8ld %8ld%%\n", buf, total_pages,		total_pages - ccio_used_pages, ccio_used_pages,		(ccio_used_pages * 100 / total_pages));	sprintf(buf, "%sconsistent       %8ld %8ld\n", buf,		ccio_alloc_size, ccio_free_size); 	strcat(buf, "\nResource bitmap:\n");	for(; i < (ioa->res_size / sizeof(unsigned long)); ++i, ++res_ptr)		len += sprintf(buf, "%s%08lx ", buf, *res_ptr);	strcat(buf, "\n");	return strlen(buf);}#endif/*** Determine if ccio should claim this chip (return 0) or not (return 1).** If so, initialize the chip and tell other partners in crime they** have work to do.*/static intccio_driver_callback(struct hp_device *d, struct pa_iodc_driver *dri){	struct ccio_device *ioa;	printk("%s found %s at 0x%p\n", dri->name, dri->version, d->hpa);	if (ccio_list) {		printk(MODULE_NAME ": already initialized one device\n");		return(0);	}	ioa = kmalloc(sizeof(struct ccio_device), GFP_KERNEL);	if (NULL == ioa)	{		printk(MODULE_NAME " - couldn't alloc ccio_device\n");		return(1);	}	memset(ioa, 0, sizeof(struct ccio_device));	/*	** ccio list is used mainly as a kluge to support a single instance. 	** Eventually, with core dumps, it'll be useful for debugging.	*/	ccio_list = ioa;	ioa->iodc = d;#if 1/* KLUGE: determine IOA hpa based on GSC port value.** Needed until we have a PA bus walk. Can only discover IOA via** walking the architected PA MMIO space as described by the I/O ACD.** "Legacy" PA Firmware only tells us about unarchitected devices** that can't be detected by PA/EISA/PCI bus walks.*/	switch((long) d->hpa) {	case 0xf3fbf000L:       /* C110 IOA0 LBC (aka GSC port) */		/* ccio_hpa same as C200 IOA0 */	case 0xf203f000L:       /* C180/C200/240/C360 IOA0 LBC (aka GSC port) */		ioa->ccio_hpa = (struct ioa_registers *) 0xfff88000L;		break;	case 0xf103f000L:       /* C180/C200/240/C360 IOA1 LBC (aka GSC port) */		ioa->ccio_hpa = (struct ioa_registers *) 0xfff8A000L;		break;	default:		panic("ccio-dma.c doesn't know this GSC port Address!\n");		break;	};#else	ioa->ccio_hpa = d->hpa;#endif	ccio_alloc_pdir(ioa);	ccio_hw_init(ioa);	ccio_resmap_init(ioa);	/* CUJO20 KLUDGE start */	ccio_cujo20_hack(ioa);	/* CUJO20 KLUDGE end */	hppa_dma_ops = &ccio_ops;	create_proc_info_entry(MODULE_NAME, 0, proc_runway_root, ccio_proc_info);	return(0);}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美区自拍先锋| 国产aⅴ精品一区二区三区色成熟| 亚洲欧洲美洲综合色网| 国产亚洲视频系列| 国产香蕉久久精品综合网| 精品国产第一区二区三区观看体验 | 亚洲美女少妇撒尿| 18成人在线观看| **欧美大码日韩| 亚洲伦理在线免费看| 亚洲精品网站在线观看| 洋洋av久久久久久久一区| 一区二区在线免费| 午夜精品一区在线观看| 日本美女视频一区二区| 国内不卡的二区三区中文字幕 | 成人精品小蝌蚪| 成人av午夜电影| 99国产精品久久久久久久久久 | 丁香亚洲综合激情啪啪综合| 成人激情动漫在线观看| 91网站在线播放| 欧美日韩精品一区二区三区四区 | 欧美日本韩国一区二区三区视频| 欧美群妇大交群中文字幕| 欧美一区二区视频观看视频| 精品久久久久久亚洲综合网| 日韩精品高清不卡| 久久99国产精品麻豆| 成人在线视频一区| 欧美视频中文一区二区三区在线观看| 欧美日韩亚洲综合在线 | 国产精品入口麻豆原神| 亚洲久本草在线中文字幕| 亚洲123区在线观看| 国内精品视频一区二区三区八戒| 懂色av一区二区夜夜嗨| 欧美探花视频资源| 精品国产人成亚洲区| 亚洲日本一区二区| 日韩一区欧美二区| 成人av在线资源网站| 欧美日韩精品免费| 欧美激情一区二区三区全黄 | av亚洲精华国产精华| 欧美亚男人的天堂| 久久久蜜桃精品| 亚洲综合久久久久| 国内外成人在线视频| 97国产精品videossex| 欧美一区二区三区四区在线观看| 国产日韩欧美一区二区三区综合| 亚洲在线观看免费视频| 国产美女视频一区| 91黄色免费看| 久久蜜桃av一区精品变态类天堂 | 国产黄人亚洲片| 欧美日韩情趣电影| 中文字幕国产一区| 免费高清成人在线| 在线观看区一区二| 中文无字幕一区二区三区| 首页欧美精品中文字幕| 91性感美女视频| 精品一区二区三区在线观看| 日本精品免费观看高清观看| 久久―日本道色综合久久| 亚洲国产成人精品视频| 99riav一区二区三区| 26uuu国产日韩综合| 午夜影视日本亚洲欧洲精品| 91视频免费观看| 国产人妖乱国产精品人妖| 美女视频黄频大全不卡视频在线播放| av网站免费线看精品| 久久这里只有精品首页| 日韩不卡免费视频| 91精品福利视频| 国产精品二三区| 国产伦精品一区二区三区视频青涩| 欧美日韩国产综合一区二区 | 成人激情午夜影院| 久久综合狠狠综合| 蜜桃视频在线一区| 欧美电影在线免费观看| 亚洲同性同志一二三专区| 国产盗摄女厕一区二区三区| 精品伦理精品一区| 人人狠狠综合久久亚洲| 欧美日韩免费观看一区二区三区| 最新国产成人在线观看| 成人网在线播放| 国产欧美一区二区三区在线看蜜臀 | 男人的天堂亚洲一区| 欧美人体做爰大胆视频| 亚欧色一区w666天堂| 欧美日韩精品免费观看视频| 一区二区三区欧美在线观看| 色婷婷av一区二区三区之一色屋| 中文字幕一区二区三中文字幕| 成人一区二区三区| 国产精品青草综合久久久久99| 国产精品 欧美精品| 久久精品人人做人人爽97| 国产在线麻豆精品观看| 国产调教视频一区| 国产成人精品免费一区二区| 国产日韩精品一区二区三区| 东方aⅴ免费观看久久av| 国产精品久久久久久久蜜臀| 99这里只有久久精品视频| 国产精品高清亚洲| 在线免费观看不卡av| 一区二区三区四区不卡视频| 欧美综合色免费| 午夜免费欧美电影| 欧美一区二区三区在线观看视频| 麻豆国产精品视频| 久久综合色之久久综合| 国产69精品久久久久777| 日韩毛片精品高清免费| 色综合色狠狠综合色| 亚洲一区二区综合| 欧美精品777| 黑人精品欧美一区二区蜜桃| 国产色综合久久| 91免费国产在线观看| 亚洲成精国产精品女| 日韩欧美一级在线播放| 国产精品影视天天线| 中文字幕一区在线观看| 欧美日韩国产一级二级| 美女性感视频久久| 国产精品卡一卡二| 欧美性受xxxx黑人xyx| 美美哒免费高清在线观看视频一区二区 | 亚洲黄色免费电影| 宅男在线国产精品| 国产精品一级在线| 亚洲视频一区二区在线| 欧美卡1卡2卡| 国产传媒久久文化传媒| 一区二区三区欧美视频| 欧美成人精品二区三区99精品| 成人sese在线| 亚洲高清不卡在线| 久久久精品蜜桃| 在线观看日韩毛片| 国产精品99久久久久久似苏梦涵 | 日韩精品一区第一页| 国产欧美1区2区3区| 在线欧美一区二区| 经典三级在线一区| 一区二区成人在线观看| 久久亚洲欧美国产精品乐播 | 中文字幕一区二区三区在线不卡| 欧美日韩国产一区二区三区地区| 国产精品66部| 丝袜诱惑亚洲看片| 中文字幕精品—区二区四季| 欧美精品久久久久久久多人混战| 成人黄色免费短视频| 欧美最猛黑人xxxxx猛交| 国产精品亚洲视频| 日韩成人午夜电影| 亚洲日本va午夜在线电影| 日韩精品一区在线观看| 在线看国产一区二区| 成人永久看片免费视频天堂| 免费看黄色91| 亚洲乱码中文字幕| 国产日产精品一区| 欧美mv日韩mv国产网站| 欧美午夜片在线看| av电影一区二区| 国产一区二区三区黄视频| 日韩国产高清在线| 亚洲一区二区黄色| 国产精品的网站| 一区二区三区四区亚洲| 欧美久久高跟鞋激| 91久久精品网| 国产大片一区二区| 久久精品国产一区二区三| 亚洲午夜免费视频| 日韩毛片在线免费观看| 国产精品久久久久久久久免费樱桃 | 日韩精品一区二区三区在线播放| 色综合视频在线观看| 不卡的av电影| 国产成人精品影视| 狠狠色狠狠色综合日日91app| 青青草97国产精品免费观看| 亚洲国产成人av| 亚洲一线二线三线视频| 亚洲男人天堂av| 亚洲欧洲日韩在线| 欧美高清在线视频| 国产精品久久久一本精品 | 一区二区三区美女|