summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--distrib/notes/vax/hardware10
-rw-r--r--share/man/man4/man4.vax/Makefile4
-rw-r--r--share/man/man4/man4.vax/intro.46
-rw-r--r--share/man/man4/man4.vax/legss.450
-rw-r--r--share/man/man4/man4.vax/mbus.48
-rw-r--r--sys/arch/vax/conf/GENERIC6
-rw-r--r--sys/arch/vax/conf/RAMDISK6
-rw-r--r--sys/arch/vax/dec/dzcons.c16
-rw-r--r--sys/arch/vax/mbus/files.mbus12
-rw-r--r--sys/arch/vax/mbus/legss.c428
-rw-r--r--sys/arch/vax/vax/findcpu.c10
-rw-r--r--sys/arch/vax/vax/wscons_machdep.c8
12 files changed, 534 insertions, 30 deletions
diff --git a/distrib/notes/vax/hardware b/distrib/notes/vax/hardware
index 7b6332a3576..f3f4ba5997a 100644
--- a/distrib/notes/vax/hardware
+++ b/distrib/notes/vax/hardware
@@ -1,11 +1,11 @@
-dnl $OpenBSD: hardware,v 1.25 2008/08/18 23:19:15 miod Exp $
+dnl $OpenBSD: hardware,v 1.26 2008/08/20 18:59:59 miod Exp $
OpenBSD/MACHINE OSREV runs on a wide variety of VAX hardware.
The following systems have been tested:
- VAXstation 2000
- VAXstation 3100/{30,40}
- VAXstation 3100/{38,48}
- VAXstation 3100/76
- - VAXstation 3520,3540
+ - VAXstation 3520,3540 (3820 and 3840 should also run)
- VAXstation 4000/VLC
- VAXstation 4000/60
- VAXstation 4000/90
@@ -55,11 +55,13 @@ Supported devices {:-include-:}:
- VAXstation 3100/{30,38,40,48} color frame buffer option (gpx)
- VAXstation 3100/76 SPX frame buffer, also available as on option
for VAXstation 3100/{30,38,40,48} (lcspx)
+ - VAXstation 35x0/38x0 frame buffer (legss), without the 16 planes
+ option
- VAXstation 4000/60 and 4000/VLC frame buffer (lcg)
- VAXstation 4000/90 color frame buffer (lcspx)
- VXT2000 color frame buffer (lcspx)
- The VXT2000 monochrome frame buffer and the spxg/spxgt option for
- VAXstation 4000s are not supported yet.
+ The VXT2000 monochrome frame buffer, the LEGSS 16 plane option and
+ the spxg/spxgt option for VAXstation 4000s are not supported yet.
* Input devices:
- LK201 and LK401 keyboards (lkkbd)
diff --git a/share/man/man4/man4.vax/Makefile b/share/man/man4/man4.vax/Makefile
index 180e929eed3..6d94688df8e 100644
--- a/share/man/man4/man4.vax/Makefile
+++ b/share/man/man4/man4.vax/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.23 2008/08/18 23:19:18 miod Exp $
+# $OpenBSD: Makefile,v 1.24 2008/08/20 19:00:01 miod Exp $
# $NetBSD: Makefile,v 1.6 1996/03/03 17:13:09 thorpej Exp $
# from: @(#)Makefile 5.4 (Berkeley) 5/11/90
@@ -7,7 +7,7 @@
# ec.4 en.4 ex.4 fl.4 hdh.4 hk.4 ht.4 hy.4 ik.4 il.4 ix.4 kg.4 lp.4 np.4
# pcl.4 ps.4 tm.4 tmscp.4 tu.4 up.4 ut.4 uu.4 va.4 vp.4 vv.4
MAN= asc.4 autoconf.4 cons.4 de.4 dhu.4 dz.4 fwio.4 gpx.4 hp.4 \
- ibus.4 intro.4 lcg.4 lcspx.4 le.4 led.4 lkkbd.4 lkms.4 \
+ ibus.4 intro.4 lcg.4 lcspx.4 le.4 led.4 legss.4 lkkbd.4 lkms.4 \
mbus.4 mem.4 mscpbus.4 mt.4 mtc.4 ncr.4 qe.4 qsc.4 ra.4 rx.4 \
sii.4 smg.4 ts.4 uba.4 uda.4 vsbus.4 vxtbus.4 ze.4
MLINKS= mem.4 kmem.4
diff --git a/share/man/man4/man4.vax/intro.4 b/share/man/man4/man4.vax/intro.4
index 01e0862aafb..c22761391e1 100644
--- a/share/man/man4/man4.vax/intro.4
+++ b/share/man/man4/man4.vax/intro.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: intro.4,v 1.31 2008/08/18 23:19:18 miod Exp $
+.\" $OpenBSD: intro.4,v 1.32 2008/08/20 19:00:01 miod Exp $
.\" $NetBSD: intro.4,v 1.3 1996/03/03 17:13:44 thorpej Exp $
.\"
.\" Copyright (c) 1980, 1991 Regents of the University of California.
@@ -30,7 +30,7 @@
.\"
.\" from: @(#)intro.4 6.6 (Berkeley) 3/27/91
.\"
-.Dd $Mdocdate: August 18 2008 $
+.Dd $Mdocdate: August 20 2008 $
.Dt INTRO 4 vax
.Os
.Sh NAME
@@ -126,6 +126,8 @@ Low-Cost SPX color frame buffer
AMD LANCE Ethernet device
.It Xr led 4
VAX LED driver
+.It Xr legss 4
+Low-End Graphics Subsystem
.It Xr lkkbd 4
LK200/LK400 keyboard driver
.It Xr lkms 4
diff --git a/share/man/man4/man4.vax/legss.4 b/share/man/man4/man4.vax/legss.4
new file mode 100644
index 00000000000..5059e5597e1
--- /dev/null
+++ b/share/man/man4/man4.vax/legss.4
@@ -0,0 +1,50 @@
+.\" $OpenBSD: legss.4,v 1.1 2008/08/20 19:00:01 miod Exp $
+.\"
+.\" Copyright (c) 2008 Miodrag Vallat.
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate: August 20 2008 $
+.Dt LEGSS 4 vax
+.Os
+.Sh NAME
+.Nm legss
+.Nd Low-End Graphics Subsystem
+.Sh SYNOPSIS
+.Cd "legss* at mbus0 mid 7"
+.Cd "wsdisplay* at legss?"
+.Sh DESCRIPTION
+The
+.Nm
+is a 8 bit color frame buffer found in VAXstation 35x0 and 38x0 series.
+An optional VCB03 16 plane option expands it to a 24 bit color frame buffer.
+.Pp
+The
+.Nm
+driver interfaces the frame buffer with the
+.Xr wscons 4
+console framework.
+It does not provide direct device driver entry points
+but makes its functions available via the internal
+.Xr wsdisplay 4
+interface.
+.Sh SEE ALSO
+.Xr intro 4 ,
+.Xr mbus 4 ,
+.Xr wscons 4 ,
+.Xr wsdisplay 4
+.Sh BUGS
+The 16 plane option is currently not supported, and needs to be removed
+for the
+.Nm
+driver to operate properly.
diff --git a/share/man/man4/man4.vax/mbus.4 b/share/man/man4/man4.vax/mbus.4
index eb7c09d466a..efb3dce7828 100644
--- a/share/man/man4/man4.vax/mbus.4
+++ b/share/man/man4/man4.vax/mbus.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: mbus.4,v 1.1 2008/08/18 23:19:18 miod Exp $
+.\" $OpenBSD: mbus.4,v 1.2 2008/08/20 19:00:01 miod Exp $
.\"
.\" Copyright (c) 2008 Miodrag Vallat.
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: August 18 2008 $
+.Dd $Mdocdate: August 20 2008 $
.Dt MBUS 4 vax
.Os
.Sh NAME
@@ -34,8 +34,8 @@ The following M-bus devices are supported:
.Bl -tag -width 8n -compact -offset indent
.It Xr fwio 4
Firefox Workstation I/O module
-.\" .It Xr legss 4
-.\" Low-End Graphics Subsystem
+.It Xr legss 4
+Low-End Graphics Subsystem
.It Xr uba 4
UNIBUS/Q-bus controller
.El
diff --git a/sys/arch/vax/conf/GENERIC b/sys/arch/vax/conf/GENERIC
index aed634833eb..c33bc61ecd4 100644
--- a/sys/arch/vax/conf/GENERIC
+++ b/sys/arch/vax/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.49 2008/08/18 23:19:21 miod Exp $
+# $OpenBSD: GENERIC,v 1.50 2008/08/20 19:00:01 miod Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -84,7 +84,8 @@ le0 at ibus0 # LANCE ethernet (MV3400)
# M-bus found on VS 3[58][24]0
fwio* at mbus0 mid ? # I/O module
-uba0 at mbus0 mid 0
+legss0 at mbus0 mid 7 # Graphics module
+uba0 at mbus0 mid 0 # Q-bus adaptor module
dz0 at fwio? # DZ-11 like serial ports
dz* at fwio? # DZ-11 (on additional fwio)
@@ -160,6 +161,7 @@ uk* at scsibus?
wsdisplay* at gpx?
wsdisplay* at lcg?
wsdisplay* at lcspx?
+wsdisplay* at legss?
wsdisplay* at smg?
#wsdisplay* at qd0
diff --git a/sys/arch/vax/conf/RAMDISK b/sys/arch/vax/conf/RAMDISK
index ec7e7f96b5d..f5f08986929 100644
--- a/sys/arch/vax/conf/RAMDISK
+++ b/sys/arch/vax/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.30 2008/08/18 23:19:21 miod Exp $
+# $OpenBSD: RAMDISK,v 1.31 2008/08/20 19:00:01 miod Exp $
machine vax # machine type
@@ -91,7 +91,8 @@ le0 at ibus0 # LANCE ethernet
# M-bus found on VS 3[58][24]0
fwio* at mbus0 mid ? # I/O module
-uba0 at mbus0 mid 0
+legss0 at mbus0 mid 7 # Graphics module
+uba0 at mbus0 mid 0 # Q-bus adaptor module
dz0 at fwio? # DZ-11 like serial ports
dz* at fwio? # DZ-11 (on additional fwio)
@@ -167,6 +168,7 @@ cd* at scsibus?
wsdisplay* at gpx?
wsdisplay* at lcg?
wsdisplay* at lcspx?
+wsdisplay* at legss?
wsdisplay* at smg?
#wsdisplay* at qd0
diff --git a/sys/arch/vax/dec/dzcons.c b/sys/arch/vax/dec/dzcons.c
index 3e40c7c70f8..79bac467ce9 100644
--- a/sys/arch/vax/dec/dzcons.c
+++ b/sys/arch/vax/dec/dzcons.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dzcons.c,v 1.3 2008/08/20 18:55:24 miod Exp $ */
+/* $OpenBSD: dzcons.c,v 1.4 2008/08/20 19:00:01 miod Exp $ */
/* $NetBSD: dz_ibus.c,v 1.15 1999/08/27 17:50:42 ragge Exp $ */
/*
* Copyright (c) 1998 Ludd, University of Lule}, Sweden.
@@ -50,6 +50,7 @@
#ifdef VAX60
#include <vax/mbus/mbusreg.h>
#include <vax/mbus/mbusvar.h>
+#include <vax/mbus/fwioreg.h>
#endif
#include <vax/qbus/dzreg.h>
@@ -164,12 +165,14 @@ dzcnprobe(cndev)
struct consdev *cndev;
{
extern vaddr_t iospace;
- int diagcons, major;
+ int diagcons, major, pri;
paddr_t ioaddr = 0x200a0000;
if ((major = getmajor(dzopen)) < 0)
return;
+ pri = CN_DEAD;
+
switch (vax_boardtype) {
case VAX_BTYP_410:
case VAX_BTYP_420:
@@ -194,8 +197,9 @@ dzcnprobe(cndev)
#ifdef VAX60
case VAX_BTYP_60:
- ioaddr = MBUS_SLOT_BASE(mbus_ioslot) + 0x600000;
- diagcons = 3; /* XXX force serial for now */
+ ioaddr = MBUS_SLOT_BASE(mbus_ioslot) + FWIO_DZ_REG_OFFSET;
+ diagcons = 3;
+ pri = CN_LOWPRI; /* graphics console always wins */
break;
#endif
@@ -203,7 +207,9 @@ dzcnprobe(cndev)
return;
}
- cndev->cn_pri = diagcons != 0 ? CN_HIGHPRI : CN_LOWPRI;
+ if (pri == CN_DEAD)
+ pri = diagcons != 0 ? CN_HIGHPRI : CN_LOWPRI;
+ cndev->cn_pri = pri;
cndev->cn_dev = makedev(major, dz_can_have_kbd() ? 3 : diagcons);
dz_console_regs = iospace;
ioaccess(iospace, ioaddr, 1);
diff --git a/sys/arch/vax/mbus/files.mbus b/sys/arch/vax/mbus/files.mbus
index 8b692910545..88d0de15eea 100644
--- a/sys/arch/vax/mbus/files.mbus
+++ b/sys/arch/vax/mbus/files.mbus
@@ -1,4 +1,4 @@
-# $OpenBSD: files.mbus,v 1.1 2008/08/18 23:19:25 miod Exp $
+# $OpenBSD: files.mbus,v 1.2 2008/08/20 19:00:01 miod Exp $
# VAXstation 3[58][24]0 internal bus
device mbus { [mid = -1] }
@@ -19,11 +19,15 @@ file arch/vax/mbus/if_le_fwio.c le_fwio
attach sii at fwio with sii_fwio
file arch/vax/mbus/sii_fwio.c sii_fwio
-# L2008 CQBIC
+# L2004 LEGSS video
+# (with L2005 8-plane output module and optional L2006 16-plane module)
+device legss: wsemuldisplaydev, rasops32
+attach legss at mbus
+file arch/vax/mbus/legss.c legss needs-flag
+
+# L2008 FQAM (CQBIC)
attach uba at mbus with uba_mbus
file arch/vax/mbus/uba_mbus.c uba_mbus
# L2001 or L2010 CPU
-# L2004 LEGSS video
-# (with L2005 8-plane output module and optional L2006 16-plane module)
# L2007 memory
diff --git a/sys/arch/vax/mbus/legss.c b/sys/arch/vax/mbus/legss.c
new file mode 100644
index 00000000000..3b73ce80f33
--- /dev/null
+++ b/sys/arch/vax/mbus/legss.c
@@ -0,0 +1,428 @@
+/* $OpenBSD: legss.c,v 1.1 2008/08/20 19:00:01 miod Exp $ */
+
+/*
+ * Copyright (c) 2008 Miodrag Vallat.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * LEGSS frame buffer
+ *
+ * This beast is different enough from a QDSS or a GPX to need a specific
+ * driver. Unfortunately, it is not yet known how this hardware works.
+ *
+ * The frame buffer memory is accessible linearly in 32 bit words (one
+ * per pixel, although apparently only 20 bits are writable).
+ *
+ * We currently drive the frame buffer as a monochrome, unaccelerated
+ * display.
+ *
+ * Note that the hardware probe is made easier since graphics can only
+ * exist in the last M-Bus slot, and the terminal information in the SSC
+ * will tell us whether it is properly populated or not.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+
+#include <machine/cpu.h>
+#include <machine/cvax.h>
+#include <machine/sid.h>
+
+#include <vax/mbus/mbusreg.h>
+#include <vax/mbus/mbusvar.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <dev/cons.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/rasops/rasops.h>
+#include <dev/wsfont/wsfont.h>
+
+/* Graphics can only exist at mid 7 */
+#define MID_GRAPHICS 7
+#define LEGSS_BASE MBUS_SLOT_BASE(MID_GRAPHICS)
+
+#define LEGSS_VRAM_OFFSET 0x00800000
+
+#define LEGSS_VISWIDTH 1280
+#define LEGSS_WIDTH 2048
+#define LEGSS_VISHEIGHT 1024
+#define LEGSS_HEIGHT 2048
+
+int legss_match(struct device *, void *, void *);
+void legss_attach(struct device *, struct device *, void *);
+
+struct legss_screen {
+ struct rasops_info ss_ri;
+ int ss_console;
+ u_int ss_depth;
+ vaddr_t ss_vram;
+};
+
+/* for console */
+struct legss_screen legss_consscr;
+
+struct legss_softc {
+ struct device sc_dev;
+ struct legss_screen *sc_scr;
+ int sc_nscreens;
+};
+
+struct cfattach legss_ca = {
+ sizeof(struct legss_softc), legss_match, legss_attach,
+};
+
+struct cfdriver legss_cd = {
+ NULL, "legss", DV_DULL
+};
+
+struct wsscreen_descr legss_stdscreen = {
+ "std",
+};
+
+const struct wsscreen_descr *_legss_scrlist[] = {
+ &legss_stdscreen,
+};
+
+const struct wsscreen_list legss_screenlist = {
+ sizeof(_legss_scrlist) / sizeof(struct wsscreen_descr *),
+ _legss_scrlist,
+};
+
+int legss_ioctl(void *, u_long, caddr_t, int, struct proc *);
+paddr_t legss_mmap(void *, off_t, int);
+int legss_alloc_screen(void *, const struct wsscreen_descr *,
+ void **, int *, int *, long *);
+void legss_free_screen(void *, void *);
+int legss_show_screen(void *, void *, int,
+ void (*) (void *, int, int), void *);
+
+const struct wsdisplay_accessops legss_accessops = {
+ legss_ioctl,
+ legss_mmap,
+ legss_alloc_screen,
+ legss_free_screen,
+ legss_show_screen,
+ NULL, /* load_font */
+ NULL, /* scrollback */
+ NULL, /* getchar */
+ NULL /* burner */
+};
+
+int legss_setup_screen(struct legss_screen *);
+u_int legss_probe_depth(vaddr_t);
+
+/*
+ * Autoconf glue
+ */
+
+int
+legss_match(struct device *parent, void *vcf, void *aux)
+{
+ struct mbus_attach_args *maa = (struct mbus_attach_args *)aux;
+
+ if (maa->maa_class == CLASS_GRAPHICS &&
+ maa->maa_interface == INTERFACE_FBIC &&
+ maa->maa_mid == MID_GRAPHICS)
+ return 1;
+
+ return 0;
+}
+
+void
+legss_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct legss_softc *sc = (struct legss_softc *)self;
+ struct legss_screen *scr;
+ struct wsemuldisplaydev_attach_args aa;
+ int console;
+ vaddr_t tmp;
+ extern struct consdev wsdisplay_cons;
+
+ console = (vax_confdata & 0x60) != 0 && cn_tab == &wsdisplay_cons;
+ if (console) {
+ scr = &legss_consscr;
+ sc->sc_nscreens = 1;
+ } else {
+ scr = malloc(sizeof(struct legss_screen), M_DEVBUF, M_NOWAIT);
+ if (scr == NULL) {
+ printf(": can not allocate memory\n");
+ return;
+ }
+
+ tmp = vax_map_physmem(LEGSS_BASE + LEGSS_VRAM_OFFSET, 1);
+ if (tmp == 0L) {
+ printf(": can not probe depth\n");
+ goto bad1;
+ }
+ scr->ss_depth = legss_probe_depth(tmp);
+ vax_unmap_physmem(tmp, 1);
+
+ if (scr->ss_depth == 0) {
+ printf(": unrecognized depth\n");
+ goto bad1;
+ }
+
+ scr->ss_vram = vax_map_physmem(LEGSS_BASE + LEGSS_VRAM_OFFSET,
+ (LEGSS_VISHEIGHT * LEGSS_WIDTH * 32 / NBBY) / VAX_NBPG);
+ if (scr->ss_vram == 0L) {
+ printf(": can not map frame buffer\n");
+ goto bad1;
+ }
+
+ if (legss_setup_screen(scr) != 0) {
+ printf(": initialization failed\n");
+ goto bad2;
+ }
+ }
+ sc->sc_scr = scr;
+
+ printf(": %dx%d %d plane color framebuffer\n",
+ LEGSS_VISWIDTH, LEGSS_VISHEIGHT, scr->ss_depth);
+
+ aa.console = console;
+ aa.scrdata = &legss_screenlist;
+ aa.accessops = &legss_accessops;
+ aa.accesscookie = sc;
+ aa.defaultscreens = 0;
+
+ config_found(self, &aa, wsemuldisplaydevprint);
+
+ return;
+
+bad2:
+ vax_unmap_physmem(scr->ss_vram,
+ (LEGSS_VISHEIGHT * LEGSS_WIDTH * 32 / NBBY) / VAX_NBPG);
+bad1:
+ free(scr, M_DEVBUF);
+}
+
+/*
+ * wsdisplay accessops
+ */
+
+int
+legss_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+ struct legss_softc *sc = v;
+ struct legss_screen *ss = sc->sc_scr;
+ struct wsdisplay_fbinfo *wdf;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GTYPE:
+ *(u_int *)data = 0; /* XXX WSDISPLAY_TYPE_LEGSS; */
+ break;
+
+ case WSDISPLAYIO_GINFO:
+ wdf = (struct wsdisplay_fbinfo *)data;
+ wdf->height = ss->ss_ri.ri_height;
+ wdf->width = ss->ss_ri.ri_width;
+ wdf->depth = ss->ss_depth;
+ wdf->cmsize = 0;
+ break;
+
+ case WSDISPLAYIO_LINEBYTES:
+ *(u_int *)data = LEGSS_WIDTH * 32 / NBBY;
+
+ case WSDISPLAYIO_GETCMAP:
+ case WSDISPLAYIO_PUTCMAP:
+ break;
+
+ case WSDISPLAYIO_GVIDEO:
+ case WSDISPLAYIO_SVIDEO:
+ break;
+
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+paddr_t
+legss_mmap(void *v, off_t offset, int prot)
+{
+ /* Do not allow mmap yet because of the read-only upper 12 bits */
+ return -1;
+}
+
+int
+legss_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep,
+ int *curxp, int *curyp, long *defattrp)
+{
+ struct legss_softc *sc = v;
+ struct legss_screen *ss = sc->sc_scr;
+ struct rasops_info *ri = &ss->ss_ri;
+
+ if (sc->sc_nscreens > 0)
+ return ENOMEM;
+
+ *cookiep = ri;
+ *curxp = *curyp = 0;
+ ri->ri_ops.alloc_attr(ri, 0, 0, 0, defattrp);
+ sc->sc_nscreens++;
+
+ return 0;
+}
+
+void
+legss_free_screen(void *v, void *cookie)
+{
+ struct legss_softc *sc = v;
+
+ sc->sc_nscreens--;
+}
+
+int
+legss_show_screen(void *v, void *cookie, int waitok,
+ void (*cb)(void *, int, int), void *cbarg)
+{
+ return 0;
+}
+
+int
+legss_setup_screen(struct legss_screen *ss)
+{
+ struct rasops_info *ri = &ss->ss_ri;
+
+ bzero(ri, sizeof(*ri));
+ ri->ri_depth = 32; /* masquerade as a 32 bit device for rasops */
+ ri->ri_width = LEGSS_VISWIDTH;
+ ri->ri_height = LEGSS_VISHEIGHT;
+ ri->ri_stride = LEGSS_WIDTH * 32 / NBBY;
+ ri->ri_flg = RI_FORCEMONO | RI_CENTER | RI_CLEAR;
+ ri->ri_hw = ss;
+ ri->ri_bits = (u_char *)ss->ss_vram;
+
+ /*
+ * Ask for an unholy big display, rasops will trim this to more
+ * reasonable values.
+ */
+ if (rasops_init(ri, 160, 160) != 0)
+ return -1;
+
+ legss_stdscreen.ncols = ri->ri_cols;
+ legss_stdscreen.nrows = ri->ri_rows;
+ legss_stdscreen.textops = &ri->ri_ops;
+ legss_stdscreen.fontwidth = ri->ri_font->fontwidth;
+ legss_stdscreen.fontheight = ri->ri_font->fontheight;
+ legss_stdscreen.capabilities = ri->ri_caps;
+
+ return 0;
+}
+
+u_int
+legss_probe_depth(vaddr_t vram)
+{
+ uint32_t probe;
+
+ *(volatile uint32_t *)vram = 0;
+ *(volatile uint32_t *)vram = 0xffffffff;
+ probe = *(volatile uint32_t *)vram;
+
+ /*
+ * Need to mask the upper 12 bits, they don't seem to be connected
+ * to anything and latch random bus data.
+ */
+ switch (probe & 0x000fffff) {
+ case 0x00ff:
+ return 8;
+ default:
+ return 0;
+ }
+}
+
+/*
+ * Console support code
+ */
+
+int legsscnprobe(void);
+int legsscninit(void);
+
+int
+legsscnprobe()
+{
+ extern vaddr_t virtual_avail;
+ int depth;
+
+ if (vax_boardtype != VAX_BTYP_60)
+ return 0; /* move along, nothing there */
+
+ /* no working graphics hardware, or forced serial console? */
+ if ((vax_confdata & 0x60) == 0)
+ return 0;
+
+ /*
+ * Check for a recognized color depth.
+ */
+
+ ioaccess(virtual_avail, LEGSS_BASE + LEGSS_VRAM_OFFSET, 1);
+ depth = legss_probe_depth(virtual_avail);
+ iounaccess(virtual_avail, 1);
+
+ if (depth == 0)
+ return 0; /* unsupported, default to serial */
+
+ return 1;
+}
+
+/*
+ * Called very early to setup the glass tty as console.
+ * Because it's called before the VM system is initialized, virtual memory
+ * for the framebuffer can be stolen directly without disturbing anything.
+ */
+int
+legsscninit()
+{
+ struct legss_screen *ss = &legss_consscr;
+ extern vaddr_t virtual_avail;
+ vaddr_t ova;
+ long defattr;
+ struct rasops_info *ri;
+
+ ova = virtual_avail;
+
+ ioaccess(virtual_avail, LEGSS_BASE + LEGSS_VRAM_OFFSET, 1);
+ ss->ss_depth = legss_probe_depth(virtual_avail);
+ iounaccess(virtual_avail, 1);
+ if (ss->ss_depth == 0)
+ return 1;
+
+ ioaccess(virtual_avail, LEGSS_BASE + LEGSS_VRAM_OFFSET,
+ (LEGSS_VISHEIGHT * LEGSS_WIDTH * 32 / NBBY) / VAX_NBPG);
+ ss->ss_vram = virtual_avail;
+ virtual_avail += (LEGSS_VISHEIGHT * LEGSS_WIDTH * 32 / NBBY);
+ virtual_avail = round_page(virtual_avail);
+
+ /* this had better not fail */
+ if (legss_setup_screen(ss) != 0) {
+ iounaccess(ss->ss_vram,
+ (LEGSS_VISHEIGHT * LEGSS_WIDTH * 32 / NBBY) / VAX_NBPG);
+ virtual_avail = ova;
+ return 1;
+ }
+
+ ri = &ss->ss_ri;
+ ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr);
+ wsdisplay_cnattach(&legss_stdscreen, ri, 0, 0, defattr);
+
+ return 0;
+}
diff --git a/sys/arch/vax/vax/findcpu.c b/sys/arch/vax/vax/findcpu.c
index 8b6a76f6d4d..4c5d1dab0bd 100644
--- a/sys/arch/vax/vax/findcpu.c
+++ b/sys/arch/vax/vax/findcpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: findcpu.c,v 1.13 2008/08/18 23:19:29 miod Exp $ */
+/* $OpenBSD: findcpu.c,v 1.14 2008/08/20 19:00:01 miod Exp $ */
/* $NetBSD: findcpu.c,v 1.5 1999/08/23 19:10:43 ragge Exp $ */
/*
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
@@ -38,6 +38,7 @@
#include <machine/nexus.h>
#include <machine/mtpr.h>
#include <machine/cpu.h>
+#include <machine/cvax.h>
/*
* We set up some information about the machine we're
@@ -46,8 +47,8 @@
* outside of this routine, they should be read only!
*/
int vax_cputype; /* highest byte of SID register */
-int vax_bustype; /* holds/defines all busses on this machine */
-int vax_boardtype; /* machine dependend, combination of SID and SIE */
+int vax_bustype; /* holds/defines the main bus type on this machine */
+int vax_boardtype; /* machine dependent, combination of SID and SIE */
int vax_cpudata = 0; /* contents of the SID register */
int vax_siedata = 0; /* contents of the SIE register */
@@ -112,6 +113,8 @@ findcpu(void)
break;
case VAX_BTYP_60:
+ vax_confdata =
+ ((struct cvax_ssc *)CVAX_SSC)->ssc_terminfo;
vax_bustype = VAX_MBUS;
break;
@@ -124,7 +127,6 @@ findcpu(void)
case VAX_BTYP_1305:
vax_bustype = VAX_IBUS;
break;
-
}
break;
diff --git a/sys/arch/vax/vax/wscons_machdep.c b/sys/arch/vax/vax/wscons_machdep.c
index ab24b9c71a3..77308d6a892 100644
--- a/sys/arch/vax/vax/wscons_machdep.c
+++ b/sys/arch/vax/vax/wscons_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wscons_machdep.c,v 1.5 2008/08/18 23:04:28 miod Exp $ */
+/* $OpenBSD: wscons_machdep.c,v 1.6 2008/08/20 19:00:01 miod Exp $ */
/*
* Copyright (c) 2006 Miodrag Vallat.
*
@@ -49,6 +49,7 @@
#include "gpx.h"
#include "lcg.h"
#include "lcspx.h"
+#include "legss.h"
#include "smg.h"
int (*wsfbcninit)(void) = NULL;
@@ -68,6 +69,7 @@ do { \
FRAMEBUFFER_PROTOS(gpx);
FRAMEBUFFER_PROTOS(lcg);
FRAMEBUFFER_PROTOS(lcspx);
+FRAMEBUFFER_PROTOS(legss);
FRAMEBUFFER_PROTOS(smg);
#include <dev/cons.h>
@@ -103,6 +105,9 @@ wscnprobe(struct consdev *cp)
#if NLCSPX > 0
FRAMEBUFFER_PROBE(lcspx);
#endif
+#if NLEGSS > 0
+ FRAMEBUFFER_PROBE(legss);
+#endif
#if NSMG > 0
FRAMEBUFFER_PROBE(smg);
#endif
@@ -127,6 +132,7 @@ wscninit(struct consdev *cp)
}
switch (vax_bustype) {
+ case VAX_MBUS:
case VAX_VSBUS:
#if NDZKBD > 0
dzkbd_cnattach();