summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--distrib/notes/sparc64/hardware9
-rw-r--r--share/man/man4/man4.sparc64/Makefile4
-rw-r--r--share/man/man4/man4.sparc64/agten.45
-rw-r--r--share/man/man4/man4.sparc64/bwtwo.44
-rw-r--r--share/man/man4/man4.sparc64/cgsix.44
-rw-r--r--share/man/man4/man4.sparc64/cgthree.44
-rw-r--r--share/man/man4/man4.sparc64/creator.44
-rw-r--r--share/man/man4/man4.sparc64/intro.48
-rw-r--r--share/man/man4/man4.sparc64/mgx.44
-rw-r--r--share/man/man4/man4.sparc64/rfx.44
-rw-r--r--share/man/man4/man4.sparc64/tvtwo.466
-rw-r--r--share/man/man4/man4.sparc64/vgafb.44
-rw-r--r--share/man/man4/man4.sparc64/vigra.4121
-rw-r--r--share/man/man4/man4.sparc64/zx.44
-rw-r--r--sys/arch/sparc64/conf/GENERIC6
-rw-r--r--sys/arch/sparc64/conf/RAMDISK6
-rw-r--r--sys/arch/sparc64/conf/RAMDISKU16
-rw-r--r--sys/dev/sbus/files.sbus10
-rw-r--r--sys/dev/sbus/tvtwo.c420
-rw-r--r--sys/dev/sbus/vigra.c635
20 files changed, 1309 insertions, 19 deletions
diff --git a/distrib/notes/sparc64/hardware b/distrib/notes/sparc64/hardware
index 5f384580e5b..d6d286bff86 100644
--- a/distrib/notes/sparc64/hardware
+++ b/distrib/notes/sparc64/hardware
@@ -1,4 +1,4 @@
-dnl $OpenBSD: hardware,v 1.75 2004/10/11 15:20:46 mickey Exp $
+dnl $OpenBSD: hardware,v 1.76 2004/11/29 18:12:48 miod Exp $
OpenBSD/MACHINE OSREV runs on the following classes of machines:
- SBUS based workstations:
Ultra 1
@@ -341,19 +341,24 @@ dnl PCI Alteon Tigon I/II PCI Gigabit Ethernet boards (ti)
Fujitsu AG-10e (agten) - 24-bit color, accelerated
(currently only supported in 8-bit
unaccelerated mode)
+ Parallax XVideo and PowerVideo (tvtwo) - 24-bit color,
+ accelerated (but the driver does not support
+ hardware acceleration)
RasterFlex series (rfx) - 8/24-bit color,
accelerated (currently only supported in 8-bit
unaccelerated mode)
Southland Media Systems MGX and MGXPlus (mgx) -
24-bit color, accelerated (currently only
supported in 8-bit unaccelerated mode)
+ Vigra VS10, VS11 and VS12 framebuffers (8-bit color,
+ selectable VGA-compatible modes and connector)
ZX (aka Leo) - 8/24-bit color, overlay planes,
double-buffered, 3-D acceleration
PCI video boards:
ATI Rage (vgafb), includes the on-board PGX (8 bit
color, unaccelerated) and PGX24 (24 bit color,
accelerated) framebuffers
- UPA Creator/Creator3D/Elite3D (24 bit color, unaccelerated)
+ UPA Creator/Creator3D/Elite3D (24 bit color, accelerated)
PC Cards (PCMCIA):
PCMCIA Controllers:
diff --git a/share/man/man4/man4.sparc64/Makefile b/share/man/man4/man4.sparc64/Makefile
index dc14a1d0b5f..4741e8c45e7 100644
--- a/share/man/man4/man4.sparc64/Makefile
+++ b/share/man/man4/man4.sparc64/Makefile
@@ -1,11 +1,11 @@
-# $OpenBSD: Makefile,v 1.40 2004/09/28 19:30:11 jason Exp $
+# $OpenBSD: Makefile,v 1.41 2004/11/29 18:12:50 miod Exp $
MAN= agten.4 apio.4 asio.4 audioce.4 audiocs.4 autoconf.4 auxio.4 \
be.4 beeper.4 bwtwo.4 \
central.4 cgsix.4 cgthree.4 clkbrd.4 clock.4 comkbd.4 creator.4 \
ebus.4 esp.4 fhc.4 intro.4 le.4 magma.4 mem.4 mgx.4 openprom.4 \
pcons.4 psycho.4 qe.4 qec.4 rfx.4 sab.4 schizo.4 spif.4 \
- timer.4 upa.4 uperf.4 vgafb.4 zs.4 zx.4
+ timer.4 tvtwo.4 upa.4 uperf.4 vgafb.4 vigra.4 zs.4 zx.4
MLINKS= clock.4 rtc.4 \
le.4 lebuffer.4 le.4 ledma.4 \
mem.4 kmem.4 \
diff --git a/share/man/man4/man4.sparc64/agten.4 b/share/man/man4/man4.sparc64/agten.4
index d731b60d1e1..c2220c5e54d 100644
--- a/share/man/man4/man4.sparc64/agten.4
+++ b/share/man/man4/man4.sparc64/agten.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: agten.4,v 1.3 2004/09/30 19:59:27 mickey Exp $
+.\" $OpenBSD: agten.4,v 1.4 2004/11/29 18:12:50 miod Exp $
.\" Copyright (c) 2003 Miodrag Vallat. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,9 @@ interface.
.Xr mgx 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
+.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/bwtwo.4 b/share/man/man4/man4.sparc64/bwtwo.4
index a361830b254..0a9ec03d5bd 100644
--- a/share/man/man4/man4.sparc64/bwtwo.4
+++ b/share/man/man4/man4.sparc64/bwtwo.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: bwtwo.4,v 1.9 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: bwtwo.4,v 1.10 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2002 Jason L. Wright (jason@thought.net)
.\" All rights reserved.
@@ -56,7 +56,9 @@ interface.
.Xr mgx 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/cgsix.4 b/share/man/man4/man4.sparc64/cgsix.4
index 1eaa80c6b9f..bec7a269bb2 100644
--- a/share/man/man4/man4.sparc64/cgsix.4
+++ b/share/man/man4/man4.sparc64/cgsix.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: cgsix.4,v 1.15 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: cgsix.4,v 1.16 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2001 Jason L. Wright (jason@thought.net)
.\" All rights reserved.
@@ -150,7 +150,9 @@ on the GX+.
.Xr mgx 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4 ,
diff --git a/share/man/man4/man4.sparc64/cgthree.4 b/share/man/man4/man4.sparc64/cgthree.4
index 8e5d8462664..d398670ce4b 100644
--- a/share/man/man4/man4.sparc64/cgthree.4
+++ b/share/man/man4/man4.sparc64/cgthree.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: cgthree.4,v 1.15 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: cgthree.4,v 1.16 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2001 Jason L. Wright (jason@thought.net)
.\" All rights reserved.
@@ -98,7 +98,9 @@ Note that not all models support settings other than their default setting.
.Xr mgx 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/creator.4 b/share/man/man4/man4.sparc64/creator.4
index 2ef6e20993e..ce17d90463b 100644
--- a/share/man/man4/man4.sparc64/creator.4
+++ b/share/man/man4/man4.sparc64/creator.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: creator.4,v 1.18 2004/06/21 04:43:41 miod Exp $
+.\" $OpenBSD: creator.4,v 1.19 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2002 Jason L. Wright (jason@thought.net)
.\" All rights reserved.
@@ -68,8 +68,10 @@ this acceleration can be disabled.
.Xr intro 4 ,
.Xr mgx 4 ,
.Xr rfx 4 ,
+.Xr tvtwo 4 ,
.Xr upa 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4 ,
diff --git a/share/man/man4/man4.sparc64/intro.4 b/share/man/man4/man4.sparc64/intro.4
index 72b682f9fe7..22aa36172ed 100644
--- a/share/man/man4/man4.sparc64/intro.4
+++ b/share/man/man4/man4.sparc64/intro.4
@@ -1,9 +1,9 @@
-.\" $OpenBSD: intro.4,v 1.41 2004/11/29 15:03:16 miod Exp $
+.\" $OpenBSD: intro.4,v 1.42 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2001-2002 The OpenBSD Project
.\" All Rights Reserved.
.\"
-.Dd October 4, 2001
+.Dd November 29, 2004
.Dt INTRO 4 sparc64
.Os
.Sh NAME
@@ -174,6 +174,8 @@ bridge.
Alteon Networks Tigon I and II Gigabit Ethernet driver.
.It Xr timer 4
Onboard system timer.
+.It Xr tvtwo 4
+Parallax XVideo and PowerVideo 24 bit SBus color frame buffer.
.It Xr ubsec 4
Bluesteelnet 5501/5601, Broadcom 5805/5820/5821 cryptography accelerators.
.It Xr ukbd 4
@@ -184,6 +186,8 @@ USB mouse.
Performance counters on SBUS/PCI machines.
.It Xr vgafb 4
PCI graphics frame buffer.
+.It Xr vigra 4
+8 bit SBus color framebuffer with VGA-compatible modes and connector.
.It Xr wi 4
WaveLAN/IEEE, PRISM 2-3 and Spectrum24 802.11B wireless network adapters.
.It Xr xl 4
diff --git a/share/man/man4/man4.sparc64/mgx.4 b/share/man/man4/man4.sparc64/mgx.4
index 22b8d410871..eea0ed2aadc 100644
--- a/share/man/man4/man4.sparc64/mgx.4
+++ b/share/man/man4/man4.sparc64/mgx.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: mgx.4,v 1.3 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: mgx.4,v 1.4 2004/11/29 18:12:50 miod Exp $
.\" Copyright (c) 2003 Miodrag Vallat. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -56,7 +56,9 @@ interface.
.Xr intro 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/rfx.4 b/share/man/man4/man4.sparc64/rfx.4
index 12b9e9d8b4f..67424d6aa65 100644
--- a/share/man/man4/man4.sparc64/rfx.4
+++ b/share/man/man4/man4.sparc64/rfx.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: rfx.4,v 1.4 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: rfx.4,v 1.5 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2004, Miodrag Vallat.
.\" All rights reserved.
@@ -112,7 +112,9 @@ If the jumper position is not specified, it means it has to be removed
.Xr intro 4 ,
.Xr mgx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/tvtwo.4 b/share/man/man4/man4.sparc64/tvtwo.4
new file mode 100644
index 00000000000..69e1af47dfb
--- /dev/null
+++ b/share/man/man4/man4.sparc64/tvtwo.4
@@ -0,0 +1,66 @@
+.\" $OpenBSD: tvtwo.4,v 1.1 2004/11/29 18:12:50 miod Exp $
+.\" Copyright (c) 2003 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.
+.\"
+.Dd November 29, 2004
+.Dt TVTWO 4 sparc64
+.Os
+.Sh NAME
+.Nm tvtwo
+.Nd accelerated 24-bit color frame buffer
+.Sh SYNOPSIS
+.Cd "tvtwo* at sbus?"
+.Cd "wsdisplay* at tvtwo?"
+.Sh DESCRIPTION
+The
+.Nm
+is a memory based color frame buffer, with graphics acceleration
+and overlay capabilities, and hardware MPEG decoding.
+.Pp
+The
+.Nm
+driver interfaces the frame buffer to 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 agten 4 ,
+.Xr bwtwo 4 ,
+.Xr cgsix 4 ,
+.Xr cgthree 4 ,
+.Xr creator 4 ,
+.Xr intro 4 ,
+.Xr mgx 4 ,
+.Xr rfx 4 ,
+.Xr sbus 4 ,
+.Xr vgafb 4 ,
+.Xr vigra 4 ,
+.Xr wscons 4 ,
+.Xr wsdisplay 4 ,
+.Xr zx 4
+.Sh CAVEATS
+This driver does not support any acceleration features at the moment.
+Thus, vertical scrolling in console mode is abysmally slow in 24 bit mode.
diff --git a/share/man/man4/man4.sparc64/vgafb.4 b/share/man/man4/man4.sparc64/vgafb.4
index d346a3da724..3d04667dc12 100644
--- a/share/man/man4/man4.sparc64/vgafb.4
+++ b/share/man/man4/man4.sparc64/vgafb.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: vgafb.4,v 1.10 2004/09/30 19:59:28 mickey Exp $
+.\" $OpenBSD: vgafb.4,v 1.11 2004/11/29 18:12:50 miod Exp $
.\"
.\" Copyright (c) 2002 Jason L. Wright (jason@thought.net)
.\" All rights reserved.
@@ -56,6 +56,8 @@ accelerated access methods are provided to
.Xr mgx 4 ,
.Xr pci 4 ,
.Xr rfx 4 ,
+.Xr tvtwo 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4 ,
.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/vigra.4 b/share/man/man4/man4.sparc64/vigra.4
new file mode 100644
index 00000000000..3b7c706f926
--- /dev/null
+++ b/share/man/man4/man4.sparc64/vigra.4
@@ -0,0 +1,121 @@
+.\" $OpenBSD: vigra.4,v 1.1 2004/11/29 18:12:50 miod Exp $
+.\" Copyright (c) 2002 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.
+.\"
+.Dd November 29, 2004
+.Dt VIGRA 4 sparc64
+.Os
+.Sh NAME
+.Nm vigra
+.Nd 8-bit SBus color frame buffer with VGA-compatible modes
+.Sh SYNOPSIS
+.Cd "vigra* at sbus?"
+.Cd "wsdisplay* at vigra?"
+.Sh DESCRIPTION
+The
+.Tn "Vigra VS10, VS11 and VS12"
+are 8 bit color frame buffers with user-selectable video modes, and a
+VGA-compatible connector.
+.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.
+.Pp
+The video resolution and signal synchronization modes are
+selected with four dip switches on the back of the card.
+.Ss VS10 and VS12 Switch Settings:
+The VS10 and VS12 support the following basic modes:
+.Bl -column "Switches" "Resolution" "Refresh"
+.It Li Switches Ta Resolution Ta Refresh Ta Description
+.It Li "1 2 3 4" Ta "" Ta "Rate"
+.It " "
+.It Li "D D D D" Ta 640x480 Ta 60Hz Ta "Standard VGA, negative separate sync"
+.It Li "U D D D" Ta 800x600 Ta 56Hz Ta "Super VGA, negative separate sync"
+.It Li "D U D D" Ta 800x600 Ta 56Hz Ta "Super VGA, positive separate sync"
+.It Li "U U D D" Ta 1024x768 Ta 60Hz Ta "Super VGA, negative separate sync"
+.It Li "D D U D" Ta 1024x768 Ta 60Hz Ta "Super VGA, composite sync"
+.It Li "U D U D" Ta 1024x768 Ta 60Hz Ta "Super VGA, sync-on-green"
+.It Li "D U U D" Ta 1024x768 Ta 66Hz Ta "Sun 386i, composite sync"
+.It Li "U U U D" Ta 1152x900 Ta 76Hz Ta "Sun SPARCstation, composite sync"
+.It Li "D D D U" Ta 1152x900 Ta 61.5Hz Ta "NEC 4D, composite sync"
+.It Li "U D D U" Ta 1152x900 Ta 66Hz Ta "Sun SPARCstation, composite sync"
+.It Li "D U D U" Ta 800x600 Ta 60Hz Ta "VESA, negative separate sync"
+.It Li "U U D U" Ta 800x600 Ta 72Hz Ta "VESA, negative separate sync"
+.El
+.Ss VS12-only Switch Settings:
+The VS12 supports all of the previously listed modes, as well as a few high
+resolution settings.
+.Bl -column "Switches" "Resolution" "Refresh"
+.It Li Switches Ta Resolution Ta Refresh Ta Description
+.It Li "1 2 3 4" Ta "" Ta "Rate"
+.It " "
+.It Li "D D U U" Ta 1280x1024 Ta 60Hz Ta "NEC xD, negative separate sync"
+.It Li "U D U U" Ta 1280x1024 Ta 60Hz Ta "NEC xD, composite sync"
+.It Li "D U U U" Ta 1280x1024 Ta 60Hz Ta "NEC xD, sync-on-green"
+.It Li "U U U U" Ta 1280x1024 Ta 67Hz Ta "Sun SPARCstation, composite sync"
+.El
+.Ss VS11 Switch Settings:
+The VS11 supports a similar set of modes as the VS12, but with higher refresh
+rates.
+.Bl -column "Switches" "Resolution" "Refresh"
+.It Li Switches Ta Resolution Ta Refresh Ta Description
+.It Li "1 2 3 4" Ta "" Ta "Rate"
+.It " "
+.It Li "D D D D" Ta 640x480 Ta 60Hz Ta "Standard VGA, negative separate sync"
+.It Li "U D D D" Ta 800x600 Ta 72Hz Ta "VESA, negative separate sync"
+.It Li "D U D D" Ta 1024x768 Ta 60Hz Ta "VESA, negative separate sync"
+.It Li "U U D D" Ta 1024x768 Ta 60Hz Ta "VESA, composite sync"
+.It Li "D D U D" Ta 1024x768 Ta 60Hz Ta "VESA, sync-on-green"
+.It Li "U D U D" Ta 1024x768 Ta 66Hz Ta "Sun 386i, composite sync"
+.It Li "D U U D" Ta 1152x900 Ta 66Hz Ta "Sun SPARCstation, composite sync"
+.It Li "U U U D" Ta 1152x900 Ta 76Hz Ta "Sun SPARCstation, composite sync"
+.It Li "D D D U" Ta 1280x1024 Ta 67Hz Ta "Sun SPARCstation, composite sync"
+.It Li "U D D U" Ta 1280x1024 Ta 60Hz Ta "NEC xFG, negative separate sync"
+.It Li "D U D U" Ta 1280x1024 Ta 60Hz Ta "NEC xFG, composite sync"
+.It Li "U U D U" Ta 1280x1024 Ta 60Hz Ta "NEC xFG, sync-on-green"
+.It Li "D D U U" Ta 1280x1024 Ta 74Hz Ta "NEC xFG, composite sync"
+.It Li "U D U U" Ta 1280x1024 Ta 74Hz Ta "NEC xFG, sync-on-green"
+.It Li "D U U U" Ta 1280x1024 Ta 72Hz Ta "HP A1097, composite sync"
+.It Li "U U U U" Ta 1280x1024 Ta 72Hz Ta "Special, composite sync"
+.El
+.Sh SEE ALSO
+.Xr agten 4 ,
+.Xr bwtwo 4 ,
+.Xr cgsix 4 ,
+.Xr cgthree 4 ,
+.Xr creator 4 ,
+.Xr intro 4 ,
+.Xr mgx 4 ,
+.Xr rfx 4 ,
+.Xr sbus 4 ,
+.Xr tvtwo 4 ,
+.Xr vgafb 4 ,
+.Xr wscons 4 ,
+.Xr wsdisplay 4 ,
+.Xr zx 4
diff --git a/share/man/man4/man4.sparc64/zx.4 b/share/man/man4/man4.sparc64/zx.4
index 834d46c18f1..851af45f49e 100644
--- a/share/man/man4/man4.sparc64/zx.4
+++ b/share/man/man4/man4.sparc64/zx.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: zx.4,v 1.6 2004/11/29 15:03:58 miod Exp $
+.\" $OpenBSD: zx.4,v 1.7 2004/11/29 18:12:50 miod Exp $
.\" Copyright (c) 2003 Miodrag Vallat. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -99,7 +99,9 @@ The selected resolutions are:
.Xr mgx 4 ,
.Xr rfx 4 ,
.Xr sbus 4 ,
+.Xr tvtwo 4 ,
.Xr vgafb 4 ,
+.Xr vigra 4 ,
.Xr wscons 4 ,
.Xr wsdisplay 4
.Sh CAVEATS
diff --git a/sys/arch/sparc64/conf/GENERIC b/sys/arch/sparc64/conf/GENERIC
index c0e0dfc53d1..6562bdac0df 100644
--- a/sys/arch/sparc64/conf/GENERIC
+++ b/sys/arch/sparc64/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.109 2004/11/12 18:07:42 deraadt Exp $
+# $OpenBSD: GENERIC,v 1.110 2004/11/29 18:12:50 miod Exp $
# $NetBSD: GENERIC32,v 1.18 2001/07/20 00:07:12 eeh Exp $
machine sparc64
@@ -286,6 +286,10 @@ mgx* at sbus? # SMS MGX/MGXPlus framebuffer
wsdisplay* at mgx?
agten* at sbus? # Fujitsu AG-10e framebuffer
wsdisplay* at agten?
+tvtwo* at sbus? # Parallax XVideo/PowerVideo framebuffer
+wsdisplay* at tvtwo?
+vigra* at sbus? # Viagra framebuffer series
+wsdisplay* at vigra?
creator* at mainbus0
creator* at upa0
wsdisplay* at creator?
diff --git a/sys/arch/sparc64/conf/RAMDISK b/sys/arch/sparc64/conf/RAMDISK
index d9e2a36a0ef..c6fbad847b3 100644
--- a/sys/arch/sparc64/conf/RAMDISK
+++ b/sys/arch/sparc64/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.34 2004/10/20 23:11:01 miod Exp $
+# $OpenBSD: RAMDISK,v 1.35 2004/11/29 18:12:50 miod Exp $
# Machine architecture; required by config(8)
machine sparc64
@@ -178,6 +178,10 @@ mgx* at sbus? # SMS MGX/MGXPlus framebuffer
wsdisplay* at mgx?
agten* at sbus? # Fujitsu AG-10e framebuffer
wsdisplay* at agten?
+tvtwo* at sbus? # Parallax XVideo/PowerVideo framebuffer
+wsdisplay* at tvtwo?
+vigra* at sbus? # Viagra framebuffer series
+wsdisplay* at vigra?
creator* at mainbus0
creator* at upa0
wsdisplay* at creator?
diff --git a/sys/arch/sparc64/conf/RAMDISKU1 b/sys/arch/sparc64/conf/RAMDISKU1
index c809a14dc58..8af407452c0 100644
--- a/sys/arch/sparc64/conf/RAMDISKU1
+++ b/sys/arch/sparc64/conf/RAMDISKU1
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISKU1,v 1.11 2004/10/20 23:11:01 miod Exp $
+# $OpenBSD: RAMDISKU1,v 1.12 2004/11/29 18:12:50 miod Exp $
# Machine architecture; required by config(8)
machine sparc64
@@ -96,6 +96,10 @@ mgx* at sbus? # SMS MGX/MGXPlus framebuffer
wsdisplay* at mgx?
agten* at sbus? # Fujitsu AG-10e framebuffer
wsdisplay* at agten?
+tvtwo* at sbus? # Parallax XVideo/PowerVideo framebuffer
+wsdisplay* at tvtwo?
+vigra* at sbus? # Viagra framebuffer series
+wsdisplay* at vigra?
creator* at mainbus0
wsdisplay* at creator?
diff --git a/sys/dev/sbus/files.sbus b/sys/dev/sbus/files.sbus
index c112b358c2d..08b89e1415e 100644
--- a/sys/dev/sbus/files.sbus
+++ b/sys/dev/sbus/files.sbus
@@ -1,4 +1,4 @@
-# $OpenBSD: files.sbus,v 1.27 2004/06/21 04:41:10 miod Exp $
+# $OpenBSD: files.sbus,v 1.28 2004/11/29 18:12:51 miod Exp $
# $NetBSD: files.sbus,v 1.16 2000/12/08 17:29:12 martin Exp $
#
# Config file and device description for machine-independent SBUS code.
@@ -80,6 +80,14 @@ device agten: wsemuldisplaydev, rasops8, wsemul_sun
attach agten at sbus
file dev/sbus/agten.c agten
+device tvtwo: wsemuldisplaydev, rasops32, wsemul_sun
+attach tvtwo at sbus
+file dev/sbus/tvtwo.c tvtwo
+
+device vigra: wsemuldisplaydev, rasops8, wsemul_sun
+attach vigra at sbus
+file dev/sbus/vigra.c vigra
+
device magma {}
attach magma at sbus
device mtty
diff --git a/sys/dev/sbus/tvtwo.c b/sys/dev/sbus/tvtwo.c
new file mode 100644
index 00000000000..09953b6445c
--- /dev/null
+++ b/sys/dev/sbus/tvtwo.c
@@ -0,0 +1,420 @@
+/* $OpenBSD: tvtwo.c,v 1.1 2004/11/29 18:12:51 miod Exp $ */
+/*
+ * Copyright (c) 2003, 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.
+ *
+ */
+
+/*
+ * Driver for the Parallax XVideo and PowerVideo graphics boards.
+ *
+ * Some details about these board are available at:
+ * http://www.jlw.com/~woolsey/parallax/support/developers/xvideotech.html
+ */
+
+/*
+ * The Parallax XVideo series frame buffers are 8/24-bit accelerated
+ * frame buffers, with hardware MPEG capabilities using a CCube chipset.
+ */
+
+/*
+ * Currently, this driver can only handle the 24-bit plane of the frame
+ * buffer, in an unaccelerated mode.
+ *
+ * TODO:
+ * - nvram handling
+ * - use the accelerator
+ * - interface to the c^3
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/buf.h>
+#include <sys/device.h>
+#include <sys/ioctl.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/tty.h>
+#include <sys/conf.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/autoconf.h>
+#include <machine/bus.h>
+#include <machine/pmap.h>
+#include <machine/cpu.h>
+#include <machine/conf.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/wscons/wscons_raster.h>
+#include <dev/rasops/rasops.h>
+#include <machine/fbvar.h>
+
+#include <dev/sbus/sbusvar.h>
+
+/*
+ * The memory layout of the board is as follows:
+ *
+ * PROM0 000000 - 00ffff
+ * overlay plane 010000 - 037fff
+ * registers 040000 - 0404d0
+ * CCube 050000 - 05ffff
+ * 8-bit plane 080000 - 17ffff
+ * 24-bit plane 200000 - 6fffff
+ * PROM1 7f0000 - 7fffff
+ *
+ * All of this is mapped using only one register (except for older models
+ * which are not currently supported).
+ * At PROM initialization, the board will be in 24-bit mode, so no specific
+ * initialization is necessary.
+ */
+
+#define PX_PROM0_OFFSET 0x000000
+#define PX_OVERAY_OFFSET 0x010000
+#define PX_REG_OFFSET 0x040000
+#define PX_CCUBE_OFFSET 0x050000
+#define PX_PLANE8_OFFSET 0x080000
+#define PX_PLANE24_OFFSET 0x200000
+#define PX_PROM1_OFFSET 0x7f0000
+
+/*
+ * Partial registers layout
+ */
+
+#define PX_REG_DISPKLUDGE 0x00b8 /* write only */
+#define DISPKLUDGE_DEFAULT 0xc41f
+#define DISPKLUDGE_BLANK (1 << 12)
+
+#define PX_REG_BT463 0x0480
+
+#define PX_REG_SIZE 0x04d0
+
+
+/* per-display variables */
+struct tvtwo_softc {
+ struct sunfb sc_sunfb; /* common base device */
+ struct sbusdev sc_sd; /* sbus device */
+
+ bus_space_tag_t sc_bustag;
+ bus_addr_t sc_paddr;
+
+ volatile u_int8_t *sc_regs;
+
+ int sc_nscreens;
+};
+
+struct wsscreen_descr tvtwo_stdscreen = {
+ "std",
+};
+
+const struct wsscreen_descr *tvtwo_scrlist[] = {
+ &tvtwo_stdscreen,
+};
+
+struct wsscreen_list tvtwo_screenlist = {
+ sizeof(tvtwo_scrlist) / sizeof(struct wsscreen_descr *),
+ tvtwo_scrlist
+};
+
+int tvtwo_ioctl(void *, u_long, caddr_t, int, struct proc *);
+int tvtwo_alloc_screen(void *, const struct wsscreen_descr *, void **,
+ int *, int *, long *);
+void tvtwo_free_screen(void *, void *);
+int tvtwo_show_screen(void *, void *, int, void (*cb)(void *, int, int),
+ void *);
+paddr_t tvtwo_mmap(void *, off_t, int);
+void tvtwo_burner(void *, u_int, u_int);
+
+static __inline__ void tvtwo_ramdac_wraddr(struct tvtwo_softc *sc,
+ u_int32_t addr);
+void tvtwo_initcmap(struct tvtwo_softc *);
+
+struct wsdisplay_accessops tvtwo_accessops = {
+ tvtwo_ioctl,
+ tvtwo_mmap,
+ tvtwo_alloc_screen,
+ tvtwo_free_screen,
+ tvtwo_show_screen,
+ NULL, /* load_font */
+ NULL, /* scrollback */
+ NULL, /* getchar */
+ tvtwo_burner,
+};
+
+int tvtwomatch(struct device *, void *, void *);
+void tvtwoattach(struct device *, struct device *, void *);
+
+struct cfattach tvtwo_ca = {
+ sizeof(struct tvtwo_softc), tvtwomatch, tvtwoattach
+};
+
+struct cfdriver tvtwo_cd = {
+ NULL, "tvtwo", DV_DULL
+};
+
+/*
+ * Default frame buffer resolution, depending upon the "freqcode"
+ */
+const int defwidth[] = { 1152, 1152, 1152, 1024, 640, 1024 };
+const int defheight[] = { 900, 900, 900, 768, 480, 1024 };
+
+/*
+ * Match an XVideo or PowerVideo card.
+ */
+int
+tvtwomatch(struct device *parent, void *vcf, void *aux)
+{
+ struct sbus_attach_args *sa = aux;
+
+ if (strcmp(sa->sa_name, "PGI,tvtwo") != 0)
+ return (0);
+
+ return (1);
+}
+
+/*
+ * Attach a display.
+ */
+void
+tvtwoattach(struct device *parent, struct device *self, void *args)
+{
+ struct tvtwo_softc *sc = (struct tvtwo_softc *)self;
+ struct sbus_attach_args *sa = args;
+ struct wsemuldisplaydev_attach_args waa;
+ bus_space_tag_t bt;
+ bus_space_handle_t bh;
+ int node, width, height, freqcode;
+ int isconsole;
+ char *freqstring;
+
+ bt = sa->sa_bustag;
+ node = sa->sa_node;
+
+ printf(": %s", getpropstring(node, "model"));
+ printf(", revision %s\n", getpropstring(node, "revision"));
+
+ /* We do not know how to handle older boards. */
+ if (sa->sa_nreg != 1) {
+ printf("%s: old-style boards with %d registers are not supported\n",
+ self->dv_xname, sa->sa_nreg);
+ return;
+ }
+
+ isconsole = node == fbnode;
+
+ /* Map registers. */
+ sc->sc_bustag = bt;
+ if (sbus_bus_map(bt, sa->sa_slot, sa->sa_offset + PX_REG_OFFSET,
+ PX_REG_SIZE, BUS_SPACE_MAP_LINEAR, 0, &bh) != 0) {
+ printf("%s: couldn't map registers\n", self->dv_xname);
+ return;
+ }
+ sc->sc_regs = bus_space_vaddr(bt, bh);
+
+ /* Compute framebuffer size. */
+ freqstring = getpropstring(node, "freqcode");
+ freqcode = (int)*freqstring;
+ if (freqcode == 'g')
+ freqcode = '6';
+ if (freqcode < '1' || freqcode > '6')
+ freqcode = 0;
+ else
+ freqcode -= '1';
+
+ width = getpropint(node, "hres", defwidth[freqcode]);
+ height = getpropint(node, "vres", defheight[freqcode]);
+ fb_setsize(&sc->sc_sunfb, 32, width, height,
+ node, 0);
+
+ /* Map the frame buffer memory area we're interested in. */
+ sc->sc_paddr = sbus_bus_addr(bt, sa->sa_slot, sa->sa_offset);
+ if (sbus_bus_map(bt, sa->sa_slot, sa->sa_offset + PX_PLANE24_OFFSET,
+ round_page(sc->sc_sunfb.sf_fbsize), BUS_SPACE_MAP_LINEAR, 0,
+ &bh) != 0) {
+ printf("%s: couldn't map video memory\n", self->dv_xname);
+ return;
+ }
+ sc->sc_sunfb.sf_ro.ri_bits = bus_space_vaddr(bt, bh);
+
+ /* Initialize a direct color map. */
+ tvtwo_initcmap(sc);
+
+ sc->sc_sunfb.sf_ro.ri_hw = sc;
+ fbwscons_init(&sc->sc_sunfb, isconsole ? 0 : RI_CLEAR);
+
+ tvtwo_stdscreen.capabilities = sc->sc_sunfb.sf_ro.ri_caps;
+ tvtwo_stdscreen.nrows = sc->sc_sunfb.sf_ro.ri_rows;
+ tvtwo_stdscreen.ncols = sc->sc_sunfb.sf_ro.ri_cols;
+ tvtwo_stdscreen.textops = &sc->sc_sunfb.sf_ro.ri_ops;
+
+ printf("%s: %dx%d\n", self->dv_xname,
+ sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height);
+
+ if (isconsole) {
+ fbwscons_console_init(&sc->sc_sunfb,
+ &tvtwo_stdscreen, -1, NULL);
+ }
+
+ sbus_establish(&sc->sc_sd, &sc->sc_sunfb.sf_dev);
+
+ waa.console = isconsole;
+ waa.scrdata = &tvtwo_screenlist;
+ waa.accessops = &tvtwo_accessops;
+ waa.accesscookie = sc;
+ config_found(self, &waa, wsemuldisplaydevprint);
+}
+
+int
+tvtwo_ioctl(void *dev, u_long cmd, caddr_t data, int flags, struct proc *p)
+{
+ struct tvtwo_softc *sc = dev;
+ struct wsdisplay_fbinfo *wdf;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GTYPE:
+ *(u_int *)data = WSDISPLAY_TYPE_SUN24;
+ break;
+ case WSDISPLAYIO_GINFO:
+ wdf = (struct wsdisplay_fbinfo *)data;
+ wdf->height = sc->sc_sunfb.sf_height;
+ wdf->width = sc->sc_sunfb.sf_width;
+ wdf->depth = sc->sc_sunfb.sf_depth;
+ wdf->cmsize = 0;
+ break;
+ case WSDISPLAYIO_LINEBYTES:
+ *(u_int *)data = sc->sc_sunfb.sf_linebytes;
+ break;
+
+ case WSDISPLAYIO_GETCMAP:
+ case WSDISPLAYIO_PUTCMAP:
+ break;
+
+ case WSDISPLAYIO_SVIDEO:
+ case WSDISPLAYIO_GVIDEO:
+ case WSDISPLAYIO_GCURPOS:
+ case WSDISPLAYIO_SCURPOS:
+ case WSDISPLAYIO_GCURMAX:
+ case WSDISPLAYIO_GCURSOR:
+ case WSDISPLAYIO_SCURSOR:
+ default:
+ return (-1);
+ }
+
+ return (0);
+}
+
+/*
+ * Return the address that would map the given device at the given
+ * offset, allowing for the given protection, or return -1 for error.
+ */
+paddr_t
+tvtwo_mmap(void *v, off_t offset, int prot)
+{
+ struct tvtwo_softc *sc = v;
+
+ if (offset & PGOFSET)
+ return (-1);
+
+ /* Allow mapping as a dumb framebuffer from offset 0 */
+ if (offset >= 0 && offset < sc->sc_sunfb.sf_fbsize) {
+ return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
+ PX_PLANE24_OFFSET + offset, prot, BUS_SPACE_MAP_LINEAR));
+ }
+
+ return (-1);
+}
+
+int
+tvtwo_alloc_screen(void *v, const struct wsscreen_descr *type,
+ void **cookiep, int *curxp, int *curyp, long *attrp)
+{
+ struct tvtwo_softc *sc = v;
+
+ if (sc->sc_nscreens > 0)
+ return (ENOMEM);
+
+ *cookiep = &sc->sc_sunfb.sf_ro;
+ *curyp = 0;
+ *curxp = 0;
+ sc->sc_sunfb.sf_ro.ri_ops.alloc_attr(&sc->sc_sunfb.sf_ro,
+ 0, 0, 0, attrp);
+ sc->sc_nscreens++;
+ return (0);
+}
+
+void
+tvtwo_free_screen(void *v, void *cookie)
+{
+ struct tvtwo_softc *sc = v;
+
+ sc->sc_nscreens--;
+}
+
+int
+tvtwo_show_screen(void *v, void *cookie, int waitok,
+ void (*cb)(void *, int, int), void *cbarg)
+{
+ return (0);
+}
+
+/*
+ * Simple Bt463 programming routines.
+ */
+
+static __inline__ void
+tvtwo_ramdac_wraddr(struct tvtwo_softc *sc, u_int32_t addr)
+{
+ volatile u_int32_t *dac = (u_int32_t *)(sc->sc_regs + PX_REG_BT463);
+
+ dac[0] = (addr & 0xff); /* lo addr */
+ dac[1] = ((addr >> 8) & 0xff); /* hi addr */
+}
+
+void
+tvtwo_initcmap(struct tvtwo_softc *sc)
+{
+ volatile u_int32_t *dac = (u_int32_t *)(sc->sc_regs + PX_REG_BT463);
+ u_int32_t c;
+
+ tvtwo_ramdac_wraddr(sc, 0);
+ for (c = 0; c < 256; c++) {
+ dac[3] = c; /* R */
+ dac[3] = c; /* G */
+ dac[3] = c; /* B */
+ }
+}
+
+void
+tvtwo_burner(void *v, u_int on, u_int flags)
+{
+ struct tvtwo_softc *sc = v;
+ volatile u_int32_t *dispkludge =
+ (u_int32_t *)(sc->sc_regs + PX_REG_DISPKLUDGE);
+
+ if (on)
+ *dispkludge = DISPKLUDGE_DEFAULT & ~DISPKLUDGE_BLANK;
+ else
+ *dispkludge = DISPKLUDGE_DEFAULT | DISPKLUDGE_BLANK;
+}
diff --git a/sys/dev/sbus/vigra.c b/sys/dev/sbus/vigra.c
new file mode 100644
index 00000000000..e95adc697c5
--- /dev/null
+++ b/sys/dev/sbus/vigra.c
@@ -0,0 +1,635 @@
+/* $OpenBSD: vigra.c,v 1.1 2004/11/29 18:12:51 miod Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003, 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.
+ *
+ */
+
+/*
+ * Driver for the Vigra VS series of SBus framebuffers.
+ *
+ * The VS10, VS11 and VS12 models are supported. VS10-EK should also work
+ * (but it might be driven by the regular cgthree driver?)
+ *
+ * The monochrome VS14, 16 grays VS15, and color VS18 are not supported.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/buf.h>
+#include <sys/device.h>
+#include <sys/ioctl.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/tty.h>
+#include <sys/conf.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/autoconf.h>
+#include <machine/bus.h>
+#include <machine/pmap.h>
+#include <machine/cpu.h>
+#include <machine/conf.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/wscons/wscons_raster.h>
+#include <dev/rasops/rasops.h>
+#include <machine/fbvar.h>
+
+#include <dev/sbus/sbusvar.h>
+
+/*
+ * The hardware information below has been gathered through experiments, as
+ * well as the debug information of the SunOS 4.x vigfb driver.
+ */
+
+/*
+ * Control and status registers
+ */
+
+struct csregs {
+ u_int32_t sosr;
+ u_int32_t g3rr;
+ u_int32_t bcr; /* board control register */
+ u_int32_t spr;
+ u_int32_t g3sr; /* ramdac status register */
+#define STATUS_INTR 0x0001
+ u_int32_t imr; /* interrupt mode register */
+ u_int32_t ewcr;
+ u_int32_t ssr;
+};
+
+/*
+ * G300 layout
+ */
+
+struct g300dac {
+ u_int32_t cmap[256];
+ u_int32_t g3null;
+ u_int32_t unused1[32];
+ u_int32_t half_sync;
+ u_int32_t back_porch;
+ u_int32_t display;
+ u_int32_t short_display;
+ u_int32_t broad_pulse;
+ u_int32_t vsync;
+ u_int32_t vblank;
+ u_int32_t vdisplay;
+ u_int32_t line_time;
+ u_int32_t tos1;
+ u_int32_t mem_init;
+ u_int32_t transfer_delay;
+ u_int32_t unused2[19];
+ u_int32_t mask;
+ u_int32_t unused3[31];
+ u_int32_t cr;
+ u_int32_t unused4[31];
+ u_int32_t tos2;
+ u_int32_t unused5[31];
+ u_int32_t boot_location;
+};
+
+/*
+ * G335 layout
+ */
+
+struct g335dac {
+ u_int32_t boot_location;
+ u_int32_t unused1[32];
+ u_int32_t half_sync;
+ u_int32_t back_porch;
+ u_int32_t display;
+ u_int32_t short_display;
+ u_int32_t broad_pulse;
+ u_int32_t vsync;
+ u_int32_t vpre_equalize;
+ u_int32_t vpost_equalize;
+ u_int32_t vblank;
+ u_int32_t vdisplay;
+ u_int32_t line_time;
+ u_int32_t tos1;
+ u_int32_t mem_init;
+ u_int32_t transfer_delay;
+ u_int32_t unused2[17];
+ u_int32_t mask;
+ u_int32_t unused3[31];
+ u_int32_t cra;
+ u_int32_t unused4[15];
+ u_int32_t crb;
+ u_int32_t unused5[15];
+ u_int32_t tos2;
+ u_int32_t unused6[32];
+ u_int32_t cursor_palette[3];
+ u_int32_t unused7[28];
+ u_int32_t checksum[3];
+ u_int32_t unused8[4];
+ u_int32_t cursor_position;
+ u_int32_t unused9[56];
+ u_int32_t cmap[256];
+ u_int32_t cursor_store[512];
+};
+
+union dac {
+ struct g300dac g300;
+ struct g335dac g335;
+};
+
+/*
+ * SBUS register mappings
+ */
+#define VIGRA_REG_RAMDAC 1 /* either G300 or G335 */
+#define VIGRA_REG_CSR 2
+#define VIGRA_REG_VRAM 3
+
+#define VIGRA_NREG 4
+
+union vigracmap {
+ u_char cm_map[256][4]; /* 256 R/G/B entries plus pad */
+ u_int32_t cm_chip[256]; /* the way the chip gets loaded */
+};
+
+/* per-display variables */
+struct vigra_softc {
+ struct sunfb sc_sunfb; /* common base part */
+ struct sbusdev sc_sd; /* sbus device */
+ bus_space_tag_t sc_bustag;
+ bus_addr_t sc_paddr;
+ volatile struct csregs *sc_regs;/* control registers */
+ volatile union dac *sc_ramdac; /* ramdac registers */
+ union vigracmap sc_cmap; /* current colormap */
+ int sc_g300;
+ void *sc_ih;
+ int sc_nscreens;
+};
+
+struct wsscreen_descr vigra_stdscreen = {
+ "std",
+};
+
+const struct wsscreen_descr *vigra_scrlist[] = {
+ &vigra_stdscreen,
+};
+
+struct wsscreen_list vigra_screenlist = {
+ sizeof(vigra_scrlist) / sizeof(struct wsscreen_descr *),
+ vigra_scrlist
+};
+
+int vigra_ioctl(void *, u_long, caddr_t, int, struct proc *);
+int vigra_alloc_screen(void *, const struct wsscreen_descr *, void **,
+ int *, int *, long *);
+void vigra_free_screen(void *, void *);
+int vigra_show_screen(void *, void *, int, void (*cb)(void *, int, int),
+ void *);
+paddr_t vigra_mmap(void *, off_t, int);
+void vigra_setcolor(void *, u_int, u_int8_t, u_int8_t, u_int8_t);
+int vigra_getcmap(union vigracmap *, struct wsdisplay_cmap *, int);
+int vigra_putcmap(union vigracmap *, struct wsdisplay_cmap *, int);
+void vigra_loadcmap_immediate(struct vigra_softc *, int, int);
+static __inline__ void vigra_loadcmap_deferred(struct vigra_softc *,
+ u_int, u_int);
+void vigra_burner(void *, u_int, u_int);
+int vigra_intr(void *);
+
+struct wsdisplay_accessops vigra_accessops = {
+ vigra_ioctl,
+ vigra_mmap,
+ vigra_alloc_screen,
+ vigra_free_screen,
+ vigra_show_screen,
+ NULL, /* load_font */
+ NULL, /* scrollback */
+ NULL, /* getchar */
+ vigra_burner,
+};
+
+int vigramatch(struct device *, void *, void *);
+void vigraattach(struct device *, struct device *, void *);
+
+struct cfattach vigra_ca = {
+ sizeof (struct vigra_softc), vigramatch, vigraattach
+};
+
+struct cfdriver vigra_cd = {
+ NULL, "vigra", DV_DULL
+};
+
+/*
+ * Match a supported vigra card.
+ */
+int
+vigramatch(struct device *parent, void *vcf, void *aux)
+{
+ struct sbus_attach_args *sa = aux;
+
+ if (strcmp("vs10", sa->sa_name) != 0 &&
+ strcmp("vs11", sa->sa_name) != 0 &&
+ strcmp("vs12", sa->sa_name) != 0)
+ return (0);
+
+ return (1);
+}
+
+/*
+ * Attach and initialize a vigra display, as well as a child wsdisplay.
+ */
+void
+vigraattach(struct device *parent, struct device *self, void *args)
+{
+ struct vigra_softc *sc = (struct vigra_softc *)self;
+ struct sbus_attach_args *sa = args;
+ struct wsemuldisplaydev_attach_args waa;
+ bus_space_tag_t bt;
+ bus_space_handle_t bh;
+ int node, row, isconsole = 0;
+ char *nam;
+
+ bt = sa->sa_bustag;
+ node = sa->sa_node;
+ nam = getpropstring(node, "model");
+ if (*nam == '\0')
+ nam = (char *)sa->sa_name;
+ printf(": %s", nam);
+
+ isconsole = node == fbnode;
+
+ if (sa->sa_nreg < VIGRA_NREG) {
+ printf("\n%s: expected %d registers, got %d",
+ self->dv_xname, VIGRA_NREG, sa->sa_nreg);
+ return;
+ }
+
+ /*
+ * Check whether we are using an G300 or an G335 chip.
+ * The VS10 and VS12 use the G300, while the VS11 uses a G335.
+ */
+ sc->sc_g300 = strncmp(nam, "VIGRA,vs11", strlen("VIGRA,vs11"));
+
+ sc->sc_bustag = bt;
+ if (sbus_bus_map(bt, sa->sa_reg[VIGRA_REG_CSR].sbr_slot,
+ sa->sa_reg[VIGRA_REG_CSR].sbr_offset,
+ sa->sa_reg[VIGRA_REG_CSR].sbr_size, BUS_SPACE_MAP_LINEAR, 0,
+ &bh) != 0) {
+ printf("\n%s: can't map control registers\n", self->dv_xname);
+ return;
+ }
+ sc->sc_regs = bus_space_vaddr(bt, bh);
+ if (sbus_bus_map(bt, sa->sa_reg[VIGRA_REG_RAMDAC].sbr_slot,
+ sa->sa_reg[VIGRA_REG_RAMDAC].sbr_offset,
+ sa->sa_reg[VIGRA_REG_RAMDAC].sbr_size, BUS_SPACE_MAP_LINEAR, 0,
+ &bh) != 0) {
+ printf("\n%s: can't map ramdac registers\n", self->dv_xname);
+ return;
+ }
+ sc->sc_ramdac = bus_space_vaddr(bt, bh);
+
+ /* enable video */
+ vigra_burner(sc, 1, 0);
+
+ fb_setsize(&sc->sc_sunfb, 8, 1152, 900, node, 0);
+ if (sbus_bus_map(bt, sa->sa_reg[VIGRA_REG_VRAM].sbr_slot,
+ sa->sa_reg[VIGRA_REG_VRAM].sbr_offset,
+ round_page(sc->sc_sunfb.sf_fbsize), BUS_SPACE_MAP_LINEAR, 0,
+ &bh) != 0) {
+ printf("\n%s: can't map video memory\n", self->dv_xname);
+ return;
+ }
+ sc->sc_sunfb.sf_ro.ri_bits = bus_space_vaddr(bt, bh);
+ sc->sc_sunfb.sf_ro.ri_hw = sc;
+ sc->sc_paddr = sbus_bus_addr(bt, sa->sa_reg[VIGRA_REG_VRAM].sbr_slot,
+ sa->sa_reg[VIGRA_REG_VRAM].sbr_offset);
+
+ printf(", %dx%d\n", sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height);
+
+ if ((sc->sc_ih = bus_intr_establish(sa->sa_bustag, sa->sa_pri,
+ IPL_TTY, 0, vigra_intr, sc, self->dv_xname)) == NULL) {
+ printf("\n%s: couldn't establish interrupt, pri %d\n",
+ sa->sa_pri);
+ return;
+ }
+
+ /*
+ * If the framebuffer width is under 1024x768, we will switch from the
+ * PROM font to the more adequate 8x16 font here.
+ * However, we need to adjust two things in this case:
+ * - the display row should be overrided from the current PROM metrics,
+ * to prevent us from overwriting the last few lines of text.
+ * - if the 80x34 screen would make a large margin appear around it,
+ * choose to clear the screen rather than keeping old prom output in
+ * the margins.
+ * XXX there should be a rasops "clear margins" feature
+ *
+ * Also, in 1280x1024 resolution, the PROM display is not centered
+ * vertically (why? no other frame buffer does this in such a mode!),
+ * so be lazy and clear the screen here too anyways...
+ */
+ fbwscons_init(&sc->sc_sunfb, isconsole && (sc->sc_sunfb.sf_width != 800
+ && sc->sc_sunfb.sf_width != 1280) ? 0 : RI_CLEAR);
+ fbwscons_setcolormap(&sc->sc_sunfb, vigra_setcolor);
+
+ vigra_stdscreen.capabilities = sc->sc_sunfb.sf_ro.ri_caps;
+ vigra_stdscreen.nrows = sc->sc_sunfb.sf_ro.ri_rows;
+ vigra_stdscreen.ncols = sc->sc_sunfb.sf_ro.ri_cols;
+ vigra_stdscreen.textops = &sc->sc_sunfb.sf_ro.ri_ops;
+
+ if (isconsole) {
+ switch (sc->sc_sunfb.sf_width) {
+ case 640:
+ row = vigra_stdscreen.nrows - 1;
+ break;
+ case 800:
+ case 1280:
+ row = 0; /* screen has been cleared above */
+ break;
+ default:
+ row = -1;
+ break;
+ }
+
+ fbwscons_console_init(&sc->sc_sunfb, &vigra_stdscreen, row,
+ vigra_burner);
+ }
+
+ sbus_establish(&sc->sc_sd, &sc->sc_sunfb.sf_dev);
+
+ waa.console = isconsole;
+ waa.scrdata = &vigra_screenlist;
+ waa.accessops = &vigra_accessops;
+ waa.accesscookie = sc;
+ config_found(self, &waa, wsemuldisplaydevprint);
+}
+
+int
+vigra_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
+{
+ struct vigra_softc *sc = v;
+ struct wsdisplay_cmap *cm;
+ struct wsdisplay_fbinfo *wdf;
+ int error;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GTYPE:
+ *(u_int *)data = WSDISPLAY_TYPE_UNKNOWN;
+ break;
+ case WSDISPLAYIO_GINFO:
+ wdf = (struct wsdisplay_fbinfo *)data;
+ wdf->height = sc->sc_sunfb.sf_height;
+ wdf->width = sc->sc_sunfb.sf_width;
+ wdf->depth = sc->sc_sunfb.sf_depth;
+ wdf->cmsize = 256;
+ break;
+ case WSDISPLAYIO_LINEBYTES:
+ *(u_int *)data = sc->sc_sunfb.sf_linebytes;
+ break;
+
+ case WSDISPLAYIO_GETCMAP:
+ cm = (struct wsdisplay_cmap *)data;
+ error = vigra_getcmap(&sc->sc_cmap, cm, sc->sc_g300);
+ if (error)
+ return (error);
+ break;
+ case WSDISPLAYIO_PUTCMAP:
+ cm = (struct wsdisplay_cmap *)data;
+ error = vigra_putcmap(&sc->sc_cmap, cm, sc->sc_g300);
+ if (error)
+ return (error);
+ vigra_loadcmap_deferred(sc, cm->index, cm->count);
+ break;
+
+ case WSDISPLAYIO_SVIDEO:
+ case WSDISPLAYIO_GVIDEO:
+ case WSDISPLAYIO_GCURPOS:
+ case WSDISPLAYIO_SCURPOS:
+ case WSDISPLAYIO_GCURMAX:
+ case WSDISPLAYIO_GCURSOR:
+ case WSDISPLAYIO_SCURSOR:
+ default:
+ return (-1); /* not supported yet */
+ }
+
+ return (0);
+}
+
+int
+vigra_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep,
+ int *curxp, int *curyp, long *attrp)
+{
+ struct vigra_softc *sc = v;
+
+ if (sc->sc_nscreens > 0)
+ return (ENOMEM);
+
+ *cookiep = &sc->sc_sunfb.sf_ro;
+ *curyp = 0;
+ *curxp = 0;
+ sc->sc_sunfb.sf_ro.ri_ops.alloc_attr(&sc->sc_sunfb.sf_ro,
+ WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, attrp);
+ sc->sc_nscreens++;
+ return (0);
+}
+
+void
+vigra_free_screen(void *v, void *cookie)
+{
+ struct vigra_softc *sc = v;
+
+ sc->sc_nscreens--;
+}
+
+int
+vigra_show_screen(void *v, void *cookie, int waitok,
+ void (*cb)(void *, int, int), void *cbarg)
+{
+ return (0);
+}
+
+/*
+ * Return the address that would map the given device at the given
+ * offset, allowing for the given protection, or return -1 for error.
+ */
+paddr_t
+vigra_mmap(void *v, off_t offset, int prot)
+{
+ struct vigra_softc *sc = v;
+
+ if (offset & PGOFSET)
+ return (-1);
+
+ if (offset >= 0 && offset < sc->sc_sunfb.sf_fbsize) {
+ return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr,
+ offset, prot, BUS_SPACE_MAP_LINEAR));
+ }
+
+ return (-1);
+}
+
+void
+vigra_setcolor(void *v, u_int index, u_int8_t r, u_int8_t g, u_int8_t b)
+{
+ struct vigra_softc *sc = v;
+
+ if (sc->sc_g300) {
+ sc->sc_cmap.cm_map[index][3] = r;
+ sc->sc_cmap.cm_map[index][2] = g;
+ sc->sc_cmap.cm_map[index][1] = b;
+ } else {
+ sc->sc_cmap.cm_map[index][3] = b;
+ sc->sc_cmap.cm_map[index][2] = g;
+ sc->sc_cmap.cm_map[index][1] = r;
+ }
+ sc->sc_cmap.cm_map[index][0] = 0; /* no alpha channel */
+
+ vigra_loadcmap_immediate(sc, index, 1);
+}
+
+int
+vigra_getcmap(union vigracmap *cm, struct wsdisplay_cmap *rcm, int g300)
+{
+ u_int index = rcm->index, count = rcm->count, i;
+ int error;
+
+ if (index >= 256 || count > 256 - index)
+ return (EINVAL);
+
+ if (g300) {
+ for (i = 0; i < count; i++) {
+ if ((error = copyout(&cm->cm_map[index + i][3],
+ &rcm->red[i], 1)) != 0)
+ return (error);
+ if ((error = copyout(&cm->cm_map[index + i][1],
+ &rcm->blue[i], 1)) != 0)
+ return (error);
+ }
+ } else {
+ for (i = 0; i < count; i++) {
+ if ((error = copyout(&cm->cm_map[index + i][1],
+ &rcm->red[i], 1)) != 0)
+ return (error);
+ if ((error = copyout(&cm->cm_map[index + i][3],
+ &rcm->blue[i], 1)) != 0)
+ return (error);
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ if ((error = copyout(&cm->cm_map[index + i][2],
+ &rcm->green[i], 1)) != 0)
+ return (error);
+ }
+ return (0);
+}
+
+int
+vigra_putcmap(union vigracmap *cm, struct wsdisplay_cmap *rcm, int g300)
+{
+ u_int index = rcm->index, count = rcm->count, i;
+ int error;
+
+ if (index >= 256 || count > 256 - index)
+ return (EINVAL);
+
+ if (g300) {
+ for (i = 0; i < count; i++) {
+ if ((error = copyin(&rcm->red[i],
+ &cm->cm_map[index + i][3], 1)) != 0)
+ return (error);
+ if ((error = copyin(&rcm->blue[i],
+ &cm->cm_map[index + i][1], 1)) != 0)
+ return (error);
+ }
+ } else {
+ for (i = 0; i < count; i++) {
+ if ((error = copyin(&rcm->red[i],
+ &cm->cm_map[index + i][1], 1)) != 0)
+ return (error);
+ if ((error = copyin(&rcm->blue[i],
+ &cm->cm_map[index + i][3], 1)) != 0)
+ return (error);
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ if ((error = copyin(&rcm->green[i],
+ &cm->cm_map[index + i][2], 1)) != 0)
+ return (error);
+ cm->cm_map[index + i][0] = 0; /* no alpha channel */
+ }
+ return (0);
+}
+
+void
+vigra_loadcmap_immediate(struct vigra_softc *sc, int start, int ncolors)
+{
+ u_int32_t *colp = &sc->sc_cmap.cm_chip[start];
+ volatile u_int32_t *lutp;
+
+ if (sc->sc_g300)
+ lutp = &(sc->sc_ramdac->g300.cmap[start]);
+ else
+ lutp = &(sc->sc_ramdac->g335.cmap[start]);
+
+ while (--ncolors >= 0)
+ *lutp++ = *colp++;
+}
+
+static __inline__ void
+vigra_loadcmap_deferred(struct vigra_softc *sc, u_int start, u_int ncolors)
+{
+
+ sc->sc_regs->imr = 1;
+}
+
+void
+vigra_burner(void *v, u_int on, u_int flags)
+{
+ struct vigra_softc *sc = v;
+
+ if (on) {
+ sc->sc_regs->bcr = 0;
+ } else {
+ sc->sc_regs->bcr = 1;
+ }
+}
+
+int
+vigra_intr(void *v)
+{
+ struct vigra_softc *sc = v;
+
+ if (sc->sc_regs->imr == 0 ||
+ !ISSET(sc->sc_regs->g3sr, STATUS_INTR)) {
+ /* Not expecting an interrupt, it's not for us. */
+ return (0);
+ }
+
+ /* Acknowledge the interrupt and disable it. */
+ sc->sc_regs->imr = 0;
+
+ vigra_loadcmap_immediate(sc, 0, 256);
+
+ return (1);
+}