1340e3fbdSmrg 2340e3fbdSmrg#ifndef _S3_REG_H 3340e3fbdSmrg#define _S3_REG_H 4340e3fbdSmrg 5340e3fbdSmrg#include "compiler.h" 6340e3fbdSmrg 7340e3fbdSmrgextern short s3alu[16]; 8340e3fbdSmrg 9340e3fbdSmrg#define S3_NEWMMIO_REGBASE 0x1000000 /* 16MB */ 10340e3fbdSmrg#define S3_NEWMMIO_REGSIZE 0x10000 /* 64KB */ 11340e3fbdSmrg 12340e3fbdSmrg#define ADVFUNC_CNTL 0x4ae8 13340e3fbdSmrg#define SUBSYS_STAT 0x42e8 14340e3fbdSmrg#define SUBSYS_CNTL 0x42e8 15340e3fbdSmrg#define CUR_Y 0x82e8 16340e3fbdSmrg#define CUR_X 0x86e8 17340e3fbdSmrg#define CUR_Y2 0x82ea 18340e3fbdSmrg#define CUR_X2 0x86ea 19340e3fbdSmrg#define DESTY_AXSTP 0x8ae8 20340e3fbdSmrg#define DESTX_DIASTP 0x8ee8 21340e3fbdSmrg#define DESTY_AXSTP2 0x8aea 22340e3fbdSmrg#define DESTX_DIASTP2 0x8eea 23340e3fbdSmrg#define ERR_TERM 0x92e8 24340e3fbdSmrg#define ERR_TERM2 0x92ea 25340e3fbdSmrg#define MAJ_AXIS_PCNT 0x96e8 26340e3fbdSmrg#define MAJ_AXIS_PCNT2 0x96ea 27340e3fbdSmrg#define GP_STAT 0x9ae8 28340e3fbdSmrg#define CMD 0x9ae8 29340e3fbdSmrg#define CMD2 0x9aea 30340e3fbdSmrg#define BKGD_COLOR 0xa2e8 31340e3fbdSmrg#define FRGD_COLOR 0xa6e8 32340e3fbdSmrg#define WRT_MASK 0xaae8 33340e3fbdSmrg#define RD_MASK 0xaee8 34340e3fbdSmrg#define COLOR_CMP 0xb2e8 35340e3fbdSmrg#define BKGD_MIX 0xb6e8 36340e3fbdSmrg#define FRGD_MIX 0xbae8 37340e3fbdSmrg#define MULTIFUNC_CNTL 0xbee8 38340e3fbdSmrg#define PIX_TRANS 0xe2e8 39340e3fbdSmrg#define PIX_TRANS_EXT 0xe2ea 40340e3fbdSmrg 41340e3fbdSmrg/* Graphics Processor Status Register */ 42340e3fbdSmrg#define GPBUSY 0x0200 43340e3fbdSmrg 44340e3fbdSmrg/* Command Register */ 45340e3fbdSmrg#define CMD_NOP 0x0000 46340e3fbdSmrg#define CMD_LINE 0x2000 47340e3fbdSmrg#define CMD_RECT 0x4000 48340e3fbdSmrg#define CMD_RECTV1 0x6000 49340e3fbdSmrg#define CMD_RECTV2 0x8000 50340e3fbdSmrg#define CMD_LINEAF 0xa000 51340e3fbdSmrg#define CMD_BITBLT 0xc000 52340e3fbdSmrg#define CMD_PFILL 0xe000 53340e3fbdSmrg#define CMD_OP_MSK 0xf000 54340e3fbdSmrg#define BYTSEQ 0x1000 55340e3fbdSmrg#define _16BIT 0x0200 56340e3fbdSmrg#define _32BIT 0x0400 57340e3fbdSmrg#define PCDATA 0x0100 58340e3fbdSmrg#define INC_Y 0x0080 59340e3fbdSmrg#define YMAJAXIS 0x0040 60340e3fbdSmrg#define INC_X 0x0020 61340e3fbdSmrg#define DRAW 0x0010 62340e3fbdSmrg#define LINETYPE 0x0008 63340e3fbdSmrg#define LASTPIX 0x0004 64340e3fbdSmrg#define PLANAR 0x0002 65340e3fbdSmrg#define WRTDATA 0x0001 66340e3fbdSmrg 67340e3fbdSmrg 68340e3fbdSmrg/* Background Mix Register */ 69340e3fbdSmrg#define BSS_BKGDCOL 0x0000 70340e3fbdSmrg#define BSS_FRGDCOL 0x0020 71340e3fbdSmrg#define BSS_PCDATA 0x0040 72340e3fbdSmrg#define BSS_BITBLT 0x0060 73340e3fbdSmrg 74340e3fbdSmrg/* Foreground Mix Register */ 75340e3fbdSmrg#define FSS_BKGDCOL 0x0000 76340e3fbdSmrg#define FSS_FRGDCOL 0x0020 77340e3fbdSmrg#define FSS_PCDATA 0x0040 78340e3fbdSmrg#define FSS_BITBLT 0x0060 79340e3fbdSmrg 80340e3fbdSmrg#define PIX_CNTL 0xa000 81340e3fbdSmrg#define MIN_AXIS_PCNT 0x0000 82340e3fbdSmrg 83340e3fbdSmrg/* Pixel Control Register */ 84340e3fbdSmrg#define MIXSEL_EXPPC 0x0080 85340e3fbdSmrg 86340e3fbdSmrg#define SCISSORS_T 0x1000 87340e3fbdSmrg#define SCISSORS_L 0x2000 88340e3fbdSmrg#define SCISSORS_B 0x3000 89340e3fbdSmrg#define SCISSORS_R 0x4000 90340e3fbdSmrg#define MULT_MISC2 0xd000 91340e3fbdSmrg#define MULT_MISC 0xe000 92340e3fbdSmrg 93340e3fbdSmrg 94340e3fbdSmrg#define MIX_MASK 0x001f 95340e3fbdSmrg 96340e3fbdSmrg#define MIX_NOT_DST 0x0000 97340e3fbdSmrg#define MIX_0 0x0001 98340e3fbdSmrg#define MIX_1 0x0002 99340e3fbdSmrg#define MIX_DST 0x0003 100340e3fbdSmrg#define MIX_NOT_SRC 0x0004 101340e3fbdSmrg#define MIX_XOR 0x0005 102340e3fbdSmrg#define MIX_XNOR 0x0006 103340e3fbdSmrg#define MIX_SRC 0x0007 104340e3fbdSmrg#define MIX_NAND 0x0008 105340e3fbdSmrg#define MIX_NOT_SRC_OR_DST 0x0009 106340e3fbdSmrg#define MIX_SRC_OR_NOT_DST 0x000a 107340e3fbdSmrg#define MIX_OR 0x000b 108340e3fbdSmrg#define MIX_AND 0x000c 109340e3fbdSmrg#define MIX_SRC_AND_NOT_DST 0x000d 110340e3fbdSmrg#define MIX_NOT_SRC_AND_DST 0x000e 111340e3fbdSmrg#define MIX_NOR 0x000f 112340e3fbdSmrg 113340e3fbdSmrg#define MIX_MIN 0x0010 114340e3fbdSmrg#define MIX_DST_MINUS_SRC 0x0011 115340e3fbdSmrg#define MIX_SRC_MINUS_DST 0x0012 116340e3fbdSmrg#define MIX_PLUS 0x0013 117340e3fbdSmrg#define MIX_MAX 0x0014 118340e3fbdSmrg#define MIX_HALF__DST_MINUS_SRC 0x0015 119340e3fbdSmrg#define MIX_HALF__SRC_MINUS_DST 0x0016 120340e3fbdSmrg#define MIX_AVERAGE 0x0017 121340e3fbdSmrg#define MIX_DST_MINUS_SRC_SAT 0x0018 122340e3fbdSmrg#define MIX_SRC_MINUS_DST_SAT 0x001a 123340e3fbdSmrg#define MIX_HALF__DST_MINUS_SRC_SAT 0x001c 124340e3fbdSmrg#define MIX_HALF__SRC_MINUS_DST_SAT 0x001e 125340e3fbdSmrg#define MIX_AVERAGE_SAT 0x001f 126340e3fbdSmrg 127340e3fbdSmrg/* 128340e3fbdSmrg * Short Stroke Vector Transfer Register (The angular Defs also apply to 129340e3fbdSmrgthe 130340e3fbdSmrg * Command Register 131340e3fbdSmrg */ 132340e3fbdSmrg#define VECDIR_000 0x0000 133340e3fbdSmrg#define VECDIR_045 0x0020 134340e3fbdSmrg#define VECDIR_090 0x0040 135340e3fbdSmrg#define VECDIR_135 0x0060 136340e3fbdSmrg#define VECDIR_180 0x0080 137340e3fbdSmrg#define VECDIR_225 0x00a0 138340e3fbdSmrg#define VECDIR_270 0x00c0 139340e3fbdSmrg#define VECDIR_315 0x00e0 140340e3fbdSmrg#define SSVDRAW 0x0010 141340e3fbdSmrg 142bd35f0dbSahoka/* 143bd35f0dbSahoka * Some values for Streams FIFO. 144bd35f0dbSahoka * primary stream threshold | secondary stream threshold | 145bd35f0dbSahoka * secondary stream slots (can be 0, 8, 12, 16, 24) from 24 total 146bd35f0dbSahoka */ 147bd35f0dbSahoka#define FIFO_PS0_SS24 (0 << 10) | (12 << 5) | 24 148bd35f0dbSahoka#define FIFO_PS8_SS16 (8 << 10) | (12 << 5) | 16 149bd35f0dbSahoka#define FIFO_PS12_SS12 (6 << 10) | (8 << 5) | 12 150bd35f0dbSahoka#define FIFO_PS16_SS8 (8 << 10) | (4 << 5) | 8 151bd35f0dbSahoka#define FIFO_PS24_SS0 (12 << 10) | (0 << 5) | 0 152340e3fbdSmrg 153340e3fbdSmrg#define S3_OUTW(p,n) outw(p, n) 154340e3fbdSmrg#define S3_OUTL(p,n) outl(p, n) 155340e3fbdSmrg#define S3_OUTW32(p,n) if (pS3->s3Bpp > 2) { \ 156340e3fbdSmrg outw(p, n); \ 157340e3fbdSmrg outw(p, (n) >> 16); \ 158340e3fbdSmrg } else outw(p, n) 159340e3fbdSmrg 160340e3fbdSmrg 161340e3fbdSmrg#define WaitIdle() do { \ 162340e3fbdSmrg mem_barrier(); \ 163340e3fbdSmrg while(inw(GP_STAT) & GPBUSY); \ 164340e3fbdSmrg } while(0) 165340e3fbdSmrg 166bd35f0dbSahoka#define WaitVSync() { \ 167bd35f0dbSahoka while (inb(0x3da) & 8); \ 168bd35f0dbSahoka while (!(inb(0x3da) & 8)); \ 169bd35f0dbSahoka} 170340e3fbdSmrg 171340e3fbdSmrg#ifdef S3_NEWMMIO 172340e3fbdSmrg#include "newmmio.h" 173340e3fbdSmrg 174340e3fbdSmrg/* 175340e3fbdSmrg * streams regs 176340e3fbdSmrg */ 177340e3fbdSmrg#define SET_BLEND_CNTL(val) ((mmtr)s3MmioMem)->streams_regs.regs.blend_cntl = (val) 178340e3fbdSmrg#define SET_PSTREAM_CNTL(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_stream_cntl = (val) 179bd35f0dbSahoka#define SET_PSTREAM_FBADDR0(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_fbaddr0 = (val) 180bd35f0dbSahoka#define SET_PSTREAM_FBADDR1(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_fbaddr1 = (val) 181340e3fbdSmrg#define SET_PSTREAM_STRIDE(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_stream_stride = (val) 182340e3fbdSmrg#define SET_PSTREAM_START(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_start_coord = (val) 183340e3fbdSmrg#define SET_PSTREAM_WIND(val) ((mmtr)s3MmioMem)->streams_regs.regs.prim_window_size = (val) 184340e3fbdSmrg#define SET_SSTREAM_CNTL(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_cntl = (val) 185340e3fbdSmrg#define SET_SSTRETCH(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_stretch = (val) 186bd35f0dbSahoka#define SET_SSTREAM_FBADDR0(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_fbaddr0 = (val) 187bd35f0dbSahoka#define SET_SSTREAM_FBADDR1(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_fbaddr1 = (val) 188340e3fbdSmrg#define SET_SSTREAM_STRIDE(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_stream_stride = (val) 189340e3fbdSmrg#define SET_SSTREAM_START(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_start_coord = (val) 190340e3fbdSmrg#define SET_SSTREAM_WIND(val) ((mmtr)s3MmioMem)->streams_regs.regs.second_window_size = (val) 191340e3fbdSmrg#define SET_K1_VSCALE(val) ((mmtr)s3MmioMem)->streams_regs.regs.k1 = (val) 192340e3fbdSmrg#define SET_K2_VSCALE(val) ((mmtr)s3MmioMem)->streams_regs.regs.k2 = (val) 193340e3fbdSmrg#define SET_DDA_VERT(val) ((mmtr)s3MmioMem)->streams_regs.regs.dda_vert = (val) 194340e3fbdSmrg#define SET_CHROMA_KEY(val) ((mmtr)s3MmioMem)->streams_regs.regs.col_chroma_key_cntl = (val) 195340e3fbdSmrg#define SET_DOUBLE_BUFFER(val) ((mmtr)s3MmioMem)->streams_regs.regs.double_buffer = (val) 196340e3fbdSmrg#define SET_OPAQUE_OVERLAY(val) ((mmtr)s3MmioMem)->streams_regs.regs.opaq_overlay_cntl = (val) 197bd35f0dbSahoka#define SET_FIFO_CNTL(val) ((mmtr)s3MmioMem)->streams_regs.regs.streams_fifo = (val) 198340e3fbdSmrg 199340e3fbdSmrg#else 200340e3fbdSmrg 201340e3fbdSmrg#define CMD_REG_WIDTH 0x0000 202340e3fbdSmrg 203340e3fbdSmrg#define WaitQueue(n) do { \ 204340e3fbdSmrg mem_barrier(); \ 205340e3fbdSmrg while(inb(GP_STAT) & (0x0100 >> (n))); \ 206340e3fbdSmrg } while (0) 207340e3fbdSmrg 208340e3fbdSmrg#define WaitQueue16_32(n16,n32) \ 209340e3fbdSmrg if (pS3->s3Bpp <= 2) { \ 210340e3fbdSmrg WaitQueue(n16); \ 211340e3fbdSmrg } else { \ 212340e3fbdSmrg WaitQueue(n32); \ 213340e3fbdSmrg } 214340e3fbdSmrg 215340e3fbdSmrg#define VerticalRetraceWait() \ 216340e3fbdSmrg { \ 217340e3fbdSmrg outb(vgaCRIndex, 0x17); \ 218340e3fbdSmrg if (inb(vgaCRReg) & 0x80) { \ 219340e3fbdSmrg while ((inb(vgaCRIndex-4+0x0a) & 0x08) == 0x00); \ 220340e3fbdSmrg while ((inb(vgaCRIndex-4+0x0a) & 0x08) == 0x08); \ 221340e3fbdSmrg } \ 222340e3fbdSmrg } 223340e3fbdSmrg 224340e3fbdSmrg/* accel commands */ 225340e3fbdSmrg 226340e3fbdSmrg#define SET_PIX_CNTL(val) S3_OUTW(MULTIFUNC_CNTL, PIX_CNTL | (val)) 227340e3fbdSmrg 228340e3fbdSmrg#define SET_FRGD_COLOR(col) S3_OUTW32(FRGD_COLOR, col) 229340e3fbdSmrg#define SET_BKGD_COLOR(col) S3_OUTW32(BKGD_COLOR, col) 230340e3fbdSmrg 231340e3fbdSmrg#define SET_FRGD_MIX(fmix) S3_OUTW(FRGD_MIX, (fmix)) 232340e3fbdSmrg#define SET_WRT_MASK(mask) S3_OUTW32(WRT_MASK, mask) 233340e3fbdSmrg 234340e3fbdSmrg#define SET_CUR_X(cur_x) S3_OUTW(CUR_X, cur_x) 235340e3fbdSmrg#define SET_CUR_Y(cur_y) S3_OUTW(CUR_Y, cur_y) 236340e3fbdSmrg#define SET_CUR_X2(cur_x) S3_OUTW(CUR_X2, cur_x) 237340e3fbdSmrg#define SET_CUR_Y2(cur_y) S3_OUTW(CUR_Y2, cur_y) 238340e3fbdSmrg 239340e3fbdSmrg#define SET_CURPT(cur_x, cur_y) { \ 240340e3fbdSmrg SET_CUR_X(cur_x); \ 241340e3fbdSmrg SET_CUR_Y(cur_y); \ 242340e3fbdSmrg } 243340e3fbdSmrg 244340e3fbdSmrg#define SET_DESTSTP(x,y) { \ 245340e3fbdSmrg S3_OUTW(DESTX_DIASTP, x); \ 246340e3fbdSmrg S3_OUTW(DESTY_AXSTP, y); \ 247340e3fbdSmrg } 248340e3fbdSmrg 249340e3fbdSmrg#define SET_AXIS_PCNT(maj, min) { \ 250340e3fbdSmrg S3_OUTW(MAJ_AXIS_PCNT, maj); \ 251340e3fbdSmrg S3_OUTW(MULTIFUNC_CNTL, MIN_AXIS_PCNT | (min)); \ 252340e3fbdSmrg } 253340e3fbdSmrg 254340e3fbdSmrg#define SET_CMD(cmd) S3_OUTW(CMD, cmd) 255340e3fbdSmrg 256340e3fbdSmrg#define SET_SCISSORS(x1,y1,x2,y2) { \ 257340e3fbdSmrg S3_OUTW(MULTIFUNC_CNTL, SCISSORS_T | (y1)); \ 258340e3fbdSmrg S3_OUTW(MULTIFUNC_CNTL, SCISSORS_L | (x1)); \ 259340e3fbdSmrg S3_OUTW(MULTIFUNC_CNTL, SCISSORS_R | (x2)); \ 260340e3fbdSmrg S3_OUTW(MULTIFUNC_CNTL, SCISSORS_B | (y2)); \ 261340e3fbdSmrg } 262340e3fbdSmrg 263340e3fbdSmrg#define SET_MULT_MISC(val) S3_OUTW(MULTIFUNC_CNTL, MULT_MISC | (val)) 264340e3fbdSmrg 265340e3fbdSmrg#define SET_COLOR_CMP(color) S3_OUTW32(COLOR_CMP, color) 266340e3fbdSmrg 267340e3fbdSmrg#define SET_PIX_TRANS_W(val) S3_OUTW(PIX_TRANS, val) 268340e3fbdSmrg 269340e3fbdSmrg#define SET_PIX_TRANS_L(val) outl(PIX_TRANS, val) 270340e3fbdSmrg 271340e3fbdSmrg#define SET_ERR_TERM(err) S3_OUTW(ERR_TERM, err) 272340e3fbdSmrg#define SET_ERR_TERM2(err) S3_OUTW(ERR_TERM2, err) 273340e3fbdSmrg 274340e3fbdSmrg#define SET_MAJ_AXIS_PCNT(maj) S3_OUTW(MAJ_AXIS_PCNT, maj) 275340e3fbdSmrg#endif 276340e3fbdSmrg 277340e3fbdSmrg 278340e3fbdSmrg#endif /* _S3_REG_H */ 279