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