ast_mode.c revision b410ddbe
115fb4814Smrg/*
215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc.
315fb4814Smrg *
415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its
515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that
615fb4814Smrg * the above copyright notice appear in all copies and that both that
715fb4814Smrg * copyright notice and this permission notice appear in supporting
815fb4814Smrg * documentation, and that the name of the authors not be used in
915fb4814Smrg * advertising or publicity pertaining to distribution of the software without
1015fb4814Smrg * specific, written prior permission.  The authors makes no representations
1115fb4814Smrg * about the suitability of this software for any purpose.  It is provided
1215fb4814Smrg * "as is" without express or implied warranty.
1315fb4814Smrg *
1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE.
2115fb4814Smrg */
2215fb4814Smrg
2315fb4814Smrg#ifdef HAVE_CONFIG_H
2415fb4814Smrg#include <config.h>
2515fb4814Smrg#endif
2615fb4814Smrg#include "xf86.h"
2715fb4814Smrg#include "xf86_OSproc.h"
2815fb4814Smrg#include "xf86cmap.h"
2915fb4814Smrg#include "compiler.h"
3015fb4814Smrg#include "mibstore.h"
3115fb4814Smrg#include "vgaHW.h"
3215fb4814Smrg#include "mipointer.h"
3315fb4814Smrg#include "micmap.h"
3415fb4814Smrg
3515fb4814Smrg#include "fb.h"
3615fb4814Smrg#include "regionstr.h"
3715fb4814Smrg#include "xf86xv.h"
3815fb4814Smrg#include <X11/extensions/Xv.h>
3915fb4814Smrg#include "vbe.h"
4015fb4814Smrg
4115fb4814Smrg#include "xf86PciInfo.h"
4215fb4814Smrg#include "xf86Pci.h"
4315fb4814Smrg
4415fb4814Smrg/* framebuffer offscreen manager */
4515fb4814Smrg#include "xf86fbman.h"
4615fb4814Smrg
4715fb4814Smrg/* include xaa includes */
4815fb4814Smrg#include "xaa.h"
4915fb4814Smrg#include "xaarop.h"
5015fb4814Smrg
5115fb4814Smrg/* H/W cursor support */
5215fb4814Smrg#include "xf86Cursor.h"
5315fb4814Smrg
5415fb4814Smrg/* Driver specific headers */
5515fb4814Smrg#include "ast.h"
5615fb4814Smrg
5715fb4814SmrgVBIOS_STDTABLE_STRUCT StdTable[] = {
5815fb4814Smrg    /* MD_2_3_400 */
5915fb4814Smrg    {
6015fb4814Smrg        0x67,
6115fb4814Smrg        {0x00,0x03,0x00,0x02},
6215fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
6315fb4814Smrg         0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
6415fb4814Smrg         0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
6515fb4814Smrg         0xff},
6615fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
6715fb4814Smrg         0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
6815fb4814Smrg         0x0c,0x00,0x0f,0x08},
6915fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
7015fb4814Smrg         0xff}
7115fb4814Smrg    },
7215fb4814Smrg    /* Mode12/ExtEGATable */
7315fb4814Smrg    {
7415fb4814Smrg        0xe3,
7515fb4814Smrg        {0x01,0x0f,0x00,0x06},
7615fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
7715fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
7815fb4814Smrg         0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,
7915fb4814Smrg         0xff},
8015fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
8115fb4814Smrg         0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
8215fb4814Smrg         0x01,0x00,0x0f,0x00},
8315fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
8415fb4814Smrg         0xff}
8515fb4814Smrg    },
8615fb4814Smrg    /* ExtVGATable */
8715fb4814Smrg    {
8815fb4814Smrg        0x2f,
8915fb4814Smrg        {0x01,0x0f,0x00,0x0e},
9015fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
9115fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
9215fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
9315fb4814Smrg         0xff},
9415fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
9515fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
9615fb4814Smrg         0x01,0x00,0x00,0x00},
9715fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
9815fb4814Smrg         0xff}
9915fb4814Smrg    },
10015fb4814Smrg    /* ExtHiCTable */
10115fb4814Smrg    {
10215fb4814Smrg        0x2f,
10315fb4814Smrg        {0x01,0x0f,0x00,0x0e},
10415fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
10515fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
10615fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
10715fb4814Smrg         0xff},
10815fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
10915fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
11015fb4814Smrg         0x01,0x00,0x00,0x00},
11115fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
11215fb4814Smrg         0xff}
11315fb4814Smrg    },
11415fb4814Smrg    /* ExtTrueCTable */
11515fb4814Smrg    {
11615fb4814Smrg        0x2f,
11715fb4814Smrg        {0x01,0x0f,0x00,0x0e},
11815fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
11915fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
12015fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
12115fb4814Smrg         0xff},
12215fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
12315fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
12415fb4814Smrg         0x01,0x00,0x00,0x00},
12515fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
12615fb4814Smrg         0xff}
12715fb4814Smrg    },
12815fb4814Smrg};
12915fb4814Smrg
13015fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res640x480Table[] = {
131de78e416Smrg    { 800, 640, 8, 96, 525, 480, 2, 2, VCLK25_175,	/* 60Hz */
13215fb4814Smrg      (SyncNN | HBorder | VBorder | Charx8Dot), 60, 1, 0x2E },
13315fb4814Smrg    { 832, 640, 16, 40, 520, 480, 1, 3, VCLK31_5,	/* 72Hz */
13415fb4814Smrg      (SyncNN | HBorder | VBorder | Charx8Dot), 72, 2, 0x2E  },
13515fb4814Smrg    { 840, 640, 16, 64, 500, 480, 1, 3, VCLK31_5,	/* 75Hz */
13615fb4814Smrg      (SyncNN | Charx8Dot) , 75, 3, 0x2E },
13715fb4814Smrg    { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36,		/* 85Hz */
13815fb4814Smrg      (SyncNN | Charx8Dot) , 85, 4, 0x2E },
13915fb4814Smrg    { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36,		/* end */
14015fb4814Smrg      (SyncNN | Charx8Dot) , 0xFF, 4, 0x2E },
14115fb4814Smrg};
14215fb4814Smrg
14315fb4814Smrg
14415fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res800x600Table[] = {
14515fb4814Smrg    {1024, 800, 24, 72, 625, 600, 1, 2, VCLK36,		/* 56Hz */
14615fb4814Smrg      (SyncPP | Charx8Dot), 56, 1, 0x30 },
14715fb4814Smrg    {1056, 800, 40, 128, 628, 600, 1, 4, VCLK40,	/* 60Hz */
14815fb4814Smrg      (SyncPP | Charx8Dot), 60, 2, 0x30 },
14915fb4814Smrg    {1040, 800, 56, 120, 666, 600, 37, 6, VCLK50,	/* 72Hz */
15015fb4814Smrg      (SyncPP | Charx8Dot), 72, 3, 0x30 },
15115fb4814Smrg    {1056, 800, 16, 80, 625, 600, 1, 3, VCLK49_5,	/* 75Hz */
15215fb4814Smrg      (SyncPP | Charx8Dot), 75, 4, 0x30 },
15315fb4814Smrg    {1048, 800, 32, 64, 631, 600, 1, 3, VCLK56_25,	/* 85Hz */
154b410ddbeSmrg      (SyncPP | Charx8Dot), 84, 5, 0x30 },
15515fb4814Smrg    {1048, 800, 32, 64, 631, 600, 1, 3, VCLK56_25,	/* end */
15615fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 5, 0x30 },
15715fb4814Smrg};
15815fb4814Smrg
15915fb4814Smrg
16015fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1024x768Table[] = {
16115fb4814Smrg    {1344, 1024, 24, 136, 806, 768, 3, 6, VCLK65,	/* 60Hz */
16215fb4814Smrg      (SyncNN | Charx8Dot), 60, 1, 0x31 },
16315fb4814Smrg    {1328, 1024, 24, 136, 806, 768, 3, 6, VCLK75,	/* 70Hz */
16415fb4814Smrg      (SyncNN | Charx8Dot), 70, 2, 0x31 },
16515fb4814Smrg    {1312, 1024, 16, 96, 800, 768, 1, 3, VCLK78_75,	/* 75Hz */
16615fb4814Smrg      (SyncPP | Charx8Dot), 75, 3, 0x31 },
16715fb4814Smrg    {1376, 1024, 48, 96, 808, 768, 1, 3, VCLK94_5,	/* 85Hz */
168de78e416Smrg      (SyncPP | Charx8Dot), 84, 4, 0x31 },
16915fb4814Smrg    {1376, 1024, 48, 96, 808, 768, 1, 3, VCLK94_5,	/* end */
17015fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 4, 0x31 },
17115fb4814Smrg};
17215fb4814Smrg
17315fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1280x1024Table[] = {
17415fb4814Smrg    {1688, 1280, 48, 112, 1066, 1024, 1, 3, VCLK108,	/* 60Hz */
17515fb4814Smrg      (SyncPP | Charx8Dot), 60, 1, 0x32 },
17615fb4814Smrg    {1688, 1280, 16, 144, 1066, 1024, 1, 3, VCLK135,	/* 75Hz */
17715fb4814Smrg      (SyncPP | Charx8Dot), 75, 2, 0x32 },
17815fb4814Smrg    {1728, 1280, 64, 160, 1072, 1024, 1, 3, VCLK157_5,	/* 85Hz */
17915fb4814Smrg      (SyncPP | Charx8Dot), 85, 3, 0x32 },
18015fb4814Smrg    {1728, 1280, 64, 160, 1072, 1024, 1, 3, VCLK157_5,	/* end */
18115fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 3, 0x32 },
18215fb4814Smrg};
18315fb4814Smrg
18415fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1600x1200Table[] = {
18515fb4814Smrg    {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162,	/* 60Hz */
18615fb4814Smrg      (SyncPP | Charx8Dot), 60, 1, 0x33 },
18715fb4814Smrg    {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162,	/* end */
188de78e416Smrg      (SyncPP | Charx8Dot), 0xFF, 1, 0x33 },
189de78e416Smrg};
190de78e416Smrg
191de78e416SmrgVBIOS_ENHTABLE_STRUCT  Res1920x1200Table[] = {
192de78e416Smrg    {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154,	/* 60Hz */
193de78e416Smrg      (SyncNP | Charx8Dot), 60, 1, 0x34 },
194de78e416Smrg    {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154,	/* 60Hz */
195de78e416Smrg      (SyncNP | Charx8Dot), 0xFF, 1, 0x34 },
19615fb4814Smrg};
19715fb4814Smrg
198b410ddbeSmrg/* 16:10 */
199b410ddbeSmrgVBIOS_ENHTABLE_STRUCT  Res1280x800Table[] = {
200b410ddbeSmrg    {1680, 1280, 72,128,  831,  800, 3, 6, VCLK83_5,	/* 60Hz */
201b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 60, 1, 0x35 },
202b410ddbeSmrg    {1680, 1280, 72,128,  831,  800, 3, 6, VCLK83_5,	/* 60Hz */
203b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 0xFF, 1, 0x35 },
204b410ddbeSmrg
205b410ddbeSmrg};
206b410ddbeSmrg
207b410ddbeSmrgVBIOS_ENHTABLE_STRUCT  Res1440x900Table[] = {
208b410ddbeSmrg    {1904, 1440, 80,152,  934,  900, 3, 6, VCLK106_5,	/* 60Hz */
209b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 60, 1, 0x36 },
210b410ddbeSmrg    {1904, 1440, 80,152,  934,  900, 3, 6, VCLK106_5,	/* 60Hz */
211b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 0xFF, 1, 0x36 },
212b410ddbeSmrg};
213b410ddbeSmrg
214b410ddbeSmrgVBIOS_ENHTABLE_STRUCT  Res1680x1050Table[] = {
215b410ddbeSmrg    {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25,	/* 60Hz */
216b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 60, 1, 0x37 },
217b410ddbeSmrg    {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25,	/* 60Hz */
218b410ddbeSmrg      (SyncPN | Charx8Dot | LineCompareOff), 0xFF, 1, 0x37 },
219b410ddbeSmrg};
220b410ddbeSmrg
221b410ddbeSmrg/* HDTV */
222b410ddbeSmrgVBIOS_ENHTABLE_STRUCT  Res1920x1080Table[] = {
223b410ddbeSmrg    {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5,	/* 60Hz */
224b410ddbeSmrg      (SyncNP | Charx8Dot | LineCompareOff), 60, 1, 0x38 },
225b410ddbeSmrg    {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5,	/* 60Hz */
226b410ddbeSmrg      (SyncNP | Charx8Dot | LineCompareOff), 0xFF, 1, 0x38 },
227b410ddbeSmrg};
228b410ddbeSmrg
22915fb4814SmrgVBIOS_DCLK_INFO DCLKTable [] = {
23015fb4814Smrg    {0x2C, 0xE7, 0x03},					/* 00: VCLK25_175	*/
23115fb4814Smrg    {0x95, 0x62, 0x03},				        /* 01: VCLK28_322	*/
23215fb4814Smrg    {0x67, 0x63, 0x01},				        /* 02: VCLK31_5         */
23315fb4814Smrg    {0x76, 0x63, 0x01},				        /* 03: VCLK36         	*/
23415fb4814Smrg    {0xEE, 0x67, 0x01},				        /* 04: VCLK40          	*/
23515fb4814Smrg    {0x82, 0x62, 0x01}, 			        /* 05: VCLK49_5        	*/
23615fb4814Smrg    {0xC6, 0x64, 0x01},                        	        /* 06: VCLK50          	*/
23715fb4814Smrg    {0x94, 0x62, 0x01},                        	        /* 07: VCLK56_25       	*/
23815fb4814Smrg    {0x80, 0x64, 0x00},                        	        /* 08: VCLK65		*/
23915fb4814Smrg    {0x7B, 0x63, 0x00},                        	        /* 09: VCLK75	        */
24015fb4814Smrg    {0x67, 0x62, 0x00},				        /* 0A: VCLK78_75       	*/
24115fb4814Smrg    {0x7C, 0x62, 0x00},                        	        /* 0B: VCLK94_5        	*/
24215fb4814Smrg    {0x8E, 0x62, 0x00},                        	        /* 0C: VCLK108         	*/
24315fb4814Smrg    {0x85, 0x24, 0x00},                        	        /* 0D: VCLK135         	*/
24415fb4814Smrg    {0x67, 0x22, 0x00},                        	        /* 0E: VCLK157_5       	*/
24515fb4814Smrg    {0x6A, 0x22, 0x00},				        /* 0F: VCLK162         	*/
246b410ddbeSmrg    {0x4d, 0x4c, 0x80},				        /* 10: VCLK154      	*/
247b410ddbeSmrg    {0xa7, 0x78, 0x80},					/* 11: VCLK83.5         */
248b410ddbeSmrg    {0x28, 0x49, 0x80},					/* 12: VCLK106.5        */
249b410ddbeSmrg    {0x37, 0x49, 0x80},					/* 13: VCLK146.25       */
250b410ddbeSmrg    {0x1f, 0x45, 0x80},					/* 14: VCLK148.5        */
25115fb4814Smrg};
25215fb4814Smrg
25315fb4814SmrgVBIOS_DAC_INFO DAC_TEXT[] = {
25415fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
25515fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x2a, 0x00 },  { 0x2a, 0x2a, 0x2a },
25615fb4814Smrg { 0x00, 0x00, 0x15 },  { 0x00, 0x00, 0x3f },  { 0x00, 0x2a, 0x15 },  { 0x00, 0x2a, 0x3f },
25715fb4814Smrg { 0x2a, 0x00, 0x15 },  { 0x2a, 0x00, 0x3f },  { 0x2a, 0x2a, 0x15 },  { 0x2a, 0x2a, 0x3f },
25815fb4814Smrg { 0x00, 0x15, 0x00 },  { 0x00, 0x15, 0x2a },  { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x2a },
25915fb4814Smrg { 0x2a, 0x15, 0x00 },  { 0x2a, 0x15, 0x2a },  { 0x2a, 0x3f, 0x00 },  { 0x2a, 0x3f, 0x2a },
26015fb4814Smrg { 0x00, 0x15, 0x15 },  { 0x00, 0x15, 0x3f },  { 0x00, 0x3f, 0x15 },  { 0x00, 0x3f, 0x3f },
26115fb4814Smrg { 0x2a, 0x15, 0x15 },  { 0x2a, 0x15, 0x3f },  { 0x2a, 0x3f, 0x15 },  { 0x2a, 0x3f, 0x3f },
26215fb4814Smrg { 0x15, 0x00, 0x00 },  { 0x15, 0x00, 0x2a },  { 0x15, 0x2a, 0x00 },  { 0x15, 0x2a, 0x2a },
26315fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x00, 0x2a },  { 0x3f, 0x2a, 0x00 },  { 0x3f, 0x2a, 0x2a },
26415fb4814Smrg { 0x15, 0x00, 0x15 },  { 0x15, 0x00, 0x3f },  { 0x15, 0x2a, 0x15 },  { 0x15, 0x2a, 0x3f },
26515fb4814Smrg { 0x3f, 0x00, 0x15 },  { 0x3f, 0x00, 0x3f },  { 0x3f, 0x2a, 0x15 },  { 0x3f, 0x2a, 0x3f },
26615fb4814Smrg { 0x15, 0x15, 0x00 },  { 0x15, 0x15, 0x2a },  { 0x15, 0x3f, 0x00 },  { 0x15, 0x3f, 0x2a },
26715fb4814Smrg { 0x3f, 0x15, 0x00 },  { 0x3f, 0x15, 0x2a },  { 0x3f, 0x3f, 0x00 },  { 0x3f, 0x3f, 0x2a },
26815fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
26915fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
27015fb4814Smrg};
27115fb4814Smrg
27215fb4814SmrgVBIOS_DAC_INFO DAC_EGA[] = {
27315fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
27415fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x2a, 0x00 },  { 0x2a, 0x2a, 0x2a },
27515fb4814Smrg { 0x00, 0x00, 0x15 },  { 0x00, 0x00, 0x3f },  { 0x00, 0x2a, 0x15 },  { 0x00, 0x2a, 0x3f },
27615fb4814Smrg { 0x2a, 0x00, 0x15 },  { 0x2a, 0x00, 0x3f },  { 0x2a, 0x2a, 0x15 },  { 0x2a, 0x2a, 0x3f },
27715fb4814Smrg { 0x00, 0x15, 0x00 },  { 0x00, 0x15, 0x2a },  { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x2a },
27815fb4814Smrg { 0x2a, 0x15, 0x00 },  { 0x2a, 0x15, 0x2a },  { 0x2a, 0x3f, 0x00 },  { 0x2a, 0x3f, 0x2a },
27915fb4814Smrg { 0x00, 0x15, 0x15 },  { 0x00, 0x15, 0x3f },  { 0x00, 0x3f, 0x15 },  { 0x00, 0x3f, 0x3f },
28015fb4814Smrg { 0x2a, 0x15, 0x15 },  { 0x2a, 0x15, 0x3f },  { 0x2a, 0x3f, 0x15 },  { 0x2a, 0x3f, 0x3f },
28115fb4814Smrg { 0x15, 0x00, 0x00 },  { 0x15, 0x00, 0x2a },  { 0x15, 0x2a, 0x00 },  { 0x15, 0x2a, 0x2a },
28215fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x00, 0x2a },  { 0x3f, 0x2a, 0x00 },  { 0x3f, 0x2a, 0x2a },
28315fb4814Smrg { 0x15, 0x00, 0x15 },  { 0x15, 0x00, 0x3f },  { 0x15, 0x2a, 0x15 },  { 0x15, 0x2a, 0x3f },
28415fb4814Smrg { 0x3f, 0x00, 0x15 },  { 0x3f, 0x00, 0x3f },  { 0x3f, 0x2a, 0x15 },  { 0x3f, 0x2a, 0x3f },
28515fb4814Smrg { 0x15, 0x15, 0x00 },  { 0x15, 0x15, 0x2a },  { 0x15, 0x3f, 0x00 },  { 0x15, 0x3f, 0x2a },
28615fb4814Smrg { 0x3f, 0x15, 0x00 },  { 0x3f, 0x15, 0x2a },  { 0x3f, 0x3f, 0x00 },  { 0x3f, 0x3f, 0x2a },
28715fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
28815fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
28915fb4814Smrg};
29015fb4814Smrg
29115fb4814SmrgVBIOS_DAC_INFO DAC_VGA[] = {
29215fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
29315fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x15, 0x00 },  { 0x2a, 0x2a, 0x2a },
29415fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
29515fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
29615fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x05, 0x05, 0x05 },  { 0x08, 0x08, 0x08 },  { 0x0b, 0x0b, 0x0b },
29715fb4814Smrg { 0x0e, 0x0e, 0x0e },  { 0x11, 0x11, 0x11 },  { 0x14, 0x14, 0x14 },  { 0x18, 0x18, 0x18 },
29815fb4814Smrg { 0x1c, 0x1c, 0x1c },  { 0x20, 0x20, 0x20 },  { 0x24, 0x24, 0x24 },  { 0x28, 0x28, 0x28 },
29915fb4814Smrg { 0x2d, 0x2d, 0x2d },  { 0x32, 0x32, 0x32 },  { 0x38, 0x38, 0x38 },  { 0x3f, 0x3f, 0x3f },
30015fb4814Smrg { 0x00, 0x00, 0x3f },  { 0x10, 0x00, 0x3f },  { 0x1f, 0x00, 0x3f },  { 0x2f, 0x00, 0x3f },
30115fb4814Smrg { 0x3f, 0x00, 0x3f },  { 0x3f, 0x00, 0x2f },  { 0x3f, 0x00, 0x1f },  { 0x3f, 0x00, 0x10 },
30215fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x10, 0x00 },  { 0x3f, 0x1f, 0x00 },  { 0x3f, 0x2f, 0x00 },
30315fb4814Smrg { 0x3f, 0x3f, 0x00 },  { 0x2f, 0x3f, 0x00 },  { 0x1f, 0x3f, 0x00 },  { 0x10, 0x3f, 0x00 },
30415fb4814Smrg { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x10 },  { 0x00, 0x3f, 0x1f },  { 0x00, 0x3f, 0x2f },
30515fb4814Smrg { 0x00, 0x3f, 0x3f },  { 0x00, 0x2f, 0x3f },  { 0x00, 0x1f, 0x3f },  { 0x00, 0x10, 0x3f },
30615fb4814Smrg { 0x1f, 0x1f, 0x3f },  { 0x27, 0x1f, 0x3f },  { 0x2f, 0x1f, 0x3f },  { 0x37, 0x1f, 0x3f },
30715fb4814Smrg { 0x3f, 0x1f, 0x3f },  { 0x3f, 0x1f, 0x37 },  { 0x3f, 0x1f, 0x2f },  { 0x3f, 0x1f, 0x27 },
30815fb4814Smrg { 0x3f, 0x1f, 0x1f },  { 0x3f, 0x27, 0x1f },  { 0x3f, 0x2f, 0x1f },  { 0x3f, 0x37, 0x1f },
30915fb4814Smrg { 0x3f, 0x3f, 0x1f },  { 0x37, 0x3f, 0x1f },  { 0x2f, 0x3f, 0x1f },  { 0x27, 0x3f, 0x1f },
31015fb4814Smrg { 0x1f, 0x3f, 0x1f },  { 0x1f, 0x3f, 0x27 },  { 0x1f, 0x3f, 0x2f },  { 0x1f, 0x3f, 0x37 },
31115fb4814Smrg { 0x1f, 0x3f, 0x3f },  { 0x1f, 0x37, 0x3f },  { 0x1f, 0x2f, 0x3f },  { 0x1f, 0x27, 0x3f },
31215fb4814Smrg { 0x2d, 0x2d, 0x3f },  { 0x31, 0x2d, 0x3f },  { 0x36, 0x2d, 0x3f },  { 0x3a, 0x2d, 0x3f },
31315fb4814Smrg { 0x3f, 0x2d, 0x3f },  { 0x3f, 0x2d, 0x3a },  { 0x3f, 0x2d, 0x36 },  { 0x3f, 0x2d, 0x31 },
31415fb4814Smrg { 0x3f, 0x2d, 0x2d },  { 0x3f, 0x31, 0x2d },  { 0x3f, 0x36, 0x2d },  { 0x3f, 0x3a, 0x2d },
31515fb4814Smrg { 0x3f, 0x3f, 0x2d },  { 0x3a, 0x3f, 0x2d },  { 0x36, 0x3f, 0x2d },  { 0x31, 0x3f, 0x2d },
31615fb4814Smrg { 0x2d, 0x3f, 0x2d },  { 0x2d, 0x3f, 0x31 },  { 0x2d, 0x3f, 0x36 },  { 0x2d, 0x3f, 0x3a },
31715fb4814Smrg { 0x2d, 0x3f, 0x3f },  { 0x2d, 0x3a, 0x3f },  { 0x2d, 0x36, 0x3f },  { 0x2d, 0x31, 0x3f },
31815fb4814Smrg { 0x00, 0x00, 0x1c },  { 0x07, 0x00, 0x1c },  { 0x0e, 0x00, 0x1c },  { 0x15, 0x00, 0x1c },
31915fb4814Smrg { 0x1c, 0x00, 0x1c },  { 0x1c, 0x00, 0x15 },  { 0x1c, 0x00, 0x0e },  { 0x1c, 0x00, 0x07 },
32015fb4814Smrg { 0x1c, 0x00, 0x00 },  { 0x1c, 0x07, 0x00 },  { 0x1c, 0x0e, 0x00 },  { 0x1c, 0x15, 0x00 },
32115fb4814Smrg { 0x1c, 0x1c, 0x00 },  { 0x15, 0x1c, 0x00 },  { 0x0e, 0x1c, 0x00 },  { 0x07, 0x1c, 0x00 },
32215fb4814Smrg { 0x00, 0x1c, 0x00 },  { 0x00, 0x1c, 0x07 },  { 0x00, 0x1c, 0x0e },  { 0x00, 0x1c, 0x15 },
32315fb4814Smrg { 0x00, 0x1c, 0x1c },  { 0x00, 0x15, 0x1c },  { 0x00, 0x0e, 0x1c },  { 0x00, 0x07, 0x1c },
32415fb4814Smrg { 0x0e, 0x0e, 0x1c },  { 0x11, 0x0e, 0x1c },  { 0x15, 0x0e, 0x1c },  { 0x18, 0x0e, 0x1c },
32515fb4814Smrg { 0x1c, 0x0e, 0x1c },  { 0x1c, 0x0e, 0x18 },  { 0x1c, 0x0e, 0x15 },  { 0x1c, 0x0e, 0x11 },
32615fb4814Smrg { 0x1c, 0x0e, 0x0e },  { 0x1c, 0x11, 0x0e },  { 0x1c, 0x15, 0x0e },  { 0x1c, 0x18, 0x0e },
32715fb4814Smrg { 0x1c, 0x1c, 0x0e },  { 0x18, 0x1c, 0x0e },  { 0x15, 0x1c, 0x0e },  { 0x11, 0x1c, 0x0e },
32815fb4814Smrg { 0x0e, 0x1c, 0x0e },  { 0x0e, 0x1c, 0x11 },  { 0x0e, 0x1c, 0x15 },  { 0x0e, 0x1c, 0x18 },
32915fb4814Smrg { 0x0e, 0x1c, 0x1c },  { 0x0e, 0x18, 0x1c },  { 0x0e, 0x15, 0x1c },  { 0x0e, 0x11, 0x1c },
33015fb4814Smrg { 0x14, 0x14, 0x1c },  { 0x16, 0x14, 0x1c },  { 0x18, 0x14, 0x1c },  { 0x1a, 0x14, 0x1c },
33115fb4814Smrg { 0x1c, 0x14, 0x1c },  { 0x1c, 0x14, 0x1a },  { 0x1c, 0x14, 0x18 },  { 0x1c, 0x14, 0x16 },
33215fb4814Smrg { 0x1c, 0x14, 0x14 },  { 0x1c, 0x16, 0x14 },  { 0x1c, 0x18, 0x14 },  { 0x1c, 0x1a, 0x14 },
33315fb4814Smrg { 0x1c, 0x1c, 0x14 },  { 0x1a, 0x1c, 0x14 },  { 0x18, 0x1c, 0x14 },  { 0x16, 0x1c, 0x14 },
33415fb4814Smrg { 0x14, 0x1c, 0x14 },  { 0x14, 0x1c, 0x16 },  { 0x14, 0x1c, 0x18 },  { 0x14, 0x1c, 0x1a },
33515fb4814Smrg { 0x14, 0x1c, 0x1c },  { 0x14, 0x1a, 0x1c },  { 0x14, 0x18, 0x1c },  { 0x14, 0x16, 0x1c },
33615fb4814Smrg { 0x00, 0x00, 0x10 },  { 0x04, 0x00, 0x10 },  { 0x08, 0x00, 0x10 },  { 0x0c, 0x00, 0x10 },
33715fb4814Smrg { 0x10, 0x00, 0x10 },  { 0x10, 0x00, 0x0c },  { 0x10, 0x00, 0x08 },  { 0x10, 0x00, 0x04 },
33815fb4814Smrg { 0x10, 0x00, 0x00 },  { 0x10, 0x04, 0x00 },  { 0x10, 0x08, 0x00 },  { 0x10, 0x0c, 0x00 },
33915fb4814Smrg { 0x10, 0x10, 0x00 },  { 0x0c, 0x10, 0x00 },  { 0x08, 0x10, 0x00 },  { 0x04, 0x10, 0x00 },
34015fb4814Smrg { 0x00, 0x10, 0x00 },  { 0x00, 0x10, 0x04 },  { 0x00, 0x10, 0x08 },  { 0x00, 0x10, 0x0c },
34115fb4814Smrg { 0x00, 0x10, 0x10 },  { 0x00, 0x0c, 0x10 },  { 0x00, 0x08, 0x10 },  { 0x00, 0x04, 0x10 },
34215fb4814Smrg { 0x08, 0x08, 0x10 },  { 0x0a, 0x08, 0x10 },  { 0x0c, 0x08, 0x10 },  { 0x0e, 0x08, 0x10 },
34315fb4814Smrg { 0x10, 0x08, 0x10 },  { 0x10, 0x08, 0x0e },  { 0x10, 0x08, 0x0c },  { 0x10, 0x08, 0x0a },
34415fb4814Smrg { 0x10, 0x08, 0x08 },  { 0x10, 0x0a, 0x08 },  { 0x10, 0x0c, 0x08 },  { 0x10, 0x0e, 0x08 },
34515fb4814Smrg { 0x10, 0x10, 0x08 },  { 0x0e, 0x10, 0x08 },  { 0x0c, 0x10, 0x08 },  { 0x0a, 0x10, 0x08 },
34615fb4814Smrg { 0x08, 0x10, 0x08 },  { 0x08, 0x10, 0x0a },  { 0x08, 0x10, 0x0c },  { 0x08, 0x10, 0x0e },
34715fb4814Smrg { 0x08, 0x10, 0x10 },  { 0x08, 0x0e, 0x10 },  { 0x08, 0x0c, 0x10 },  { 0x08, 0x0a, 0x10 },
34815fb4814Smrg { 0x0b, 0x0b, 0x10 },  { 0x0c, 0x0b, 0x10 },  { 0x0d, 0x0b, 0x10 },  { 0x0f, 0x0b, 0x10 },
34915fb4814Smrg { 0x10, 0x0b, 0x10 },  { 0x10, 0x0b, 0x0f },  { 0x10, 0x0b, 0x0d },  { 0x10, 0x0b, 0x0c },
35015fb4814Smrg { 0x10, 0x0b, 0x0b },  { 0x10, 0x0c, 0x0b },  { 0x10, 0x0d, 0x0b },  { 0x10, 0x0f, 0x0b },
35115fb4814Smrg { 0x10, 0x10, 0x0b },  { 0x0f, 0x10, 0x0b },  { 0x0d, 0x10, 0x0b },  { 0x0c, 0x10, 0x0b },
35215fb4814Smrg { 0x0b, 0x10, 0x0b },  { 0x0b, 0x10, 0x0c },  { 0x0b, 0x10, 0x0d },  { 0x0b, 0x10, 0x0f },
35315fb4814Smrg { 0x0b, 0x10, 0x10 },  { 0x0b, 0x0f, 0x10 },  { 0x0b, 0x0d, 0x10 },  { 0x0b, 0x0c, 0x10 },
35415fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },
35515fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },
35615fb4814Smrg};
35715fb4814Smrg
35815fb4814Smrg/* extern. function */
35915fb4814Smrgextern void vASTOpenKey(ScrnInfoPtr pScrn);
36015fb4814Smrgextern Bool bASTRegInit(ScrnInfoPtr pScrn);
36115fb4814Smrgextern void vAST1000DisplayOn(ASTRecPtr pAST);
36215fb4814Smrgextern void vAST1000DisplayOff(ASTRecPtr pAST);
36315fb4814Smrg
36415fb4814Smrgextern Bool bEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
36515fb4814Smrgextern void vDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
36615fb4814Smrg
36715fb4814Smrgextern Bool bInitHWC(ScrnInfoPtr pScrn, ASTRecPtr pAST);
36815fb4814Smrg
36915fb4814Smrg/* Prototype type declaration*/
37015fb4814SmrgBool ASTSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
37115fb4814SmrgBool bGetAST1000VGAModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37215fb4814Smrgvoid vSetStdReg(ScrnInfoPtr pScrn,  DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37315fb4814Smrgvoid vSetCRTCReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37415fb4814Smrgvoid vSetOffsetReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37515fb4814Smrgvoid vSetDCLKReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37615fb4814Smrgvoid vSetExtReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
377de78e416Smrgvoid vSetSyncReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37815fb4814SmrgBool bSetDACReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
37915fb4814Smrg
38015fb4814SmrgBool
38115fb4814SmrgASTSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
38215fb4814Smrg{
38315fb4814Smrg    ASTRecPtr pAST;
38415fb4814Smrg    VBIOS_MODE_INFO vgamodeinfo;
38515fb4814Smrg
38615fb4814Smrg    pAST = ASTPTR(pScrn);
38715fb4814Smrg
38815fb4814Smrg    vASTOpenKey(pScrn);
38915fb4814Smrg    bASTRegInit(pScrn);
39015fb4814Smrg
39115fb4814Smrg    /* pre set mode */
39215fb4814Smrg    bGetAST1000VGAModeInfo(pScrn, mode, &vgamodeinfo);
39315fb4814Smrg
39415fb4814Smrg    /* set mode */
39515fb4814Smrg    vSetStdReg(pScrn, mode, &vgamodeinfo);
39615fb4814Smrg    vSetCRTCReg(pScrn, mode, &vgamodeinfo);
39715fb4814Smrg    vSetOffsetReg(pScrn, mode, &vgamodeinfo);
39815fb4814Smrg    vSetDCLKReg(pScrn, mode, &vgamodeinfo);
39915fb4814Smrg    vSetExtReg(pScrn, mode, &vgamodeinfo);
400de78e416Smrg    vSetSyncReg(pScrn, mode, &vgamodeinfo);
40115fb4814Smrg    bSetDACReg(pScrn, mode, &vgamodeinfo);
40215fb4814Smrg
40315fb4814Smrg    /* post set mode */
40415fb4814Smrg#ifdef	Accel_2D
40515fb4814Smrg   if (!pAST->noAccel) {
40615fb4814Smrg       if (!bEnable2D(pScrn, pAST)) {
40715fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Enable 2D failed\n");
40815fb4814Smrg           pAST->noAccel = TRUE;
40915fb4814Smrg       }
41015fb4814Smrg   }
41115fb4814Smrg#endif
41215fb4814Smrg#ifdef	HWC
41315fb4814Smrg   if (!pAST->noHWC) {
41415fb4814Smrg       if (!bInitHWC(pScrn, pAST)) {
41515fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Init HWC failed\n");
41615fb4814Smrg           pAST->noHWC = TRUE;
41715fb4814Smrg       }
41815fb4814Smrg   }
41915fb4814Smrg#endif
42015fb4814Smrg    vAST1000DisplayOn(pAST);
42115fb4814Smrg
42215fb4814Smrg    return (TRUE);
42315fb4814Smrg}
42415fb4814Smrg
42515fb4814Smrg
42615fb4814SmrgBool bGetAST1000VGAModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
42715fb4814Smrg{
42815fb4814Smrg    ASTRecPtr pAST;
42915fb4814Smrg    ULONG ulModeID, ulColorIndex, ulRefreshRate, ulRefreshRateIndex = 0;
43015fb4814Smrg    ULONG ulHBorder, ulVBorder;
43115fb4814Smrg
43215fb4814Smrg    pAST = ASTPTR(pScrn);
43315fb4814Smrg
43415fb4814Smrg    switch (pScrn->bitsPerPixel)
43515fb4814Smrg    {
43615fb4814Smrg    case 8:
43715fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[VGAModeIndex];
43815fb4814Smrg	 ulColorIndex = VGAModeIndex-1;
43915fb4814Smrg         break;
44015fb4814Smrg    case 16:
44115fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[HiCModeIndex];
442b410ddbeSmrg	 ulColorIndex = HiCModeIndex;
44315fb4814Smrg         break;
44415fb4814Smrg    case 24:
44515fb4814Smrg    case 32:
44615fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[TrueCModeIndex];
447b410ddbeSmrg	 ulColorIndex = TrueCModeIndex;
44815fb4814Smrg	 break;
44915fb4814Smrg    default:
45015fb4814Smrg         return (FALSE);
45115fb4814Smrg    }
45215fb4814Smrg
45315fb4814Smrg    switch (mode->CrtcHDisplay)
45415fb4814Smrg    {
45515fb4814Smrg    case 640:
456b410ddbeSmrg	 pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res640x480Table[ulRefreshRateIndex];
457b410ddbeSmrg	 break;
45815fb4814Smrg    case 800:
459b410ddbeSmrg	 pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res800x600Table[ulRefreshRateIndex];
460b410ddbeSmrg	 break;
46115fb4814Smrg    case 1024:
462b410ddbeSmrg	 pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1024x768Table[ulRefreshRateIndex];
463b410ddbeSmrg	 break;
46415fb4814Smrg    case 1280:
465b410ddbeSmrg         if (mode->CrtcVDisplay == 800)
466b410ddbeSmrg             pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1280x800Table[ulRefreshRateIndex];
467b410ddbeSmrg         else
468b410ddbeSmrg             pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1280x1024Table[ulRefreshRateIndex];
469b410ddbeSmrg	 break;
470b410ddbeSmrg    case 1440:
471b410ddbeSmrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1440x900Table[ulRefreshRateIndex];
472b410ddbeSmrg         break;
47315fb4814Smrg    case 1600:
474b410ddbeSmrg	 pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1600x1200Table[ulRefreshRateIndex];
475b410ddbeSmrg	 break;
476b410ddbeSmrg    case 1680:
477b410ddbeSmrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1680x1050Table[ulRefreshRateIndex];
478de78e416Smrg         break;
479de78e416Smrg    case 1920:
480b410ddbeSmrg         if (mode->CrtcVDisplay == 1080)
481b410ddbeSmrg             pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1920x1080Table[ulRefreshRateIndex];
482b410ddbeSmrg         else
483b410ddbeSmrg             pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1920x1200Table[ulRefreshRateIndex];
484b410ddbeSmrg         break;
485b410ddbeSmrg    default:
486b410ddbeSmrg	 return (FALSE);
48715fb4814Smrg    }
48815fb4814Smrg
48915fb4814Smrg    /* Get Proper Mode Index */
49015fb4814Smrg    ulRefreshRate = (mode->Clock * 1000) / (mode->HTotal * mode->VTotal);
49115fb4814Smrg
49215fb4814Smrg    while (pVGAModeInfo->pEnhTableEntry->ulRefreshRate < ulRefreshRate)
49315fb4814Smrg    {
49415fb4814Smrg        pVGAModeInfo->pEnhTableEntry++;
49515fb4814Smrg        if ((pVGAModeInfo->pEnhTableEntry->ulRefreshRate > ulRefreshRate) ||
49615fb4814Smrg            (pVGAModeInfo->pEnhTableEntry->ulRefreshRate == 0xFF))
49715fb4814Smrg        {
49815fb4814Smrg            pVGAModeInfo->pEnhTableEntry--;
49915fb4814Smrg            break;
50015fb4814Smrg        }
50115fb4814Smrg    }
50215fb4814Smrg
50315fb4814Smrg    /* Update mode CRTC info */
504b410ddbeSmrg    ulHBorder = (pVGAModeInfo->pEnhTableEntry->Flags & HBorder) ? 8:0;
505b410ddbeSmrg    ulVBorder = (pVGAModeInfo->pEnhTableEntry->Flags & VBorder) ? 8:0;
50615fb4814Smrg
50715fb4814Smrg    mode->CrtcHTotal      = (int) pVGAModeInfo->pEnhTableEntry->HT;
50815fb4814Smrg    mode->CrtcHBlankStart = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder);
50915fb4814Smrg    mode->CrtcHBlankEnd   = (int) (pVGAModeInfo->pEnhTableEntry->HT - ulHBorder);
51015fb4814Smrg    mode->CrtcHSyncStart  = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder
51115fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HFP);
51215fb4814Smrg    mode->CrtcHSyncEnd    = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder
51315fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HFP
51415fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HSYNC);
51515fb4814Smrg
51615fb4814Smrg    mode->CrtcVTotal      = (int) pVGAModeInfo->pEnhTableEntry->VT;
51715fb4814Smrg    mode->CrtcVBlankStart = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder);
51815fb4814Smrg    mode->CrtcVBlankEnd   = (int) (pVGAModeInfo->pEnhTableEntry->VT - ulVBorder);
51915fb4814Smrg    mode->CrtcVSyncStart  = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder
52015fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VFP);
52115fb4814Smrg    mode->CrtcVSyncEnd    = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder
52215fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VFP
52315fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VSYNC);
52415fb4814Smrg
52515fb4814Smrg    /* Write mode info to scratch */
52615fb4814Smrg    ulRefreshRateIndex = pVGAModeInfo->pEnhTableEntry->ulRefreshRateIndex;
52715fb4814Smrg    ulModeID = pVGAModeInfo->pEnhTableEntry->ulModeID;
52815fb4814Smrg
52915fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8C, (UCHAR) ((ulColorIndex & 0x0F) << 4));
53015fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8D, (UCHAR) (ulRefreshRateIndex & 0xFF));
53115fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8E, (UCHAR) (ulModeID & 0xFF));
53215fb4814Smrg
53315fb4814Smrg    return (TRUE);
53415fb4814Smrg}
53515fb4814Smrg
53615fb4814Smrgvoid vSetStdReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
53715fb4814Smrg{
53815fb4814Smrg
53915fb4814Smrg    PVBIOS_STDTABLE_STRUCT pStdModePtr;
54015fb4814Smrg    ASTRecPtr pAST;
54115fb4814Smrg    ULONG i;
54215fb4814Smrg    UCHAR jReg;
54315fb4814Smrg
54415fb4814Smrg    pStdModePtr = pVGAModeInfo->pStdTableEntry;
54515fb4814Smrg    pAST = ASTPTR(pScrn);
54615fb4814Smrg
54715fb4814Smrg    /* Set Misc */
54815fb4814Smrg    jReg = pStdModePtr->MISC;
54915fb4814Smrg    SetReg(MISC_PORT_WRITE,jReg);
55015fb4814Smrg
55115fb4814Smrg    /* Set Seq */
55215fb4814Smrg    SetIndexReg(SEQ_PORT,0x00, 0x03);
55315fb4814Smrg    for (i=0; i<4; i++)
55415fb4814Smrg    {
55515fb4814Smrg        jReg = pStdModePtr->SEQ[i];
55615fb4814Smrg    	if (!i) (jReg |= 0x20);			/* display off */
55715fb4814Smrg        SetIndexReg(SEQ_PORT,(UCHAR) (i+1), jReg);
55815fb4814Smrg    }
55915fb4814Smrg
56015fb4814Smrg    /* Set CRTC */
56115fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x00);
56215fb4814Smrg    for (i=0; i<25; i++)
56315fb4814Smrg    {
56415fb4814Smrg        jReg = pStdModePtr->CRTC[i];
56515fb4814Smrg        SetIndexReg(CRTC_PORT,(UCHAR) i, jReg);
56615fb4814Smrg    }
56715fb4814Smrg
56815fb4814Smrg    /* Set AR */
56915fb4814Smrg    jReg = GetReg(INPUT_STATUS1_READ);
57015fb4814Smrg    for (i=0; i<20; i++)
57115fb4814Smrg    {
57215fb4814Smrg        jReg = pStdModePtr->AR[i];
57315fb4814Smrg        SetReg(AR_PORT_WRITE, (UCHAR) i);
57415fb4814Smrg        SetReg(AR_PORT_WRITE, jReg);
57515fb4814Smrg    }
57615fb4814Smrg    SetReg(AR_PORT_WRITE, 0x14);
57715fb4814Smrg    SetReg(AR_PORT_WRITE, 0x00);
57815fb4814Smrg
57915fb4814Smrg    jReg = GetReg(INPUT_STATUS1_READ);
58015fb4814Smrg    SetReg (AR_PORT_WRITE, 0x20);		/* set POS */
58115fb4814Smrg
58215fb4814Smrg    /* Set GR */
58315fb4814Smrg    for (i=0; i<9; i++)
58415fb4814Smrg    {
585de78e416Smrg        jReg = pStdModePtr->GR[i];
58615fb4814Smrg        SetIndexReg(GR_PORT,(UCHAR) i, jReg);
58715fb4814Smrg
58815fb4814Smrg    }
58915fb4814Smrg
59015fb4814Smrg
59115fb4814Smrg}
59215fb4814Smrg
59315fb4814Smrgvoid
59415fb4814SmrgvSetCRTCReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
59515fb4814Smrg{
59615fb4814Smrg    ASTRecPtr pAST;
59715fb4814Smrg    USHORT usTemp;
59815fb4814Smrg    UCHAR jReg05, jReg07, jReg09, jRegAC, jRegAD, jRegAE;
59915fb4814Smrg
60015fb4814Smrg    pAST = ASTPTR(pScrn);
60115fb4814Smrg    jReg05 = jReg07 = jReg09 = jRegAC = jRegAD = jRegAE = 0;
60215fb4814Smrg
60315fb4814Smrg    /* unlock CRTC */
60415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x00);
60515fb4814Smrg
60615fb4814Smrg    /* Horizontal Timing Programming */
60715fb4814Smrg    usTemp = (mode->CrtcHTotal >> 3) - 5;
60815fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x01;			/* HT D[8] */
60915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x00, 0x00, (UCHAR) usTemp);
61015fb4814Smrg    usTemp = (mode->CrtcHDisplay >> 3) - 1;
61115fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x04;			/* HDE D[8] */
61215fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x01, 0x00, (UCHAR) usTemp);
61315fb4814Smrg    usTemp = (mode->CrtcHBlankStart >> 3) - 1;
61415fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x10;			/* HBS D[8] */
61515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x02, 0x00, (UCHAR) usTemp);
61615fb4814Smrg    usTemp = ((mode->CrtcHBlankEnd >> 3) - 1) & 0x7F;
61715fb4814Smrg    if (usTemp & 0x20) jReg05 |= 0x80;			/* HBE D[5] */
61815fb4814Smrg    if (usTemp & 0x40) jRegAD |= 0x01;			/* HBE D[6] */
61915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x03, 0xE0, (UCHAR) (usTemp & 0x1F));
620b410ddbeSmrg    usTemp = (mode->CrtcHSyncStart >> 3 ) - 1;
62115fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x40;			/* HRS D[5] */
62215fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x04, 0x00, (UCHAR) (usTemp));
623b410ddbeSmrg    usTemp = ((mode->CrtcHSyncEnd >> 3 ) - 1) & 0x3F;
62415fb4814Smrg    if (usTemp & 0x20) jRegAD |= 0x04;			/* HRE D[5] */
62515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x05, 0x60, (UCHAR) ((usTemp & 0x1F) | jReg05));
62615fb4814Smrg
62715fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAC, 0x00, (UCHAR) jRegAC);
62815fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAD, 0x00, (UCHAR) jRegAD);
62915fb4814Smrg
63015fb4814Smrg    /* Vetical Timing Programming */
63115fb4814Smrg    usTemp = (mode->CrtcVTotal) - 2;
63215fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x01;			/* VT D[8] */
63315fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x20;
63415fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x01;			/* VT D[10] */
63515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x06, 0x00, (UCHAR) usTemp);
63615fb4814Smrg    usTemp = (mode->CrtcVSyncStart) - 1;
63715fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x04;			/* VRS D[8] */
63815fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x80;			/* VRS D[9] */
63915fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x08;			/* VRS D[10] */
64015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x10, 0x00, (UCHAR) usTemp);
64115fb4814Smrg    usTemp = ((mode->CrtcVSyncEnd) - 1) & 0x3F;
64215fb4814Smrg    if (usTemp & 0x10) jRegAE |= 0x20;			/* VRE D[4] */
64315fb4814Smrg    if (usTemp & 0x20) jRegAE |= 0x40;			/* VRE D[5] */
64415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x70, (UCHAR) (usTemp & 0x0F));
64515fb4814Smrg    usTemp = (mode->CrtcVDisplay) - 1;
64615fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x02;			/* VDE D[8] */
64715fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x40;			/* VDE D[9] */
64815fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x02;			/* VDE D[10] */
64915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x12, 0x00, (UCHAR) usTemp);
65015fb4814Smrg    usTemp = (mode->CrtcVBlankStart) - 1;
65115fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x08;			/* VBS D[8] */
65215fb4814Smrg    if (usTemp & 0x200) jReg09 |= 0x20;			/* VBS D[9] */
65315fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x04;			/* VBS D[10] */
65415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x15, 0x00, (UCHAR) usTemp);
65515fb4814Smrg    usTemp = (mode->CrtcVBlankEnd) - 1 ;
65615fb4814Smrg    if (usTemp & 0x100) jRegAE |= 0x10;			/* VBE D[8] */
65715fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x16, 0x00, (UCHAR) usTemp);
65815fb4814Smrg
65915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x07, 0x00, (UCHAR) jReg07);
66015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x09, 0xDF, (UCHAR) jReg09);
66115fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAE, 0x00, (UCHAR) (jRegAE | 0x80));	/* disable line compare */
66215fb4814Smrg
66315fb4814Smrg    /* lock CRTC */
66415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x80);
66515fb4814Smrg
66615fb4814Smrg}
66715fb4814Smrg
66815fb4814Smrgvoid vSetOffsetReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
66915fb4814Smrg{
67015fb4814Smrg    ASTRecPtr pAST;
67115fb4814Smrg    USHORT usOffset;
67215fb4814Smrg
67315fb4814Smrg    pAST = ASTPTR(pScrn);
67415fb4814Smrg
67515fb4814Smrg    usOffset = 	pAST->VideoModeInfo.ScreenPitch >> 3;		/* Unit: char */
67615fb4814Smrg
67715fb4814Smrg    SetIndexReg(CRTC_PORT,0x13, (UCHAR) (usOffset & 0xFF));
67815fb4814Smrg    SetIndexReg(CRTC_PORT,0xB0, (UCHAR) ((usOffset >> 8) & 0x3F));
67915fb4814Smrg
68015fb4814Smrg}
68115fb4814Smrg
68215fb4814Smrgvoid vSetDCLKReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
68315fb4814Smrg{
68415fb4814Smrg    PVBIOS_ENHTABLE_STRUCT pEnhModePtr;
68515fb4814Smrg    PVBIOS_DCLK_INFO pDCLKPtr;
68615fb4814Smrg    ASTRecPtr pAST;
68715fb4814Smrg
68815fb4814Smrg    pAST = ASTPTR(pScrn);
68915fb4814Smrg
69015fb4814Smrg    pEnhModePtr = pVGAModeInfo->pEnhTableEntry;
69115fb4814Smrg    pDCLKPtr = &DCLKTable[pEnhModePtr->DCLKIndex];
69215fb4814Smrg
69315fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xC0, 0x00,  pDCLKPtr->Param1);
69415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xC1, 0x00,  pDCLKPtr->Param2);
695de78e416Smrg    SetIndexRegMask(CRTC_PORT,0xBB, 0x0F, (pDCLKPtr->Param3 & 0x80) | ((pDCLKPtr->Param3 & 0x03) << 4) );
69615fb4814Smrg
69715fb4814Smrg}
69815fb4814Smrg
69915fb4814Smrg
70015fb4814Smrgvoid vSetExtReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
70115fb4814Smrg{
70215fb4814Smrg
70315fb4814Smrg    ASTRecPtr pAST;
70415fb4814Smrg    UCHAR jRegA0, jRegA3, jRegA8;
70515fb4814Smrg
70615fb4814Smrg    pAST = ASTPTR(pScrn);
70715fb4814Smrg
70815fb4814Smrg    jRegA0=jRegA3=jRegA8=0;
70915fb4814Smrg    /* Mode Type Setting */
71015fb4814Smrg    switch (pScrn->bitsPerPixel) {
71115fb4814Smrg    case 8:
71215fb4814Smrg        jRegA0 = 0x70;
71315fb4814Smrg        jRegA3 = 0x01;
71415fb4814Smrg        jRegA8 = 0x00;
71515fb4814Smrg        break;
71615fb4814Smrg    case 15:
71715fb4814Smrg    case 16:
71815fb4814Smrg        jRegA0 = 0x70;
71915fb4814Smrg        jRegA3 = 0x04;
72015fb4814Smrg        jRegA8 = 0x02;
72115fb4814Smrg        break;
72215fb4814Smrg    case 32:
72315fb4814Smrg        jRegA0 = 0x70;
72415fb4814Smrg        jRegA3 = 0x08;
72515fb4814Smrg        jRegA8 = 0x02;
72615fb4814Smrg        break;
72715fb4814Smrg    }
72815fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA0, 0x8F, (UCHAR) jRegA0);
72915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA3, 0xF0, (UCHAR) jRegA3);
73015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA8, 0xFD, (UCHAR) jRegA8);
73115fb4814Smrg
73215fb4814Smrg    /* Set Threshold */
733b410ddbeSmrg    if (pAST->jChipType == AST2300)
734b410ddbeSmrg    {
735b410ddbeSmrg        SetIndexReg(CRTC_PORT,0xA7, 0x6F);
736b410ddbeSmrg        SetIndexReg(CRTC_PORT,0xA6, 0x3F);
737b410ddbeSmrg    }
738b410ddbeSmrg    else if ((pAST->jChipType == AST2100) || (pAST->jChipType == AST1100) || (pAST->jChipType == AST2200) || (pAST->jChipType == AST2150) )
739de78e416Smrg    {
740de78e416Smrg        SetIndexReg(CRTC_PORT,0xA7, 0x3F);
741de78e416Smrg        SetIndexReg(CRTC_PORT,0xA6, 0x2F);
742de78e416Smrg    }
743de78e416Smrg    else
744de78e416Smrg    {
745de78e416Smrg        SetIndexReg(CRTC_PORT,0xA7, 0x2F);
746de78e416Smrg        SetIndexReg(CRTC_PORT,0xA6, 0x1F);
747de78e416Smrg    }
74815fb4814Smrg
74915fb4814Smrg}
75015fb4814Smrg
751de78e416Smrgvoid vSetSyncReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
752de78e416Smrg{
753de78e416Smrg    PVBIOS_ENHTABLE_STRUCT pEnhModePtr;
754de78e416Smrg    ASTRecPtr pAST;
755de78e416Smrg    UCHAR jReg;
756de78e416Smrg
757de78e416Smrg    pAST = ASTPTR(pScrn);
758de78e416Smrg    pEnhModePtr = pVGAModeInfo->pEnhTableEntry;
759de78e416Smrg
760de78e416Smrg    jReg  = GetReg(MISC_PORT_READ);
761de78e416Smrg    jReg |= (UCHAR) (pEnhModePtr->Flags & SyncNN);
762de78e416Smrg    SetReg(MISC_PORT_WRITE,jReg);
763de78e416Smrg
764de78e416Smrg}
76515fb4814Smrg
76615fb4814SmrgBool bSetDACReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
76715fb4814Smrg{
76815fb4814Smrg    PVBIOS_DAC_INFO pDACPtr;
76915fb4814Smrg    ASTRecPtr pAST;
77015fb4814Smrg    ULONG i, ulDACNumber;
77115fb4814Smrg    UCHAR DACR, DACG, DACB;
77215fb4814Smrg
77315fb4814Smrg    pAST = ASTPTR(pScrn);
77415fb4814Smrg
77515fb4814Smrg    switch (pScrn->bitsPerPixel)
77615fb4814Smrg    {
77715fb4814Smrg    case 8:
77815fb4814Smrg         ulDACNumber = DAC_NUM_VGA;
77915fb4814Smrg         pDACPtr = (PVBIOS_DAC_INFO) &DAC_VGA[0];
78015fb4814Smrg         break;
78115fb4814Smrg    default:
78215fb4814Smrg         return (FALSE);
78315fb4814Smrg    }
78415fb4814Smrg
78515fb4814Smrg    for (i=0; i<ulDACNumber; i++)
78615fb4814Smrg    {
78715fb4814Smrg    	DACR = pDACPtr->DACR;
78815fb4814Smrg    	DACG = pDACPtr->DACG;
78915fb4814Smrg    	DACB = pDACPtr->DACB;
79015fb4814Smrg
79115fb4814Smrg        VGA_LOAD_PALETTE_INDEX (i, DACR, DACG, DACB);
79215fb4814Smrg
79315fb4814Smrg        pDACPtr++;
79415fb4814Smrg    }
79515fb4814Smrg
79615fb4814Smrg    return (TRUE);
79715fb4814Smrg
79815fb4814Smrg}
79915fb4814Smrg
80015fb4814Smrg
801