/* * X.org/XFree86 specific supplements to init.c/init301.c * * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1) Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2) Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3) The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Thomas Winischhofer * */ #ifndef _INITEXTX_H_ #define _INITEXTX_H_ #include "osdef.h" #include "initdef.h" #include "sis.h" #include "sis_regs.h" #ifdef SIS315H static const struct { unsigned char Ext_ModeID; /* ModeID in new ROM */ unsigned char Ext_MyModeID; /* corresponding ModeID in my tables (0 = identical) */ unsigned short Ext_VESAID; /* corresponding VESA ID in new ROM */ } SiS_EModeIDTable661[] = { { 0x6a, 0x00, 0x0102 }, { 0x1d, 0x20, 0x0000 }, { 0x1e, 0x21, 0x0000 }, { 0x1f, 0x22, 0x0000 }, { 0x20, 0x29, 0x0000 }, { 0x21, 0x2a, 0x0000 }, { 0x22, 0x2b, 0x0000 }, { 0x23, 0x00, 0x011c }, { 0x24, 0x00, 0x011d }, { 0x25, 0x00, 0x011e }, { 0x26, 0x00, 0x011f }, { 0x27, 0x00, 0x0120 }, { 0x28, 0x00, 0x0121 }, { 0x2a, 0x14, 0x013d }, { 0x2b, 0x15, 0x013e }, { 0x2c, 0x16, 0x013f }, { 0x2e, 0x00, 0x0101 }, { 0x2f, 0x00, 0x0100 }, { 0x30, 0x00, 0x0103 }, { 0x37, 0x00, 0x0104 }, { 0x38, 0x00, 0x0105 }, { 0x3a, 0x00, 0x0107 }, { 0x3c, 0x00, 0x0125 }, { 0x3d, 0x00, 0x0126 }, { 0x40, 0x00, 0x010d }, { 0x41, 0x00, 0x010e }, { 0x43, 0x00, 0x0110 }, { 0x44, 0x00, 0x0111 }, { 0x46, 0x00, 0x0113 }, { 0x47, 0x00, 0x0114 }, { 0x49, 0x00, 0x0116 }, { 0x4a, 0x00, 0x0117 }, { 0x4c, 0x00, 0x0119 }, { 0x4d, 0x00, 0x011a }, { 0x50, 0x00, 0x0127 }, { 0x51, 0x00, 0x0128 }, { 0x52, 0x00, 0x0129 }, { 0x53, 0x1a, 0x0141 }, { 0x54, 0x1b, 0x0142 }, { 0x55, 0x1c, 0x0143 }, { 0x56, 0x00, 0x012a }, { 0x57, 0x00, 0x012b }, { 0x58, 0x00, 0x012c }, { 0x59, 0x00, 0x012d }, { 0x5a, 0x17, 0x012e }, { 0x5b, 0x18, 0x012f }, { 0x5c, 0x19, 0x0130 }, { 0x5d, 0x00, 0x0131 }, { 0x62, 0x00, 0x0112 }, { 0x63, 0x00, 0x0115 }, { 0x64, 0x00, 0x0118 }, { 0x65, 0x00, 0x011b }, { 0x66, 0x00, 0x0132 }, { 0x75, 0x00, 0x013a }, { 0x78, 0x00, 0x013b }, { 0x79, 0x00, 0x013c }, { 0x7b, 0x7c, 0x0136 }, { 0x7c, 0x7d, 0x0137 }, { 0x7d, 0x7e, 0x0138 }, { 0xff, 0xff, 0xffff } }; #endif #define SIS_PL_HSYNCP 0x01 #define SIS_PL_HSYNCN 0x02 #define SIS_PL_VSYNCP 0x04 #define SIS_PL_VSYNCN 0x08 #define SIS_PL_DVI 0x80 struct SiS_PlasmaModes { const char *name; unsigned int clock; unsigned short HDisplay, HTotal, HFrontPorch, HSyncWidth; unsigned short VDisplay, VTotal, VFrontPorch, VSyncWidth; unsigned char SyncFlags; }; struct SiS_PlasmaTables { unsigned short vendor; unsigned char productnum; unsigned short product[5]; const char *DDCnames[5]; const char *plasmaname; unsigned short maxx,maxy; unsigned short prefx, prefy; unsigned char modenum; unsigned char plasmamodes[20]; /* | 0x80 = DVI-capable, | 0x40 = analog */ }; static const struct SiS_PlasmaModes SiS_PlasmaMode[] = { { "640x400", /* 00: IBM 400@70 */ 25175, 640, 800, 17, 64, 400, 449, 13, 2, SIS_PL_HSYNCN | SIS_PL_VSYNCN }, { "640x480", /* 01: VESA 480@72 */ 31500, 640, 832, 24, 40, 480, 520, 9, 3, SIS_PL_HSYNCN | SIS_PL_VSYNCN }, { "800x600", /* 02: VESA 600@72 */ 50000, 800, 1040, 56, 120, 600, 666, 37, 6, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "864x480", /* 03: Cereb wide 1 */ 42526, 864, 1134, 22, 86, 480, 500, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCN }, { "848x480", /* 04: VESA wide (NEC1) */ 33750, 848, 1088, 16, 112, 480, 517, 6, 8, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1024x576", /* 05: VESA wide (NEC2) */ 47250, 1024, 1320, 16, 144, 576, 596, 2, 4, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x720", /* 06: VESA wide (NEC3) */ 76500, 1280, 1696, 48, 176, 720, 750, 4, 8, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1360x765", /* 07: VESA wide (NEC4) */ 85500, 1360, 1792, 64, 176, 765, 795, 4, 8, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1024x600", /* 08: CEREB wide 2 */ 51200, 1024, 1352, 51, 164, 600, 628, 1, 4, SIS_PL_HSYNCN | SIS_PL_VSYNCP }, { "1024x768", /* 09: VESA 768@75 */ 78750, 1024, 1312, 16, 96, 768, 800, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1152x864", /* 10: VESA 1152x864@75 */ 108000, 1152, 1600, 64, 128, 864, 900, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x1024", /* 11: VESA 1024@60 */ 108000, 1280, 1688, 48, 112, 1024, 1066, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x768", /* 12: W_XGA */ 81000, 1280, 1688, 48, 112, 768, 802, 3, 6, SIS_PL_HSYNCP | SIS_PL_VSYNCN }, { "1280x768", /* 13: I/O Data W_XGA@56Hz */ 76064, 1280, 1688, 48, 112, 768, 802, 2, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1376x768", /* 14: I/O Wide XGA */ 87340, 1376, 1808, 32, 128, 768, 806, 3, 6, SIS_PL_HSYNCN | SIS_PL_VSYNCP }, { "1280x960", /* 15: VESA 960@60 */ 108000, 1280, 1800, 96, 112, 960, 1000, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1400x1050", /* 16: VESA 1050@60Hz */ 108000, 1400, 1688, 48, 112, 1050, 1066, 1, 3, SIS_PL_HSYNCN | SIS_PL_VSYNCN }, { "1360x768", /* 17: VESA wide (NEC4/2) */ 85500, 1360, 1792, 64, 112, 765, 795, 3, 6, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "800x600", /* 18: VESA 600@56 */ 36000, 800, 1024, 24, 2, 600, 625, 1, 2, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1072x600", /* 19: Panasonic 1072x600 (sync?) */ 54100, 1072, 1424, 48, 176, 600, 628, 16, 1, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "848x480", /* 20: Panasonic 848x480 (sync?) */ 33070, /* is 852x480, but we can't use 852 */ 848, 1068, 20, 40, /* differs from DDC data, better centered */ 480, 516, 3, 5, /* won't work assumingly, because data is % 8 */ SIS_PL_HSYNCN | SIS_PL_VSYNCN }, { "1280x720", /* 21: WIDE720(60) (aka "750p") (Panasonic) */ 74300, 1280, 1650,110, 40, 720, 750, 5, 5, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x768", /* 22: 1280x768@56.5 (Panasonic) */ 76200, /* (According to manual not supported for HDMI; but works) */ 1280, 1680, 16, 24, 768, 802, 2, 5, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x720@50", /* 23: WIDE720(50) (aka "750p") (Panasonic) */ 74300, /* Panasonic states 45.0kHz. Not possible. This one works (with some overscan) */ 1280, 1980,400, 80, 720, 750, 1, 2, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "720x480", /* 24: 720x480 (aka "525p" and "480p") (Panasonic) */ 27000, 720, 856, 40, 32, 480, 525, 1, 3, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "720x576", /* 25: 720x576 (aka "625p"and "576p") (Panasonic) */ 27500, 720, 864, 16, 64, 576, 625, 5, 6, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, { "1280x720@50", /* 26: WIDE720(50) (aka "750p") (Generic) */ 74300, 1280, 1980,400, 80, 720, 750, 5, 5, SIS_PL_HSYNCP | SIS_PL_VSYNCP }, }; /* 27.00 720 755 791 858 480 480 484 525 27.50 720 732 795 864 576 581 587 625 */ static const struct SiS_PlasmaTables SiS_PlasmaTable[] = { #if 0 /* Product IDs missing */ { 0x38a3, 4, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG", 0, 0, 0, 0, 11, /* All DVI, except 0, 7, 13 */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, 17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, #endif #if 0 /* Product IDs missing */ { 0x38a3, 3, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 42PD1/50PD1/50PD2", 0, 0, 0, 0, 5, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 42PD3", 0, 0, 0, 0, 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 42VM3/61XM1", 0, 0, 0, 0, 11, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0, 17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 42MP1/42MP2", 0, 0, 0, 0, 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 50MP1", 0, 0, 0, 0, 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, #endif { 0x38a3, 4, { 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 }, { "PX-42VM", "", "", "", "" }, "NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1", 0, 0, 0, 0, 11, /* All DVI except 0, 7, 13, 17 */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, 17|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, #if 0 /* Product IDs missing */ { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 3300W", 0, 0, 0, 0, 3, { 0|0x40, 1|0xc0,18|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 4200W", 4, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 4210W", 0, 0, 0, 0, 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "NEC PlasmaSync 5000W", 0, 0, 0, 0, 7, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, #endif { 0x412f, 2, { 0x000c, 0x000b, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "Pioneer 503CMX/PDA-5002", 0, 0, 0, 0, 6, /* DVI unknown */ { 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x34a9, 1, { 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 }, { "", "", "", "", "" }, "Panasonic TH-42", 0, 0, 0, 0, 5, /* No DVI output */ { 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x34a9, 1, { 0xa005, 0x0000, 0x0000, 0x0000, 0x0000 }, { "TH-42PW*4", "", "", "", "" }, "Panasonic TH-42PW5", 0, 0, 0, 0, 1, /* No special modes otherwise; no DVI. */ {20|0x40,19|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x4c2e, 1, { 0x9b05, 0x0000, 0x0000, 0x0000, 0x0000 }, { "PLV-Z2", "", "", "", "" }, "Sanyo PLV-Z2 (non HDCP-mode)", /* HDCP mode would be id 9b06, but not needed */ 1280, 768, /* as it then advertises correct size */ 1280, 720, 1, /* 1280x720, no special modes otherwise */ {21|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x34a9, 1, { 0xd034, 0x0000, 0x0000, 0x0000, 0x0000 }, { "AE500U (DVI-D)", "", "", "", "" }, "Panasonic AE500U", 1280, 768, 1280, 720, 1, /* 1280x720, no special modes otherwise */ {21|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x34a9, 1, { 0xd043, 0x0000, 0x0000, 0x0000, 0x0000 }, { "AE700U (HDMI)", "", "", "", "" }, "Panasonic AE700U", 1360, 768, 1280, 720, 6, /* 1280x720/60, 1280x720/50, 1280x768@56(digital/analog), 720x480, 720x576 */ {21|0xc0,23|0xc0,22|0x80,13|0x40,24|0x80,25|0x80, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, { 0x0000 } }; unsigned short SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned int VBFlags); DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN); int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber); int SiSTranslateToOldMode(int modenumber); BOOLEAN SiS_GetPanelID(struct SiS_Private *SiS_Pr); unsigned short SiS_SenseLCDDDC(struct SiS_Private *SiS_Pr, SISPtr pSiS); unsigned short SiS_SenseVGA2DDC(struct SiS_Private *SiS_Pr, SISPtr pSiS); void SiS_CalcXTapScaler(struct SiS_Private *SiS_Pr, int srcsize, int destsize, int taps, Bool ishoriz); void SiS_SetGroup2_C_ELV(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex); extern unsigned char SiS_GetReg(SISIOADDRESS port, unsigned short index); extern void SiS_SetReg(SISIOADDRESS port, unsigned short index, unsigned short data); extern void SiS_SetRegOR(SISIOADDRESS, unsigned short, unsigned short); extern void SiS_SetRegAND(SISIOADDRESS, unsigned short, unsigned short); extern void SiS_SetRegANDOR(SISIOADDRESS Port, unsigned short Index, unsigned short DataAND, unsigned short DataOR); extern int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div, int *out_sbit, int *out_scale); extern void SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk); extern void SiS_CalcCRRegisters(struct SiS_Private *SiS_Pr, int depth); extern BOOLEAN SiSInitPtr(struct SiS_Private *SiS_Pr); extern unsigned short SiS_GetRefCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide); extern unsigned short SiS_GetRefCRTVCLK(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide); extern void SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata, int xres, int yres, DisplayModePtr current); extern unsigned short SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine, unsigned short adaptnum, unsigned short DDCdatatype, BOOLEAN checkcr32, unsigned int VBFlags2); extern unsigned short SiS_ProbeDDC(struct SiS_Private *SiS_Pr); extern unsigned short SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype, unsigned char *buffer); #endif