109885543Smrg/* Header:   //Mercury/Projects/archives/XFree86/4.0/regsmi.h-arc   1.11   14 Sep 2000 11:17:30   Frido  $ */
209885543Smrg
309885543Smrg/*
409885543SmrgCopyright (C) 1994-1999 The XFree86 Project, Inc.  All Rights Reserved.
509885543SmrgCopyright (C) 2000 Silicon Motion, Inc.  All Rights Reserved.
609885543Smrg
709885543SmrgPermission is hereby granted, free of charge, to any person obtaining a copy of
809885543Smrgthis software and associated documentation files (the "Software"), to deal in
909885543Smrgthe Software without restriction, including without limitation the rights to
1009885543Smrguse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
1109885543Smrgof the Software, and to permit persons to whom the Software is furnished to do
1209885543Smrgso, subject to the following conditions:
1309885543Smrg
1409885543SmrgThe above copyright notice and this permission notice shall be included in all
1509885543Smrgcopies or substantial portions of the Software.
1609885543Smrg
1709885543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1809885543SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
1909885543SmrgNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
2009885543SmrgXFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2109885543SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2209885543SmrgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2309885543Smrg
2409885543SmrgExcept as contained in this notice, the names of the XFree86 Project and
2509885543SmrgSilicon Motion shall not be used in advertising or otherwise to promote the
2609885543Smrgsale, use or other dealings in this Software without prior written
2709885543Smrgauthorization from the XFree86 Project and SIlicon Motion.
2809885543Smrg*/
2909885543Smrg
3009885543Smrg#ifndef _REGSMI_H
3109885543Smrg#define _REGSMI_H
3209885543Smrg
337104f784Smrg#ifndef PCI_CHIP_SMI501
347104f784Smrg#define PCI_CHIP_SMI501		0x0501
357104f784Smrg#endif
367104f784Smrg
3709885543Smrg#define SMI_LYNX_SERIES(chip)	((chip & 0xF0F0) == 0x0010)
3809885543Smrg#define SMI_LYNX3D_SERIES(chip)	((chip & 0xF0F0) == 0x0020)
3909885543Smrg#define SMI_COUGAR_SERIES(chip) ((chip & 0xF0F0) == 0x0030)
4009885543Smrg#define SMI_LYNXEM_SERIES(chip) ((chip & 0xFFF0) == 0x0710)
4109885543Smrg#define SMI_LYNXM_SERIES(chip)	((chip & 0xFF00) == 0x0700)
427104f784Smrg#define SMI_MSOC_SERIES(chip)	((chip & 0xFF00) == 0x0500)
4309885543Smrg
4409885543Smrg/* Chip tags */
4509885543Smrg#define PCI_SMI_VENDOR_ID	PCI_VENDOR_SMI
4609885543Smrg#define SMI_UNKNOWN			0
4709885543Smrg#define SMI_LYNX		PCI_CHIP_SMI910
4809885543Smrg#define SMI_LYNXE		PCI_CHIP_SMI810
4909885543Smrg#define SMI_LYNX3D		PCI_CHIP_SMI820
5009885543Smrg#define SMI_LYNXEM		PCI_CHIP_SMI710
5109885543Smrg#define SMI_LYNXEMplus		PCI_CHIP_SMI712
5209885543Smrg#define SMI_LYNX3DM		PCI_CHIP_SMI720
5309885543Smrg#define SMI_COUGAR3DR           PCI_CHIP_SMI731
547104f784Smrg#define SMI_MSOC		PCI_CHIP_SMI501
557104f784Smrg
567104f784Smrg/* Mobile-System-on-a-Chip */
577104f784Smrg#define IS_MSOC(pSmi)		((pSmi)->Chipset == SMI_MSOC)
5809885543Smrg
5909885543Smrg/* I/O Functions */
6009885543Smrgstatic __inline__ CARD8
6109885543SmrgVGAIN8_INDEX(SMIPtr pSmi, int indexPort, int dataPort, CARD8 index)
6209885543Smrg{
6309885543Smrg    if (pSmi->IOBase) {
6409885543Smrg	MMIO_OUT8(pSmi->IOBase, indexPort, index);
6509885543Smrg	return(MMIO_IN8(pSmi->IOBase, dataPort));
6609885543Smrg    } else {
6709885543Smrg	outb(pSmi->PIOBase + indexPort, index);
6809885543Smrg	return(inb(pSmi->PIOBase + dataPort));
6909885543Smrg    }
7009885543Smrg}
7109885543Smrg
7209885543Smrgstatic __inline__ void
7309885543SmrgVGAOUT8_INDEX(SMIPtr pSmi, int indexPort, int dataPort, CARD8 index, CARD8 data)
7409885543Smrg{
7509885543Smrg    if (pSmi->IOBase) {
7609885543Smrg	MMIO_OUT8(pSmi->IOBase, indexPort, index);
7709885543Smrg	MMIO_OUT8(pSmi->IOBase, dataPort, data);
7809885543Smrg    } else {
7909885543Smrg	outb(pSmi->PIOBase + indexPort, index);
8009885543Smrg	outb(pSmi->PIOBase + dataPort, data);
8109885543Smrg    }
8209885543Smrg}
8309885543Smrg
8409885543Smrgstatic __inline__ CARD8
8509885543SmrgVGAIN8(SMIPtr pSmi, int port)
8609885543Smrg{
8709885543Smrg    if (pSmi->IOBase) {
8809885543Smrg	return(MMIO_IN8(pSmi->IOBase, port));
8909885543Smrg    } else {
9009885543Smrg	return(inb(pSmi->PIOBase + port));
9109885543Smrg    }
9209885543Smrg}
9309885543Smrg
9409885543Smrgstatic __inline__ void
9509885543SmrgVGAOUT8(SMIPtr pSmi, int port, CARD8 data)
9609885543Smrg{
9709885543Smrg    if (pSmi->IOBase) {
9809885543Smrg	MMIO_OUT8(pSmi->IOBase, port, data);
9909885543Smrg    } else {
10009885543Smrg	outb(pSmi->PIOBase + port, data);
10109885543Smrg    }
10209885543Smrg}
10309885543Smrg
1047104f784Smrg#define WRITE_DPR(pSmi, dpr, data)					\
1057104f784Smrg    do {								\
1067104f784Smrg	MMIO_OUT32(pSmi->DPRBase, dpr, data);				\
1077104f784Smrg	DEBUG("DPR%02X = %08X\n", dpr, data);				\
1087104f784Smrg    } while (0)
1097104f784Smrg#define READ_DPR(pSmi, dpr)		MMIO_IN32(pSmi->DPRBase, dpr)
1107104f784Smrg#define WRITE_VPR(pSmi, vpr, data)					\
1117104f784Smrg    do {								\
1127104f784Smrg	MMIO_OUT32(pSmi->VPRBase, vpr, data);				\
1137104f784Smrg	DEBUG("VPR%02X = %08X\n", vpr, data);				\
1147104f784Smrg    } while (0)
1157104f784Smrg#define READ_VPR(pSmi, vpr)		MMIO_IN32(pSmi->VPRBase, vpr)
1167104f784Smrg#define WRITE_CPR(pSmi, cpr, data)					\
1177104f784Smrg    do {								\
1187104f784Smrg	MMIO_OUT32(pSmi->CPRBase, cpr, data);				\
1197104f784Smrg	DEBUG("CPR%02X = %08X\n", cpr, data);				\
1207104f784Smrg    } while (0)
1217104f784Smrg#define READ_CPR(pSmi, cpr)		MMIO_IN32(pSmi->CPRBase, cpr)
1227104f784Smrg#define WRITE_FPR(pSmi, fpr, data)					\
1237104f784Smrg    do {								\
1247104f784Smrg	MMIO_OUT32(pSmi->FPRBase, fpr, data);				\
1257104f784Smrg	DEBUG("FPR%02X = %08X\n", fpr, data);				\
1267104f784Smrg    } while (0)
1277104f784Smrg#define READ_FPR(pSmi, fpr)		MMIO_IN32(pSmi->FPRBase, fpr)
1287104f784Smrg#define WRITE_DCR(pSmi, dcr, data)					\
1297104f784Smrg    do {								\
1307104f784Smrg	MMIO_OUT32(pSmi->DCRBase, dcr, data);				\
1317104f784Smrg	DEBUG("DCR%02X = %08X\n", dcr, data);				\
1327104f784Smrg    } while (0)
1337104f784Smrg#define READ_DCR(pSmi, dcr)		MMIO_IN32(pSmi->DCRBase, dcr)
1347104f784Smrg#define WRITE_SCR(pSmi, scr, data)					\
1357104f784Smrg    do {								\
1367104f784Smrg	MMIO_OUT32(pSmi->SCRBase, scr, data);				\
1377104f784Smrg	DEBUG("SCR%02X = %08X\n", scr, data);				\
1387104f784Smrg    } while (0)
1397104f784Smrg#define READ_SCR(pSmi, scr)		MMIO_IN32(pSmi->SCRBase, scr)
14009885543Smrg
14109885543Smrg/* 2D Engine commands */
14209885543Smrg#define SMI_TRANSPARENT_SRC	0x00000100
14309885543Smrg#define SMI_TRANSPARENT_DEST	0x00000300
14409885543Smrg
14509885543Smrg#define SMI_OPAQUE_PXL		0x00000000
14609885543Smrg#define SMI_TRANSPARENT_PXL	0x00000400
14709885543Smrg
14809885543Smrg#define SMI_MONO_PACK_8		0x00001000
14909885543Smrg#define SMI_MONO_PACK_16	0x00002000
15009885543Smrg#define SMI_MONO_PACK_32	0x00003000
15109885543Smrg
15209885543Smrg#define SMI_ROP2_SRC		0x00008000
15309885543Smrg#define SMI_ROP2_PAT		0x0000C000
15409885543Smrg#define SMI_ROP3		0x00000000
15509885543Smrg
15609885543Smrg#define SMI_BITBLT		0x00000000
15709885543Smrg#define SMI_RECT_FILL		0x00010000
15809885543Smrg#define SMI_TRAPEZOID_FILL	0x00030000
15909885543Smrg#define SMI_SHORT_STROKE    	0x00060000
16009885543Smrg#define SMI_BRESENHAM_LINE	0x00070000
16109885543Smrg#define SMI_HOSTBLT_WRITE	0x00080000
16209885543Smrg#define SMI_HOSTBLT_READ	0x00090000
16309885543Smrg#define SMI_ROTATE_BLT		0x000B0000
16409885543Smrg
16509885543Smrg#define SMI_SRC_COLOR		0x00000000
16609885543Smrg#define SMI_SRC_MONOCHROME	0x00400000
16709885543Smrg
16809885543Smrg#define SMI_GRAPHICS_STRETCH	0x00800000
16909885543Smrg
17009885543Smrg#define SMI_ROTATE_CW		0x01000000
17109885543Smrg#define SMI_ROTATE_CCW		0x02000000
17209885543Smrg
17309885543Smrg#define SMI_MAJOR_X		0x00000000
17409885543Smrg#define SMI_MAJOR_Y		0x04000000
17509885543Smrg
17609885543Smrg#define SMI_LEFT_TO_RIGHT	0x00000000
17709885543Smrg#define SMI_RIGHT_TO_LEFT	0x08000000
17809885543Smrg
17909885543Smrg#define SMI_COLOR_PATTERN	0x40000000
18009885543Smrg#define SMI_MONO_PATTERN	0x00000000
18109885543Smrg
18209885543Smrg#define SMI_QUICK_START		0x10000000
18309885543Smrg#define SMI_START_ENGINE	0x80000000
18409885543Smrg
1857104f784Smrg/* timeout value for engine waits */
1867104f784Smrg#define MAXLOOP			0x100000
1877104f784Smrg
1887104f784Smrg/* Wait until 2d engine queue is empty */
1897104f784Smrg#define	WaitQueue()							\
1907104f784Smrg    do {								\
1917104f784Smrg	int	loop = MAXLOOP;						\
1927104f784Smrg									\
1937104f784Smrg	mem_barrier();							\
1947104f784Smrg	if (IS_MSOC(pSmi)) {						\
1957104f784Smrg	    /*	20:20	2D Engine FIFO Status. This bit is read-only.
196beef1b22Smrg	     *		0:	FIFO not empty.
1977104f784Smrg	     *		1:	FIFO empty.
1987104f784Smrg	     */								\
1997104f784Smrg	    while (loop-- &&						\
2007104f784Smrg		   (READ_SCR(pSmi, 0x0000) & (1 << 20)) == 0)		\
2017104f784Smrg	        ;							\
2027104f784Smrg	}								\
2037104f784Smrg	else {								\
2047104f784Smrg	    while (loop-- &&						\
2057104f784Smrg		   !(VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX,			\
2067104f784Smrg				 VGA_SEQ_DATA, 0x16) & 0x10))		\
2077104f784Smrg	        ;							\
2087104f784Smrg	}								\
2097104f784Smrg	if (loop <= 0)							\
2107104f784Smrg	    SMI_GEReset(pScrn, 1, __LINE__, __FILE__);			\
21109885543Smrg    } while (0)
21209885543Smrg
21309885543Smrg/* Wait until GP is idle */
2147104f784Smrg#define WaitIdle()							\
2157104f784Smrg    do {								\
2167104f784Smrg	int	loop = MAXLOOP;						\
2177104f784Smrg									\
2187104f784Smrg	mem_barrier();							\
2197104f784Smrg	if (IS_MSOC(pSmi)) {						\
2207104f784Smrg	    MSOCCmdStatusRec	status;					\
2217104f784Smrg									\
2227104f784Smrg	    /* bit 0:	2d engine idle if *not set*
2237104f784Smrg	     * bit 1:	2d fifo empty if *set*
2247104f784Smrg	     * bit 2:	2d setup idle if if *not set*
2257104f784Smrg	     * bit 18:  color conversion idle if *not set*
2267104f784Smrg	     * bit 19:  command fifo empty if *set*
2277104f784Smrg	     * bit 20:  2d memory fifo empty idle if *set*
2287104f784Smrg	     */								\
2297104f784Smrg	    for (status.value = READ_SCR(pSmi, CMD_STATUS);		\
2307104f784Smrg		 loop && (status.f.engine	||			\
2317104f784Smrg			  !status.f.cmdfifo	||			\
2327104f784Smrg			  status.f.setup	||			\
2337104f784Smrg			  status.f.csc		||			\
2347104f784Smrg			  !status.f.cmdhif	||			\
2357104f784Smrg			  !status.f.memfifo);				\
2367104f784Smrg		 status.value = READ_SCR(pSmi, CMD_STATUS), loop--)	\
2377104f784Smrg		 ;							\
2387104f784Smrg	}								\
2397104f784Smrg	else {								\
2407104f784Smrg	    int	status;							\
2417104f784Smrg									\
2427104f784Smrg	    for (status = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX,		\
2437104f784Smrg				       VGA_SEQ_DATA, 0x16);		\
2447104f784Smrg		 loop && (status & 0x18) != 0x10;			\
2457104f784Smrg		 status = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX,		\
2467104f784Smrg				       VGA_SEQ_DATA, 0x16), loop--)	\
2477104f784Smrg		;				       			\
2487104f784Smrg	}								\
2497104f784Smrg	if (loop <= 0)							\
2507104f784Smrg	    SMI_GEReset(pScrn, 1, __LINE__, __FILE__);			\
25109885543Smrg    } while (0)
25209885543Smrg
25309885543Smrg
25409885543Smrg#define RGB8_PSEUDO      (-1)
25509885543Smrg#define RGB16_565         0
25609885543Smrg#define RGB16_555         1
25709885543Smrg#define RGB32_888         2
25809885543Smrg
25909885543Smrg/* register defines so we're not hardcoding numbers */
26009885543Smrg
26109885543Smrg#define FPR00                                   0x0000
26209885543Smrg
26309885543Smrg/* video window formats - I=indexed, P=packed */
26409885543Smrg#define FPR00_FMT_8I                            0x0
26509885543Smrg#define FPR00_FMT_15P                           0x1
26609885543Smrg#define FPR00_FMT_16P                           0x2
26709885543Smrg#define FPR00_FMT_32P                           0x3
26809885543Smrg#define FPR00_FMT_24P                           0x4
26909885543Smrg#define FPR00_FMT_8P                            0x5
27009885543Smrg#define FPR00_FMT_YUV422                        0x6
27109885543Smrg#define FPR00_FMT_YUV420                        0x7
27209885543Smrg
27309885543Smrg/* possible bit definitions for FPR00 - VWI = Video Window 1 */
27409885543Smrg#define FPR00_VWIENABLE                         0x00000008
27509885543Smrg#define FPR00_VWITILE                           0x00000010
27609885543Smrg#define FPR00_VWIFILTER2                        0x00000020
27709885543Smrg#define FPR00_VWIFILTER4                        0x00000040
27809885543Smrg#define FPR00_VWIKEYENABLE                      0x00000080
27909885543Smrg#define FPR00_VWIGDF_SHIFT                      16
28009885543Smrg#define FPR00_VWIGDENABLE                       0x00080000
28109885543Smrg#define FPR00_VWIGDTILE                         0x00100000
28209885543Smrg
28309885543Smrg#define FPR00_MASKBITS                          0x0000FFFF
28409885543Smrg
28509885543Smrg#define FPR04                                           0x0004
28609885543Smrg#define FPR08                                           0x0008
28709885543Smrg#define FPR0C                                           0x000C
28809885543Smrg#define FPR10                                           0x0010
28909885543Smrg#define FPR14                                           0x0014
29009885543Smrg#define FPR18                                           0x0018
29109885543Smrg#define FPR1C                                           0x001C
29209885543Smrg#define FPR20                                           0x0020
29309885543Smrg#define FPR24                                           0x0024
29409885543Smrg#define FPR58                                           0x0058
29509885543Smrg#define FPR5C                                           0x005C
29609885543Smrg#define FPR68                                           0x0068
29709885543Smrg#define FPRB0                                           0x00B0
29809885543Smrg#define FPRB4                                           0x00B4
29909885543Smrg#define FPRC4                                           0x00C4
30009885543Smrg#define FPRCC                                           0x00CC
30109885543Smrg
30209885543Smrg#define FPR158                      0x0158
30309885543Smrg#define FPR158_MASK_MAXBITS         0x07FF
30409885543Smrg#define FPR158_MASK_BOUNDARY        0x0800
30509885543Smrg#define FPR15C                      0x015C
30609885543Smrg#define FPR15C_MASK_HWCCOLORS       0x0000FFFF
30709885543Smrg#define FPR15C_MASK_HWCADDREN       0xFFFF0000
30809885543Smrg#define FPR15C_MASK_HWCENABLE       0x80000000
30909885543Smrg
3107104f784Smrg/* Maximum hardware cursor dimensions */
3117104f784Smrg#define SMILYNX_MAX_CURSOR	32
3127104f784Smrg#define SMI501_MAX_CURSOR	64
3137104f784Smrg#define SMILYNX_CURSOR_SIZE	1024
3147104f784Smrg#define SMI501_CURSOR_SIZE	2048
3157104f784Smrg#if SMI_CURSOR_ALPHA_PLANE
3167104f784Smrg/* Stored in either 4:4:4:4 or 5:6:5 format */
3177104f784Smrg# define SMI501_ARGB_CURSOR_SIZE					\
3187104f784Smrg    (SMI501_MAX_CURSOR * SMI501_MAX_CURSOR * 2)
3197104f784Smrg#endif
3207104f784Smrg
321beef1b22Smrg/* HWCursor definitions for Panel AND CRT */
3227104f784Smrg#define SMI501_MASK_HWCENABLE			0x80000000
3237104f784Smrg#define SMI501_MASK_MAXBITS			0x000007FF
3247104f784Smrg#define SMI501_MASK_BOUNDARY			0x00000800
3257104f784Smrg#define SMI501_HWCFBADDR_MASK			0x0CFFFFFF
3267104f784Smrg
32709885543Smrg/* panel sizes returned by the bios */
32809885543Smrg
32909885543Smrg#define PANEL_640x480   0x00
33009885543Smrg#define PANEL_800x600   0x01
33109885543Smrg#define PANEL_1024x768  0x02
33209885543Smrg#define PANEL_1280x1024 0x03
33309885543Smrg#define PANEL_1600x1200 0x04
33409885543Smrg#define PANEL_1400x1050 0x0A
33509885543Smrg
33609885543Smrg
33709885543Smrg#endif /* _REGSMI_H */
338