2 #include "../port/lib.h"
7 #include "../port/pci.h"
8 #include "../port/error.h"
18 DC_UNLOCKVALUE = 0x4758,
21 DC_CURS_ST_OFFSET = 6,
29 geodeenable(VGAscr* scr)
38 if((p->mem[1].bar | p->mem[2].bar | p->mem[3].bar) & 1)
40 scr->mmio = vmap(p->mem[2].bar&~0x0F, p->mem[2].size);
43 addvgaseg("geodegp", p->mem[1].bar&~0x0F, p->mem[1].size);
44 addvgaseg("geodemmio", p->mem[2].bar&~0x0F, p->mem[2].size);
45 addvgaseg("geodevid", p->mem[3].bar&~0x0F, p->mem[3].size);
48 addvgaseg("geodescreen", scr->paddr, scr->apsize);
49 scr->storage = 0x800000;
53 geodelinear(VGAscr*, int, int)
58 geodecurload(VGAscr* scr, Cursor* curs)
60 uvlong *p, and1, xor1, and2, xor2;
64 if(!scr->mmio) return;
65 p = (uvlong*)((uchar*)scr->vaddr + scr->storage);
69 and1 = 0xFF ^ (*s ^ *c++);
72 and2 = 0xFF ^ (*s ^ *c++);
75 *p++ = (and1 << 56) | (and2 << 48) | 0xFFFFFFFFFFFFLL;
76 *p++ = (xor1 << 56) | (xor2 << 48);
82 scr->offset = curs->offset;
86 geodecurmove(VGAscr* scr, Point p) {
87 if(!scr->mmio) return 1;
88 ((ulong*)scr->mmio)[DC_UNLOCK] = DC_UNLOCKVALUE;
89 ((ulong*)scr->mmio)[DC_CURSOR_X] = p.x + scr->offset.x;
90 ((ulong*)scr->mmio)[DC_CURSOR_Y] = p.y + scr->offset.y;
95 geodecurenable(VGAscr* scr)
98 if(!scr->mmio) return;
99 geodecurload(scr, &cursor);
100 geodecurmove(scr, ZP);
101 ((ulong*)scr->mmio)[DC_UNLOCK] = DC_UNLOCKVALUE;
102 ((ulong*)scr->mmio)[DC_CURS_ST_OFFSET] = scr->storage;
103 ((ulong*)scr->mmio)[DC_GENERAL_CFG] |= CURE;
104 /* set cursor colours */
105 ((ulong*)scr->mmio)[DC_PAL_ADDRESS] = 0x100;
106 ((ulong*)scr->mmio)[DC_PAL_DATA] = -1;
107 ((ulong*)scr->mmio)[DC_PAL_DATA] = 0;
111 geodecurdisable(VGAscr* scr)
113 if(!scr->mmio) return;
114 ((ulong*)scr->mmio)[DC_UNLOCK] = DC_UNLOCKVALUE;
115 ((ulong*)scr->mmio)[DC_GENERAL_CFG] &= ~CURE;
118 VGAdev vgageodedev = {
121 .linear = geodelinear,
125 VGAcur vgageodecur = {