1201 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1201 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 1999 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that
 | |
|  * copyright notice and this permission notice appear in supporting
 | |
|  * documentation, and that the name of Keith Packard not be used in
 | |
|  * advertising or publicity pertaining to distribution of the software without
 | |
|  * specific, written prior permission.  Keith Packard makes no
 | |
|  * representations about the suitability of this software for any purpose.  It
 | |
|  * is provided "as is" without express or implied warranty.
 | |
|  *
 | |
|  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | |
|  * PERFORMANCE OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #ifndef _S3_H_
 | |
| #define _S3_H_
 | |
| 
 | |
| #include "kdrive.h"
 | |
| 
 | |
| #define PLATFORM 300
 | |
| 
 | |
| #define DRAW_DEBUG(a)
 | |
| 
 | |
| #define DEBUG_S3INIT	(DEBUG_ACCEL)
 | |
| #define DEBUG_CRTC	(DEBUG_ACCEL+1)
 | |
| #define DEBUG_PATTERN	(DEBUG_ACCEL+2)
 | |
| #define DEBUG_RECT	(DEBUG_ACCEL+3)
 | |
| #define DEBUG_PAINT_WINDOW	(DEBUG_ACCEL+4)
 | |
| #define DEBUG_SET	(DEBUG_ACCEL+5)
 | |
| #define DEBUG_RENDER	(DEBUG_ACCEL+6)
 | |
| #define DEBUG_REGISTERS	(DEBUG_ACCEL+7)
 | |
| #define DEBUG_ARCS	(DEBUG_ACCEL+8)
 | |
| #define DEBUG_TEXT	(DEBUG_ACCEL+9)
 | |
| #define DEBUG_POLYGON	(DEBUG_ACCEL+10)
 | |
| #define DEBUG_CLIP	(DEBUG_ACCEL+11)
 | |
| 
 | |
| /* VESA Approved Register Definitions */
 | |
| 
 | |
| /*
 | |
|  *  Linear Addressing		000 0000 - 0ff ffff (16m)
 | |
|  *  Image data transfer		100 0000 - 100 7fff (32k)
 | |
|  *  PCI config			100 8000 - 100 8043
 | |
|  *  Packed enhanced regs	100 8100 - 100 814a
 | |
|  *  Streams regs		100 8180 - 100 81ff
 | |
|  *  Current Y pos		100 82e8
 | |
|  *  CRT VGA 3b? regs		100 83b0 - 100 83bf
 | |
|  *  CRT VGA 3c? regs		100 83c0 - 100 83cf
 | |
|  *  CRT VGA 3d? regs		100 83d0 - 100 83df
 | |
|  *  Subsystem status (42e8h)	100 8504
 | |
|  *  Advanced function (42e8h)	100 850c
 | |
|  *  Enhanced regs		100 86e8 - 100 eeea
 | |
|  *  Local peripheral bus	100 ff00 - 100 ff5c
 | |
|  *
 | |
|  * We don't care about the image transfer or PCI regs, so
 | |
|  * this structure starts at the packed enhanced regs
 | |
|  */
 | |
|     
 | |
| typedef volatile CARD32 VOL32;
 | |
| typedef volatile CARD16 VOL16;
 | |
| typedef volatile CARD8 VOL8;
 | |
| 
 | |
| typedef volatile struct _s3 {
 | |
|     VOL32	alt_curxy;		/* 8100 */
 | |
|     VOL32	_pad0;			/* 8104 */
 | |
|     VOL32	alt_step;		/* 8108 */
 | |
|     VOL32	_pad1;			/* 810c */
 | |
|     VOL32	err_term;		/* 8110 */
 | |
|     VOL32	_pad2;			/* 8114 */
 | |
|     VOL32	cmd_gp_stat; 		/* 8118 */
 | |
|     VOL32	short_stroke;		/* 811c */
 | |
|     VOL32	bg;			/* 8120 */
 | |
|     VOL32	fg;			/* 8124 */
 | |
|     VOL32	write_mask;		/* 8128 */
 | |
|     VOL32	read_mask;		/* 812c */
 | |
|     VOL32	color_cmp;		/* 8130 */
 | |
|     VOL32	alt_mix;		/* 8134 */
 | |
|     VOL32	scissors_tl;		/* 8138 */
 | |
|     VOL32	scissors_br;		/* 813c */
 | |
|     VOL32	pix_cntl_mult_misc2;	/* 8140 */
 | |
|     VOL32	mult_misc_read_sel;	/* 8144 */
 | |
|     VOL32	alt_pcnt;		/* 8148 min_axis_pcnt, maj_axis_pcnt */
 | |
|     VOL8	_pad3[0x19c];		/* 814c */
 | |
|     VOL16	cur_y;			/* 82e8 */
 | |
|     VOL8	_pad4[0xc6];		/* 82ea */
 | |
|     
 | |
|     VOL8	crt_vga_3b0;		/* 83b0 */
 | |
|     VOL8	crt_vga_3b1;		/* 83b1 */
 | |
|     VOL8	crt_vga_3b2;		/* 83b2 */
 | |
|     VOL8	crt_vga_3b3;		/* 83b3 */
 | |
|     VOL8	crt_vga_3b4;		/* 83b4 */
 | |
|     VOL8	crt_vga_3b5;		/* 83b5 */
 | |
|     VOL8	crt_vga_3b6;		/* 83b6 */
 | |
|     VOL8	crt_vga_3b7;    	/* 83b7 */
 | |
|     VOL8	crt_vga_3b8;    	/* 83b8 */
 | |
|     VOL8	crt_vga_3b9;    	/* 83b9 */
 | |
|     VOL8	crt_vga_3ba;		/* 83ba */
 | |
|     VOL8	crt_vga_3bb;		/* 83bb */
 | |
|     VOL8	crt_vga_3bc;		/* 83bc */
 | |
|     VOL8	crt_vga_3bd;		/* 83bd */
 | |
|     VOL8	crt_vga_3be;		/* 83be */
 | |
|     VOL8	crt_vga_3bf;		/* 83bf */
 | |
|     
 | |
|     VOL8	crt_vga_3c0;		/* 83c0 */
 | |
|     VOL8	crt_vga_3c1;		/* 83c1 */
 | |
|     VOL8	crt_vga_3c2;		/* 83c2 */
 | |
|     VOL8	crt_vga_3c3;		/* 83c3 */
 | |
|     VOL8	crt_vga_3c4;		/* 83c4 */
 | |
|     VOL8	crt_vga_3c5;		/* 83c5 */
 | |
|     VOL8	crt_vga_dac_ad_mk;	/* 83c6 */
 | |
|     VOL8	crt_vga_dac_rd_ad;    	/* 83c7 */
 | |
|     VOL8	crt_vga_dac_wt_ad;    	/* 83c8 */
 | |
|     VOL8	crt_vga_dac_data;    	/* 83c9 */
 | |
|     VOL8	crt_vga_3ca;		/* 83ca */
 | |
|     VOL8	crt_vga_3cb;		/* 83cb */
 | |
|     VOL8	crt_vga_3cc;		/* 83cc */
 | |
|     VOL8	crt_vga_3cd;		/* 83cd */
 | |
|     VOL8	crt_vga_3ce;		/* 83ce */
 | |
|     VOL8	crt_vga_3cf;		/* 83cf */
 | |
|     
 | |
|     VOL8	crt_vga_3d0;		/* 83d0 */
 | |
|     VOL8	crt_vga_3d1;		/* 83d1 */
 | |
|     VOL8	crt_vga_3d2;		/* 83d2 */
 | |
|     VOL8	crt_vga_3d3;		/* 83d3 */
 | |
|     VOL8	crt_vga_3d4;		/* 83d4 */
 | |
|     VOL8	crt_vga_3d5;		/* 83d5 */
 | |
|     VOL8	crt_vga_3d6;		/* 83d6 */
 | |
|     VOL8	crt_vga_3d7;    	/* 83d7 */
 | |
|     VOL8	crt_vga_3d8;    	/* 83d8 */
 | |
|     VOL8	crt_vga_3d9;    	/* 83d9 */
 | |
|     VOL8	crt_vga_status_1;    	/* 83da */
 | |
|     VOL8	crt_vga_3db;		/* 83db */
 | |
|     VOL8	crt_vga_3dc;		/* 83dc */
 | |
|     VOL8	crt_vga_3dd;		/* 83dd */
 | |
|     VOL8	crt_vga_3de;		/* 83de */
 | |
|     VOL8	crt_vga_3df;		/* 83df */
 | |
|     
 | |
|     VOL8	_pad5[0x124];		/* 83e0 */
 | |
|     VOL16	subsys_status;		/* 8504 */
 | |
|     VOL8	_pad6[0x6];		/* 8506 */
 | |
|     VOL16	adv_control;		/* 850c */
 | |
|     VOL8	_pad7[0x1da];		/* 850e */
 | |
|     VOL16	cur_x;			/* 86e8 */
 | |
|     VOL8	_pad8[0x3fe];		/* 86ea */
 | |
|     VOL16	desty_axstp;		/* 8ae8 */
 | |
|     VOL8	_pad9[0x3fe];		/* 8aea */
 | |
|     VOL16	destx_diastp;		/* 8ee8 */
 | |
|     VOL8	_pad10[0x3fe];		/* 8eea */
 | |
|     VOL16	enh_err_term;		/* 92e8 */
 | |
|     VOL8	_pad11[0x3fe];		/* 92ea */
 | |
|     VOL16	maj_axis_pcnt;		/* 96e8 */
 | |
|     VOL8	_pad12[0x3fe];		/* 96ea */
 | |
|     VOL16	enh_cmd_gp_stat;    	/* 9ae8 */
 | |
|     VOL8	_pad13[0x3fe];		/* 9aea */
 | |
|     VOL16	enh_short_stroke;    	/* 9ee8 */
 | |
|     VOL8	_pad14[0x3fe];		/* 9eea */
 | |
|     VOL16	enh_bg;			/* a2e8 */
 | |
|     VOL8	_pad15[0x3fe];		/* a2ea */
 | |
|     VOL16	enh_fg;			/* a6e8 */
 | |
|     VOL8	_pad16[0x3fe];		/* a6ea */
 | |
|     VOL16	enh_wrt_mask;		/* aae8 */
 | |
|     VOL8	_pad17[0x3fe];		/* aaea */
 | |
|     VOL16	enh_rd_mask;	    	/* aee8 */
 | |
|     VOL8	_pad18[0x3fe];		/* aeea */
 | |
|     VOL16	enh_color_cmp;		/* b2e8 */
 | |
|     VOL8	_pad19[0x3fe];		/* b2ea */
 | |
|     VOL16	enh_bg_mix;    		/* b6e8 */
 | |
|     VOL8	_pad20[0x3fe];		/* b6ea */
 | |
|     VOL16	enh_fg_mix;    		/* bae8 */
 | |
|     VOL8	_pad21[0x3fe];		/* baea */
 | |
|     VOL16	enh_rd_reg_dt;		/* bee8 */
 | |
|     VOL8	_pad22[0x23fe];		/* beea */
 | |
|     VOL32	pix_trans;		/* e2e8 */
 | |
| } S3, *S3Ptr;
 | |
