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