/* * Copyright 1997,1998 by Alan Hourihane * * 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, */ /* $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; }