17706df26Smrg/*
27706df26Smrg * Copyright 1997,1998 by Alan Hourihane, Wigan, England.
37706df26Smrg *
47706df26Smrg * Permission to use, copy, modify, distribute, and sell this software and its
57706df26Smrg * documentation for any purpose is hereby granted without fee, provided that
67706df26Smrg * the above copyright notice appear in all copies and that both that
77706df26Smrg * copyright notice and this permission notice appear in supporting
87706df26Smrg * documentation, and that the name of Alan Hourihane not be used in
97706df26Smrg * advertising or publicity pertaining to distribution of the software without
107706df26Smrg * specific, written prior permission.  Alan Hourihane makes no representations
117706df26Smrg * about the suitability of this software for any purpose.  It is provided
127706df26Smrg * "as is" without express or implied warranty.
137706df26Smrg *
147706df26Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
157706df26Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
167706df26Smrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
177706df26Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
187706df26Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
197706df26Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
207706df26Smrg * PERFORMANCE OF THIS SOFTWARE.
217706df26Smrg *
227706df26Smrg * Author:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
237706df26Smrg */
247706df26Smrg
257706df26Smrg/* TGA hardware description (minimal)
267706df26Smrg *
277706df26Smrg * Offsets within Memory Space
287706df26Smrg *
297706df26Smrg * Portions taken from linux's own tga driver...
307706df26Smrg * Courtesy of Jay Estabrook.
317706df26Smrg */
327706df26Smrg
337706df26Smrg#ifndef TGA_REGS_H
347706df26Smrg#define TGA_REGS_H
357706df26Smrg
367706df26Smrg#include "compiler.h"
377706df26Smrg
387706df26Smrg#define TYPE_TGA_8PLANE			0
397706df26Smrg#define TYPE_TGA_24PLANE		1
407706df26Smrg#define TYPE_TGA_24PLUSZ		3
417706df26Smrg
427706df26Smrg#if 1
437706df26Smrg#define WMB	mem_barrier()
447706df26Smrg#else
457706df26Smrg#define WMB	write_mem_barrier()
467706df26Smrg#endif
477706df26Smrg
487706df26Smrg#define TGA_WRITE_REG(v,r) \
497706df26Smrg	do {\
507706df26Smrg		 *(unsigned int *)((char*)(pTga->IOBase)+(r)) = (v);\
517706df26Smrg		 WMB;\
527706df26Smrg	} while (0)
537706df26Smrg
547706df26Smrg#define TGA_READ_REG(r) \
557706df26Smrg	( *(unsigned int *)((char*)(pTga->IOBase)+(r)))
567706df26Smrg
577706df26Smrg#define TGA2_WRITE_CLOCK_REG(v,r) \
587706df26Smrg	do {\
597706df26Smrg		 *(unsigned int *)((char*)(pTga->ClkBase)+(r)) = (v);\
607706df26Smrg		 WMB;\
617706df26Smrg	} while (0)
627706df26Smrg
637706df26Smrg#define TGA2_WRITE_RAMDAC_REG(v,r) \
647706df26Smrg	do {\
657706df26Smrg		 *(unsigned int *)((char*)(pTga->DACBase)+(r)) = (v);\
667706df26Smrg		 WMB;\
677706df26Smrg	} while (0)
687706df26Smrg
697706df26Smrg#define TGA2_READ_RAMDAC_REG(r) \
707706df26Smrg	( *(unsigned int *)((char*)(pTga->DACBase)+(r)))
717706df26Smrg
727706df26Smrg#if defined(__alpha__) && 0 /* ?? disable this for now ?? */
737706df26Smrg/* we can avoid an mb() if we write to an alternate register space each time */
747706df26Smrg
757706df26Smrg#define MAX_OFFSET 8192
767706df26Smrg#define OFFSET_INC 1024
777706df26Smrg
787706df26Smrg#define TGA_DECL() register unsigned long iobase, offset
797706df26Smrg#define TGA_GET_IOBASE() iobase = (unsigned long)pTga->IOBase;
807706df26Smrg#define TGA_GET_OFFSET() offset = pTga->regOffset;
817706df26Smrg#define TGA_SAVE_OFFSET() pTga->regOffset = offset;
827706df26Smrg
837706df26Smrg/* #define PROFILE */
847706df26Smrg#undef PROFILE
857706df26Smrg
867706df26Smrg#ifdef PROFILE
877706df26Smrgstatic __inline__ unsigned int realcc()
887706df26Smrg{
897706df26Smrg  u_long cc;
907706df26Smrg  __asm__ volatile("rpcc %0" : "=r"(cc) : : "memory");
917706df26Smrg  return cc;
927706df26Smrg}
937706df26Smrg
947706df26Smrg#define TGA_FAST_WRITE_REG(v,r) \
957706df26Smrgdo {\
967706df26Smrgstart = realcc();\
977706df26Smrg  *(unsigned int *)(iobase + offset + (r)) = v;\
987706df26Smrg  offset += OFFSET_INC;\
997706df26Smrg  if(offset > MAX_OFFSET) (offset = 0);\
1007706df26Smrg  stop = realcc();\
1017706df26Smrg  ErrorF("TGA_FAST_WRITE_REG = %d\n", stop - start);\
1027706df26Smrg} while (0)
1037706df26Smrg
1047706df26Smrg#else /* PROFILE */
1057706df26Smrg
1067706df26Smrg#define TGA_FAST_WRITE_REG(v,r) \
1077706df26Smrgdo {\
1087706df26Smrg  *(unsigned int *)(iobase + offset + (r)) = v;\
1097706df26Smrg  offset += OFFSET_INC;\
1107706df26Smrg  if(offset > MAX_OFFSET) (offset = 0);\
1117706df26Smrg} while (0)
1127706df26Smrg#endif /* PROFILE */
1137706df26Smrg
1147706df26Smrg#else /* __alpha__ */
1157706df26Smrg
1167706df26Smrg#define TGA_DECL()
1177706df26Smrg#define TGA_GET_IOBASE() ;
1187706df26Smrg#define TGA_GET_OFFSET() ;
1197706df26Smrg#define TGA_SAVE_OFFSET() ;
1207706df26Smrg#define TGA_FAST_WRITE_REG(v,r) TGA_WRITE_REG(v,r)
1217706df26Smrg
1227706df26Smrg#endif /* __alpha__ */
1237706df26Smrg
1247706df26Smrg#define	TGA_ROM_OFFSET			0x00000000
1257706df26Smrg#define TGA2_CLOCK_OFFSET		0x00060000
1267706df26Smrg#define TGA2_RAMDAC_OFFSET		0x00080000
1277706df26Smrg#define	TGA_REGS_OFFSET			0x00100000
1287706df26Smrg#define	TGA_8PLANE_FB_OFFSET		0x00200000
1297706df26Smrg#define	TGA_24PLANE_FB_OFFSET		0x00800000
1307706df26Smrg#define	TGA_24PLUSZ_FB_OFFSET		0x01000000
1317706df26Smrg
1327706df26Smrg#define TGA_FOREGROUND_REG		0x0020
1337706df26Smrg#define TGA_BACKGROUND_REG		0x0024
1347706df26Smrg#define	TGA_PLANEMASK_REG		0x0028
1357706df26Smrg#define	TGA_MODE_REG			0x0030
1367706df26Smrg#define		SIMPLE			0x00
1377706df26Smrg#define		Z3D			0x10
1387706df26Smrg#define		OPAQUESTIPPLE		0x01
1397706df26Smrg#define		FILL			0x20
1407706df26Smrg#define		TRANSPARENTSTIPPLE	0x05
1417706df26Smrg#define		BLOCKSTIPPLE		0x0D
1427706df26Smrg#define		BLOCKFILL		0x2D
1437706df26Smrg#define		OPAQUELINE		0x02
1447706df26Smrg#define		TRANSPARENTLINE		0x06
1457706df26Smrg#define		BPP8PACKED		(0x00 << 8)
1467706df26Smrg#define		BPP8UNPACK		(0x01 << 8)
1477706df26Smrg#define		BPP12LOW		(0x02 << 8)
1487706df26Smrg#define		BPP12HIGH		(0x06 << 8)
1497706df26Smrg#define		BPP24			(0x03 << 8)
1507706df26Smrg#define		CAP_ENDS		0x8000
1517706df26Smrg#define		X11			0x0000
1527706df26Smrg#define		MODE_WIN32		0x2000
1537706df26Smrg /* copy mode */
1547706df26Smrg#define         COPY                    0x07
1557706df26Smrg /* opaque fill mode */
1567706df26Smrg#define         OPAQUEFILL              0x21
1577706df26Smrg#define         TRANSPARENTFILL         0x45
1587706df26Smrg#define	TGA_RASTEROP_REG		0x0034
1597706df26Smrg#define TGA_PIXELSHIFT_REG              0x0038
1607706df26Smrg#define TGA_ADDRESS_REG			0x003c
1617706df26Smrg#define TGA_CONTINUE_REG                0x004c
1627706df26Smrg#define	TGA_DEEP_REG			0x0050
1637706df26Smrg#define	TGA_REVISION_REG		0x0054		/* TGA2 */
1647706df26Smrg#define	TGA_PIXELMASK_REG		0x002c
1657706df26Smrg#define	TGA_PIXELMASK_PERS_REG		0x005c
1667706df26Smrg#define	TGA_CURSOR_BASE_REG		0x0060
1677706df26Smrg#define	TGA_HORIZ_REG			0x0064
1687706df26Smrg#define	TGA_VERT_REG			0x0068
1697706df26Smrg#define	TGA_BASE_ADDR_REG		0x006c
1707706df26Smrg#define	TGA_VALID_REG			0x0070
1717706df26Smrg#define	TGA_CURSOR_XY_REG		0x0074
1727706df26Smrg#define	TGA_INTR_STAT_REG		0x007c
1737706df26Smrg /* GDAR */
1747706df26Smrg#define TGA_DATA_REG                    0x0080
1757706df26Smrg#define TGA_WIDTH_REG                   0x009c
1767706df26Smrg#define TGA_SPAN_REG			0x00bc
1777706df26Smrg#define	TGA_RAMDAC_SETUP_REG		0x00c0
1787706df26Smrg
1797706df26Smrg#define TGA_NOSLOPE7_REG                0x011C
1807706df26Smrg#define TGA_NOSLOPE6_REG                0x0118
1817706df26Smrg#define TGA_NOSLOPE5_REG                0x0114
1827706df26Smrg#define TGA_NOSLOPE4_REG                0x0110
1837706df26Smrg#define TGA_NOSLOPE3_REG                0x010C
1847706df26Smrg#define TGA_NOSLOPE2_REG                0x0108
1857706df26Smrg#define TGA_NOSLOPE1_REG                0x0104
1867706df26Smrg#define TGA_NOSLOPE0_REG                0x0100
1877706df26Smrg
1887706df26Smrg#define TGA_SLOPE0_REG                  0x0120
1897706df26Smrg#define TGA_SLOPE1_REG                  0x0124
1907706df26Smrg#define TGA_SLOPE2_REG                  0x0128
1917706df26Smrg#define TGA_SLOPE3_REG                  0x012C
1927706df26Smrg#define TGA_SLOPE4_REG                  0x0130
1937706df26Smrg#define TGA_SLOPE5_REG                  0x0134
1947706df26Smrg#define TGA_SLOPE6_REG                  0x0138
1957706df26Smrg#define TGA_SLOPE7_REG                  0x013C
1967706df26Smrg#define TGA_BRES3_REG                   0x0048
1977706df26Smrg#define TGA_BRES2_REG                   0x0044
1987706df26Smrg#define TGA_BRES1_REG                   0x0040
1997706df26Smrg
2007706df26Smrg#define	TGA_BLOCK_COLOR0_REG		0x0140
2017706df26Smrg#define	TGA_BLOCK_COLOR1_REG		0x0144
2027706df26Smrg#define	TGA_BLOCK_COLOR2_REG		0x0148
2037706df26Smrg#define	TGA_BLOCK_COLOR3_REG		0x014c
2047706df26Smrg#define	TGA_BLOCK_COLOR4_REG		0x0150
2057706df26Smrg#define	TGA_BLOCK_COLOR5_REG		0x0154
2067706df26Smrg#define	TGA_BLOCK_COLOR6_REG		0x0158
2077706df26Smrg#define	TGA_BLOCK_COLOR7_REG		0x015c
2087706df26Smrg#define	TGA_CLOCK_REG			0x01e8
2097706df26Smrg#define	TGA_RAMDAC_REG			0x01f0
2107706df26Smrg#define	TGA_CMD_STAT_REG		0x01f8
2117706df26Smrg
2127706df26Smrg#define	BT485_READ_BIT			0x01
2137706df26Smrg#define	BT485_WRITE_BIT			0x00
2147706df26Smrg
2157706df26Smrg#endif
216