1 /* $NetBSD: bwtwo.c,v 1.27 2009/09/19 04:52:44 tsutsui 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.c,v 1.27 2009/09/19 04:52:44 tsutsui 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>
96 #include <dev/sun/fbio.h>
97 #include <dev/sun/fbvar.h>
99 #include <dev/sun/btreg.h>
100 #include <dev/sun/bwtworeg.h>
101 #include <dev/sun/bwtwovar.h>
102 #include <dev/sun/pfourreg.h>
105 #include <dev/wscons/wsconsio.h>
106 #include <dev/wsfont/wsfont.h>
107 #include <dev/rasops/rasops.h>
109 #include "opt_wsemul.h"
114 dev_type_open(bwtwoopen
);
115 dev_type_ioctl(bwtwoioctl
);
116 dev_type_mmap(bwtwommap
);
118 const struct cdevsw bwtwo_cdevsw
= {
119 bwtwoopen
, nullclose
, noread
, nowrite
, bwtwoioctl
,
120 nostop
, notty
, nopoll
, bwtwommap
, nokqfilter
,
123 /* XXX we do not handle frame buffer interrupts (do not know how) */
124 static void bwtwounblank(device_t
);
126 /* frame buffer generic driver */
127 static struct fbdriver bwtwofbdriver
= {
128 bwtwounblank
, bwtwoopen
, nullclose
, bwtwoioctl
, nopoll
, bwtwommap
,
134 #error RASTERCONSOLE and wsdisplay are mutually exclusive
137 struct wsscreen_descr bwtwo_defaultscreen
= {
139 0, 0, /* will be filled in -- XXX shouldn't, it's global */
141 8, 16, /* font width/height */
142 0, /* capabilities */
143 NULL
/* modecookie */
146 static int bwtwo_ioctl(void *, void *, u_long
, void *, int, struct lwp
*);
147 static paddr_t
bwtwo_mmap(void *, void *, off_t
, int);
148 static void bwtwo_init_screen(void *, struct vcons_screen
*, int, long *);
150 struct wsdisplay_accessops bwtwo_accessops
= {
153 NULL
, /* alloc_screen */
154 NULL
, /* free_screen */
155 NULL
, /* show_screen */
156 NULL
, /* load_font */
161 const struct wsscreen_descr
*_bwtwo_scrlist
[] = {
165 struct wsscreen_list bwtwo_screenlist
= {
166 sizeof(_bwtwo_scrlist
) / sizeof(struct wsscreen_descr
*),
171 static struct vcons_screen bw2_console_screen
;
172 #endif /* NWSDISPLAY > 0 */
175 bwtwo_pfour_probe(void *vaddr
, void *arg
)
179 switch (fb_pfour_id(vaddr
)) {
181 case PFOUR_ID_COLOR8P1
: /* bwtwo in ... */
182 case PFOUR_ID_COLOR24
: /* ...overlay plane */
183 /* This is wrong; should be done in bwtwo_attach() */
184 cf
->cf_flags
|= FB_PFOUR
;
193 bwtwoattach(struct bwtwo_softc
*sc
, const char *name
, int isconsole
)
195 struct fbdevice
*fb
= &sc
->sc_fb
;
198 struct wsemuldisplaydev_attach_args aa
;
199 struct rasops_info
*ri
= &bw2_console_screen
.scr_ri
;
200 unsigned long defattr
;
203 /* Fill in the remaining fbdevice values */
204 fb
->fb_driver
= &bwtwofbdriver
;
205 fb
->fb_device
= sc
->sc_dev
;
206 fb
->fb_type
.fb_type
= FBTYPE_SUN2BW
;
207 fb
->fb_type
.fb_cmsize
= 0;
208 fb
->fb_type
.fb_size
= fb
->fb_type
.fb_height
* fb
->fb_linebytes
;
209 printf(": %s, %d x %d", name
,
210 fb
->fb_type
.fb_width
, fb
->fb_type
.fb_height
);
212 /* Are we an overlay bw2? */
213 if ((fb
->fb_flags
& FB_PFOUR
) == 0 || (sc
->sc_ovtype
== BWO_NONE
))
218 /* Insure video is enabled */
219 sc
->sc_set_video(sc
, 1);
222 printf(" (console)\n");
225 * XXX rcons doesn't seem to work properly on the overlay
226 * XXX plane. This is a temporary kludge until someone
238 switch (sc
->sc_ovtype
) {
251 printf("%s: %s overlay plane\n",
252 device_xname(sc
->sc_dev
), ovnam
);
256 * If we're on an overlay plane of a color framebuffer,
257 * then we don't force the issue in fb_attach() because
258 * we'd like the color framebuffer to actually be the
259 * "console framebuffer". We're only around to speed
265 fb_attach(fb
, isconsole
);
268 sc
->sc_width
= fb
->fb_type
.fb_width
;
269 sc
->sc_stride
= fb
->fb_type
.fb_width
/8;
270 sc
->sc_height
= fb
->fb_type
.fb_height
;
272 /* setup rasops and so on for wsdisplay */
273 sc
->sc_mode
= WSDISPLAYIO_MODE_EMUL
;
275 vcons_init(&sc
->vd
, sc
, &bwtwo_defaultscreen
, &bwtwo_accessops
);
276 sc
->vd
.init_screen
= bwtwo_init_screen
;
278 if(isconsole
&& !isoverlay
) {
279 /* we mess with bw2_console_screen only once */
280 vcons_init_screen(&sc
->vd
, &bw2_console_screen
, 1,
282 bw2_console_screen
.scr_flags
|= VCONS_SCREEN_IS_STATIC
;
284 bwtwo_defaultscreen
.textops
= &ri
->ri_ops
;
285 bwtwo_defaultscreen
.capabilities
= ri
->ri_caps
;
286 bwtwo_defaultscreen
.nrows
= ri
->ri_rows
;
287 bwtwo_defaultscreen
.ncols
= ri
->ri_cols
;
288 sc
->vd
.active
= &bw2_console_screen
;
289 wsdisplay_cnattach(&bwtwo_defaultscreen
, ri
, 0, 0, defattr
);
292 * we're not the console so we just clear the screen and don't
293 * set up any sort of text display
295 if (bwtwo_defaultscreen
.textops
== NULL
) {
298 * we want the console settings to win, so we only
299 * touch anything when we find an untouched screen
300 * definition. In this case we fill it from fb to
301 * avoid problems in case no bwtwo is the console
303 ri
= &sc
->sc_fb
.fb_rinfo
;
304 bwtwo_defaultscreen
.textops
= &ri
->ri_ops
;
305 bwtwo_defaultscreen
.capabilities
= ri
->ri_caps
;
306 bwtwo_defaultscreen
.nrows
= ri
->ri_rows
;
307 bwtwo_defaultscreen
.ncols
= ri
->ri_cols
;
311 aa
.scrdata
= &bwtwo_screenlist
;
315 aa
.console
= isconsole
;
316 aa
.accessops
= &bwtwo_accessops
;
317 aa
.accesscookie
= &sc
->vd
;
318 config_found(sc
->sc_dev
, &aa
, wsemuldisplaydevprint
);
324 bwtwoopen(dev_t dev
, int flags
, int mode
, struct lwp
*l
)
326 int unit
= minor(dev
);
328 if (device_lookup(&bwtwo_cd
, unit
) == NULL
)
335 bwtwoioctl(dev_t dev
, u_long cmd
, void *data
, int flags
, struct lwp
*l
)
337 struct bwtwo_softc
*sc
= device_lookup_private(&bwtwo_cd
, minor(dev
));
342 *(struct fbtype
*)data
= sc
->sc_fb
.fb_type
;
346 *(int *)data
= sc
->sc_get_video(sc
);
350 sc
->sc_set_video(sc
, (*(int *)data
));
360 bwtwounblank(device_t dev
)
362 struct bwtwo_softc
*sc
= device_private(dev
);
364 sc
->sc_set_video(sc
, 1);
368 * Return the address that would map the given device at the given
369 * offset, allowing for the given protection, or return -1 for error.
372 bwtwommap(dev_t dev
, off_t off
, int prot
)
374 struct bwtwo_softc
*sc
= device_lookup_private(&bwtwo_cd
, minor(dev
));
379 if (off
>= sc
->sc_fb
.fb_type
.fb_size
)
382 return (bus_space_mmap(sc
->sc_bustag
,
383 sc
->sc_paddr
, sc
->sc_pixeloffset
+ off
,
384 prot
, BUS_SPACE_MAP_LINEAR
));
390 bwtwo_ioctl(void *v
, void *vs
, u_long cmd
, void *data
, int flag
,
393 /* we'll probably need to add more stuff here */
394 struct vcons_data
*vd
= v
;
395 struct bwtwo_softc
*sc
= vd
->cookie
;
396 struct wsdisplay_fbinfo
*wdf
;
397 struct rasops_info
*ri
= &sc
->sc_fb
.fb_rinfo
;
398 struct vcons_screen
*ms
= sc
->vd
.active
;
400 case WSDISPLAYIO_GTYPE
:
401 *(u_int
*)data
= WSDISPLAY_TYPE_GENFB
;
403 case WSDISPLAYIO_GINFO
:
405 wdf
->height
= ri
->ri_height
;
406 wdf
->width
= ri
->ri_width
;
407 wdf
->depth
= ri
->ri_depth
;
411 case WSDISPLAYIO_GETCMAP
:
413 case WSDISPLAYIO_PUTCMAP
:
416 case WSDISPLAYIO_SMODE
:
418 int new_mode
= *(int*)data
;
419 if (new_mode
!= sc
->sc_mode
)
421 sc
->sc_mode
= new_mode
;
422 if(new_mode
== WSDISPLAYIO_MODE_EMUL
)
424 vcons_redraw_screen(ms
);
433 bwtwo_mmap(void *v
, void *vs
, off_t offset
, int prot
)
435 /* I'm not at all sure this is the right thing to do */
436 return bwtwommap(0, offset
, prot
); /* assume minor dev 0 for now */
440 bwtwo_init_screen(void *cookie
, struct vcons_screen
*scr
,
441 int existing
, long *defattr
)
443 struct bwtwo_softc
*sc
= cookie
;
444 struct rasops_info
*ri
= &scr
->scr_ri
;
447 ri
->ri_width
= sc
->sc_width
;
448 ri
->ri_height
= sc
->sc_height
;
449 ri
->ri_stride
= sc
->sc_stride
;
450 ri
->ri_flg
= RI_CENTER
;
452 ri
->ri_bits
= sc
->sc_fb
.fb_pixels
;
454 memset(sc
->sc_fb
.fb_pixels
, (*defattr
>> 16) & 0xff,
455 sc
->sc_stride
* sc
->sc_height
);
456 rasops_init(ri
, sc
->sc_height
/8, sc
->sc_width
/8);
458 rasops_reconfig(ri
, sc
->sc_height
/ ri
->ri_font
->fontheight
,
459 sc
->sc_width
/ ri
->ri_font
->fontwidth
);
464 #endif /* NWSDISPLAY > 0 */