summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2006-04-14 21:05:45 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2006-04-14 21:05:45 +0000
commit60325da4a39fcd16651706a8a0c66591a318b441 (patch)
tree1d543eaedd5d4774dc8ab948dc78df4fad0a3ebe /sys/arch
parentc259092bfb66e5bf36cf1f84ac4f6a168d0adaba (diff)
Minimal support for the HP98705 ``Tigershark'' TurboVRX frame buffer
(using an overlay plane only for now). Bootblocks, text console and X11 are supported.
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/hp300/conf/GENERIC6
-rw-r--r--sys/arch/hp300/conf/RAMDISK6
-rw-r--r--sys/arch/hp300/conf/files.hp30012
-rw-r--r--sys/arch/hp300/dev/diofb_mono.c312
-rw-r--r--sys/arch/hp300/dev/diofbvar.h6
-rw-r--r--sys/arch/hp300/dev/hyper.c240
-rw-r--r--sys/arch/hp300/dev/tvrx.c207
-rw-r--r--sys/arch/hp300/hp300/wscons_machdep.c16
-rw-r--r--sys/arch/hp300/stand/common/Makefile6
-rw-r--r--sys/arch/hp300/stand/common/ite.c6
-rw-r--r--sys/arch/hp300/stand/common/ite_tvrx.c84
-rw-r--r--sys/arch/hp300/stand/common/version.c6
-rw-r--r--sys/arch/hp300/stand/include/itevar.h4
13 files changed, 655 insertions, 256 deletions
diff --git a/sys/arch/hp300/conf/GENERIC b/sys/arch/hp300/conf/GENERIC
index 721f4aff770..6bcd80b3e28 100644
--- a/sys/arch/hp300/conf/GENERIC
+++ b/sys/arch/hp300/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.44 2006/02/14 18:11:03 miod Exp $
+# $OpenBSD: GENERIC,v 1.45 2006/04/14 21:05:43 miod Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -95,6 +95,10 @@ topcat* at intio?
topcat* at dio?
wsdisplay* at topcat?
+# TurboVRX framebuffer
+tvrx* at dio?
+wsdisplay* at tvrx?
+
# SGC framebuffers
sti* at sgc?
wsdisplay* at sti?
diff --git a/sys/arch/hp300/conf/RAMDISK b/sys/arch/hp300/conf/RAMDISK
index a6f5b6840d0..c7eaf33865e 100644
--- a/sys/arch/hp300/conf/RAMDISK
+++ b/sys/arch/hp300/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.26 2005/09/27 22:05:36 miod Exp $
+# $OpenBSD: RAMDISK,v 1.27 2006/04/14 21:05:43 miod Exp $
#
# Ram disk kernel.
#
@@ -105,6 +105,10 @@ topcat* at intio?
topcat* at dio?
wsdisplay* at topcat?
+# TurboVRX framebuffer
+tvrx* at dio?
+wsdisplay* at tvrx?
+
# SGC framebuffers
sti* at sgc?
wsdisplay* at sti?
diff --git a/sys/arch/hp300/conf/files.hp300 b/sys/arch/hp300/conf/files.hp300
index 49d21f4f876..706a27379b4 100644
--- a/sys/arch/hp300/conf/files.hp300
+++ b/sys/arch/hp300/conf/files.hp300
@@ -1,4 +1,4 @@
-# $OpenBSD: files.hp300,v 1.30 2005/12/31 19:30:14 miod Exp $
+# $OpenBSD: files.hp300,v 1.31 2006/04/14 21:05:43 miod Exp $
# $NetBSD: files.hp300,v 1.28 1997/05/12 08:23:28 thorpej Exp $
#
# hp300-specific configuration info
@@ -70,7 +70,9 @@ file arch/hp300/hp300/wscons_machdep.c wsdisplay
# Frame buffer devices
#
define diofb
-file arch/hp300/dev/diofb.c diofb
+define diofb_mono
+file arch/hp300/dev/diofb.c diofb | diofb_mono
+file arch/hp300/dev/diofb_mono.c diofb_mono
device dvbox: wsemuldisplaydev, diofb, rasops8
attach dvbox at intio with dvbox_intio
@@ -82,7 +84,7 @@ attach gbox at intio with gbox_intio
attach gbox at dio with gbox_dio
file arch/hp300/dev/gbox.c gbox needs-flag
-device hyper: wsemuldisplaydev, diofb, rasops1
+device hyper: wsemuldisplaydev, diofb_mono, rasops1
attach hyper at dio
file arch/hp300/dev/hyper.c hyper needs-flag
@@ -96,6 +98,10 @@ attach topcat at intio with topcat_intio
attach topcat at dio with topcat_dio
file arch/hp300/dev/topcat.c topcat needs-flag
+device tvrx: wsemuldisplaydev, diofb_mono, rasops1
+attach tvrx at dio
+file arch/hp300/dev/tvrx.c tvrx needs-flag
+
#
# Other devices on the DIO bus
#
diff --git a/sys/arch/hp300/dev/diofb_mono.c b/sys/arch/hp300/dev/diofb_mono.c
new file mode 100644
index 00000000000..50630815c9a
--- /dev/null
+++ b/sys/arch/hp300/dev/diofb_mono.c
@@ -0,0 +1,312 @@
+/* $OpenBSD: diofb_mono.c,v 1.1 2006/04/14 21:05:43 miod Exp $ */
+
+/*
+ * Copyright (c) 2005, Miodrag Vallat.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/*
+ * Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
+ * Copyright (c) 1991 University of Utah.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department and Mark Davies of the Department of Computer
+ * Science, Victoria University of Wellington, New Zealand.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah $Hdr: grf_hy.c 1.2 93/08/13$
+ *
+ * @(#)grf_hy.c 8.4 (Berkeley) 1/12/94
+ */
+
+/*
+ * Graphics routines for real 1bpp frame buffers (i.e. pixels not being
+ * byte-addressed)
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/rasops/rasops.h>
+
+#include <hp300/dev/diofbreg.h>
+#include <hp300/dev/diofbvar.h>
+
+#include <hp300/dev/maskbits.h>
+
+/* NOTE:
+ * the first element in starttab could be 0xffffffff. making it 0
+ * lets us deal with a full first word in the middle loop, rather
+ * than having to do the multiple reads and masks that we'd
+ * have to do if we thought it was partial.
+ */
+const int starttab[32] = {
+ 0x00000000,
+ 0x7FFFFFFF,
+ 0x3FFFFFFF,
+ 0x1FFFFFFF,
+ 0x0FFFFFFF,
+ 0x07FFFFFF,
+ 0x03FFFFFF,
+ 0x01FFFFFF,
+ 0x00FFFFFF,
+ 0x007FFFFF,
+ 0x003FFFFF,
+ 0x001FFFFF,
+ 0x000FFFFF,
+ 0x0007FFFF,
+ 0x0003FFFF,
+ 0x0001FFFF,
+ 0x0000FFFF,
+ 0x00007FFF,
+ 0x00003FFF,
+ 0x00001FFF,
+ 0x00000FFF,
+ 0x000007FF,
+ 0x000003FF,
+ 0x000001FF,
+ 0x000000FF,
+ 0x0000007F,
+ 0x0000003F,
+ 0x0000001F,
+ 0x0000000F,
+ 0x00000007,
+ 0x00000003,
+ 0x00000001
+};
+
+const int endtab[32] = {
+ 0x00000000,
+ 0x80000000,
+ 0xC0000000,
+ 0xE0000000,
+ 0xF0000000,
+ 0xF8000000,
+ 0xFC000000,
+ 0xFE000000,
+ 0xFF000000,
+ 0xFF800000,
+ 0xFFC00000,
+ 0xFFE00000,
+ 0xFFF00000,
+ 0xFFF80000,
+ 0xFFFC0000,
+ 0xFFFE0000,
+ 0xFFFF0000,
+ 0xFFFF8000,
+ 0xFFFFC000,
+ 0xFFFFE000,
+ 0xFFFFF000,
+ 0xFFFFF800,
+ 0xFFFFFC00,
+ 0xFFFFFE00,
+ 0xFFFFFF00,
+ 0xFFFFFF80,
+ 0xFFFFFFC0,
+ 0xFFFFFFE0,
+ 0xFFFFFFF0,
+ 0xFFFFFFF8,
+ 0xFFFFFFFC,
+ 0xFFFFFFFE
+};
+
+void
+diofb_mono_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy,
+ u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop)
+{
+ int width; /* add to get to same position in next line */
+
+ unsigned int *psrcLine, *pdstLine;
+ /* pointers to line with current src and dst */
+ unsigned int *psrc; /* pointer to current src longword */
+ unsigned int *pdst; /* pointer to current dst longword */
+
+ /* following used for looping through a line */
+ unsigned int startmask, endmask; /* masks for writing ends of dst */
+ int nlMiddle; /* whole longwords in dst */
+ int nl; /* temp copy of nlMiddle */
+ unsigned int tmpSrc;
+ /* place to store full source word */
+ int xoffSrc; /* offset (>= 0, < 32) from which to
+ fetch whole longwords fetched in src */
+ int nstart; /* number of ragged bits at start of dst */
+ int nend; /* number of ragged bits at end of dst */
+ int srcStartOver; /* pulling nstart bits from src
+ overflows into the next word? */
+
+ width = fb->fbwidth >> 5;
+
+ if (sy < dy) { /* start at last scanline of rectangle */
+ psrcLine = ((u_int *)fb->fbkva) + ((sy + cy - 1) * width);
+ pdstLine = ((u_int *)fb->fbkva) + ((dy + cy - 1) * width);
+ width = -width;
+ } else { /* start at first scanline */
+ psrcLine = ((u_int *)fb->fbkva) + (sy * width);
+ pdstLine = ((u_int *)fb->fbkva) + (dy * width);
+ }
+
+ /* x direction doesn't matter for < 1 longword */
+ if (cx <= 32) {
+ int srcBit, dstBit; /* bit offset of src and dst */
+
+ pdstLine += (dx >> 5);
+ psrcLine += (sx >> 5);
+ psrc = psrcLine;
+ pdst = pdstLine;
+
+ srcBit = sx & 0x1f;
+ dstBit = dx & 0x1f;
+
+ while (cy--) {
+ getandputrop(psrc, srcBit, dstBit, cx, pdst, rop);
+ pdst += width;
+ psrc += width;
+ }
+ } else {
+ maskbits(dx, cx, startmask, endmask, nlMiddle);
+ if (startmask)
+ nstart = 32 - (dx & 0x1f);
+ else
+ nstart = 0;
+ if (endmask)
+ nend = (dx + cx) & 0x1f;
+ else
+ nend = 0;
+
+ xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
+ srcStartOver = ((sx & 0x1f) + nstart) > 31;
+
+ if (sx >= dx) { /* move left to right */
+ pdstLine += (dx >> 5);
+ psrcLine += (sx >> 5);
+
+ while (cy--) {
+ psrc = psrcLine;
+ pdst = pdstLine;
+
+ if (startmask) {
+ getandputrop(psrc, (sx & 0x1f),
+ (dx & 0x1f), nstart, pdst, rop);
+ pdst++;
+ if (srcStartOver)
+ psrc++;
+ }
+
+ /* special case for aligned operations */
+ if (xoffSrc == 0) {
+ nl = nlMiddle;
+ while (nl--) {
+ DoRop(*pdst, rop, *psrc++,
+ *pdst);
+ pdst++;
+ }
+ } else {
+ nl = nlMiddle + 1;
+ while (--nl) {
+ getunalignedword(psrc, xoffSrc,
+ tmpSrc);
+ DoRop(*pdst, rop, tmpSrc,
+ *pdst);
+ pdst++;
+ psrc++;
+ }
+ }
+
+ if (endmask) {
+ getandputrop0(psrc, xoffSrc, nend,
+ pdst, rop);
+ }
+
+ pdstLine += width;
+ psrcLine += width;
+ }
+ } else { /* move right to left */
+ pdstLine += ((dx + cx) >> 5);
+ psrcLine += ((sx + cx) >> 5);
+ /*
+ * If fetch of last partial bits from source crosses
+ * a longword boundary, start at the previous longword
+ */
+ if (xoffSrc + nend >= 32)
+ --psrcLine;
+
+ while (cy--) {
+ psrc = psrcLine;
+ pdst = pdstLine;
+
+ if (endmask) {
+ getandputrop0(psrc, xoffSrc, nend,
+ pdst, rop);
+ }
+
+ nl = nlMiddle + 1;
+ while (--nl) {
+ --psrc;
+ --pdst;
+ getunalignedword(psrc, xoffSrc, tmpSrc);
+ DoRop(*pdst, rop, tmpSrc, *pdst);
+ }
+
+ if (startmask) {
+ if (srcStartOver)
+ --psrc;
+ --pdst;
+ getandputrop(psrc, (sx & 0x1f),
+ (dx & 0x1f), nstart, pdst, rop);
+ }
+
+ pdstLine += width;
+ psrcLine += width;
+ }
+ }
+ }
+}
diff --git a/sys/arch/hp300/dev/diofbvar.h b/sys/arch/hp300/dev/diofbvar.h
index e7a37ee1f38..99b9b950388 100644
--- a/sys/arch/hp300/dev/diofbvar.h
+++ b/sys/arch/hp300/dev/diofbvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: diofbvar.h,v 1.7 2006/03/12 22:52:59 miod Exp $ */
+/* $OpenBSD: diofbvar.h,v 1.8 2006/04/14 21:05:43 miod Exp $ */
/*
* Copyright (c) 2005, Miodrag Vallat
@@ -123,12 +123,16 @@ paddr_t diofb_mmap(void *, off_t, int);
int diofb_show_screen(void *, void *, int, void (*)(void *, int, int),
void *);
+void diofb_mono_windowmove(struct diofb *, u_int16_t, u_int16_t,
+ u_int16_t, u_int16_t, u_int16_t, u_int16_t, int);
+
/* Console support */
void dvboxcninit(void);
void gboxcninit(void);
void hypercninit(void);
void rboxcninit(void);
void topcatcninit(void);
+void tvrxcninit(void);
extern struct diofb diofb_cn; /* struct diofb for console device */
#endif
diff --git a/sys/arch/hp300/dev/hyper.c b/sys/arch/hp300/dev/hyper.c
index 712a115cea4..06fe98c6a42 100644
--- a/sys/arch/hp300/dev/hyper.c
+++ b/sys/arch/hp300/dev/hyper.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hyper.c,v 1.14 2005/12/31 18:13:41 miod Exp $ */
+/* $OpenBSD: hyper.c,v 1.15 2006/04/14 21:05:43 miod Exp $ */
/*
* Copyright (c) 2005, Miodrag Vallat.
@@ -112,8 +112,6 @@ struct cfdriver hyper_cd = {
};
int hyper_reset(struct diofb *, int, struct diofbreg *);
-void hyper_windowmove(struct diofb *, u_int16_t, u_int16_t,
- u_int16_t, u_int16_t, u_int16_t, u_int16_t, int);
int hyper_ioctl(void *, u_long, caddr_t, int, struct proc *);
void hyper_burner(void *, u_int, u_int);
@@ -185,7 +183,7 @@ hyper_reset(struct diofb *fb, int scode, struct diofbreg *fbr)
if ((rc = diofb_fbinquire(fb, scode, fbr)) != 0)
return (rc);
- fb->bmv = hyper_windowmove;
+ fb->bmv = diofb_mono_windowmove;
fb->ri.ri_depth = 1; /* do not fake a 8bpp frame buffer */
diofb_fbsetup(fb);
@@ -248,240 +246,6 @@ hyper_burner(void *v, u_int on, u_int flags)
}
/*
- * Display routines
- */
-
-#include <hp300/dev/maskbits.h>
-
-/* NOTE:
- * the first element in starttab could be 0xffffffff. making it 0
- * lets us deal with a full first word in the middle loop, rather
- * than having to do the multiple reads and masks that we'd
- * have to do if we thought it was partial.
- */
-const int starttab[32] = {
- 0x00000000,
- 0x7FFFFFFF,
- 0x3FFFFFFF,
- 0x1FFFFFFF,
- 0x0FFFFFFF,
- 0x07FFFFFF,
- 0x03FFFFFF,
- 0x01FFFFFF,
- 0x00FFFFFF,
- 0x007FFFFF,
- 0x003FFFFF,
- 0x001FFFFF,
- 0x000FFFFF,
- 0x0007FFFF,
- 0x0003FFFF,
- 0x0001FFFF,
- 0x0000FFFF,
- 0x00007FFF,
- 0x00003FFF,
- 0x00001FFF,
- 0x00000FFF,
- 0x000007FF,
- 0x000003FF,
- 0x000001FF,
- 0x000000FF,
- 0x0000007F,
- 0x0000003F,
- 0x0000001F,
- 0x0000000F,
- 0x00000007,
- 0x00000003,
- 0x00000001
-};
-
-const int endtab[32] = {
- 0x00000000,
- 0x80000000,
- 0xC0000000,
- 0xE0000000,
- 0xF0000000,
- 0xF8000000,
- 0xFC000000,
- 0xFE000000,
- 0xFF000000,
- 0xFF800000,
- 0xFFC00000,
- 0xFFE00000,
- 0xFFF00000,
- 0xFFF80000,
- 0xFFFC0000,
- 0xFFFE0000,
- 0xFFFF0000,
- 0xFFFF8000,
- 0xFFFFC000,
- 0xFFFFE000,
- 0xFFFFF000,
- 0xFFFFF800,
- 0xFFFFFC00,
- 0xFFFFFE00,
- 0xFFFFFF00,
- 0xFFFFFF80,
- 0xFFFFFFC0,
- 0xFFFFFFE0,
- 0xFFFFFFF0,
- 0xFFFFFFF8,
- 0xFFFFFFFC,
- 0xFFFFFFFE
-};
-
-void
-hyper_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy,
- u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop)
-{
- int width; /* add to get to same position in next line */
-
- unsigned int *psrcLine, *pdstLine;
- /* pointers to line with current src and dst */
- unsigned int *psrc; /* pointer to current src longword */
- unsigned int *pdst; /* pointer to current dst longword */
-
- /* following used for looping through a line */
- unsigned int startmask, endmask; /* masks for writing ends of dst */
- int nlMiddle; /* whole longwords in dst */
- int nl; /* temp copy of nlMiddle */
- unsigned int tmpSrc;
- /* place to store full source word */
- int xoffSrc; /* offset (>= 0, < 32) from which to
- fetch whole longwords fetched in src */
- int nstart; /* number of ragged bits at start of dst */
- int nend; /* number of ragged bits at end of dst */
- int srcStartOver; /* pulling nstart bits from src
- overflows into the next word? */
-
- width = fb->fbwidth >> 5;
-
- if (sy < dy) { /* start at last scanline of rectangle */
- psrcLine = ((u_int *)fb->fbkva) + ((sy + cy - 1) * width);
- pdstLine = ((u_int *)fb->fbkva) + ((dy + cy - 1) * width);
- width = -width;
- } else { /* start at first scanline */
- psrcLine = ((u_int *)fb->fbkva) + (sy * width);
- pdstLine = ((u_int *)fb->fbkva) + (dy * width);
- }
-
- /* x direction doesn't matter for < 1 longword */
- if (cx <= 32) {
- int srcBit, dstBit; /* bit offset of src and dst */
-
- pdstLine += (dx >> 5);
- psrcLine += (sx >> 5);
- psrc = psrcLine;
- pdst = pdstLine;
-
- srcBit = sx & 0x1f;
- dstBit = dx & 0x1f;
-
- while (cy--) {
- getandputrop(psrc, srcBit, dstBit, cx, pdst, rop);
- pdst += width;
- psrc += width;
- }
- } else {
- maskbits(dx, cx, startmask, endmask, nlMiddle);
- if (startmask)
- nstart = 32 - (dx & 0x1f);
- else
- nstart = 0;
- if (endmask)
- nend = (dx + cx) & 0x1f;
- else
- nend = 0;
-
- xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
- srcStartOver = ((sx & 0x1f) + nstart) > 31;
-
- if (sx >= dx) { /* move left to right */
- pdstLine += (dx >> 5);
- psrcLine += (sx >> 5);
-
- while (cy--) {
- psrc = psrcLine;
- pdst = pdstLine;
-
- if (startmask) {
- getandputrop(psrc, (sx & 0x1f),
- (dx & 0x1f), nstart, pdst, rop);
- pdst++;
- if (srcStartOver)
- psrc++;
- }
-
- /* special case for aligned operations */
- if (xoffSrc == 0) {
- nl = nlMiddle;
- while (nl--) {
- DoRop(*pdst, rop, *psrc++,
- *pdst);
- pdst++;
- }
- } else {
- nl = nlMiddle + 1;
- while (--nl) {
- getunalignedword(psrc, xoffSrc,
- tmpSrc);
- DoRop(*pdst, rop, tmpSrc,
- *pdst);
- pdst++;
- psrc++;
- }
- }
-
- if (endmask) {
- getandputrop0(psrc, xoffSrc, nend,
- pdst, rop);
- }
-
- pdstLine += width;
- psrcLine += width;
- }
- } else { /* move right to left */
- pdstLine += ((dx + cx) >> 5);
- psrcLine += ((sx + cx) >> 5);
- /*
- * If fetch of last partial bits from source crosses
- * a longword boundary, start at the previous longword
- */
- if (xoffSrc + nend >= 32)
- --psrcLine;
-
- while (cy--) {
- psrc = psrcLine;
- pdst = pdstLine;
-
- if (endmask) {
- getandputrop0(psrc, xoffSrc, nend,
- pdst, rop);
- }
-
- nl = nlMiddle + 1;
- while (--nl) {
- --psrc;
- --pdst;
- getunalignedword(psrc, xoffSrc, tmpSrc);
- DoRop(*pdst, rop, tmpSrc, *pdst);
- }
-
- if (startmask) {
- if (srcStartOver)
- --psrc;
- --pdst;
- getandputrop(psrc, (sx & 0x1f),
- (dx & 0x1f), nstart, pdst, rop);
- }
-
- pdstLine += width;
- psrcLine += width;
- }
- }
- }
-}
-
-/*
* Hyperion console support
*/
diff --git a/sys/arch/hp300/dev/tvrx.c b/sys/arch/hp300/dev/tvrx.c
new file mode 100644
index 00000000000..0c65745917c
--- /dev/null
+++ b/sys/arch/hp300/dev/tvrx.c
@@ -0,0 +1,207 @@
+/* $OpenBSD: tvrx.c,v 1.1 2006/04/14 21:05:43 miod Exp $ */
+
+/*
+ * Copyright (c) 2006, Miodrag Vallat.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * Graphics routines for the TurboVRX frame buffer
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+#include <sys/ioctl.h>
+
+#include <machine/autoconf.h>
+#include <machine/bus.h>
+#include <machine/cpu.h>
+
+#include <hp300/dev/dioreg.h>
+#include <hp300/dev/diovar.h>
+#include <hp300/dev/diodevs.h>
+
+#include <dev/cons.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/rasops/rasops.h>
+
+#include <hp300/dev/diofbreg.h>
+#include <hp300/dev/diofbvar.h>
+
+struct tvrx_softc {
+ struct device sc_dev;
+ struct diofb *sc_fb;
+ struct diofb sc_fb_store;
+ int sc_scode;
+};
+
+int tvrx_match(struct device *, void *, void *);
+void tvrx_attach(struct device *, struct device *, void *);
+
+struct cfattach tvrx_ca = {
+ sizeof(struct tvrx_softc), tvrx_match, tvrx_attach
+};
+
+struct cfdriver tvrx_cd = {
+ NULL, "tvrx", DV_DULL
+};
+
+int tvrx_reset(struct diofb *, int, struct diofbreg *);
+
+int tvrx_ioctl(void *, u_long, caddr_t, int, struct proc *);
+
+struct wsdisplay_accessops tvrx_accessops = {
+ tvrx_ioctl,
+ diofb_mmap,
+ diofb_alloc_screen,
+ diofb_free_screen,
+ diofb_show_screen,
+ NULL, /* load_font */
+ NULL, /* scrollback */
+ NULL, /* getchar */
+ NULL /* burner */
+};
+
+/*
+ * Attachment glue
+ */
+
+int
+tvrx_match(struct device *parent, void *match, void *aux)
+{
+ struct dio_attach_args *da = aux;
+
+ if (da->da_id != DIO_DEVICE_ID_FRAMEBUFFER ||
+ da->da_secid != DIO_DEVICE_SECID_TIGERSHARK)
+ return (0);
+
+ return (1);
+}
+
+void
+tvrx_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct tvrx_softc *sc = (struct tvrx_softc *)self;
+ struct dio_attach_args *da = aux;
+ struct diofbreg *fbr;
+
+ sc->sc_scode = da->da_scode;
+ if (sc->sc_scode == conscode) {
+ fbr = (struct diofbreg *)conaddr; /* already mapped */
+ sc->sc_fb = &diofb_cn;
+ } else {
+ sc->sc_fb = &sc->sc_fb_store;
+ fbr = (struct diofbreg *)
+ iomap(dio_scodetopa(sc->sc_scode), da->da_size);
+ if (fbr == NULL ||
+ tvrx_reset(sc->sc_fb, sc->sc_scode, fbr) != 0) {
+ printf(": can't map framebuffer\n");
+ return;
+ }
+ }
+
+ diofb_end_attach(sc, &tvrx_accessops, sc->sc_fb,
+ sc->sc_scode == conscode, NULL);
+}
+
+/*
+ * Initialize hardware and display routines.
+ */
+int
+tvrx_reset(struct diofb *fb, int scode, struct diofbreg *fbr)
+{
+ int rc;
+
+ if ((rc = diofb_fbinquire(fb, scode, fbr)) != 0)
+ return (rc);
+
+ /*
+ * We rely on the PROM to initialize the frame buffer in the mode
+ * we expect it: cleared, overlay plane enabled and accessible
+ * at the beginning of the video memory.
+ *
+ * This is NOT the mode we would end up by simply resetting the
+ * board.
+ */
+
+ fb->ri.ri_depth = 1;
+ fb->bmv = diofb_mono_windowmove;
+ diofb_fbsetup(fb);
+
+ return (0);
+}
+
+int
+tvrx_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
+{
+ struct diofb *fb = v;
+ struct wsdisplay_fbinfo *wdf;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GTYPE:
+ *(u_int *)data = WSDISPLAY_TYPE_TVRX;
+ break;
+ case WSDISPLAYIO_SMODE:
+ fb->mapmode = *(u_int *)data;
+ break;
+ case WSDISPLAYIO_GINFO:
+ wdf = (void *)data;
+ wdf->width = fb->ri.ri_width;
+ wdf->height = fb->ri.ri_height;
+ wdf->depth = fb->ri.ri_depth;
+ wdf->cmsize = 0;
+ break;
+ case WSDISPLAYIO_LINEBYTES:
+ *(u_int *)data = fb->ri.ri_stride;
+ break;
+ case WSDISPLAYIO_GETCMAP:
+ case WSDISPLAYIO_PUTCMAP:
+ break; /* until color support is implemented */
+ case WSDISPLAYIO_GVIDEO:
+ case WSDISPLAYIO_SVIDEO:
+ /* unsupported */
+ return (-1);
+ default:
+ return (-1);
+ }
+
+ return (0);
+}
+
+/*
+ * Console support
+ */
+
+void
+tvrxcninit()
+{
+ tvrx_reset(&diofb_cn, conscode, (struct diofbreg *)conaddr);
+ diofb_cnattach(&diofb_cn);
+}
diff --git a/sys/arch/hp300/hp300/wscons_machdep.c b/sys/arch/hp300/hp300/wscons_machdep.c
index b0f17e17042..ea700592f65 100644
--- a/sys/arch/hp300/hp300/wscons_machdep.c
+++ b/sys/arch/hp300/hp300/wscons_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wscons_machdep.c,v 1.6 2006/01/01 11:59:39 miod Exp $ */
+/* $OpenBSD: wscons_machdep.c,v 1.7 2006/04/14 21:05:44 miod Exp $ */
/*
* Copyright (c) 2005, Miodrag Vallat
@@ -79,7 +79,8 @@
#include "hyper.h"
#include "rbox.h"
#include "topcat.h"
-#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0
+#include "tvrx.h"
+#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
#include <hp300/dev/dioreg.h>
#include <hp300/dev/diovar.h>
#include <hp300/dev/diofbreg.h>
@@ -105,7 +106,7 @@ cons_decl(ws);
void (*wsfbcninit)(void) = NULL;
-#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0
+#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
int dio_fbidentify(struct diofbreg *);
/*
@@ -144,6 +145,11 @@ dio_fbidentify(struct diofbreg *fbr)
wsfbcninit = topcatcninit;
return (1);
#endif
+#if NTVRX > 0
+ case GID_TIGER:
+ wsfbcninit = tvrxcninit;
+ return (1);
+#endif
default:
break;
}
@@ -167,7 +173,7 @@ wscnprobe(struct consdev *cp)
int maj, tmpconscode;
vsize_t mapsize;
vaddr_t va;
-#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0
+#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
paddr_t pa;
u_int scode, sctop;
struct diofbreg *fbr;
@@ -196,7 +202,7 @@ wscnprobe(struct consdev *cp)
}
#endif
-#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0
+#if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
/*
* Scan the DIO bus.
*/
diff --git a/sys/arch/hp300/stand/common/Makefile b/sys/arch/hp300/stand/common/Makefile
index e7016d178b2..59fd5c9d82c 100644
--- a/sys/arch/hp300/stand/common/Makefile
+++ b/sys/arch/hp300/stand/common/Makefile
@@ -1,12 +1,12 @@
-# $OpenBSD: Makefile,v 1.4 1999/08/16 09:43:08 downsj Exp $
+# $OpenBSD: Makefile,v 1.5 2006/04/14 21:05:44 miod Exp $
LIB= common
NOMAN= noman
SRCS= apci.c autoconf.c cons.c ct.c dca.c dcm.c dnkbd.c \
- fhpib.c hd.c hil.c hpib.c if_le.c ite.c ite_dv.c ite_gb.c ite_rb.c \
- ite_subr.c ite_tc.c ite_hy.c kbd.c kbdconf.c machdep.c \
+ fhpib.c hd.c hil.c hpib.c if_le.c ite.c ite_dv.c ite_gb.c ite_hy.c \
+ ite_rb.c ite_subr.c ite_tc.c ite_tvrx.c kbd.c kbdconf.c machdep.c \
nhpib.c prf.c scsi.c sd.c version.c
CFLAGS= -O2 -msoft-float -I${.CURDIR}/../include \
diff --git a/sys/arch/hp300/stand/common/ite.c b/sys/arch/hp300/stand/common/ite.c
index 26b1e737ab1..a2d5fd43f0f 100644
--- a/sys/arch/hp300/stand/common/ite.c
+++ b/sys/arch/hp300/stand/common/ite.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ite.c,v 1.5 2005/04/22 00:42:16 miod Exp $ */
+/* $OpenBSD: ite.c,v 1.6 2006/04/14 21:05:44 miod Exp $ */
/* $NetBSD: ite.c,v 1.12 1997/01/30 10:32:55 thorpej Exp $ */
/*
@@ -90,6 +90,10 @@ struct itesw itesw[] = {
{ GID_HYPERION,
hyper_init, ite_deinit_noop, hyper_clear, hyper_putc,
hyper_cursor, hyper_scroll, ite_readbyte, ite_writeglyph },
+
+ { GID_TIGER,
+ tvrx_init, ite_deinit_noop, hyper_clear, hyper_putc,
+ hyper_cursor, hyper_scroll, ite_readbyte, ite_writeglyph },
};
int nitesw = sizeof(itesw) / sizeof(itesw[0]);
diff --git a/sys/arch/hp300/stand/common/ite_tvrx.c b/sys/arch/hp300/stand/common/ite_tvrx.c
new file mode 100644
index 00000000000..06bf87f9328
--- /dev/null
+++ b/sys/arch/hp300/stand/common/ite_tvrx.c
@@ -0,0 +1,84 @@
+/* $OpenBSD: ite_tvrx.c,v 1.1 2006/04/14 21:05:44 miod Exp $ */
+
+/*
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department and Mark Davies of the Department of Computer
+ * Science, Victoria University of Wellington, New Zealand.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah $Hdr: ite_hy.c 1.1 92/01/22$
+ *
+ * @(#)ite_hy.c 8.1 (Berkeley) 6/10/93
+ */
+
+#include "samachdep.h"
+
+#ifdef ITECONSOLE
+#include <sys/param.h>
+
+#include "itevar.h"
+#include "itereg.h"
+
+#undef charX
+#define charX(ip,c) \
+ (((c) % (ip)->cpl) * ((((ip)->ftwidth + 7) / 8) * 8) + (ip)->fontx)
+
+/* this reuses most of the hyperion code */
+void hyper_ite_fontinit(struct ite_data *);
+void hyper_windowmove(struct ite_data *, int, int, int, int,
+ int, int, int);
+
+void
+tvrx_init(ip)
+ register struct ite_data *ip;
+{
+ int width;
+
+ ite_fontinfo(ip);
+ width = ((ip->ftwidth + 7) / 8) * 8;
+ ip->cpl = (ip->fbwidth - ip->dwidth) / width;
+ ip->cblanky = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
+
+ /*
+ * Clear the framebuffer on all planes.
+ */
+ hyper_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
+
+ hyper_ite_fontinit(ip);
+
+ /*
+ * Stash the inverted cursor.
+ */
+ hyper_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
+ ip->cblanky, ip->cblankx, ip->ftheight,
+ ip->ftwidth, RR_COPYINVERTED);
+}
+#endif
diff --git a/sys/arch/hp300/stand/common/version.c b/sys/arch/hp300/stand/common/version.c
index cbad9c2aa50..94a6d150842 100644
--- a/sys/arch/hp300/stand/common/version.c
+++ b/sys/arch/hp300/stand/common/version.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: version.c,v 1.6 2005/12/31 17:59:47 miod Exp $ */
+/* $OpenBSD: version.c,v 1.7 2006/04/14 21:05:44 miod Exp $ */
/*
* Record major changes in the boot code here, and increment the version
@@ -22,6 +22,8 @@
*
* 2.7 Minor syncs with the kernel (recognize more models
* and use the same logic to pick the console on 425e).
+ *
+ * 2.8 TurboVRX frame buffer support.
*/
-const char version[] = "2.7";
+const char version[] = "2.8";
diff --git a/sys/arch/hp300/stand/include/itevar.h b/sys/arch/hp300/stand/include/itevar.h
index e0300db0eb1..a86de824cc3 100644
--- a/sys/arch/hp300/stand/include/itevar.h
+++ b/sys/arch/hp300/stand/include/itevar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: itevar.h,v 1.3 2003/06/02 23:27:46 millert Exp $ */
+/* $OpenBSD: itevar.h,v 1.4 2006/04/14 21:05:44 miod Exp $ */
/* $NetBSD: itevar.h,v 1.1 1996/03/03 04:23:42 thorpej Exp $ */
/*
@@ -226,3 +226,5 @@ void hyper_clear(struct ite_data *, int, int, int, int);
void hyper_putc(struct ite_data *, int, int, int, int);
void hyper_cursor(struct ite_data *, int);
void hyper_scroll(struct ite_data *, int, int, int, int);
+
+void tvrx_init(struct ite_data *);