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