534 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			534 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright 1999 SuSE, Inc.
 | |
|  *
 | |
|  * 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 SuSE not be used in advertising or
 | |
|  * publicity pertaining to distribution of the software without specific,
 | |
|  * written prior permission.  SuSE makes no representations about the
 | |
|  * suitability of this software for any purpose.  It is provided "as is"
 | |
|  * without express or implied warranty.
 | |
|  *
 | |
|  * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 | |
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
 | |
|  * 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.
 | |
|  *
 | |
|  * Author:  Keith Packard, SuSE, Inc.
 | |
|  */
 | |
| 
 | |
| #ifndef _S3_H_
 | |
| #define _S3_H_
 | |
| 
 | |
| #include "kdrive.h"
 | |
| #include "s3reg.h"
 | |
| 
 | |
| /* 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 */
 | |
| #if 0
 | |
|     VOL16	pix_cntl;		/* 8140 */
 | |
|     VOL16	mult_misc2;		/* 8142 */
 | |
| #else
 | |
|     VOL32	pix_cntl_mult_misc2;	/* 8140 */
 | |
| #endif
 | |
|     VOL32	mult_misc_read_sel;	/* 8144 */
 | |
|     VOL32	alt_pcnt;		/* 8148 min_axis_pcnt, maj_axis_pcnt */
 | |
|     VOL8	_pad3a[0x1c];		/* 814c */
 | |
|     VOL32	global_bitmap_1;	/* 8168 */
 | |
|     VOL32	global_bitmap_2;	/* 816c */
 | |
|     VOL32	primary_bitmap_1;	/* 8170 */
 | |
|     VOL32	primary_bitmap_2;	/* 8174 */
 | |
|     VOL32	secondary_bitmap_1;	/* 8178 */
 | |
|     VOL32	secondary_bitmap_2;	/* 817c */
 | |
|     VOL32	primary_stream_control;	/* 8180 */
 | |
|     VOL32	chroma_key_control;	/* 8184 */
 | |
|     VOL32	genlocking_control;	/* 8188 */
 | |
|     VOL8	_pad3b[0x4];		/* 818c */
 | |
|     VOL32	secondary_stream_control;   /* 8190 */
 | |
|     VOL32	chroma_key_upper_bound;	/* 8194 */
 | |
|     VOL32	secondary_stream_h_scale;   /* 8198 */
 | |
|     VOL32	color_adjustment;	/* 819c */
 | |
|     VOL32	blend_control;		/* 81a0 */
 | |
|     VOL8	_pad3c[0x1c];		/* 81a4 */
 | |
|     VOL32	primary_stream_addr_0;	/* 81c0 */
 | |
|     VOL32	primary_stream_addr_1;	/* 81c4 */
 | |
|     VOL32	primary_stream_stride;	/* 81c8 */
 | |
|     VOL32       secondary_stream_mbuf;	/* 81cc */
 | |
|     VOL32       secondary_stream_addr_0;/* 81d0 */
 | |
|     VOL32       secondary_stream_addr_1;/* 81d4 */
 | |
|     VOL32       secondary_stream_stride;/* 81d8 */
 | |
|     VOL8	_pad81dc[4];		/* 81dc */
 | |
|     VOL32       secondary_stream_vscale;/* 81e0 */
 | |
|     VOL32       secondary_stream_vinit;	/* 81e4 */
 | |
|     VOL32       secondary_stream_scount;/* 81e8 */
 | |
|     VOL32       streams_fifo;		/* 81ec */
 | |
|     VOL32       primary_stream_xy;	/* 81f0 */
 | |
|     VOL32       primary_stream_size;	/* 81f4 */
 | |
|     VOL32	secondary_stream_xy;	/* 81f8 */
 | |
|     VOL32	secondary_stream_size;	/* 81fc */
 | |
|     VOL8	_pad8200[0xe8];		/* 8200 */
 | |
|     VOL32	cur_y;			/* 82e8 */
 | |
|     VOL8	_pad4[0x14];		/* 82ec */
 | |
|     VOL32	primary_stream_mem;	/* 8300 */
 | |
|     VOL32	secondary_stream_mem;	/* 8304 */
 | |
|     VOL8	_pad8308[0xD2];		/* 8308 */
 | |
|     VOL8	input_status_1;		/* 83da */
 | |
|     VOL8	_pad83db[0x131];	/* 83db */
 | |
