1 #include <u.h> 2 #include <libc.h> 3 4 #include "vga.h" 5 6 /* 7 * S3 Vision964 GUI Accelerator. 8 * Pretty much the same as the 86C80[15]. 9 * First pass, needs tuning. 10 */ 11 static void 12 snarf(Vga *vga, Ctlr *ctlr) 13 { 14 verbose("%s->snarf\n", ctlr->name); 15 16 (*s3generic.snarf)(vga, ctlr); 17 } 18 19 static void 20 options(Vga *vga, Ctlr *ctlr) 21 { 22 USED(vga); 23 verbose("%s->options\n", ctlr->name); 24 25 ctlr->flag |= Hpclk2x8|Henhanced|Foptions; 26 } 27 28 static void 29 init(Vga *vga, Ctlr *ctlr) 30 { 31 ulong x; 32 33 verbose("%s->init\n", ctlr->name); 34 35 (*s3generic.init)(vga, ctlr); 36 vga->crt[0x3B] = vga->crt[0]-5; 37 38 /* 39 * VL-bus crap. 40 */ 41 if((vga->crt[0x36] & 0x03) == 0x01){ 42 vga->crt[0x40] |= 0x08; 43 vga->crt[0x58] &= ~0x88; 44 } 45 46 /* 47 * Display memory access control. 48 * Calculation of the M-parameter (Crt54) is 49 * memory-system and dot-clock dependent, the 50 * values below are guesses from dumping 51 * registers. 52 */ 53 vga->crt[0x60] = 0xFF; 54 x = vga->mode->x/8; 55 vga->crt[0x61] = 0x80|((x>>8) & 0x07); 56 vga->crt[0x62] = (x & 0xFF); 57 if(vga->mode->x <= 800) 58 vga->crt[0x54] = 0x88; 59 else if(vga->mode->x <= 1024) 60 vga->crt[0x54] = 0xF8; 61 else 62 vga->crt[0x54] = 0x40; 63 64 65 vga->crt[0x67] &= ~0xF0; 66 if(ctlr->flag & Upclk2x8) 67 vga->crt[0x67] |= 0x10; 68 69 /* 70 * Blank adjust. 71 * This may not be correct for all monitors. 72 */ 73 vga->crt[0x6D] = 2; 74 } 75 76 static void 77 load(Vga *vga, Ctlr *ctlr) 78 { 79 ushort advfunc; 80 81 verbose("%s->load\n", ctlr->name); 82 83 (*s3generic.load)(vga, ctlr); 84 vgaxo(Crtx, 0x60, vga->crt[0x60]); 85 vgaxo(Crtx, 0x61, vga->crt[0x61]); 86 vgaxo(Crtx, 0x62, vga->crt[0x62]); 87 vgaxo(Crtx, 0x67, vga->crt[0x67]); 88 vgaxo(Crtx, 0x6D, vga->crt[0x6D]); 89 90 advfunc = 0x0000; 91 if(ctlr->flag & Uenhanced){ 92 if(vga->mode->x == 1024 || vga->mode->x == 800) 93 advfunc = 0x0057; 94 else 95 advfunc = 0x0053; 96 } 97 outportw(0x4AE8, advfunc); 98 } 99 100 static void 101 dump(Vga *vga, Ctlr *ctlr) 102 { 103 (*s3generic.dump)(vga, ctlr); 104 } 105 106 Ctlr vision864 = { 107 "vision864", /* name */ 108 snarf, /* snarf */ 109 options, /* options */ 110 init, /* init */ 111 load, /* load */ 112 dump, /* dump */ 113 }; 114