⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bus.h

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
			stosl"					:	\		    "+D" (_port), "+c" (_cnt) : "a" ((v))	:	\		    "memory", "cc");					\	}								\} while (0)#if 0	/* Cause a link error for bus_space_set_region_8 */#define	bus_space_set_region_8					\			!!! bus_space_set_region_8 unimplemented !!!#endif/* *	void bus_space_copy_N(bus_space_tag_t tag, *	    bus_space_handle_t bsh1, bus_size_t off1, *	    bus_space_handle_t bsh2, bus_size_t off2, *	    size_t count); * * Copy `count' 1, 2, 4, or 8 byte values from bus space starting * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. */#define	bus_space_copy_1(t, h1, o1, h2, o2, cnt) do {			\	int _port1 = (h1)+(o1); int _port2 = (h2)+(o2); int _cnt=(cnt);	\	if ((t) == I386_BUS_SPACE_IO) {					\		__asm __volatile("					\		1:	movl %w1,%%dx				;	\			inb  %%dx,%%al				;	\			movl %w0,%%dx				;	\			outb %%al,%%dx				;	\			incl %0					;	\			incl %1					;	\			loop 1b"				:	\		    "+D" (_port2), "+S" (_port1), "+c" ((_cnt))	::	\		    "%edx", "%eax", "cc");				\	} else								\		i386_space_copy(_port1, _port2, 1, _cnt);		\} while (0)#define	bus_space_copy_2(t, h1, o1, h2, o2, cnt) do {			\	int _port1 = (h1)+(o1); int _port2 = (h2)+(o2); int _cnt=(cnt);	\	if ((t) == I386_BUS_SPACE_IO) {					\		__asm __volatile("					\		1:	movl %w1,%%dx				;	\			inw  %%dx,%%ax				;	\			movl %w0,%%dx				;	\			outw %%ax,%%dx				;	\			addl $2, %0				;	\			addl $2, %1				;	\			loop 1b"				:	\		    "+D" (_port2), "+S" (_port1), "+c" ((_cnt))	::	\		    "%edx", "%eax", "cc");				\	} else								\		i386_space_copy(_port1, _port2, 2, _cnt);		\} while (0)#define	bus_space_copy_4(t, h1, o1, h2, o2, cnt) do {			\	int _port1 = (h1)+(o1); int _port2 = (h2)+(o2); int _cnt=(cnt);	\	if ((t) == I386_BUS_SPACE_IO) {					\		__asm __volatile("					\		1:	movl %w1,%%dx				;	\			inl  %%dx,%%eax				;	\			movl %w0,%%dx				;	\			outl %%eax,%%dx				;	\			addl $4, %0				;	\			addl $4, %1				;	\			loop 1b"				:	\		    "+D" (_port2), "+S" (_port1), "+c" ((_cnt))	::	\		    "%edx", "%eax", "cc");				\	} else								\		i386_space_copy(_port1, _port2, 4, _cnt);		\} while (0)#if 0	/* Cause a link error for bus_space_copy_8 */#define	bus_space_copy_8					\			!!! bus_space_copy_8 unimplemented !!!#endif#define	i386_space_copy1(a1, a2, cnt, movs, df)		\	__asm __volatile(df "\n\trep\n\t" movs :	\	    "+S" (a1), "+D" (a2), "+c" (cnt)	:: "memory", "cc");#define	i386_space_copy(a1, a2, sz, cnt) do {				\	if ((void *)(a1) < (void *)(a2)) {				\		a1 += ((cnt) - 1) * (sz); a2 += ((cnt) - 1) * (sz);	\		switch (sz) {						\		case 1:	i386_space_copy1(a1,a2,cnt,"movsb","std");break;\		case 2:	i386_space_copy1(a1,a2,cnt,"movsw","std");break;\		case 4:	i386_space_copy1(a1,a2,cnt,"movsl","std");break;\		}							\	} else								\		switch (sz) {						\		case 1:	i386_space_copy1(a1,a2,cnt,"movsb","cld");break;\		case 2:	i386_space_copy1(a1,a2,cnt,"movsw","cld");break;\		case 4:	i386_space_copy1(a1,a2,cnt,"movsl","cld");break;\		}							\} while (0)/* * Bus read/write barrier methods. * *	void bus_space_barrier(bus_space_tag_t tag, *	    bus_space_handle_t bsh, bus_size_t offset, *	    bus_size_t len, int flags); * * Note: the i386 does not currently require barriers, but we must * provide the flags to MI code. */#define	bus_space_barrier(t, h, o, l, f)	\	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))#define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */#define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier *//* Compatibility defines */#define	BUS_BARRIER_READ	BUS_SPACE_BARRIER_READ#define	BUS_BARRIER_WRITE	BUS_SPACE_BARRIER_WRITE/* * Flags used in various bus DMA methods. */#define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */#define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */#define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */#define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent */#define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */#define	BUS_DMA_BUS2		0x020#define	BUS_DMA_BUS3		0x040#define	BUS_DMA_BUS4		0x080#define	BUS_DMA_STREAMING	0x100	/* hint: sequential, unidirectional */#define	BUS_DMA_READ		0x200	/* mapping is device -> memory only */#define	BUS_DMA_WRITE		0x400	/* mapping is memory -> device only *//* Forwards needed by prototypes below. */struct mbuf;struct proc;struct uio;/* * Operations performed by bus_dmamap_sync(). */#define BUS_DMASYNC_PREREAD	0x01#define BUS_DMASYNC_POSTREAD	0x02#define BUS_DMASYNC_PREWRITE	0x04#define BUS_DMASYNC_POSTWRITE	0x08typedef int bus_dmasync_op_t;typedef struct i386_bus_dma_tag		*bus_dma_tag_t;typedef struct i386_bus_dmamap		*bus_dmamap_t;/* *	bus_dma_segment_t * *	Describes a single contiguous DMA transaction.  Values *	are suitable for programming into DMA registers. */struct i386_bus_dma_segment {	bus_addr_t	ds_addr;	/* DMA address */	bus_size_t	ds_len;		/* length of transfer */};typedef struct i386_bus_dma_segment	bus_dma_segment_t;#define tgt_bus_dma_tag	i386_bus_dma_tag#define tgt_bus_dmamap	i386_bus_dmamap#define tgt_bus_dma_segment i386_bus_dma_segmentextern struct tgt_bus_dma_tag bus_dmamap_tag;/* *	bus_dma_tag_t * *	A machine-dependent opaque type describing the implementation of *	DMA for a given bus. */struct i386_bus_dma_tag {	void	*_cookie;		/* cookie used in the guts */	/*	 * DMA mapping methods.	 */	int	(*_dmamap_create) __P((void *, bus_size_t, int,				       bus_size_t, bus_size_t, int, bus_dmamap_t *));	void	(*_dmamap_destroy) __P((void *, bus_dmamap_t));	int	(*_dmamap_load) __P((void *, bus_dmamap_t, void *,				     bus_size_t, struct proc *, int));	int	(*_dmamap_load_mbuf) __P((void *, bus_dmamap_t,					  struct mbuf *, int));	int	(*_dmamap_load_uio) __P((void *, bus_dmamap_t,					 struct uio *, int));	int	(*_dmamap_load_raw) __P((void *, bus_dmamap_t,					 bus_dma_segment_t *, int, bus_size_t, int));	void	(*_dmamap_unload) __P((void *, bus_dmamap_t));	void	(*_dmamap_sync) __P((void *, bus_dmamap_t, bus_addr_t, bus_size_t, bus_dmasync_op_t));	/*	 * DMA memory utility functions.	 */	int	(*_dmamem_alloc) __P((void *, bus_size_t, bus_size_t,				      bus_size_t, bus_dma_segment_t *, int, int *, int));	void	(*_dmamem_free) __P((void *, bus_dma_segment_t *, int));	int	(*_dmamem_map) __P((void *, bus_dma_segment_t *,				    int, size_t, caddr_t *, int));	void	(*_dmamem_unmap) __P((void *, caddr_t, size_t));	int	(*_dmamem_mmap) __P((void *, bus_dma_segment_t *,				     int, int, int, int));};#define	bus_dmamap_create(t, s, n, m, b, f, p)			\	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))#define	bus_dmamap_destroy(t, p)				\	(*(t)->_dmamap_destroy)((t), (p))#define	bus_dmamap_load(t, m, b, s, p, f)			\	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))#define	bus_dmamap_load_mbuf(t, m, b, f)			\	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))#define	bus_dmamap_load_uio(t, m, u, f)				\	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))#define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))#define	bus_dmamap_unload(t, p)					\	(*(t)->_dmamap_unload)((t), (p))#define	bus_dmamap_sync(t, p, o, l, ops)			\	(void)((t)->_dmamap_sync ?				\	    (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)#define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))#define	bus_dmamem_free(t, sg, n)				\	(*(t)->_dmamem_free)((t), (sg), (n))#define	bus_dmamem_map(t, sg, n, s, k, f)			\	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))#define	bus_dmamem_unmap(t, k, s)				\	(*(t)->_dmamem_unmap)((t), (k), (s))#define	bus_dmamem_mmap(t, sg, n, o, p, f)			\	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))int	_dmamap_create __P((void *, bus_size_t, int,			    bus_size_t, bus_size_t, int, bus_dmamap_t *));void	_dmamap_destroy __P((void *, bus_dmamap_t));int	_dmamap_load __P((void *, bus_dmamap_t, void *,			  bus_size_t, struct proc *, int));int	_dmamap_load_mbuf __P((void *, bus_dmamap_t, struct mbuf *, int));int	_dmamap_load_uio __P((void *, bus_dmamap_t, struct uio *, int));int	_dmamap_load_raw __P((void *, bus_dmamap_t,			      bus_dma_segment_t *, int, bus_size_t, int));void	_dmamap_unload __P((void *, bus_dmamap_t));void	_dmamap_sync __P((void *, bus_dmamap_t, bus_addr_t, bus_size_t, bus_dmasync_op_t));int	_dmamem_alloc __P((void *, bus_size_t, bus_size_t,			   bus_size_t, bus_dma_segment_t *, int, int *, int));void	_dmamem_free __P((void *, bus_dma_segment_t *, int));int	_dmamem_map __P((void *, bus_dma_segment_t *,			 int, size_t, caddr_t *, int));void	_dmamem_unmap __P((void *, caddr_t, size_t));int	_dmamem_mmap __P((void *, bus_dma_segment_t *, int, int, int, int));int dma_cachectl __P((caddr_t, int));/* *	bus_dmamap_t * *	Describes a DMA mapping. */struct i386_bus_dmamap {	/*	 * PRIVATE MEMBERS: not for use my machine-independent code.	 */	bus_size_t	_dm_size;	/* largest DMA transfer mappable */	int		_dm_segcnt;	/* number of segs this map can map */	bus_size_t	_dm_maxsegsz;	/* largest possible segment */	bus_size_t	_dm_boundary;	/* don't cross this */	int		_dm_flags;	/* misc. flags */	void		*_dm_cookie;	/* cookie for bus-specific functions */	/*	 * PUBLIC MEMBERS: these are used by machine-independent code.	 */	bus_size_t	dm_mapsize;	/* size of the mapping */	int		dm_nsegs;	/* # valid segments in mapping */	bus_dma_segment_t dm_segs[1];	/* segments; variable length */};#ifdef _I386_BUS_DMA_PRIVATEint	_bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,	    bus_size_t, int, bus_dmamap_t *);void	_bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);int	_bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *,	    bus_size_t, struct proc *, int);int	_bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t,	    struct mbuf *, int);int	_bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t,	    struct uio *, int);int	_bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t,	    bus_dma_segment_t *, int, bus_size_t, int);void	_bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);void	_bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,	    bus_size_t, int);int	_bus_dmamem_alloc(bus_dma_tag_t tag, bus_size_t size,	    bus_size_t alignment, bus_size_t boundary,	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);void	_bus_dmamem_free(bus_dma_tag_t tag, bus_dma_segment_t *segs,	    int nsegs);int	_bus_dmamem_map(bus_dma_tag_t tag, bus_dma_segment_t *segs,	    int nsegs, size_t size, caddr_t *kvap, int flags);void	_bus_dmamem_unmap(bus_dma_tag_t tag, caddr_t kva,	    size_t size);paddr_t	_bus_dmamem_mmap(bus_dma_tag_t tag, bus_dma_segment_t *segs,	    int nsegs, off_t off, int prot, int flags);int	_bus_dmamem_alloc_range(bus_dma_tag_t tag, bus_size_t size,	    bus_size_t alignment, bus_size_t boundary,	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,	    vm_offset_t low, vm_offset_t high);#endif /* _I386_BUS_DMA_PRIVATE */#endif /* _I386_BUS_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -