176888252Smrg#ifndef __LG_XAA_H
276888252Smrg#define __LG_XAA_H
376888252Smrg
476888252Smrg/*
576888252Smrg * XAA acceleration for CL-GD546x -- The Laugna family
676888252Smrg *
776888252Smrg * lg_xaa.h
876888252Smrg *
976888252Smrg * (c) 1996,1998 Corin Anderson.
1076888252Smrg *               corina@the4cs.com
1176888252Smrg *               Tukwila, WA
1276888252Smrg *
1376888252Smrg * This header file draws much from the file cir_blitLG.h in version 3.3.3
1476888252Smrg * of XFree86.
1576888252Smrg */
1676888252Smrg
170814a2baSmrg/* This header file defines the necessary structures, constants, and
1876888252Smrg   variables for using the bitBLT engine on a Laguna family graphics
1976888252Smrg   accelerator.  */
2076888252Smrg
2176888252Smrg
2276888252Smrgenum {						/* Offsets into MMIO space for bitBLT regs */
2376888252Smrg	STATUS			= 0x0400,
2476888252Smrg	OP0_opRDRAM		= 0x0520,
2576888252Smrg	OP1_opRDRAM		= 0x0540,
2676888252Smrg	OP2_opRDRAM		= 0x0560,
2776888252Smrg	OP0_opMRDRAM	= 0x0524,
2876888252Smrg	OP1_opMRDRAM	= 0x0544,
2976888252Smrg	OP2_opMRDRAM	= 0x0564,
3076888252Smrg	OP0_opSRAM		= 0x0528,
3176888252Smrg	OP1_opSRAM		= 0x0548,
3276888252Smrg	OP2_opSRAM		= 0x0568,
3376888252Smrg	OP1_opMSRAM		= 0x054A,
3476888252Smrg	OP2_opMSRAM		= 0x056A,
3576888252Smrg	DRAWDEF			= 0x0584,
3676888252Smrg	BLTDEF			= 0x0586,
3776888252Smrg	BLTEXT_EX		= 0x0700,
3876888252Smrg	MBLTEXT_EX		= 0x0720,
3976888252Smrg	MONOQW			= 0x0588,
4076888252Smrg	QFREE			= 0x0404,
4176888252Smrg	PATOFF			= 0x052A,
4276888252Smrg	HOSTDATA		= 0x0800,
4376888252Smrg	OP_opBGCOLOR	= 0x05E4,
4476888252Smrg	OP_opFGCOLOR	= 0x05E0,
4576888252Smrg	bltCONTROL		= 0x0402,
4676888252Smrg	BITMASK			= 0x05E8
4776888252Smrg};
4876888252Smrg
4976888252Smrgenum { HOSTDATASIZE = 2048 };	/* The HOSTDATA port is 2048 BYTES */
5076888252Smrg
5176888252Smrgenum {						/* OR these together to form a bitBLT mode */
5276888252Smrg	HOST2SCR		= 0x1120,	/* CPU/Screen transfer modes */
5376888252Smrg	SCR2HOST		= 0x2010,
5476888252Smrg	HOST2PAT		= 0x1102,
5576888252Smrg	HOST2SRAM2		= 0x6020,	/* CPU to SRAM2 transfer */
5676888252Smrg
5776888252Smrg	SCR2SCR			= 0x1110,	/* Screen/Screen transfers */
5876888252Smrg	COLORSRC		= 0x0000,	/* Source is color data */
5976888252Smrg	MONOSRC			= 0x0040,	/* Source is mono data (color expansion) */
6076888252Smrg	COLORTRANS		= 0x0001,	/* Transparent screen/screen transfer */
6176888252Smrg	MONOTRANS		= 0x0005,	/* Transparent screen/screen color expansion */
6276888252Smrg	COLORFILL		= 0x0070,	/* Solid color fill mode */
6376888252Smrg	SRAM1SCR2SCR	= 0x1180,	/* Pattern fill, source from SRAM1 */
6476888252Smrg
6576888252Smrg	PAT2SCR			= 0x1109,	/* Pattern/Screen transfers */
6676888252Smrg	COLORPAT		= 0x0000,	/* Pattern is color data */
6776888252Smrg	MONOPAT			= 0x0004,	/* Pattern is mono data (color expansion) */
6876888252Smrg	SRAM2PAT2SCR	= 0x1108,	/* SRAM2 is pattern source */
6976888252Smrg
7076888252Smrg  PATeqSRC   = 0x0800,      /* The Pattern and Source operands are the same */
7176888252Smrg								/* Advice from Corey:  don't ever try to use
7276888252Smrg								   this option!  8)  There's a documented bug
7376888252Smrg								   with it on the '62, and, well, I have
7476888252Smrg								   empirical evidence that either the bug's
7576888252Smrg								   still around, even in the '64 and the '65.
7676888252Smrg								   It's a performance option, anyway, so not
7776888252Smrg								   using it should be okay. */
7876888252Smrg
7976888252Smrg
8076888252Smrg	BLITUP			= 0x8000	/* The blit is proceeding from bottom to top */
8176888252Smrg};
8276888252Smrg
8376888252Smrgenum {						/* Select transparency compare */
8476888252Smrg	TRANSBG			= 0x0100,
8576888252Smrg	TRANSFG			= 0x0300,
8676888252Smrg	TRANSEQ			= 0x0100,
8776888252Smrg	TRANSNE			= 0x0300,
8876888252Smrg	TRANSNONE		= 0x0000
8976888252Smrg};
9076888252Smrg
9176888252Smrg#define LgREADY() ((memrb(STATUS) & 0x07) == 0x00)
9276888252Smrg
9376888252Smrg#define LgSETROP(rop)  memww(DRAWDEF,rop);
9476888252Smrg
9576888252Smrg#define LgSETTRANSPARENCY(trans) \
9676888252Smrg  memww(DRAWDEF,(trans) | (memrw(DRAWDEF) & 0x00FF));
9776888252Smrg
9876888252Smrg#define LgSETMODE(mode)  memww(BLTDEF,mode);
9976888252Smrg
10076888252Smrg#define LgSETDSTXY(X, Y)  memwl(OP0_opRDRAM, (((Y) << 16) | (X)));
10176888252Smrg
10276888252Smrg#define LgSETSRCXY(X, Y)  memwl(OP1_opRDRAM, (((Y) << 16) | (X)));
10376888252Smrg
10476888252Smrg#define LgSETPATXY(X, Y)  memwl(OP2_opRDRAM, (((Y) << 16) | (X)));
10576888252Smrg
10676888252Smrg#define LgSETTRANSMASK(X, Y) LgSETPATXY(X, Y)
10776888252Smrg
10876888252Smrg#define LgSETSRAMDST(offset)  memww(OP0_opSRAM, offset);
10976888252Smrg
11076888252Smrg/* was this a bug? it read OP2_opSRAM */
11176888252Smrg#define LgSETSRAM1OFFSET(offset)  memww(OP1_opSRAM, offset);
11276888252Smrg
11376888252Smrg#define LgSETSRAM2OFFSET(offset)  memww(OP2_opSRAM, offset);
11476888252Smrg
11576888252Smrg#define LgSETMSRAM1OFFSET(offset) memww(OP1_opMSRAM, offset);
11676888252Smrg
11776888252Smrg#define LgSETMSRAM2OFFSET(offset) memww(OP2_opMSRAM, offset);
11876888252Smrg
11976888252Smrg#define LgSETMDSTXY(X, Y)  memwl(OP0_opMRDRAM, (((Y) << 16) | (X)));
12076888252Smrg
12176888252Smrg#define LgSETMSRCXY(X, Y)  memwl(OP1_opMRDRAM, (((Y) << 16) | (X)));
12276888252Smrg
12376888252Smrg#define LgSETMPATXY(X, Y)  memwl(OP2_opMRDRAM, (((Y) << 16) | (X)));
12476888252Smrg
12576888252Smrg#define LgSETMTRANSMASK(X, Y) LgSETMPATXY(X, Y)
12676888252Smrg
12776888252Smrg#define LgSETPHASE0(phase)  memwl( OP0_opRDRAM, phase);
12876888252Smrg
12976888252Smrg#define LgSETPHASE1(phase)  memwl(OP1_opRDRAM, phase);
13076888252Smrg
13176888252Smrg#define LgSETPHASE2(phase)  memwl( OP2_opRDRAM, phase);
13276888252Smrg
13376888252Smrg#define LgSETMPHASE0(phase)  memwl(OP0_opMRDRAM, phase);
13476888252Smrg
13576888252Smrg#define LgSETMPHASE1(phase)  memwl(OP1_opMRDRAM, phase);
13676888252Smrg
13776888252Smrg#define LgSETEXTENTS(width, height)  \
13876888252Smrg           memwl(BLTEXT_EX, (((height) << 16)|(width)));
13976888252Smrg
14076888252Smrg#if 0
14176888252Smrg#define LgSETMEXTENTS(width, height)  \
14276888252Smrg  memwl(MBLTEXT_EX, (((height) << 16)|(width)));
14376888252Smrg#else
14476888252Smrg/* For monochrome (byte) blits, we need to set how many QWORDs of data
14576888252Smrg   encompass the X extent.  Write this piece of data into MONOQW. */
14676888252Smrg#define LgSETMEXTENTS(width, height)  \
14776888252Smrg	{ \
14876888252Smrg    memww(MONOQW, ((width + 7) >> 3));  \
14976888252Smrg    memwl(MBLTEXT_EX, (((height) << 16)|(width)));  \
15076888252Smrg	}
15176888252Smrg
15276888252Smrg#define LgSETMEXTENTSNOMONOQW(width, height)  \
15376888252Smrg  memwl(MBLTEXT_EX, (((height) << 16)|(width)));
15476888252Smrg
15576888252Smrg/*
15676888252Smrg    memww(MBLTEXT_EX, height);
15776888252Smrg    memww(MBLTEXT_EX + 2, width);
15876888252Smrg */
15976888252Smrg#endif
16076888252Smrg
16176888252Smrg#define LgHOSTDATAWRITE(data)  memwl(HOSTDATA, data);
16276888252Smrg
16376888252Smrg#define LgHOSTDATAREAD()   (memrl(HOSTDATA))
16476888252Smrg
16576888252Smrg#define LgSETBACKGROUND(color)  memwl(OP_opBGCOLOR, color);
16676888252Smrg
16776888252Smrg#define LgSETFOREGROUND(color)   memwl(OP_opFGCOLOR, color);
16876888252Smrg
16976888252Smrg#define LgSETPATOFF(xoff, yoff)  memww(PATOFF, (((yoff) << 8) | (xoff)));
17076888252Smrg
17176888252Smrg#define LgSETSWIZZLE() memww(bltCONTROL, memrw(bltCONTROL | 0x0400));
17276888252Smrg
17376888252Smrg#define LgCLEARSWIZZLE() memww(bltCONTROL, memrw(bltCONTROL & ~0x0400));
17476888252Smrg
17576888252Smrg#define LgSETBITMASK(m) memwl(BITMASK, m);
17676888252Smrg
17776888252Smrg
17876888252Smrg
17976888252Smrg#endif  /* __LG_XAA_H */
180