|     VOL32	adv_func_cntl;		/* 850c */
 | |
|     VOL8	_pad8510[0x5dd8];	/* 8510 */
 | |
|     VOL32	pix_trans;		/* e2e8 */
 | |
|     VOL8	_pade2ec[0x3a92c];	/*  e2ec */
 | |
|     VOL32	cmd_overflow_buf_ptr;	/* 48c18 */
 | |
|     VOL8	_pad48c1c[0x8];		/* 48c1c */
 | |
|     VOL32	bci_power_management;	/* 48c24 */
 | |
|     VOL8	_pad48c28[0x38];	/* 48c28 */
 | |
|     VOL32	alt_status_0;		/* 48c60 */
 | |
|     VOL32	alt_status_1;		/* 48c64 */
 | |
| } 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
 | |
| 
 | |
| /* Multifunction Control Misc 8144 */
 | |
| #define MISC_DST_BA_0	(0x0 << 0)
 | |
| #define MISC_DST_BA_1	(0x1 << 0)
 | |
| #define MISC_DST_BA_2	(0x2 << 0)
 | |
| #define MISC_DST_BA_3	(0x3 << 0)
 | |
| #define MISC_SRC_BA_0	(0x0 << 2)
 | |
| #define MISC_SRC_BA_1	(0x1 << 2)
 | |
| #define MISC_SRC_BA_2	(0x2 << 2)
 | |
| #define MISC_SRC_BA_3	(0x3 << 2)
 | |
| #define MISC_RSF	(1 << 4)
 | |
| #define MISC_EXT_CLIP	(1 << 5)
 | |
| #define MISC_SRC_NE	(1 << 7)
 | |
| #define MISC_ENB_CMP	(1 << 8)
 | |
| #define MISC_32B	(1 << 9)
 | |
| #define MISC_DC		(1 << 11)
 | |
| #define MISC_INDEX_E	(0xe << 12)
 | |
| 
 | |
| #define S3_SAVAGE4_SLOTS    0x0001ffff
 | |
| #define S3_SAVAGE4_2DI	    0x00800000
 | |
| 
 | |
| #define _s3WaitLoop(s3,mask,value){ \
 | |
|     int	__loop = 1000000; \
 | |
|     while (((s3)->alt_status_0 & (mask)) != (value)) \
 | |
| 	if (--__loop == 0) { \
 | |
| 	    ErrorF ("savage wait loop failed 0x%x\n", s3->alt_status_0); \
 | |
| 	    break; \
 | |
| 	} \
 | |
| }
 | |
| 
 | |
| #define S3_SAVAGE4_ROOM	    10
 | |
| 
 | |
| #define _s3WaitSlots(s3,n) { \
 | |
|     int __loop = 1000000; \
 | |
|     while (((s3)->alt_status_0 & S3_SAVAGE4_SLOTS) >= S3_SAVAGE4_ROOM-(n)) \
 | |
| 	if (--__loop == 0) { \
 | |
| 	    ErrorF ("savage wait loop failed 0x%x\n", s3->alt_status_0); \
 | |
| 	    break; \
 | |
| 	} \
 | |
| }
 | |
|     
 | |
| #define _s3WaitEmpty(s3)	_s3WaitLoop(s3,S3_SAVAGE4_SLOTS, 0)
 | |
| #define _s3WaitIdleEmpty(s3)	_s3WaitLoop(s3,S3_SAVAGE4_SLOTS|S3_SAVAGE4_2DI, S3_SAVAGE4_2DI)
 | |
| #define _s3WaitIdle(s3)		_s3WaitLoop(s3,S3_SAVAGE4_2DI, S3_SAVAGE4_2DI)
 | |
| 
 | |
| 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;
 | |
| 
 | |
| #define S3_CLOCK_REF	14318	/* KHz */
 | |
| 
 | |
| #define S3_CLOCK(m,n,r)	((S3_CLOCK_REF * ((m) + 2)) / (((n) + 2) * (1 << (r))))
 | |
| 
 | |
| #define S3_MAX_CLOCK	150000	/* KHz */
 | |
| 
 | |
