19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <bio.h>
49a747e4fSDavid du Colombier
59a747e4fSDavid du Colombier #include "pci.h"
69a747e4fSDavid du Colombier #include "vga.h"
79a747e4fSDavid du Colombier
89a747e4fSDavid du Colombier /*
99a747e4fSDavid du Colombier * Intel 81x chipset family.
1023acd784SDavid du Colombier * mem[0]: AGP aperture memory, 64MB for 810-DC100, from 0xF4000000
1123acd784SDavid du Colombier * mem[1]: GC Register mmio space, 512KB for 810-DC100, from 0xFF000000
12c1ba0ed0SDavid du Colombier * For the memory of David Hogan, died April 9, 2003, who wrote this driver
13c1ba0ed0SDavid du Colombier * first for LCD.
1423acd784SDavid du Colombier * August 28, 2003 Kenji Okamoto
159a747e4fSDavid du Colombier */
169a747e4fSDavid du Colombier
179a747e4fSDavid du Colombier typedef struct {
189a747e4fSDavid du Colombier Pcidev* pci;
1974f16c81SDavid du Colombier uchar* mmio;
209a747e4fSDavid du Colombier ulong clk[6];
219a747e4fSDavid du Colombier ulong lcd[9];
229a747e4fSDavid du Colombier ulong pixconf;
239a747e4fSDavid du Colombier } I81x;
249a747e4fSDavid du Colombier
259a747e4fSDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)269a747e4fSDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
279a747e4fSDavid du Colombier {
289a747e4fSDavid du Colombier int f, i;
2974f16c81SDavid du Colombier uchar *mmio;
309a747e4fSDavid du Colombier ulong *rp;
319a747e4fSDavid du Colombier Pcidev *p;
329a747e4fSDavid du Colombier I81x *i81x;
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier if(vga->private == nil){
359a747e4fSDavid du Colombier vga->private = alloc(sizeof(I81x));
369a747e4fSDavid du Colombier p = nil;
379a747e4fSDavid du Colombier while((p = pcimatch(p, 0x8086, 0)) != nil) {
389a747e4fSDavid du Colombier switch(p->did) {
399a747e4fSDavid du Colombier default:
409a747e4fSDavid du Colombier continue;
4123acd784SDavid du Colombier case 0x7121: /* Vanilla 82810 */
4223acd784SDavid du Colombier case 0x7123: /* 810-DC100, DELL OptiPlex GX100 */
4323acd784SDavid du Colombier case 0x7125: /* 82810E */
4423acd784SDavid du Colombier case 0x1102: /* 82815 FSB limited to 100MHz */
4523acd784SDavid du Colombier case 0x1112: /* 82815 no AGP */
4623acd784SDavid du Colombier case 0x1132: /* 82815 fully featured Solano */
4723acd784SDavid du Colombier case 0x3577: /* IBM R31 uses intel 830M chipset */
4823acd784SDavid du Colombier vga->f[1] = 230000000; /* MAX speed of internal DAC (Hz)*/
499a747e4fSDavid du Colombier break;
509a747e4fSDavid du Colombier }
519a747e4fSDavid du Colombier break;
529a747e4fSDavid du Colombier }
539a747e4fSDavid du Colombier if(p == nil)
549a747e4fSDavid du Colombier error("%s: Intel 81x graphics function not found\n", ctlr->name);
559a747e4fSDavid du Colombier
569a747e4fSDavid du Colombier if((f = open("#v/vgactl", OWRITE)) < 0)
579a747e4fSDavid du Colombier error("%s: can't open vgactl\n", ctlr->name);
589a747e4fSDavid du Colombier if(write(f, "type i81x", 9) != 9)
599a747e4fSDavid du Colombier error("%s: can't set type\n", ctlr->name);
609a747e4fSDavid du Colombier close(f);
619a747e4fSDavid du Colombier
6274f16c81SDavid du Colombier mmio = segattach(0, "i81xmmio", 0, p->mem[1].size);
6374f16c81SDavid du Colombier if(mmio == (void*)-1)
649a747e4fSDavid du Colombier error("%s: can't attach mmio segment\n", ctlr->name);
659a747e4fSDavid du Colombier
669a747e4fSDavid du Colombier i81x = vga->private;
679a747e4fSDavid du Colombier i81x->pci = p;
6874f16c81SDavid du Colombier i81x->mmio = mmio;
699a747e4fSDavid du Colombier }
709a747e4fSDavid du Colombier i81x = vga->private;
719a747e4fSDavid du Colombier
7223acd784SDavid du Colombier /* must give aperture memory size for frame buffer memory
7323acd784SDavid du Colombier such as 64*1024*1024 */
749a747e4fSDavid du Colombier vga->vma = vga->vmz = i81x->pci->mem[0].size;
7523acd784SDavid du Colombier // vga->vmz = 8*1024*1024;
7623acd784SDavid du Colombier vga->apz = i81x->pci->mem[0].size;
779a747e4fSDavid du Colombier ctlr->flag |= Hlinear;
789a747e4fSDavid du Colombier
7923acd784SDavid du Colombier vga->graphics[0x10] = vgaxi(Grx, 0x10);
8023acd784SDavid du Colombier vga->attribute[0x11] = vgaxi(Attrx, 0x11); /* overscan color */
8123acd784SDavid du Colombier for(i=0; i < 0x19; i++)
829a747e4fSDavid du Colombier vga->crt[i] = vgaxi(Crtx, i);
8323acd784SDavid du Colombier for(i=0x30; i <= 0x82; i++) /* set CRT Controller Register (CR) */
8423acd784SDavid du Colombier vga->crt[i] = vgaxi(Crtx, i);
8523acd784SDavid du Colombier /* 0x06000: Clock Control Register base address (3 VCO frequency control) */
869a747e4fSDavid du Colombier rp = (ulong*)(i81x->mmio+0x06000);
879a747e4fSDavid du Colombier for(i = 0; i < nelem(i81x->clk); i++)
889a747e4fSDavid du Colombier i81x->clk[i] = *rp++;
8923acd784SDavid du Colombier
9023acd784SDavid du Colombier /* i830 CRTC registers (A) */
919a747e4fSDavid du Colombier rp = (ulong*)(i81x->mmio+0x60000);
929a747e4fSDavid du Colombier for(i = 0; i < nelem(i81x->lcd); i++)
939a747e4fSDavid du Colombier i81x->lcd[i] = *rp++;
9423acd784SDavid du Colombier rp = (ulong*)(i81x->mmio+0x70008); /* Pixel Pipeline Control register A */
959a747e4fSDavid du Colombier i81x->pixconf = *rp;
969a747e4fSDavid du Colombier
979a747e4fSDavid du Colombier ctlr->flag |= Fsnarf;
989a747e4fSDavid du Colombier }
999a747e4fSDavid du Colombier
1009a747e4fSDavid du Colombier static void
options(Vga *,Ctlr * ctlr)1019a747e4fSDavid du Colombier options(Vga*, Ctlr* ctlr)
1029a747e4fSDavid du Colombier {
1039a747e4fSDavid du Colombier ctlr->flag |= Hlinear|Foptions;
1049a747e4fSDavid du Colombier }
1059a747e4fSDavid du Colombier
1069a747e4fSDavid du Colombier static void
i81xdclk(I81x * i81x,Vga * vga)10723acd784SDavid du Colombier i81xdclk(I81x *i81x, Vga *vga) /* freq = MHz */
10823acd784SDavid du Colombier {
10923acd784SDavid du Colombier int m, n, post, mtp, ntp;
110a21ce2d6SDavid du Colombier double md, freq, error;
11123acd784SDavid du Colombier
11223acd784SDavid du Colombier freq = vga->mode->deffrequency/1000000.0;
113a00ba14aSDavid du Colombier if (freq == 0)
114*14cc0f53SDavid du Colombier sysfatal("i81xdclk: deffrequency %d becomes freq 0.0",
115a00ba14aSDavid du Colombier vga->mode->deffrequency);
11623acd784SDavid du Colombier post = log(600.0/freq)/log(2.0);
11723acd784SDavid du Colombier
11823acd784SDavid du Colombier for(ntp=3;;ntp++) {
11923acd784SDavid du Colombier md = freq*(1<<post)/(24.0/(double)ntp)/4.0;
12023acd784SDavid du Colombier mtp = (int)(md+0.5);
12123acd784SDavid du Colombier if(mtp<3) mtp=3;
12223acd784SDavid du Colombier error = 1.0-freq/(md/(ntp*(1<<post))*4*24.0);
12323acd784SDavid du Colombier if((fabs(error) < 0.001) || ((ntp > 30) && (fabs(error) < 0.005)))
12423acd784SDavid du Colombier break;
12523acd784SDavid du Colombier }
12623acd784SDavid du Colombier m = vga->m[1] = mtp-2;
12723acd784SDavid du Colombier n = vga->n[1] = ntp-2;
12823acd784SDavid du Colombier vga->r[1] = post;
12923acd784SDavid du Colombier i81x->clk[2] = ((n & 0x3FF)<<16) | (m & 0x3FF);
13023acd784SDavid du Colombier i81x->clk[4] = (i81x->clk[4] & ~0x700000) | ((post & 0x07)<<20);
13123acd784SDavid du Colombier vga->mode->frequency = (m+2)/((n+2)*(1<<post))*4*24*1000000;
13223acd784SDavid du Colombier }
13323acd784SDavid du Colombier
13423acd784SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)1359a747e4fSDavid du Colombier init(Vga* vga, Ctlr* ctlr)
1369a747e4fSDavid du Colombier {
1379a747e4fSDavid du Colombier I81x *i81x;
13823acd784SDavid du Colombier int vt, vde, vrs, vre;
139c1ba0ed0SDavid du Colombier ulong *rp;
1409a747e4fSDavid du Colombier
1419a747e4fSDavid du Colombier i81x = vga->private;
1429a747e4fSDavid du Colombier
14323acd784SDavid du Colombier /* <<TODO>>
14423acd784SDavid du Colombier i81x->clk[3]: LCD_CLKD: 0x0600c~0x0600f, default=00030013h
14523acd784SDavid du Colombier (VCO N-divisor=03h, M-divisor=13h)
14623acd784SDavid du Colombier i81x->clk[4]: DCLK_0DS: 0x06010~0x06013, Post value, default=40404040h means
14723acd784SDavid du Colombier Post Divisor=16, VCO Loop divisor = 4xM for all clocks.
14823acd784SDavid du Colombier Display&LCD Clock Devisor Select Reg = 0x40404040 ==> (LCD)(Clock2)(Clock1)(Clock0)
14923acd784SDavid du Colombier */
15023acd784SDavid du Colombier i81x->clk[0] = 0x00030013;
15123acd784SDavid du Colombier i81x->clk[1] = 0x00100053;
152c1ba0ed0SDavid du Colombier rp = (ulong*)i81x->mmio+0x6010;
153c1ba0ed0SDavid du Colombier i81x->clk[4] = *rp;
154c1ba0ed0SDavid du Colombier i81x->clk[4] |= 0x4040;
15523acd784SDavid du Colombier vga->misc = vgai(MiscR);
15623acd784SDavid du Colombier switch(vga->virtx) {
15723acd784SDavid du Colombier case 640: /* 640x480 DCLK_0D 25.175MHz dot clock */
15823acd784SDavid du Colombier vga->misc &= ~0x0A;
15923acd784SDavid du Colombier break;
16023acd784SDavid du Colombier case 720: /* 720x480 DCLK_1D 28.322MHz dot clock */
16123acd784SDavid du Colombier vga->misc = (vga->misc & ~0x08) | (1<<2);
16223acd784SDavid du Colombier break;
16323acd784SDavid du Colombier case 800:
16423acd784SDavid du Colombier case 1024:
16523acd784SDavid du Colombier case 1152:
16623acd784SDavid du Colombier case 1280:
16723acd784SDavid du Colombier case 1376:
16823acd784SDavid du Colombier vga->misc = vga->misc | (2<<2) & ~0x02; /* prohibit to access frame buffer */
16923acd784SDavid du Colombier i81xdclk(i81x, vga);
17023acd784SDavid du Colombier break;
17123acd784SDavid du Colombier default: /* for other higher resolution DCLK_2D */
17223acd784SDavid du Colombier error("%s: Only 800, 1024, 1152, 1280, 1376 resolutions are supported\n", ctlr->name);
17323acd784SDavid du Colombier }
17423acd784SDavid du Colombier
17523acd784SDavid du Colombier /* <<TODO>>
17623acd784SDavid du Colombier i830 LCD Controller, at i81x->mmio+0x60000
17723acd784SDavid du Colombier i81x->lcd[0]: Horizontal Total Reg. 0x60000
17823acd784SDavid du Colombier i81x->lcd[1]: Horizontal Blanking Reg. 0x60004
17923acd784SDavid du Colombier i81x->lcd[2]: Horizontal Sync Reg. 0x60008
18023acd784SDavid du Colombier i81x->lcd[3]: Vertical Total Reg. 0x6000c
18123acd784SDavid du Colombier i81x->lcd[4]: Vertical Blanking Reg. 0x60010
18223acd784SDavid du Colombier i81x->lcd[5]: Vertical Sync Reg. 0x60014
18323acd784SDavid du Colombier i81x->lcd[6]: Pixel Pipeline A Sequencer Register Control(SRC,0~7) 0x6001c
18423acd784SDavid du Colombier i81x->lcd[7]: BCLRPAT_A 0x60020
18523acd784SDavid du Colombier i81x->lcd[8]: 0
18623acd784SDavid du Colombier */
1879a747e4fSDavid du Colombier /*
18823acd784SDavid du Colombier * Pixel pipeline control register 0x70008:
18923acd784SDavid du Colombier * 16/24bp bypasses palette,
19023acd784SDavid du Colombier * hw cursor enabled(1<<12), hi-res mode(1<<0), depth(16-19 bit)
19123acd784SDavid du Colombier * 8bit DAC enable (1<<15), don't wrap to 256kM memory of VGA(1<<1).
19223acd784SDavid du Colombier * enable extended palette addressing (1<<8)
1939a747e4fSDavid du Colombier */
1949a747e4fSDavid du Colombier i81x->pixconf = (1<<12)|(1<<0);
19523acd784SDavid du Colombier i81x->pixconf &= 0xFFFFFBFF; /* disable overscan color */
19623acd784SDavid du Colombier switch(vga->mode->z) { /* vga->mode->z: color depth */
1979a747e4fSDavid du Colombier case 8:
1989a747e4fSDavid du Colombier i81x->pixconf |= (2<<16);
1999a747e4fSDavid du Colombier break;
20023acd784SDavid du Colombier case 16: /* (5:6:5 bit) */
2019a747e4fSDavid du Colombier i81x->pixconf |= (5<<16);
2029a747e4fSDavid du Colombier break;
2039a747e4fSDavid du Colombier case 24:
2049a747e4fSDavid du Colombier i81x->pixconf |= (6<<16);
2059a747e4fSDavid du Colombier break;
20623acd784SDavid du Colombier case 32: /* not supported */
2079a747e4fSDavid du Colombier i81x->pixconf |= (7<<16);
2089a747e4fSDavid du Colombier break;
2099a747e4fSDavid du Colombier default:
2109a747e4fSDavid du Colombier error("%s: depth %d not supported\n", ctlr->name, vga->mode->z);
2119a747e4fSDavid du Colombier }
2129a747e4fSDavid du Colombier
21323acd784SDavid du Colombier /* DON'T CARE of Sequencer Reg. */
21423acd784SDavid du Colombier /* DON'T CARE of Attribute registers other than this */
21523acd784SDavid du Colombier vga->attribute[0x11] = 0; /* over scancolor = black */
21623acd784SDavid du Colombier /* DON't CARE of graphics[1], [2], [3], [4], [5], [6], [7] and [8] value */
2179a747e4fSDavid du Colombier if(vga->linear && (ctlr->flag & Hlinear)) {
21823acd784SDavid du Colombier /* enable linear mapping, no VGA memory and no page mapping */
21923acd784SDavid du Colombier vga->graphics[0x10] = 0x0A;
2209a747e4fSDavid du Colombier ctlr->flag |= Ulinear;
2219a747e4fSDavid du Colombier }
2229a747e4fSDavid du Colombier
22323acd784SDavid du Colombier vt = vga->mode->vt;
22423acd784SDavid du Colombier vde = vga->virty;
22523acd784SDavid du Colombier vrs = vga->mode->vrs;
22623acd784SDavid du Colombier vre = vga->mode->vre+6; /* shift 7 pixel up */
22723acd784SDavid du Colombier
22823acd784SDavid du Colombier if(vga->mode->interlace == 'v') {
22923acd784SDavid du Colombier vt /= 2;
23023acd784SDavid du Colombier vde /= 2;
23123acd784SDavid du Colombier vrs /= 2;
23223acd784SDavid du Colombier vre /= 2;
23323acd784SDavid du Colombier }
23423acd784SDavid du Colombier /* Reset Row scan */
23523acd784SDavid du Colombier vga->crt[8] = 0;
23623acd784SDavid du Colombier /* Line Compare, bit 6 of crt[9], bit 4 of crt[7] and crt[0x18], should be
23723acd784SDavid du Colombier * vga->crt[9] = vgaxi(Crtx, 9) | ((vde>>9 & 1)<<6) & 0x7F;
23823acd784SDavid du Colombier * vga->crt[7] = vgaxi(Crtx, 7) | ((vde>>8 & 1)<<4);
23923acd784SDavid du Colombier * vga->crt[0x18] = vde & 0xFF;
24023acd784SDavid du Colombier * However, above values don't work!! I don't know why. K.Okamoto
24123acd784SDavid du Colombier */
24223acd784SDavid du Colombier vga->crt[9] = 0; /* I don't know why ? */
24323acd784SDavid du Colombier vga->crt[7] = 0; /* I don't know why ? */
24423acd784SDavid du Colombier vga->crt[0x18] = 0; /* I don't know why ? */
24523acd784SDavid du Colombier /* 32 bits Start Address of frame buffer (AGP aperture memory)
24623acd784SDavid du Colombier vga->crt[0x42] = MSB 8 bits of Start Address Register, extended high start address Reg.
24723acd784SDavid du Colombier vga->crt[0x40] = higer 6 bits in 0~5 bits, and the MSB = 1, extebded start address Reg.
24823acd784SDavid du Colombier vga->crt[0x0C] = Start Address High Register
24923acd784SDavid du Colombier vga->crt[0x0D] = Start Address Low Register
25023acd784SDavid du Colombier LSB 2 bits of Start Address are always 0
25123acd784SDavid du Colombier */
25223acd784SDavid du Colombier vga->crt[0x42] = vga->pci->mem[0].bar>>24 & 0xFF;
25323acd784SDavid du Colombier vga->crt[0x40] = vga->pci->mem[0].bar>>18 & 0x3F | 0x80;
25423acd784SDavid du Colombier /* Start Address High */
25523acd784SDavid du Colombier vga->crt[0x0C] = vga->pci->mem[0].bar>>10 & 0xFF;
25623acd784SDavid du Colombier /* Start Address Low */
25723acd784SDavid du Colombier vga->crt[0x0D] = (vga->pci->mem[0].bar >>2 + 1)& 0xFF;
25823acd784SDavid du Colombier /* Underline Location, Memory Mode, DON'T CARE THIS VALUE */
25923acd784SDavid du Colombier vga->crt[0x14] = 0x0;
26023acd784SDavid du Colombier /* CRT Mode Control */
26123acd784SDavid du Colombier vga->crt[0x17] = 0x80; /* CRT normal mode */
26223acd784SDavid du Colombier /* Frame buffer memory offset (memory amount for a line) */
26323acd784SDavid du Colombier /* vga->crt[0x13] = lower 8 bits of Offset Register
26423acd784SDavid du Colombier vga->crt[0x41] = MSB 4 bits, those value should be
26523acd784SDavid du Colombier vga->crt[0x13] = (vga->virtx*(vga->mode->z>>3)/4) & 0xFF;
26623acd784SDavid du Colombier vga->crt[0x41] = (vga->virtx*(vga->mode->z>>3)/4)>>8 & 0x0F;
26723acd784SDavid du Colombier However, those doesn't work properly K.Okamoto
26823acd784SDavid du Colombier */
26923acd784SDavid du Colombier vga->crt[0x41] = (vga->crt[0x13]>>8) & 0x0F; //dhog
27023acd784SDavid du Colombier
27123acd784SDavid du Colombier /* Horizontal Total */
27223acd784SDavid du Colombier vga->crt[0] = ((vga->mode->ht>>3)-6) & 0xFF;
27323acd784SDavid du Colombier /* Extended Horizontal Total Time Reg (ht) */
27423acd784SDavid du Colombier vga->crt[0x35] = vga->mode->ht>>12 & 0x01;
27523acd784SDavid du Colombier // vga->crt[0x35] = (((vga->mode->ht>>1)-5)>>8) & 0x01; //dhog
27623acd784SDavid du Colombier /* Horizontal Display Enable End == horizontal width */
27723acd784SDavid du Colombier vga->crt[1] = (vga->virtx-1)>>3 & 0xFF;
27823acd784SDavid du Colombier /* Horizontal Blanking Start */
27923acd784SDavid du Colombier vga->crt[2] = ((vga->mode->shb>>3)-1) & 0xFF;
28023acd784SDavid du Colombier /* Horizontal blanking End crt[39](0),crt[5](7),crt[3](4:0) */
28123acd784SDavid du Colombier vga->crt[3] = (vga->mode->shb - vga->virtx)>>3 & 0x1F;
28223acd784SDavid du Colombier vga->crt[5] = ((vga->mode->shb - vga->virtx)>>3 & 0x20) <<2;
28323acd784SDavid du Colombier vga->crt[0x39] = ((vga->mode->shb - vga->virtx)>>3 & 0x40) >>6;
28423acd784SDavid du Colombier // vga->crt[0x39] = (vga->mode->ehb>>9) & 0x01; //dhog
28523acd784SDavid du Colombier /* Horizontal Sync Start */
28623acd784SDavid du Colombier vga->crt[4] = vga->mode->shb>>3 & 0xFF;
28723acd784SDavid du Colombier /* Horizontal Sync End */
28823acd784SDavid du Colombier vga->crt[5] |= vga->mode->ehb>>3 & 0x1F;
28923acd784SDavid du Colombier /* Extended Vertical Total (vt) */
29023acd784SDavid du Colombier vga->crt[6] = (vt - 2) & 0xFF;
29123acd784SDavid du Colombier vga->crt[0x30] = (vt - 2)>>8 & 0x0F;
29223acd784SDavid du Colombier /* Vertical Sync Period */
29323acd784SDavid du Colombier vga->crt[0x11] = (vre - vrs - 2) & 0x0F;
29423acd784SDavid du Colombier /* Vertical Blanking End */
29523acd784SDavid du Colombier vga->crt[0x16] = (vre - vrs) & 0xFF;
29623acd784SDavid du Colombier /* Extended Vertical Display End (y) */
29723acd784SDavid du Colombier vga->crt[0x12] = (vde-1) & 0xFF;
29823acd784SDavid du Colombier vga->crt[0x31] = (vde-1)>>8 & 0x0f;
29923acd784SDavid du Colombier /* Extended Vertical Sync Start (vrs) */
30023acd784SDavid du Colombier vga->crt[0x10] = (vrs-1) & 0xFF;
30123acd784SDavid du Colombier vga->crt[0x32] = (vrs-1)>>8 & 0x0F;
30223acd784SDavid du Colombier /* Extended Vertical Blanking Start (vrs) */
30323acd784SDavid du Colombier vga->crt[0x15] = vrs & 0xFF;
30423acd784SDavid du Colombier vga->crt[0x33] = vrs>>8 & 0x0F;
30523acd784SDavid du Colombier
30623acd784SDavid du Colombier if(vga->mode->interlace == 'v')
30723acd784SDavid du Colombier vga->crt[0x70] = vrs | 0x80;
30823acd784SDavid du Colombier else
30923acd784SDavid du Colombier vga->crt[0x70] = 0;
31023acd784SDavid du Colombier vga->crt[0x80] = 1;
3119a747e4fSDavid du Colombier
3129a747e4fSDavid du Colombier ctlr->flag |= Finit;
3139a747e4fSDavid du Colombier }
3149a747e4fSDavid du Colombier
3159a747e4fSDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)3169a747e4fSDavid du Colombier load(Vga* vga, Ctlr* ctlr)
3179a747e4fSDavid du Colombier {
3189a747e4fSDavid du Colombier int i;
3199a747e4fSDavid du Colombier ulong *rp;
3209a747e4fSDavid du Colombier I81x *i81x;
32143f160e5SDavid du Colombier char *p;
3229a747e4fSDavid du Colombier
3239a747e4fSDavid du Colombier i81x = vga->private;
3249a747e4fSDavid du Colombier
32523acd784SDavid du Colombier vgaxo(Attrx, 0x11, vga->attribute[0x11]);
32623acd784SDavid du Colombier /* set the screen graphic mode */
32723acd784SDavid du Colombier vgaxo(Crtx, 0x80, vga->crt[0x80]);
3289a747e4fSDavid du Colombier vgaxo(Grx, 0x10, vga->graphics[0x10]);
32923acd784SDavid du Colombier vgao(MiscW, vga->misc);
33023acd784SDavid du Colombier for(i=0; i <= 0x18; i++)
33123acd784SDavid du Colombier vgaxo(Crtx, i, vga->crt[i]);
3329a747e4fSDavid du Colombier for(i=0x30; i <= 0x82; i++)
3339a747e4fSDavid du Colombier vgaxo(Crtx, i, vga->crt[i]);
33423acd784SDavid du Colombier vga->crt[0x40] |= 0x80; /* set CR40, then set the MSB bit of it */
33523acd784SDavid du Colombier vgaxo(Crtx, 0x40, vga->crt[0x40]);
33623acd784SDavid du Colombier /* 0x06000 = offset of Vertical Clock Devisor VGA0 */
3379a747e4fSDavid du Colombier rp = (ulong*)(i81x->mmio+0x06000);
3389a747e4fSDavid du Colombier for(i=0; i < nelem(i81x->clk); i++)
3399a747e4fSDavid du Colombier *rp++ = i81x->clk[i];
3409a747e4fSDavid du Colombier rp = (ulong*)(i81x->mmio+0x60000);
3419a747e4fSDavid du Colombier for(i = 0; i < nelem(i81x->lcd); i++)
3429a747e4fSDavid du Colombier *rp++ = i81x->lcd[i];
34323acd784SDavid du Colombier /* set cursor, graphic mode */
3449a747e4fSDavid du Colombier rp = (ulong*)(i81x->mmio+0x70008);
34543f160e5SDavid du Colombier *rp = i81x->pixconf | (1<<8);
34643f160e5SDavid du Colombier
34743f160e5SDavid du Colombier p = (char*)(i81x->mmio+Pixmask); /* DACMASK */
34843f160e5SDavid du Colombier *p = 0xff;
34943f160e5SDavid du Colombier p = (char*)(i81x->mmio+PaddrW); /* DACWX */
35043f160e5SDavid du Colombier *p = 0x04;
35143f160e5SDavid du Colombier p = (char*)(i81x->mmio+Pdata); /* DACDATA */
35243f160e5SDavid du Colombier *p = 0xff;
35343f160e5SDavid du Colombier *p = 0xff;
35443f160e5SDavid du Colombier *p = 0xff;
35543f160e5SDavid du Colombier *p = 0x00;
35643f160e5SDavid du Colombier *p = 0x00;
35743f160e5SDavid du Colombier *p = 0x00;
3589a747e4fSDavid du Colombier *rp = i81x->pixconf;
3599a747e4fSDavid du Colombier
3609a747e4fSDavid du Colombier ctlr->flag |= Fload;
3619a747e4fSDavid du Colombier }
3629a747e4fSDavid du Colombier
3639a747e4fSDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)3649a747e4fSDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
3659a747e4fSDavid du Colombier {
3669a747e4fSDavid du Colombier int i;
3679a747e4fSDavid du Colombier Pcidev *p;
3689a747e4fSDavid du Colombier I81x *i81x;
3699a747e4fSDavid du Colombier char *name;
3709a747e4fSDavid du Colombier
3719a747e4fSDavid du Colombier name = ctlr->name;
3729a747e4fSDavid du Colombier i81x = vga->private;
3739a747e4fSDavid du Colombier
3749a747e4fSDavid du Colombier printitem(name, "Crt30");
3759a747e4fSDavid du Colombier for(i = 0x30; i <= 0x39; i++)
3769a747e4fSDavid du Colombier printreg(vga->crt[i]);
3779a747e4fSDavid du Colombier
3789a747e4fSDavid du Colombier printitem(name, "Crt40");
3799a747e4fSDavid du Colombier for(i = 0x40; i <= 0x42; i++)
3809a747e4fSDavid du Colombier printreg(vga->crt[i]);
3819a747e4fSDavid du Colombier
3829a747e4fSDavid du Colombier printitem(name, "Crt70");
3839a747e4fSDavid du Colombier for(i = 0x70; i <= 0x79; i++)
3849a747e4fSDavid du Colombier printreg(vga->crt[i]);
3859a747e4fSDavid du Colombier
3869a747e4fSDavid du Colombier printitem(name, "Crt80");
3879a747e4fSDavid du Colombier for(i = 0x80; i <= 0x82; i++)
3889a747e4fSDavid du Colombier printreg(vga->crt[i]);
3899a747e4fSDavid du Colombier
3909a747e4fSDavid du Colombier printitem(name, "Graphics10");
3919a747e4fSDavid du Colombier for(i = 0x10; i <= 0x1f; i++)
3929a747e4fSDavid du Colombier printreg(vga->graphics[i]);
3939a747e4fSDavid du Colombier
3949a747e4fSDavid du Colombier printitem(name, "clk");
3959a747e4fSDavid du Colombier for(i = 0; i < nelem(i81x->clk); i++)
3969a747e4fSDavid du Colombier printreg(i81x->clk[i]);
3979a747e4fSDavid du Colombier
3989a747e4fSDavid du Colombier printitem(name, "lcd");
3999a747e4fSDavid du Colombier for(i = 0; i < nelem(i81x->lcd); i++)
4009a747e4fSDavid du Colombier printreg(i81x->lcd[i]);
4019a747e4fSDavid du Colombier
4029a747e4fSDavid du Colombier printitem(name, "pixconf");
4039a747e4fSDavid du Colombier printreg(i81x->pixconf);
4049a747e4fSDavid du Colombier
4059a747e4fSDavid du Colombier p = i81x->pci;
4069a747e4fSDavid du Colombier printitem(name, "mem[0]");
4079a747e4fSDavid du Colombier Bprint(&stdout, "base %lux size %d\n", p->mem[0].bar & ~0x0F, p->mem[0].size);
4089a747e4fSDavid du Colombier
4099a747e4fSDavid du Colombier printitem(name, "mem[1]");
4109a747e4fSDavid du Colombier Bprint(&stdout, "base %lux size %d\n", p->mem[1].bar & ~0x0F, p->mem[1].size);
4119a747e4fSDavid du Colombier
4129a747e4fSDavid du Colombier }
4139a747e4fSDavid du Colombier
4149a747e4fSDavid du Colombier Ctlr i81x = {
4159a747e4fSDavid du Colombier "i81x", /* name */
4169a747e4fSDavid du Colombier snarf, /* snarf */
4179a747e4fSDavid du Colombier options, /* options */
4189a747e4fSDavid du Colombier init, /* init */
4199a747e4fSDavid du Colombier load, /* load */
4209a747e4fSDavid du Colombier dump, /* dump */
4219a747e4fSDavid du Colombier };
4229a747e4fSDavid du Colombier
4239a747e4fSDavid du Colombier Ctlr i81xhwgc = {
4249a747e4fSDavid du Colombier "i81xhwgc", /* name */
4259a747e4fSDavid du Colombier 0, /* snarf */
4269a747e4fSDavid du Colombier 0, /* options */
4279a747e4fSDavid du Colombier 0, /* init */
4289a747e4fSDavid du Colombier 0, /* load */
4299a747e4fSDavid du Colombier 0, /* dump */
4309a747e4fSDavid du Colombier };
431