| 
 | |
| #define VGA_STATUS_1_DTM    0x01
 | |
| #define VGA_STATUS_1_VSY    0x08
 | |
| 
 | |
| #define	DAC_MASK	0x03c6
 | |
| #define	DAC_R_INDEX	0x03c7
 | |
| #define	DAC_W_INDEX	0x03c8
 | |
| #define	DAC_DATA	0x03c9
 | |
| #define	DISP_STAT	0x02e8
 | |
| #define	H_TOTAL		0x02e8
 | |
| #define	H_DISP		0x06e8
 | |
| #define	H_SYNC_STRT	0x0ae8
 | |
| #define	H_SYNC_WID	0x0ee8
 | |
| #define	V_TOTAL		0x12e8
 | |
| #define	V_DISP		0x16e8
 | |
| #define	V_SYNC_STRT	0x1ae8
 | |
| #define	V_SYNC_WID	0x1ee8
 | |
| #define	DISP_CNTL	0x22e8
 | |
| #define	ADVFUNC_CNTL	0x4ae8
 | |
| #define	SUBSYS_STAT	0x42e8
 | |
| #define	SUBSYS_CNTL	0x42e8
 | |
| #define	ROM_PAGE_SEL	0x46e8
 | |
| #define	CUR_Y		0x82e8
 | |
| #define	CUR_X		0x86e8
 | |
| #define	DESTY_AXSTP	0x8ae8
 | |
| #define	DESTX_DIASTP	0x8ee8
 | |
| #define	ERR_TERM	0x92e8
 | |
| #define	MAJ_AXIS_PCNT	0x96e8
 | |
| #define	GP_STAT		0x9ae8
 | |
| #define	CMD		0x9ae8
 | |
| #define	SHORT_STROKE	0x9ee8
 | |
| #define	BKGD_COLOR	0xa2e8
 | |
| #define	FRGD_COLOR	0xa6e8
 | |
| #define	WRT_MASK	0xaae8
 | |
| #define	RD_MASK		0xaee8
 | |
| #define	COLOR_CMP	0xb2e8
 | |
| #define	BKGD_MIX	0xb6e8
 | |
| #define	FRGD_MIX	0xbae8
 | |
| #define	MULTIFUNC_CNTL	0xbee8
 | |
| #define	MIN_AXIS_PCNT	0x0000
 | |
| #define	SCISSORS_T	0x1000
 | |
| #define	SCISSORS_L	0x2000
 | |
| #define	SCISSORS_B	0x3000
 | |
| #define	SCISSORS_R	0x4000
 | |
| #define	MEM_CNTL	0x5000
 | |
| #define	PATTERN_L	0x8000
 | |
| #define	PATTERN_H	0x9000
 | |
| #define	PIX_CNTL	0xa000
 | |
| #define CONTROL_MISC2	0xd000
 | |
| #define	PIX_TRANS	0xe2e8
 | |
| 
 | |
| /* Advanced Function Control Regsiter */
 | |
| #define	CLKSEL		0x0004
 | |
| #define	DISABPASSTHRU	0x0001
 | |
| 
 | |
| /* Graphics Processor Status Register */
 | |
| 
 | |
| #define GPNSLOT		13
 | |
| 
 | |
| #define GPBUSY_1	0x0080
 | |
| #define GPBUSY_2	0x0040
 | |
| #define GPBUSY_3	0x0020
 | |
| #define GPBUSY_4	0x0010
 | |
| #define GPBUSY_5	0x0008
 | |
| #define GPBUSY_6	0x0004
 | |
| #define GPBUSY_7	0x0002
 | |
| #define GPBUSY_8	0x0001
 | |
| #define GPBUSY_9	0x8000
 | |
| #define GPBUSY_10	0x4000
 | |
| #define GPBUSY_11	0x2000
 | |
| #define GPBUSY_12	0x1000
 | |
| #define GPBUSY_13	0x0800
 | |
| 
 | |
| #define GPEMPTY		0x0400
 | |
| #define	GPBUSY		0x0200
 | |
| #define	DATDRDY		0x0100
 | |
| 
 | |
| /* Command Register */
 | |
| #define	CMD_NOP		0x0000
 | |
| #define	CMD_LINE	0x2000
 | |
| #define	CMD_RECT	0x4000
 | |
| #define	CMD_RECTV1	0x6000
 | |
| #define	CMD_RECTV2	0x8000
 | |
| #define	CMD_LINEAF	0xa000
 | |
| #define	CMD_BITBLT	0xc000
 | |
| #define CMD_PATBLT	0xe000
 | |
| #define	CMD_OP_MSK	0xe000
 | |
| #define	BYTSEQ		0x1000
 | |
| #define _32BITNOPAD	0x0600
 | |
| #define _32BIT		0x0400
 | |
| #define	_16BIT		0x0200
 | |
| #define _8BIT		0x0000
 | |
| #define	PCDATA		0x0100
 | |
| #define	INC_Y		0x0080
 | |
| #define	YMAJAXIS	0x0040
 | |
| #define	INC_X		0x0020
 | |
| #define	DRAW		0x0010
 | |
| #define	LINETYPE	0x0008
 | |
| #define	LASTPIX		0x0004	    /* Draw last pixel in line */
 | |
