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