summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/vga/vision968.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/vga/vision968.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/vga/vision968.c')
-rwxr-xr-xsys/src/cmd/aux/vga/vision968.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/vga/vision968.c b/sys/src/cmd/aux/vga/vision968.c
new file mode 100755
index 000000000..7583255f4
--- /dev/null
+++ b/sys/src/cmd/aux/vga/vision968.c
@@ -0,0 +1,181 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#include "pci.h"
+#include "vga.h"
+
+/*
+ * S3 Vision968 GUI Accelerator.
+ */
+static void
+snarf(Vga* vga, Ctlr* ctlr)
+{
+ s3generic.snarf(vga, ctlr);
+
+ vga->sequencer[0x09] = vgaxi(Seqx, 0x09);
+ vga->sequencer[0x0A] = vgaxi(Seqx, 0x0A);
+
+ vga->crt[0x22] = vgaxi(Crtx, 0x22);
+ vga->crt[0x24] = vgaxi(Crtx, 0x24);
+ vga->crt[0x26] = vgaxi(Crtx, 0x26);
+ vga->crt[0x2D] = vgaxi(Crtx, 0x2D);
+ vga->crt[0x2E] = vgaxi(Crtx, 0x2E);
+ vga->crt[0x2F] = vgaxi(Crtx, 0x2F);
+}
+
+static void
+options(Vga*, Ctlr* ctlr)
+{
+ ctlr->flag |= Hlinear|Henhanced|Foptions;
+}
+
+static void
+init(Vga* vga, Ctlr* ctlr)
+{
+ Mode *mode;
+ ulong x;
+ int sid, dbl, bpp, divide;
+ char *val;
+
+ if(vga->mode->z > 8)
+ error("depth %d not supported\n", vga->mode->z);
+
+ mode = vga->mode;
+ if(vga->ramdac && (vga->ramdac->flag & Uclk2)){
+ resyncinit(vga, ctlr, Uenhanced, 0);
+ vga->crt[0x00] = ((mode->ht/2)>>3)-5;
+ vga->crt[0x01] = ((mode->x/2)>>3)-1;
+ vga->crt[0x02] = ((mode->shb/2)>>3)-1;
+
+ x = (mode->ehb/2)>>3;
+ vga->crt[0x03] = 0x80|(x & 0x1F);
+ vga->crt[0x04] = (mode->shs/2)>>3;
+ vga->crt[0x05] = ((mode->ehs/2)>>3) & 0x1F;
+ if(x & 0x20)
+ vga->crt[0x05] |= 0x80;
+ vga->crt[0x13] = mode->x/8;
+ }
+ else if(mode->z == 8)
+ resyncinit(vga, ctlr, Uenhanced, 0);
+ s3generic.init(vga, ctlr);
+ /*
+ if((ctlr->flag & Uenhanced) == 0)
+ vga->crt[0x33] &= ~0x20;
+ */
+ vga->crt[0x3B] = (vga->crt[0]+vga->crt[4]+1)/2;
+ if(vga->crt[0x3B] & 0x100)
+ vga->crt[0x5D] |= 0x40;
+ vga->crt[0x55] = 0x00;
+
+ vga->crt[0x40] &= ~0x10;
+ vga->crt[0x53] &= ~0x20;
+ vga->crt[0x58] &= ~0x48;
+ vga->crt[0x65] = 0x00;
+ vga->crt[0x66] &= ~0x07;
+ vga->crt[0x67] = 0x00;
+ vga->crt[0x6D] = 0x00;
+ if(ctlr->flag & Uenhanced){
+ if(vga->ramdac && (vga->ramdac->flag & Hextsid)){
+ if(vga->ramdac->flag & Hsid32)
+ sid = 32;
+ else
+ sid = 64;
+ if(vga->ramdac->flag & Uclk2)
+ dbl = 2;
+ else
+ dbl = 1;
+ if(mode->z < 4)
+ bpp = 4;
+ else
+ bpp = mode->z;
+ divide = sid/(dbl*bpp);
+ switch(divide){
+ case 2:
+ vga->crt[0x66] |= 0x01;
+ break;
+ case 4:
+ vga->crt[0x66] |= 0x02;
+ break;
+ case 8:
+ vga->crt[0x66] |= 0x03;
+ break;
+ case 16:
+ vga->crt[0x66] |= 0x04;
+ break;
+ case 32:
+ vga->crt[0x66] |= 0x05;
+ break;
+ }
+ }
+
+ vga->crt[0x40] |= 0x10;
+ vga->crt[0x58] |= 0x40;
+
+ /*
+ * The test against 1376 is necessary for the STB
+ * Velocity 64 Video, no idea if it's relevant to other
+ * cards.
+ * Although not mentioned in the databook, bit 4 of Crt67
+ * needs to be set on the STB Velocity 64 Video too. Gak.
+ */
+ if(dbattr(vga->attr, "disa1sc") && mode->x <= 1376)
+ vga->crt[0x65] |= 0x02;
+ if(vga->ramdac && strncmp(vga->ramdac->name, "tvp3026", 7))
+ vga->crt[0x67] |= 0x10;
+
+ if(dbattr(vga->attr, "vclkphs"))
+ vga->crt[0x67] |= 0x01;
+ if(val = dbattr(vga->attr, "delaybl"))
+ vga->crt[0x6D] |= strtoul(val, 0, 0) & 0x07;
+ if(val = dbattr(vga->attr, "delaysc"))
+ vga->crt[0x6D] |= (strtoul(val, 0, 0) & 0x07)<<4;
+ }
+}
+
+static void
+load(Vga* vga, Ctlr* ctlr)
+{
+ ushort advfunc;
+
+ s3generic.load(vga, ctlr);
+ vgaxo(Crtx, 0x65, vga->crt[0x65]);
+ vgaxo(Crtx, 0x66, vga->crt[0x66]);
+ vgaxo(Crtx, 0x67, vga->crt[0x67]);
+ vgaxo(Crtx, 0x6D, vga->crt[0x6D]);
+
+ advfunc = 0x0000;
+ if(ctlr->flag & Uenhanced)
+ advfunc = 0x0001;
+ outportw(0x4AE8, advfunc);
+}
+
+static void
+dump(Vga* vga, Ctlr* ctlr)
+{
+ s3generic.dump(vga, ctlr);
+
+ printitem(ctlr->name, "Seq09");
+ printreg(vga->sequencer[0x09]);
+ printreg(vga->sequencer[0x0A]);
+
+ printitem(ctlr->name, "Crt22");
+ printreg(vga->crt[0x22]);
+ printitem(ctlr->name, "Crt24");
+ printreg(vga->crt[0x24]);
+ printitem(ctlr->name, "Crt26");
+ printreg(vga->crt[0x26]);
+ printitem(ctlr->name, "Crt2D");
+ printreg(vga->crt[0x2D]);
+ printreg(vga->crt[0x2E]);
+ printreg(vga->crt[0x2F]);
+}
+
+Ctlr vision968 = {
+ "vision968", /* name */
+ snarf, /* snarf */
+ options, /* options */
+ init, /* init */
+ load, /* load */
+ dump, /* dump */
+};