| #define	PLANAR		0x0002
 | |
| #define	WRTDATA		0x0001
 | |
| 
 | |
| /* Background Mix Register */
 | |
| #define	BSS_BKGDCOL	0x0000
 | |
| #define	BSS_FRGDCOL	0x0020
 | |
| #define	BSS_PCDATA	0x0040
 | |
| #define	BSS_BITBLT	0x0060
 | |
| 
 | |
| /* Foreground Mix Register */
 | |
| #define	FSS_BKGDCOL	0x0000
 | |
| #define	FSS_FRGDCOL	0x0020
 | |
| #define	FSS_PCDATA	0x0040
 | |
| #define	FSS_BITBLT	0x0060
 | |
| 
 | |
| /* The Mixes */
 | |
| #define	MIX_MASK			0x001f
 | |
| 
 | |
| #define	MIX_NOT_DST			0x0000
 | |
| #define	MIX_0				0x0001
 | |
| #define	MIX_1				0x0002
 | |
| #define	MIX_DST				0x0003
 | |
| #define	MIX_NOT_SRC			0x0004
 | |
| #define	MIX_XOR				0x0005
 | |
| #define	MIX_XNOR			0x0006
 | |
| #define	MIX_SRC				0x0007
 | |
| #define	MIX_NAND			0x0008
 | |
| #define	MIX_NOT_SRC_OR_DST		0x0009
 | |
| #define	MIX_SRC_OR_NOT_DST		0x000a
 | |
| #define	MIX_OR				0x000b
 | |
| #define	MIX_AND				0x000c
 | |
| #define	MIX_SRC_AND_NOT_DST		0x000d
 | |
| #define	MIX_NOT_SRC_AND_DST		0x000e
 | |
| #define	MIX_NOR				0x000f
 | |
| 
 | |
| #define	MIX_MIN				0x0010
 | |
| #define	MIX_DST_MINUS_SRC		0x0011
 | |
| #define	MIX_SRC_MINUS_DST		0x0012
 | |
| #define	MIX_PLUS			0x0013
 | |
| #define	MIX_MAX				0x0014
 | |
| #define	MIX_HALF__DST_MINUS_SRC		0x0015
 | |
| #define	MIX_HALF__SRC_MINUS_DST		0x0016
 | |
| #define	MIX_AVERAGE			0x0017
 | |
| #define	MIX_DST_MINUS_SRC_SAT		0x0018
 | |
| #define	MIX_SRC_MINUS_DST_SAT		0x001a
 | |
| #define	MIX_HALF__DST_MINUS_SRC_SAT	0x001c
 | |
| #define	MIX_HALF__SRC_MINUS_DST_SAT	0x001e
 | |
| #define	MIX_AVERAGE_SAT			0x001f
 | |
| 
 | |
| /* Pixel Control Register */
 | |
| #define	MIXSEL_FRGDMIX	0x0000
 | |
| #define	MIXSEL_PATT	0x0040
 | |
| #define	MIXSEL_EXPPC	0x0080
 | |
| #define	MIXSEL_EXPBLT	0x00c0
 | |
| #define COLCMPOP_F	0x0000
 | |
| #define COLCMPOP_T	0x0008
 | |
| #define COLCMPOP_GE	0x0010
 | |
| #define COLCMPOP_LT	0x0018
 | |
| #define COLCMPOP_NE	0x0020
 | |
| #define COLCMPOP_EQ	0x0028
 | |
| #define COLCMPOP_LE	0x0030
 | |
| #define COLCMPOP_GT	0x0038
 | |
| #define	PLANEMODE	0x0004
 | |
| 
 | |
| #define FIFO_SLOTS	13
 | |
| 
 | |
| #define GPSLOT(n)   (1 << ((n) > 8 ? (15 - ((n) - 9)) : (8 - (n))))
 | |
| 
 | |
| /* Wait for n slots to become available */
 | |
| #if 0
 | |
| #define _s3WaitSlots(s3,n) { \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitSlots 0x%x %d", (s3)->cmd_gp_stat, n)); \
 | |
|     while (((s3)->cmd_gp_stat & GPSLOT(n)) != 0); \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "  s3 0x%x %d slots ready", (s3)->cmd_gp_stat, n)); \
 | |
| }
 | |
| #else
 | |
| /* let PCI retries solve this problem */
 | |
| #define _s3WaitSlots(s3,n)
 | |
| #endif
 | |
| 
 | |
| /* Wait until queue is empty */
 | |
| #define _s3WaitEmpty(s3) { \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitEmpty 0x%x", (s3)->cmd_gp_stat)); \
 | |
|     while (!((s3)->cmd_gp_stat & GPEMPTY)) ; \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "  s3 empty")); \
 | |
| }
 | |
| 
 | |
| /* Wait until GP is idle and queue is empty */
 | |
| #define	_s3WaitIdleEmpty(s3) { \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitIdleEmpty 0x%x", (s3)->cmd_gp_stat)); \
 | |
|     while (((s3)->cmd_gp_stat & (GPBUSY|GPEMPTY)) != GPEMPTY) ; \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "  s3 idle empty")); \
 | |
| }
 | |
| 
 | |
| /* Wait until GP is idle */
 | |
| #define _s3WaitIdle(s3) { \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitIdle 0x%x", (s3)->cmd_gp_stat)); \
 | |
|     while ((s3)->cmd_gp_stat & GPBUSY) ; \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "  s3 idle")); \
 | |
| }
 | |
| 
 | |
| typedef struct _s3Cursor {
 | |
|     int		width, height;
 | |
|     int		xhot, yhot;
 | |
|     Bool	has_cursor;
 | |
|     CursorPtr	pCursor;
 | |
|     Pixel	source, mask;
 | |
| } S3Cursor;
 | |
| 
 | |
| typedef struct _s3PatternCache {
 | |
|     int		id;
 | |
|     int		x, y;
 | |
| } S3PatternCache;
 | |
| 
 | |
| typedef struct _s3Patterns {
 | |
|     S3PatternCache	*cache;
 | |
|     int			ncache;
 | |
|     int			last_used;
 | |
|     int			last_id;
 | |
| } S3Patterns;
 | |
| 
 | |
| typedef struct _crtc {
 | |
|     CARD8   h_total_0_7;			    /* CR0 */
 | |
|     CARD8   h_display_end_0_7;			    /* CR1 */
 | |
|     CARD8   h_blank_start_0_7;			    /* CR2 */
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _h_blank_end_0_4  	    : 5;
 | |
| 	    CARD8   _display_skew	    : 2;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _h_blank_end_s;
 | |
| 	CARD8   __h_blank_end;			    /* CR3 */
 | |
|     } _h_blank_end_u;
 | |
| #define h_blank_end_0_4 _h_blank_end_u._h_blank_end_s._h_blank_end_0_4
 | |
| #define display_skew	_h_blank_end_u._h_blank_end_s._display_skew
 | |
| #define _h_blank_end	_h_blank_end_u.__h_blank_end
 | |
|     
 | |
|     CARD8   h_sync_start_0_7;			    /* CR4 */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _h_sync_end_0_4    	    : 5;
 | |
| 	    CARD8   _horizontal_skew	    : 2;
 | |
| 	    CARD8   _h_blank_end_5	    : 1;
 | |
| 	} _h_sync_end_s;
 | |
|         CARD8   __h_sync_end;			    /* CR5 */
 | |
|     } _h_sync_end_u;
 | |
| 
 | |
| #define h_sync_end_0_4	_h_sync_end_u._h_sync_end_s._h_sync_end_0_4
 | |
| #define horizontal_skew	_h_sync_end_u._h_sync_end_s._horizontal_skew
 | |
| #define h_blank_end_5	_h_sync_end_u._h_sync_end_s._h_blank_end_5
 | |
| #define _h_sync_end	_h_sync_end_u.__h_sync_end
 | |
|     
 | |
|     CARD8   v_total_0_7;			    /* CR6 */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _v_total_8		    : 1;
 | |
| 	    CARD8   _v_display_end_8	    : 1;
 | |
| 	    CARD8   _v_retrace_start_8	    : 1;
 | |
| 	    CARD8   _v_blank_start_8	    : 1;
 | |
