1 /* $NetBSD: bwtwo_obio.c,v 1.16 2008/04/28 20:23:35 martin Exp $ */
4 * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Copyright (c) 1992, 1993
34 * The Regents of the University of California. All rights reserved.
36 * This software was developed by the Computer Systems Engineering group
37 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
38 * contributed to Berkeley.
40 * All advertising materials mentioning features or use of this software
41 * must display the following acknowledgement:
42 * This product includes software developed by the University of
43 * California, Lawrence Berkeley Laboratory.
45 * Redistribution and use in source and binary forms, with or without
46 * modification, are permitted provided that the following conditions
48 * 1. Redistributions of source code must retain the above copyright
49 * notice, this list of conditions and the following disclaimer.
50 * 2. Redistributions in binary form must reproduce the above copyright
51 * notice, this list of conditions and the following disclaimer in the
52 * documentation and/or other materials provided with the distribution.
53 * 3. Neither the name of the University nor the names of its contributors
54 * may be used to endorse or promote products derived from this software
55 * without specific prior written permission.
57 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
58 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
59 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
60 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
61 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
62 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
63 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
64 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
65 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
66 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69 * @(#)bwtwo.c 8.1 (Berkeley) 6/11/93
73 * black&white display (bwtwo) driver.
75 * Does not handle interrupts, even though they can occur.
77 * P4 and overlay plane support by Jason R. Thorpe <thorpej@NetBSD.org>.
78 * Overlay plane handling hints and ideas provided by Brad Spencer.
81 #include <sys/cdefs.h>
82 __KERNEL_RCSID(0, "$NetBSD: bwtwo_obio.c,v 1.16 2008/04/28 20:23:35 martin Exp $");
84 #include <sys/param.h>
85 #include <sys/systm.h>
86 #include <sys/device.h>
87 #include <sys/ioctl.h>
88 #include <sys/malloc.h>
93 #include <machine/autoconf.h>
94 #include <machine/eeprom.h>
95 #include <machine/ctlreg.h>
96 #include <sparc/sparc/asm.h>
98 #include <dev/sun/fbio.h>
99 #include <dev/sun/fbvar.h>
100 #include <dev/sun/btreg.h>
101 #include <dev/sun/bwtworeg.h>
102 #include <dev/sun/bwtwovar.h>
103 #include <dev/sun/pfourreg.h>
105 /* autoconfiguration driver */
106 static int bwtwomatch_obio(device_t
, cfdata_t
, void *);
107 static void bwtwoattach_obio(device_t
, device_t
, void *);
110 CFATTACH_DECL_NEW(bwtwo_obio
, sizeof(struct bwtwo_softc
),
111 bwtwomatch_obio
, bwtwoattach_obio
, NULL
, NULL
);
113 static int bwtwo_get_video_sun4(struct bwtwo_softc
*);
114 static void bwtwo_set_video_sun4(struct bwtwo_softc
*, int);
119 bwtwomatch_obio(device_t parent
, cfdata_t cf
, void *aux
)
121 union obio_attach_args
*uoba
= aux
;
122 struct obio4_attach_args
*oba
;
124 if (uoba
->uoba_isobio4
== 0)
127 oba
= &uoba
->uoba_oba4
;
128 return (bus_space_probe(oba
->oba_bustag
, oba
->oba_paddr
,
132 bwtwo_pfour_probe
, cf
));
136 bwtwoattach_obio(device_t parent
, device_t self
, void *aux
)
138 struct bwtwo_softc
*sc
= device_private(self
);
139 union obio_attach_args
*uoba
= aux
;
140 struct obio4_attach_args
*oba
;
141 struct fbdevice
*fb
= &sc
->sc_fb
;
142 struct eeprom
*eep
= (struct eeprom
*)eeprom_va
;
143 bus_space_handle_t bh
;
144 int constype
, isconsole
;
148 oba
= &uoba
->uoba_oba4
;
150 /* Remember cookies for bwtwo_mmap() */
151 sc
->sc_bustag
= oba
->oba_bustag
;
152 sc
->sc_paddr
= (bus_addr_t
)oba
->oba_paddr
;
154 fb
->fb_flags
= device_cfdata(self
)->cf_flags
;
155 fb
->fb_type
.fb_depth
= 1;
156 fb_setsize_eeprom(fb
, fb
->fb_type
.fb_depth
, 1152, 900);
158 constype
= (fb
->fb_flags
& FB_PFOUR
) ? EE_CONS_P4OPT
: EE_CONS_BW
;
159 if (eep
== NULL
|| eep
->eeConsole
== constype
)
160 isconsole
= fb_is_console(0);
164 if (fb
->fb_flags
& FB_PFOUR
) {
166 * Map the pfour control register.
167 * Set pixel offset to appropriate overlay plane.
171 if (bus_space_map(oba
->oba_bustag
,
174 BUS_SPACE_MAP_LINEAR
,
176 printf("%s: cannot map pfour register\n",
180 fb
->fb_pfour
= (uint32_t *)bh
;
184 * Notice if this is an overlay plane on a color
185 * framebuffer. Note that PFOUR_COLOR_OFF_OVERLAY
186 * is the same as PFOUR_BW_OFF, but we use the
187 * different names anyway.
189 switch (PFOUR_ID(*fb
->fb_pfour
)) {
190 case PFOUR_ID_COLOR8P1
:
191 sc
->sc_ovtype
= BWO_CGFOUR
;
192 sc
->sc_pixeloffset
= PFOUR_COLOR_OFF_OVERLAY
;
195 case PFOUR_ID_COLOR24
:
196 sc
->sc_ovtype
= BWO_CGEIGHT
;
197 sc
->sc_pixeloffset
= PFOUR_COLOR_OFF_OVERLAY
;
201 sc
->sc_ovtype
= BWO_NONE
;
202 sc
->sc_pixeloffset
= PFOUR_BW_OFF
;
208 if (bus_space_map(oba
->oba_bustag
,
209 oba
->oba_paddr
+ BWREG_REG
,
210 sizeof(struct fbcontrol
),
211 BUS_SPACE_MAP_LINEAR
,
213 printf("%s: cannot map control registers\n",
217 sc
->sc_reg
= (struct fbcontrol
*)bh
;
221 sc
->sc_pixeloffset
= BWREG_MEM
;
223 sc
->sc_get_video
= bwtwo_get_video_sun4
;
224 sc
->sc_set_video
= bwtwo_set_video_sun4
;
227 int ramsize
= fb
->fb_type
.fb_height
* fb
->fb_linebytes
;
228 if (bus_space_map(oba
->oba_bustag
,
229 oba
->oba_paddr
+ sc
->sc_pixeloffset
,
231 BUS_SPACE_MAP_LINEAR
,
233 printf("%s: cannot map pixels\n", device_xname(self
));
236 sc
->sc_fb
.fb_pixels
= (char *)bh
;
239 bwtwoattach(sc
, name
, isconsole
);
243 bwtwo_set_video_sun4(struct bwtwo_softc
*sc
, int enable
)
246 if (sc
->sc_fb
.fb_flags
& FB_PFOUR
) {
248 * This handles the overlay plane case, too.
250 fb_pfour_set_video(&sc
->sc_fb
, enable
);
254 stba(AC_SYSENABLE
, ASI_CONTROL
,
255 lduba(AC_SYSENABLE
, ASI_CONTROL
) | SYSEN_VIDEO
);
257 stba(AC_SYSENABLE
, ASI_CONTROL
,
258 lduba(AC_SYSENABLE
, ASI_CONTROL
) & ~SYSEN_VIDEO
);
264 bwtwo_get_video_sun4(struct bwtwo_softc
*sc
)
267 if (sc
->sc_fb
.fb_flags
& FB_PFOUR
) {
269 * This handles the overlay plane case, too.
271 return (fb_pfour_get_video(&sc
->sc_fb
));
273 return ((lduba(AC_SYSENABLE
, ASI_CONTROL
) & SYSEN_VIDEO
) != 0);