| typedef struct _s3Timing {
 | |
|     /* label */
 | |
|     int		horizontal;
 | |
|     int		vertical;
 | |
|     int		rate;
 | |
|     /* horizontal timing */
 | |
|     int		hfp;	    /* front porch */
 | |
|     int		hbp;	    /* back porch */
 | |
|     int		hblank;	    /* blanking */
 | |
|     /* vertical timing */
 | |
|     int		vfp;	    /* front porch */
 | |
|     int		vbp;	    /* back porch */
 | |
|     int		vblank;	    /* blanking */
 | |
|     /* clock values */
 | |
|     int		dac_m;
 | |
|     int		dac_n;
 | |
|     int		dac_r;
 | |
| } S3Timing;
 | |
| 
 | |
| #define S3_TEXT_SAVE	(64*1024)
 | |
| 
 | |
| 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;
 | |
|     CARD32		global_bitmap_1;
 | |
|     CARD32		global_bitmap_2;
 | |
|     CARD32		adv_func_cntl;
 | |
|     CARD32		primary_bitmap_1;
 | |
|     CARD32		primary_bitmap_2;
 | |
|     CARD32		secondary_bitmap_1;
 | |
|     CARD32		secondary_bitmap_2;
 | |
|     CARD32		primary_stream_control;
 | |
|     CARD32		blend_control;
 | |
|     CARD32		primary_stream_addr_0;
 | |
|     CARD32		primary_stream_addr_1;
 | |
|     CARD32		primary_stream_stride;
 | |
|     CARD32		primary_stream_xy;
 | |
|     CARD32		primary_stream_size;
 | |
|     CARD32		primary_stream_mem;
 | |
|     CARD32		secondary_stream_xy;
 | |
|     CARD32		secondary_stream_size;
 | |
|     CARD32		streams_fifo;
 | |
|     CARD8		text_save[S3_TEXT_SAVE];
 | |
| } 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 */
 | |
|     S3Vga	s3vga;
 | |
|     S3Save	save;
 | |
|     Bool	need_sync;
 | |
|     Bool	bios_initialized;   /* whether the bios has been run */
 | |
| } 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;
 | |
|     CARD32	chroma_key;
 | |
| } S3FBInfo;
 | |
|     
 | |
| typedef struct _s3ScreenInfo {
 | |
|     CARD8	*cursor_base;	    /* pointer to cursor area */
 | |
|     S3Cursor	cursor;
 | |
|     Bool	managing_border;
 | |
|     Bool	use_streams;
 | |
|     int		primary_depth;
 | |
|     int		current_ma;
 | |
|     CARD32	border_pixel;
 | |
|     S3FBInfo	fb[KD_MAX_FB];
 | |
|     RegionRec	region[KD_MAX_FB];
 | |
|     int		fbmap[KD_MAX_FB+1];   /* map from fb to stream */
 | |
| } S3ScreenInfo;
 | |
| 
 | |
| #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);
 | |
| 
 | |
| void	s3DumbCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
 | |
|     
 | |
| 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, int minVco);
 | |
| 
 | |
| 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 DRAW_DEBUG(a)
 | |
| 
 | |
| #define _s3WaitVRetrace(s3vga) { \
 | |
|     int _loop_count; \
 | |
|     _loop_count = 0; \
 | |
|     while (s3GetImm(s3vga, s3_vertical_sync_active) != 0) S3_RETRACE_LOOP_CHECK; \
 | |
|     _loop_count = 0; \
 | |
|     while (s3GetImm(s3vga, s3_vertical_sync_active) == 0) S3_RETRACE_LOOP_CHECK; \
 | |
| }
 | |
| #define _s3WaitVRetraceFast(s3) { \
 | |
|     int _loop_count; \
 | |
|     _loop_count = 0; \
 | |
|     while (s3->input_status_1 & 8) S3_RETRACE_LOOP_CHECK; \
 | |
|     _loop_count = 0; \
 | |
|     while ((s3->input_status_1 & 8) == 0) S3_RETRACE_LOOP_CHECK; \
 | |
| }
 | |
| /*
 | |
|  * Wait for the begining of the retrace interval
 | |
|  */
 | |
| #define _s3WaitVRetraceEnd(s3vga) { \
 | |
|     int _loop_count; \
 | |
|     _loop_count = 0; \
 | |
|     while (s3GetImm(s3vga, s3_vertical_sync_active) == 0) S3_RETRACE_LOOP_CHECK; \
 | |
|     _loop_count = 0; \
 | |
|     while (s3GetImm(s3vga, s3_vertical_sync_active) != 0) S3_RETRACE_LOOP_CHECK; \
 | |
| }
 | |
| 
 | |
| #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_ */
 |