| 	    CARD8   _line_compare_8	    : 1;
 | |
| 	    CARD8   _v_total_9		    : 1;
 | |
| 	    CARD8   _v_display_end_9	    : 1;
 | |
| 	    CARD8   _v_retrace_start_9	    : 1;
 | |
| 	} _crtc_overflow_s;
 | |
| 	CARD8	_crtc_overflow;			    /* CR7 */
 | |
|     } _crtc_overflow_u;
 | |
| 
 | |
| #define v_total_8	    _crtc_overflow_u._crtc_overflow_s._v_total_8
 | |
| #define v_display_end_8	    _crtc_overflow_u._crtc_overflow_s._v_display_end_8
 | |
| #define v_retrace_start_8   _crtc_overflow_u._crtc_overflow_s._v_retrace_start_8
 | |
| #define v_blank_start_8	    _crtc_overflow_u._crtc_overflow_s._v_blank_start_8
 | |
| #define line_compare_8	    _crtc_overflow_u._crtc_overflow_s._line_compare_8
 | |
| #define v_total_9	    _crtc_overflow_u._crtc_overflow_s._v_total_9
 | |
| #define v_display_end_9	    _crtc_overflow_u._crtc_overflow_s._v_display_end_9
 | |
| #define v_retrace_start_9   _crtc_overflow_u._crtc_overflow_s._v_retrace_start_9
 | |
| #define crtc_overflow	    _crtc_overflow_u._crtc_overflow
 | |
| 
 | |
|     CARD8   preset_row_scan;			    /* CR8 (unused) */
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _max_scan_line	    : 5;
 | |
| 	    CARD8   _v_blank_start_9	    : 1;
 | |
| 	    CARD8   _line_compare_9	    : 1;
 | |
| 	    CARD8   _double_scan		    : 1;
 | |
| 	} _max_scan_line_s;
 | |
| 	CARD8   __max_scan_line;		    /* CR9 */
 | |
|     } _max_scan_line_u;
 | |
| 
 | |
| #define max_scan_line	_max_scan_line_u._max_scan_line_s._max_scan_line
 | |
| #define v_blank_start_9	_max_scan_line_u._max_scan_line_s._v_blank_start_9
 | |
| #define line_compare_9	_max_scan_line_u._max_scan_line_s._line_compare_9
 | |
| #define double_scan	_max_scan_line_u._max_scan_line_s._double_scan
 | |
| #define _max_scan_line	_max_scan_line_u.__max_scan_line
 | |
|     
 | |
|     CARD8   cursor_start;
 | |
|     CARD8   cursor_end;
 | |
| 
 | |
|     CARD8   start_address_8_15;			    /* CRC */
 | |
|     CARD8   start_address_0_7;			    /* CRD */
 | |
| 
 | |
|     CARD8   cursor_loc_high;
 | |
|     CARD8   cursor_loc_low;
 | |
| 
 | |
|     CARD8   v_retrace_start_0_7;		    /* CR10 */
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _v_retrace_end_0_3	    : 4;
 | |
| 	    CARD8   _clear_v_retrace_int	    : 1;
 | |
| 	    CARD8   _disable_v_retrace_int   : 1;
 | |
| 	    CARD8   _refresh_cycle_select    : 1;
 | |
| 	    CARD8   _lock_crtc		    : 1;
 | |
| 	} _v_retrace_end_s;
 | |
| 	CARD8   __v_retrace_end;		    /* CR11 */
 | |
|     } _v_retrace_end_u;
 | |
|     
 | |
| #define v_retrace_end_0_3	_v_retrace_end_u._v_retrace_end_s._v_retrace_end_0_3
 | |
| #define clear_v_retrace_int	_v_retrace_end_u._v_retrace_end_s._clear_v_retrace_int
 | |
| #define disable_v_retrace_int	_v_retrace_end_u._v_retrace_end_s._disable_v_retrace_int
 | |
| #define refresh_cycle_select	_v_retrace_end_u._v_retrace_end_s._refresh_cycle_select
 | |
| #define lock_crtc		_v_retrace_end_u._v_retrace_end_s._lock_crtc
 | |
| #define _v_retrace_end		_v_retrace_end_u.__v_retrace_end
 | |
|     
 | |
|     CARD8   v_display_end_0_7;			    /* CR12 */
 | |
|     
 | |
|     CARD8   screen_off_0_7;			    /* CR13 */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _underline_location	    : 5;
 | |
| 	    CARD8   _count_by_four	    : 1;
 | |
| 	    CARD8   _doubleword_mode	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _underline_location_s;
 | |
| 	CARD8   __underline_location;		    /* CR14 (unused) */
 | |
|     } _underline_location_u;
 | |
| 
 | |
| #define underline_location  _underline_location_u._underline_location_s._underline_location
 | |
| #define count_by_four	    _underline_location_u._underline_location_s._count_by_four
 | |
| #define doubleword_mode	    _underline_location_u._underline_location_s._doubleword_mode
 | |
| #define _underline_location _underline_location_u.__underline_location
 | |
|     
 | |
|     CARD8   v_blank_start_0_7;			    /* CR15 */
 | |
|     CARD8   v_blank_end_0_7;			    /* CR16 */
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _two_bk_cga		    : 1;
 | |
| 	    CARD8   _four_bk_cga	    : 1;
 | |
| 	    CARD8   _v_total_double	    : 1;
 | |
| 	    CARD8   _word_mode		    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _address_wrap	    : 1;
 | |
| 	    CARD8   _byte_mode		    : 1;
 | |
| 	    CARD8   _hardware_reset	    : 1;
 | |
| 	} _crtc_mode_s;
 | |
| 	CARD8   _crtc_mode;			    /* CR17 (unused) */
 | |
|     } _crtc_mode_u;
 | |
| 
 | |
|     CARD8   line_compare_0_7;			    /* CR18 (unused) */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _enable_base_offset	    : 1;
 | |
| 	    CARD8   _enable_two_page	    : 1;
 | |
| 	    CARD8   _enable_vga_16_bit	    : 1;
 | |
| 	    CARD8   _enhanced_mode_mapping   : 1;
 | |
| 	    CARD8   _old_display_start	    : 2;
 | |
| 	    CARD8   _enable_high_speed_text  : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _memory_configuration_s;
 | |
| 	CARD8	_memory_configuration;		    /* CR31 (unused) */
 | |
|     } _memory_configuration_u;
 | |
| 
 | |
| #define memory_configuration	_memory_configuration_u._memory_configuration
 | |
| #define enable_base_offset	_memory_configuration_u._memory_configuration_s._enable_base_offset
 | |
| #define enable_two_page		_memory_configuration_u._memory_configuration_s._enable_two_page
 | |
| #define enable_vga_16_bit	_memory_configuration_u._memory_configuration_s._enable_vga_16_bit
 | |
| #define enhanved_mode_mapping	_memory_configuration_u._memory_configuration_s._enhanced_mode_mapping
 | |
| #define old_display_start	_memory_configuration_u._memory_configuration_s._old_display_start
 | |
| #define enable_high_speed_text	_memory_configuration_u._memory_configuration_s._enable_high_speed_text
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _alt_refresh_count	    : 2;
 | |
| 	    CARD8   _enable_alt_refresh	    : 1;
 | |
| 	    CARD8   _enable_top_memory	    : 1;
 | |
| 	    CARD8   _enable_256_or_more	    : 1;
 | |
| 	    CARD8   _high_speed_text	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _pci_burst_disabled	    : 1;
 | |
| 	} _misc_1_s;
 | |
| 	CARD8	_misc_1;				    /* CR3A */
 | |
|     } _misc_1_u;
 | |
| #define misc_1	_misc_1_u._misc_1
 | |
| #define alt_refresh_count   _misc_1_u._misc_1_s._alt_refresh_count
 | |
| #define enable_alt_refresh  _misc_1_u._misc_1_s._enable_alt_refresh
 | |
| #define enable_top_memory   _misc_1_u._misc_1_s._enable_top_memory
 | |
| #define enable_256_or_more  _misc_1_u._misc_1_s._enable_256_or_more
 | |
| #define high_speed_text	    _misc_1_u._misc_1_s._high_speed_text
 | |
