newmmio.h revision 340e3fbd
1340e3fbdSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3/newmmio.h,v 1.6 2001/07/02 10:46:04 alanh Exp $ */
2340e3fbdSmrg
3340e3fbdSmrg/*
4340e3fbdSmrg *
5340e3fbdSmrg * Copyright 1995-1997 The XFree86 Project, Inc.
6340e3fbdSmrg *
7340e3fbdSmrg */
8340e3fbdSmrg
9340e3fbdSmrg#ifndef _NEWMMIO_H_
10340e3fbdSmrg#define _NEWMMIO_H_
11340e3fbdSmrg
12340e3fbdSmrg#include <X11/Xmd.h>
13340e3fbdSmrg
14340e3fbdSmrg
15340e3fbdSmrg#define int16	CARD16
16340e3fbdSmrg#define int32	CARD32
17340e3fbdSmrg
18340e3fbdSmrg#define S3_NEWMMIO_VGABASE	(S3_NEWMMIO_REGBASE + 0x8000)
19340e3fbdSmrg
20340e3fbdSmrgtypedef struct { int16 vendor_ID; int16 device_ID; } pci_id;
21340e3fbdSmrgtypedef struct { int16 cmd; int16 devsel; } cmd_devsel;
22340e3fbdSmrg
23340e3fbdSmrgtypedef struct  {
24340e3fbdSmrg        pci_id  pci_ident;
25340e3fbdSmrg        cmd_devsel cmd_device_sel;
26340e3fbdSmrg        int32 class_code;
27340e3fbdSmrg        int32 dummy5;
28340e3fbdSmrg        int32 base0;
29340e3fbdSmrg        char dummy1[0x20-sizeof(int32)];
30340e3fbdSmrg        int32 bios_base;
31340e3fbdSmrg        char dummy2[0x3c - 0x32];
32340e3fbdSmrg} pci_conf_regs;
33340e3fbdSmrg
34340e3fbdSmrg
35340e3fbdSmrgtypedef struct { int16 filler; int16 adv_f_cntl; } adv_f_cntl;
36340e3fbdSmrg
37340e3fbdSmrgtypedef struct {
38340e3fbdSmrg        int32	cur_point;
39340e3fbdSmrg        char    dummy1[4];
40340e3fbdSmrg        int32	dest_stp;
41340e3fbdSmrg        char    dummy2[4];
42340e3fbdSmrg        int32	err_term;
43340e3fbdSmrg        char    dummy3[4];
44340e3fbdSmrg        int32	command;
45340e3fbdSmrg        int32	short_stroke;
46340e3fbdSmrg        int32   bkgd_color;
47340e3fbdSmrg        int32   frgd_color;
48340e3fbdSmrg        int32   wrt_mask;
49340e3fbdSmrg        int32   rd_mask;
50340e3fbdSmrg        int32   color_cmp;
51340e3fbdSmrg        int32	col_mix;
52340e3fbdSmrg        int32	sciss_topleft;
53340e3fbdSmrg        int32	sciss_botright;
54340e3fbdSmrg        int32	pix_mult;
55340e3fbdSmrg        int32	mult_misc;
56340e3fbdSmrg        int32	axis_pcnt;
57340e3fbdSmrg} packed_enhanced_regs;
58340e3fbdSmrg
59340e3fbdSmrgtypedef struct  {
60340e3fbdSmrg        int32  prim_stream_cntl;
61340e3fbdSmrg        int32  col_chroma_key_cntl;
62340e3fbdSmrg        char    dummy1[0x8190 - 0x8184-sizeof(int32)];
63340e3fbdSmrg        int32  second_stream_cntl;
64340e3fbdSmrg        int32  chroma_key_upper_bound;
65340e3fbdSmrg        int32  second_stream_stretch;
66340e3fbdSmrg        char dummy2[0x81a0 - 0x8198-sizeof(int32)];
67340e3fbdSmrg        int32  blend_cntl;
68340e3fbdSmrg        char    dummy3[0x81c0 - 0x81a0-sizeof(int32)];
69340e3fbdSmrg        int32  prim_fbaddr0;
70340e3fbdSmrg        int32  prim_fbaddr1;
71340e3fbdSmrg        int32  prim_stream_stride;
72340e3fbdSmrg        int32  double_buffer;
73340e3fbdSmrg        int32  second_fbaddr0;
74340e3fbdSmrg        int32  second_fbaddr1;
75340e3fbdSmrg        int32  second_stream_stride;
76340e3fbdSmrg        int32  opaq_overlay_cntl;
77340e3fbdSmrg        int32  k1;
78340e3fbdSmrg        int32  k2;
79340e3fbdSmrg        int32  dda_vert;
80340e3fbdSmrg        int32  streams_fifo;
81340e3fbdSmrg        int32  prim_start_coord;
82340e3fbdSmrg        int32  prim_window_size;
83340e3fbdSmrg        int32  second_start_coord;
84340e3fbdSmrg        int32  second_window_size;
85340e3fbdSmrg} streams_proc_regs;
86340e3fbdSmrg
87340e3fbdSmrgtypedef struct { char atr_cntl_ind; char attr_cntl_dat; char misc_out;
88340e3fbdSmrg                 char viseo_enable; } v3c0;
89340e3fbdSmrgtypedef struct { char seq_index; char seq_data; char dac_mask;
90340e3fbdSmrg                      char dac_rd_index; } v3c4;
91340e3fbdSmrgtypedef struct { char dac_wr_index; char dac_data; char feature_cntl;
92340e3fbdSmrg                      char filler; } v3c8;
93340e3fbdSmrgtypedef struct v3cc { char misc_out; char filler; char graph_cntl_index;
94340e3fbdSmrg                      char graph_cntl_data; } v3cc;
95340e3fbdSmrgtypedef struct {
96340e3fbdSmrg        v3c0    v3c0_regs;
97340e3fbdSmrg        v3c4    v3c4_regs;
98340e3fbdSmrg        v3c8    v3c8_regs;
99340e3fbdSmrg        v3cc    v3cc_regs;
100340e3fbdSmrg} vga_3c_regs;
101340e3fbdSmrg
102340e3fbdSmrgtypedef struct { char crt_index; char crt_data; int16 filler; } v3d4;
103340e3fbdSmrgtypedef struct { int16 filler1; char feature_cntl; char filler2;} v3d8;
104340e3fbdSmrg
105340e3fbdSmrgtypedef struct  {
106340e3fbdSmrg        int32   filler;
107340e3fbdSmrg        v3d4    v3d4_regs;
108340e3fbdSmrg        v3d8    v3d8_regs;
109340e3fbdSmrg} vga_3bd_regs ;
110340e3fbdSmrg
111340e3fbdSmrgtypedef struct {
112340e3fbdSmrg                int32	subsystem_csr;
113340e3fbdSmrg		int32	dummy;
114340e3fbdSmrg                adv_f_cntl adv_func_cntl;
115340e3fbdSmrg} subsys_regs;
116340e3fbdSmrg
117340e3fbdSmrg
118340e3fbdSmrgtypedef struct  {
119340e3fbdSmrg        int32	cur_x;
120340e3fbdSmrg        char    filler1[0x8ae8 - 0x86e8 - sizeof(int32)];
121340e3fbdSmrg        int32	dy_axstep;
122340e3fbdSmrg        char    filler2[0x8ee8 - 0x8ae8 - sizeof(int32)];
123340e3fbdSmrg        int32	dx_diastep;
124340e3fbdSmrg        char    filler3[0x92e8 - 0x8ee8 - sizeof(int32)];
125340e3fbdSmrg        int32	line_err;
126340e3fbdSmrg        char    filler33[0x96e8 - 0x92e8 - sizeof(int32)];
127340e3fbdSmrg        int32	mj_ax_pcnt;
128340e3fbdSmrg        char    filler4[0x9ae8 - 0x96e8 - sizeof(int32)];
129340e3fbdSmrg        int32	gp_stat;
130340e3fbdSmrg        char    filler5[0x9ee8 - 0x9ae8 - sizeof(int32)];
131340e3fbdSmrg        int32	stroke_vectrans;
132340e3fbdSmrg        char    filler6[0xa2e8 - 0x9ee8 - sizeof(int32)];
133340e3fbdSmrg        int32  back_color;
134340e3fbdSmrg        char    filler7[0xa6e8 - 0xa2e8 - sizeof(int32)];
135340e3fbdSmrg        int32  fore_col;
136340e3fbdSmrg        char    filler8[0xaae8 - 0xa6e8 - sizeof(int32)];
137340e3fbdSmrg        int32  bitplane_wmask;
138340e3fbdSmrg        char    filler88[0xaee8 - 0xaae8 - sizeof(int32)];
139340e3fbdSmrg        int32  bitplane_rmask;
140340e3fbdSmrg        char    filler9[0xb2e8 - 0xaee8 - sizeof(int32)];
141340e3fbdSmrg        int32  color_compare;
142340e3fbdSmrg        char    filler10[0xb6e8 - 0xb2e8 - sizeof(int32)];
143340e3fbdSmrg        int32	back_mix;
144340e3fbdSmrg        char    filler101[0xbae8 - 0xb6e8 - sizeof(int32)];
145340e3fbdSmrg        int32	fore_mix;
146340e3fbdSmrg        char    filler11[0xbee8 - 0xbae8 - sizeof(int32)];
147340e3fbdSmrg        int32	r_reg_data;
148340e3fbdSmrg        char    filler12[0xe2e8 - 0xbee8 - sizeof(int32)];
149340e3fbdSmrg        int32	pixel_data_transfer;
150340e3fbdSmrg} enhanced_regs;
151340e3fbdSmrg
152340e3fbdSmrgtypedef struct {
153340e3fbdSmrg	int32	lpb_mode;
154340e3fbdSmrg	int32	lpb_fifostat;
155340e3fbdSmrg	int32	lpb_intflags;
156340e3fbdSmrg	int32	lpb_fb0addr;
157340e3fbdSmrg	int32	lpb_fb1addr;
158340e3fbdSmrg	int32	lpb_direct_addr;
159340e3fbdSmrg	int32	lpb_direct_data;
160340e3fbdSmrg	int32	lpb_gpio;
161340e3fbdSmrg	int32	lpb_serial_port;
162340e3fbdSmrg	int32	lpb_input_winsize;
163340e3fbdSmrg	int32	lpb_data_offsets;
164340e3fbdSmrg	int32	lpb_hor_decimctl;
165340e3fbdSmrg	int32	lpb_vert_decimctl;
166340e3fbdSmrg	int32	lpb_line_stride;
167340e3fbdSmrg	int32	lpb_output_fifo;
168340e3fbdSmrg} lpbus_regs;
169340e3fbdSmrg
170340e3fbdSmrgtypedef struct {
171340e3fbdSmrg        int32 img[0x8000/4];
172340e3fbdSmrg        union { pci_conf_regs regs;
173340e3fbdSmrg                char dummy[0x100];
174340e3fbdSmrg        } pci_regs;
175340e3fbdSmrg        union { packed_enhanced_regs regs;
176340e3fbdSmrg                char dummy[0x80];
177340e3fbdSmrg        } pk_enh_regs;
178340e3fbdSmrg        union { streams_proc_regs regs;
179340e3fbdSmrg                char dummy[0x82e8-0x8180];
180340e3fbdSmrg        } streams_regs;
181340e3fbdSmrg        union { int32	cur_y;
182340e3fbdSmrg                char dummy[0x83b0 - 0x82e8];
183340e3fbdSmrg        } cur_y;
184340e3fbdSmrg        union { vga_3bd_regs    regs;
185340e3fbdSmrg                char dummy[0x83c0 - 0x83b0];
186340e3fbdSmrg        } v3b_regs;
187340e3fbdSmrg        union { vga_3c_regs     regs;
188340e3fbdSmrg                char dummy[0x83d0 - 0x83c0];
189340e3fbdSmrg        } v3c_regs;
190340e3fbdSmrg        union { vga_3bd_regs    regs;
191340e3fbdSmrg                char dummy[0x8504 - 0x83d0];
192340e3fbdSmrg        } v3d_regs;
193340e3fbdSmrg        union { subsys_regs     regs;
194340e3fbdSmrg                char dummy[0x86e8 - 0x8504];
195340e3fbdSmrg        } subs_regs;
196340e3fbdSmrg        union { enhanced_regs   regs;
197340e3fbdSmrg                char dummy[0xff00 - 0x86e8];
198340e3fbdSmrg        } enh_regs;
199340e3fbdSmrg        union { lpbus_regs   regs;
200340e3fbdSmrg                char dummy[0xff5c - 0xff00];
201340e3fbdSmrg        } lbp_regs;
202340e3fbdSmrg} mm_trio_regs ;
203340e3fbdSmrg
204340e3fbdSmrg#define mmtr	volatile mm_trio_regs *
205340e3fbdSmrg
206340e3fbdSmrg#define s3MmioMem		(pS3->MMIOBase)
207340e3fbdSmrg
208340e3fbdSmrg#define IMG_TRANS		(((mmtr)s3MmioMem)->img)
209340e3fbdSmrg
210340e3fbdSmrg#define SET_WRT_MASK(msk)	((mmtr)s3MmioMem)->pk_enh_regs.regs.wrt_mask = (msk)
211340e3fbdSmrg#define SET_RD_MASK(msk)	((mmtr)s3MmioMem)->pk_enh_regs.regs.rd_mask  = (msk)
212340e3fbdSmrg#define SET_FRGD_COLOR(col)	((mmtr)s3MmioMem)->pk_enh_regs.regs.frgd_color = (col)
213340e3fbdSmrg#define SET_BKGD_COLOR(col)	((mmtr)s3MmioMem)->pk_enh_regs.regs.bkgd_color = (col)
214340e3fbdSmrg#define SET_COLOR_CMP(col)	((mmtr)s3MmioMem)->pk_enh_regs.regs.color_cmp = (col)
215340e3fbdSmrg#define SET_FRGD_MIX(fmix)	((mmtr)s3MmioMem)->enh_regs.regs.fore_mix = (fmix)
216340e3fbdSmrg#define SET_BKGD_MIX(bmix)	((mmtr)s3MmioMem)->enh_regs.regs.back_mix = (bmix)
217340e3fbdSmrg#define SET_PIX_CNTL(val)	((mmtr)s3MmioMem)->pk_enh_regs.regs.pix_mult = (val) | (MULT_MISC2 << 16)
218340e3fbdSmrg#define SET_MIN_AXIS_PCNT(min)	((mmtr)s3MmioMem)->enh_regs.regs.r_reg_data = (min) & 0xffff
219340e3fbdSmrg#define SET_MAJ_AXIS_PCNT(maj)	((mmtr)s3MmioMem)->enh_regs.regs.mj_ax_pcnt = (maj)
220340e3fbdSmrg#define SET_CURPT(c_x, c_y)	((mmtr)s3MmioMem)->pk_enh_regs.regs.cur_point = ((c_y)&0xffff) | ((c_x) << 16)
221340e3fbdSmrg#define SET_CUR_X(c_x)		((mmtr)s3MmioMem)->enh_regs.regs.cur_x = (c_x)
222340e3fbdSmrg#define SET_CUR_Y(c_y)		((mmtr)s3MmioMem)->cur_y.cur_y = (c_y)
223340e3fbdSmrg#define SET_DESTSTP(x,y)	((mmtr)s3MmioMem)->pk_enh_regs.regs.dest_stp = ((y)&0xffff) | ((x) << 16)
224340e3fbdSmrg#define SET_AXIS_PCNT(maj, min)	((mmtr)s3MmioMem)->pk_enh_regs.regs.axis_pcnt = ((min)&0xffff) | ((maj) << 16)
225340e3fbdSmrg#define SET_CMD(c_d) 		{ mem_barrier(); ((mmtr)s3MmioMem)->pk_enh_regs.regs.command = (c_d); }
226340e3fbdSmrg#define SET_ERR_TERM(e)		((mmtr)s3MmioMem)->pk_enh_regs.regs.err_term = (e)
227340e3fbdSmrg#define SET_SCISSORS(x1,y1,x2,y2) {\
228340e3fbdSmrg				((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft  = ((y1)&0xffff) | ((x1) << 16);\
229340e3fbdSmrg				((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y2)&0xffff) | ((x2) << 16);\
230340e3fbdSmrg				}
231340e3fbdSmrg#define SET_SCISSORS_RB(x,y)	((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y)&0xffff) | ((x) << 16)
232340e3fbdSmrg#define SET_SCISSORS_L(l)	((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft  = ((l) << 16);
233340e3fbdSmrg#define SET_MULT_MISC(val)	((mmtr)s3MmioMem)->pk_enh_regs.regs.mult_misc = (val)
234340e3fbdSmrg
235340e3fbdSmrg
236340e3fbdSmrg/*
237340e3fbdSmrg * reads from GP_STAT
238340e3fbdSmrg */
239340e3fbdSmrg#if !defined(__alpha__)
240340e3fbdSmrg#define INB_GP_STAT() 	((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat) & 0xff)
241340e3fbdSmrg#define INW_GP_STAT() 	((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat))
242340e3fbdSmrg#else
243340e3fbdSmrg#define INB_GP_STAT() 	inb(GP_STAT)
244340e3fbdSmrg#define INW_GP_STAT() 	inw(GP_STAT)
245340e3fbdSmrg#endif
246340e3fbdSmrg
247340e3fbdSmrg#define SET_PIX_TRANS_L(val)	((mmtr)s3MmioMem)->img[0] = (val)
248340e3fbdSmrg#define SET_MIX(b,f)	((mmtr)s3MmioMem)->pk_enh_regs.regs.col_mix = ((b) << 16) | (f)
249340e3fbdSmrg
250340e3fbdSmrg
251340e3fbdSmrg#define WaitQueue(v)					\
252340e3fbdSmrg	if(!(pS3->PCIRetry)) {				\
253340e3fbdSmrg	   mem_barrier();				\
254340e3fbdSmrg	   while(inb(GP_STAT) & (0x0100 >> (v)));	\
255340e3fbdSmrg	}
256340e3fbdSmrg
257340e3fbdSmrg#define CMD_REG_WIDTH  0x200  	/* select 32bit command register */
258340e3fbdSmrg
259340e3fbdSmrg#define WaitQueue16_32(n16,n32) 		\
260340e3fbdSmrg	if((pS3->s3Bpp) <= 2) { WaitQueue(n16); }	\
261340e3fbdSmrg	else { 	WaitQueue(n32); }
262340e3fbdSmrg
263340e3fbdSmrg#endif /* _NEWMMIO_H_ */
264