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

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

?? ioport.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* $Id: ioport.c,v 1.45 2001/10/30 04:54:21 davem Exp $ * ioport.c:  Simple io mapping allocator. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx) * * 1996: sparc_free_io, 1999: ioremap()/iounmap() by Pete Zaitcev. * * 2000/01/29 * <rth> zait: as long as pci_alloc_consistent produces something addressable,  *	things are ok. * <zaitcev> rth: no, it is relevant, because get_free_pages returns you a *	pointer into the big page mapping * <rth> zait: so what? * <rth> zait: remap_it_my_way(virt_to_phys(get_free_page())) * <zaitcev> Hmm * <zaitcev> Suppose I did this remap_it_my_way(virt_to_phys(get_free_page())). *	So far so good. * <zaitcev> Now, driver calls pci_free_consistent(with result of *	remap_it_my_way()). * <zaitcev> How do you find the address to pass to free_pages()? * <rth> zait: walk the page tables?  It's only two or three level after all. * <rth> zait: you have to walk them anyway to remove the mapping. * <zaitcev> Hmm * <zaitcev> Sounds reasonable */#include <linux/config.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/types.h>#include <linux/ioport.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/pci.h>		/* struct pci_dev */#include <linux/proc_fs.h>#include <asm/io.h>#include <asm/vaddrs.h>#include <asm/oplib.h>#include <asm/page.h>#include <asm/pgalloc.h>#include <asm/pgtable.h>#define mmu_inval_dma_area(p, l)	/* Anton pulled it out for 2.4.0-xx */struct resource *_sparc_find_resource(struct resource *r, unsigned long);static void *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz);static void *_sparc_alloc_io(unsigned int busno, unsigned long phys,    unsigned long size, char *name);static void _sparc_free_io(struct resource *res);/* This points to the next to use virtual memory for DVMA mappings */static struct resource _sparc_dvma = {	"sparc_dvma", DVMA_VADDR, DVMA_END - 1};/* This points to the start of I/O mappings, cluable from outside. *//*ext*/ struct resource sparc_iomap = {	"sparc_iomap", IOBASE_VADDR, IOBASE_END - 1};/* * BTFIXUP would do as well but it seems overkill for the case. */static void (*_sparc_mapioaddr)(unsigned long pa, unsigned long va,    int bus, int ro);static void (*_sparc_unmapioaddr)(unsigned long va);/* * Our mini-allocator... * Boy this is gross! We need it because we must map I/O for * timers and interrupt controller before the kmalloc is available. */#define XNMLN  15#define XNRES  10	/* SS-10 uses 8 */struct xresource {	struct resource xres;	/* Must be first */	int xflag;		/* 1 == used */	char xname[XNMLN+1];};static struct xresource xresv[XNRES];static struct xresource *xres_alloc(void) {	struct xresource *xrp;	int n;	xrp = xresv;	for (n = 0; n < XNRES; n++) {		if (xrp->xflag == 0) {			xrp->xflag = 1;			return xrp;		}		xrp++;	}	return NULL;}static void xres_free(struct xresource *xrp) {	xrp->xflag = 0;}/* * These are typically used in PCI drivers * which are trying to be cross-platform. * * Bus type is always zero on IIep. */void *ioremap(unsigned long offset, unsigned long size){	char name[14];	sprintf(name, "phys_%08x", (u32)offset);	return _sparc_alloc_io(0, offset, size, name);}/* * Comlimentary to ioremap(). */void iounmap(void *virtual){	unsigned long vaddr = (unsigned long) virtual & PAGE_MASK;	struct resource *res;	if ((res = _sparc_find_resource(&sparc_iomap, vaddr)) == NULL) {		printk("free_io/iounmap: cannot free %lx\n", vaddr);		return;	}	_sparc_free_io(res);	if ((char *)res >= (char*)xresv && (char *)res < (char *)&xresv[XNRES]) {		xres_free((struct xresource *)res);	} else {		kfree(res);	}}/* */unsigned long sbus_ioremap(struct resource *phyres, unsigned long offset,    unsigned long size, char *name){	return (unsigned long) _sparc_alloc_io(phyres->flags & 0xF,	    phyres->start + offset, size, name);}/* */void sbus_iounmap(unsigned long addr, unsigned long size){	iounmap((void *)addr);}/* * Meat of mapping */static void *_sparc_alloc_io(unsigned int busno, unsigned long phys,    unsigned long size, char *name){	static int printed_full = 0;	struct xresource *xres;	struct resource *res;	char *tack;	int tlen;	void *va;	/* P3 diag */	if (name == NULL) name = "???";	if ((xres = xres_alloc()) != 0) {		tack = xres->xname;		res = &xres->xres;	} else {		if (!printed_full) {			printk("ioremap: done with statics, switching to malloc\n");			printed_full = 1;		}		tlen = strlen(name);		tack = kmalloc(sizeof (struct resource) + tlen + 1, GFP_KERNEL);		if (tack == NULL) return NULL;		memset(tack, 0, sizeof(struct resource));		res = (struct resource *) tack;		tack += sizeof (struct resource);	}	strncpy(tack, name, XNMLN);	tack[XNMLN] = 0;	res->name = tack;	va = _sparc_ioremap(res, busno, phys, size);	/* printk("ioremap(0x%x:%08lx[0x%lx])=%p\n", busno, phys, size, va); */ /* P3 diag */	return va;}/* */static void *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz){	unsigned long offset = ((unsigned long) pa) & (~PAGE_MASK);	unsigned long va;	unsigned int psz;	if (allocate_resource(&sparc_iomap, res,	    (offset + sz + PAGE_SIZE-1) & PAGE_MASK,	    sparc_iomap.start, sparc_iomap.end, PAGE_SIZE, NULL, NULL) != 0) {		/* Usually we cannot see printks in this case. */		prom_printf("alloc_io_res(%s): cannot occupy\n",		    (res->name != NULL)? res->name: "???");		prom_halt();	}	va = res->start;	pa &= PAGE_MASK;	for (psz = res->end - res->start + 1; psz != 0; psz -= PAGE_SIZE) {		(*_sparc_mapioaddr)(pa, va, bus, 0);		va += PAGE_SIZE;		pa += PAGE_SIZE;	}	/*	 * XXX Playing with implementation details here.	 * On sparc64 Ebus has resources with precise boundaries.	 * We share drivers with sparc64. Too clever drivers use	 * start of a resource instead of a base address.	 *	 * XXX-2 This may be not valid anymore, clean when	 * interface to sbus_ioremap() is resolved.	 */	res->start += offset;	res->end = res->start + sz - 1;		/* not strictly necessary.. */	return (void *) res->start;}/* * Comlimentary to _sparc_ioremap(). */static void _sparc_free_io(struct resource *res){	unsigned long plen;	plen = res->end - res->start + 1;	plen = (plen + PAGE_SIZE-1) & PAGE_MASK;	while (plen != 0) {		plen -= PAGE_SIZE;		(*_sparc_unmapioaddr)(res->start + plen);	}	release_resource(res);}#ifdef CONFIG_SBUSvoid sbus_set_sbus64(struct sbus_dev *sdev, int x) {	printk("sbus_set_sbus64: unsupported\n");}/* * Allocate a chunk of memory suitable for DMA. * Typically devices use them for control blocks. * CPU may access them without any explicit flushing. * * XXX Some clever people know that sdev is not used and supply NULL. Watch. */void *sbus_alloc_consistent(struct sbus_dev *sdev, long len, u32 *dma_addrp){	unsigned long len_total = (len + PAGE_SIZE-1) & PAGE_MASK;	unsigned long va;	struct resource *res;	int order;	/* XXX why are some lenghts signed, others unsigned? */	if (len <= 0) {		return NULL;	}	/* XXX So what is maxphys for us and how do drivers know it? */	if (len > 256*1024) {			/* __get_free_pages() limit */		return NULL;	}	order = get_order(len_total);	va = __get_free_pages(GFP_KERNEL, order);	if (va == 0) {		/*		 * printk here may be flooding... Consider removal XXX.		 */		printk("sbus_alloc_consistent: no %ld pages\n", len_total>>PAGE_SHIFT);		return NULL;	}	if ((res = kmalloc(sizeof(struct resource), GFP_KERNEL)) == NULL) {		free_pages(va, order);		printk("sbus_alloc_consistent: no core\n");		return NULL;	}	memset((char*)res, 0, sizeof(struct resource));	if (allocate_resource(&_sparc_dvma, res, len_total,	    _sparc_dvma.start, _sparc_dvma.end, PAGE_SIZE, NULL, NULL) != 0) {		printk("sbus_alloc_consistent: cannot occupy 0x%lx", len_total);		free_pages(va, order);		kfree(res);		return NULL;	}	mmu_map_dma_area(va, res->start, len_total);	*dma_addrp = res->start;	return (void *)res->start;}void sbus_free_consistent(struct sbus_dev *sdev, long n, void *p, u32 ba){	struct resource *res;	unsigned long pgp;	if ((res = _sparc_find_resource(&_sparc_dvma,	    (unsigned long)p)) == NULL) {		printk("sbus_free_consistent: cannot free %p\n", p);		return;	}	if (((unsigned long)p & (PAGE_SIZE-1)) != 0) {		printk("sbus_free_consistent: unaligned va %p\n", p);		return;	}	n = (n + PAGE_SIZE-1) & PAGE_MASK;	if ((res->end-res->start)+1 != n) {		printk("sbus_free_consistent: region 0x%lx asked 0x%lx\n",		    (long)((res->end-res->start)+1), n);		return;	}	release_resource(res);	kfree(res);	/* mmu_inval_dma_area(va, n); */ /* it's consistent, isn't it */	pgp = (unsigned long) phys_to_virt(mmu_translate_dvma(ba));	mmu_unmap_dma_area(ba, n);	free_pages(pgp, get_order(n));}/* * Map a chunk of memory so that devices can see it. * CPU view of this memory may be inconsistent with * a device view and explicit flushing is necessary. */u32 sbus_map_single(struct sbus_dev *sdev, void *va, long len, int direction){#if 0 /* This is the version that abuses consistent space */	unsigned long len_total = (len + PAGE_SIZE-1) & PAGE_MASK;	struct resource *res;	/* XXX why are some lenghts signed, others unsigned? */	if (len <= 0) {		return 0;	}	/* XXX So what is maxphys for us and how do drivers know it? */	if (len > 256*1024) {			/* __get_free_pages() limit */		return 0;	}	if ((res = kmalloc(sizeof(struct resource), GFP_KERNEL)) == NULL) {		printk("sbus_map_single: no core\n");		return 0;	}	memset((char*)res, 0, sizeof(struct resource));	res->name = va; /* XXX */	if (allocate_resource(&_sparc_dvma, res, len_total,	    _sparc_dvma.start, _sparc_dvma.end, PAGE_SIZE) != 0) {		printk("sbus_map_single: cannot occupy 0x%lx", len);		kfree(res);		return 0;	}	mmu_map_dma_area(va, res->start, len_total);	mmu_flush_dma_area((unsigned long)va, len_total); /* in all contexts? */	return res->start;#endif#if 1 /* "trampoline" version */	/* XXX why are some lenghts signed, others unsigned? */	if (len <= 0) {		return 0;	}	/* XXX So what is maxphys for us and how do drivers know it? */	if (len > 256*1024) {			/* __get_free_pages() limit */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人午夜精品影院观看视频| 欧美福利电影网| 欧美三级中文字幕| 精品伦理精品一区| 亚洲精品高清在线| 精品在线你懂的| 精品视频资源站| 亚洲视频一区二区在线| 日本成人超碰在线观看| 91丨porny丨蝌蚪视频| 精品理论电影在线观看 | 亚洲一卡二卡三卡四卡无卡久久 | 欧美日韩国产首页在线观看| 国产日韩欧美精品一区| 日韩精品免费专区| 欧美在线播放高清精品| 亚洲色图在线播放| 国产成人精品免费视频网站| 日韩欧美中文字幕精品| 香蕉影视欧美成人| 在线亚洲免费视频| 亚洲男人天堂av网| 不卡一区二区三区四区| 国产欧美日韩另类视频免费观看| 久久疯狂做爰流白浆xx| 欧美一区二区久久久| 午夜私人影院久久久久| 欧亚一区二区三区| 亚洲国产综合色| 欧洲另类一二三四区| 一区二区视频在线| 91亚洲精品久久久蜜桃网站| 18成人在线视频| bt7086福利一区国产| 国产精品美女久久久久aⅴ国产馆| 国产一区二区免费视频| 久久久99免费| 粉嫩高潮美女一区二区三区| 日本一区二区三区久久久久久久久不 | 国产成人av资源| 久久精品视频网| 国产91丝袜在线播放0| 国产亚洲一区二区在线观看| 国产精品66部| 国产精品美女久久福利网站| 91麻豆精品视频| 一区二区久久久久久| 欧美日韩国产小视频| 麻豆精品一区二区三区| 久久蜜臀精品av| eeuss影院一区二区三区| 亚洲三级电影全部在线观看高清| 一本大道久久a久久精二百| 一区二区三区美女| 日韩三级av在线播放| 国产精品996| 亚洲另类一区二区| 在线不卡免费av| 国产福利精品一区| 亚洲色图丝袜美腿| 日韩手机在线导航| 北条麻妃一区二区三区| 亚洲1区2区3区4区| 久久这里只有精品首页| 99综合电影在线视频| 亚洲综合清纯丝袜自拍| 日韩欧美第一区| 成人性生交大片免费看视频在线 | 日韩一区二区三| 成人一级黄色片| 视频一区二区国产| 国产蜜臀97一区二区三区| 欧美性大战久久久久久久蜜臀| 蜜桃视频在线一区| 伊人一区二区三区| 久久久久久久久久久99999| 一本久久精品一区二区| 麻豆91精品视频| 亚洲精品视频免费看| 精品免费日韩av| 欧美日韩一区二区在线观看视频| 极品美女销魂一区二区三区| 亚洲综合精品久久| 国产欧美1区2区3区| 91精品国产综合久久福利| 波多野结衣视频一区| 精品一区二区国语对白| 亚洲一二三四在线观看| 国产日本欧洲亚洲| 日韩欧美国产一区二区三区| 91国产免费看| 99久久综合精品| 粉嫩aⅴ一区二区三区四区五区| 午夜精品久久久久久久蜜桃app| 国产精品三级电影| 久久久精品天堂| 69av一区二区三区| 欧美日韩国产一级二级| 99久久er热在这里只有精品66| 久久99热国产| 日本美女一区二区三区视频| 亚洲成人三级小说| 亚洲一区免费观看| 中文字幕亚洲在| 日本一区二区三区电影| 国产亚洲一二三区| 久久精品欧美一区二区三区不卡 | 欧美视频日韩视频在线观看| 成人av网站大全| 福利一区在线观看| 国产丶欧美丶日本不卡视频| 极品美女销魂一区二区三区| 麻豆视频一区二区| 美女视频黄 久久| 青青草国产成人99久久| 视频在线在亚洲| 日韩电影在线一区二区| 日本在线不卡视频| 免费成人在线播放| 免费日本视频一区| 日本午夜精品一区二区三区电影| 无吗不卡中文字幕| 奇米精品一区二区三区在线观看一| 午夜欧美在线一二页| 午夜成人免费视频| 日本成人在线不卡视频| 激情综合五月婷婷| 成人av综合在线| 91性感美女视频| 欧美人妇做爰xxxⅹ性高电影| 欧美日韩黄色影视| 欧美一区二区视频在线观看2022| 欧美一区二区在线免费观看| 精品国产一二三| 26uuu精品一区二区在线观看| 欧美精品一区二| 亚洲欧美中日韩| 亚洲国产色一区| 奇米色一区二区| 国产成人亚洲综合a∨猫咪 | 精一区二区三区| 国产91精品精华液一区二区三区| 北条麻妃国产九九精品视频| 欧美在线观看禁18| 日韩一区二区麻豆国产| 国产日韩欧美亚洲| 亚洲妇女屁股眼交7| 免费视频最近日韩| 99综合电影在线视频| 欧美日韩国产欧美日美国产精品| 精品人在线二区三区| 国产片一区二区| 一区二区三区加勒比av| 日韩电影一二三区| 成人一区二区在线观看| 欧美日本一区二区在线观看| 日韩精品一区二区三区视频在线观看| 国产视频一区二区三区在线观看| 亚洲人成在线播放网站岛国| 午夜成人免费电影| 不卡视频一二三| 日韩一区二区三区观看| 亚洲色图清纯唯美| 国产一区三区三区| 欧美三区在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 天天av天天翘天天综合网色鬼国产| 国产美女在线观看一区| 欧美亚洲丝袜传媒另类| 久久精品欧美一区二区三区不卡 | 欧美性xxxxxxxx| 国产日韩欧美精品电影三级在线| 午夜不卡在线视频| 91在线视频在线| 久久精品视频网| 麻豆极品一区二区三区| 日本精品视频一区二区| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲大片免费看| 色悠悠亚洲一区二区| 国产日韩欧美精品电影三级在线| 日本在线不卡一区| 欧美精选在线播放| 亚洲男人的天堂在线观看| 国产精品1区2区| 日韩欧美国产1| 舔着乳尖日韩一区| 欧洲亚洲国产日韩| 亚洲精品中文字幕乱码三区| 国产河南妇女毛片精品久久久| 欧美一区二区女人| 男女激情视频一区| 欧美视频完全免费看| 亚洲精品老司机| av亚洲产国偷v产偷v自拍| 国产日产亚洲精品系列| 狠狠色丁香婷综合久久| 日韩一区二区三区在线| 日本伊人色综合网| 日韩一区二区精品葵司在线|