diff options
-rw-r--r-- | distrib/notes/sparc64/hardware | 9 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/Makefile | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/agten.4 | 5 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/bwtwo.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/cgsix.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/cgthree.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/creator.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/intro.4 | 8 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/mgx.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/rfx.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/tvtwo.4 | 66 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/vgafb.4 | 4 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/vigra.4 | 121 | ||||
-rw-r--r-- | share/man/man4/man4.sparc64/zx.4 | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/conf/GENERIC | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/conf/RAMDISK | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/conf/RAMDISKU1 | 6 | ||||
-rw-r--r-- | sys/dev/sbus/files.sbus | 10 | ||||
-rw-r--r-- | sys/dev/sbus/tvtwo.c | 420 | ||||
-rw-r--r-- | sys/dev/sbus/vigra.c | 635 |
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); +} |