| #define pci_burst_disabled  _misc_1_u._misc_1_s._pci_burst_disabled
 | |
|     
 | |
|     CARD8   h_start_fifo_fetch_0_7;		    /* CR3B */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 5;
 | |
| 	    CARD8 interlace		    : 1;
 | |
| 	    CARD8			    : 2;
 | |
| 	} _mode_control_s;
 | |
| 	CARD8	_mode_control;			    /* CR42 */
 | |
|     } _mode_control_u;
 | |
|     
 | |
| #define mode_control	_mode_control_u._mode_control
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 2;
 | |
| 	    CARD8   _old_screen_off_8	    : 1;
 | |
| 	    CARD8			    : 4;
 | |
| 	    CARD8   h_counter_double_mode   : 1;
 | |
| 	} _extended_mode_s;
 | |
| 	CARD8	_extended_mode;			    /* CR43 (unused) */
 | |
|     } _extended_mode_u;
 | |
|     
 | |
| #define extended_mode	    _extended_mode_u._extended_mode
 | |
| #define old_screen_off_8    _extended_mode_u._extended_mode_s._old_screen_off_8
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _hardware_cursor_enable : 1;
 | |
| 	    CARD8			    : 3;
 | |
| 	    CARD8   _hardware_cursor_right  : 1;
 | |
| 	    CARD8			    : 3;
 | |
| 	} _hardware_cursor_mode_s;
 | |
| 	CARD8	_hardware_cursor_mode;		    /* CR45 */
 | |
|     } _hardware_cursor_mode_u;
 | |
| 
 | |
| #define hardware_cursor_mode	_hardware_cursor_mode_u._hardware_cursor_mode
 | |
| #define hardware_cursor_enable	_hardware_cursor_mode_u._hardware_cursor_mode_s._hardware_cursor_enable
 | |
| 
 | |
|     CARD8   cursor_address_8_15;		    /* CR4C */
 | |
|     CARD8   cursor_address_0_7;			    /* CR4D */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _ge_screen_width_2	    : 1;
 | |
| 	    CARD8			    : 3;
 | |
| 	    CARD8   _pixel_length	    : 2;
 | |
| 	    CARD8   _ge_screen_width_0_1	    : 2;
 | |
| 	} _extended_system_control_1_s;
 | |
| 	CARD8	_extended_system_control_1;	    /* CR50 */
 | |
|     } _extended_system_control_1_u;
 | |
| #define ge_screen_width_2	    _extended_system_control_1_u._extended_system_control_1_s._ge_screen_width_2
 | |
| #define pixel_length		    _extended_system_control_1_u._extended_system_control_1_s._pixel_length
 | |
| #define ge_screen_width_0_1	    _extended_system_control_1_u._extended_system_control_1_s._ge_screen_width_0_1
 | |
| #define extended_system_control_1   _extended_system_control_1_u._extended_system_control_1
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 4;
 | |
| 	    CARD8   _screen_off_8_9	    : 2;
 | |
| 	    CARD8			    : 2;
 | |
| 	} _extended_system_control_2_s;
 | |
| 	CARD8	_extended_system_control_2;	    /* CR51 */
 | |
|     } _extended_system_control_2_u;
 | |
| #define extended_system_control_2   _extended_system_control_2_u._extended_system_control_2
 | |
| #define screen_off_8_9		    _extended_system_control_2_u._extended_system_control_2_s._screen_off_8_9
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   big_endian_linear	    : 2;
 | |
| 	    CARD8   mmio_select		    : 2;
 | |
| 	    CARD8   mmio_window		    : 1;
 | |
| 	    CARD8   swap_nibbles	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _extended_memory_control_s;
 | |
| 	CARD8	_extended_memory_control;	    /* CR53 */
 | |
|     } _extended_memory_control_u;
 | |
| #define extended_memory_control	_extended_memory_control_u._extended_memory_control
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 2;
 | |
| 	    CARD8   _enable_gir		    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _hardware_cursor_ms_x11 : 1;
 | |
| 	    CARD8			    : 2;
 | |
| 	    CARD8   _tri_state_off_vclk	    : 1;
 | |
| 	} _extended_ramdac_control_s;
 | |
| 	CARD8	_extended_ramdac_control;	    /* CR55 */
 | |
|     } _extended_ramdac_control_u;
 | |
| #define extended_ramdac_control	_extended_ramdac_control_u._extended_ramdac_control
 | |
| #define hardware_cursor_ms_x11	_extended_ramdac_control_u._extended_ramdac_control_s._hardware_cursor_ms_x11
 | |
| 
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _h_total_8		    : 1;
 | |
| 	    CARD8   _h_display_end_8	    : 1;
 | |
| 	    CARD8   _h_blank_start_8	    : 1;
 | |
| 	    CARD8   _h_blank_extend	    : 1;    /* extend h_blank by 64 */
 | |
| 	    CARD8   _h_sync_start_8	    : 1;
 | |
| 	    CARD8   _h_sync_extend 	    : 1;    /* extend h_sync by 32 */
 | |
| 	    CARD8   _h_start_fifo_fetch_8    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _extended_horizontal_overflow_s;
 | |
| 	CARD8	_extended_horizontal_overflow;	    /* CR5D */
 | |
|     } _extended_horizontal_overflow_u;
 | |
| #define extended_horizontal_overflow	_extended_horizontal_overflow_u._extended_horizontal_overflow
 | |
| #define h_total_8			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_total_8
 | |
| #define h_display_end_8			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_display_end_8
 | |
| #define h_blank_start_8			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_blank_start_8
 | |
| #define h_blank_extend			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_blank_extend
 | |
| #define h_sync_start_8			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_sync_start_8
 | |
| #define h_sync_extend			_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_sync_extend
 | |
| #define h_start_fifo_fetch_8		_extended_horizontal_overflow_u._extended_horizontal_overflow_s._h_start_fifo_fetch_8
 | |
|     
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _v_total_10		    : 1;
 | |
| 	    CARD8   _v_display_end_10	    : 1;
 | |
| 	    CARD8   _v_blank_start_10	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _v_retrace_start_10	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _line_compare_10	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _extended_vertical_overflow_s;
 | |
| 	CARD8	_extended_vertical_overflow;	    /* CR5E */
 | |
|     } _extended_vertical_overflow_u;
 | |
| #define extended_vertical_overflow  _extended_vertical_overflow_u._extended_vertical_overflow
 | |
| #define v_total_10		    _extended_vertical_overflow_u._extended_vertical_overflow_s._v_total_10
 | |
| #define v_display_end_10	    _extended_vertical_overflow_u._extended_vertical_overflow_s._v_display_end_10
 | |
| #define v_blank_start_10	    _extended_vertical_overflow_u._extended_vertical_overflow_s._v_blank_start_10
 | |
| #define v_retrace_start_10	    _extended_vertical_overflow_u._extended_vertical_overflow_s._v_retrace_start_10
 | |
| #define line_compare_10		    _extended_vertical_overflow_u._extended_vertical_overflow_s._line_compare_10
 | |
|     
 | |
|     
 | |
|     CARD8   l_parm_0_7;				    /* CR62 (undocumented) */
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 3;
 | |
| 	    CARD8   _delay_blank		    : 2;
 | |
| 	    CARD8			    : 3;
 | |
| 	} _extended_misc_control_s;
 | |
| 	CARD8	_extended_misc_control;		    /* CR65 */
 | |
|     } _extended_misc_control_u;
 | |
| #define extended_misc_control	_extended_misc_control_u._extended_misc_control
 | |
| #define delay_blank		_extended_misc_control_u._extended_misc_control_s._delay_blank
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _v_clock_phase	    : 1;
 | |
| 	    CARD8			    : 3;
 | |
| 	    CARD8   _color_mode		    : 4;
 | |
| 	} _extended_misc_control_2_s;
 | |
| 	CARD8	_extended_misc_control_2;	    /* CR67 */
 | |
|     } _extended_misc_control_2_u;
 | |
|     
 | |
| #define v_clock_phase		_extended_misc_control_2_u._extended_misc_control_2_s._v_clock_phase
 | |
| #define color_mode		_extended_misc_control_2_u._extended_misc_control_2_s._color_mode
 | |
| #define extended_misc_control_2	_extended_misc_control_2_u._extended_misc_control_2
 | |
