regs3v.h revision 1d54945d
11d54945dSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/regs3v.h,v 1.9 2002/01/25 21:56:08 tsi Exp $ */
21d54945dSmrg
31d54945dSmrg/*
41d54945dSmrgCopyright (C) 1994-1999 The XFree86 Project, Inc.  All Rights Reserved.
51d54945dSmrg
61d54945dSmrgPermission is hereby granted, free of charge, to any person obtaining a copy of
71d54945dSmrgthis software and associated documentation files (the "Software"), to deal in
81d54945dSmrgthe Software without restriction, including without limitation the rights to
91d54945dSmrguse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
101d54945dSmrgof the Software, and to permit persons to whom the Software is furnished to do
111d54945dSmrgso, subject to the following conditions:
121d54945dSmrg
131d54945dSmrgThe above copyright notice and this permission notice shall be included in all
141d54945dSmrgcopies or substantial portions of the Software.
151d54945dSmrg
161d54945dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171d54945dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
181d54945dSmrgNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
191d54945dSmrgXFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
201d54945dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
211d54945dSmrgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
221d54945dSmrg
231d54945dSmrgExcept as contained in this notice, the name of the XFree86 Project shall not
241d54945dSmrgbe used in advertising or otherwise to promote the sale, use or other dealings
251d54945dSmrgin this Software without prior written authorization from the XFree86 Project.
261d54945dSmrg*/
271d54945dSmrg
281d54945dSmrg/*
291d54945dSmrg * regs3v.h
301d54945dSmrg *
311d54945dSmrg * Port to 4.0 design level
321d54945dSmrg *
331d54945dSmrg * S3 ViRGE driver
341d54945dSmrg *
351d54945dSmrg * Portions based on code containing the following notices:
361d54945dSmrg **********************************************************
371d54945dSmrg *
381d54945dSmrg * Written by Jake Richter Copyright (c) 1989, 1990 Panacea Inc., Londonderry,
391d54945dSmrg * NH - All Rights Reserved
401d54945dSmrg *
411d54945dSmrg * This code may be freely incorporated in any program without royalty, as long
421d54945dSmrg * as the copyright notice stays intact.
431d54945dSmrg *
441d54945dSmrg * Additions by Kevin E. Martin (martin@cs.unc.edu)
451d54945dSmrg *
461d54945dSmrg * KEVIN E. MARTIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
471d54945dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
481d54945dSmrg * EVENT SHALL KEVIN E. MARTIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
491d54945dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
501d54945dSmrg * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
511d54945dSmrg * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
521d54945dSmrg * PERFORMANCE OF THIS SOFTWARE.
531d54945dSmrg *
541d54945dSmrg */
551d54945dSmrg
561d54945dSmrg/* Taken from accel/s3_virge code */
571d54945dSmrg/* 23/03/97 S. Marineau: fixed bug with first Doubleword Offset macros
581d54945dSmrg * and added macro CommandWaitIdle to wait for the command FIFO to empty
591d54945dSmrg */
601d54945dSmrg
611d54945dSmrg
621d54945dSmrg#ifndef _REGS3V_H
631d54945dSmrg#define _REGS3V_H
641d54945dSmrg
651d54945dSmrg#define S3_ViRGE_SERIES(chip)     ((chip&0xfff0)==0x31e0)
661d54945dSmrg#define S3_ViRGE_GX2_SERIES(chip) (chip == S3_ViRGE_GX2 || chip == S3_TRIO_3D_2X)
671d54945dSmrg#define S3_ViRGE_MX_SERIES(chip)  (chip == S3_ViRGE_MX || chip == S3_ViRGE_MXP)
681d54945dSmrg#define S3_ViRGE_MXP_SERIES(chip) (chip == S3_ViRGE_MXP)
691d54945dSmrg#define S3_ViRGE_VX_SERIES(chip)  ((chip&0xfff0)==0x3de0)
701d54945dSmrg#define S3_TRIO_3D_SERIES(chip)		(chip == S3_TRIO_3D)
711d54945dSmrg#define S3_TRIO_3D_2X_SERIES(chip)	(chip == S3_TRIO_3D_2X)
721d54945dSmrg
731d54945dSmrg/* Chip tags */
741d54945dSmrg#define PCI_S3_VENDOR_ID	PCI_VENDOR_S3
751d54945dSmrg#define S3_UNKNOWN		 0
761d54945dSmrg#define S3_ViRGE		 PCI_CHIP_VIRGE
771d54945dSmrg#define S3_ViRGE_VX		 PCI_CHIP_VIRGE_VX
781d54945dSmrg#define S3_ViRGE_DXGX	 PCI_CHIP_VIRGE_DXGX
791d54945dSmrg#define S3_ViRGE_GX2	 PCI_CHIP_VIRGE_GX2
801d54945dSmrg#define S3_ViRGE_MX		 PCI_CHIP_VIRGE_MX
811d54945dSmrg#define S3_ViRGE_MXP	 PCI_CHIP_VIRGE_MXP
821d54945dSmrg#define S3_TRIO_3D	PCI_CHIP_Trio3D
831d54945dSmrg#define S3_TRIO_3D_2X	PCI_CHIP_Trio3D_2X
841d54945dSmrg
851d54945dSmrg/* Subsystem Control Register */
861d54945dSmrg#define	GPCTRL_NC	0x0000
871d54945dSmrg#define	GPCTRL_ENAB	0x4000
881d54945dSmrg#define	GPCTRL_RESET	0x8000
891d54945dSmrg
901d54945dSmrg
911d54945dSmrg/* Command Register */
921d54945dSmrg#define	CMD_OP_MSK	(0xf << 27)
931d54945dSmrg#define	CMD_BITBLT	(0x0 << 27)
941d54945dSmrg#define	CMD_RECT       ((0x2 << 27) | 0x0100)
951d54945dSmrg#define	CMD_LINE	(0x3 << 27)
961d54945dSmrg#define	CMD_POLYFILL	(0x5 << 27)
971d54945dSmrg#define	CMD_NOP		(0xf << 27)
981d54945dSmrg
991d54945dSmrg#define	BYTSEQ		0
1001d54945dSmrg#define	_16BIT		0
1011d54945dSmrg#define	PCDATA		0x80
1021d54945dSmrg#define	INC_Y		CMD_YP
1031d54945dSmrg#define	YMAJAXIS	0
1041d54945dSmrg#define	INC_X		CMD_XP
1051d54945dSmrg#define	DRAW		0x0020
1061d54945dSmrg#define	LINETYPE	0x0008
1071d54945dSmrg#define	LASTPIX		0
1081d54945dSmrg#define	PLANAR		0 /* MIX_MONO_SRC */
1091d54945dSmrg#define	WRTDATA		0
1101d54945dSmrg
1111d54945dSmrg/*
1121d54945dSmrg * Short Stroke Vector Transfer Register (The angular Defs also apply to the
1131d54945dSmrg * Command Register
1141d54945dSmrg */
1151d54945dSmrg#define	VECDIR_000	0x0000
1161d54945dSmrg#define	VECDIR_045	0x0020
1171d54945dSmrg#define	VECDIR_090	0x0040
1181d54945dSmrg#define	VECDIR_135	0x0060
1191d54945dSmrg#define	VECDIR_180	0x0080
1201d54945dSmrg#define	VECDIR_225	0x00a0
1211d54945dSmrg#define	VECDIR_270	0x00c0
1221d54945dSmrg#define	VECDIR_315	0x00e0
1231d54945dSmrg#define	SSVDRAW		0x0010
1241d54945dSmrg
1251d54945dSmrg/* Command AutoExecute */
1261d54945dSmrg#define CMD_AUTOEXEC	0x01
1271d54945dSmrg
1281d54945dSmrg/* Command Hardware Clipping Enable */
1291d54945dSmrg#define CMD_HWCLIP	0x02
1301d54945dSmrg
1311d54945dSmrg/* Destination Color Format */
1321d54945dSmrg#define DST_8BPP	0x00
1331d54945dSmrg#define DST_16BPP	0x04
1341d54945dSmrg#define DST_24BPP	0x08
1351d54945dSmrg
1361d54945dSmrg/* BLT Mix modes */
1371d54945dSmrg#define	MIX_BITBLT	0x0000
1381d54945dSmrg#define	MIX_MONO_SRC	0x0040
1391d54945dSmrg#define	MIX_CPUDATA	0x0080
1401d54945dSmrg#define	MIX_MONO_PATT	0x0100
1411d54945dSmrg#define MIX_COLOR_PATT  0x0000
1421d54945dSmrg#define	MIX_MONO_TRANSP	0x0200
1431d54945dSmrg
1441d54945dSmrg/* Image Transfer Alignments */
1451d54945dSmrg#define CMD_ITA_BYTE	0x0000
1461d54945dSmrg#define CMD_ITA_WORD	0x0400
1471d54945dSmrg#define CMD_ITA_DWORD	0x0800
1481d54945dSmrg
1491d54945dSmrg/* First Doubleword Offset (Image Transfer) */
1501d54945dSmrg#define CMD_FDO_BYTE0	0x00000
1511d54945dSmrg#define CMD_FDO_BYTE1	0x01000
1521d54945dSmrg#define CMD_FDO_BYTE2	0x02000
1531d54945dSmrg#define CMD_FDO_BYTE3	0x03000
1541d54945dSmrg
1551d54945dSmrg/* X Positive, Y Positive (Bit BLT) */
1561d54945dSmrg#define CMD_XP		0x2000000
1571d54945dSmrg#define CMD_YP		0x4000000
1581d54945dSmrg
1591d54945dSmrg/* 2D or 3D Select */
1601d54945dSmrg#define CMD_2D		0x00000000
1611d54945dSmrg#define CMD_3D		0x80000000
1621d54945dSmrg
1631d54945dSmrg/* The Mix ROPs (selected ones, not all 256)  */
1641d54945dSmrg#if 0
1651d54945dSmrg
1661d54945dSmrg#define	ROP_0				(0x00<<17)
1671d54945dSmrg#define	ROP_DSon			(0x11<<17)
1681d54945dSmrg#define	ROP_DSna			(0x22<<17)
1691d54945dSmrg#define	ROP_Sn				(0x33<<17)
1701d54945dSmrg#define	ROP_SDna			(0x44<<17)
1711d54945dSmrg#define	ROP_Dn				(0x55<<17)
1721d54945dSmrg#define	ROP_DSx				(0x66<<17)
1731d54945dSmrg#define	ROP_DSan			(0x77<<17)
1741d54945dSmrg#define	ROP_DSa				(0x88<<17)
1751d54945dSmrg#define	ROP_DSxn			(0x99<<17)
1761d54945dSmrg#define	ROP_D				(0xaa<<17)
1771d54945dSmrg#define	ROP_DSno			(0xbb<<17)
1781d54945dSmrg#define	ROP_S				(0xcc<<17)
1791d54945dSmrg#define	ROP_SDno			(0xdd<<17)
1801d54945dSmrg#define	ROP_DSo				(0xee<<17)
1811d54945dSmrg#define	ROP_1				(0xff<<17)
1821d54945dSmrg
1831d54945dSmrg/* ROP  ->  (ROP & P) | (D & ~P) */
1841d54945dSmrg#define	ROP_0_PaDPnao    /* DPna     */	(0x0a<<17)
1851d54945dSmrg#define	ROP_DSon_PaDPnao /* PDSPaox  */	(0x1a<<17)
1861d54945dSmrg#define	ROP_DSna_PaDPnao /* DPSana   */	(0x2a<<17)
1871d54945dSmrg#define	ROP_Sn_PaDPnao   /* SPDSxox  */	(0x3a<<17)
1881d54945dSmrg#define	ROP_SDna_PaDPnao /* DPSDoax  */	(0x4a<<17)
1891d54945dSmrg#define	ROP_Dn_PaDPnao   /* DPx      */	(0x5a<<17)
1901d54945dSmrg#define	ROP_DSx_PaDPnao  /* DPSax    */	(0x6a<<17)
1911d54945dSmrg#define	ROP_DSan_PaDPnao /* DPSDnoax */	(0x7a<<17)
1921d54945dSmrg#define	ROP_DSa_PaDPnao  /* DSPnoa   */	(0x8a<<17)
1931d54945dSmrg#define	ROP_DSxn_PaDPnao /* DPSnax   */	(0x9a<<17)
1941d54945dSmrg#define	ROP_D_PaDPnao    /* D        */	(0xaa<<17)
1951d54945dSmrg#define	ROP_DSno_PaDPnao /* DPSnao   */	(0xba<<17)
1961d54945dSmrg#define	ROP_S_PaDPnao    /* DPSDxax  */	(0xca<<17)
1971d54945dSmrg#define	ROP_SDno_PaDPnao /* DPSDanax */	(0xda<<17)
1981d54945dSmrg#define	ROP_DSo_PaDPnao  /* DPSao    */ (0xea<<17)
1991d54945dSmrg#define	ROP_1_PaDPnao    /* DPo      */	(0xfa<<17)
2001d54945dSmrg
2011d54945dSmrg
2021d54945dSmrg/* S -> P */
2031d54945dSmrg#define	ROP_DPon			(0x05<<17)
2041d54945dSmrg#define	ROP_DPna			(0x0a<<17)
2051d54945dSmrg#define	ROP_Pn				(0x0f<<17)
2061d54945dSmrg#define	ROP_PDna			(0x50<<17)
2071d54945dSmrg#define	ROP_DPx				(0x5a<<17)
2081d54945dSmrg#define	ROP_DPan			(0x5f<<17)
2091d54945dSmrg#define	ROP_DPa				(0xa0<<17)
2101d54945dSmrg#define	ROP_DPxn			(0xa5<<17)
2111d54945dSmrg#define	ROP_DPno			(0xaf<<17)
2121d54945dSmrg#define	ROP_P				(0xf0<<17)
2131d54945dSmrg#define	ROP_PDno			(0xf5<<17)
2141d54945dSmrg#define	ROP_DPo				(0xfa<<17)
2151d54945dSmrg
2161d54945dSmrg/* ROP -> (ROP & S) | (~ROP & D) */
2171d54945dSmrg#define ROP_DPSDxax			(0xca<<17)
2181d54945dSmrg#define ROP_DSPnoa			(0x8a<<17)
2191d54945dSmrg#define ROP_DPSao			(0xea<<17)
2201d54945dSmrg#define ROP_DPSoa			(0xa8<<17)
2211d54945dSmrg#define ROP_DSa				(0x88<<17)
2221d54945dSmrg#define ROP_SSPxDSxax			(0xe8<<17)
2231d54945dSmrg#define ROP_SDPoa			(0xc8<<17)
2241d54945dSmrg#define ROP_DSPnao			(0xae<<17)
2251d54945dSmrg#define ROP_SSDxPDxax			(0x8e<<17)
2261d54945dSmrg#define ROP_DSo				(0xee<<17)
2271d54945dSmrg#define ROP_SDPnao			(0xce<<17)
2281d54945dSmrg#define ROP_SPDSxax			(0xac<<17)
2291d54945dSmrg#define ROP_SDPnoa			(0x8c<<17)
2301d54945dSmrg#define ROP_SDPao			(0xec<<17)
2311d54945dSmrg
2321d54945dSmrg/* ROP_sp -> (ROP_sp & S) | (D & ~S) */
2331d54945dSmrg#define	ROP_0_SaDSnao    /* DSna     */	(0x22<<17)
2341d54945dSmrg#define	ROP_DPa_SaDSnao  /* DPSnoa   */	(0xa2<<17)
2351d54945dSmrg#define	ROP_PDna_SaDSnao /* DSPDoax  */	(0x62<<17)
2361d54945dSmrg#define	ROP_P_SaDSnao    /* DSPDxax  */	(0xe2<<17)
2371d54945dSmrg#define	ROP_DPna_SaDSnao /* DPSana   */	(0x2a<<17)
2381d54945dSmrg#define	ROP_D_SaDSnao    /* D        */	(0xaa<<17)
2391d54945dSmrg#define	ROP_DPx_SaDSnao  /* DPSax    */	(0x6a<<17)
2401d54945dSmrg#define	ROP_DPo_SaDSnao  /* DPSao    */	(0xea<<17)
2411d54945dSmrg#define	ROP_DPon_SaDSnao /* SDPSaox  */	(0x26<<17)
2421d54945dSmrg#define	ROP_DPxn_SaDSnao /* DSPnax   */	(0xa6<<17)
2431d54945dSmrg#define	ROP_Dn_SaDSnao   /* DSx      */	(0x66<<17)
2441d54945dSmrg#define	ROP_PDno_SaDSnao /* SDPSanax */	(0xe6<<17)
2451d54945dSmrg#define	ROP_Pn_SaDSnao   /* PSDPxox  */	(0x2e<<17)
2461d54945dSmrg#define	ROP_DPno_SaDSnao /* DSPnao   */	(0xae<<17)
2471d54945dSmrg#define	ROP_DPan_SaDSnao /* SDPSnoax */	(0x6e<<17)
2481d54945dSmrg#define	ROP_1_SaDSnao    /* DSo      */	(0xee<<17)
2491d54945dSmrg
2501d54945dSmrg#endif
2511d54945dSmrg
2521d54945dSmrg
2531d54945dSmrg#define MAXLOOP 0x0fffff /* timeout value for engine waits, 0.5 secs */
2541d54945dSmrg
2551d54945dSmrg/* Wait until "v" queue entries are free */
2561d54945dSmrg#define	WaitQueue(v) \
2571d54945dSmrg  if (ps3v->NoPCIRetry) { \
2581d54945dSmrg    do { int loop=0; mem_barrier(); \
2591d54945dSmrg         while ((((IN_SUBSYS_STAT()) & 0x1f00) < (((v)+2) << 8)) && (loop++<MAXLOOP)); \
2601d54945dSmrg         if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
2611d54945dSmrg    } while (0); }
2621d54945dSmrg
2631d54945dSmrg/* Wait until GP is idle and queue is empty */
2641d54945dSmrg#define	WaitIdleEmpty()  \
2651d54945dSmrg  do { int loop=0; mem_barrier(); \
2661d54945dSmrg    if(S3_TRIO_3D_SERIES(ps3v->Chipset)) \
2671d54945dSmrg       while (((IN_SUBSYS_STAT() & 0x3f802000 & 0x20002000) != 0x20002000) && \
2681d54945dSmrg             (loop++<MAXLOOP)); \
2691d54945dSmrg    else \
2701d54945dSmrg       while (((IN_SUBSYS_STAT() & 0x3f00) != 0x3000) && (loop++<MAXLOOP)); \
2711d54945dSmrg       if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
2721d54945dSmrg  } while (0)
2731d54945dSmrg
2741d54945dSmrg/* Wait until GP is idle */
2751d54945dSmrg#define WaitIdle() \
2761d54945dSmrg  do { int loop=0; mem_barrier(); \
2771d54945dSmrg       while ((!(IN_SUBSYS_STAT() & 0x2000)) && (loop++<MAXLOOP)); \
2781d54945dSmrg         if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
2791d54945dSmrg  } while (0)
2801d54945dSmrg
2811d54945dSmrg
2821d54945dSmrg/* Wait until Command FIFO is empty */
2831d54945dSmrg#define WaitCommandEmpty()       do { int loop=0; mem_barrier(); 			\
2841d54945dSmrg	if (S3_ViRGE_GX2_SERIES(S3_ViRGE_GX2) || S3_ViRGE_MX_SERIES(ps3v->Chipset)) 		\
2851d54945dSmrg	     while ((!(((((mmtr)s3vMmioMem)->subsys_regs.regs.adv_func_cntl)) & 0x400)) && (loop++<MAXLOOP));	\
2861d54945dSmrg	else if (S3_TRIO_3D_SERIES(ps3v->Chipset)) \
2871d54945dSmrg	     while (((IN_SUBSYS_STAT() & 0x5f00) != 0x5f00) && (loop++<MAXLOOP)); \
2881d54945dSmrg	  else 										\
2891d54945dSmrg	     while ((!(((((mmtr)s3vMmioMem)->subsys_regs.regs.adv_func_cntl)) & 0x200)) && (loop++<MAXLOOP));	\
2901d54945dSmrg          if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
2911d54945dSmrg	} while (0)
2921d54945dSmrg
2931d54945dSmrg/* Wait until a DMA transfer is done */
2941d54945dSmrg#define WaitDMAEmpty() \
2951d54945dSmrg  do { int loop=0; mem_barrier(); \
2961d54945dSmrg       while  (((((mmtr)s3vMmioMem)->dma_regs.regs.cmd.write_pointer) != (((mmtr)s3vMmioMem)->dma_regs.regs.cmd.read_pointer)) && (loop++<MAXLOOP)); \
2971d54945dSmrg       if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
2981d54945dSmrg  } while(0)
2991d54945dSmrg
3001d54945dSmrg
3011d54945dSmrg
3021d54945dSmrg
3031d54945dSmrg
3041d54945dSmrg#define RGB8_PSEUDO      (-1)
3051d54945dSmrg#define RGB16_565         0
3061d54945dSmrg#define RGB16_555         1
3071d54945dSmrg#define RGB32_888         2
3081d54945dSmrg
3091d54945dSmrg#endif /* _REGS3V_H */
3101d54945dSmrg
311