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

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

?? ccio-dma.c

?? linux-2.4.29操作系統(tǒng)的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
		);		/*		** Look for the start of a new DMA stream		*/		if(sg_dma_address(startsg) & PIDE_FLAG) {			u32 pide = sg_dma_address(startsg) & ~PIDE_FLAG;			dma_offset = (unsigned long) pide & ~IOVP_MASK;			sg_dma_address(startsg) = 0;			dma_sg++;			sg_dma_address(dma_sg) = pide;			pdirp = &(ioc->pdir_base[pide >> IOVP_SHIFT]);			n_mappings++;		}		/*		** Look for a VCONTIG chunk		*/		if (cnt) {			unsigned long vaddr = (unsigned long) sg_virt_addr(startsg);			ASSERT(pdirp);			/* Since multiple Vcontig blocks could make up			** one DMA stream, *add* cnt to dma_len.			*/			sg_dma_len(dma_sg) += cnt;			cnt += dma_offset;			dma_offset=0;	/* only want offset on first chunk */			cnt = ROUNDUP(cnt, IOVP_SIZE);#ifdef CONFIG_PROC_FS			ioc->msg_pages += cnt >> IOVP_SHIFT;#endif			do {				ccio_io_pdir_entry(pdirp, KERNEL_SPACE, 						   (void *)vaddr, hint);				vaddr += IOVP_SIZE;				cnt -= IOVP_SIZE;				pdirp++;			} while (cnt > 0);		}		startsg++;	}	return(n_mappings);}/*** First pass is to walk the SG list and determine where the breaks are** in the DMA stream. Allocates PDIR entries but does not fill them.** Returns the number of DMA chunks.**** Doing the fill seperate from the coalescing/allocation keeps the** code simpler. Future enhancement could make one pass through** the sglist do both.*/static CCIO_INLINE intccio_coalesce_chunks(struct ioc *ioc, struct scatterlist *startsg, int nents){	struct scatterlist *vcontig_sg;    /* VCONTIG chunk head */	unsigned long vcontig_len;         /* len of VCONTIG chunk */	unsigned long vcontig_end;	struct scatterlist *dma_sg;        /* next DMA stream head */	unsigned long dma_offset, dma_len; /* start/len of DMA stream */	int n_mappings = 0;	while (nents > 0) {		/*		** Prepare for first/next DMA stream		*/		dma_sg = vcontig_sg = startsg;		dma_len = vcontig_len = vcontig_end = startsg->length;		vcontig_end += (unsigned long) sg_virt_addr(startsg);		dma_offset = (unsigned long) sg_virt_addr(startsg) & ~IOVP_MASK;		/* PARANOID: clear entries */		sg_dma_address(startsg) = 0;		sg_dma_len(startsg) = 0;		/*		** This loop terminates one iteration "early" since		** it's always looking one "ahead".		*/		while(--nents > 0) {			unsigned long startsg_end;			startsg++;			startsg_end = (unsigned long) sg_virt_addr(startsg) + 				startsg->length;			/* PARANOID: clear entries */			sg_dma_address(startsg) = 0;			sg_dma_len(startsg) = 0;			/*			** First make sure current dma stream won't			** exceed DMA_CHUNK_SIZE if we coalesce the			** next entry.			*/   			if(ROUNDUP(dma_len + dma_offset + startsg->length,				   IOVP_SIZE) > DMA_CHUNK_SIZE)				break;			/*			** Append the next transaction?			*/			if(vcontig_end == (unsigned long) sg_virt_addr(startsg)) {				vcontig_len += startsg->length;				vcontig_end += startsg->length;				dma_len     += startsg->length;				continue;			}			/*			** Not virtually contigous.			** Terminate prev chunk.			** Start a new chunk.			**			** Once we start a new VCONTIG chunk, dma_offset			** can't change. And we need the offset from the first			** chunk - not the last one. Ergo Successive chunks			** must start on page boundaries and dove tail			** with it's predecessor.			*/			sg_dma_len(vcontig_sg) = vcontig_len;			vcontig_sg = startsg;			vcontig_len = startsg->length;			break;		}		/*		** End of DMA Stream		** Terminate last VCONTIG block.		** Allocate space for DMA stream.		*/		sg_dma_len(vcontig_sg) = vcontig_len;		dma_len = ROUNDUP(dma_len + dma_offset, IOVP_SIZE);		sg_dma_address(dma_sg) =			PIDE_FLAG 			| (ccio_alloc_range(ioc, (dma_len >> IOVP_SHIFT)) << IOVP_SHIFT)			| dma_offset;		n_mappings++;	}	return n_mappings;}/** * ccio_map_sg - Map the scatter/gather list into the IOMMU. * @dev: The PCI device. * @sglist: The scatter/gather list to be mapped in the IOMMU. * @nents: The number of entries in the scatter/gather list. * @direction: The direction of the DMA transaction (to/from device). * * This function implements the pci_map_sg function. */static intccio_map_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, 	    int direction){	struct ioc *ioc;	int coalesced, filled = 0;	unsigned long flags;	unsigned long hint = hint_lookup[direction];		ASSERT(dev);	ASSERT(dev->sysdata);	ASSERT(HBA_DATA(dev->sysdata)->iommu);	ioc = GET_IOC(dev);		DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents);	/* Fast path single entry scatterlists. */	if(nents == 1) {		sg_dma_address(sglist)= ccio_map_single(dev,							sg_virt_addr(sglist),							sglist->length, 							direction);		sg_dma_len(sglist)= sglist->length;		return 1;	}		spin_lock_irqsave(&ioc->res_lock, flags);#ifdef CONFIG_PROC_FS	ioc->msg_calls++;#endif	/*	** First coalesce the chunks and allocate I/O pdir space	**	** If this is one DMA stream, we can properly map using the	** correct virtual address associated with each DMA page.	** w/o this association, we wouldn't have coherent DMA!	** Access to the virtual address is what forces a two pass algorithm.	*/	coalesced = ccio_coalesce_chunks(ioc, sglist, nents);	/*	** Program the I/O Pdir	**	** map the virtual addresses to the I/O Pdir	** o dma_address will contain the pdir index	** o dma_len will contain the number of bytes to map 	** o address contains the virtual address.	*/	filled = ccio_fill_pdir(ioc, sglist, nents, hint);	spin_unlock_irqrestore(&ioc->res_lock, flags);	ASSERT(coalesced == filled);	DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled);	return filled;}/** * ccio_unmap_sg - Unmap the scatter/gather list from the IOMMU. * @dev: The PCI device. * @sglist: The scatter/gather list to be unmapped from the IOMMU. * @nents: The number of entries in the scatter/gather list. * @direction: The direction of the DMA transaction (to/from device). * * This function implements the pci_unmap_sg function. */static void ccio_unmap_sg(struct pci_dev *dev, struct scatterlist *sglist, int nents, 	      int direction){	struct ioc *ioc;	ASSERT(dev);	ASSERT(dev->sysdata);	ASSERT(HBA_DATA(dev->sysdata)->iommu);	ioc = GET_IOC(dev);	DBG_RUN_SG("%s() START %d entries,  %p,%x\n",		__FUNCTION__, nents, sg_virt_address(sglist), sglist->length);#ifdef CONFIG_PROC_FS	ioc->usg_calls++;#endif	while(sg_dma_len(sglist) && nents--) {#ifdef CONFIG_PROC_FS		ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT;#endif		ccio_unmap_single(dev, sg_dma_address(sglist),				  sg_dma_len(sglist), direction);		++sglist;	}	DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__, nents);}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 */};#ifdef CONFIG_PROC_FSstatic int proc_append(char *src, int len, char **dst, off_t *offset, int *max){	if (len < *offset) {		*offset -= len;		return 0;	}	if (*offset > 0) {		src += *offset;		len -= *offset;		*offset = 0;	}	if (len > *max) {		len = *max;	}	memcpy(*dst, src, len);	*dst += len;	*max -= len;	return (*max == 0);}static int ccio_proc_info(char *buf, char **start, off_t offset, int count,			  int *eof, void *data){	int max = count;	char tmp[80]; /* width of an ANSI-standard terminal */	struct ioc *ioc = ioc_list;	while (ioc != NULL) {		unsigned int total_pages = ioc->res_size << 3;		unsigned long avg = 0, min, max;		int j, len;		len = sprintf(tmp, "%s\n", ioc->name);		if (proc_append(tmp, len, &buf, &offset, &count))			break;				len = sprintf(tmp, "Cujo 2.0 bug    : %s\n",			      (ioc->cujo20_bug ? "yes" : "no"));		if (proc_append(tmp, len, &buf, &offset, &count))			break;				len = sprintf(tmp, "IO PDIR size    : %d bytes (%d entries)\n",			      total_pages * 8, total_pages);		if (proc_append(tmp, len, &buf, &offset, &count))			break;				len = sprintf(tmp, "IO PDIR entries : %ld free  %ld used (%d%%)\n",			      total_pages - ioc->used_pages, ioc->used_pages,			      (int)(ioc->used_pages * 100 / total_pages));		if (proc_append(tmp, len, &buf, &offset, &count))			break;				len = sprintf(tmp, "Resource bitmap : %d bytes (%d pages)\n", 			ioc->res_size, total_pages);		if (proc_append(tmp, len, &buf, &offset, &count))			break;				min = max = ioc->avg_search[0];		for(j = 0; j < CCIO_SEARCH_SAMPLE; ++j) {			avg += ioc->avg_search[j];			if(ioc->avg_search[j] > max) 				max = ioc->avg_search[j];			if(ioc->avg_search[j] < min) 				min = ioc->avg_search[j];		}		avg /= CCIO_SEARCH_SAMPLE;		len = sprintf(tmp, "  Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles)\n",			      min, avg, max);		if (proc_append(tmp, len, &buf, &offset, &count))			break;		len = sprintf(tmp, "pci_map_single(): %8ld calls  %8ld pages (avg %d/1000)\n",			      ioc->msingle_calls, ioc->msingle_pages,			      (int)((ioc->msingle_pages * 1000)/ioc->msingle_calls));		if (proc_append(tmp, len, &buf, &offset, &count))			break;				/* KLUGE - unmap_sg calls unmap_single for each mapped page */		min = ioc->usingle_calls - ioc->usg_calls;		max = ioc->usingle_pages - ioc->usg_pages;		len = sprintf(tmp, "pci_unmap_single: %8ld calls  %8ld pages (avg %d/1000)\n",			      min, max, (int)((max * 1000)/min));		if (proc_append(tmp, len, &buf, &offset, &count))			break; 		len = sprintf(tmp, "pci_map_sg()    : %8ld calls  %8ld pages (avg %d/1000)\n",			      ioc->msg_calls, ioc->msg_pages,			      (int)((ioc->msg_pages * 1000)/ioc->msg_calls));		if (proc_append(tmp, len, &buf, &offset, &count))			break;		len = sprintf(tmp, "pci_unmap_sg()  : %8ld calls  %8ld pages (avg %d/1000)\n\n\n",			      ioc->usg_calls, ioc->usg_pages,			      (int)((ioc->usg_pages * 1000)/ioc->usg_calls));		if (proc_append(tmp, len, &buf, &offset, &count))			break;		ioc = ioc->next;	}	if (count == 0) {		*eof = 1;	}	return (max - count);}static int ccio_resource_map(char *buf, char **start, off_t offset, int len,			     int *eof, void *data){	struct ioc *ioc = ioc_list;	buf[0] = '\0';	while (ioc != NULL) {		u32 *res_ptr = (u32 *)ioc->res_map;		int j;		for (j = 0; j < (ioc->res_size / sizeof(u32)); j++) {			if ((j & 7) == 0)				strcat(buf,"\n   ");			sprintf(buf, "%s %08x", buf, *res_ptr);			res_ptr++;		}		strcat(buf, "\n\n");		ioc = ioc->next;		break; /* XXX - remove me */	}	return strlen(buf);}#endif/** * ccio_find_ioc - Find the ioc in the ioc_list * @hw_path: The hardware path of the ioc.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产区在线观看成人精品| 欧美日韩综合在线| 日韩成人午夜电影| 亚洲人成精品久久久久| 久久综合五月天婷婷伊人| 欧美怡红院视频| 欧美日韩国产高清一区二区| 久久99久久久久| 日韩电影一区二区三区四区| 亚洲日本韩国一区| 中文字幕一区二区日韩精品绯色| 欧美一区二区三区人| 91久久精品一区二区二区| 91色.com| 一本高清dvd不卡在线观看| 成人福利视频在线| 成人av片在线观看| av动漫一区二区| 不卡的av电影| 欧美性生活大片视频| 色综合久久88色综合天天6| 91一区二区三区在线观看| 91日韩在线专区| 在线成人高清不卡| 日韩一级免费一区| 欧美激情艳妇裸体舞| 国产精品色在线观看| 亚洲日本电影在线| 亚洲国产精品一区二区尤物区| 国产精品一区免费在线观看| 国内精品写真在线观看| av福利精品导航| 欧美日韩不卡在线| 欧美国产欧美综合| 亚洲第一激情av| 国产成人午夜片在线观看高清观看| 国产福利一区二区三区视频 | 欧美一区二视频| 2021久久国产精品不只是精品| 亚洲国产成人私人影院tom| 亚洲精品日韩一| 精品写真视频在线观看| 不卡欧美aaaaa| 日韩久久免费av| 亚洲免费观看视频| 国产精品中文欧美| 欧美日韩一区二区欧美激情| 国产免费观看久久| 日韩av电影免费观看高清完整版 | 欧美激情一区二区三区全黄| 亚洲欧美一区二区不卡| 国产精品综合二区| 91麻豆精品国产91久久久使用方法 | 久久精品免费在线观看| 亚洲国产另类精品专区| 91同城在线观看| 国产午夜精品在线观看| 另类人妖一区二区av| 日本国产一区二区| 中文字幕视频一区二区三区久| 国产毛片精品国产一区二区三区| 欧美日韩午夜在线视频| 亚洲男女毛片无遮挡| 成人精品国产一区二区4080| 日韩一区二区三区在线| 日本美女一区二区| 日韩亚洲电影在线| 免费高清视频精品| 日韩一区二区电影网| 天堂va蜜桃一区二区三区| 欧美视频一区二| 日韩在线一二三区| 欧美不卡一区二区三区四区| 日韩在线观看一区二区| 欧美精品一卡两卡| 久久69国产一区二区蜜臀| 欧美刺激午夜性久久久久久久| 日本中文字幕一区二区有限公司| 欧美无乱码久久久免费午夜一区| 一区二区三区 在线观看视频| 色综合久久中文字幕综合网 | 国产精品影视网| 国产色产综合产在线视频| 日本韩国欧美一区二区三区| 午夜视黄欧洲亚洲| 欧美mv日韩mv国产网站app| 成人激情电影免费在线观看| 亚洲人快播电影网| 精品久久久久久最新网址| 成人午夜电影小说| 天堂成人国产精品一区| 久久久不卡网国产精品二区| 色婷婷精品大在线视频| 精品一二线国产| 亚洲精品日韩一| 国产午夜精品一区二区三区四区| 色哟哟一区二区三区| 国产在线不卡一区| 亚洲h在线观看| 亚洲欧洲精品成人久久奇米网| 欧美片网站yy| 色综合天天综合在线视频| 韩国精品一区二区| 亚瑟在线精品视频| 中文字幕一区二区三区在线不卡 | 成人av网站免费| 国内精品在线播放| 日本vs亚洲vs韩国一区三区 | 在线一区二区三区四区五区| 久久电影网站中文字幕| 国产亚洲1区2区3区| 国产乱人伦偷精品视频不卡| 久久99精品国产.久久久久久| 久久免费国产精品| 不卡视频免费播放| 蜜臀av亚洲一区中文字幕| xfplay精品久久| 99久久国产综合精品色伊| 亚洲精品免费一二三区| 国产精品乱码久久久久久| 91精品在线观看入口| 欧美一级视频精品观看| 亚洲一区视频在线观看视频| 99免费精品视频| 国产精品乱子久久久久| 国产精品69毛片高清亚洲| 精品国产一区二区三区不卡 | 亚洲一区二区三区四区中文字幕 | 一本一本大道香蕉久在线精品| 久久99精品久久久久久久久久久久| 国产精品网站在线| 欧美一二三四在线| 91精品久久久久久久99蜜桃 | 5月丁香婷婷综合| 成人av在线看| 色综合色综合色综合| 欧美性色黄大片手机版| 成人av免费在线观看| 欧美色视频一区| 日韩欧美亚洲另类制服综合在线| 欧美一级黄色片| 国产日韩v精品一区二区| 夜夜爽夜夜爽精品视频| 日韩精品每日更新| 91丨porny丨国产| 8x8x8国产精品| 亚洲欧洲日韩一区二区三区| 亚洲va国产va欧美va观看| 国产精品夜夜嗨| 欧美日本一区二区在线观看| 日韩精品一区二| 伊人开心综合网| 加勒比av一区二区| 一本色道久久综合亚洲精品按摩 | 337p日本欧洲亚洲大胆精品| 亚洲精品国产一区二区精华液| 秋霞午夜av一区二区三区| 成人精品视频一区二区三区| 26uuu国产在线精品一区二区| 亚洲一区二区三区四区在线免费观看 | 国产精品视频第一区| 精东粉嫩av免费一区二区三区| 在线精品观看国产| 樱花草国产18久久久久| 性做久久久久久久久| 激情综合网最新| 欧美一区二区三区免费大片 | 欧美一卡在线观看| 韩国视频一区二区| **性色生活片久久毛片| 在线观看av不卡| 麻豆精品视频在线观看视频| 国产日韩精品一区二区三区 | 欧美伊人久久久久久久久影院 | 欧美一区永久视频免费观看| 亚洲高清视频的网址| 欧美日韩一区在线| 天堂成人免费av电影一区| 欧美一区二区三区小说| 日韩国产高清在线| 精品国产一区二区在线观看| 久久成人久久鬼色| 日本一区二区三区四区在线视频| 丁香婷婷深情五月亚洲| 成人欧美一区二区三区| 91在线视频免费91| 午夜私人影院久久久久| 日韩精品自拍偷拍| 粉嫩在线一区二区三区视频| 亚洲青青青在线视频| 欧美一区二区网站| 国产999精品久久久久久绿帽| 亚洲日本免费电影| 日韩精品一区二| 色狠狠桃花综合| 国产一区二区三区在线观看免费视频| 国产精品白丝在线| 欧美一区二区三区四区在线观看| 国产suv精品一区二区883| 午夜激情一区二区|