ast_mode.c revision 15fb4814
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 "xf86Resources.h"
2915fb4814Smrg#include "xf86RAC.h"
3015fb4814Smrg#include "xf86cmap.h"
3115fb4814Smrg#include "compiler.h"
3215fb4814Smrg#include "mibstore.h"
3315fb4814Smrg#include "vgaHW.h"
3415fb4814Smrg#include "mipointer.h"
3515fb4814Smrg#include "micmap.h"
3615fb4814Smrg
3715fb4814Smrg#include "fb.h"
3815fb4814Smrg#include "regionstr.h"
3915fb4814Smrg#include "xf86xv.h"
4015fb4814Smrg#include <X11/extensions/Xv.h>
4115fb4814Smrg#include "vbe.h"
4215fb4814Smrg
4315fb4814Smrg#include "xf86PciInfo.h"
4415fb4814Smrg#include "xf86Pci.h"
4515fb4814Smrg
4615fb4814Smrg/* framebuffer offscreen manager */
4715fb4814Smrg#include "xf86fbman.h"
4815fb4814Smrg
4915fb4814Smrg/* include xaa includes */
5015fb4814Smrg#include "xaa.h"
5115fb4814Smrg#include "xaarop.h"
5215fb4814Smrg
5315fb4814Smrg/* H/W cursor support */
5415fb4814Smrg#include "xf86Cursor.h"
5515fb4814Smrg
5615fb4814Smrg/* Driver specific headers */
5715fb4814Smrg#include "ast.h"
5815fb4814Smrg
5915fb4814SmrgVBIOS_STDTABLE_STRUCT StdTable[] = {
6015fb4814Smrg    /* MD_2_3_400 */
6115fb4814Smrg    {
6215fb4814Smrg        0x67,
6315fb4814Smrg        {0x00,0x03,0x00,0x02},
6415fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
6515fb4814Smrg         0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
6615fb4814Smrg         0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
6715fb4814Smrg         0xff},
6815fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
6915fb4814Smrg         0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
7015fb4814Smrg         0x0c,0x00,0x0f,0x08},
7115fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
7215fb4814Smrg         0xff}
7315fb4814Smrg    },
7415fb4814Smrg    /* Mode12/ExtEGATable */
7515fb4814Smrg    {
7615fb4814Smrg        0xe3,
7715fb4814Smrg        {0x01,0x0f,0x00,0x06},
7815fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
7915fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
8015fb4814Smrg         0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,
8115fb4814Smrg         0xff},
8215fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
8315fb4814Smrg         0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
8415fb4814Smrg         0x01,0x00,0x0f,0x00},
8515fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
8615fb4814Smrg         0xff}
8715fb4814Smrg    },
8815fb4814Smrg    /* ExtVGATable */
8915fb4814Smrg    {
9015fb4814Smrg        0x2f,
9115fb4814Smrg        {0x01,0x0f,0x00,0x0e},
9215fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
9315fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
9415fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
9515fb4814Smrg         0xff},
9615fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
9715fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
9815fb4814Smrg         0x01,0x00,0x00,0x00},
9915fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
10015fb4814Smrg         0xff}
10115fb4814Smrg    },
10215fb4814Smrg    /* ExtHiCTable */
10315fb4814Smrg    {
10415fb4814Smrg        0x2f,
10515fb4814Smrg        {0x01,0x0f,0x00,0x0e},
10615fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
10715fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
10815fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
10915fb4814Smrg         0xff},
11015fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
11115fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
11215fb4814Smrg         0x01,0x00,0x00,0x00},
11315fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
11415fb4814Smrg         0xff}
11515fb4814Smrg    },
11615fb4814Smrg    /* ExtTrueCTable */
11715fb4814Smrg    {
11815fb4814Smrg        0x2f,
11915fb4814Smrg        {0x01,0x0f,0x00,0x0e},
12015fb4814Smrg        {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
12115fb4814Smrg         0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
12215fb4814Smrg         0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
12315fb4814Smrg         0xff},
12415fb4814Smrg        {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
12515fb4814Smrg         0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
12615fb4814Smrg         0x01,0x00,0x00,0x00},
12715fb4814Smrg        {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
12815fb4814Smrg         0xff}
12915fb4814Smrg    },
13015fb4814Smrg};
13115fb4814Smrg
13215fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res640x480Table[] = {
13315fb4814Smrg    { 800, 640, 8, 96, 525, 480, 2, 2, VCLK28_322,	/* 60Hz */
13415fb4814Smrg      (SyncNN | HBorder | VBorder | Charx8Dot), 60, 1, 0x2E },
13515fb4814Smrg    { 832, 640, 16, 40, 520, 480, 1, 3, VCLK31_5,	/* 72Hz */
13615fb4814Smrg      (SyncNN | HBorder | VBorder | Charx8Dot), 72, 2, 0x2E  },
13715fb4814Smrg    { 840, 640, 16, 64, 500, 480, 1, 3, VCLK31_5,	/* 75Hz */
13815fb4814Smrg      (SyncNN | Charx8Dot) , 75, 3, 0x2E },
13915fb4814Smrg    { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36,		/* 85Hz */
14015fb4814Smrg      (SyncNN | Charx8Dot) , 85, 4, 0x2E },
14115fb4814Smrg    { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36,		/* end */
14215fb4814Smrg      (SyncNN | Charx8Dot) , 0xFF, 4, 0x2E },
14315fb4814Smrg};
14415fb4814Smrg
14515fb4814Smrg
14615fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res800x600Table[] = {
14715fb4814Smrg    {1024, 800, 24, 72, 625, 600, 1, 2, VCLK36,		/* 56Hz */
14815fb4814Smrg      (SyncPP | Charx8Dot), 56, 1, 0x30 },
14915fb4814Smrg    {1056, 800, 40, 128, 628, 600, 1, 4, VCLK40,	/* 60Hz */
15015fb4814Smrg      (SyncPP | Charx8Dot), 60, 2, 0x30 },
15115fb4814Smrg    {1040, 800, 56, 120, 666, 600, 37, 6, VCLK50,	/* 72Hz */
15215fb4814Smrg      (SyncPP | Charx8Dot), 72, 3, 0x30 },
15315fb4814Smrg    {1056, 800, 16, 80, 625, 600, 1, 3, VCLK49_5,	/* 75Hz */
15415fb4814Smrg      (SyncPP | Charx8Dot), 75, 4, 0x30 },
15515fb4814Smrg    {1048, 800, 32, 64, 631, 600, 1, 3, VCLK56_25,	/* 85Hz */
15615fb4814Smrg      (SyncPP | Charx8Dot), 85, 5, 0x30 },
15715fb4814Smrg    {1048, 800, 32, 64, 631, 600, 1, 3, VCLK56_25,	/* end */
15815fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 5, 0x30 },
15915fb4814Smrg};
16015fb4814Smrg
16115fb4814Smrg
16215fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1024x768Table[] = {
16315fb4814Smrg    {1344, 1024, 24, 136, 806, 768, 3, 6, VCLK65,	/* 60Hz */
16415fb4814Smrg      (SyncNN | Charx8Dot), 60, 1, 0x31 },
16515fb4814Smrg    {1328, 1024, 24, 136, 806, 768, 3, 6, VCLK75,	/* 70Hz */
16615fb4814Smrg      (SyncNN | Charx8Dot), 70, 2, 0x31 },
16715fb4814Smrg    {1312, 1024, 16, 96, 800, 768, 1, 3, VCLK78_75,	/* 75Hz */
16815fb4814Smrg      (SyncPP | Charx8Dot), 75, 3, 0x31 },
16915fb4814Smrg    {1376, 1024, 48, 96, 808, 768, 1, 3, VCLK94_5,	/* 85Hz */
17015fb4814Smrg      (SyncPP | Charx8Dot), 85, 4, 0x31 },
17115fb4814Smrg    {1376, 1024, 48, 96, 808, 768, 1, 3, VCLK94_5,	/* end */
17215fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 4, 0x31 },
17315fb4814Smrg};
17415fb4814Smrg
17515fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1280x1024Table[] = {
17615fb4814Smrg    {1688, 1280, 48, 112, 1066, 1024, 1, 3, VCLK108,	/* 60Hz */
17715fb4814Smrg      (SyncPP | Charx8Dot), 60, 1, 0x32 },
17815fb4814Smrg    {1688, 1280, 16, 144, 1066, 1024, 1, 3, VCLK135,	/* 75Hz */
17915fb4814Smrg      (SyncPP | Charx8Dot), 75, 2, 0x32 },
18015fb4814Smrg    {1728, 1280, 64, 160, 1072, 1024, 1, 3, VCLK157_5,	/* 85Hz */
18115fb4814Smrg      (SyncPP | Charx8Dot), 85, 3, 0x32 },
18215fb4814Smrg    {1728, 1280, 64, 160, 1072, 1024, 1, 3, VCLK157_5,	/* end */
18315fb4814Smrg      (SyncPP | Charx8Dot), 0xFF, 3, 0x32 },
18415fb4814Smrg};
18515fb4814Smrg
18615fb4814SmrgVBIOS_ENHTABLE_STRUCT  Res1600x1200Table[] = {
18715fb4814Smrg    {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162,	/* 60Hz */
18815fb4814Smrg      (SyncPP | Charx8Dot), 60, 1, 0x33 },
18915fb4814Smrg    {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162,	/* end */
19015fb4814Smrg      (SyncPP | Charx8Dot), 60, 1, 0x33 },
19115fb4814Smrg};
19215fb4814Smrg
19315fb4814SmrgVBIOS_DCLK_INFO DCLKTable [] = {
19415fb4814Smrg    {0x2C, 0xE7, 0x03},					/* 00: VCLK25_175	*/
19515fb4814Smrg    {0x95, 0x62, 0x03},				        /* 01: VCLK28_322	*/
19615fb4814Smrg    {0x67, 0x63, 0x01},				        /* 02: VCLK31_5         */
19715fb4814Smrg    {0x76, 0x63, 0x01},				        /* 03: VCLK36         	*/
19815fb4814Smrg    {0xEE, 0x67, 0x01},				        /* 04: VCLK40          	*/
19915fb4814Smrg    {0x82, 0x62, 0x01}, 			        /* 05: VCLK49_5        	*/
20015fb4814Smrg    {0xC6, 0x64, 0x01},                        	        /* 06: VCLK50          	*/
20115fb4814Smrg    {0x94, 0x62, 0x01},                        	        /* 07: VCLK56_25       	*/
20215fb4814Smrg    {0x80, 0x64, 0x00},                        	        /* 08: VCLK65		*/
20315fb4814Smrg    {0x7B, 0x63, 0x00},                        	        /* 09: VCLK75	        */
20415fb4814Smrg    {0x67, 0x62, 0x00},				        /* 0A: VCLK78_75       	*/
20515fb4814Smrg    {0x7C, 0x62, 0x00},                        	        /* 0B: VCLK94_5        	*/
20615fb4814Smrg    {0x8E, 0x62, 0x00},                        	        /* 0C: VCLK108         	*/
20715fb4814Smrg    {0x85, 0x24, 0x00},                        	        /* 0D: VCLK135         	*/
20815fb4814Smrg    {0x67, 0x22, 0x00},                        	        /* 0E: VCLK157_5       	*/
20915fb4814Smrg    {0x6A, 0x22, 0x00},				        /* 0F: VCLK162         	*/
21015fb4814Smrg};
21115fb4814Smrg
21215fb4814SmrgVBIOS_DAC_INFO DAC_TEXT[] = {
21315fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
21415fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x2a, 0x00 },  { 0x2a, 0x2a, 0x2a },
21515fb4814Smrg { 0x00, 0x00, 0x15 },  { 0x00, 0x00, 0x3f },  { 0x00, 0x2a, 0x15 },  { 0x00, 0x2a, 0x3f },
21615fb4814Smrg { 0x2a, 0x00, 0x15 },  { 0x2a, 0x00, 0x3f },  { 0x2a, 0x2a, 0x15 },  { 0x2a, 0x2a, 0x3f },
21715fb4814Smrg { 0x00, 0x15, 0x00 },  { 0x00, 0x15, 0x2a },  { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x2a },
21815fb4814Smrg { 0x2a, 0x15, 0x00 },  { 0x2a, 0x15, 0x2a },  { 0x2a, 0x3f, 0x00 },  { 0x2a, 0x3f, 0x2a },
21915fb4814Smrg { 0x00, 0x15, 0x15 },  { 0x00, 0x15, 0x3f },  { 0x00, 0x3f, 0x15 },  { 0x00, 0x3f, 0x3f },
22015fb4814Smrg { 0x2a, 0x15, 0x15 },  { 0x2a, 0x15, 0x3f },  { 0x2a, 0x3f, 0x15 },  { 0x2a, 0x3f, 0x3f },
22115fb4814Smrg { 0x15, 0x00, 0x00 },  { 0x15, 0x00, 0x2a },  { 0x15, 0x2a, 0x00 },  { 0x15, 0x2a, 0x2a },
22215fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x00, 0x2a },  { 0x3f, 0x2a, 0x00 },  { 0x3f, 0x2a, 0x2a },
22315fb4814Smrg { 0x15, 0x00, 0x15 },  { 0x15, 0x00, 0x3f },  { 0x15, 0x2a, 0x15 },  { 0x15, 0x2a, 0x3f },
22415fb4814Smrg { 0x3f, 0x00, 0x15 },  { 0x3f, 0x00, 0x3f },  { 0x3f, 0x2a, 0x15 },  { 0x3f, 0x2a, 0x3f },
22515fb4814Smrg { 0x15, 0x15, 0x00 },  { 0x15, 0x15, 0x2a },  { 0x15, 0x3f, 0x00 },  { 0x15, 0x3f, 0x2a },
22615fb4814Smrg { 0x3f, 0x15, 0x00 },  { 0x3f, 0x15, 0x2a },  { 0x3f, 0x3f, 0x00 },  { 0x3f, 0x3f, 0x2a },
22715fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
22815fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
22915fb4814Smrg};
23015fb4814Smrg
23115fb4814SmrgVBIOS_DAC_INFO DAC_EGA[] = {
23215fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
23315fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x2a, 0x00 },  { 0x2a, 0x2a, 0x2a },
23415fb4814Smrg { 0x00, 0x00, 0x15 },  { 0x00, 0x00, 0x3f },  { 0x00, 0x2a, 0x15 },  { 0x00, 0x2a, 0x3f },
23515fb4814Smrg { 0x2a, 0x00, 0x15 },  { 0x2a, 0x00, 0x3f },  { 0x2a, 0x2a, 0x15 },  { 0x2a, 0x2a, 0x3f },
23615fb4814Smrg { 0x00, 0x15, 0x00 },  { 0x00, 0x15, 0x2a },  { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x2a },
23715fb4814Smrg { 0x2a, 0x15, 0x00 },  { 0x2a, 0x15, 0x2a },  { 0x2a, 0x3f, 0x00 },  { 0x2a, 0x3f, 0x2a },
23815fb4814Smrg { 0x00, 0x15, 0x15 },  { 0x00, 0x15, 0x3f },  { 0x00, 0x3f, 0x15 },  { 0x00, 0x3f, 0x3f },
23915fb4814Smrg { 0x2a, 0x15, 0x15 },  { 0x2a, 0x15, 0x3f },  { 0x2a, 0x3f, 0x15 },  { 0x2a, 0x3f, 0x3f },
24015fb4814Smrg { 0x15, 0x00, 0x00 },  { 0x15, 0x00, 0x2a },  { 0x15, 0x2a, 0x00 },  { 0x15, 0x2a, 0x2a },
24115fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x00, 0x2a },  { 0x3f, 0x2a, 0x00 },  { 0x3f, 0x2a, 0x2a },
24215fb4814Smrg { 0x15, 0x00, 0x15 },  { 0x15, 0x00, 0x3f },  { 0x15, 0x2a, 0x15 },  { 0x15, 0x2a, 0x3f },
24315fb4814Smrg { 0x3f, 0x00, 0x15 },  { 0x3f, 0x00, 0x3f },  { 0x3f, 0x2a, 0x15 },  { 0x3f, 0x2a, 0x3f },
24415fb4814Smrg { 0x15, 0x15, 0x00 },  { 0x15, 0x15, 0x2a },  { 0x15, 0x3f, 0x00 },  { 0x15, 0x3f, 0x2a },
24515fb4814Smrg { 0x3f, 0x15, 0x00 },  { 0x3f, 0x15, 0x2a },  { 0x3f, 0x3f, 0x00 },  { 0x3f, 0x3f, 0x2a },
24615fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
24715fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
24815fb4814Smrg};
24915fb4814Smrg
25015fb4814SmrgVBIOS_DAC_INFO DAC_VGA[] = {
25115fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x2a },  { 0x00, 0x2a, 0x00 },  { 0x00, 0x2a, 0x2a },
25215fb4814Smrg { 0x2a, 0x00, 0x00 },  { 0x2a, 0x00, 0x2a },  { 0x2a, 0x15, 0x00 },  { 0x2a, 0x2a, 0x2a },
25315fb4814Smrg { 0x15, 0x15, 0x15 },  { 0x15, 0x15, 0x3f },  { 0x15, 0x3f, 0x15 },  { 0x15, 0x3f, 0x3f },
25415fb4814Smrg { 0x3f, 0x15, 0x15 },  { 0x3f, 0x15, 0x3f },  { 0x3f, 0x3f, 0x15 },  { 0x3f, 0x3f, 0x3f },
25515fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x05, 0x05, 0x05 },  { 0x08, 0x08, 0x08 },  { 0x0b, 0x0b, 0x0b },
25615fb4814Smrg { 0x0e, 0x0e, 0x0e },  { 0x11, 0x11, 0x11 },  { 0x14, 0x14, 0x14 },  { 0x18, 0x18, 0x18 },
25715fb4814Smrg { 0x1c, 0x1c, 0x1c },  { 0x20, 0x20, 0x20 },  { 0x24, 0x24, 0x24 },  { 0x28, 0x28, 0x28 },
25815fb4814Smrg { 0x2d, 0x2d, 0x2d },  { 0x32, 0x32, 0x32 },  { 0x38, 0x38, 0x38 },  { 0x3f, 0x3f, 0x3f },
25915fb4814Smrg { 0x00, 0x00, 0x3f },  { 0x10, 0x00, 0x3f },  { 0x1f, 0x00, 0x3f },  { 0x2f, 0x00, 0x3f },
26015fb4814Smrg { 0x3f, 0x00, 0x3f },  { 0x3f, 0x00, 0x2f },  { 0x3f, 0x00, 0x1f },  { 0x3f, 0x00, 0x10 },
26115fb4814Smrg { 0x3f, 0x00, 0x00 },  { 0x3f, 0x10, 0x00 },  { 0x3f, 0x1f, 0x00 },  { 0x3f, 0x2f, 0x00 },
26215fb4814Smrg { 0x3f, 0x3f, 0x00 },  { 0x2f, 0x3f, 0x00 },  { 0x1f, 0x3f, 0x00 },  { 0x10, 0x3f, 0x00 },
26315fb4814Smrg { 0x00, 0x3f, 0x00 },  { 0x00, 0x3f, 0x10 },  { 0x00, 0x3f, 0x1f },  { 0x00, 0x3f, 0x2f },
26415fb4814Smrg { 0x00, 0x3f, 0x3f },  { 0x00, 0x2f, 0x3f },  { 0x00, 0x1f, 0x3f },  { 0x00, 0x10, 0x3f },
26515fb4814Smrg { 0x1f, 0x1f, 0x3f },  { 0x27, 0x1f, 0x3f },  { 0x2f, 0x1f, 0x3f },  { 0x37, 0x1f, 0x3f },
26615fb4814Smrg { 0x3f, 0x1f, 0x3f },  { 0x3f, 0x1f, 0x37 },  { 0x3f, 0x1f, 0x2f },  { 0x3f, 0x1f, 0x27 },
26715fb4814Smrg { 0x3f, 0x1f, 0x1f },  { 0x3f, 0x27, 0x1f },  { 0x3f, 0x2f, 0x1f },  { 0x3f, 0x37, 0x1f },
26815fb4814Smrg { 0x3f, 0x3f, 0x1f },  { 0x37, 0x3f, 0x1f },  { 0x2f, 0x3f, 0x1f },  { 0x27, 0x3f, 0x1f },
26915fb4814Smrg { 0x1f, 0x3f, 0x1f },  { 0x1f, 0x3f, 0x27 },  { 0x1f, 0x3f, 0x2f },  { 0x1f, 0x3f, 0x37 },
27015fb4814Smrg { 0x1f, 0x3f, 0x3f },  { 0x1f, 0x37, 0x3f },  { 0x1f, 0x2f, 0x3f },  { 0x1f, 0x27, 0x3f },
27115fb4814Smrg { 0x2d, 0x2d, 0x3f },  { 0x31, 0x2d, 0x3f },  { 0x36, 0x2d, 0x3f },  { 0x3a, 0x2d, 0x3f },
27215fb4814Smrg { 0x3f, 0x2d, 0x3f },  { 0x3f, 0x2d, 0x3a },  { 0x3f, 0x2d, 0x36 },  { 0x3f, 0x2d, 0x31 },
27315fb4814Smrg { 0x3f, 0x2d, 0x2d },  { 0x3f, 0x31, 0x2d },  { 0x3f, 0x36, 0x2d },  { 0x3f, 0x3a, 0x2d },
27415fb4814Smrg { 0x3f, 0x3f, 0x2d },  { 0x3a, 0x3f, 0x2d },  { 0x36, 0x3f, 0x2d },  { 0x31, 0x3f, 0x2d },
27515fb4814Smrg { 0x2d, 0x3f, 0x2d },  { 0x2d, 0x3f, 0x31 },  { 0x2d, 0x3f, 0x36 },  { 0x2d, 0x3f, 0x3a },
27615fb4814Smrg { 0x2d, 0x3f, 0x3f },  { 0x2d, 0x3a, 0x3f },  { 0x2d, 0x36, 0x3f },  { 0x2d, 0x31, 0x3f },
27715fb4814Smrg { 0x00, 0x00, 0x1c },  { 0x07, 0x00, 0x1c },  { 0x0e, 0x00, 0x1c },  { 0x15, 0x00, 0x1c },
27815fb4814Smrg { 0x1c, 0x00, 0x1c },  { 0x1c, 0x00, 0x15 },  { 0x1c, 0x00, 0x0e },  { 0x1c, 0x00, 0x07 },
27915fb4814Smrg { 0x1c, 0x00, 0x00 },  { 0x1c, 0x07, 0x00 },  { 0x1c, 0x0e, 0x00 },  { 0x1c, 0x15, 0x00 },
28015fb4814Smrg { 0x1c, 0x1c, 0x00 },  { 0x15, 0x1c, 0x00 },  { 0x0e, 0x1c, 0x00 },  { 0x07, 0x1c, 0x00 },
28115fb4814Smrg { 0x00, 0x1c, 0x00 },  { 0x00, 0x1c, 0x07 },  { 0x00, 0x1c, 0x0e },  { 0x00, 0x1c, 0x15 },
28215fb4814Smrg { 0x00, 0x1c, 0x1c },  { 0x00, 0x15, 0x1c },  { 0x00, 0x0e, 0x1c },  { 0x00, 0x07, 0x1c },
28315fb4814Smrg { 0x0e, 0x0e, 0x1c },  { 0x11, 0x0e, 0x1c },  { 0x15, 0x0e, 0x1c },  { 0x18, 0x0e, 0x1c },
28415fb4814Smrg { 0x1c, 0x0e, 0x1c },  { 0x1c, 0x0e, 0x18 },  { 0x1c, 0x0e, 0x15 },  { 0x1c, 0x0e, 0x11 },
28515fb4814Smrg { 0x1c, 0x0e, 0x0e },  { 0x1c, 0x11, 0x0e },  { 0x1c, 0x15, 0x0e },  { 0x1c, 0x18, 0x0e },
28615fb4814Smrg { 0x1c, 0x1c, 0x0e },  { 0x18, 0x1c, 0x0e },  { 0x15, 0x1c, 0x0e },  { 0x11, 0x1c, 0x0e },
28715fb4814Smrg { 0x0e, 0x1c, 0x0e },  { 0x0e, 0x1c, 0x11 },  { 0x0e, 0x1c, 0x15 },  { 0x0e, 0x1c, 0x18 },
28815fb4814Smrg { 0x0e, 0x1c, 0x1c },  { 0x0e, 0x18, 0x1c },  { 0x0e, 0x15, 0x1c },  { 0x0e, 0x11, 0x1c },
28915fb4814Smrg { 0x14, 0x14, 0x1c },  { 0x16, 0x14, 0x1c },  { 0x18, 0x14, 0x1c },  { 0x1a, 0x14, 0x1c },
29015fb4814Smrg { 0x1c, 0x14, 0x1c },  { 0x1c, 0x14, 0x1a },  { 0x1c, 0x14, 0x18 },  { 0x1c, 0x14, 0x16 },
29115fb4814Smrg { 0x1c, 0x14, 0x14 },  { 0x1c, 0x16, 0x14 },  { 0x1c, 0x18, 0x14 },  { 0x1c, 0x1a, 0x14 },
29215fb4814Smrg { 0x1c, 0x1c, 0x14 },  { 0x1a, 0x1c, 0x14 },  { 0x18, 0x1c, 0x14 },  { 0x16, 0x1c, 0x14 },
29315fb4814Smrg { 0x14, 0x1c, 0x14 },  { 0x14, 0x1c, 0x16 },  { 0x14, 0x1c, 0x18 },  { 0x14, 0x1c, 0x1a },
29415fb4814Smrg { 0x14, 0x1c, 0x1c },  { 0x14, 0x1a, 0x1c },  { 0x14, 0x18, 0x1c },  { 0x14, 0x16, 0x1c },
29515fb4814Smrg { 0x00, 0x00, 0x10 },  { 0x04, 0x00, 0x10 },  { 0x08, 0x00, 0x10 },  { 0x0c, 0x00, 0x10 },
29615fb4814Smrg { 0x10, 0x00, 0x10 },  { 0x10, 0x00, 0x0c },  { 0x10, 0x00, 0x08 },  { 0x10, 0x00, 0x04 },
29715fb4814Smrg { 0x10, 0x00, 0x00 },  { 0x10, 0x04, 0x00 },  { 0x10, 0x08, 0x00 },  { 0x10, 0x0c, 0x00 },
29815fb4814Smrg { 0x10, 0x10, 0x00 },  { 0x0c, 0x10, 0x00 },  { 0x08, 0x10, 0x00 },  { 0x04, 0x10, 0x00 },
29915fb4814Smrg { 0x00, 0x10, 0x00 },  { 0x00, 0x10, 0x04 },  { 0x00, 0x10, 0x08 },  { 0x00, 0x10, 0x0c },
30015fb4814Smrg { 0x00, 0x10, 0x10 },  { 0x00, 0x0c, 0x10 },  { 0x00, 0x08, 0x10 },  { 0x00, 0x04, 0x10 },
30115fb4814Smrg { 0x08, 0x08, 0x10 },  { 0x0a, 0x08, 0x10 },  { 0x0c, 0x08, 0x10 },  { 0x0e, 0x08, 0x10 },
30215fb4814Smrg { 0x10, 0x08, 0x10 },  { 0x10, 0x08, 0x0e },  { 0x10, 0x08, 0x0c },  { 0x10, 0x08, 0x0a },
30315fb4814Smrg { 0x10, 0x08, 0x08 },  { 0x10, 0x0a, 0x08 },  { 0x10, 0x0c, 0x08 },  { 0x10, 0x0e, 0x08 },
30415fb4814Smrg { 0x10, 0x10, 0x08 },  { 0x0e, 0x10, 0x08 },  { 0x0c, 0x10, 0x08 },  { 0x0a, 0x10, 0x08 },
30515fb4814Smrg { 0x08, 0x10, 0x08 },  { 0x08, 0x10, 0x0a },  { 0x08, 0x10, 0x0c },  { 0x08, 0x10, 0x0e },
30615fb4814Smrg { 0x08, 0x10, 0x10 },  { 0x08, 0x0e, 0x10 },  { 0x08, 0x0c, 0x10 },  { 0x08, 0x0a, 0x10 },
30715fb4814Smrg { 0x0b, 0x0b, 0x10 },  { 0x0c, 0x0b, 0x10 },  { 0x0d, 0x0b, 0x10 },  { 0x0f, 0x0b, 0x10 },
30815fb4814Smrg { 0x10, 0x0b, 0x10 },  { 0x10, 0x0b, 0x0f },  { 0x10, 0x0b, 0x0d },  { 0x10, 0x0b, 0x0c },
30915fb4814Smrg { 0x10, 0x0b, 0x0b },  { 0x10, 0x0c, 0x0b },  { 0x10, 0x0d, 0x0b },  { 0x10, 0x0f, 0x0b },
31015fb4814Smrg { 0x10, 0x10, 0x0b },  { 0x0f, 0x10, 0x0b },  { 0x0d, 0x10, 0x0b },  { 0x0c, 0x10, 0x0b },
31115fb4814Smrg { 0x0b, 0x10, 0x0b },  { 0x0b, 0x10, 0x0c },  { 0x0b, 0x10, 0x0d },  { 0x0b, 0x10, 0x0f },
31215fb4814Smrg { 0x0b, 0x10, 0x10 },  { 0x0b, 0x0f, 0x10 },  { 0x0b, 0x0d, 0x10 },  { 0x0b, 0x0c, 0x10 },
31315fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },
31415fb4814Smrg { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x00 },
31515fb4814Smrg};
31615fb4814Smrg
31715fb4814Smrg/* extern. function */
31815fb4814Smrgextern void vASTOpenKey(ScrnInfoPtr pScrn);
31915fb4814Smrgextern Bool bASTRegInit(ScrnInfoPtr pScrn);
32015fb4814Smrgextern void vAST1000DisplayOn(ASTRecPtr pAST);
32115fb4814Smrgextern void vAST1000DisplayOff(ASTRecPtr pAST);
32215fb4814Smrg
32315fb4814Smrgextern Bool bEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
32415fb4814Smrgextern void vDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
32515fb4814Smrg
32615fb4814Smrgextern Bool bInitHWC(ScrnInfoPtr pScrn, ASTRecPtr pAST);
32715fb4814Smrg
32815fb4814Smrg/* Prototype type declaration*/
32915fb4814SmrgBool ASTSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
33015fb4814SmrgBool bGetAST1000VGAModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33115fb4814Smrgvoid vSetStdReg(ScrnInfoPtr pScrn,  DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33215fb4814Smrgvoid vSetCRTCReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33315fb4814Smrgvoid vSetOffsetReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33415fb4814Smrgvoid vSetDCLKReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33515fb4814Smrgvoid vSetExtReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33615fb4814SmrgBool bSetDACReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo);
33715fb4814Smrg
33815fb4814SmrgBool
33915fb4814SmrgASTSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
34015fb4814Smrg{
34115fb4814Smrg    ASTRecPtr pAST;
34215fb4814Smrg    VBIOS_MODE_INFO vgamodeinfo;
34315fb4814Smrg
34415fb4814Smrg    pAST = ASTPTR(pScrn);
34515fb4814Smrg
34615fb4814Smrg    vASTOpenKey(pScrn);
34715fb4814Smrg    bASTRegInit(pScrn);
34815fb4814Smrg
34915fb4814Smrg    /* pre set mode */
35015fb4814Smrg    bGetAST1000VGAModeInfo(pScrn, mode, &vgamodeinfo);
35115fb4814Smrg
35215fb4814Smrg    /* set mode */
35315fb4814Smrg    vSetStdReg(pScrn, mode, &vgamodeinfo);
35415fb4814Smrg    vSetCRTCReg(pScrn, mode, &vgamodeinfo);
35515fb4814Smrg    vSetOffsetReg(pScrn, mode, &vgamodeinfo);
35615fb4814Smrg    vSetDCLKReg(pScrn, mode, &vgamodeinfo);
35715fb4814Smrg    vSetExtReg(pScrn, mode, &vgamodeinfo);
35815fb4814Smrg    bSetDACReg(pScrn, mode, &vgamodeinfo);
35915fb4814Smrg
36015fb4814Smrg    /* post set mode */
36115fb4814Smrg#ifdef	Accel_2D
36215fb4814Smrg   if (!pAST->noAccel) {
36315fb4814Smrg       if (!bEnable2D(pScrn, pAST)) {
36415fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Enable 2D failed\n");
36515fb4814Smrg           pAST->noAccel = TRUE;
36615fb4814Smrg       }
36715fb4814Smrg   }
36815fb4814Smrg#endif
36915fb4814Smrg#ifdef	HWC
37015fb4814Smrg   if (!pAST->noHWC) {
37115fb4814Smrg       if (!bInitHWC(pScrn, pAST)) {
37215fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Init HWC failed\n");
37315fb4814Smrg           pAST->noHWC = TRUE;
37415fb4814Smrg       }
37515fb4814Smrg   }
37615fb4814Smrg#endif
37715fb4814Smrg    vAST1000DisplayOn(pAST);
37815fb4814Smrg
37915fb4814Smrg    return (TRUE);
38015fb4814Smrg}
38115fb4814Smrg
38215fb4814Smrg
38315fb4814SmrgBool bGetAST1000VGAModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
38415fb4814Smrg{
38515fb4814Smrg    ASTRecPtr pAST;
38615fb4814Smrg    ULONG ulModeID, ulColorIndex, ulRefreshRate, ulRefreshRateIndex = 0;
38715fb4814Smrg    ULONG ulHBorder, ulVBorder;
38815fb4814Smrg
38915fb4814Smrg    pAST = ASTPTR(pScrn);
39015fb4814Smrg
39115fb4814Smrg    switch (pScrn->bitsPerPixel)
39215fb4814Smrg    {
39315fb4814Smrg    case 8:
39415fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[VGAModeIndex];
39515fb4814Smrg	 ulColorIndex = VGAModeIndex-1;
39615fb4814Smrg         break;
39715fb4814Smrg    case 16:
39815fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[HiCModeIndex];
39915fb4814Smrg	 ulColorIndex = HiCModeIndex-1;
40015fb4814Smrg         break;
40115fb4814Smrg    case 24:
40215fb4814Smrg    case 32:
40315fb4814Smrg         pVGAModeInfo->pStdTableEntry = (PVBIOS_STDTABLE_STRUCT) &StdTable[TrueCModeIndex];
40415fb4814Smrg	 ulColorIndex = TrueCModeIndex-1;
40515fb4814Smrg	 break;
40615fb4814Smrg    default:
40715fb4814Smrg         return (FALSE);
40815fb4814Smrg    }
40915fb4814Smrg
41015fb4814Smrg    switch (mode->CrtcHDisplay)
41115fb4814Smrg    {
41215fb4814Smrg    case 640:
41315fb4814Smrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res640x480Table[ulRefreshRateIndex];
41415fb4814Smrg         break;
41515fb4814Smrg    case 800:
41615fb4814Smrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res800x600Table[ulRefreshRateIndex];
41715fb4814Smrg         break;
41815fb4814Smrg    case 1024:
41915fb4814Smrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1024x768Table[ulRefreshRateIndex];
42015fb4814Smrg         break;
42115fb4814Smrg    case 1280:
42215fb4814Smrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1280x1024Table[ulRefreshRateIndex];
42315fb4814Smrg         break;
42415fb4814Smrg    case 1600:
42515fb4814Smrg         pVGAModeInfo->pEnhTableEntry = (PVBIOS_ENHTABLE_STRUCT) &Res1600x1200Table[ulRefreshRateIndex];
42615fb4814Smrg         break;
42715fb4814Smrg    default:
42815fb4814Smrg         return (FALSE);
42915fb4814Smrg    }
43015fb4814Smrg
43115fb4814Smrg    /* Get Proper Mode Index */
43215fb4814Smrg    ulRefreshRate = (mode->Clock * 1000) / (mode->HTotal * mode->VTotal);
43315fb4814Smrg
43415fb4814Smrg    while (pVGAModeInfo->pEnhTableEntry->ulRefreshRate < ulRefreshRate)
43515fb4814Smrg    {
43615fb4814Smrg        pVGAModeInfo->pEnhTableEntry++;
43715fb4814Smrg        if ((pVGAModeInfo->pEnhTableEntry->ulRefreshRate > ulRefreshRate) ||
43815fb4814Smrg            (pVGAModeInfo->pEnhTableEntry->ulRefreshRate == 0xFF))
43915fb4814Smrg        {
44015fb4814Smrg            pVGAModeInfo->pEnhTableEntry--;
44115fb4814Smrg            break;
44215fb4814Smrg        }
44315fb4814Smrg    }
44415fb4814Smrg
44515fb4814Smrg    /* Update mode CRTC info */
44615fb4814Smrg    ulHBorder = (pVGAModeInfo->pEnhTableEntry->Flags & HBorder) ? 1:0;
44715fb4814Smrg    ulVBorder = (pVGAModeInfo->pEnhTableEntry->Flags & VBorder) ? 1:0;
44815fb4814Smrg
44915fb4814Smrg    mode->CrtcHTotal      = (int) pVGAModeInfo->pEnhTableEntry->HT;
45015fb4814Smrg    mode->CrtcHBlankStart = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder);
45115fb4814Smrg    mode->CrtcHBlankEnd   = (int) (pVGAModeInfo->pEnhTableEntry->HT - ulHBorder);
45215fb4814Smrg    mode->CrtcHSyncStart  = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder
45315fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HFP);
45415fb4814Smrg    mode->CrtcHSyncEnd    = (int) (pVGAModeInfo->pEnhTableEntry->HDE + ulHBorder
45515fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HFP
45615fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->HSYNC);
45715fb4814Smrg
45815fb4814Smrg    mode->CrtcVTotal      = (int) pVGAModeInfo->pEnhTableEntry->VT;
45915fb4814Smrg    mode->CrtcVBlankStart = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder);
46015fb4814Smrg    mode->CrtcVBlankEnd   = (int) (pVGAModeInfo->pEnhTableEntry->VT - ulVBorder);
46115fb4814Smrg    mode->CrtcVSyncStart  = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder
46215fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VFP);
46315fb4814Smrg    mode->CrtcVSyncEnd    = (int) (pVGAModeInfo->pEnhTableEntry->VDE + ulVBorder
46415fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VFP
46515fb4814Smrg                                   + pVGAModeInfo->pEnhTableEntry->VSYNC);
46615fb4814Smrg
46715fb4814Smrg    /* Write mode info to scratch */
46815fb4814Smrg    ulRefreshRateIndex = pVGAModeInfo->pEnhTableEntry->ulRefreshRateIndex;
46915fb4814Smrg    ulModeID = pVGAModeInfo->pEnhTableEntry->ulModeID;
47015fb4814Smrg
47115fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8C, (UCHAR) ((ulColorIndex & 0x0F) << 4));
47215fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8D, (UCHAR) (ulRefreshRateIndex & 0xFF));
47315fb4814Smrg    SetIndexReg(CRTC_PORT, 0x8E, (UCHAR) (ulModeID & 0xFF));
47415fb4814Smrg
47515fb4814Smrg    return (TRUE);
47615fb4814Smrg}
47715fb4814Smrg
47815fb4814Smrgvoid vSetStdReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
47915fb4814Smrg{
48015fb4814Smrg
48115fb4814Smrg    PVBIOS_STDTABLE_STRUCT pStdModePtr;
48215fb4814Smrg    ASTRecPtr pAST;
48315fb4814Smrg    ULONG i;
48415fb4814Smrg    UCHAR jReg;
48515fb4814Smrg
48615fb4814Smrg    pStdModePtr = pVGAModeInfo->pStdTableEntry;
48715fb4814Smrg    pAST = ASTPTR(pScrn);
48815fb4814Smrg
48915fb4814Smrg    /* Set Misc */
49015fb4814Smrg    jReg = pStdModePtr->MISC;
49115fb4814Smrg    SetReg(MISC_PORT_WRITE,jReg);
49215fb4814Smrg
49315fb4814Smrg    /* Set Seq */
49415fb4814Smrg    SetIndexReg(SEQ_PORT,0x00, 0x03);
49515fb4814Smrg    for (i=0; i<4; i++)
49615fb4814Smrg    {
49715fb4814Smrg        jReg = pStdModePtr->SEQ[i];
49815fb4814Smrg    	if (!i) (jReg |= 0x20);			/* display off */
49915fb4814Smrg        SetIndexReg(SEQ_PORT,(UCHAR) (i+1), jReg);
50015fb4814Smrg    }
50115fb4814Smrg
50215fb4814Smrg    /* Set CRTC */
50315fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x00);
50415fb4814Smrg    for (i=0; i<25; i++)
50515fb4814Smrg    {
50615fb4814Smrg        jReg = pStdModePtr->CRTC[i];
50715fb4814Smrg        SetIndexReg(CRTC_PORT,(UCHAR) i, jReg);
50815fb4814Smrg    }
50915fb4814Smrg
51015fb4814Smrg    /* Set AR */
51115fb4814Smrg    jReg = GetReg(INPUT_STATUS1_READ);
51215fb4814Smrg    for (i=0; i<20; i++)
51315fb4814Smrg    {
51415fb4814Smrg        jReg = pStdModePtr->AR[i];
51515fb4814Smrg        SetReg(AR_PORT_WRITE, (UCHAR) i);
51615fb4814Smrg        SetReg(AR_PORT_WRITE, jReg);
51715fb4814Smrg    }
51815fb4814Smrg    SetReg(AR_PORT_WRITE, 0x14);
51915fb4814Smrg    SetReg(AR_PORT_WRITE, 0x00);
52015fb4814Smrg
52115fb4814Smrg    jReg = GetReg(INPUT_STATUS1_READ);
52215fb4814Smrg    SetReg (AR_PORT_WRITE, 0x20);		/* set POS */
52315fb4814Smrg
52415fb4814Smrg    /* Set GR */
52515fb4814Smrg    for (i=0; i<9; i++)
52615fb4814Smrg    {
52715fb4814Smrg        SetIndexReg(GR_PORT,(UCHAR) i, jReg);
52815fb4814Smrg
52915fb4814Smrg    }
53015fb4814Smrg
53115fb4814Smrg
53215fb4814Smrg}
53315fb4814Smrg
53415fb4814Smrgvoid
53515fb4814SmrgvSetCRTCReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
53615fb4814Smrg{
53715fb4814Smrg    ASTRecPtr pAST;
53815fb4814Smrg    USHORT usTemp;
53915fb4814Smrg    UCHAR jReg05, jReg07, jReg09, jRegAC, jRegAD, jRegAE;
54015fb4814Smrg
54115fb4814Smrg    pAST = ASTPTR(pScrn);
54215fb4814Smrg    jReg05 = jReg07 = jReg09 = jRegAC = jRegAD = jRegAE = 0;
54315fb4814Smrg
54415fb4814Smrg    /* unlock CRTC */
54515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x00);
54615fb4814Smrg
54715fb4814Smrg    /* Horizontal Timing Programming */
54815fb4814Smrg    usTemp = (mode->CrtcHTotal >> 3) - 5;
54915fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x01;			/* HT D[8] */
55015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x00, 0x00, (UCHAR) usTemp);
55115fb4814Smrg    usTemp = (mode->CrtcHDisplay >> 3) - 1;
55215fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x04;			/* HDE D[8] */
55315fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x01, 0x00, (UCHAR) usTemp);
55415fb4814Smrg    usTemp = (mode->CrtcHBlankStart >> 3) - 1;
55515fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x10;			/* HBS D[8] */
55615fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x02, 0x00, (UCHAR) usTemp);
55715fb4814Smrg    usTemp = ((mode->CrtcHBlankEnd >> 3) - 1) & 0x7F;
55815fb4814Smrg    if (usTemp & 0x20) jReg05 |= 0x80;			/* HBE D[5] */
55915fb4814Smrg    if (usTemp & 0x40) jRegAD |= 0x01;			/* HBE D[6] */
56015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x03, 0xE0, (UCHAR) (usTemp & 0x1F));
56115fb4814Smrg    usTemp = (mode->CrtcHSyncStart >> 3 );
56215fb4814Smrg    if (usTemp & 0x100) jRegAC |= 0x40;			/* HRS D[5] */
56315fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x04, 0x00, (UCHAR) (usTemp));
56415fb4814Smrg    usTemp = (mode->CrtcHSyncEnd >> 3 ) & 0x3F;
56515fb4814Smrg    if (usTemp & 0x20) jRegAD |= 0x04;			/* HRE D[5] */
56615fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x05, 0x60, (UCHAR) ((usTemp & 0x1F) | jReg05));
56715fb4814Smrg
56815fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAC, 0x00, (UCHAR) jRegAC);
56915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAD, 0x00, (UCHAR) jRegAD);
57015fb4814Smrg
57115fb4814Smrg    /* Vetical Timing Programming */
57215fb4814Smrg    usTemp = (mode->CrtcVTotal) - 2;
57315fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x01;			/* VT D[8] */
57415fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x20;
57515fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x01;			/* VT D[10] */
57615fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x06, 0x00, (UCHAR) usTemp);
57715fb4814Smrg    usTemp = (mode->CrtcVSyncStart) - 1;
57815fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x04;			/* VRS D[8] */
57915fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x80;			/* VRS D[9] */
58015fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x08;			/* VRS D[10] */
58115fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x10, 0x00, (UCHAR) usTemp);
58215fb4814Smrg    usTemp = ((mode->CrtcVSyncEnd) - 1) & 0x3F;
58315fb4814Smrg    if (usTemp & 0x10) jRegAE |= 0x20;			/* VRE D[4] */
58415fb4814Smrg    if (usTemp & 0x20) jRegAE |= 0x40;			/* VRE D[5] */
58515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x70, (UCHAR) (usTemp & 0x0F));
58615fb4814Smrg    usTemp = (mode->CrtcVDisplay) - 1;
58715fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x02;			/* VDE D[8] */
58815fb4814Smrg    if (usTemp & 0x200) jReg07 |= 0x40;			/* VDE D[9] */
58915fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x02;			/* VDE D[10] */
59015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x12, 0x00, (UCHAR) usTemp);
59115fb4814Smrg    usTemp = (mode->CrtcVBlankStart) - 1;
59215fb4814Smrg    if (usTemp & 0x100) jReg07 |= 0x08;			/* VBS D[8] */
59315fb4814Smrg    if (usTemp & 0x200) jReg09 |= 0x20;			/* VBS D[9] */
59415fb4814Smrg    if (usTemp & 0x400) jRegAE |= 0x04;			/* VBS D[10] */
59515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x15, 0x00, (UCHAR) usTemp);
59615fb4814Smrg    usTemp = (mode->CrtcVBlankEnd) - 1 ;
59715fb4814Smrg    if (usTemp & 0x100) jRegAE |= 0x10;			/* VBE D[8] */
59815fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x16, 0x00, (UCHAR) usTemp);
59915fb4814Smrg
60015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x07, 0x00, (UCHAR) jReg07);
60115fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x09, 0xDF, (UCHAR) jReg09);
60215fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xAE, 0x00, (UCHAR) (jRegAE | 0x80));	/* disable line compare */
60315fb4814Smrg
60415fb4814Smrg    /* lock CRTC */
60515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0x11, 0x7F, 0x80);
60615fb4814Smrg
60715fb4814Smrg}
60815fb4814Smrg
60915fb4814Smrgvoid vSetOffsetReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
61015fb4814Smrg{
61115fb4814Smrg    ASTRecPtr pAST;
61215fb4814Smrg    USHORT usOffset;
61315fb4814Smrg
61415fb4814Smrg    pAST = ASTPTR(pScrn);
61515fb4814Smrg
61615fb4814Smrg    usOffset = 	pAST->VideoModeInfo.ScreenPitch >> 3;		/* Unit: char */
61715fb4814Smrg
61815fb4814Smrg    SetIndexReg(CRTC_PORT,0x13, (UCHAR) (usOffset & 0xFF));
61915fb4814Smrg    SetIndexReg(CRTC_PORT,0xB0, (UCHAR) ((usOffset >> 8) & 0x3F));
62015fb4814Smrg
62115fb4814Smrg}
62215fb4814Smrg
62315fb4814Smrgvoid vSetDCLKReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
62415fb4814Smrg{
62515fb4814Smrg    PVBIOS_ENHTABLE_STRUCT pEnhModePtr;
62615fb4814Smrg    PVBIOS_DCLK_INFO pDCLKPtr;
62715fb4814Smrg    ASTRecPtr pAST;
62815fb4814Smrg
62915fb4814Smrg    pAST = ASTPTR(pScrn);
63015fb4814Smrg
63115fb4814Smrg    pEnhModePtr = pVGAModeInfo->pEnhTableEntry;
63215fb4814Smrg    pDCLKPtr = &DCLKTable[pEnhModePtr->DCLKIndex];
63315fb4814Smrg
63415fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xC0, 0x00,  pDCLKPtr->Param1);
63515fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xC1, 0x00,  pDCLKPtr->Param2);
63615fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xBB, 0xCF,  ((pDCLKPtr->Param3 & 0x03) << 4));
63715fb4814Smrg
63815fb4814Smrg}
63915fb4814Smrg
64015fb4814Smrg
64115fb4814Smrgvoid vSetExtReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
64215fb4814Smrg{
64315fb4814Smrg
64415fb4814Smrg    ASTRecPtr pAST;
64515fb4814Smrg    UCHAR jRegA0, jRegA3, jRegA8;
64615fb4814Smrg
64715fb4814Smrg    pAST = ASTPTR(pScrn);
64815fb4814Smrg
64915fb4814Smrg    jRegA0=jRegA3=jRegA8=0;
65015fb4814Smrg    /* Mode Type Setting */
65115fb4814Smrg    switch (pScrn->bitsPerPixel) {
65215fb4814Smrg    case 8:
65315fb4814Smrg        jRegA0 = 0x70;
65415fb4814Smrg        jRegA3 = 0x01;
65515fb4814Smrg        jRegA8 = 0x00;
65615fb4814Smrg        break;
65715fb4814Smrg    case 15:
65815fb4814Smrg    case 16:
65915fb4814Smrg        jRegA0 = 0x70;
66015fb4814Smrg        jRegA3 = 0x04;
66115fb4814Smrg        jRegA8 = 0x02;
66215fb4814Smrg        break;
66315fb4814Smrg    case 32:
66415fb4814Smrg        jRegA0 = 0x70;
66515fb4814Smrg        jRegA3 = 0x08;
66615fb4814Smrg        jRegA8 = 0x02;
66715fb4814Smrg        break;
66815fb4814Smrg    }
66915fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA0, 0x8F, (UCHAR) jRegA0);
67015fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA3, 0xF0, (UCHAR) jRegA3);
67115fb4814Smrg    SetIndexRegMask(CRTC_PORT,0xA8, 0xFD, (UCHAR) jRegA8);
67215fb4814Smrg
67315fb4814Smrg    /* Set Threshold */
67415fb4814Smrg    SetIndexReg(CRTC_PORT,0xA7, 0x2F);
67515fb4814Smrg    SetIndexReg(CRTC_PORT,0xA6, 0x1F);
67615fb4814Smrg
67715fb4814Smrg}
67815fb4814Smrg
67915fb4814Smrg
68015fb4814SmrgBool bSetDACReg(ScrnInfoPtr pScrn, DisplayModePtr mode, PVBIOS_MODE_INFO pVGAModeInfo)
68115fb4814Smrg{
68215fb4814Smrg    PVBIOS_DAC_INFO pDACPtr;
68315fb4814Smrg    ASTRecPtr pAST;
68415fb4814Smrg    ULONG i, ulDACNumber;
68515fb4814Smrg    UCHAR DACR, DACG, DACB;
68615fb4814Smrg
68715fb4814Smrg    pAST = ASTPTR(pScrn);
68815fb4814Smrg
68915fb4814Smrg    switch (pScrn->bitsPerPixel)
69015fb4814Smrg    {
69115fb4814Smrg    case 8:
69215fb4814Smrg         ulDACNumber = DAC_NUM_VGA;
69315fb4814Smrg         pDACPtr = (PVBIOS_DAC_INFO) &DAC_VGA[0];
69415fb4814Smrg         break;
69515fb4814Smrg    default:
69615fb4814Smrg         return (FALSE);
69715fb4814Smrg    }
69815fb4814Smrg
69915fb4814Smrg    for (i=0; i<ulDACNumber; i++)
70015fb4814Smrg    {
70115fb4814Smrg    	DACR = pDACPtr->DACR;
70215fb4814Smrg    	DACG = pDACPtr->DACG;
70315fb4814Smrg    	DACB = pDACPtr->DACB;
70415fb4814Smrg
70515fb4814Smrg        VGA_LOAD_PALETTE_INDEX (i, DACR, DACG, DACB);
70615fb4814Smrg
70715fb4814Smrg        pDACPtr++;
70815fb4814Smrg    }
70915fb4814Smrg
71015fb4814Smrg    return (TRUE);
71115fb4814Smrg
71215fb4814Smrg}
71315fb4814Smrg
71415fb4814Smrg
715