/*
 * Author: Max Lingua <sunmax@libero.it>
 */

#ifndef _S3V_REG_H
#define _S3V_REG_H

#define S3V_REGS_NUM 256

/************
 * DMA REGS *
 ************/

#define S3V_DMA_ID				0
#define S3V_DMA_REG				0x8590
#define S3V_DMA_WRITEP_ID			1
#define S3V_DMA_WRITEP_REG			0x8594
#define S3V_DMA_READP_ID			2
#define S3V_DMA_READP_REG			0x8598
#define S3V_DMA_ENABLE_ID			3
#define S3V_DMA_ENABLE_REG			0x859C
#define S3V_DMA_UPDATE_ID			4
#define S3V_DMA_UPDATE_REG			0x10000

/***************
 * STATUS REGS *
 ***************/

#define S3V_STAT_ID				10
#define S3V_STAT_REG				0x8504
#define S3V_STAT_VSYNC_ID			11
#define S3V_STAT_VSYNC_REG			0x8505
#define S3V_STAT_3D_DONE_ID			12
#define S3V_STAT_3D_DONE_REG			0x8506
#define S3V_STAT_FIFO_OVER_ID			13
#define S3V_STAT_FIFO_OVER_REG			0x8508
#define S3V_STAT_FIFO_EMPTY_ID			14
#define S3V_STAT_FIFO_EMPTY_REG			0x850C
#define S3V_STAT_HDMA_DONE_ID			15
#define S3V_STAT_HDMA_DONE_REG			0x8514
#define S3V_STAT_CDMA_DONE_ID			16
#define S3V_STAT_CDMA_DONE_REG			0x8524
#define S3V_STAT_3D_FIFO_EMPTY_ID		17
#define S3V_STAT_3D_FIFO_EMPTY_REG		0x8544
#define S3V_STAT_LPB_ID				18
#define S3V_STAT_LPB_REG			0x8584
#define S3V_STAT_3D_BUSY_ID			19
#define S3V_STAT_3D_BUSY_REG			0x8704

/***********
 * 2D REGS *
 ***********/

#define S3V_BITBLT_ID				30
#define S3V_BITBLT_REG				0xA400
#define S3V_BITBLT_SRC_BASE_ID			31
#define S3V_BITBLT_SRC_BASE_REG			0xA4D4
#define S3V_BITBLT_DEST_BASE_ID			32
#define S3V_BITBLT_DEST_BASE_REG		0xA4D8
#define S3V_BITBLT_CLIP_L_R_ID			33
#define S3V_BITBLT_CLIP_L_R_REG			0xA4DC
#define S3V_BITBLT_CLIP_T_B_ID			34
#define S3V_BITBLT_CLIP_T_B_REG			0xA4E0
#define S3V_BITBLT_DEST_SRC_STRIDE_ID		35
#define S3V_BITBLT_DEST_SRC_STRIDE_REG		0xA4E4
#define S3V_BITBLT_MONO_PAT0_ID			36
#define S3V_BITBLT_MONO_PAT0_REG		0xA4E8
#define S3V_BITBLT_MONO_PAT1_ID			37
#define S3V_BITBLT_MONO_PAT1_REG		0xA4EC
#define S3V_BITBLT_PAT_BG_COLOR_ID		38
#define S3V_BITBLT_PAT_BG_COLOR_REG		0xA4F0
#define S3V_BITBLT_PAT_FG_COLOR_ID		39
#define S3V_BITBLT_PAT_FG_COLOR_REG		0xA4F4
#define S3V_BITBLT_CMDSET_ID			40
#define S3V_BITBLT_CMDSET_REG			0xA500
#define S3V_BITBLT_WIDTH_HEIGHT_ID		41
#define S3V_BITBLT_WIDTH_HEIGHT_REG		0xA504
#define S3V_BITBLT_SRC_X_Y_ID			42
#define S3V_BITBLT_SRC_X_Y_REG			0xA508
#define S3V_BITBLT_DEST_X_Y_ID			43
#define S3V_BITBLT_DEST_X_Y_REG			0xA50C
#define S3V_2DLINE_ID				44
#define S3V_2DLINE_REG				0xA800
#define S3V_2DPOLY_ID				45
#define S3V_2DPOLY_REG				0xAC00

