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