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

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

?? ccio-dma.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*** 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 *//* We *can't* support JAVA (T600). Venture there at your own risk. */static const 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 int ccio_probe(struct parisc_device *dev);static struct parisc_driver ccio_driver = {	.name =		"ccio",	.id_table =	ccio_tbl,	.probe =	ccio_probe,};/** * 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;	unsigned int iov_order;	u32 iova_space_size;	/*	** 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).	*/	iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver));	/* limit IOVA space size to 1MB-1GB */	if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {		iova_space_size =  1 << (20 - PAGE_SHIFT);#ifdef __LP64__	} else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {		iova_space_size =  1 << (30 - PAGE_SHIFT);#endif	}	/*	** 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 << PAGE_SHIFT);	/* iova_space_size is now bytes, not pages */	iova_space_size = 1 << (iov_order + PAGE_SHIFT);	ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);	BUG_ON(ioc->pdir_size > 8 * 1024 * 1024);   /* max pdir size <= 8MB */	/* Verify it's a power of two */	BUG_ON((1 << get_order(ioc->pdir_size)) != (ioc->pdir_size >> PAGE_SHIFT));	DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",			__FUNCTION__, ioc->ioc_regs,			(unsigned long) num_physpages >> (20 - PAGE_SHIFT),			iova_space_size>>20,			iov_order + PAGE_SHIFT);	ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL, 						 get_order(ioc->pdir_size));	if(NULL == ioc->pdir_base) {		panic("%s() could not allocate I/O Page Table\n", __FUNCTION__);	}	memset(ioc->pdir_base, 0, ioc->pdir_size);	BUG_ON((((unsigned long)ioc->pdir_base) & PAGE_MASK) != (unsigned long)ioc->pdir_base);	DBG_INIT(" base %p\n", 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("%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_regs->io_chain_id_mask);	WRITE_U32(virt_to_phys(ioc->pdir_base), 		  &ioc->ioc_regs->io_pdir_base);	/*	** Go to "Virtual Mode"	*/	WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_regs->io_control);	/*	** Initialize all I/O TLB entries to 0 (Valid bit off).	*/	WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_m);	WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_l);	for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {		WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)),			  &ioc->ioc_regs->io_command);	}}static void __initccio_init_resource(struct resource *res, char *name, void __iomem *ioaddr){	int result;	res->parent = NULL;	res->flags = IORESOURCE_MEM;	/*	 * bracing ((signed) ...) are required for 64bit kernel because	 * we only want to sign extend the lower 16 bits of the register.	 * The upper 16-bits of range registers are hardcoded to 0xffff.	 */	res->start = (unsigned long)((signed) READ_U32(ioaddr) << 16);	res->end = (unsigned long)((signed) (READ_U32(ioaddr + 4) << 16) - 1);	res->name = name;	/*	 * Check if this MMIO range is disable	 */	if (res->end + 1 == res->start)		return;	/* On some platforms (e.g. K-Class), we have already registered	 * resources for devices reported by firmware. Some are children	 * of ccio.	 * "insert" ccio ranges in the mmio hierarchy (/proc/iomem).	 */	result = insert_resource(&iomem_resource, res);	if (result < 0) {		printk(KERN_ERR "%s() failed to claim CCIO bus address space (%08lx,%08lx)\n", 	 		__FUNCTION__, 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);	snprintf(name, 14, "GSC Bus [%d/]", ioc->hw_path);	ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low);	ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv);}static int new_ioc_area(struct resource *res, unsigned long size,		unsigned long min, unsigned long max, unsigned long align){	if (max <= min)		return -EBUSY;	res->start = (max - size + 1) &~ (align - 1);	res->end = res->start + size;		/* We might be trying to expand the MMIO range to include	 * a child device that has already registered it's MMIO space.	 * Use "insert" instead of request_resource().	 */	if (!insert_resource(&iomem_resource, res))		return 0;	return new_ioc_area(res, size, min, max - size, align);}static int expand_ioc_area(struct resource *res, unsigned long size,		unsigned long min, unsigned long max, unsigned long align){	unsigned long start, len;	if (!res->parent)		return new_ioc_area(res, size, min, max, align);	start = (res->start - size) &~ (align - 1);	len = res->end - start + 1;	if (start >= min) {		if (!adjust_resource(res, start, len))			return 0;	}	start = res->start;	len = ((size + res->end + align) &~ (align - 1)) - start;	if (start + len <= max) {		if (!adjust_resource(res, start, len))			return 0;	}	return -EBUSY;}/* * Dino calls this function.  Beware that we may get called on systems * which have no IOC (725, B180, C160L, etc) but do have a Dino. * So it's legal to find no parent IOC. * * Some other issues: one of the resources in the ioc may be unassigned. */int ccio_allocate_resource(const struct parisc_device *dev,		struct resource *res, unsigned long size,		unsigned long min, unsigned long max, unsigned long align){	struct resource *parent = &iomem_resource;	struct ioc *ioc = ccio_get_iommu(dev);	if (!ioc)		goto out;	parent = ioc->mmio_region;	if (parent->parent &&	    !allocate_resource(parent, res, size, min, max, align, NULL, NULL))		return 0;	if ((parent + 1)->parent &&	    !allocate_resource(parent + 1, res, size, min, max, align,				NULL, NULL))		return 0;	if (!expand_ioc_area(parent, size, min, max, align)) {		__raw_writel(((parent->start)>>16) | 0xffff0000,			     &ioc->ioc_regs->io_io_low);		__raw_writel(((parent->end)>>16) | 0xffff0000,			     &ioc->ioc_regs->io_io_high);	} else if (!expand_ioc_area(parent + 1, size, min, max, align)) {		parent++;		__raw_writel(((parent->start)>>16) | 0xffff0000,			     &ioc->ioc_regs->io_io_low_hv);		__raw_writel(((parent->end)>>16) | 0xffff0000,			     &ioc->ioc_regs->io_io_high_hv);	} else {		return -EBUSY;	} out:	return allocate_resource(parent, res, size, min, max, align, NULL,NULL);}int ccio_request_resource(const struct parisc_device *dev,		struct resource *res){	struct resource *parent;	struct ioc *ioc = ccio_get_iommu(dev);	if (!ioc) {		parent = &iomem_resource;	} else if ((ioc->mmio_region->start <= res->start) &&			(res->end <= ioc->mmio_region->end)) {		parent = ioc->mmio_region;	} else if (((ioc->mmio_region + 1)->start <= res->start) &&			(res->end <= (ioc->mmio_region + 1)->end)) {		parent = ioc->mmio_region + 1;	} else {		return -EBUSY;	}	/* "transparent" bus bridges need to register MMIO resources	 * firmware assigned them. e.g. children of hppb.c (e.g. K-class)	 * registered their resources in the PDC "bus walk" (See	 * arch/parisc/kernel/inventory.c).	 */	return insert_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 __init ccio_probe(struct parisc_device *dev){	int i;	struct ioc *ioc, **ioc_p = &ioc_list;	struct proc_dir_entry *info_entry, *bitmap_entry;		ioc = kzalloc(sizeof(struct ioc), GFP_KERNEL);	if (ioc == NULL) {		printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");		return 1;	}	ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";	printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa.start);	for (i = 0; i < ioc_count; i++) {		ioc_p = &(*ioc_p)->next;	}	*ioc_p = ioc;	ioc->hw_path = dev->hw_path;	ioc->ioc_regs = ioremap_nocache(dev->hpa.start, 4096);	ccio_ioc_init(ioc);	ccio_init_resources(ioc);	hppa_dma_ops = &ccio_ops;	dev->dev.platform_data = kzalloc(sizeof(struct pci_hba_data), GFP_KERNEL);	/* if this fails, no I/O cards will work, so may as well bug */	BUG_ON(dev->dev.platform_data == NULL);	HBA_DATA(dev->dev.platform_data)->iommu = ioc;		if (ioc_count == 0) {		info_entry = create_proc_entry(MODULE_NAME, 0, proc_runway_root);		if (info_entry)			info_entry->proc_fops = &ccio_proc_info_fops;		bitmap_entry = create_proc_entry(MODULE_NAME"-bitmap", 0, proc_runway_root);		if (bitmap_entry)			bitmap_entry->proc_fops = &ccio_proc_bitmap_fops;	}	ioc_count++;	parisc_vmerge_boundary = IOVP_SIZE;	parisc_vmerge_max_size = BITS_PER_LONG * IOVP_SIZE;	parisc_has_iommu();	return 0;}/** * 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一区二区三区免费野_久草精品视频
日韩欧美中文字幕制服| 国产激情视频一区二区在线观看| 蜜桃视频一区二区三区在线观看| 日韩成人精品在线观看| 久久精品国产999大香线蕉| 国产高清在线观看免费不卡| 不卡av电影在线播放| 欧美日韩激情在线| 久久久国产午夜精品 | 国产老肥熟一区二区三区| 色综合天天综合色综合av| 69av一区二区三区| 国产日韩欧美亚洲| 午夜精品久久久久久久99水蜜桃| 国产精品一级在线| 欧美日韩情趣电影| 国产三区在线成人av| 亚洲第一电影网| 国产高清精品网站| 欧美一三区三区四区免费在线看| 国产目拍亚洲精品99久久精品| 亚洲国产精品一区二区www | 国产日本一区二区| 亚洲va欧美va天堂v国产综合| 国产91精品一区二区麻豆网站 | 亚洲va国产天堂va久久en| 国产精品一区二区男女羞羞无遮挡| 色婷婷综合激情| 欧美精品一区二区三区视频| 亚洲综合成人网| 不卡一区二区三区四区| 精品国产a毛片| 亚洲成人你懂的| 白白色 亚洲乱淫| 欧美成人一区二区三区| 亚洲国产成人av| 91香蕉视频在线| 欧美国产精品劲爆| 乱中年女人伦av一区二区| 欧美性videosxxxxx| 中文字幕日韩一区| 国产一区在线观看视频| 91精品国产入口在线| 一区二区三区中文免费| 99久久精品免费| 久久精品在这里| 老司机免费视频一区二区| 欧美丝袜自拍制服另类| 亚洲精品亚洲人成人网| 不卡视频在线看| 欧美激情艳妇裸体舞| 国产在线播放一区二区三区| 欧美一区国产二区| 午夜av一区二区三区| 色婷婷av一区二区三区大白胸| 国产精品色噜噜| 国产精品99久久久久久宅男| 日韩一区二区免费电影| 视频一区在线播放| 欧美三级日韩在线| 一区二区视频在线看| 97久久精品人人爽人人爽蜜臀| 欧美激情艳妇裸体舞| 福利一区在线观看| 久久精品视频一区二区| 国产乱妇无码大片在线观看| 337p粉嫩大胆色噜噜噜噜亚洲| 免费精品视频在线| 7777精品伊人久久久大香线蕉经典版下载| 亚洲欧美日韩在线不卡| 色哟哟一区二区三区| 亚洲欧美日韩国产综合在线| 色八戒一区二区三区| 伊人婷婷欧美激情| 欧美在线观看视频一区二区| 亚洲一区二区三区自拍| 欧美日韩三级一区二区| 丝袜a∨在线一区二区三区不卡| 欧美日韩午夜影院| 秋霞午夜鲁丝一区二区老狼| 日韩一本二本av| 国产在线不卡一区| 亚洲国产成人午夜在线一区| 成人黄色大片在线观看| 亚洲乱码国产乱码精品精的特点| 91豆麻精品91久久久久久| 亚洲在线视频免费观看| 91精品婷婷国产综合久久竹菊| 青椒成人免费视频| 久久精品视频一区| 99精品1区2区| 亚洲国产aⅴ天堂久久| 欧美夫妻性生活| 国内不卡的二区三区中文字幕| 精品国产一二三区| 国产激情视频一区二区在线观看 | 国产一区二区视频在线| 亚洲黄色小说网站| 亚洲色图一区二区| 成人欧美一区二区三区视频网页| 国产日韩欧美综合一区| 久久久午夜电影| 中文字幕精品三区| 国产亚洲欧美一级| 亚洲一级电影视频| 亚洲第一狼人社区| 五月婷婷激情综合网| 亚洲精品v日韩精品| 久久久精品免费观看| 日韩一区二区电影| 欧美日韩成人综合天天影院| 成人爽a毛片一区二区免费| 精品一区在线看| 国产乱人伦偷精品视频免下载| www.色综合.com| 国产精品午夜久久| 国产精品一级片| 在线一区二区视频| 欧美另类videos死尸| 欧美色大人视频| 欧美精品黑人性xxxx| 欧美一区二区三区在线观看 | 国产在线麻豆精品观看| 麻豆专区一区二区三区四区五区| 精品一区二区三区视频| 国产麻豆欧美日韩一区| 大桥未久av一区二区三区中文| 粉嫩高潮美女一区二区三区| 成+人+亚洲+综合天堂| 欧美综合天天夜夜久久| 国产精品视频一二三| 精品国产凹凸成av人网站| 亚洲伦理在线免费看| 五月天激情综合网| 国产福利91精品一区| 91极品美女在线| 国产亚洲自拍一区| 一区二区三区四区精品在线视频| 国产一二精品视频| 麻豆国产精品视频| 欧美日韩一区二区三区四区五区 | 懂色av一区二区三区免费观看 | av电影天堂一区二区在线观看| 99re成人在线| 韩国毛片一区二区三区| 亚洲综合成人在线视频| 国产欧美一区二区精品秋霞影院| 欧美日韩精品一区二区天天拍小说 | 成人午夜私人影院| 免费在线看一区| 蜜桃视频在线一区| 99国产精品99久久久久久| 日韩精品一区二区三区视频播放 | 欧美伊人久久大香线蕉综合69| 日本乱人伦一区| 欧美经典三级视频一区二区三区| www.性欧美| 亚洲国产精品嫩草影院| 久久天堂av综合合色蜜桃网| 在线视频一区二区免费| 精品电影一区二区| 国产精品亚洲一区二区三区妖精 | 视频一区在线播放| 日韩一区中文字幕| 国产日韩欧美不卡| 日韩一级视频免费观看在线| 国产成人精品亚洲日本在线桃色 | 久久精品一区四区| 夜色激情一区二区| 欧美一区二区三区在线观看| 日韩电影免费在线| 日韩电影免费在线| 一区二区三区日韩欧美精品| 国产精品久久久久久久岛一牛影视| 久久精品免视看| 国产日韩精品一区二区三区| 欧美精品一区二| 久久蜜桃一区二区| 久久免费视频一区| 久久久噜噜噜久久中文字幕色伊伊| 日韩精品一区二区三区中文不卡 | 亚洲午夜日本在线观看| 夜夜嗨av一区二区三区四季av| 一区二区视频在线看| 一级日本不卡的影视| 依依成人综合视频| 亚洲成人黄色小说| 日韩av电影免费观看高清完整版| 午夜av一区二区三区| 日韩成人免费看| 久久精品二区亚洲w码| 久久99精品久久只有精品| 国产在线精品一区在线观看麻豆| 国产美女在线精品| 成人app网站| 一本到不卡精品视频在线观看| 日本精品裸体写真集在线观看| 欧美日韩亚州综合| 日韩无一区二区| 国产日本一区二区|