/***************
 * 3DLINE REGS *
 ***************/
/* base regs */
#define S3V_3DLINE_ID                  		50
#define S3V_3DLINE_REG				0xB000
#define S3V_3DLINE_Z_BASE_ID           		51
#define S3V_3DLINE_Z_BASE_REG			0xB0D4
#define S3V_3DLINE_SRC_BASE_ID         		52   /* it is the same reg */
#define S3V_3DLINE_SRC_BASE_REG			0xB0D4
#define S3V_3DLINE_DEST_BASE_ID        		53
#define S3V_3DLINE_DEST_BASE_REG		0xB0D8
#define S3V_3DLINE_CLIP_L_R_ID         		54
#define S3V_3DLINE_CLIP_L_R_REG			0xB0DC
#define S3V_3DLINE_CLIP_T_B_ID			55
#define S3V_3DLINE_CLIP_T_B_REG         	0xB0E0
#define S3V_3DLINE_DEST_SRC_STRIDE_ID		56
#define S3V_3DLINE_DEST_SRC_STRIDE_REG  	0xB0E4
#define S3V_3DLINE_Z_STRIDE_ID       		57
#define S3V_3DLINE_Z_STRIDE_REG  		0xB0E8
#define S3V_3DLINE_TEX_BASE_ID			58
#define S3V_3DLINE_TEX_BASE_REG         	0xB0EC
#define S3V_3DLINE_TEX_B_COLOR_ID		59
#define S3V_3DLINE_TEX_B_COLOR_REG      	0xB0F0
#define S3V_3DLINE_FOG_COLOR_ID  		60
#define S3V_3DLINE_FOG_COLOR_REG      		0xB0F4
#define S3V_3DLINE_COLOR0_ID   			61
#define S3V_3DLINE_COLOR0_REG        		0xB0F8
#define S3V_3DLINE_COLOR1_ID			62
#define S3V_3DLINE_COLOR1_REG           	0xB0FC
#define S3V_3DLINE_CMDSET_ID			63
#define S3V_3DLINE_CMDSET_REG            	0xB100 /* special */
/* tex regs */
/* FIXME: shouldn't it be a 1D tex for lines? */
#define S3V_3DLINE_BASEV_ID 			64
#define S3V_3DLINE_BASEV_REG          		0xB104 
#define S3V_3DLINE_BASEU_ID			65
#define S3V_3DLINE_BASEU_REG            	0xB108
#define S3V_3DLINE_WXD_ID  			66
#define S3V_3DLINE_WXD_REG             		0xB10C
#define S3V_3DLINE_WYD_ID 			67
#define S3V_3DLINE_WYD_REG              	0xB110
#define S3V_3DLINE_WSTART_ID			68
#define S3V_3DLINE_WSTART_REG          		0xB114
#define S3V_3DLINE_DXD_ID   			69
#define S3V_3DLINE_DXD_REG          		0xB118
#define S3V_3DLINE_VXD_ID			70
#define S3V_3DLINE_VXD_REG              	0xB11C
#define S3V_3DLINE_UXD_ID			71
#define S3V_3DLINE_UXD_REG              	0xB120
#define S3V_3DLINE_DYD_ID			72
#define S3V_3DLINE_DYD_REG              	0xB124
#define S3V_3DLINE_VYD_ID			73
#define S3V_3DLINE_VYD_REG              	0xB128
#define S3V_3DLINE_UYD_ID			74
#define S3V_3DLINE_UYD_REG              	0xB12C
#define S3V_3DLINE_DSTART_ID			75
#define S3V_3DLINE_DSTART_REG           	0xB130
#define S3V_3DLINE_VSTART_ID			76
#define S3V_3DLINE_VSTART_REG           	0xB134
#define S3V_3DLINE_USTART_ID			77
#define S3V_3DLINE_USTART_REG           	0xB138
/* gourad regs */
#define S3V_3DLINE_GBD_ID   			78
#define S3V_3DLINE_GBD_REG            		0xB144
#define S3V_3DLINE_ARD_ID 			79
#define S3V_3DLINE_ARD_REG             		0xB148
#define S3V_3DLINE_GS_BS_ID			80
#define S3V_3DLINE_GS_BS_REG            	0xB14C
#define S3V_3DLINE_AS_RS_ID			81
#define S3V_3DLINE_AS_RS_REG             	0xB150
/* vertex regs */
#define S3V_3DLINE_DZ_ID    			82
#define S3V_3DLINE_DZ_REG            		0xB158
#define S3V_3DLINE_ZSTART_ID			83
#define S3V_3DLINE_ZSTART_REG            	0xB15C
#define S3V_3DLINE_XEND0_END1_ID		84
#define S3V_3DLINE_XEND0_END1_REG       	0xB16C
#define S3V_3DLINE_DX_ID        		85
#define S3V_3DLINE_DX_REG        		0xB170
#define S3V_3DLINE_XSTART_ID			86
#define S3V_3DLINE_XSTART_REG           	0xB174
#define S3V_3DLINE_YSTART_ID 			87
#define S3V_3DLINE_YSTART_REG          		0xB178
#define S3V_3DLINE_YCNT_ID  			88
#define S3V_3DLINE_YCNT_REG           		0xB17C

