#ifndef _TDFX_FIFO_H_ #define _TDFX_FIFO_H_ typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; typedef int int32; typedef short int16; typedef char int8; #define CMDFIFO_PAGES 64 #define PROPSAREADATA \ volatile int fifoPtr; \ volatile int fifoRead; #define PROPDATASTD \ volatile unsigned int *fifoPtr; \ volatile unsigned int *fifoRead; \ int fifoSlots; \ unsigned int *fifoBase; \ unsigned int *fifoEnd; \ int fifoOffset; \ int fifoSize #define PROPDATADBG \ unsigned int *fifoMirrorBase; \ unsigned int *fifoMirrorPtr; #ifdef FIFO_DEBUG #define PROPDATA PROPDATASTD; \ PROPDATADBG #else #define PROPDATA PROPDATASTD; #endif #ifdef TDFX_DEBUG_CMDS #define TDFXMakeRoom(p, n) \ do { \ if (fifoCnt) \ ErrorF("Previous TDFXMakeRoom passed incorrect size\n"); \ cmdCnt=n; \ TDFXAllocateSlots(p, (n)+1); \ while (0) #define TDFXWriteLong(p, a, v) do { \ if (lastAddr & afifoSlots -= (_n)) < 0) \ cmdfifo_make_room(adapter, fifo_ptr, _n); \ #if X_BYTE_ORDER == X_BIG_ENDIAN #define BE_BSWAP32(val) ((((val) & 0x000000ff) << 24) | \ (((val) & 0x0000ff00) << 8) | \ (((val) & 0x00ff0000) >> 8) | \ (((val) & 0xff000000) >> 24)) #define BE_WSWAP32(val) ((((val) & 0x0000ffff) << 16) | \ (((val) & 0xffff0000) >> 16)) void TDFXWriteFifo_24(TDFXPtr pTDFX, int val); void TDFXWriteFifo_16(TDFXPtr pTDFX, int val); void TDFXWriteFifo_8(TDFXPtr pTDFX, int val); #else /* Don't swap on little-endian platforms */ #define BE_BSWAP32(val) val #define BE_WSWAP32(val) val #endif #ifdef DEBUG_FIFO #define WRITE_FIFO(ptr, loc, _val) \ do { \ *pTDFX->fifoMirrorPtr++ = _val; \ *pTDFX->fifoPtr++ = _val; \ } while(0) #else #if X_BYTE_ORDER == X_BIG_ENDIAN #define WRITE_FIFO(ptr, loc, _val) \ do { \ pTDFX->writeFifo(ptr, _val); \ } while (0) #else #define WRITE_FIFO(ptr, loc, _val) \ do { \ *pTDFX->fifoPtr++ = _val; \ } while(0) #endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ #endif /* DEBUG_FIFO */ #if X_BYTE_ORDER == X_BIG_ENDIAN #define FLUSH_WCB() #else #define FLUSH_WCB() inb(0x80) #endif /* ** Send a packet header type 1 (2D) to the cmdfifo */ #define SET_2DPK1_HEADER(_ndwords, _inc, _reg) \ WRITE_FIFO ( pTDFX, 0, (_ndwords) << SSTCP_PKT1_NWORDS_SHIFT | \ ((_inc) ? SSTCP_PKT1_INC : SSTCP_PKT1_NOINC) | \ SSTCP_PKT1_2D | \ FIELD_OFFSET(H3_2D_REGISTERS, _reg)/4 << SSTCP_REGBASE_SHIFT | \ SSTCP_PKT1 \ ) /* ** Send a packet header type 1 to begin at launchArea[0] to the cmdfifo */ #define SET_PK1_HEADER_LAUNCH(_ndwords, _inc) \ WRITE_FIFO ( pTDFX, 0, (_ndwords) << SSTCP_PKT1_NWORDS_SHIFT | \ ((_inc) ? SSTCP_PKT1_INC : SSTCP_PKT1_NOINC) | \ SSTCP_PKT1_LAUNCH | SSTCP_PKT1 \ ) /* ** Send a packet header type 1 to begin at colorPattern[0] to the cmdfifo */ #define SET_PK1_HEADER_COLORPATTERN(_ndwords, _inc) \ WRITE_FIFO ( pTDFX, 0, (_ndwords) << SSTCP_PKT1_NWORDS_SHIFT | \ ((_inc) ? SSTCP_PKT1_INC : SSTCP_PKT1_NOINC) | \ SSTCP_PKT1_COLORPATTERN | SSTCP_PKT1 \ ) /* ** Send a packet header type 2 to the cmdfifo */ #define SET_PKT2_HEADER(_mask) \ WRITE_FIFO (pTDFX, 0, ((_mask) << SSTCP_PKT2_MASK_SHIFT) | SSTCP_PKT2) /* ** These are used to select a register mask for use with ** command fifo packet type 4. The defines represent an ** offset register from the base register. ** e.g. R5 = baseReg + 5, R0 = baseReg etc.. */ #define R0 (1 << 0) #define R1 (1 << 1) #define R2 (1 << 2) #define R3 (1 << 3) #define R4 (1 << 4) #define R5 (1 << 5) #define R6 (1 << 6) #define R7 (1 << 7) #define R8 (1 << 8) #define R9 (1 << 9) #define R10 (1 << 10) #define R11 (1 << 11) #define R12 (1 << 12) #define R13 (1 << 13) #define SET_2DPK4_HEADER(_mask, _reg0) \ WRITE_FIFO ( pTDFX, 0, ((_mask) << SSTCP_PKT4_MASK_SHIFT) | \ SSTCP_PKT4_2D | \ (_reg0) | \ SSTCP_PKT4 \ ) #define SET_3DPK4_HEADER(_mask, _reg0) \ WRITE_FIFO ( pTDFX, 0, ((_mask) << SSTCP_PKT4_MASK_SHIFT) | \ (_reg0) | \ SSTCP_PKT4 \ ) /*----------------- SST cmdFifo*.baseSize bits --------------------------- */ #define SST_CMDFIFO_SIZE 0xFF #define SST_EN_CMDFIFO BIT(8) #define SST_CMDFIFO_AGP BIT(9) #define SST_CMDFIFO_DISABLE_HOLES BIT(10) /* SST COMMAND PACKET defines */ #define SSTCP_PKT_SIZE 3 #define SSTCP_PKT SST_MASK(SSTCP_PKT_SIZE) #define SSTCP_PKT0 0 #define SSTCP_PKT1 1 #define SSTCP_PKT2 2 #define SSTCP_PKT3 3 #define SSTCP_PKT4 4 #define SSTCP_PKT5 5 #define SSTCP_PKT6 6 #define SSTCP_PKT7 7 #define SSTCP_BOGUS_WORDS_SHIFT 29 #define SSTCP_BOGUS_WORDS (7 << SSTCP_BOGUS_WORDS_SHIFT) /* packet 0 defines */ #define SSTCP_PKT0_FUNC_SHIFT 3 #define SSTCP_PKT0_FUNC (7 << SSTCP_PKT0_FUNC_SHIFT) #define SSTCP_PKT0_NOP ((0<>2) & 0x7FF) << SSTCP_REGBASE_SHIFT ) #else #define SSTCP_REGBASE ((0x3FF)<>2) & 0x3FF) << SSTCP_REGBASE_SHIFT ) #endif #define SSTCP_PKT1_2D BIT(14) #define SSTCP_INC BIT(15) #define SSTCP_PKT1_NWORDS_SHIFT 16 #define SSTCP_PKT1_NWORDS (0xFFFFUL<