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