/**************
 * 3DTRI REGS *
 **************/
/* base regs */
#define S3V_3DTRI_ID                   		100
#define S3V_3DTRI_REG				0xB400
#define S3V_3DTRI_Z_BASE_ID			101
#define S3V_3DTRI_Z_BASE_REG            	0xB4D4
#define S3V_3DTRI_SRC_BASE_ID          		102 /* it is the same reg */
#define S3V_3DTRI_SRC_BASE_REG			0xB4D4
#define S3V_3DTRI_DEST_BASE_ID         		103
#define S3V_3DTRI_DEST_BASE_REG			0xB4D8
#define S3V_3DTRI_CLIP_L_R_ID          		104
#define S3V_3DTRI_CLIP_L_R_REG 			0xB4DC
#define S3V_3DTRI_CLIP_T_B_ID          		105
#define S3V_3DTRI_CLIP_T_B_REG			0xB4E0
#define S3V_3DTRI_DEST_SRC_STRIDE_ID   		106
#define S3V_3DTRI_DEST_SRC_STRIDE_REG		0xB4E4
#define S3V_3DTRI_Z_STRIDE_ID          		107
#define S3V_3DTRI_Z_STRIDE_REG			0xB4E8
#define S3V_3DTRI_TEX_BASE_ID          		108
#define S3V_3DTRI_TEX_BASE_REG			0xB4EC
#define S3V_3DTRI_TEX_B_COLOR_ID       		109
#define S3V_3DTRI_TEX_B_COLOR_REG		0xB4F0
#define S3V_3DTRI_FOG_COLOR_ID         		110
#define S3V_3DTRI_FOG_COLOR_REG			0xB4F4
#define S3V_3DTRI_COLOR0_ID            		111
#define S3V_3DTRI_COLOR0_REG			0xB4F8
#define S3V_3DTRI_COLOR1_ID            		112
#define S3V_3DTRI_COLOR1_REG			0xB4FC
#define S3V_3DTRI_CMDSET_ID            		113  /* special */
#define S3V_3DTRI_CMDSET_REG			0xB500
/* tex regs */
#define S3V_3DTRI_BASEV_ID             		114
#define S3V_3DTRI_BASEV_REG			0xB504
#define S3V_3DTRI_BASEU_ID             		115
#define S3V_3DTRI_BASEU_REG			0xB508
#define S3V_3DTRI_WXD_ID               		116
#define S3V_3DTRI_WXD_REG			0xB50C
#define S3V_3DTRI_WYD_ID               		117
#define S3V_3DTRI_WYD_REG			0xB510
#define S3V_3DTRI_WSTART_ID            		118
#define S3V_3DTRI_WSTART_REG 			0xB514
#define S3V_3DTRI_DXD_ID               		119
#define S3V_3DTRI_DXD_REG			0xB518
#define S3V_3DTRI_VXD_ID               		120
#define S3V_3DTRI_VXD_REG			0xB51C
#define S3V_3DTRI_UXD_ID            		121
#define S3V_3DTRI_UXD_REG			0xB520
#define S3V_3DTRI_DYD_ID            		122
#define S3V_3DTRI_DYD_REG			0xB524
#define S3V_3DTRI_VYD_ID            		123
#define S3V_3DTRI_VYD_REG			0xB528
#define S3V_3DTRI_UYD_ID            		124
#define S3V_3DTRI_UYD_REG			0xB52C
#define S3V_3DTRI_DSTART_ID         		125
#define S3V_3DTRI_DSTART_REG			0xB530
#define S3V_3DTRI_VSTART_ID         		126
#define S3V_3DTRI_VSTART_REG			0xB534
#define S3V_3DTRI_USTART_ID         		127
#define S3V_3DTRI_USTART_REG			0xB538
/* gourad regs */
#define S3V_3DTRI_GBX_ID               		128
#define S3V_3DTRI_GBX_REG			0xB53C
#define S3V_3DTRI_ARX_ID               		129
#define S3V_3DTRI_ARX_REG			0xB540
#define S3V_3DTRI_GBY_ID			130
#define S3V_3DTRI_GBY_REG               	0xB544
#define S3V_3DTRI_ARY_ID			131
#define S3V_3DTRI_ARY_REG               	0xB548
#define S3V_3DTRI_GS_BS_ID			132
#define S3V_3DTRI_GS_BS_REG             	0xB54C
#define S3V_3DTRI_AS_RS_ID			133
#define S3V_3DTRI_AS_RS_REG             	0xB550
/* vertex regs */
#define S3V_3DTRI_ZXD_ID               		134
#define S3V_3DTRI_ZXD_REG			0xB554
#define S3V_3DTRI_ZYD_ID               		135
#define S3V_3DTRI_ZYD_REG			0xB558
#define S3V_3DTRI_ZSTART_ID            		136
#define S3V_3DTRI_ZSTART_REG			0xB55C
#define S3V_3DTRI_TXDELTA12_ID         		137
#define S3V_3DTRI_TXDELTA12_REG			0xB560
#define S3V_3DTRI_TXEND12_ID           		138
#define S3V_3DTRI_TXEND12_REG			0xB564
#define S3V_3DTRI_TXDELTA01_ID         		139
#define S3V_3DTRI_TXDELTA01_REG			0xB568
#define S3V_3DTRI_TXEND01_ID           		140
#define S3V_3DTRI_TXEND01_REG			0xB56C
#define S3V_3DTRI_TXDELTA02_ID         		141
#define S3V_3DTRI_TXDELTA02_REG			0xB570
#define S3V_3DTRI_TXSTART02_ID         		142
#define S3V_3DTRI_TXSTART02_REG			0xB574
#define S3V_3DTRI_TYS_ID               		143
#define S3V_3DTRI_TYS_REG			0xB578
#define S3V_3DTRI_TY01_Y12_ID          		144
#define S3V_3DTRI_TY01_Y12_REG			0xB57C

