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

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

?? ccio-dma.c

?? 一個2.4.21版本的嵌入式linux內核
?? 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一区二区三区免费野_久草精品视频
国产精品久久久久aaaa| 91精品在线观看入口| 中文字幕av资源一区| 国产成人精品aa毛片| 国产午夜亚洲精品午夜鲁丝片| 国内精品国产成人| 日韩欧美中文字幕一区| 精油按摩中文字幕久久| 久久亚洲春色中文字幕久久久| 国产在线不卡一卡二卡三卡四卡| 国产夜色精品一区二区av| 成人av在线网站| 亚洲最新在线观看| 91精品国产综合久久蜜臀| 精品写真视频在线观看| 亚洲欧美一区二区在线观看| 欧美性xxxxx极品少妇| 秋霞午夜av一区二区三区| 日韩欧美视频在线| 成人av在线资源网| 天天色天天操综合| 中文字幕乱码一区二区免费| 国产精品久久久久久久久久免费看| 91日韩一区二区三区| 亚洲一区二区偷拍精品| 337p日本欧洲亚洲大胆色噜噜| 不卡av免费在线观看| 天天av天天翘天天综合网色鬼国产| 欧美大黄免费观看| 91捆绑美女网站| 蜜桃一区二区三区在线观看| 亚洲欧洲www| 欧美一级午夜免费电影| 福利一区二区在线观看| 水蜜桃久久夜色精品一区的特点 | 日韩国产欧美在线播放| 久久久噜噜噜久噜久久综合| 99精品久久只有精品| 午夜精品福利在线| 亚洲国产精品传媒在线观看| 欧美一区二区三区不卡| 色综合久久久久久久久| 国产一区美女在线| 日本成人在线不卡视频| 国产精品久久久久久亚洲伦| 日韩一区二区影院| 欧美午夜精品免费| 97久久精品人人做人人爽50路 | 国产婷婷色一区二区三区四区| 91黄视频在线观看| 丰满岳乱妇一区二区三区| 欧美aaa在线| 午夜视频一区二区三区| 亚洲人成网站精品片在线观看 | 欧美精品一二三| 91在线小视频| 成人午夜私人影院| 国产精品18久久久| 精品午夜久久福利影院| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲午夜在线观看视频在线| 亚洲乱码国产乱码精品精可以看| 中文字幕第一页久久| 久久这里只有精品6| 欧美一区二区在线免费播放| 欧美日韩美少妇| 色婷婷精品久久二区二区蜜臂av| 成人免费视频国产在线观看| 国产剧情一区二区| 激情综合色综合久久综合| 欧美96一区二区免费视频| 五月激情综合婷婷| 亚洲国产日韩a在线播放性色| 亚洲一区二区综合| 一区二区三区加勒比av| 亚洲一区二区三区四区不卡| 一区二区三区av电影| 亚洲午夜精品一区二区三区他趣| 国产精品综合一区二区三区| 久久99精品国产麻豆婷婷| 国产原创一区二区三区| 国产美女视频一区| 国产大陆精品国产| 成人av片在线观看| 91丨porny丨户外露出| 欧美在线综合视频| 欧美日韩黄视频| 欧美一区二区精美| 久久久美女毛片| 日韩伦理电影网| 亚洲综合在线视频| 日本不卡123| 国产一区91精品张津瑜| 不卡一区中文字幕| 欧美最新大片在线看| 制服丝袜国产精品| 久久久久久免费网| 亚洲色图制服诱惑| 调教+趴+乳夹+国产+精品| 久久精品国产一区二区三区免费看 | 91久久线看在观草草青青| 欧美性淫爽ww久久久久无| 欧美人牲a欧美精品| 日韩一级免费观看| 日本一区二区三区免费乱视频| 亚洲四区在线观看| 婷婷国产在线综合| 国产99久久久久| 欧美三级日韩三级国产三级| 日韩视频一区二区三区在线播放| 国产女人水真多18毛片18精品视频| 亚洲色图都市小说| 日韩精品乱码av一区二区| 国产成人一级电影| 欧美精品乱人伦久久久久久| 久久久国产一区二区三区四区小说 | a级精品国产片在线观看| 欧美日免费三级在线| 国产偷国产偷亚洲高清人白洁| 亚洲最新在线观看| 国产成人免费在线视频| 欧美日韩精品一区二区三区四区 | 自拍偷拍欧美激情| 青青草成人在线观看| 成人综合在线观看| 欧美性xxxxx极品少妇| 久久精品夜色噜噜亚洲a∨| 一区二区三区免费观看| 国产福利一区在线| 欧美卡1卡2卡| 亚洲日本在线观看| 狠狠色狠狠色综合系列| 欧美日产国产精品| 亚洲三级小视频| 成人一级视频在线观看| 亚洲五月六月丁香激情| 成人妖精视频yjsp地址| 69p69国产精品| 日韩久久一区二区| 国产精品综合一区二区| 日韩一区二区三区视频| 亚洲精品伦理在线| 成人永久免费视频| 欧美tickling网站挠脚心| 亚洲国产cao| 91美女蜜桃在线| 国产精品美女一区二区| 极品销魂美女一区二区三区| 欧美精品一卡两卡| 亚洲国产另类av| 色哟哟国产精品免费观看| 国产精品视频麻豆| 国产精品456露脸| 久久综合色婷婷| 国产一区二区在线视频| 日韩精品一区二区三区在线| 偷窥少妇高潮呻吟av久久免费| 在线亚洲高清视频| 亚洲色大成网站www久久九九| 成人av在线看| 中文字幕在线播放不卡一区| 国产精品 欧美精品| 久久久久久久免费视频了| 激情深爱一区二区| 精品国产自在久精品国产| 蜜桃视频一区二区三区| 日韩一区二区电影| 精品影视av免费| 26uuu精品一区二区三区四区在线| 亚洲va在线va天堂| 欧美区在线观看| 青青国产91久久久久久| 欧美www视频| 国产福利91精品一区二区三区| 国产情人综合久久777777| 国产激情一区二区三区| 国产精品网曝门| 一本到不卡免费一区二区| 亚洲一区在线观看视频| 欧美一区在线视频| 国产精品自拍av| 最新久久zyz资源站| 日本道色综合久久| 天天色天天操综合| 久久影院视频免费| 成人黄色小视频| 一区二区三区国产豹纹内裤在线| 91麻豆精品国产91久久久更新时间 | 七七婷婷婷婷精品国产| 久久影院午夜论| 色综合久久66| 日本成人在线不卡视频| 国产拍欧美日韩视频二区| 95精品视频在线| 麻豆精品视频在线观看视频| 国产欧美一区二区精品忘忧草| 97se亚洲国产综合在线| 日本女人一区二区三区| 国产亲近乱来精品视频| 欧美性一级生活|