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

📄 com_sgd.h

📁 6440linuxDriver的源代码
💻 H
字号:
#ifndef __MV_COM_SGD_H__#define __MV_COM_SGD_H__struct _sgd_tbl_t;struct _sgd_t;#define SGD_DOMAIN_MASK	0xF0000000L#define SGD_EOT			(1L<<27)	/* End of table */#define SGD_COMPACT		(1L<<26)	/* Compact (12 bytes) SG format, not verified yet */#define SGD_WIDE		(1L<<25)	/* 32 byte SG format */#define SGD_X64			(1L<<24)	/* the 2nd part of SGD_WIDE */#define SGD_NEXT_TBL	(1L<<23)	/* Next SG table format */#define SGD_VIRTUAL		(1L<<22)	/* Virtual SG format, either 32 or 64 bit is determined during compile time. */#define SGD_REFTBL		(1L<<21)	/* sg table reference format, either 32 or 64 bit is determined during compile time. */#define SGD_REFSGD		(1L<<20)	/* sg item reference format */#define SGD_VP			(1L<<19)	/* virtual and physical, not verified yet */#define SGD_VWOXCTX		(1L<<18)	/* virtual without translation context */#define SGD_PCTX		(1L<<17)	/* sgd_pctx_t, 64 bit only */typedef struct _sg_common_t{	MV_U32	dword1;	MV_U32	dword2;	MV_U32	flags;	/* SGD_xxx */	MV_U32	dword3;} sg_common_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_t{	MV_U64	baseAddr;	MV_U32	flags;	MV_U32	size;} sgd_t;/*---------------------------------------------------------------------------*/#define GET_COMPACT_SGD_SIZE(sgd)	\	((((sgd_compact_t*)(sgd))->flags) & 0x3FFFFFL)#define SET_COMPACT_SGD_SIZE(sgd,sz) do {			\	(((sgd_compact_t*)(sgd))->flags) &= ~0x3FFFFFL;	\	(((sgd_compact_t*)(sgd))->flags) |= (sz);		\} while(0)#define SIZEOF_COMPACT_SGD	12typedef struct _sgd_compact_t{	MV_U64	baseAddr;	MV_U32	flags;} sgd_compact_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_v32_t{	MV_PVOID	vaddr;	MV_PVOID	xctx;	MV_U32		flags;	MV_U32		size;} sgd_v32_t;/* sgd_v_t defines 32/64 bit virtual sgd without translation context */typedef struct _sgd_v_t{	union {		MV_PVOID	vaddr;		MV_U64		dummy;	} u;	MV_U32		flags;	MV_U32		size;} sgd_v_t;typedef struct _sgd_v64_t{	union {		MV_PVOID	vaddr;		MV_U64		dummy;	} u1;	MV_U32	flags;	MV_U32	size;	union {		MV_PVOID	xctx;		MV_U64		dummy;	} u2;	MV_U32	flagsEx;	MV_U32	rsvd;} sgd_v64_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_ref32_t{	MV_PVOID	ref;	MV_U32		offset;	MV_U32		flags;	MV_U32		size;} sgd_ref32_t;typedef struct _sgd_ref64_t{	union {		MV_PVOID	ref;		MV_U64		dummy;	} u;	MV_U32	flags;	MV_U32	size;	MV_U32	offset;	MV_U32	rsvd1;	MV_U32	flagsEx;	MV_U32	rsvd2;} sgd_ref64_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_nt_t{	union {		struct _sgd_tbl_t*	next;		MV_U64	dummy;	} u;	MV_U32	flags;	MV_U32	rsvd;} sgd_nt_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_vp_t{	MV_U64	baseAddr;	MV_U32	flags;		// SGD_VP | SGD_WIDE	MV_U32	size;	union {		MV_PVOID vaddr;		MV_U64   dummy;	} u;	MV_U32	flagsEx;	// SGD_X64	MV_U32	rsvd;} sgd_vp_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_pctx_t{	MV_U64	baseAddr;	MV_U32	flags;		// SGD_PCTX | SGD_WIDE	MV_U32	size;	union {		MV_PVOID xctx;		MV_U64   dummy;	} u;	MV_U32	flagsEx;	// SGD_X64	MV_U32	rsvd;} sgd_pctx_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_tbl_t{	MV_U8 Max_Entry_Count;	MV_U8 Valid_Entry_Count;	MV_U8 Flag;	MV_U8 Reserved0;	MV_U32 Byte_Count;	sgd_t* Entry_Ptr;} sgd_tbl_t;#define sgd_table_init(sgdt,maxCnt,entries) do {	\	MV_ZeroMemory(sgdt,sizeof(sgd_tbl_t));		\	(sgdt)->Max_Entry_Count = (maxCnt);				\	(sgdt)->Entry_Ptr = (sgd_t*)(entries);			\} while(0)/*---------------------------------------------------------------------------*/#define sgd_inc(sgd) do {	\	if( (sgd)->flags & SGD_COMPACT )					\		sgd = (sgd_t*)(((unsigned char*) (sgd)) + 12);	\	else if( (sgd)->flags & SGD_WIDE )					\		sgd = (sgd_t*)(((unsigned char*) (sgd)) + 32);	\	else sgd = (sgd_t*)(((unsigned char*) (sgd)) + 16);	\} while(0)#define sgd_get_vaddr(sgd,v) do {				\	if( (sgd)->flags & SGD_VIRTUAL ) {			\		if( (sgd)->flags & SGD_WIDE )			\			(v) = ((sgd_v64_t*)(sgd))->u1.vaddr;\		else (v) = ((sgd_v32_t*)(sgd))->vaddr;	\	}											\	else if( (sgd)->flags & SGD_VWOXCTX )		\		(v) = ((sgd_v_t*)sgd)->u.vaddr;			\	else if( (sgd)->flags & SGD_VP )			\		(v) = ((sgd_vp_t*)(sgd))->u.vaddr;		\	else										\		MV_ASSERT(MV_FALSE);					\} while(0)#define sgd_get_xctx(sgd,v) do {	\	if( (sgd)->flags & SGD_WIDE )	(v) = ((sgd_v64_t*)(sgd))->u2.xctx;	\	else (v) = ((sgd_v32_t*)(sgd))->xctx;	\} while(0)#define sgd_get_ref(sgd,_ref) do {	\	if( (sgd)->flags & SGD_WIDE ) (_ref) = ((sgd_ref64_t*)(sgd))->u.ref;	\	else (_ref) = ((sgd_ref32_t*)(sgd))->ref;	\} while(0)#define sgd_set_ref(sgd,_ref) do {	\	if( (sgd)->flags & SGD_WIDE ) ((sgd_ref64_t*)(sgd))->u.ref = (_ref);	\	else ((sgd_ref32_t*)(sgd))->ref = (_ref);	\} while(0)#define sgd_get_reftbl(sgd,reft) do {	\	if( (sgd)->flags & SGD_WIDE )		\		(reft) = (sgd_tbl_t*) (((sgd_ref64_t*)(sgd))->u.ref);	\	else (reft) = (sgd_tbl_t*)(((sgd_ref32_t*)(sgd))->ref);	\} while(0)#define sgd_get_refsgd(sgd,reft) do {	\	if( (sgd)->flags & SGD_WIDE )		\		(reft) = (sgd_t*) (((sgd_ref64_t*)(sgd))->u.ref);	\	else (reft) = (sgd_t*)(((sgd_ref32_t*)(sgd))->ref);	\} while(0)#define sgd_get_refoff(sgd,off) do {	\	if( (sgd)->flags & SGD_WIDE )	(off) = ((sgd_ref64_t*)(sgd))->offset;	\	else (off) = ((sgd_ref32_t*)(sgd))->offset;	\} while(0)#define sgd_set_refoff(sgd,off) do {	\	if( (sgd)->flags & SGD_WIDE )	((sgd_ref64_t*)(sgd))->offset = (off);	\	else ((sgd_ref32_t*)(sgd))->offset = (off);	\} while(0)#define sgd_get_nexttbl(sgd,n) do {	\	n = ((sgd_nt_t*)(sgd))->u.next;	\} while(0)#define sgd_mark_eot(sgd) \	((sgd)->flags |= SGD_EOT)#define sgd_clear_eot(sgd) \	((sgd)->flags &= ~SGD_EOT)#define sgd_eot(sgd)	\	((sgd)->flags & SGD_EOT)#define sgd_copy(sgdDst,sgdSrc) do {	\	*(sgdDst) = *(sgdSrc);	\	if( (sgdSrc)->flags & SGD_WIDE )	\		(sgdDst)[1] = (sgdSrc)[1];	\} while(0)#define sgd_getsz(sgd,sz) do {				\	if( (sgd)->flags & SGD_COMPACT )		\		(sz) = GET_COMPACT_SGD_SIZE(sgd);	\	else (sz) = (sgd)->size;				\} while(0)#define sgd_setsz(sgd,sz) do {				\	if( (sgd)->flags & SGD_COMPACT )		\		SET_COMPACT_SGD_SIZE(sgd,sz);		\	else (sgd)->size = (sz);				\} while(0)#define sgdt_get_lastsgd(sgdt,sgd) do {		\	(sgd) = &(sgdt)->Entry_Ptr[(sgdt)->Valid_Entry_Count];	\	(sgd)--;								\	if( (sgd)->flags & SGD_X64 ) (sgd)--;	\} while(0)/*---------------------------------------------------------------------------*/typedef int (*sgd_visitor_t)(sgd_t* sgd, MV_PVOID pContext);int sgd_table_walk(	sgd_tbl_t*		sgdt,	sgd_visitor_t	visitor,	MV_PVOID		ctx 	);/*---------------------------------------------------------------------------*/typedef struct _sgd_iter_t{	sgd_t*	sgd;		/* current SG */	MV_U32	offset;		/* offset in the SG */	MV_U32	remainCnt;} sgd_iter_t;void  sgd_iter_init(	sgd_iter_t*	iter,	sgd_t*		sgd,	MV_U32		offset,	MV_U32		count 	);int sgd_iter_get_next(	sgd_iter_t*	iter,	sgd_t*		sgd	);/*---------------------------------------------------------------------------*/void sgd_dump(sgd_t* sg, char* prefix);void sgdt_dump(sgd_tbl_t *SgTbl, char* prefix);/*---------------------------------------------------------------------------*/void sgdt_append(	sgd_tbl_t*	sgdt,	MV_U32		address,	MV_U32		addressHigh,	MV_U32		size	);void sgdt_append_pctx(	sgd_tbl_t*	sgdt,	MV_U32		address,	MV_U32		addressHigh,	MV_U32		size,	MV_PVOID	xctx	);int sgdt_append_virtual(	sgd_tbl_t* sgdt,	MV_PVOID virtual_address,	MV_PVOID translation_ctx,	MV_U32 size 	);int sgdt_append_ref(	sgd_tbl_t*	sgdt,	MV_PVOID	ref,	MV_U32		offset,	MV_U32		size,	MV_BOOLEAN	refTbl	);int sgdt_append_vp(	sgd_tbl_t*	sgdt,	MV_PVOID	virtual_address,	MV_U32		size,	MV_U32		address,	MV_U32		addressHigh	);voidsgdt_copy_partial(	sgd_tbl_t* sgdt,	sgd_t**	ppsgd,	MV_PU32	poff,	MV_U32	size	);void sgdt_append_sgd(	sgd_tbl_t*	sgdt,	sgd_t*		sgd	);#define sgdt_append_reftbl(sgdt,refSgdt,offset,size)	\	sgdt_append_ref(sgdt,refSgdt,offset,size,MV_TRUE)#define sgdt_append_refsgd(sgdt,refSgd,offset,size)	\	sgdt_append_ref(sgdt,refSgd,offset,size,MV_FALSE)/*---------------------------------------------------------------------------*/int sgdt_prepare_hwprd(	MV_PVOID		pCore,	sgd_tbl_t*		pSource,	sgd_t*			pSg,	int				availSgEntry	);#endif	/*__MV_COM_SGD_H__*/

⌨️ 快捷键说明

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