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

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

?? ccio-dma.c

?? linux-2.4.29操作系統的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
 * * 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 (%lx,%lx)\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, 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一区二区三区免费野_久草精品视频
免费在线观看一区二区三区| 国产午夜三级一区二区三| 国产激情视频一区二区在线观看| 日本欧美韩国一区三区| 偷拍一区二区三区| 日韩精品免费视频人成| 日本不卡视频在线| 另类人妖一区二区av| 蜜桃av一区二区在线观看| 丝袜美腿成人在线| 久久精品免费观看| 国内精品国产成人| 成人精品在线视频观看| 成人av在线播放网址| 99精品国产视频| 在线看日韩精品电影| 欧美日韩国产bt| 日韩欧美亚洲国产精品字幕久久久| 欧美xxxx老人做受| 国产拍揄自揄精品视频麻豆| 亚洲色欲色欲www| 亚洲国产欧美日韩另类综合| 亚洲18女电影在线观看| 国模无码大尺度一区二区三区| 国产精品1区2区| 91猫先生在线| 欧美一区二区视频在线观看2020| 久久综合久久综合久久综合| 国产精品久久久久桃色tv| 亚洲欧美另类久久久精品2019| 性欧美大战久久久久久久久| 麻豆国产欧美日韩综合精品二区| 福利一区在线观看| 欧美日韩中文一区| 国产日韩av一区| 亚洲国产日韩a在线播放性色| 精品在线你懂的| 91亚洲大成网污www| 日韩你懂的在线播放| 国产精品色婷婷| 天堂精品中文字幕在线| 成人自拍视频在线观看| 欧美另类z0zxhd电影| 国产天堂亚洲国产碰碰| 午夜成人免费视频| 成人免费视频视频| 欧美videofree性高清杂交| 亚洲码国产岛国毛片在线| 韩国av一区二区三区四区| 欧美三级午夜理伦三级中视频| 久久久久久97三级| 日韩成人av影视| 一本到三区不卡视频| 久久久精品2019中文字幕之3| 午夜在线电影亚洲一区| 99re免费视频精品全部| 国产亚洲一区字幕| 免费成人在线观看| 欧美日本一道本| 一片黄亚洲嫩模| 一本一本大道香蕉久在线精品| 久久蜜桃av一区精品变态类天堂| 视频一区二区欧美| 欧美性受xxxx| 亚洲国产成人va在线观看天堂| 成人伦理片在线| 国产欧美一区二区三区鸳鸯浴| 看片的网站亚洲| 欧美一卡二卡三卡| 日韩精品久久理论片| 欧美伦理影视网| 婷婷久久综合九色综合绿巨人 | 国内一区二区在线| 欧美一区午夜视频在线观看 | 国产精品全国免费观看高清| 国产精品一二三四五| 久久久99精品久久| 国产真实乱对白精彩久久| 日韩免费电影一区| 精品一区二区三区香蕉蜜桃| 日韩一二在线观看| 黄色精品一二区| 2019国产精品| 丁香亚洲综合激情啪啪综合| 国产精品情趣视频| 色综合久久88色综合天天6| 亚洲男人天堂av| 欧美色手机在线观看| 婷婷综合另类小说色区| 日韩手机在线导航| 国产精品中文有码| 中文字幕在线观看不卡| 色综合 综合色| 天堂成人免费av电影一区| 精品日韩一区二区| 成人免费不卡视频| 亚洲成人中文在线| 欧美mv日韩mv国产| 成人aa视频在线观看| 亚洲自拍偷拍网站| www日韩大片| 97久久精品人人做人人爽50路| 亚洲观看高清完整版在线观看| 日韩一区二区三区四区| 国产精品亚洲一区二区三区妖精 | 中文字幕在线视频一区| 欧美中文字幕一二三区视频| 日本大胆欧美人术艺术动态| 久久久久久久久久久久久夜| 91年精品国产| 激情综合色丁香一区二区| 亚洲欧洲日产国产综合网| 欧美精品亚洲二区| 成人性生交大片免费看中文| 亚洲国产美国国产综合一区二区| 欧美精品一区二区三区视频| 99re这里只有精品视频首页| 免费av成人在线| 亚洲理论在线观看| 精品福利在线导航| 欧美美女网站色| 一本色道久久综合狠狠躁的推荐| 久久精品久久精品| 亚洲国产精品久久久男人的天堂| 中文字幕高清一区| 欧美不卡视频一区| 欧美视频三区在线播放| 处破女av一区二区| 精品一区二区三区在线观看国产| 中文字幕一区二区三区不卡| 日韩小视频在线观看专区| 在线视频欧美区| 91影院在线观看| 国产91高潮流白浆在线麻豆| 日韩激情中文字幕| 亚洲一区二区高清| 亚洲欧美国产高清| 综合久久久久久久| 国产精品亲子伦对白| 精品对白一区国产伦| 日韩一区二区三区视频| 欧美午夜一区二区三区免费大片| 成人激情av网| 国产毛片精品国产一区二区三区| 美国三级日本三级久久99| 五月天一区二区| 亚洲曰韩产成在线| 亚洲一区日韩精品中文字幕| 亚洲啪啪综合av一区二区三区| 欧美高清在线一区| 日本一区二区三区dvd视频在线| 欧美老女人在线| 日韩网站在线看片你懂的| 日韩欧美一级片| 久久综合久久综合亚洲| 久久色.com| 国产日韩欧美不卡在线| 国产精品热久久久久夜色精品三区| 国产亲近乱来精品视频| 国产精品日产欧美久久久久| 国产欧美精品一区二区色综合朱莉| 久久亚洲一区二区三区明星换脸| 国产午夜亚洲精品午夜鲁丝片 | 成人app网站| 色综合一个色综合亚洲| 日本精品免费观看高清观看| 91美女蜜桃在线| 91精品国产一区二区| 精品欧美一区二区在线观看| 欧美成人精品二区三区99精品| 精品福利视频一区二区三区| 久久久精品欧美丰满| 国产精品欧美极品| 夜夜精品浪潮av一区二区三区| 亚洲国产日日夜夜| 麻豆成人av在线| 懂色av一区二区三区免费看| 99九九99九九九视频精品| 欧美亚洲国产一区在线观看网站| 欧美高清www午色夜在线视频| 日韩一本二本av| 中文久久乱码一区二区| 一区二区三区在线视频播放| 日本三级亚洲精品| 成人av高清在线| 欧美精品aⅴ在线视频| 337p粉嫩大胆色噜噜噜噜亚洲| 中文字幕国产一区| 日本不卡一二三区黄网| 成人黄色国产精品网站大全在线免费观看| 91麻豆蜜桃一区二区三区| 国产在线视频不卡二| 色婷婷亚洲综合| 精品欧美乱码久久久久久1区2区| 自拍偷拍欧美精品| 久久91精品久久久久久秒播| 91论坛在线播放| 久久久国际精品| 免费成人在线视频观看| 色久优优欧美色久优优|