| 
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   cas_oe_str		    : 2;
 | |
| 	    CARD8   ras_low		    : 1;
 | |
| 	    CARD8   ras_precharge	    : 1;
 | |
| 	    CARD8			    : 3;
 | |
| 	    CARD8   _memory_bus_size	    : 1;    /* 0 = 32, 1 = 32/64 */
 | |
| 	} _configuration_3_s;
 | |
| 	CARD8	_configuration_3;		    /* CR68 */
 | |
|     } _configuration_3_u;
 | |
| #define configuration_3    _configuration_3_u._configuration_3
 | |
| #define memory_bus_size	    _configuration_3_u._configuration_3_s._memory_bus_size
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _start_address_16_19    : 4;
 | |
| 	    CARD8			    : 4;
 | |
| 	} _extended_system_control_3_s;
 | |
| 	CARD8   _extended_system_control_3;	    /* CR69 */
 | |
|     } _extended_system_control_3_u;
 | |
| #define extended_system_control_3   _extended_system_control_3_u._extended_system_control_3
 | |
| #define start_address_16_19	    _extended_system_control_3_u._extended_system_control_3_s._start_address_16_19
 | |
|     
 | |
|     CARD8   extended_bios_5;			    /* CR6D */
 | |
| 
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   dot_clock_vclki	    : 1;    /* testing only */
 | |
| 	    CARD8   vclki_with_vafc	    : 1;    /* feature connector */
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   bpp_24_mode		    : 1;    /* 24 bpp mode */
 | |
| 	    CARD8   alt_color_mode	    : 4;    /* feature connector mode */
 | |
| 	} _extended_sequencer_b_s;
 | |
| 	CARD8   _extended_sequencer_b;		    /* SRB */
 | |
|     } _extended_sequencer_b_u;
 | |
|     
 | |
| #define extended_sequencer_b	_extended_sequencer_b_u._extended_sequencer_b
 | |
|     
 | |
|     union extended_sequencer_d_u {
 | |
| 	struct {
 | |
| 	    CARD8   enable_feature  : 1;
 | |
| 	    CARD8   lpb_feature	    : 1;
 | |
| 	    CARD8		    : 2;
 | |
| 	    CARD8   _hsync_control  : 2;
 | |
| 	    CARD8   _vsync_control  : 2;
 | |
| 	} _extended_sequencer_d_s;
 | |
| 	CARD8	_extended_sequencer_d;
 | |
|     } _extended_sequencer_d_u;
 | |
| 
 | |
| #define extended_sequencer_d	_extended_sequencer_d_u._extended_sequencer_d
 | |
| #define hsync_control		_extended_sequencer_d_u._extended_sequencer_d_s._hsync_control
 | |
| #define vsync_control		_extended_sequencer_d_u._extended_sequencer_d_s._vsync_control
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _dclk_pll_n		    : 5;
 | |
| 	    CARD8   _dclk_pll_r		    : 2;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _dclk_value_low_s;
 | |
| 	CARD8	_dclk_value_low;		    /* SR12 */
 | |
|     } _dclk_value_low_u;
 | |
|     
 | |
| #define dclk_value_low	_dclk_value_low_u._dclk_value_low
 | |
| #define dclk_pll_n_trio	_dclk_value_low_u._dclk_value_low_s._dclk_pll_n
 | |
| #define dclk_pll_r_trio	_dclk_value_low_u._dclk_value_low_s._dclk_pll_r
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _dclk_pll_m		    : 7;
 | |
| 	    CARD8			    : 1;
 | |
| 	} _dclk_value_high_s;
 | |
| 	CARD8	_dclk_value_high;		    /* SR13 */
 | |
|     } _dclk_value_high_u;
 | |
| 
 | |
| #define dclk_value_high	_dclk_value_high_u._dclk_value_high
 | |
| #define dclk_pll_m_trio	_dclk_value_high_u._dclk_value_high_s._dclk_pll_m
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _mfrq_en		    : 1;
 | |
| 	    CARD8   _dfrq_en		    : 1;
 | |
| 	    CARD8   _mclk_out		    : 1;
 | |
| 	    CARD8   _vclk_out		    : 1;
 | |
| 	    CARD8   _dclk_over_2	    : 1;
 | |
| 	    CARD8   _clk_load		    : 1;
 | |
| 	    CARD8   _dclk_invert    	    : 1;
 | |
| 	    CARD8   _ena_2_cycle_write	    : 1;
 | |
| 	} _control_2_s;
 | |
| 	CARD8	_control_2;			    /* SR15 */
 | |
|     } _control_2_u;
 | |
| 
 | |
| #define control_2	    _control_2_u._control_2
 | |
| #define mfrq_en		    _control_2_u._control_2_s._mfrq_en
 | |
| #define dfrq_en		    _control_2_u._control_2_s._dfrq_en
 | |
| #define mclk_out	    _control_2_u._control_2_s._mclk_out
 | |
| #define vclk_out	    _control_2_u._control_2_s._vclk_out
 | |
| #define dclk_over_2	    _control_2_u._control_2_s._dclk_over_2
 | |
| #define clk_load	    _control_2_u._control_2_s._clk_load
 | |
| #define dclk_invert	    _control_2_u._control_2_s._dclk_invert
 | |
| #define ena_2_cycle_write   _control_2_u._control_2_s._ena_2_cycle_write
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8			    : 5;
 | |
| 	    CARD8   _dac_power_down	    : 1;
 | |
| 	    CARD8   _lut_write_control	    : 1;
 | |
| 	    CARD8   _enable_clock_double    : 1;
 | |
| 	} _ramdac_control_s;
 | |
| 	CARD8	_ramdac_control;		    /* SR18 */
 | |
|     }  _ramdac_control_u;
 | |
|     
 | |
| #define ramdac_control	    _ramdac_control_u._ramdac_control
 | |
| #define enable_clock_double _ramdac_control_u._ramdac_control_s._enable_clock_double
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _dclk_pll_n		    : 6;
 | |
| 	    CARD8   _dclk_pll_r		    : 2;
 | |
| 	} _dclk_value_low_s;
 | |
| 	CARD8	_dclk_value_low;		    /* SR36 */
 | |
|     } _dclk_value_low_savage_u;
 | |
|     
 | |
| #define dclk_value_low_savage	_dclk_value_low_savage_u._dclk_value_low
 | |
| #define dclk_pll_n_savage_0_5	_dclk_value_low_savage_u._dclk_value_low_s._dclk_pll_n
 | |
| #define dclk_pll_r_savage_0_1	_dclk_value_low_savage_u._dclk_value_low_s._dclk_pll_r
 | |
|     
 | |
|     CARD8   dclk_pll_m0_savage_0_7;		    /* SR37 */
 | |
|     CARD8   dclk_pll_m1_savage_0_7;		    /* SR38 */
 | |
|     
 | |
| 	struct {
 | |
| 	    CARD8   _dclk_pll_m		    : 8;
 | |
| 	} _dclk_value_high_s_savage;
 | |
|     
 | |
|     union {
 | |
| 	struct {
 | |
| 	    CARD8   _dclk_select	    : 1;
 | |
| 	    CARD8			    : 1;
 | |
| 	    CARD8   _dclk_pll_r_2	    : 1;
 | |
| 	    CARD8   _dclk_pll_m_8	    : 1;
 | |
| 	    CARD8   _dclk_pll_n_6	    : 1;
 | |
| 	    CARD8   _pce		    : 1;
 | |
| 	    CARD8   _ccg		    : 1;
 | |
| 	    CARD8   _csp		    : 1;
 | |
| 	} _extended_seq_39_s;
 | |
| 	CARD8	_extended_seq_39;		    /* SR39 */
 | |
|     } _extended_seq_39_u;
 | |
|     
 | |
| #define extended_seq_39		_extended_seq_39_u._extended_seq_39
 | |
| #define dclk_pll_select_savage	_extended_seq_39_u._extended_seq_39_s._dclk_select
 | |
| #define dclk_pll_r_savage_2	_extended_seq_39_u._extended_seq_39_s._dclk_pll_r_2
 | |
| #define dclk_pll_m_savage_8	_extended_seq_39_u._extended_seq_39_s._dclk_pll_m_8
 | |
