1340e3fbdSmrg
2340e3fbdSmrg#ifndef _S3_REG_H
3340e3fbdSmrg#define _S3_REG_H
4340e3fbdSmrg
5340e3fbdSmrg#include "compiler.h"
6340e3fbdSmrg
7340e3fbdSmrgextern short s3alu[16];
8340e3fbdSmrg
9340e3fbdSmrg#define S3_NEWMMIO_REGBASE      0x1000000  /* 16MB */
10340e3fbdSmrg#define S3_NEWMMIO_REGSIZE        0x10000  /* 64KB */
11340e3fbdSmrg
12340e3fbdSmrg#define ADVFUNC_CNTL	0x4ae8
13340e3fbdSmrg#define SUBSYS_STAT	0x42e8
14340e3fbdSmrg#define SUBSYS_CNTL	0x42e8
15340e3fbdSmrg#define CUR_Y		0x82e8
16340e3fbdSmrg#define CUR_X		0x86e8
17340e3fbdSmrg#define CUR_Y2		0x82ea
18340e3fbdSmrg#define CUR_X2		0x86ea
19340e3fbdSmrg#define DESTY_AXSTP	0x8ae8
20340e3fbdSmrg#define DESTX_DIASTP	0x8ee8
21340e3fbdSmrg#define DESTY_AXSTP2	0x8aea
22340e3fbdSmrg#define DESTX_DIASTP2	0x8eea
23340e3fbdSmrg#define ERR_TERM        0x92e8
24340e3fbdSmrg#define ERR_TERM2       0x92ea
25340e3fbdSmrg#define MAJ_AXIS_PCNT	0x96e8
26340e3fbdSmrg#define MAJ_AXIS_PCNT2	0x96ea
27340e3fbdSmrg#define GP_STAT		0x9ae8
28340e3fbdSmrg#define CMD		0x9ae8
29340e3fbdSmrg#define CMD2		0x9aea
30340e3fbdSmrg#define BKGD_COLOR	0xa2e8
31340e3fbdSmrg#define FRGD_COLOR	0xa6e8
32340e3fbdSmrg#define WRT_MASK	0xaae8
33340e3fbdSmrg#define RD_MASK		0xaee8
34340e3fbdSmrg#define COLOR_CMP	0xb2e8
35340e3fbdSmrg#define BKGD_MIX	0xb6e8
36340e3fbdSmrg#define FRGD_MIX	0xbae8
37340e3fbdSmrg#define MULTIFUNC_CNTL	0xbee8
38340e3fbdSmrg#define PIX_TRANS	0xe2e8
39340e3fbdSmrg#define PIX_TRANS_EXT	0xe2ea
40340e3fbdSmrg
41340e3fbdSmrg/* Graphics Processor Status Register */
42340e3fbdSmrg#define GPBUSY		0x0200
43340e3fbdSmrg
44340e3fbdSmrg/* Command Register */
45340e3fbdSmrg#define CMD_NOP         0x0000
46340e3fbdSmrg#define CMD_LINE        0x2000
47340e3fbdSmrg#define CMD_RECT        0x4000
48340e3fbdSmrg#define CMD_RECTV1      0x6000
49340e3fbdSmrg#define CMD_RECTV2      0x8000
50340e3fbdSmrg#define CMD_LINEAF      0xa000
51340e3fbdSmrg#define CMD_BITBLT      0xc000
52340e3fbdSmrg#define CMD_PFILL       0xe000
53340e3fbdSmrg#define CMD_OP_MSK      0xf000
54340e3fbdSmrg#define BYTSEQ          0x1000
55340e3fbdSmrg#define _16BIT          0x0200
56340e3fbdSmrg#define _32BIT          0x0400
57340e3fbdSmrg#define PCDATA          0x0100
58340e3fbdSmrg#define INC_Y           0x0080
59340e3fbdSmrg#define YMAJAXIS        0x0040
60340e3fbdSmrg#define INC_X           0x0020
61340e3fbdSmrg#define DRAW            0x0010
62340e3fbdSmrg#define LINETYPE        0x0008
63340e3fbdSmrg#define LASTPIX         0x0004
64340e3fbdSmrg#define PLANAR          0x0002
65340e3fbdSmrg#define WRTDATA         0x0001
66340e3fbdSmrg
67340e3fbdSmrg
68340e3fbdSmrg/* Background Mix Register */
69340e3fbdSmrg#define BSS_BKGDCOL	0x0000
70340e3fbdSmrg#define BSS_FRGDCOL	0x0020
71340e3fbdSmrg#define BSS_PCDATA	0x0040
72340e3fbdSmrg#define BSS_BITBLT	0x0060
73340e3fbdSmrg
74340e3fbdSmrg/* Foreground Mix Register */
75340e3fbdSmrg#define FSS_BKGDCOL	0x0000
76340e3fbdSmrg#define FSS_FRGDCOL	0x0020
77340e3fbdSmrg#define FSS_PCDATA	0x0040
78340e3fbdSmrg#define FSS_BITBLT	0x0060
79340e3fbdSmrg
80340e3fbdSmrg#define PIX_CNTL	0xa000
81340e3fbdSmrg#define MIN_AXIS_PCNT	0x0000
82340e3fbdSmrg
83340e3fbdSmrg/* Pixel Control Register */
84340e3fbdSmrg#define MIXSEL_EXPPC	0x0080
85340e3fbdSmrg
86340e3fbdSmrg#define SCISSORS_T	0x1000
87340e3fbdSmrg#define SCISSORS_L	0x2000
88340e3fbdSmrg#define SCISSORS_B	0x3000
89340e3fbdSmrg#define SCISSORS_R	0x4000
90340e3fbdSmrg#define MULT_MISC2	0xd000
91340e3fbdSmrg#define MULT_MISC	0xe000
92340e3fbdSmrg
93340e3fbdSmrg
94340e3fbdSmrg#define	MIX_MASK			0x001f
95340e3fbdSmrg
96340e3fbdSmrg#define MIX_NOT_DST			0x0000
97340e3fbdSmrg#define MIX_0				0x0001
98340e3fbdSmrg#define MIX_1				0x0002
99340e3fbdSmrg#define MIX_DST				0x0003
100340e3fbdSmrg#define MIX_NOT_SRC			0x0004
101340e3fbdSmrg#define MIX_XOR				0x0005
102340e3fbdSmrg#define MIX_XNOR			0x0006
103340e3fbdSmrg#define MIX_SRC				0x0007
104340e3fbdSmrg#define MIX_NAND			0x0008
105340e3fbdSmrg#define MIX_NOT_SRC_OR_DST		0x0009
106340e3fbdSmrg#define MIX_SRC_OR_NOT_DST		0x000a
107340e3fbdSmrg#define MIX_OR				0x000b
108340e3fbdSmrg#define MIX_AND				0x000c
109340e3fbdSmrg#define MIX_SRC_AND_NOT_DST		0x000d
110340e3fbdSmrg#define MIX_NOT_SRC_AND_DST		0x000e
111340e3fbdSmrg#define MIX_NOR				0x000f
112340e3fbdSmrg
113340e3fbdSmrg#define MIX_MIN				0x0010
114340e3fbdSmrg#define MIX_DST_MINUS_SRC		0x0011
115340e3fbdSmrg#define MIX_SRC_MINUS_DST		0x0012
116340e3fbdSmrg#define MIX_PLUS			0x0013
117340e3fbdSmrg#define MIX_MAX				0x0014
118340e3fbdSmrg#define MIX_HALF__DST_MINUS_SRC		0x0015
119340e3fbdSmrg#define MIX_HALF__SRC_MINUS_DST		0x0016
120340e3fbdSmrg#define MIX_AVERAGE			0x0017
121340e3fbdSmrg#define MIX_DST_MINUS_SRC_SAT		0x0018
122340e3fbdSmrg#define MIX_SRC_MINUS_DST_SAT		0x001a
123340e3fbdSmrg#define MIX_HALF__DST_MINUS_SRC_SAT	0x001c
124340e3fbdSmrg#define MIX_HALF__SRC_MINUS_DST_SAT	0x001e
125340e3fbdSmrg#define MIX_AVERAGE_SAT			0x001f
126340e3fbdSmrg
127340e3fbdSmrg/*
128340e3fbdSmrg * Short Stroke Vector Transfer Register (The angular Defs also apply to
129340e3fbdSmrgthe
130340e3fbdSmrg * Command Register
131340e3fbdSmrg */
132340e3fbdSmrg#define VECDIR_000      0x0000
133340e3fbdSmrg#define VECDIR_045      0x0020
134340e3fbdSmrg#define VECDIR_090      0x0040
135340e3fbdSmrg#define VECDIR_135      0x0060
136340e3fbdSmrg#define VECDIR_180      0x0080
137340e3fbdSmrg#define VECDIR_225      0x00a0
138340e3fbdSmrg#define VECDIR_270      0x00c0
139340e3fbdSmrg#define VECDIR_315      0x00e0
140340e3fbdSmrg#define SSVDRAW         0x0010
141340e3fbdSmrg
142bd35f0dbSahoka/*
143bd35f0dbSahoka * Some values for Streams FIFO.
144bd35f0dbSahoka * primary stream threshold | secondary stream threshold |
145bd35f0dbSahoka * secondary stream slots (can be 0, 8, 12, 16, 24) from 24 total
146bd35f0dbSahoka */
147bd35f0dbSahoka#define FIFO_PS0_SS24  (0 << 10) | (12 << 5) | 24
148bd35f0dbSahoka#define FIFO_PS8_SS16  (8 << 10) | (12 << 5) | 16
149bd35f0dbSahoka#define FIFO_PS12_SS12 (6 << 10) | (8 << 5) | 12
150bd35f0dbSahoka#define FIFO_PS16_SS8  (8 << 10) | (4 << 5) | 8
151bd35f0dbSahoka#define FIFO_PS24_SS0  (12 << 10) | (0 << 5) | 0
152340e3fbdSmrg
153340e3fbdSmrg#define S3_OUTW(p,n)		outw(p, n)
154340e3fbdSmrg#define S3_OUTL(p,n)		outl(p, n)
155340e3fbdSmrg#define S3_OUTW32(p,n)		if (pS3->s3Bpp > 2) {		\
156340e3fbdSmrg					outw(p, n);		\
157340e3fbdSmrg					outw(p, (n) >> 16);	\
158340e3fbdSmrg				} else outw(p, n)
159340e3fbdSmrg
160340e3fbdSmrg
161340e3fbdSmrg#define WaitIdle()	do {			\
162340e3fbdSmrg		mem_barrier();			\
163340e3fbdSmrg		while(inw(GP_STAT) & GPBUSY);	\
164340e3fbdSmrg	} while(0)
165340e3fbdSmrg
166bd35f0dbSahoka#define WaitVSync() {					\
167bd35f0dbSahoka	while (inb(0x3da) & 8);                         \
168bd35f0dbSahoka	while (!(inb(0x3da) & 8));			\
169bd35f0dbSahoka}
170340e3fbdSmrg
171340e3fbdSmrg#ifdef S3_NEWMMIO
172340e3fbdSmrg#include "newmmio.h"
173340e3fbdSmrg
174340e3fbdSmrg/*
175340e3fbdSmrg * streams regs
176340e3fbdSmrg */
177340e3fbdSmrg#define SET_BLEND_CNTL(val)     ((mmtr)s3MmioMem)->streams_regs.regs.blend_cntl = (val)
178340e3fbdSmrg#define SET_PSTREAM_CNTL(val)   ((mmtr)s3MmioMem)->streams_regs.regs.prim_stream_cntl = (val)
179bd35f0dbSahoka#define SET_PSTREAM_FBADDR0(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_fbaddr0 = (val)
180bd35f0dbSahoka#define SET_PSTREAM_FBADDR1(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_fbaddr1 = (val)
181340e3fbdSmrg#define SET_PSTREAM_STRIDE(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_stream_stride = (val)
182340e3fbdSmrg#define SET_PSTREAM_START(val)  ((mmtr)s3MmioMem)->streams_regs.regs.prim_start_coord = (val)
183340e3fbdSmrg#define SET_PSTREAM_WIND(val)   ((mmtr)s3MmioMem)->streams_regs.regs.prim_window_size = (val)
184340e3fbdSmrg#define SET_SSTREAM_CNTL(val)   ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_cntl = (val)
185340e3fbdSmrg#define SET_SSTRETCH(val)       ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_stretch = (val)
186bd35f0dbSahoka#define SET_SSTREAM_FBADDR0(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_fbaddr0 = (val)
187bd35f0dbSahoka#define SET_SSTREAM_FBADDR1(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_fbaddr1 = (val)
188340e3fbdSmrg#define SET_SSTREAM_STRIDE(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_stride = (val)
189340e3fbdSmrg#define SET_SSTREAM_START(val)  ((mmtr)s3MmioMem)->streams_regs.regs.second_start_coord = (val)
190340e3fbdSmrg#define SET_SSTREAM_WIND(val)   ((mmtr)s3MmioMem)->streams_regs.regs.second_window_size = (val)
191340e3fbdSmrg#define SET_K1_VSCALE(val)      ((mmtr)s3MmioMem)->streams_regs.regs.k1 = (val)
192340e3fbdSmrg#define SET_K2_VSCALE(val)      ((mmtr)s3MmioMem)->streams_regs.regs.k2 = (val)
193340e3fbdSmrg#define SET_DDA_VERT(val)       ((mmtr)s3MmioMem)->streams_regs.regs.dda_vert = (val)
194340e3fbdSmrg#define SET_CHROMA_KEY(val)     ((mmtr)s3MmioMem)->streams_regs.regs.col_chroma_key_cntl = (val)
195340e3fbdSmrg#define SET_DOUBLE_BUFFER(val)  ((mmtr)s3MmioMem)->streams_regs.regs.double_buffer = (val)
196340e3fbdSmrg#define SET_OPAQUE_OVERLAY(val) ((mmtr)s3MmioMem)->streams_regs.regs.opaq_overlay_cntl = (val)
197bd35f0dbSahoka#define SET_FIFO_CNTL(val)     ((mmtr)s3MmioMem)->streams_regs.regs.streams_fifo = (val)
198340e3fbdSmrg
199340e3fbdSmrg#else
200340e3fbdSmrg
201340e3fbdSmrg#define CMD_REG_WIDTH	0x0000
202340e3fbdSmrg
203340e3fbdSmrg#define WaitQueue(n)	do {				\
204340e3fbdSmrg		mem_barrier();			\
205340e3fbdSmrg		while(inb(GP_STAT) & (0x0100 >> (n)));	\
206340e3fbdSmrg	} while (0)
207340e3fbdSmrg
208340e3fbdSmrg#define WaitQueue16_32(n16,n32)				\
209340e3fbdSmrg	if (pS3->s3Bpp <= 2) {				\
210340e3fbdSmrg		WaitQueue(n16);				\
211340e3fbdSmrg	} else {					\
212340e3fbdSmrg		WaitQueue(n32);				\
213340e3fbdSmrg	}
214340e3fbdSmrg
215340e3fbdSmrg#define VerticalRetraceWait()						 \
216340e3fbdSmrg	{								 \
217340e3fbdSmrg		outb(vgaCRIndex, 0x17);					 \
218340e3fbdSmrg		if (inb(vgaCRReg) & 0x80) {				 \
219340e3fbdSmrg			while ((inb(vgaCRIndex-4+0x0a) & 0x08) == 0x00); \
220340e3fbdSmrg			while ((inb(vgaCRIndex-4+0x0a) & 0x08) == 0x08); \
221340e3fbdSmrg		}							 \
222340e3fbdSmrg	}
223340e3fbdSmrg
224340e3fbdSmrg/* accel commands */
225340e3fbdSmrg
226340e3fbdSmrg#define SET_PIX_CNTL(val)	S3_OUTW(MULTIFUNC_CNTL, PIX_CNTL | (val))
227340e3fbdSmrg
228340e3fbdSmrg#define SET_FRGD_COLOR(col)	S3_OUTW32(FRGD_COLOR, col)
229340e3fbdSmrg#define SET_BKGD_COLOR(col)	S3_OUTW32(BKGD_COLOR, col)
230340e3fbdSmrg
231340e3fbdSmrg#define SET_FRGD_MIX(fmix)	S3_OUTW(FRGD_MIX, (fmix))
232340e3fbdSmrg#define SET_WRT_MASK(mask)	S3_OUTW32(WRT_MASK, mask)
233340e3fbdSmrg
234340e3fbdSmrg#define SET_CUR_X(cur_x)	S3_OUTW(CUR_X, cur_x)
235340e3fbdSmrg#define SET_CUR_Y(cur_y)	S3_OUTW(CUR_Y, cur_y)
236340e3fbdSmrg#define SET_CUR_X2(cur_x)	S3_OUTW(CUR_X2, cur_x)
237340e3fbdSmrg#define SET_CUR_Y2(cur_y)	S3_OUTW(CUR_Y2, cur_y)
238340e3fbdSmrg
239340e3fbdSmrg#define SET_CURPT(cur_x, cur_y)	{					\
240340e3fbdSmrg	SET_CUR_X(cur_x);						\
241340e3fbdSmrg	SET_CUR_Y(cur_y);						\
242340e3fbdSmrg	}
243340e3fbdSmrg
244340e3fbdSmrg#define SET_DESTSTP(x,y) {						\
245340e3fbdSmrg	S3_OUTW(DESTX_DIASTP, x);					\
246340e3fbdSmrg	S3_OUTW(DESTY_AXSTP, y);					\
247340e3fbdSmrg	}
248340e3fbdSmrg
249340e3fbdSmrg#define SET_AXIS_PCNT(maj, min)	{					\
250340e3fbdSmrg	S3_OUTW(MAJ_AXIS_PCNT, maj);					\
251340e3fbdSmrg	S3_OUTW(MULTIFUNC_CNTL, MIN_AXIS_PCNT | (min));			\
252340e3fbdSmrg	}
253340e3fbdSmrg
254340e3fbdSmrg#define SET_CMD(cmd)		S3_OUTW(CMD, cmd)
255340e3fbdSmrg
256340e3fbdSmrg#define SET_SCISSORS(x1,y1,x2,y2) {					\
257340e3fbdSmrg	S3_OUTW(MULTIFUNC_CNTL, SCISSORS_T | (y1));			\
258340e3fbdSmrg	S3_OUTW(MULTIFUNC_CNTL, SCISSORS_L | (x1));			\
259340e3fbdSmrg	S3_OUTW(MULTIFUNC_CNTL, SCISSORS_R | (x2));			\
260340e3fbdSmrg	S3_OUTW(MULTIFUNC_CNTL, SCISSORS_B | (y2));			\
261340e3fbdSmrg	}
262340e3fbdSmrg
263340e3fbdSmrg#define SET_MULT_MISC(val)	S3_OUTW(MULTIFUNC_CNTL, MULT_MISC | (val))
264340e3fbdSmrg
265340e3fbdSmrg#define SET_COLOR_CMP(color)	S3_OUTW32(COLOR_CMP, color)
266340e3fbdSmrg
267340e3fbdSmrg#define SET_PIX_TRANS_W(val)	S3_OUTW(PIX_TRANS, val)
268340e3fbdSmrg
269340e3fbdSmrg#define SET_PIX_TRANS_L(val)	outl(PIX_TRANS, val)
270340e3fbdSmrg
271340e3fbdSmrg#define SET_ERR_TERM(err)	S3_OUTW(ERR_TERM, err)
272340e3fbdSmrg#define SET_ERR_TERM2(err)	S3_OUTW(ERR_TERM2, err)
273340e3fbdSmrg
274340e3fbdSmrg#define SET_MAJ_AXIS_PCNT(maj)	S3_OUTW(MAJ_AXIS_PCNT, maj)
275340e3fbdSmrg#endif
276340e3fbdSmrg
277340e3fbdSmrg
278340e3fbdSmrg#endif /* _S3_REG_H */
279