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

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

?? ccio-dma.c

?? 該文件是rt_linux
?? C
?? 第 1 頁 / 共 4 頁
字號:
 * @hw_path: The hardware path of the ioc. * * This function searches the ioc_list for an ioc that matches * the provide hardware path. */static struct ioc * ccio_find_ioc(int hw_path){	int i;	struct ioc *ioc;	ioc = ioc_list;	for (i = 0; i < ioc_count; i++) {		if (ioc->hw_path == hw_path)			return ioc;		ioc = ioc->next;	}	return NULL;}/** * ccio_get_iommu - Find the iommu which controls this device * @dev: The parisc device. * * This function searches through the registerd IOMMU's and returns the * appropriate IOMMU for the device based upon the devices hardware path. */void * ccio_get_iommu(const struct parisc_device *dev){	dev = find_pa_parent_type(dev, HPHW_IOA);	if (!dev)		return NULL;	return ccio_find_ioc(dev->hw_path);}#define CUJO_20_STEP       0x10000000	/* inc upper nibble *//* Cujo 2.0 has a bug which will silently corrupt data being transferred * to/from certain pages.  To avoid this happening, we mark these pages * as `used', and ensure that nothing will try to allocate from them. */void ccio_cujo20_fixup(struct parisc_device *dev, u32 iovp){	unsigned int idx;	struct ioc *ioc = ccio_get_iommu(dev);	u8 *res_ptr;#ifdef CONFIG_PROC_FS	ioc->cujo20_bug = 1;#endif	res_ptr = ioc->res_map;	idx = PDIR_INDEX(iovp) >> 3;	while (idx < ioc->res_size) { 		res_ptr[idx] |= 0xff;		idx += PDIR_INDEX(CUJO_20_STEP) >> 3;	}}#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 parisc_device *dev){	if (dev->spa_shift == 0) {		panic("%s() : Can't determine I/O TLB size.\n", __FUNCTION__);	}	return (1 << dev->spa_shift);}#else/* Uturn supports 256 TLB entries */#define CCIO_CHAINID_SHIFT	8#define CCIO_CHAINID_MASK	0xff#endif /* 0 *//** * ccio_ioc_init - Initalize the I/O Controller * @ioc: The I/O Controller. * * Initalize the I/O Controller which includes setting up the * I/O Page Directory, the resource map, and initalizing the * U2/Uturn chip into virtual mode. */static voidccio_ioc_init(struct ioc *ioc){	int i, iov_order;	u32 iova_space_size;	unsigned long physmem;	/*	** Determine IOVA Space size from memory size.	**	** 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 */	physmem = num_physpages << PAGE_SHIFT;	if(physmem < (ccio_mem_ratio * 1024 * 1024)) {		iova_space_size = 1024 * 1024;#ifdef __LP64__	} else if(physmem > (ccio_mem_ratio * 512 * 1024 * 1024)) {		iova_space_size = 512 * 1024 * 1024;#endif	} else {		iova_space_size = (u32)(physmem / 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) >> (IOVP_SHIFT - PAGE_SHIFT);	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);	ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);	ASSERT(ioc->pdir_size < 4 * 1024 * 1024);   /* max pdir size < 4MB */	/* Verify it's a power of two */	ASSERT((1 << get_order(ioc->pdir_size)) == (ioc->pdir_size >> PAGE_SHIFT));	DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits) PDIR size 0x%0x",		__FUNCTION__, ioc->ioc_hpa, physmem>>20, iova_space_size>>20,		 iov_order + PAGE_SHIFT, ioc->pdir_size);	ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL, 						 get_order(ioc->pdir_size));	if(NULL == ioc->pdir_base) {		panic(__FILE__ ":%s() could not allocate I/O Page Table\n", __FUNCTION__);	}	memset(ioc->pdir_base, 0, ioc->pdir_size);	ASSERT((((unsigned long)ioc->pdir_base) & PAGE_MASK) == (unsigned long)ioc->pdir_base);	DBG_INIT(" base %p", ioc->pdir_base);	/* resource map size dictated by pdir_size */ 	ioc->res_size = (ioc->pdir_size / sizeof(u64)) >> 3;	DBG_INIT("%s() res_size 0x%x\n", __FUNCTION__, ioc->res_size);		ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL, 					      get_order(ioc->res_size));	if(NULL == ioc->res_map) {		panic(__FILE__ ":%s() could not allocate resource map\n", __FUNCTION__);	}	memset(ioc->res_map, 0, ioc->res_size);	/* Initialize the res_hint to 16 */	ioc->res_hint = 16;	/* Initialize the spinlock */	spin_lock_init(&ioc->res_lock);	/*	** Chainid is the upper most bits of an IOVP used to determine	** which TLB entry an IOVP will use.	*/	ioc->chainid_shift = get_order(iova_space_size) + PAGE_SHIFT - CCIO_CHAINID_SHIFT;	DBG_INIT(" chainid_shift 0x%x\n", ioc->chainid_shift);	/*	** Initialize IOA hardware	*/	WRITE_U32(CCIO_CHAINID_MASK << ioc->chainid_shift, 		  &ioc->ioc_hpa->io_chain_id_mask);	WRITE_U32(virt_to_phys(ioc->pdir_base), 		  &ioc->ioc_hpa->io_pdir_base);	/*	** Go to "Virtual Mode"	*/	WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_hpa->io_control);	/*	** Initialize all I/O TLB entries to 0 (Valid bit off).	*/	WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_m);	WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_l);	for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {		WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)),			  &ioc->ioc_hpa->io_command);	}}static voidccio_init_resource(struct resource *res, char *name, unsigned long ioaddr){	int result;	res->flags = IORESOURCE_MEM;	res->start = (unsigned long)(signed) __raw_readl(ioaddr) << 16;	res->end = (unsigned long)(signed) (__raw_readl(ioaddr + 4) << 16) - 1;	if (res->end + 1 == res->start)		return;	res->name = name;	result = request_resource(&iomem_resource, res);	if (result < 0) {		printk(KERN_ERR 		       "%s: failed to claim CCIO bus address space (%p,%p)\n", 		       __FILE__, res->start, res->end);	}}static void __init ccio_init_resources(struct ioc *ioc){	struct resource *res = ioc->mmio_region;	char *name = kmalloc(14, GFP_KERNEL);	sprintf(name, "GSC Bus [%d/]", ioc->hw_path);	ccio_init_resource(res, name, (unsigned long)&ioc->ioc_hpa->io_io_low);	ccio_init_resource(res + 1, name,			(unsigned long)&ioc->ioc_hpa->io_io_low_hv);}static void expand_ioc_area(struct ioc *ioc, unsigned long size,		unsigned long min, unsigned long max, unsigned long align){#ifdef NASTY_HACK_FOR_K_CLASS	__raw_writel(0xfffff600, (unsigned long)&(ioc->ioc_hpa->io_io_high));	ioc->mmio_region[0].end = 0xf5ffffff;#endif}static struct resource *ccio_get_resource(struct ioc* ioc,		const struct parisc_device *dev){	if (!ioc) {		return &iomem_resource;	} else if ((ioc->mmio_region->start <= dev->hpa) &&			(dev->hpa < ioc->mmio_region->end)) {		return ioc->mmio_region;	} else if (((ioc->mmio_region + 1)->start <= dev->hpa) &&			(dev->hpa < (ioc->mmio_region + 1)->end)) {		return ioc->mmio_region + 1;	} else {		return NULL;	}}int ccio_allocate_resource(const struct parisc_device *dev,		struct resource *res, unsigned long size,		unsigned long min, unsigned long max, unsigned long align,		void (*alignf)(void *, struct resource *, unsigned long),		void *alignf_data){	struct ioc *ioc = ccio_get_iommu(dev);	struct resource *parent = ccio_get_resource(ioc, dev);	if (!parent)		return -EBUSY;	if (!allocate_resource(parent, res, size, min, max, align, alignf,			alignf_data))		return 0;	expand_ioc_area(ioc, size, min, max, align);	return allocate_resource(parent, res, size, min, max, align, alignf,			alignf_data);}int ccio_request_resource(const struct parisc_device *dev,		struct resource *res){	struct ioc *ioc = ccio_get_iommu(dev);	struct resource *parent = ccio_get_resource(ioc, dev);	return request_resource(parent, res);}/** * ccio_probe - Determine if ccio should claim this device. * @dev: The device which has been found * * 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 int ccio_probe(struct parisc_device *dev){	int i;	struct ioc *ioc, **ioc_p = &ioc_list;		ioc = kmalloc(sizeof(struct ioc), GFP_KERNEL);	if (ioc == NULL) {		printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");		return 1;	}	memset(ioc, 0, sizeof(struct ioc));	ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";	printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa);	for (i = 0; i < ioc_count; i++) {		ioc_p = &(*ioc_p)->next;	}	*ioc_p = ioc;	ioc->hw_path = dev->hw_path;	ioc->ioc_hpa = (struct ioa_registers *)dev->hpa;	ccio_ioc_init(ioc);	ccio_init_resources(ioc);	hppa_dma_ops = &ccio_ops;	if (ioc_count == 0) {		/* XXX: Create separate entries for each ioc */		create_proc_read_entry(MODULE_NAME, S_IRWXU, proc_runway_root,				       ccio_proc_info, NULL);		create_proc_read_entry(MODULE_NAME"-bitmap", S_IRWXU,				       proc_runway_root, ccio_resource_map, NULL);	}	ioc_count++;	return 0;}struct pci_dev * ccio_get_fake(const struct parisc_device *dev){	struct ioc *ioc;	dev = find_pa_parent_type(dev, HPHW_IOA);	if(!dev)		return NULL;	ioc = ccio_find_ioc(dev->hw_path);	if(!ioc)		return NULL;	if(ioc->fake_pci_dev)		return ioc->fake_pci_dev;	ioc->fake_pci_dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL);	if(ioc->fake_pci_dev == NULL) {		printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");		return NULL;	}	memset(ioc->fake_pci_dev, 0, sizeof(struct pci_dev));	ioc->fake_pci_dev->sysdata = kmalloc(sizeof(struct pci_hba_data), GFP_KERNEL);	if(ioc->fake_pci_dev->sysdata == NULL) {		printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");		return NULL;	}	HBA_DATA(ioc->fake_pci_dev->sysdata)->iommu = ioc;	return ioc->fake_pci_dev;}/* We *can't* support JAVA (T600). Venture there at your own risk. */static struct parisc_device_id ccio_tbl[] = {	{ HPHW_IOA, HVERSION_REV_ANY_ID, U2_IOA_RUNWAY, 0xb }, /* U2 */	{ HPHW_IOA, HVERSION_REV_ANY_ID, UTURN_IOA_RUNWAY, 0xb }, /* UTurn */	{ 0, }};static struct parisc_driver ccio_driver = {	name:		"U2/Uturn",	id_table:	ccio_tbl,	probe:		ccio_probe,};/** * ccio_init - ccio initalization procedure. * * Register this driver. */void __init ccio_init(void){	register_parisc_driver(&ccio_driver);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产99精品国产| 国产精品不卡在线观看| 日韩成人精品在线| 欧美一级黄色录像| 蜜桃精品视频在线观看| 亚洲精品一区二区三区99| 国产精品18久久久| 国产精品国产自产拍高清av| 97久久超碰国产精品| 亚洲精品你懂的| 日韩一区二区在线免费观看| 精品亚洲aⅴ乱码一区二区三区| 欧美精品一区二区高清在线观看| 国产麻豆精品久久一二三| 国产精品美女久久久久高潮| 在线亚洲一区二区| 日韩中文字幕不卡| 国产无人区一区二区三区| 成人免费福利片| 亚洲一区视频在线| 久久综合九色综合久久久精品综合| 国产精品99久久久久久久女警 | 这里只有精品视频在线观看| 日韩精品成人一区二区在线| 久久综合色综合88| 色网站国产精品| 美女视频一区在线观看| 国产精品入口麻豆原神| 欧美四级电影在线观看| 精品一区二区综合| 亚洲色图19p| 精品久久久影院| 91色综合久久久久婷婷| 免费观看在线综合色| 国产精品盗摄一区二区三区| 8x福利精品第一导航| 成人av网站免费观看| 午夜成人免费电影| 国产欧美一区二区在线| 欧美人与z0zoxxxx视频| 成人av网站大全| 加勒比av一区二区| 亚洲第一成年网| 国产精品久久久久毛片软件| 日韩一区二区三区三四区视频在线观看| 99视频在线精品| 国产成人亚洲综合a∨猫咪| 亚洲国产另类av| 国产精品国产三级国产普通话蜜臀 | 成人免费av网站| 午夜激情一区二区| 一区二区三区在线免费| 国产午夜精品美女毛片视频| 欧美精品在欧美一区二区少妇| 成人av网在线| 国产精品自在欧美一区| 日韩成人精品在线观看| 亚洲成av人**亚洲成av**| 亚洲免费观看高清完整版在线观看 | 亚洲国产中文字幕在线视频综合| 久久精品一区四区| www久久精品| 欧美xxxxx牲另类人与| 67194成人在线观看| 欧美艳星brazzers| 99re在线精品| 99免费精品在线| 成人av电影在线| 国产成人免费在线| 懂色av一区二区在线播放| 国产又粗又猛又爽又黄91精品| 日本人妖一区二区| 日本中文字幕一区二区有限公司| 亚洲五码中文字幕| 亚洲成a天堂v人片| 亚洲成av人**亚洲成av**| 亚洲电影一级片| 亚洲另类中文字| 亚洲综合网站在线观看| 夜色激情一区二区| 亚洲大片一区二区三区| 亚洲va国产天堂va久久en| 亚洲国产精品一区二区尤物区| 亚洲精品中文在线| 亚洲一区成人在线| 视频精品一区二区| 久久综合综合久久综合| 韩国三级电影一区二区| 国产麻豆精品视频| a在线欧美一区| 日本道在线观看一区二区| 欧美午夜精品久久久| 欧美精品第1页| 欧美成人伊人久久综合网| 国产婷婷一区二区| 亚洲视频在线观看一区| 亚洲综合清纯丝袜自拍| 日日夜夜精品视频天天综合网| 免费精品视频在线| 国产91精品入口| 91黄色免费网站| 欧洲精品视频在线观看| 在线综合+亚洲+欧美中文字幕| 精品久久人人做人人爰| 国产精品久久一级| 自拍偷拍欧美精品| 日韩va亚洲va欧美va久久| 国产综合色视频| 一本色道综合亚洲| 欧美一级免费观看| 国产精品乱人伦| 亚洲成av人片| 成人爽a毛片一区二区免费| 欧美三级日本三级少妇99| 久久夜色精品一区| 亚洲一区二区三区激情| 国产九色精品成人porny| 一本色道a无线码一区v| 日韩一区二区麻豆国产| 国产免费成人在线视频| 亚洲mv大片欧洲mv大片精品| 国产精品亚洲第一区在线暖暖韩国 | 亚洲美腿欧美偷拍| 麻豆成人久久精品二区三区小说| 不卡一区二区在线| 日韩欧美成人一区| 一区二区欧美在线观看| 国产麻豆日韩欧美久久| 欧美男同性恋视频网站| 中文字幕国产一区二区| 日本欧美一区二区三区乱码| 91麻豆精东视频| 国产天堂亚洲国产碰碰| 日韩精品国产欧美| 色综合天天狠狠| 2欧美一区二区三区在线观看视频| 亚洲美腿欧美偷拍| 成人一区二区三区视频| 欧美不卡一区二区| 午夜视频一区二区三区| 色一情一伦一子一伦一区| 欧美极品少妇xxxxⅹ高跟鞋| 美女在线一区二区| 欧美日韩一二区| 亚洲精品综合在线| www.成人在线| 国产色产综合色产在线视频| 免费看精品久久片| 3d成人h动漫网站入口| 亚洲激情六月丁香| 99re成人在线| 亚洲欧洲99久久| 国产成人精品免费在线| 精品国产乱子伦一区| 日本免费在线视频不卡一不卡二| 在线观看一区日韩| 亚洲女子a中天字幕| www.日韩在线| 日本一二三不卡| 懂色av中文字幕一区二区三区| 久久欧美一区二区| 精品一区二区在线免费观看| 日韩亚洲欧美成人一区| 日韩精品一卡二卡三卡四卡无卡| 欧美网站大全在线观看| 亚洲www啪成人一区二区麻豆| 色综合久久六月婷婷中文字幕| 亚洲人成在线观看一区二区| 波波电影院一区二区三区| 国产精品久久久久永久免费观看| 国产成人精品三级| 中文字幕一区二区三区在线播放| 成人天堂资源www在线| 国产精品网站在线播放| av在线播放不卡| 亚洲蜜臀av乱码久久精品蜜桃| 91蝌蚪porny| 亚洲午夜精品久久久久久久久| 欧美日韩在线不卡| 免费成人在线网站| 久久亚洲免费视频| 成人精品视频.| 亚洲免费观看视频| 欧美军同video69gay| 麻豆精品视频在线| 国产亚洲精久久久久久| www.欧美.com| 亚洲一区二区3| 精品噜噜噜噜久久久久久久久试看| 国产一区二区主播在线| 国产精品人妖ts系列视频| 色88888久久久久久影院按摩| 亚洲成av人片在线| 久久综合色8888| 99久久久无码国产精品| 亚洲第一综合色| 国产性做久久久久久| 91老司机福利 在线| 久久精品国产99国产精品| 国产精品美女一区二区在线观看|