| #define dclk_pll_n_savage_6	_extended_seq_39_u._extended_seq_39_s._dclk_pll_n_6
 | |
|     
 | |
|     /* computed values */
 | |
|     CARD16	    ge_screen_pitch;
 | |
|     CARD8	    bits_per_pixel;
 | |
|     CARD8	    depth;
 | |
|     CARD8	    double_pixel_mode;
 | |
|     CARD16	    pixel_width;
 | |
| } S3Crtc;
 | |
| 
 | |
| #define crtc_v_total(crtc)    ((crtc)->v_total_0_7 | \
 | |
| 			       ((crtc)->v_total_8 << 8) | \
 | |
| 			       ((crtc)->v_total_9 << 9) | \
 | |
| 			       ((crtc)->v_total_10 << 10))
 | |
|     
 | |
| #define crtc_set_v_total(crtc,v) { \
 | |
|     ((crtc))->v_total_0_7 = (v); \
 | |
|     ((crtc))->v_total_8 = (v) >> 8; \
 | |
|     ((crtc))->v_total_9 = (v) >> 9; \
 | |
|     ((crtc))->v_total_10 = (v) >> 10; \
 | |
| }
 | |
|     
 | |
| #define crtc_v_display_end(crtc) ((crtc)->v_display_end_0_7 | \
 | |
| 				  ((crtc)->v_display_end_8 << 8) | \
 | |
| 				  ((crtc)->v_display_end_9 << 9) | \
 | |
| 				  ((crtc)->v_display_end_10 << 10))
 | |
| 
 | |
| #define crtc_set_v_display_end(crtc,v) {\
 | |
|     ((crtc))->v_display_end_0_7 = (v); \
 | |
|     ((crtc))->v_display_end_8 = (v) >> 8; \
 | |
|     ((crtc))->v_display_end_9 = (v) >> 9; \
 | |
|     ((crtc))->v_display_end_10 = (v) >> 10; \
 | |
| }
 | |
| 
 | |
| #define crtc_v_retrace_start(crtc)  ((crtc)->v_retrace_start_0_7 | \
 | |
| 				     ((crtc)->v_retrace_start_8 << 8) | \
 | |
| 				     ((crtc)->v_retrace_start_9 << 9) | \
 | |
| 				     ((crtc)->v_retrace_start_10 << 10))
 | |
| 
 | |
| #define crtc_set_v_retrace_start(crtc,v) {\
 | |
|     ((crtc))->v_retrace_start_0_7 = (v); \
 | |
|     ((crtc))->v_retrace_start_8 = (v) >> 8; \
 | |
|     ((crtc))->v_retrace_start_9 = (v) >> 9; \
 | |
|     ((crtc))->v_retrace_start_10 = (v) >> 10; \
 | |
| }
 | |
| 
 | |
| #define crtc_v_blank_start(crtc)  ((crtc)->v_blank_start_0_7 | \
 | |
| 				   ((crtc)->v_blank_start_8 << 8) | \
 | |
| 				   ((crtc)->v_blank_start_9 << 9) | \
 | |
| 				   ((crtc)->v_blank_start_10 << 10))
 | |
| 
 | |
| #define crtc_set_v_blank_start(crtc,v) {\
 | |
|     ((crtc))->v_blank_start_0_7 = (v); \
 | |
|     ((crtc))->v_blank_start_8 = (v) >> 8; \
 | |
|     ((crtc))->v_blank_start_9 = (v) >> 9; \
 | |
|     ((crtc))->v_blank_start_10 = (v) >> 10; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_total(crtc) ((crtc)->h_total_0_7 | \
 | |
| 			    ((crtc)->h_total_8 << 8))
 | |
| 
 | |
| #define crtc_set_h_total(crtc,v) {\
 | |
|     ((crtc))->h_total_0_7 = (v); \
 | |
|     ((crtc))->h_total_8 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_display_end(crtc) ((crtc)->h_display_end_0_7 | \
 | |
| 				  ((crtc)->h_display_end_8 << 8))
 | |
| 
 | |
| #define crtc_set_h_display_end(crtc,v) {\
 | |
|     ((crtc))->h_display_end_0_7 = (v); \
 | |
|     ((crtc))->h_display_end_8 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_blank_start(crtc) ((crtc)->h_blank_start_0_7 | \
 | |
| 				  ((crtc)->h_blank_start_8 << 8))
 | |
| 
 | |
| #define crtc_set_h_blank_start(crtc,v) {\
 | |
|     ((crtc))->h_blank_start_0_7 = (v); \
 | |
|     ((crtc))->h_blank_start_8 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_blank_end(crtc)  ((crtc)->h_blank_end_0_4 | \
 | |
| 				 ((crtc)->h_blank_end_5 << 5))
 | |
| 
 | |
| #define crtc_set_h_blank_end(crtc,v) {\
 | |
|     ((crtc))->h_blank_end_0_4 = (v); \
 | |
|     ((crtc))->h_blank_end_5 = (v) >> 5; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_sync_start(crtc) ((crtc)->h_sync_start_0_7 | \
 | |
| 				 ((crtc)->h_sync_start_8 << 8))
 | |
| 
 | |
| #define crtc_set_h_sync_start(crtc,v) {\
 | |
|     ((crtc))->h_sync_start_0_7 = (v); \
 | |
|     ((crtc))->h_sync_start_8 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_sync_end(crtc) ((crtc)->h_sync_end_0_4)
 | |
| 
 | |
| #define crtc_set_h_sync_end(crtc,v) {\
 | |
|     ((crtc))->h_sync_end_0_4 = (v); \
 | |
| }
 | |
| 
 | |
| #define crtc_screen_off(crtc)    ((crtc)->screen_off_0_7 | \
 | |
| 				  (((crtc)->screen_off_8_9 ? \
 | |
| 				    ((crtc))->screen_off_8_9 : \
 | |
| 				    ((crtc))->old_screen_off_8) << 8))
 | |
| 
 | |
| #define crtc_set_screen_off(crtc,v) {\
 | |
|     ((crtc))->screen_off_0_7 = (v); \
 | |
|     ((crtc))->old_screen_off_8 = 0; \
 | |
|     ((crtc))->screen_off_8_9 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_ge_screen_width(crtc) ((crtc)->ge_screen_width_0_1 | \
 | |
| 				    ((crtc)->ge_screen_width_2 << 2))
 | |
| 
 | |
| #define crtc_set_ge_screen_width(crtc,v) { \
 | |
|     (crtc)->ge_screen_width_0_1 = (v); \
 | |
|     (crtc)->ge_screen_width_2 = (v) >> 2; \
 | |
| }
 | |
| 
 | |
| #define crtc_h_start_fifo_fetch(crtc) ((crtc)->h_start_fifo_fetch_0_7 | \
 | |
| 				       ((crtc)->h_start_fifo_fetch_8 << 8))
 | |
| 
 | |
| #define crtc_set_h_start_fifo_fetch(crtc,v) {\
 | |
|     (crtc)->h_start_fifo_fetch_0_7 = (v); \
 | |
|     (crtc)->h_start_fifo_fetch_8 = (v) >> 8; \
 | |
| }
 | |
| 
 | |
| #define crtc_start_address(crtc)    ((crtc)->start_address_0_7 | \
 | |
| 				     ((crtc)->start_address_8_15 << 8) | \
 | |
| 				     ((crtc)->start_address_16_19 << 16))
 | |
| 
 | |
| #define crtc_set_start_address(crtc,v) {\
 | |
|     (crtc)->start_address_0_7 = (v); \
 | |
|     (crtc)->start_address_8_15 = (v) >> 8; \
 | |
|     (crtc)->start_address_16_19 = (v) >> 16; \
 | |
| }
 | |
| 
 | |
| #define crtc_line_compare(crtc)    ((crtc)->line_compare_0_7 | \
 | |
| 				    ((crtc)->line_compare_8 << 8) | \
 | |
| 				    ((crtc)->line_compare_9 << 9) | \
 | |
| 				    ((crtc)->line_compare_10 << 10))
 | |
| 
 | |
| #define crtc_set_line_compare(crtc,v) { \
 | |
|     ((crtc))->line_compare_0_7 = (v); \
 | |
