xenocara/driver/xf86-video-tga/src/tga_dac.c

850 lines
39 KiB
C
Raw Normal View History

2006-11-26 13:17:29 -07:00
/*
* Copyright 1997,1998 by Alan Hourihane <alanh@fairlite.demon.co.uk>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Alan Hourihane not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Alan Hourihane makes no representations
* about the suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*/
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tga/tga_dac.c,v 1.13 2001/02/17 14:18:30 tsi Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "BT.h"
#include "tga_regs.h"
#include "tga.h"
static void ICS1562ClockSelect(ScrnInfoPtr pScrn, int freq);
static void ICS9110ClockSelect(ScrnInfoPtr pScrn, int freq);
extern void ICS1562_CalcClockBits(long f, unsigned char *bits);
static void
ICS1562ClockSelect(ScrnInfoPtr pScrn, int freq)
{
TGAPtr pTga = TGAPTR(pScrn);
unsigned char pll_bits[7];
unsigned long temp;
int i, j;
/* There lies an ICS1562 Clock Generator. */
ICS1562_CalcClockBits(freq, pll_bits);
/*
* For the DEC 21030 TGA:
* This requires the 55 clock bits be written in a serial manner to
* bit 0 of the CLOCK register and on the 56th bit set the hold flag.
*/
for (i = 0;i <= 6; i++) {
for (j = 0; j <= 7; j++) {
temp = (pll_bits[i] >> (7-j)) & 1;
if (i == 6 && j == 7)
temp |= 2;
TGA_WRITE_REG(temp, TGA_CLOCK_REG);
}
}
}
struct monitor_data tga_crystal_table[] = {
{
/* Option 0 Monitor Info 130.8 */
1024, /* rows */
1280, /* columns */
130, /* 130.8 Mhz */
72, /* refresh rate */
1024, /* v scanlines */
3, /* v front porch */
3, /* v sync */
33, /* v back porch */
1280, /* h pixels */
32, /* h front porch */
160, /* h sync */
232, /* h back porch */
/* AV9110 clock serial load information 130.808 */
0x40, /* 0:6 VCO frequency divider N */
0x7, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* IBM561 PLL setup data 130.808 */
0xC8, /* VCO Div: PFR=0x3, M-65=49 */
0x8 /* REF: N=0x8 */
},
{
/* Option 3 Monitor Info 104.00 Mhz */
900, /* rows */
1152, /* columns */
104, /* 104 Mhz */
72, /* refresh rate */
900, /* v scanlines */
6, /* v front porch */
10, /* v sync */
44, /* v back porch */
1152, /* h pixels */
64, /* h front porch */
112, /* h sync */
176, /* h back porch */
/* 103.994 MHz av9110 clock serial load information */
0x6d, /* 0:6 VCO frequency divider N */
0xf, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 104.00 MHz IBM561 PLL setup data */
0x96, /* VCO Div: PFR=2, M=57 */
0x6 /* REF: N=6 */
},
#if 1
{
/* Option 6 Monitor Info 74.00 Mhz */
768, /* rows */
1024, /* columns */
74, /* 74 Mhz */
72, /* refresh rate */
768, /* v scanlines */
1, /* v front porch */
6, /* v sync */
22, /* v back porch */
1024, /* h pixels */
16, /* h front porch */
128, /* h sync */
128, /* h back porch */
/* 74.00 MHz AV9110 clock serial load information */
0x2a, /* 0:6 VCO frequency divider N */
0x41, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 74.00 MHz IBM561 PLL setup data */
0x9C, /* VCO Div: PFR=2, M=0x5D*/
0x9 /* REF: N=0x9 */
},
#else
{
/* Option 5 Monitor Info 75.00 Mhz */
768, /* rows */
1024, /* columns */
75, /* 74 Mhz */
70, /* refresh rate */
768, /* v scanlines */
3, /* v front porch */
6, /* v sync */
29, /* v back porch */
1024, /* h pixels */
24, /* h front porch */
136, /* h sync */
144, /* h back porch */
/* 75.00 MHz AV9110 clock serial load information */
0x6e, /* 0:6 VCO frequency divider N */
0x15, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 75.00 MHz IBM561 PLL setup data */
0x93, /* VCO Div: PFR=2, M=0x54 */
0x8 /* REF: N=0x8 */
},
#endif
{
/* Option 9 Monitor Info 50 Mhz ergo SVGA */
600, /* rows */
800, /* columns */
50, /* 50 Mhz */
72, /* refresh rate */
600, /* v scanlines */
37, /*(31 tga)v front porch */
6, /* v sync */
23, /*(29 tga)v back porch */
800, /* h pixels */
56, /* h front porch */
120, /* h sync */
64, /* h back porch */
/*50.00 Mhz AV9110 clock serial load information */
0x37, /* 0:6 VCO frequency divider N */
0x3f, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 50.00 MHz IBM561 PLL setup data */
0x45, /* VCO Div: PFR=1, M=46*/
0x5 /* REF: N=5 */
},
{
/* Option B Monitor Info 31.5 Mhz ergo VGA */
480, /* rows */
640, /* columns */
32, /* 32 Mhz */
72, /* refresh rate */
480, /* v scanlines */
9, /* v front porch */
3, /* v sync */
28, /* v back porch */
640, /* h pixels */
24, /* h front porch */
40, /* h sync */
128, /* h back porch */
/* 31.50 MHz AV9110 clock serial load information */
0x16, /* 0:6 VCO frequency divider N */
0x05, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 31.50 MHz IBM561 PLL setup data */
0x17, /* VCO Div: PFR=0, M=0x58 */
0x5 /* REF: N=0x5 */
},
#ifdef ALLOW_LT_72_HZ
{
/* Option 1 Monitor Info 119.84 Mhz */
1024, /* rows */
1280, /* columns */
119, /* 119 Mhz */
66, /* refresh rate */
1024, /* v scanlines */
3, /* v front porch */
3, /* v sync */
33, /* v back porch */
1280, /* h pixels */
32, /* h front porch */
160, /* h sync */
232, /* h back porch */
/* 119.84MHz AV9110 clock serial load information */
0x2d, /* 0:6 VCO frequency divider N */
0x2b, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* IBM561 PLL setup data 119.84 */
0x82, /* VCO Div: PFR=0x2, M=0x43 */
0x4 /* REF: N=0x4 */
},
{
/* Option 2 Monitor Info 108.18 Mhz */
1024, /* rows */
1280, /* columns */
108, /* 108 Mhz */
60, /* refresh rate */
1024, /* v scanlines */
3, /* v front porch */
3, /* v sync */
26, /* v back porch */
1280, /* h pixels */
44, /* h front porch */
184, /* h sync */
200, /* h back porch */
/* 108.18 MHz av9110 Clk serial load information */
0x11, /* 0:6 VCO frequency divider N */
0x9, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 108.18 MHz IBM561 PLL setup data */
0xB8, /* VCO Div: PFR=2, M=79 */
0x8 /* REF: N=0x8 */
},
{
/* Option 5 Monitor Info 75.00 Mhz */
768, /* rows */
1024, /* columns */
75, /* 74 Mhz */
70, /* refresh rate */
768, /* v scanlines */
3, /* v front porch */
6, /* v sync */
29, /* v back porch */
1024, /* h pixels */
24, /* h front porch */
136, /* h sync */
144, /* h back porch */
/* 75.00 MHz AV9110 clock serial load information */
0x6e, /* 0:6 VCO frequency divider N */
0x15, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 75.00 MHz IBM561 PLL setup data */
0x93, /* VCO Div: PFR=2, M=0x54 */
0x8 /* REF: N=0x8 */
},
{
/* Option 7 Monitor Info 69 Mhz DEC 72 Hz */
864, /* rows */
1024, /* columns */
69, /* 69.x Mhz */
60, /* refresh rate */
864, /* v scanlines */
0, /* v front porch */
3, /* v sync */
34, /* v back porch */
1024, /* h pixels */
12, /* h front porch */
128, /* h sync */
116, /* h back porch */
/* 69.00 Mhz AV9110 clock serial load information */
0x35, /* 0:6 VCO frequency divider N */
0xb, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 69.00 MHz IBM561 PLL setup data */
0xA9, /* VCO Div: PFR=2, M=0x6A */
0xB /* REF: N=0xB */
},
{
/* Option 8 Monitor Info 65 Mhz */
768, /* rows */
1024, /* columns */
65, /* 65 Mhz */
60, /* refresh rate */
768, /* v scanlines */
7, /* v front porch */
9, /* v sync */
26, /* v back porch */
1024, /* h pixels */
56, /* h front porch */
64, /* h sync */
200, /* h back porch */
/* 65.00 MHz AV9110 clock serial load information */
0x6d, /* 0:6 VCO frequency divider N */
0x0c, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 65.00 MHz IBM561 PLL setup data */
0xAC, /* VCO Div: PFR=2, M=0x6D */
0xC /* REF: N=0xC */
},
{
/* Option A Monitor Info 40 Mhz SVGA */
600, /* rows */
800, /* columns */
40, /* 40 Mhz */
60, /* refresh rate */
600, /* v scanlines */
1, /* v front porch */
4, /* v sync */
23, /* v back porch */
800, /* h pixels */
40, /* h front porch */
128, /* h sync */
88, /* h back porch */
/* 40.00 MHz AV9110 clock serial load information */
0x5f, /* 0:6 VCO frequency divider N */
0x11, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 40.00 MHz IBM561 PLL setup data */
0x42, /* VCO Div: PFR=1, M=43 */
0x6 /* REF: N=0x6 */
},
{
/* Option C Monitor Info 25.175 Mhz VGA */
480, /* rows */
640, /* columns */
25, /* 25.175 Mhz */
60, /* refresh rate */
480, /* v scanlines */
10, /* v front porch */
2, /* v sync */
33, /* v back porch */
640, /* h pixels */
16, /* h front porch */
96, /* h sync */
48, /* h back porch */
/* 25.175 MHz AV9110 clock serial load information */
0x66, /* 0:6 VCO frequency divider N */
0x1d, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 25.175 MHz IBM561 PLL setup data */
0x3E, /* VCO Div: PFR=0, M=0x7F */
0x9 /* REF: N=0x9 */
},
{
/* Option E Monitor Info 110 Mhz */
1024, /* rows */
1280, /* columns */
110,
60, /* refresh rate */
1024, /* v scanlines */
6, /* v front porch */
7, /* v sync */
44, /* v back porch */
1280, /* h pixels */
19, /* h front porch */
163, /* h sync */
234, /* h back porch */
/* 110.0 MHz AV9110 clock serial load information */
0x60, /* 0:6 VCO frequency divider N */
0x32, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 110.0 MHz IBM561 PLL setup data */
0xBA, /* VCO Div: PFR=0x2, M=0x7B */
0x8 /* REF: N=0x8 */
},
#endif /* ALLOW_LT_72_HZ */
#ifdef ALLOW_GT_72_HZ
{
/* Option D Monitor Info 135 Mhz */
1024, /* rows */
1280, /* columns */
135, /* 135 Mhz */
75, /* refresh rate */
1024, /* v scanlines */
1, /* v front porch */
3, /* v sync */
38, /* v back porch */
1280, /* h pixels */
16, /* h front porch */
144, /* h sync */
248, /* h back porch */
/* 135.0 MHz AV9110 clock serial load information */
0x42, /* 0:6 VCO frequency divider N */
0x07, /* 7:13 Reference frequency divide M */
0x0, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 135.0 MHz IBM561 PLL setup data */
0xC1, /* VCO Div: PFR=0x3, M=0x42 */
0x7 /* REF: N=0x7 */
},
#ifdef ALLOW_GT_1280x1024
{
/* Option 4 Monitor Info 175.5 Mhz (8-plane) */
1200, /* rows */
1600, /* columns */
175, /* clock */
65, /* refresh rate */
1200, /* v scanlines */
1, /* v front porch */
3, /* v sync */
46, /* v back porch */
1600, /* h pixels */
32, /* h front porch */
192, /* h sync */
336, /* h back porch */
/* 110.0 MHz AV9110 clock serial load information */
0x5F, /* 0:6 VCO frequency divider N */
0x3E, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8)
*/
0x1, /* 15:16 CLK/X output divide X */
0x1, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 110.0 MHz IBM561 PLL setup data */
0xE1, /* VCO Div: PFR=0x3, M-65=0x21 */
0x8 /* REF: N=0x8 */
},
{
/* Option F Monitor Info (24-plane) */
1200, /* rows */
1600, /* columns */
202.5, /* 130.8 Mhz */
75, /* refresh rate */
1200, /* v scanlines */
1, /* v front porch */
3, /* v sync */
46, /* v back porch */
1600, /* h pixels */
32, /* h front porch */
192, /* h sync */
336, /* h back porch */
/* AV9110 clock serial load information 130.808 */
0x60, /* 0:6 VCO frequency divider N */
0x32, /* 7:13 Reference frequency divide M */
0x1, /* 14 VCO pre-scale divide V (0=div.by 1,1=by 8) */
0x1, /* 15:16 CLK/X output divide X */
0x2, /* 17:18 VCO output divide R */
1, /* 19 CLK Output enable. */
1, /* 20 CLK/X Output enable */
0, /* reserved, should be set to 0 */
0, /* Reference clock select on CLK 1=ref */
1, /* reserved, should be set to 1 */
/* 110.0 MHz IBM561 PLL setup data */
0xE2, /* bogus VCO Div: PFR=0x2, M=0x7B */
0x7 /* bogus REF: N=0x8 */
}
#endif /* ALLOW_GT_1280x1024 */
#endif /* ALLOW_GT_72_HZ */
};
int tga_crystal_table_entries = sizeof(tga_crystal_table)/sizeof(struct monitor_data);
struct monitor_data *tga_c_table;
/* ICS av9110 is only used on TGA2 */
void
write_av9110(ScrnInfoPtr pScrn, unsigned int *temp)
{
TGAPtr pTga = TGAPTR(pScrn);
/* the following is based on write_av9110() from the
TRU64 kernel TGA driver */
TGA2_WRITE_CLOCK_REG(0x0, 0xf800);
TGA2_WRITE_CLOCK_REG(0x0, 0xf000);
TGA2_WRITE_CLOCK_REG(temp[0], 0x0000);
TGA2_WRITE_CLOCK_REG(temp[1], 0x0000);
TGA2_WRITE_CLOCK_REG(temp[2], 0x0000);
TGA2_WRITE_CLOCK_REG(temp[3], 0x0000);
TGA2_WRITE_CLOCK_REG(temp[4], 0x0000);
TGA2_WRITE_CLOCK_REG(temp[5], 0x0000);
TGA2_WRITE_CLOCK_REG(0x0, 0xf800);
}
void TGA2SetupMode(ScrnInfoPtr pScrn)
{
int i;
/*
* HACK HACK HACK
*
* We do not know how to generate arbitrary clocks, so we search
* the crystal_table above for a match. Sigh...
*/
tga_c_table = tga_crystal_table;
for (i = 0; i < tga_crystal_table_entries; i++, tga_c_table++) {
if ((tga_c_table->max_rows == pScrn->currentMode->VDisplay) &&
(tga_c_table->max_cols == pScrn->currentMode->HDisplay)) {
ErrorF("Found a matching mode (%d)!\n", i);
break;
}
}
if (i == tga_crystal_table_entries) {
#ifdef FOR_NOW
FatalError("Unable to find a workable mode");
#else
ErrorF("Unable to find a matching mode!\n");
/* tga_c_table = &tga_crystal_table[4]; *//* 640x480 @ 72 */
tga_c_table = &tga_crystal_table[2]; /* 1024x768 @ 72 */
#endif
}
return;
}
static void
ICS9110ClockSelect(ScrnInfoPtr pScrn, int freq)
{
unsigned int temp, temp1[6];
/* There lies an ICS9110 Clock Generator. */
/* ICS9110_CalcClockBits(freq, pll_bits); */
/* the following is based on munge_ics() from the
TRU64 kernel TGA driver */
temp = (unsigned int)(tga_c_table->vco_div |
(tga_c_table->ref_div << 7) |
(tga_c_table->vco_pre << 14) |
(tga_c_table->clk_div << 15) |
(tga_c_table->vco_out_div << 17) |
(tga_c_table->clk_out_en << 19) |
(tga_c_table->clk_out_enX << 20) |
(tga_c_table->res0 << 21) |
(tga_c_table->clk_sel << 22) |
(tga_c_table->res1 << 23));
temp1[0] = (temp & 0x00000001) | ((temp & 0x00000002) << 7) |
((temp & 0x00000004) << 14) | ((temp & 0x00000008) << 21);
temp1[1] = ((temp & 0x00000010) >> 4) | ((temp & 0x00000020) << 3) |
((temp & 0x00000040) << 10) | ((temp & 0x00000080) << 17);
temp1[2] = ((temp & 0x00000100) >> 8) | ((temp & 0x00000200) >> 1) |
((temp & 0x00000400) << 6) | ((temp & 0x00000800) << 13);
temp1[3] = ((temp & 0x00001000) >> 12) | ((temp & 0x00002000) >> 5) |
((temp & 0x00004000) << 2) | ((temp & 0x00008000) << 9);
temp1[4] = ((temp & 0x00010000) >> 16) | ((temp & 0x00020000) >> 9) |
((temp & 0x00040000) >> 2) | ((temp & 0x00080000) << 5);
temp1[5] = ((temp & 0x00100000) >> 20) | ((temp & 0x00200000) >> 13) |
((temp & 0x00400000) >> 6) | ((temp & 0x00800000) << 1);
write_av9110(pScrn, temp1);
}
void
Ibm561Init(TGAPtr pTga)
{
unsigned char *Ibm561 = pTga->Ibm561modeReg;
int i, j;
/* ?? FIXME FIXME FIXME FIXME */
/* Command registers */
Ibm561[0] = 0x40; Ibm561[1] = 0x08;
Ibm561[2] = (pTga->SyncOnGreen ? 0x80 : 0x00);
/* Read mask */
Ibm561[3] = 0xff; Ibm561[4] = 0xff; Ibm561[5] = 0xff; Ibm561[6] = 0x0f;
/* Blink mask */
Ibm561[7] = 0x00; Ibm561[8] = 0x00; Ibm561[9] = 0x00; Ibm561[10] = 0x00;
/* Window attributes */
for (i = 0, j=11; i < 16; i++) {
Ibm561[j++] = 0x00; Ibm561[j++] = 0x01; Ibm561[j++] = 0x80;
}
}
void
Bt463Init(TGAPtr pTga)
{
unsigned char *Bt463 = pTga->Bt463modeReg;
int i, j;
/* Command registers */
Bt463[0] = 0x40; Bt463[1] = 0x08;
Bt463[2] = (pTga->SyncOnGreen ? 0x80 : 0x00);
/* Read mask */
Bt463[3] = 0xff; Bt463[4] = 0xff; Bt463[5] = 0xff; Bt463[6] = 0x0f;
/* Blink mask */
Bt463[7] = 0x00; Bt463[8] = 0x00; Bt463[9] = 0x00; Bt463[10] = 0x00;
/* Window attributes */
for (i = 0, j=11; i < 16; i++) {
Bt463[j++] = 0x00; Bt463[j++] = 0x01; Bt463[j++] = 0x80;
}
}
Bool
DEC21030Init(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
TGAPtr pTga = TGAPTR(pScrn);
TGARegPtr pReg = &pTga->ModeReg;
if (pTga->RamDac != NULL) { /* this really means 8-bit and BT485 */
RamDacHWRecPtr pBT = RAMDACHWPTR(pScrn);
RamDacRegRecPtr ramdacReg = &pBT->ModeReg;
ramdacReg->DacRegs[BT_COMMAND_REG_0] = 0xA0 |
(!pTga->Dac6Bit ? 0x2 : 0x0) | (pTga->SyncOnGreen ? 0x8 : 0x0);
#if 1
ramdacReg->DacRegs[BT_COMMAND_REG_2] = 0x20;
#else
ramdacReg->DacRegs[BT_COMMAND_REG_2] = 0x27; /* ?? was 0x20 */
#endif
ramdacReg->DacRegs[BT_STATUS_REG] = 0x14;
(*pTga->RamDac->SetBpp)(pScrn, ramdacReg);
} else {
switch (pTga->Chipset) {
case PCI_CHIP_DEC21030: /* always BT463 */
Bt463Init(pTga);
break;
case PCI_CHIP_TGA2: /* always IBM 561 */
Ibm561Init(pTga);
break;
}
}
pReg->tgaRegs[0x00] = mode->CrtcHDisplay;
pReg->tgaRegs[0x01] = mode->CrtcHSyncStart - mode->CrtcHDisplay;
pReg->tgaRegs[0x02] = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 4;
pReg->tgaRegs[0x03] = (mode->CrtcHTotal - mode->CrtcHSyncEnd) / 4;
pReg->tgaRegs[0x04] = mode->CrtcVDisplay;
pReg->tgaRegs[0x05] = mode->CrtcVSyncStart - mode->CrtcVDisplay;
pReg->tgaRegs[0x06] = mode->CrtcVSyncEnd - mode->CrtcVSyncStart;
pReg->tgaRegs[0x07] = mode->CrtcVTotal - mode->CrtcVSyncEnd;
/*
* We do polarity the Step B way of the 21030
* Tell me how I can detect a Step A, and I'll support that too.
* But I think that the Step B's are most common
*/
if (mode->Flags & V_PHSYNC)
pReg->tgaRegs[0x08] = 1; /* Horizontal Polarity */
else
pReg->tgaRegs[0x08] = 0;
if (mode->Flags & V_PVSYNC)
pReg->tgaRegs[0x09] = 1; /* Vertical Polarity */
else
pReg->tgaRegs[0x09] = 0;
pReg->tgaRegs[0x0A] = mode->Clock;
pReg->tgaRegs[0x10] = (((pReg->tgaRegs[0x00]) / 4) & 0x1FF) |
((((pReg->tgaRegs[0x00]) / 4) & 0x600) << 19) |
(((pReg->tgaRegs[0x01]) / 4) << 9) |
(pReg->tgaRegs[0x02] << 14) |
(pReg->tgaRegs[0x03] << 21) |
#if 0
(1 << 31) | /* ?? */
#endif
(pReg->tgaRegs[0x08] << 30);
pReg->tgaRegs[0x11] = pReg->tgaRegs[0x04] |
(pReg->tgaRegs[0x05] << 11) |
(pReg->tgaRegs[0x06] << 16) |
(pReg->tgaRegs[0x07] << 22) |
(pReg->tgaRegs[0x09] << 30);
pReg->tgaRegs[0x12] = 0x01;
pReg->tgaRegs[0x13] = 0x0000;
return TRUE;
}
void
DEC21030Save(ScrnInfoPtr pScrn, TGARegPtr tgaReg)
{
TGAPtr pTga = TGAPTR(pScrn);
tgaReg->tgaRegs[0x10] = TGA_READ_REG(TGA_HORIZ_REG);
tgaReg->tgaRegs[0x11] = TGA_READ_REG(TGA_VERT_REG);
tgaReg->tgaRegs[0x12] = TGA_READ_REG(TGA_VALID_REG);
tgaReg->tgaRegs[0x13] = TGA_READ_REG(TGA_BASE_ADDR_REG);
return;
}
void
DEC21030Restore(ScrnInfoPtr pScrn, TGARegPtr tgaReg)
{
TGAPtr pTga = TGAPTR(pScrn);
TGA_WRITE_REG(0x00, TGA_VALID_REG); /* Disable Video */
switch (pTga->Chipset) {
case PCI_CHIP_DEC21030:
ICS1562ClockSelect(pScrn, tgaReg->tgaRegs[0x0A]);
break;
case PCI_CHIP_TGA2:
ICS9110ClockSelect(pScrn, tgaReg->tgaRegs[0x0A]);
break;
}
TGA_WRITE_REG(tgaReg->tgaRegs[0x10], TGA_HORIZ_REG);
TGA_WRITE_REG(tgaReg->tgaRegs[0x11], TGA_VERT_REG);
TGA_WRITE_REG(tgaReg->tgaRegs[0x13], TGA_BASE_ADDR_REG);
TGA_WRITE_REG(tgaReg->tgaRegs[0x12], TGA_VALID_REG); /* Re-enable Video */
return;
}