/* COMMANDS (to 0xB100 [lines] or 0xB500 [tris]) */

/* Auto execute */
#define AUTO_EXEC_MASK		0x00000001
#define AUTO_EXEC_OFF		(0x0)
#define AUTO_EXEC_ON		(0x1)
/* HW clipping */
#define HW_CLIP_MASK		0x00000002
#define HW_CLIP_OFF		(0x0 << 1)
#define HW_CLIP_ON		(0x1 << 1)
/* Destination color */
#define DEST_COL_MASK		0x0000001c
#define DEST_COL_PAL		(0x0 << 2)	/* 8 bpp - palettized */
#define DEST_COL_1555		(0x1 << 2)	/* 16 bpp - ZRGB */
#define DEST_COL_888  		(0x2 << 2)	/* 24 bpp - RGB */
/* Texture color */
#define TEX_COL_MASK		0x000000e0
#define TEX_COL_ARGB8888	(0x0 << 5)	/* 32 bpp - ARGB */
#define TEX_COL_ARGB4444	(0x1 << 5)  	/* 16 bpp - ARGB */
#define TEX_COL_ARGB1555	(0x2 << 5)  	/* 16 bpp - ARGB */
#define TEX_COL_ALPHA4		(0x3 << 5)  	/* 8 bpp - ALPHA4 */
#define TEX_COL_BLEND4_LOW 	(0x4 << 5)  	/* 4 bpp - BLEND4 low nibble */
#define TEX_COL_BLEND4_HIGH	(0x5 << 5)  	/* 4 bpp - BLEND4 high nibble */
#define TEX_COL_PAL		(0x6 << 5)	/* 8 bpp - palettized */
#define TEX_COL_YUV		(0x7 << 5)	/* 16 bpp - YUV */
/* Mipmap level */
#define MIP_MASK		0x00000f00
#define MIPMAP_LEVEL(s)		(s << 8)	/* 8 -> 11 bits */
/* Texture filtering */
#define TEX_FILTER_MASK		0x00007000
#define MIP_NEAREST		(0x0 << 12)
#define LINEAR_MIP_NEAREST  	(0x1 << 12)
#define MIP_LINEAR	        (0x2 << 12)
#define LINEAR_MIP_LINEAR   	(0x3 << 12)
#define NEAREST		        (0x4 << 12)
#define FAST_BILINEAR       	(0x5 << 12)
#define LINEAR		        (0x6 << 12)
/* Texture blending */
#define TEX_BLEND_MAKS		0x00018000
#define TEX_REFLECT		(0x0 << 15)
#define TEX_MODULATE    	(0x1 << 15)
#define TEX_DECAL	        (0x2 << 15)
/* Fog */
#define FOG_MASK		0x00020000
#define FOG_OFF			(0x0 << 17)
#define FOG_ON              	(0x1 << 17)
/* Alpha blending */
#define ALPHA_BLEND_MASK	0x000c0000
#define ALPHA_OFF		(0x0 << 18) | (0x0 << 19)
#define ALPHA_TEX		(0x2 << 18)
#define ALPHA_SRC           	(0x3 << 18)
/* Depth compare mode */
#define Z_MODE_MASK		0x00700000
#define Z_NEVER     		(0x0 << 20)
#define Z_GREATER   		(0x1 << 20)
#define Z_EQUAL     		(0x2 << 20)
#define Z_GEQUAL    		(0x3 << 20)
#define Z_LESS      		(0x4 << 20)
#define Z_NOTEQUAL  		(0x5 << 20)
#define Z_LEQUAL    		(0x6 << 20) 
#define Z_ALWAYS   		(0x7 << 20)
/* Depth update */
#define Z_UPDATE_MASK		0x00800000
#define Z_UPDATE_OFF		(0x0 << 23)	/* disable z update */
#define Z_UPDATE_ON         	(0x1 << 23)
/* Depth buffering mode */
#define Z_BUFFER_MASK		0x03000000
#define Z_BUFFER		(0x0 << 24) | (0x0 << 25)
#define Z_MUX_BUF		(0x1 << 24) | (0x0 << 25)
#define Z_MUX_DRAW		(0x2 << 24)
#define Z_OFF			(0x3 << 24) /* no z buffering */
/* Texture wrapping */
#define TEX_WRAP_MASK		0x04000000
#define TEX_WRAP_OFF		(0x0 << 26)
#define TEX_WRAP_ON		(0x1 << 26)
/* 3d command */
#define DO_MASK			0x78000000
#define DO_GOURAUD_TRI		(0x0 << 27)
#define DO_TEX_LIT_TRI_OLD	(0x1 << 27) 
#define DO_TEX_UNLIT_TRI_OLD 	(0x2 << 27)
#define DO_TEX_LIT_TRI		(0x5 << 27)
#define DO_TEX_UNLIT_TRI	(0x6 << 27)
#define DO_3D_LINE		(0x8 << 27)
#define	DO_NOP			(0xf << 27) /* turn on autoexec */
/* status */
#define CMD_MASK		0x80000000
#define CMD_2D			(0x0 << 31) /* execute a 2d cmd */
#define CMD_3D			(0x1 << 31) /* execute a 3d cmd */

/* global masks */
#define TEX_MASK		( TEX_COL_MASK | TEX_WRAP_MASK | MIP_MASK \
				| TEX_FILTER_MASK | TEX_BLEND_MAKS \
				| TEX_WRAP_MASK )
#define Z_MASK			( Z_MODE_MASK | Z_UPDATE_MASK | Z_BUFFER_MASK )

#endif /* _S3V_REG_H */