|     ((crtc))->line_compare_8 = (v) >> 8; \
 | |
|     ((crtc))->line_compare_9 = (v) >> 9; \
 | |
|     ((crtc))->line_compare_10 = (v) >> 10; \
 | |
| }
 | |
|     
 | |
| 
 | |
| #define GetCrtc(s3,i)	_s3ReadIndexRegister (&(s3)->crt_vga_3d4, (i))
 | |
| #define PutCrtc(s3,i,v)	_s3WriteIndexRegister (&(s3)->crt_vga_3d4, (i), (v))
 | |
| 
 | |
| #define GetSrtc(s3,i)	_s3ReadIndexRegister (&(s3)->crt_vga_3c4, (i))
 | |
| #define PutSrtc(s3,i,v)	_s3WriteIndexRegister (&(s3)->crt_vga_3c4, (i), (v))
 | |
| 
 | |
| #define S3_CLOCK_REF	14318	/* KHz */
 | |
| 
 | |
| #define S3_CLOCK(m,n,r)	(S3_CLOCK_REF * ((m) + 2) / (((n) + 2) * (1 << (r))))
 | |
| 
 | |
| #if PLATFORM == 200
 | |
| #define S3_MAX_CLOCK	80000	/* KHz */
 | |
| #endif
 | |
| #if PLATFORM == 300
 | |
| #define S3_MAX_CLOCK	135000	/* KHz */
 | |
| #endif
 | |
| 
 | |
| typedef struct _s3Save {
 | |
|     CARD8		cursor_fg;
 | |
|     CARD8		cursor_bg;
 | |
|     CARD8		lock1;
 | |
|     CARD8		lock2;
 | |
|     CARD8		locksrtc;
 | |
|     CARD8		clock_mode;
 | |
|     CARD32		alt_mix;
 | |
|     CARD32		write_mask;
 | |
|     CARD32		fg;
 | |
|     CARD32		bg;
 | |
|     S3Crtc		crtc;
 | |
| } S3Save;
 | |
| 
 | |
| typedef struct _s3CardInfo {
 | |
|     S3Ptr	s3;		    /* pointer to register structure */
 | |
|     int		memory;		    /* amount of memory */
 | |
|     CARD8	*frameBuffer;	    /* pointer to frame buffer */
 | |
|     CARD8	*registers;	    /* pointer to register map */
 | |
|     S3Save	save;
 | |
|     Bool	savage;
 | |
|     Bool	need_sync;
 | |
| } S3CardInfo;
 | |
| 
 | |
| typedef struct _s3FbInfo {
 | |
|     CARD8	*offscreen;	    /* pointer to offscreen area */
 | |
|     int		offscreen_y;	    /* top y coordinate of offscreen area */
 | |
|     int		offscreen_x;	    /* top x coordinate of offscreen area */
 | |
|     int		offscreen_width;    /* width of offscreen area */
 | |
|     int		offscreen_height;   /* height of offscreen area */
 | |
|     S3Patterns	patterns;
 | |
|     CARD32	bitmap_offset;
 | |
|     int		accel_stride;
 | |
|     int		accel_bpp;
 | |
| } S3FBInfo;
 | |
|     
 | |
| typedef struct _s3ScreenInfo {
 | |
|     CARD8	*cursor_base;	    /* pointer to cursor area */
 | |
|     S3Cursor	cursor;
 | |
|     S3FBInfo	fb[1];
 | |
| } S3ScreenInfo;
 | |
| 
 | |
| #define LockS3(s3c)
 | |
| #define UnlockS3(s3c)
 | |
| 
 | |
| #define getS3CardInfo(kd)   ((S3CardInfo *) ((kd)->card->driver))
 | |
| #define s3CardInfo(kd)	    S3CardInfo *s3c = getS3CardInfo(kd)
 | |
| 
 | |
| #define getS3ScreenInfo(kd) ((S3ScreenInfo *) ((kd)->screen->driver))
 | |
| #define s3ScreenInfo(kd)    S3ScreenInfo *s3s = getS3ScreenInfo(kd)
 | |
| 
 | |
| Bool	s3CardInit (KdCardInfo *);
 | |
| Bool	s3ScreenInit (KdScreenInfo *);
 | |
| Bool	s3Enable (ScreenPtr pScreen);
 | |
| void	s3Disable (ScreenPtr pScreen);
 | |
| void	s3Fini (ScreenPtr pScreen);
 | |
| 
 | |
| Bool	s3CursorInit (ScreenPtr pScreen);
 | |
| void	s3CursorEnable (ScreenPtr pScreen);
 | |
| void	s3CursorDisable (ScreenPtr pScreen);
 | |
| void	s3CursorFini (ScreenPtr pScreen);
 | |
| void	s3RecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdefs);
 | |
| 
 | |
| Bool	s3DrawInit (ScreenPtr pScreen);
 | |
| void	s3DrawEnable (ScreenPtr pScreen);
 | |
| void	s3DrawSync (ScreenPtr pScreen);
 | |
| void	s3DrawDisable (ScreenPtr pScreen);
 | |
| void	s3DrawFini (ScreenPtr pScreen);
 | |
| 
 | |
| void	s3GetColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
 | |
| void	s3PutColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
 | |
| 
 | |
| void	S3InitCard (KdCardAttr *attr);
 | |
| 
 | |
| void	s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR);
 | |
| 
 | |
| CARD8	_s3ReadIndexRegister (VOL8 *base, CARD8 index);
 | |
| void	_s3WriteIndexRegister (VOL8 *base, CARD8 index, CARD8 value);
 | |
| 
 | |
| extern KdCardFuncs  s3Funcs;
 | |
| 
 | |
| /*
 | |
|  * Wait for the begining of the retrace interval
 | |
|  */
 | |
| 
 | |
| #define S3_RETRACE_LOOP_CHECK if (++_loop_count > 300000) {\
 | |
|     DRAW_DEBUG ((DEBUG_FAILURE, "S3 wait loop failed at %s:%d", \
 | |
| 		__FILE__, __LINE__)); \
 | |
|     break; \
 | |
| }
 | |
| 
 | |
| #define _s3WaitVRetrace(s3) { \
 | |
|     VOL8  *_status = &s3->crt_vga_status_1; \
 | |
|     int _loop_count; \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitVRetrace 0x%x", *_status)); \
 | |
|     _loop_count = 0; \
 | |
|     while ((*_status & VGA_STATUS_1_VSY) != 0) S3_RETRACE_LOOP_CHECK; \
 | |
|     _loop_count = 0; \
 | |
|     while ((*_status & VGA_STATUS_1_VSY) == 0) S3_RETRACE_LOOP_CHECK; \
 | |
| }
 | |
| /*
 | |
|  * Wait for the begining of the retrace interval
 | |
|  */
 | |
| #define _s3WaitVRetraceEnd(s3) { \
 | |
|     VOL8  *_status = &s3->crt_vga_status_1; \
 | |
|     int _loop_count; \
 | |
|     DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitVRetraceEnd 0x%x", *_status)); \
 | |
|     _loop_count = 0; \
 | |
|     while ((*_status & VGA_STATUS_1_VSY) == 0) S3_RETRACE_LOOP_CHECK; \
 | |
|     _loop_count = 0; \
 | |
|     while ((*_status & VGA_STATUS_1_VSY) != 0) S3_RETRACE_LOOP_CHECK; \
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * This extension register must contain a magic bit pattern to enable
 | |
|  * the remaining extended registers
 | |
|  */
 | |
| 
 | |
| #define _s3UnlockExt(s3)    _s3WriteIndexRegister (&s3->crt_vga_3d4, 0x39, 0xa0)
 | |
| #define _s3LockExt(s3)	    _s3WriteIndexRegister (&s3->crt_vga_3d4, 0x39, 0x00)
 | |
| 
 | |
| #define S3_CURSOR_WIDTH	    64
 | |
| #define S3_CURSOR_HEIGHT    64
 | |
| #define S3_CURSOR_SIZE	    ((S3_CURSOR_WIDTH * S3_CURSOR_HEIGHT + 7) / 8)
 | |
| 
 | |
| #define S3_TILE_SIZE	    8
 | |
| 
 | |
| #endif /* _S3_H_ */
 |