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

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

?? dma-noncoherent.c

?? 底層驅(qū)動(dòng)開發(fā)
?? C
字號(hào):
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2000  Ani Joshi <ajoshi@unixbox.com> * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org> * swiped from i386, and cloned for MIPS by Geert, polished by Ralf. */#include <linux/config.h>#include <linux/types.h>#include <linux/mm.h>#include <linux/module.h>#include <linux/string.h>#include <linux/dma-mapping.h>#include <asm/cache.h>#include <asm/io.h>/* * Warning on the terminology - Linux calls an uncached area coherent; * MIPS terminology calls memory areas with hardware maintained coherency * coherent. */void *dma_alloc_noncoherent(struct device *dev, size_t size,	dma_addr_t * dma_handle, int gfp){	void *ret;	/* ignore region specifiers */	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);	if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))		gfp |= GFP_DMA;	ret = (void *) __get_free_pages(gfp, get_order(size));	if (ret != NULL) {		memset(ret, 0, size);		*dma_handle = virt_to_phys(ret);	}	return ret;}EXPORT_SYMBOL(dma_alloc_noncoherent);void *dma_alloc_coherent(struct device *dev, size_t size,	dma_addr_t * dma_handle, int gfp){	void *ret;	ret = dma_alloc_noncoherent(dev, size, dma_handle, gfp);	if (ret) {		dma_cache_wback_inv((unsigned long) ret, size);		ret = UNCAC_ADDR(ret);	}	return ret;}EXPORT_SYMBOL(dma_alloc_coherent);void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,	dma_addr_t dma_handle){	free_pages((unsigned long) vaddr, get_order(size));}EXPORT_SYMBOL(dma_free_noncoherent);void dma_free_coherent(struct device *dev, size_t size, void *vaddr,	dma_addr_t dma_handle){	unsigned long addr = (unsigned long) vaddr;	addr = CAC_ADDR(addr);	free_pages(addr, get_order(size));}EXPORT_SYMBOL(dma_free_coherent);static inline void __dma_sync(unsigned long addr, size_t size,	enum dma_data_direction direction){	switch (direction) {	case DMA_TO_DEVICE:		dma_cache_wback(addr, size);		break;	case DMA_FROM_DEVICE:		dma_cache_inv(addr, size);		break;	case DMA_BIDIRECTIONAL:		dma_cache_wback_inv(addr, size);		break;	default:		BUG();	}}dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,	enum dma_data_direction direction){	unsigned long addr = (unsigned long) ptr;	switch (direction) {	case DMA_TO_DEVICE:		dma_cache_wback(addr, size);		break;	case DMA_FROM_DEVICE:		dma_cache_inv(addr, size);		break;	case DMA_BIDIRECTIONAL:		dma_cache_wback_inv(addr, size);		break;	default:		BUG();	}	return virt_to_phys(ptr);}EXPORT_SYMBOL(dma_map_single);void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,	enum dma_data_direction direction){	unsigned long addr;	addr = dma_addr + PAGE_OFFSET;	switch (direction) {	case DMA_TO_DEVICE:		//dma_cache_wback(addr, size);		break;	case DMA_FROM_DEVICE:		//dma_cache_inv(addr, size);		break;	case DMA_BIDIRECTIONAL:		//dma_cache_wback_inv(addr, size);		break;	default:		BUG();	}}EXPORT_SYMBOL(dma_unmap_single);int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,	enum dma_data_direction direction){	int i;	BUG_ON(direction == DMA_NONE);	for (i = 0; i < nents; i++, sg++) {		unsigned long addr;		addr = (unsigned long) page_address(sg->page);		if (addr)			__dma_sync(addr + sg->offset, sg->length, direction);		sg->dma_address = (dma_addr_t)			(page_to_phys(sg->page) + sg->offset);	}	return nents;}EXPORT_SYMBOL(dma_map_sg);dma_addr_t dma_map_page(struct device *dev, struct page *page,	unsigned long offset, size_t size, enum dma_data_direction direction){	unsigned long addr;	BUG_ON(direction == DMA_NONE);	addr = (unsigned long) page_address(page) + offset;	dma_cache_wback_inv(addr, size);	return page_to_phys(page) + offset;}EXPORT_SYMBOL(dma_map_page);void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,	enum dma_data_direction direction){	BUG_ON(direction == DMA_NONE);	if (direction != DMA_TO_DEVICE) {		unsigned long addr;		addr = dma_address + PAGE_OFFSET;		dma_cache_wback_inv(addr, size);	}}EXPORT_SYMBOL(dma_unmap_page);void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,	enum dma_data_direction direction){	unsigned long addr;	int i;	BUG_ON(direction == DMA_NONE);	if (direction == DMA_TO_DEVICE)		return;	for (i = 0; i < nhwentries; i++, sg++) {		addr = (unsigned long) page_address(sg->page);		if (!addr)			continue;		dma_cache_wback_inv(addr + sg->offset, sg->length);	}}EXPORT_SYMBOL(dma_unmap_sg);void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,	size_t size, enum dma_data_direction direction){	unsigned long addr;	BUG_ON(direction == DMA_NONE);	addr = dma_handle + PAGE_OFFSET;	__dma_sync(addr, size, direction);}EXPORT_SYMBOL(dma_sync_single_for_cpu);void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,	size_t size, enum dma_data_direction direction){	unsigned long addr;	BUG_ON(direction == DMA_NONE);	addr = dma_handle + PAGE_OFFSET;	__dma_sync(addr, size, direction);}EXPORT_SYMBOL(dma_sync_single_for_device);void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,	unsigned long offset, size_t size, enum dma_data_direction direction){	unsigned long addr;	BUG_ON(direction == DMA_NONE);	addr = dma_handle + offset + PAGE_OFFSET;	__dma_sync(addr, size, direction);}EXPORT_SYMBOL(dma_sync_single_range_for_cpu);void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,	unsigned long offset, size_t size, enum dma_data_direction direction){	unsigned long addr;	BUG_ON(direction == DMA_NONE);	addr = dma_handle + offset + PAGE_OFFSET;	__dma_sync(addr, size, direction);}EXPORT_SYMBOL(dma_sync_single_range_for_device);void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,	enum dma_data_direction direction){	int i;	BUG_ON(direction == DMA_NONE);	/* Make sure that gcc doesn't leave the empty loop body.  */	for (i = 0; i < nelems; i++, sg++)		__dma_sync((unsigned long)page_address(sg->page),		           sg->length, direction);}EXPORT_SYMBOL(dma_sync_sg_for_cpu);void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,	enum dma_data_direction direction){	int i;	BUG_ON(direction == DMA_NONE);	/* Make sure that gcc doesn't leave the empty loop body.  */	for (i = 0; i < nelems; i++, sg++)		__dma_sync((unsigned long)page_address(sg->page),		           sg->length, direction);}EXPORT_SYMBOL(dma_sync_sg_for_device);int dma_mapping_error(dma_addr_t dma_addr){	return 0;}EXPORT_SYMBOL(dma_mapping_error);int dma_supported(struct device *dev, u64 mask){	/*	 * we fall back to GFP_DMA when the mask isn't all 1s,	 * so we can't guarantee allocations that must be	 * within a tighter range than GFP_DMA..	 */	if (mask < 0x00ffffff)		return 0;	return 1;}EXPORT_SYMBOL(dma_supported);int dma_is_consistent(dma_addr_t dma_addr){	return 1;}EXPORT_SYMBOL(dma_is_consistent);void dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction direction){	if (direction == DMA_NONE)		return;	dma_cache_wback_inv((unsigned long)vaddr, size);}EXPORT_SYMBOL(dma_cache_sync);/* The DAC routines are a PCIism.. */#ifdef CONFIG_PCI#include <linux/pci.h>dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,	struct page *page, unsigned long offset, int direction){	return (dma64_addr_t)page_to_phys(page) + offset;}EXPORT_SYMBOL(pci_dac_page_to_dma);struct page *pci_dac_dma_to_page(struct pci_dev *pdev,	dma64_addr_t dma_addr){	return mem_map + (dma_addr >> PAGE_SHIFT);}EXPORT_SYMBOL(pci_dac_dma_to_page);unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,	dma64_addr_t dma_addr){	return dma_addr & ~PAGE_MASK;}EXPORT_SYMBOL(pci_dac_dma_to_offset);void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,	dma64_addr_t dma_addr, size_t len, int direction){	BUG_ON(direction == PCI_DMA_NONE);	dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);}EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,	dma64_addr_t dma_addr, size_t len, int direction){	BUG_ON(direction == PCI_DMA_NONE);	dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);}EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);#endif /* CONFIG_PCI */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品不卡一区二区三区| 国产欧美精品在线观看| 成人av在线网| 成人精品视频一区二区三区 | 99久久综合色| 成人动漫一区二区在线| 丰满白嫩尤物一区二区| 国产不卡在线视频| 成人精品鲁一区一区二区| 国产91精品免费| 99久久久免费精品国产一区二区 | √…a在线天堂一区| 国产精品免费aⅴ片在线观看| 欧美韩日一区二区三区四区| 国产精品美女久久久久久久网站| 亚洲图片另类小说| 亚洲九九爱视频| 天天免费综合色| 国产精品77777| 成人免费视频免费观看| 日本韩国欧美三级| 欧美精品高清视频| 久久久精品人体av艺术| 最新热久久免费视频| 亚洲第一福利视频在线| 国内精品不卡在线| 色综合色综合色综合色综合色综合| 欧美三级在线看| 日韩西西人体444www| 26uuu欧美| 亚洲午夜久久久久| 国产精品一区免费视频| 欧美在线看片a免费观看| 日韩视频永久免费| 《视频一区视频二区| 蜜臀av一级做a爰片久久| caoporn国产一区二区| 91精品国产高清一区二区三区蜜臀| 久久午夜免费电影| 在线观看亚洲专区| 国产精品久久久久久久久免费樱桃 | 亚洲天堂中文字幕| 秋霞电影网一区二区| 成人av在线播放网站| 欧美久久久一区| 亚洲国产精华液网站w| 亚洲444eee在线观看| 成人黄色小视频| 日韩一级完整毛片| 亚洲自拍偷拍av| 国产+成+人+亚洲欧洲自线| 欧美福利视频导航| 亚洲男同性恋视频| 国产精品一区二区91| 91精品国产综合久久精品图片| 亚洲成a人片在线观看中文| 亚洲精品视频一区| 国产老女人精品毛片久久| 欧洲亚洲精品在线| 中文字幕一区二区三区色视频| 欧美a一区二区| 欧美另类变人与禽xxxxx| 国产精品白丝在线| 丁香桃色午夜亚洲一区二区三区| 91精品在线一区二区| 亚洲精品伦理在线| 99久久久久久| 亚洲图片你懂的| 99精品一区二区| 国产精品国产三级国产普通话三级 | 中文字幕国产精品一区二区| 久久69国产一区二区蜜臀| 欧美精品18+| 日韩中文字幕1| 9191精品国产综合久久久久久| 亚洲精品大片www| 在线视频亚洲一区| 亚洲综合色自拍一区| 欧美在线制服丝袜| 亚洲成人自拍偷拍| 91精品国产欧美一区二区| 日韩中文字幕1| 精品国产髙清在线看国产毛片| 奇米影视一区二区三区小说| 日韩一二在线观看| 国产酒店精品激情| 国产精品久久看| 日本乱人伦aⅴ精品| 五月激情综合婷婷| 日韩精品在线一区二区| 国产成人aaa| 亚洲免费av在线| 欧美精品自拍偷拍| 韩国精品在线观看| 欧美国产精品一区二区三区| 99在线热播精品免费| 亚洲韩国精品一区| 欧美xxxxx裸体时装秀| 国产盗摄一区二区三区| 亚洲乱码国产乱码精品精小说| 欧美色老头old∨ideo| 精品一区二区久久| 国产精品理伦片| 欧美高清视频一二三区 | 麻豆视频一区二区| 国产精品理论片| 欧美日韩在线三区| 国产乱码精品一区二区三区忘忧草 | 亚洲国产精品久久不卡毛片| 91精品在线一区二区| 国产a久久麻豆| 五月综合激情婷婷六月色窝| 国产视频一区二区三区在线观看| 日本韩国一区二区三区视频| 韩国女主播成人在线| 一区二区三区**美女毛片| 精品久久久久香蕉网| 色噜噜狠狠一区二区三区果冻| 久久99精品视频| 亚洲综合激情网| 日本一区二区三区电影| 91精品国产综合久久香蕉麻豆| av一区二区三区四区| 久久激情综合网| 亚洲一区二区三区四区在线观看 | 欧美日韩免费一区二区三区视频| 国产精品一区二区久久精品爱涩| 亚洲gay无套男同| 自拍偷在线精品自拍偷无码专区| 久久亚洲一级片| 7777精品伊人久久久大香线蕉超级流畅 | 欧美成人官网二区| 在线亚洲高清视频| 99免费精品视频| 国产盗摄精品一区二区三区在线| 蜜桃av一区二区| 午夜精品久久久久影视| 中文字幕在线观看一区| 国产三级一区二区三区| 日韩欧美国产高清| 7777精品伊人久久久大香线蕉经典版下载 | 国产成人精品影视| 亚洲黄色片在线观看| 久久久99久久| 欧美xfplay| 欧美视频一区二区在线观看| 99久久久精品| 波多野结衣亚洲| 成人激情免费网站| 成人精品一区二区三区中文字幕| 国产综合一区二区| 国产在线一区观看| 美女脱光内衣内裤视频久久影院| 亚洲电影激情视频网站| 亚洲一二三四区不卡| 亚洲午夜久久久久久久久电影院| 亚洲视频一区在线| 一区二区三区在线看| 天堂午夜影视日韩欧美一区二区| 国产精品久久久久桃色tv| 国产精品久久久久四虎| 国产精品国产三级国产aⅴ中文 | 日韩一级二级三级| 欧美一级二级三级乱码| 日韩免费电影一区| 久久久久99精品一区| 国产精品电影一区二区三区| 亚洲人被黑人高潮完整版| 亚洲精品免费在线播放| 天天综合网天天综合色| 久久超碰97人人做人人爱| 国产99久久久国产精品潘金| 99精品偷自拍| 欧美日韩国产综合一区二区三区 | 久久综合给合久久狠狠狠97色69| 久久亚洲综合色一区二区三区| 中文字幕乱码亚洲精品一区| 成人免费在线播放视频| 午夜一区二区三区视频| 国内成+人亚洲+欧美+综合在线 | 91成人国产精品| 日韩欧美资源站| 国产精品福利影院| 亚洲国产精品久久艾草纯爱| 韩国视频一区二区| 99久久精品久久久久久清纯| 欧美日韩免费视频| 中文一区一区三区高中清不卡| 一区二区三区四区高清精品免费观看| 日韩高清不卡一区二区| 国v精品久久久网| 欧美片网站yy| 久久久久久久久久久久久夜| 一二三区精品福利视频| 韩国午夜理伦三级不卡影院| 色噜噜狠狠色综合中国| 久久九九全国免费| 天天射综合影视| 91蝌蚪国产九色| 久久毛片高清国产|