17706df26Smrg/* 27706df26Smrg * Copyright 1997,1998 by Alan Hourihane <alanh@fairlite.demon.co.uk> 37706df26Smrg * 47706df26Smrg * Permission to use, copy, modify, distribute, and sell this software and its 57706df26Smrg * documentation for any purpose is hereby granted without fee, provided that 67706df26Smrg * the above copyright notice appear in all copies and that both that 77706df26Smrg * copyright notice and this permission notice appear in supporting 87706df26Smrg * documentation, and that the name of Alan Hourihane not be used in 97706df26Smrg * advertising or publicity pertaining to distribution of the software without 107706df26Smrg * specific, written prior permission. Alan Hourihane makes no representations 117706df26Smrg * about the suitability of this software for any purpose. It is provided 127706df26Smrg * "as is" without express or implied warranty. 137706df26Smrg * 147706df26Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 157706df26Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 167706df26Smrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 177706df26Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 187706df26Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 197706df26Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 207706df26Smrg * PERFORMANCE OF THIS SOFTWARE. 217706df26Smrg * 227706df26Smrg * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 237706df26Smrg */ 247706df26Smrg 257706df26Smrg#ifdef HAVE_CONFIG_H 267706df26Smrg#include "config.h" 277706df26Smrg#endif 287706df26Smrg 297706df26Smrg#include "xf86.h" 307706df26Smrg#include "xf86_OSproc.h" 317706df26Smrg 327706df26Smrg#include "xf86PciInfo.h" 337706df26Smrg#include "xf86Pci.h" 347706df26Smrg 357706df26Smrg#include "BT.h" 367706df26Smrg#include "tga_regs.h" 377706df26Smrg#include "tga.h" 387706df26Smrg 397706df26Smrgstatic void ICS1562ClockSelect(ScrnInfoPtr pScrn, int freq); 407706df26Smrgstatic void ICS9110ClockSelect(ScrnInfoPtr pScrn, int freq); 417706df26Smrgextern void ICS1562_CalcClockBits(long f, unsigned char *bits); 427706df26Smrg 437706df26Smrgstatic void 447706df26SmrgICS1562ClockSelect(ScrnInfoPtr pScrn, int freq) 457706df26Smrg{ 467706df26Smrg TGAPtr pTga = TGAPTR(pScrn); 477706df26Smrg unsigned char pll_bits[7]; 487706df26Smrg unsigned long temp; 497706df26Smrg int i, j; 507706df26Smrg 517706df26Smrg /* There lies an ICS1562 Clock Generator. */ 527706df26Smrg ICS1562_CalcClockBits(freq, pll_bits); 537706df26Smrg 547706df26Smrg /* 557706df26Smrg * For the DEC 21030 TGA: 567706df26Smrg * This requires the 55 clock bits be written in a serial manner to 577706df26Smrg * bit 0 of the CLOCK register and on the 56th bit set the hold flag. 587706df26Smrg */ 597706df26Smrg for (i = 0;i <= 6; i++) { 607706df26Smrg for (j = 0; j <= 7; j++) { 617706df26Smrg temp = (pll_bits[i] >> (7-j)) & 1; 627706df26Smrg if (i == 6 && j == 7) 637706df26Smrg temp |= 2; 647706df26Smrg TGA_WRITE_REG(temp, TGA_CLOCK_REG); 657706df26Smrg } 667706df26Smrg } 677706df26Smrg} 687706df26Smrg 697706df26Smrgstruct monitor_data tga_crystal_table[] = { 707706df26Smrg{ 717706df26Smrg/* Option 0 Monitor Info 130.8 */ 727706df26Smrg1024, /* rows */ 737706df26Smrg1280, /* columns */ 747706df26Smrg130, /* 130.8 Mhz */ 757706df26Smrg72, /* refresh rate */ 767706df26Smrg1024, /* v scanlines */ 777706df26Smrg3, /* v front porch */ 787706df26Smrg3, /* v sync */ 797706df26Smrg33, /* v back porch */ 807706df26Smrg1280, /* h pixels */ 817706df26Smrg32, /* h front porch */ 827706df26Smrg160, /* h sync */ 837706df26Smrg232, /* h back porch */ 847706df26Smrg/* AV9110 clock serial load information 130.808 */ 857706df26Smrg0x40, /* 0:6 VCO frequency divider N */ 867706df26Smrg0x7, /* 7:13 Reference frequency divide M */ 877706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 887706df26Smrg*/ 897706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 907706df26Smrg0x1, /* 17:18 VCO output divide R */ 917706df26Smrg1, /* 19 CLK Output enable. */ 927706df26Smrg1, /* 20 CLK/X Output enable */ 937706df26Smrg0, /* reserved, should be set to 0 */ 947706df26Smrg0, /* Reference clock select on CLK 1=ref */ 957706df26Smrg1, /* reserved, should be set to 1 */ 967706df26Smrg/* IBM561 PLL setup data 130.808 */ 977706df26Smrg0xC8, /* VCO Div: PFR=0x3, M-65=49 */ 987706df26Smrg0x8 /* REF: N=0x8 */ 997706df26Smrg}, 1007706df26Smrg{ 1017706df26Smrg/* Option 3 Monitor Info 104.00 Mhz */ 1027706df26Smrg900, /* rows */ 1037706df26Smrg1152, /* columns */ 1047706df26Smrg104, /* 104 Mhz */ 1057706df26Smrg72, /* refresh rate */ 1067706df26Smrg900, /* v scanlines */ 1077706df26Smrg6, /* v front porch */ 1087706df26Smrg10, /* v sync */ 1097706df26Smrg44, /* v back porch */ 1107706df26Smrg1152, /* h pixels */ 1117706df26Smrg64, /* h front porch */ 1127706df26Smrg112, /* h sync */ 1137706df26Smrg176, /* h back porch */ 1147706df26Smrg/* 103.994 MHz av9110 clock serial load information */ 1157706df26Smrg0x6d, /* 0:6 VCO frequency divider N */ 1167706df26Smrg0xf, /* 7:13 Reference frequency divide M */ 1177706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 1187706df26Smrg*/ 1197706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 1207706df26Smrg0x1, /* 17:18 VCO output divide R */ 1217706df26Smrg1, /* 19 CLK Output enable. */ 1227706df26Smrg1, /* 20 CLK/X Output enable */ 1237706df26Smrg0, /* reserved, should be set to 0 */ 1247706df26Smrg0, /* Reference clock select on CLK 1=ref */ 1257706df26Smrg1, /* reserved, should be set to 1 */ 1267706df26Smrg/* 104.00 MHz IBM561 PLL setup data */ 1277706df26Smrg0x96, /* VCO Div: PFR=2, M=57 */ 1287706df26Smrg0x6 /* REF: N=6 */ 1297706df26Smrg}, 1307706df26Smrg#if 1 1317706df26Smrg{ 1327706df26Smrg/* Option 6 Monitor Info 74.00 Mhz */ 1337706df26Smrg768, /* rows */ 1347706df26Smrg1024, /* columns */ 1357706df26Smrg74, /* 74 Mhz */ 1367706df26Smrg72, /* refresh rate */ 1377706df26Smrg768, /* v scanlines */ 1387706df26Smrg1, /* v front porch */ 1397706df26Smrg6, /* v sync */ 1407706df26Smrg22, /* v back porch */ 1417706df26Smrg1024, /* h pixels */ 1427706df26Smrg16, /* h front porch */ 1437706df26Smrg128, /* h sync */ 1447706df26Smrg128, /* h back porch */ 1457706df26Smrg/* 74.00 MHz AV9110 clock serial load information */ 1467706df26Smrg0x2a, /* 0:6 VCO frequency divider N */ 1477706df26Smrg0x41, /* 7:13 Reference frequency divide M */ 1487706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 1497706df26Smrg*/ 1507706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 1517706df26Smrg0x1, /* 17:18 VCO output divide R */ 1527706df26Smrg1, /* 19 CLK Output enable. */ 1537706df26Smrg1, /* 20 CLK/X Output enable */ 1547706df26Smrg0, /* reserved, should be set to 0 */ 1557706df26Smrg0, /* Reference clock select on CLK 1=ref */ 1567706df26Smrg1, /* reserved, should be set to 1 */ 1577706df26Smrg/* 74.00 MHz IBM561 PLL setup data */ 1587706df26Smrg0x9C, /* VCO Div: PFR=2, M=0x5D*/ 1597706df26Smrg0x9 /* REF: N=0x9 */ 1607706df26Smrg}, 1617706df26Smrg#else 1627706df26Smrg{ 1637706df26Smrg/* Option 5 Monitor Info 75.00 Mhz */ 1647706df26Smrg768, /* rows */ 1657706df26Smrg1024, /* columns */ 1667706df26Smrg75, /* 74 Mhz */ 1677706df26Smrg70, /* refresh rate */ 1687706df26Smrg768, /* v scanlines */ 1697706df26Smrg3, /* v front porch */ 1707706df26Smrg6, /* v sync */ 1717706df26Smrg29, /* v back porch */ 1727706df26Smrg1024, /* h pixels */ 1737706df26Smrg24, /* h front porch */ 1747706df26Smrg136, /* h sync */ 1757706df26Smrg144, /* h back porch */ 1767706df26Smrg/* 75.00 MHz AV9110 clock serial load information */ 1777706df26Smrg0x6e, /* 0:6 VCO frequency divider N */ 1787706df26Smrg0x15, /* 7:13 Reference frequency divide M */ 1797706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 1807706df26Smrg*/ 1817706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 1827706df26Smrg0x1, /* 17:18 VCO output divide R */ 1837706df26Smrg1, /* 19 CLK Output enable. */ 1847706df26Smrg1, /* 20 CLK/X Output enable */ 1857706df26Smrg0, /* reserved, should be set to 0 */ 1867706df26Smrg0, /* Reference clock select on CLK 1=ref */ 1877706df26Smrg1, /* reserved, should be set to 1 */ 1887706df26Smrg/* 75.00 MHz IBM561 PLL setup data */ 1897706df26Smrg0x93, /* VCO Div: PFR=2, M=0x54 */ 1907706df26Smrg0x8 /* REF: N=0x8 */ 1917706df26Smrg}, 1927706df26Smrg#endif 1937706df26Smrg{ 1947706df26Smrg/* Option 9 Monitor Info 50 Mhz ergo SVGA */ 1957706df26Smrg600, /* rows */ 1967706df26Smrg800, /* columns */ 1977706df26Smrg50, /* 50 Mhz */ 1987706df26Smrg72, /* refresh rate */ 1997706df26Smrg600, /* v scanlines */ 2007706df26Smrg37, /*(31 tga)v front porch */ 2017706df26Smrg6, /* v sync */ 2027706df26Smrg23, /*(29 tga)v back porch */ 2037706df26Smrg800, /* h pixels */ 2047706df26Smrg56, /* h front porch */ 2057706df26Smrg120, /* h sync */ 2067706df26Smrg64, /* h back porch */ 2077706df26Smrg/*50.00 Mhz AV9110 clock serial load information */ 2087706df26Smrg0x37, /* 0:6 VCO frequency divider N */ 2097706df26Smrg0x3f, /* 7:13 Reference frequency divide M */ 2107706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 2117706df26Smrg*/ 2127706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 2137706df26Smrg0x2, /* 17:18 VCO output divide R */ 2147706df26Smrg1, /* 19 CLK Output enable. */ 2157706df26Smrg1, /* 20 CLK/X Output enable */ 2167706df26Smrg0, /* reserved, should be set to 0 */ 2177706df26Smrg0, /* Reference clock select on CLK 1=ref */ 2187706df26Smrg1, /* reserved, should be set to 1 */ 2197706df26Smrg/* 50.00 MHz IBM561 PLL setup data */ 2207706df26Smrg0x45, /* VCO Div: PFR=1, M=46*/ 2217706df26Smrg0x5 /* REF: N=5 */ 2227706df26Smrg}, 2237706df26Smrg{ 2247706df26Smrg/* Option B Monitor Info 31.5 Mhz ergo VGA */ 2257706df26Smrg480, /* rows */ 2267706df26Smrg640, /* columns */ 2277706df26Smrg32, /* 32 Mhz */ 2287706df26Smrg72, /* refresh rate */ 2297706df26Smrg480, /* v scanlines */ 2307706df26Smrg9, /* v front porch */ 2317706df26Smrg3, /* v sync */ 2327706df26Smrg28, /* v back porch */ 2337706df26Smrg640, /* h pixels */ 2347706df26Smrg24, /* h front porch */ 2357706df26Smrg40, /* h sync */ 2367706df26Smrg128, /* h back porch */ 2377706df26Smrg/* 31.50 MHz AV9110 clock serial load information */ 2387706df26Smrg0x16, /* 0:6 VCO frequency divider N */ 2397706df26Smrg0x05, /* 7:13 Reference frequency divide M */ 2407706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 2417706df26Smrg*/ 2427706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 2437706df26Smrg0x2, /* 17:18 VCO output divide R */ 2447706df26Smrg1, /* 19 CLK Output enable. */ 2457706df26Smrg1, /* 20 CLK/X Output enable */ 2467706df26Smrg0, /* reserved, should be set to 0 */ 2477706df26Smrg0, /* Reference clock select on CLK 1=ref */ 2487706df26Smrg1, /* reserved, should be set to 1 */ 2497706df26Smrg/* 31.50 MHz IBM561 PLL setup data */ 2507706df26Smrg0x17, /* VCO Div: PFR=0, M=0x58 */ 2517706df26Smrg0x5 /* REF: N=0x5 */ 2527706df26Smrg}, 2537706df26Smrg#ifdef ALLOW_LT_72_HZ 2547706df26Smrg{ 2557706df26Smrg/* Option 1 Monitor Info 119.84 Mhz */ 2567706df26Smrg1024, /* rows */ 2577706df26Smrg1280, /* columns */ 2587706df26Smrg119, /* 119 Mhz */ 2597706df26Smrg66, /* refresh rate */ 2607706df26Smrg1024, /* v scanlines */ 2617706df26Smrg3, /* v front porch */ 2627706df26Smrg3, /* v sync */ 2637706df26Smrg33, /* v back porch */ 2647706df26Smrg1280, /* h pixels */ 2657706df26Smrg32, /* h front porch */ 2667706df26Smrg160, /* h sync */ 2677706df26Smrg232, /* h back porch */ 2687706df26Smrg/* 119.84MHz AV9110 clock serial load information */ 2697706df26Smrg0x2d, /* 0:6 VCO frequency divider N */ 2707706df26Smrg0x2b, /* 7:13 Reference frequency divide M */ 2717706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ 2727706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 2737706df26Smrg0x1, /* 17:18 VCO output divide R */ 2747706df26Smrg1, /* 19 CLK Output enable. */ 2757706df26Smrg1, /* 20 CLK/X Output enable */ 2767706df26Smrg0, /* reserved, should be set to 0 */ 2777706df26Smrg0, /* Reference clock select on CLK 1=ref */ 2787706df26Smrg1, /* reserved, should be set to 1 */ 2797706df26Smrg/* IBM561 PLL setup data 119.84 */ 2807706df26Smrg0x82, /* VCO Div: PFR=0x2, M=0x43 */ 2817706df26Smrg0x4 /* REF: N=0x4 */ 2827706df26Smrg}, 2837706df26Smrg{ 2847706df26Smrg/* Option 2 Monitor Info 108.18 Mhz */ 2857706df26Smrg1024, /* rows */ 2867706df26Smrg1280, /* columns */ 2877706df26Smrg108, /* 108 Mhz */ 2887706df26Smrg60, /* refresh rate */ 2897706df26Smrg1024, /* v scanlines */ 2907706df26Smrg3, /* v front porch */ 2917706df26Smrg3, /* v sync */ 2927706df26Smrg26, /* v back porch */ 2937706df26Smrg1280, /* h pixels */ 2947706df26Smrg44, /* h front porch */ 2957706df26Smrg184, /* h sync */ 2967706df26Smrg200, /* h back porch */ 2977706df26Smrg/* 108.18 MHz av9110 Clk serial load information */ 2987706df26Smrg0x11, /* 0:6 VCO frequency divider N */ 2997706df26Smrg0x9, /* 7:13 Reference frequency divide M */ 3007706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 3017706df26Smrg*/ 3027706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 3037706df26Smrg0x2, /* 17:18 VCO output divide R */ 3047706df26Smrg1, /* 19 CLK Output enable. */ 3057706df26Smrg1, /* 20 CLK/X Output enable */ 3067706df26Smrg0, /* reserved, should be set to 0 */ 3077706df26Smrg0, /* Reference clock select on CLK 1=ref */ 3087706df26Smrg1, /* reserved, should be set to 1 */ 3097706df26Smrg/* 108.18 MHz IBM561 PLL setup data */ 3107706df26Smrg0xB8, /* VCO Div: PFR=2, M=79 */ 3117706df26Smrg0x8 /* REF: N=0x8 */ 3127706df26Smrg}, 3137706df26Smrg{ 3147706df26Smrg/* Option 5 Monitor Info 75.00 Mhz */ 3157706df26Smrg768, /* rows */ 3167706df26Smrg1024, /* columns */ 3177706df26Smrg75, /* 74 Mhz */ 3187706df26Smrg70, /* refresh rate */ 3197706df26Smrg768, /* v scanlines */ 3207706df26Smrg3, /* v front porch */ 3217706df26Smrg6, /* v sync */ 3227706df26Smrg29, /* v back porch */ 3237706df26Smrg1024, /* h pixels */ 3247706df26Smrg24, /* h front porch */ 3257706df26Smrg136, /* h sync */ 3267706df26Smrg144, /* h back porch */ 3277706df26Smrg/* 75.00 MHz AV9110 clock serial load information */ 3287706df26Smrg0x6e, /* 0:6 VCO frequency divider N */ 3297706df26Smrg0x15, /* 7:13 Reference frequency divide M */ 3307706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 3317706df26Smrg*/ 3327706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 3337706df26Smrg0x1, /* 17:18 VCO output divide R */ 3347706df26Smrg1, /* 19 CLK Output enable. */ 3357706df26Smrg1, /* 20 CLK/X Output enable */ 3367706df26Smrg0, /* reserved, should be set to 0 */ 3377706df26Smrg0, /* Reference clock select on CLK 1=ref */ 3387706df26Smrg1, /* reserved, should be set to 1 */ 3397706df26Smrg/* 75.00 MHz IBM561 PLL setup data */ 3407706df26Smrg0x93, /* VCO Div: PFR=2, M=0x54 */ 3417706df26Smrg0x8 /* REF: N=0x8 */ 3427706df26Smrg}, 3437706df26Smrg{ 3447706df26Smrg/* Option 7 Monitor Info 69 Mhz DEC 72 Hz */ 3457706df26Smrg864, /* rows */ 3467706df26Smrg1024, /* columns */ 3477706df26Smrg69, /* 69.x Mhz */ 3487706df26Smrg60, /* refresh rate */ 3497706df26Smrg864, /* v scanlines */ 3507706df26Smrg0, /* v front porch */ 3517706df26Smrg3, /* v sync */ 3527706df26Smrg34, /* v back porch */ 3537706df26Smrg1024, /* h pixels */ 3547706df26Smrg12, /* h front porch */ 3557706df26Smrg128, /* h sync */ 3567706df26Smrg116, /* h back porch */ 3577706df26Smrg/* 69.00 Mhz AV9110 clock serial load information */ 3587706df26Smrg0x35, /* 0:6 VCO frequency divider N */ 3597706df26Smrg0xb, /* 7:13 Reference frequency divide M */ 3607706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 3617706df26Smrg*/ 3627706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 3637706df26Smrg0x1, /* 17:18 VCO output divide R */ 3647706df26Smrg1, /* 19 CLK Output enable. */ 3657706df26Smrg1, /* 20 CLK/X Output enable */ 3667706df26Smrg0, /* reserved, should be set to 0 */ 3677706df26Smrg0, /* Reference clock select on CLK 1=ref */ 3687706df26Smrg1, /* reserved, should be set to 1 */ 3697706df26Smrg/* 69.00 MHz IBM561 PLL setup data */ 3707706df26Smrg0xA9, /* VCO Div: PFR=2, M=0x6A */ 3717706df26Smrg0xB /* REF: N=0xB */ 3727706df26Smrg}, 3737706df26Smrg{ 3747706df26Smrg/* Option 8 Monitor Info 65 Mhz */ 3757706df26Smrg768, /* rows */ 3767706df26Smrg1024, /* columns */ 3777706df26Smrg65, /* 65 Mhz */ 3787706df26Smrg60, /* refresh rate */ 3797706df26Smrg768, /* v scanlines */ 3807706df26Smrg7, /* v front porch */ 3817706df26Smrg9, /* v sync */ 3827706df26Smrg26, /* v back porch */ 3837706df26Smrg1024, /* h pixels */ 3847706df26Smrg56, /* h front porch */ 3857706df26Smrg64, /* h sync */ 3867706df26Smrg200, /* h back porch */ 3877706df26Smrg/* 65.00 MHz AV9110 clock serial load information */ 3887706df26Smrg0x6d, /* 0:6 VCO frequency divider N */ 3897706df26Smrg0x0c, /* 7:13 Reference frequency divide M */ 3907706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 3917706df26Smrg*/ 3927706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 3937706df26Smrg0x2, /* 17:18 VCO output divide R */ 3947706df26Smrg1, /* 19 CLK Output enable. */ 3957706df26Smrg1, /* 20 CLK/X Output enable */ 3967706df26Smrg0, /* reserved, should be set to 0 */ 3977706df26Smrg0, /* Reference clock select on CLK 1=ref */ 3987706df26Smrg1, /* reserved, should be set to 1 */ 3997706df26Smrg/* 65.00 MHz IBM561 PLL setup data */ 4007706df26Smrg0xAC, /* VCO Div: PFR=2, M=0x6D */ 4017706df26Smrg0xC /* REF: N=0xC */ 4027706df26Smrg}, 4037706df26Smrg{ 4047706df26Smrg/* Option A Monitor Info 40 Mhz SVGA */ 4057706df26Smrg600, /* rows */ 4067706df26Smrg800, /* columns */ 4077706df26Smrg40, /* 40 Mhz */ 4087706df26Smrg60, /* refresh rate */ 4097706df26Smrg600, /* v scanlines */ 4107706df26Smrg1, /* v front porch */ 4117706df26Smrg4, /* v sync */ 4127706df26Smrg23, /* v back porch */ 4137706df26Smrg800, /* h pixels */ 4147706df26Smrg40, /* h front porch */ 4157706df26Smrg128, /* h sync */ 4167706df26Smrg88, /* h back porch */ 4177706df26Smrg/* 40.00 MHz AV9110 clock serial load information */ 4187706df26Smrg0x5f, /* 0:6 VCO frequency divider N */ 4197706df26Smrg0x11, /* 7:13 Reference frequency divide M */ 4207706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 4217706df26Smrg*/ 4227706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 4237706df26Smrg0x2, /* 17:18 VCO output divide R */ 4247706df26Smrg1, /* 19 CLK Output enable. */ 4257706df26Smrg1, /* 20 CLK/X Output enable */ 4267706df26Smrg0, /* reserved, should be set to 0 */ 4277706df26Smrg0, /* Reference clock select on CLK 1=ref */ 4287706df26Smrg1, /* reserved, should be set to 1 */ 4297706df26Smrg/* 40.00 MHz IBM561 PLL setup data */ 4307706df26Smrg0x42, /* VCO Div: PFR=1, M=43 */ 4317706df26Smrg0x6 /* REF: N=0x6 */ 4327706df26Smrg}, 4337706df26Smrg{ 4347706df26Smrg/* Option C Monitor Info 25.175 Mhz VGA */ 4357706df26Smrg480, /* rows */ 4367706df26Smrg640, /* columns */ 4377706df26Smrg25, /* 25.175 Mhz */ 4387706df26Smrg60, /* refresh rate */ 4397706df26Smrg480, /* v scanlines */ 4407706df26Smrg10, /* v front porch */ 4417706df26Smrg2, /* v sync */ 4427706df26Smrg33, /* v back porch */ 4437706df26Smrg640, /* h pixels */ 4447706df26Smrg16, /* h front porch */ 4457706df26Smrg96, /* h sync */ 4467706df26Smrg48, /* h back porch */ 4477706df26Smrg/* 25.175 MHz AV9110 clock serial load information */ 4487706df26Smrg0x66, /* 0:6 VCO frequency divider N */ 4497706df26Smrg0x1d, /* 7:13 Reference frequency divide M */ 4507706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 4517706df26Smrg*/ 4527706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 4537706df26Smrg0x2, /* 17:18 VCO output divide R */ 4547706df26Smrg1, /* 19 CLK Output enable. */ 4557706df26Smrg1, /* 20 CLK/X Output enable */ 4567706df26Smrg0, /* reserved, should be set to 0 */ 4577706df26Smrg0, /* Reference clock select on CLK 1=ref */ 4587706df26Smrg1, /* reserved, should be set to 1 */ 4597706df26Smrg/* 25.175 MHz IBM561 PLL setup data */ 4607706df26Smrg0x3E, /* VCO Div: PFR=0, M=0x7F */ 4617706df26Smrg0x9 /* REF: N=0x9 */ 4627706df26Smrg}, 4637706df26Smrg{ 4647706df26Smrg/* Option E Monitor Info 110 Mhz */ 4657706df26Smrg1024, /* rows */ 4667706df26Smrg1280, /* columns */ 4677706df26Smrg110, 4687706df26Smrg60, /* refresh rate */ 4697706df26Smrg1024, /* v scanlines */ 4707706df26Smrg6, /* v front porch */ 4717706df26Smrg7, /* v sync */ 4727706df26Smrg44, /* v back porch */ 4737706df26Smrg1280, /* h pixels */ 4747706df26Smrg19, /* h front porch */ 4757706df26Smrg163, /* h sync */ 4767706df26Smrg234, /* h back porch */ 4777706df26Smrg/* 110.0 MHz AV9110 clock serial load information */ 4787706df26Smrg0x60, /* 0:6 VCO frequency divider N */ 4797706df26Smrg0x32, /* 7:13 Reference frequency divide M */ 4807706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ 4817706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 4827706df26Smrg0x2, /* 17:18 VCO output divide R */ 4837706df26Smrg1, /* 19 CLK Output enable. */ 4847706df26Smrg1, /* 20 CLK/X Output enable */ 4857706df26Smrg0, /* reserved, should be set to 0 */ 4867706df26Smrg0, /* Reference clock select on CLK 1=ref */ 4877706df26Smrg1, /* reserved, should be set to 1 */ 4887706df26Smrg/* 110.0 MHz IBM561 PLL setup data */ 4897706df26Smrg0xBA, /* VCO Div: PFR=0x2, M=0x7B */ 4907706df26Smrg0x8 /* REF: N=0x8 */ 4917706df26Smrg}, 4927706df26Smrg#endif /* ALLOW_LT_72_HZ */ 4937706df26Smrg#ifdef ALLOW_GT_72_HZ 4947706df26Smrg{ 4957706df26Smrg/* Option D Monitor Info 135 Mhz */ 4967706df26Smrg1024, /* rows */ 4977706df26Smrg1280, /* columns */ 4987706df26Smrg135, /* 135 Mhz */ 4997706df26Smrg75, /* refresh rate */ 5007706df26Smrg1024, /* v scanlines */ 5017706df26Smrg1, /* v front porch */ 5027706df26Smrg3, /* v sync */ 5037706df26Smrg38, /* v back porch */ 5047706df26Smrg1280, /* h pixels */ 5057706df26Smrg16, /* h front porch */ 5067706df26Smrg144, /* h sync */ 5077706df26Smrg248, /* h back porch */ 5087706df26Smrg/* 135.0 MHz AV9110 clock serial load information */ 5097706df26Smrg0x42, /* 0:6 VCO frequency divider N */ 5107706df26Smrg0x07, /* 7:13 Reference frequency divide M */ 5117706df26Smrg0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ 5127706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 5137706df26Smrg0x1, /* 17:18 VCO output divide R */ 5147706df26Smrg1, /* 19 CLK Output enable. */ 5157706df26Smrg1, /* 20 CLK/X Output enable */ 5167706df26Smrg0, /* reserved, should be set to 0 */ 5177706df26Smrg0, /* Reference clock select on CLK 1=ref */ 5187706df26Smrg1, /* reserved, should be set to 1 */ 5197706df26Smrg/* 135.0 MHz IBM561 PLL setup data */ 5207706df26Smrg0xC1, /* VCO Div: PFR=0x3, M=0x42 */ 5217706df26Smrg0x7 /* REF: N=0x7 */ 5227706df26Smrg}, 5237706df26Smrg#ifdef ALLOW_GT_1280x1024 5247706df26Smrg{ 5257706df26Smrg/* Option 4 Monitor Info 175.5 Mhz (8-plane) */ 5267706df26Smrg1200, /* rows */ 5277706df26Smrg1600, /* columns */ 5287706df26Smrg175, /* clock */ 5297706df26Smrg65, /* refresh rate */ 5307706df26Smrg1200, /* v scanlines */ 5317706df26Smrg1, /* v front porch */ 5327706df26Smrg3, /* v sync */ 5337706df26Smrg46, /* v back porch */ 5347706df26Smrg1600, /* h pixels */ 5357706df26Smrg32, /* h front porch */ 5367706df26Smrg192, /* h sync */ 5377706df26Smrg336, /* h back porch */ 5387706df26Smrg/* 110.0 MHz AV9110 clock serial load information */ 5397706df26Smrg0x5F, /* 0:6 VCO frequency divider N */ 5407706df26Smrg0x3E, /* 7:13 Reference frequency divide M */ 5417706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) 5427706df26Smrg*/ 5437706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 5447706df26Smrg0x1, /* 17:18 VCO output divide R */ 5457706df26Smrg1, /* 19 CLK Output enable. */ 5467706df26Smrg1, /* 20 CLK/X Output enable */ 5477706df26Smrg0, /* reserved, should be set to 0 */ 5487706df26Smrg0, /* Reference clock select on CLK 1=ref */ 5497706df26Smrg1, /* reserved, should be set to 1 */ 5507706df26Smrg/* 110.0 MHz IBM561 PLL setup data */ 5517706df26Smrg0xE1, /* VCO Div: PFR=0x3, M-65=0x21 */ 5527706df26Smrg0x8 /* REF: N=0x8 */ 5537706df26Smrg}, 5547706df26Smrg{ 5557706df26Smrg/* Option F Monitor Info (24-plane) */ 5567706df26Smrg1200, /* rows */ 5577706df26Smrg1600, /* columns */ 5587706df26Smrg202.5, /* 130.8 Mhz */ 5597706df26Smrg75, /* refresh rate */ 5607706df26Smrg1200, /* v scanlines */ 5617706df26Smrg1, /* v front porch */ 5627706df26Smrg3, /* v sync */ 5637706df26Smrg46, /* v back porch */ 5647706df26Smrg1600, /* h pixels */ 5657706df26Smrg32, /* h front porch */ 5667706df26Smrg192, /* h sync */ 5677706df26Smrg336, /* h back porch */ 5687706df26Smrg/* AV9110 clock serial load information 130.808 */ 5697706df26Smrg0x60, /* 0:6 VCO frequency divider N */ 5707706df26Smrg0x32, /* 7:13 Reference frequency divide M */ 5717706df26Smrg0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */ 5727706df26Smrg0x1, /* 15:16 CLK/X output divide X */ 5737706df26Smrg0x2, /* 17:18 VCO output divide R */ 5747706df26Smrg1, /* 19 CLK Output enable. */ 5757706df26Smrg1, /* 20 CLK/X Output enable */ 5767706df26Smrg0, /* reserved, should be set to 0 */ 5777706df26Smrg0, /* Reference clock select on CLK 1=ref */ 5787706df26Smrg1, /* reserved, should be set to 1 */ 5797706df26Smrg/* 110.0 MHz IBM561 PLL setup data */ 5807706df26Smrg0xE2, /* bogus VCO Div: PFR=0x2, M=0x7B */ 5817706df26Smrg0x7 /* bogus REF: N=0x8 */ 5827706df26Smrg} 5837706df26Smrg#endif /* ALLOW_GT_1280x1024 */ 5847706df26Smrg#endif /* ALLOW_GT_72_HZ */ 5857706df26Smrg}; 5867706df26Smrg 5877706df26Smrgint tga_crystal_table_entries = sizeof(tga_crystal_table)/sizeof(struct monitor_data); 5887706df26Smrg 5897706df26Smrgstruct monitor_data *tga_c_table; 5907706df26Smrg 5917706df26Smrg/* ICS av9110 is only used on TGA2 */ 5927706df26Smrg 5937706df26Smrgvoid 5947706df26Smrgwrite_av9110(ScrnInfoPtr pScrn, unsigned int *temp) 5957706df26Smrg{ 5967706df26Smrg TGAPtr pTga = TGAPTR(pScrn); 5977706df26Smrg 5987706df26Smrg /* the following is based on write_av9110() from the 5997706df26Smrg TRU64 kernel TGA driver */ 6007706df26Smrg 6017706df26Smrg TGA2_WRITE_CLOCK_REG(0x0, 0xf800); 6027706df26Smrg TGA2_WRITE_CLOCK_REG(0x0, 0xf000); 6037706df26Smrg 6047706df26Smrg TGA2_WRITE_CLOCK_REG(temp[0], 0x0000); 6057706df26Smrg TGA2_WRITE_CLOCK_REG(temp[1], 0x0000); 6067706df26Smrg TGA2_WRITE_CLOCK_REG(temp[2], 0x0000); 6077706df26Smrg TGA2_WRITE_CLOCK_REG(temp[3], 0x0000); 6087706df26Smrg TGA2_WRITE_CLOCK_REG(temp[4], 0x0000); 6097706df26Smrg TGA2_WRITE_CLOCK_REG(temp[5], 0x0000); 6107706df26Smrg 6117706df26Smrg TGA2_WRITE_CLOCK_REG(0x0, 0xf800); 6127706df26Smrg} 6137706df26Smrg 6147706df26Smrgvoid TGA2SetupMode(ScrnInfoPtr pScrn) 6157706df26Smrg{ 6167706df26Smrg int i; 6177706df26Smrg 6187706df26Smrg /* 6197706df26Smrg * HACK HACK HACK 6207706df26Smrg * 6217706df26Smrg * We do not know how to generate arbitrary clocks, so we search 6227706df26Smrg * the crystal_table above for a match. Sigh... 6237706df26Smrg */ 6247706df26Smrg tga_c_table = tga_crystal_table; 6257706df26Smrg for (i = 0; i < tga_crystal_table_entries; i++, tga_c_table++) { 6267706df26Smrg if ((tga_c_table->max_rows == pScrn->currentMode->VDisplay) && 6277706df26Smrg (tga_c_table->max_cols == pScrn->currentMode->HDisplay)) { 6287706df26Smrg ErrorF("Found a matching mode (%d)!\n", i); 6297706df26Smrg break; 6307706df26Smrg } 6317706df26Smrg } 6327706df26Smrg if (i == tga_crystal_table_entries) { 6337706df26Smrg#ifdef FOR_NOW 6347706df26Smrg FatalError("Unable to find a workable mode"); 6357706df26Smrg#else 6367706df26Smrg ErrorF("Unable to find a matching mode!\n"); 6377706df26Smrg /* tga_c_table = &tga_crystal_table[4]; *//* 640x480 @ 72 */ 6387706df26Smrg tga_c_table = &tga_crystal_table[2]; /* 1024x768 @ 72 */ 6397706df26Smrg#endif 6407706df26Smrg } 6417706df26Smrg return; 6427706df26Smrg} 6437706df26Smrg 6447706df26Smrgstatic void 6457706df26SmrgICS9110ClockSelect(ScrnInfoPtr pScrn, int freq) 6467706df26Smrg{ 6477706df26Smrg unsigned int temp, temp1[6]; 6487706df26Smrg 6497706df26Smrg /* There lies an ICS9110 Clock Generator. */ 6507706df26Smrg /* ICS9110_CalcClockBits(freq, pll_bits); */ 6517706df26Smrg 6527706df26Smrg /* the following is based on munge_ics() from the 6537706df26Smrg TRU64 kernel TGA driver */ 6547706df26Smrg 6557706df26Smrg temp = (unsigned int)(tga_c_table->vco_div | 6567706df26Smrg (tga_c_table->ref_div << 7) | 6577706df26Smrg (tga_c_table->vco_pre << 14) | 6587706df26Smrg (tga_c_table->clk_div << 15) | 6597706df26Smrg (tga_c_table->vco_out_div << 17) | 6607706df26Smrg (tga_c_table->clk_out_en << 19) | 6617706df26Smrg (tga_c_table->clk_out_enX << 20) | 6627706df26Smrg (tga_c_table->res0 << 21) | 6637706df26Smrg (tga_c_table->clk_sel << 22) | 6647706df26Smrg (tga_c_table->res1 << 23)); 6657706df26Smrg 6667706df26Smrg temp1[0] = (temp & 0x00000001) | ((temp & 0x00000002) << 7) | 6677706df26Smrg ((temp & 0x00000004) << 14) | ((temp & 0x00000008) << 21); 6687706df26Smrg 6697706df26Smrg temp1[1] = ((temp & 0x00000010) >> 4) | ((temp & 0x00000020) << 3) | 6707706df26Smrg ((temp & 0x00000040) << 10) | ((temp & 0x00000080) << 17); 6717706df26Smrg 6727706df26Smrg temp1[2] = ((temp & 0x00000100) >> 8) | ((temp & 0x00000200) >> 1) | 6737706df26Smrg ((temp & 0x00000400) << 6) | ((temp & 0x00000800) << 13); 6747706df26Smrg 6757706df26Smrg temp1[3] = ((temp & 0x00001000) >> 12) | ((temp & 0x00002000) >> 5) | 6767706df26Smrg ((temp & 0x00004000) << 2) | ((temp & 0x00008000) << 9); 6777706df26Smrg 6787706df26Smrg temp1[4] = ((temp & 0x00010000) >> 16) | ((temp & 0x00020000) >> 9) | 6797706df26Smrg ((temp & 0x00040000) >> 2) | ((temp & 0x00080000) << 5); 6807706df26Smrg 6817706df26Smrg temp1[5] = ((temp & 0x00100000) >> 20) | ((temp & 0x00200000) >> 13) | 6827706df26Smrg ((temp & 0x00400000) >> 6) | ((temp & 0x00800000) << 1); 6837706df26Smrg 6847706df26Smrg write_av9110(pScrn, temp1); 6857706df26Smrg 6867706df26Smrg} 6877706df26Smrg 6887706df26Smrgvoid 6897706df26SmrgIbm561Init(TGAPtr pTga) 6907706df26Smrg{ 6917706df26Smrg unsigned char *Ibm561 = pTga->Ibm561modeReg; 6927706df26Smrg int i, j; 6937706df26Smrg 6947706df26Smrg/* ?? FIXME FIXME FIXME FIXME */ 6957706df26Smrg 6967706df26Smrg /* Command registers */ 6977706df26Smrg Ibm561[0] = 0x40; Ibm561[1] = 0x08; 6987706df26Smrg Ibm561[2] = (pTga->SyncOnGreen ? 0x80 : 0x00); 6997706df26Smrg 7007706df26Smrg /* Read mask */ 7017706df26Smrg Ibm561[3] = 0xff; Ibm561[4] = 0xff; Ibm561[5] = 0xff; Ibm561[6] = 0x0f; 7027706df26Smrg 7037706df26Smrg /* Blink mask */ 7047706df26Smrg Ibm561[7] = 0x00; Ibm561[8] = 0x00; Ibm561[9] = 0x00; Ibm561[10] = 0x00; 7057706df26Smrg 7067706df26Smrg /* Window attributes */ 7077706df26Smrg for (i = 0, j=11; i < 16; i++) { 7087706df26Smrg Ibm561[j++] = 0x00; Ibm561[j++] = 0x01; Ibm561[j++] = 0x80; 7097706df26Smrg } 7107706df26Smrg} 7117706df26Smrg 7127706df26Smrgvoid 7137706df26SmrgBt463Init(TGAPtr pTga) 7147706df26Smrg{ 7157706df26Smrg unsigned char *Bt463 = pTga->Bt463modeReg; 7167706df26Smrg int i, j; 7177706df26Smrg 7187706df26Smrg /* Command registers */ 7197706df26Smrg Bt463[0] = 0x40; Bt463[1] = 0x08; 7207706df26Smrg Bt463[2] = (pTga->SyncOnGreen ? 0x80 : 0x00); 7217706df26Smrg 7227706df26Smrg /* Read mask */ 7237706df26Smrg Bt463[3] = 0xff; Bt463[4] = 0xff; Bt463[5] = 0xff; Bt463[6] = 0x0f; 7247706df26Smrg 7257706df26Smrg /* Blink mask */ 7267706df26Smrg Bt463[7] = 0x00; Bt463[8] = 0x00; Bt463[9] = 0x00; Bt463[10] = 0x00; 7277706df26Smrg 7287706df26Smrg /* Window attributes */ 7297706df26Smrg for (i = 0, j=11; i < 16; i++) { 7307706df26Smrg Bt463[j++] = 0x00; Bt463[j++] = 0x01; Bt463[j++] = 0x80; 7317706df26Smrg } 7327706df26Smrg} 7337706df26Smrg 7347706df26SmrgBool 7357706df26SmrgDEC21030Init(ScrnInfoPtr pScrn, DisplayModePtr mode) 7367706df26Smrg{ 7377706df26Smrg TGAPtr pTga = TGAPTR(pScrn); 7387706df26Smrg TGARegPtr pReg = &pTga->ModeReg; 7397706df26Smrg 7407706df26Smrg if (pTga->RamDac != NULL) { /* this really means 8-bit and BT485 */ 7417706df26Smrg RamDacHWRecPtr pBT = RAMDACHWPTR(pScrn); 7427706df26Smrg RamDacRegRecPtr ramdacReg = &pBT->ModeReg; 7437706df26Smrg 7447706df26Smrg ramdacReg->DacRegs[BT_COMMAND_REG_0] = 0xA0 | 7457706df26Smrg (!pTga->Dac6Bit ? 0x2 : 0x0) | (pTga->SyncOnGreen ? 0x8 : 0x0); 7467706df26Smrg#if 1 7477706df26Smrg ramdacReg->DacRegs[BT_COMMAND_REG_2] = 0x20; 7487706df26Smrg#else 7497706df26Smrg ramdacReg->DacRegs[BT_COMMAND_REG_2] = 0x27; /* ?? was 0x20 */ 7507706df26Smrg#endif 7517706df26Smrg ramdacReg->DacRegs[BT_STATUS_REG] = 0x14; 7527706df26Smrg (*pTga->RamDac->SetBpp)(pScrn, ramdacReg); 7537706df26Smrg 7547706df26Smrg } else { 7557706df26Smrg switch (pTga->Chipset) { 7567706df26Smrg case PCI_CHIP_DEC21030: /* always BT463 */ 7577706df26Smrg Bt463Init(pTga); 7587706df26Smrg break; 7597706df26Smrg case PCI_CHIP_TGA2: /* always IBM 561 */ 7607706df26Smrg Ibm561Init(pTga); 7617706df26Smrg break; 7627706df26Smrg } 7637706df26Smrg } 7647706df26Smrg 7657706df26Smrg pReg->tgaRegs[0x00] = mode->CrtcHDisplay; 7667706df26Smrg pReg->tgaRegs[0x01] = mode->CrtcHSyncStart - mode->CrtcHDisplay; 7677706df26Smrg pReg->tgaRegs[0x02] = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 4; 7687706df26Smrg pReg->tgaRegs[0x03] = (mode->CrtcHTotal - mode->CrtcHSyncEnd) / 4; 7697706df26Smrg pReg->tgaRegs[0x04] = mode->CrtcVDisplay; 7707706df26Smrg pReg->tgaRegs[0x05] = mode->CrtcVSyncStart - mode->CrtcVDisplay; 7717706df26Smrg pReg->tgaRegs[0x06] = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; 7727706df26Smrg pReg->tgaRegs[0x07] = mode->CrtcVTotal - mode->CrtcVSyncEnd; 7737706df26Smrg 7747706df26Smrg /* 7757706df26Smrg * We do polarity the Step B way of the 21030 7767706df26Smrg * Tell me how I can detect a Step A, and I'll support that too. 7777706df26Smrg * But I think that the Step B's are most common 7787706df26Smrg */ 7797706df26Smrg if (mode->Flags & V_PHSYNC) 7807706df26Smrg pReg->tgaRegs[0x08] = 1; /* Horizontal Polarity */ 7817706df26Smrg else 7827706df26Smrg pReg->tgaRegs[0x08] = 0; 7837706df26Smrg 7847706df26Smrg if (mode->Flags & V_PVSYNC) 7857706df26Smrg pReg->tgaRegs[0x09] = 1; /* Vertical Polarity */ 7867706df26Smrg else 7877706df26Smrg pReg->tgaRegs[0x09] = 0; 7887706df26Smrg 7897706df26Smrg pReg->tgaRegs[0x0A] = mode->Clock; 7907706df26Smrg 7917706df26Smrg pReg->tgaRegs[0x10] = (((pReg->tgaRegs[0x00]) / 4) & 0x1FF) | 7927706df26Smrg ((((pReg->tgaRegs[0x00]) / 4) & 0x600) << 19) | 7937706df26Smrg (((pReg->tgaRegs[0x01]) / 4) << 9) | 7947706df26Smrg (pReg->tgaRegs[0x02] << 14) | 7957706df26Smrg (pReg->tgaRegs[0x03] << 21) | 7967706df26Smrg#if 0 7977706df26Smrg (1 << 31) | /* ?? */ 7987706df26Smrg#endif 7997706df26Smrg (pReg->tgaRegs[0x08] << 30); 8007706df26Smrg pReg->tgaRegs[0x11] = pReg->tgaRegs[0x04] | 8017706df26Smrg (pReg->tgaRegs[0x05] << 11) | 8027706df26Smrg (pReg->tgaRegs[0x06] << 16) | 8037706df26Smrg (pReg->tgaRegs[0x07] << 22) | 8047706df26Smrg (pReg->tgaRegs[0x09] << 30); 8057706df26Smrg 8067706df26Smrg pReg->tgaRegs[0x12] = 0x01; 8077706df26Smrg 8087706df26Smrg pReg->tgaRegs[0x13] = 0x0000; 8097706df26Smrg return TRUE; 8107706df26Smrg} 8117706df26Smrg 8127706df26Smrgvoid 8137706df26SmrgDEC21030Save(ScrnInfoPtr pScrn, TGARegPtr tgaReg) 8147706df26Smrg{ 8157706df26Smrg TGAPtr pTga = TGAPTR(pScrn); 8167706df26Smrg 8177706df26Smrg tgaReg->tgaRegs[0x10] = TGA_READ_REG(TGA_HORIZ_REG); 8187706df26Smrg tgaReg->tgaRegs[0x11] = TGA_READ_REG(TGA_VERT_REG); 8197706df26Smrg tgaReg->tgaRegs[0x12] = TGA_READ_REG(TGA_VALID_REG); 8207706df26Smrg tgaReg->tgaRegs[0x13] = TGA_READ_REG(TGA_BASE_ADDR_REG); 8217706df26Smrg 8227706df26Smrg return; 8237706df26Smrg} 8247706df26Smrg 8257706df26Smrgvoid 8267706df26SmrgDEC21030Restore(ScrnInfoPtr pScrn, TGARegPtr tgaReg) 8277706df26Smrg{ 8287706df26Smrg TGAPtr pTga = TGAPTR(pScrn); 8297706df26Smrg 8307706df26Smrg TGA_WRITE_REG(0x00, TGA_VALID_REG); /* Disable Video */ 8317706df26Smrg 8327706df26Smrg switch (pTga->Chipset) { 8337706df26Smrg case PCI_CHIP_DEC21030: 8347706df26Smrg ICS1562ClockSelect(pScrn, tgaReg->tgaRegs[0x0A]); 8357706df26Smrg break; 8367706df26Smrg case PCI_CHIP_TGA2: 8377706df26Smrg ICS9110ClockSelect(pScrn, tgaReg->tgaRegs[0x0A]); 8387706df26Smrg break; 8397706df26Smrg } 8407706df26Smrg 8417706df26Smrg TGA_WRITE_REG(tgaReg->tgaRegs[0x10], TGA_HORIZ_REG); 8427706df26Smrg TGA_WRITE_REG(tgaReg->tgaRegs[0x11], TGA_VERT_REG); 8437706df26Smrg TGA_WRITE_REG(tgaReg->tgaRegs[0x13], TGA_BASE_ADDR_REG); 8447706df26Smrg 8457706df26Smrg TGA_WRITE_REG(tgaReg->tgaRegs[0x12], TGA_VALID_REG); /* Re-enable Video */ 8467706df26Smrg 8477706df26Smrg return; 8487706df26Smrg} 849