1 1.39 thorpej /* $NetBSD: bwtwo.c,v 1.39 2022/09/25 21:30:29 thorpej Exp $ */ 2 1.1 pk 3 1.1 pk /*- 4 1.1 pk * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. 5 1.1 pk * All rights reserved. 6 1.1 pk * 7 1.1 pk * This code is derived from software contributed to The NetBSD Foundation 8 1.1 pk * by Jason R. Thorpe. 9 1.1 pk * 10 1.1 pk * Redistribution and use in source and binary forms, with or without 11 1.1 pk * modification, are permitted provided that the following conditions 12 1.1 pk * are met: 13 1.1 pk * 1. Redistributions of source code must retain the above copyright 14 1.1 pk * notice, this list of conditions and the following disclaimer. 15 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 pk * notice, this list of conditions and the following disclaimer in the 17 1.1 pk * documentation and/or other materials provided with the distribution. 18 1.1 pk * 19 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 pk * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 pk * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 pk * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 pk * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 pk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 pk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 pk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 pk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 pk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 pk * POSSIBILITY OF SUCH DAMAGE. 30 1.1 pk */ 31 1.1 pk 32 1.1 pk /* 33 1.1 pk * Copyright (c) 1992, 1993 34 1.1 pk * The Regents of the University of California. All rights reserved. 35 1.1 pk * 36 1.1 pk * This software was developed by the Computer Systems Engineering group 37 1.1 pk * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 38 1.1 pk * contributed to Berkeley. 39 1.1 pk * 40 1.1 pk * All advertising materials mentioning features or use of this software 41 1.1 pk * must display the following acknowledgement: 42 1.1 pk * This product includes software developed by the University of 43 1.1 pk * California, Lawrence Berkeley Laboratory. 44 1.1 pk * 45 1.1 pk * Redistribution and use in source and binary forms, with or without 46 1.1 pk * modification, are permitted provided that the following conditions 47 1.1 pk * are met: 48 1.1 pk * 1. Redistributions of source code must retain the above copyright 49 1.1 pk * notice, this list of conditions and the following disclaimer. 50 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 51 1.1 pk * notice, this list of conditions and the following disclaimer in the 52 1.1 pk * documentation and/or other materials provided with the distribution. 53 1.9 agc * 3. Neither the name of the University nor the names of its contributors 54 1.1 pk * may be used to endorse or promote products derived from this software 55 1.1 pk * without specific prior written permission. 56 1.1 pk * 57 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 58 1.1 pk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 59 1.1 pk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 60 1.1 pk * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 61 1.1 pk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 62 1.1 pk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 63 1.1 pk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 64 1.1 pk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 65 1.1 pk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 66 1.1 pk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 67 1.1 pk * SUCH DAMAGE. 68 1.1 pk * 69 1.1 pk * @(#)bwtwo.c 8.1 (Berkeley) 6/11/93 70 1.1 pk */ 71 1.1 pk 72 1.1 pk /* 73 1.1 pk * black & white display (bwtwo) driver. 74 1.1 pk * 75 1.1 pk * Does not handle interrupts, even though they can occur. 76 1.1 pk * 77 1.12 keihan * P4 and overlay plane support by Jason R. Thorpe <thorpej (at) NetBSD.org>. 78 1.1 pk * Overlay plane handling hints and ideas provided by Brad Spencer. 79 1.1 pk */ 80 1.4 lukem 81 1.4 lukem #include <sys/cdefs.h> 82 1.39 thorpej __KERNEL_RCSID(0, "$NetBSD: bwtwo.c,v 1.39 2022/09/25 21:30:29 thorpej Exp $"); 83 1.1 pk 84 1.1 pk #include <sys/param.h> 85 1.1 pk #include <sys/systm.h> 86 1.1 pk #include <sys/device.h> 87 1.1 pk #include <sys/ioctl.h> 88 1.1 pk #include <sys/mman.h> 89 1.1 pk #include <sys/tty.h> 90 1.1 pk #include <sys/conf.h> 91 1.1 pk 92 1.1 pk #include <machine/autoconf.h> 93 1.1 pk #include <machine/eeprom.h> 94 1.1 pk 95 1.2 pk #include <dev/sun/fbio.h> 96 1.2 pk #include <dev/sun/fbvar.h> 97 1.19 jdc 98 1.22 jdc #include <dev/sun/btreg.h> 99 1.22 jdc #include <dev/sun/bwtworeg.h> 100 1.22 jdc #include <dev/sun/bwtwovar.h> 101 1.22 jdc #include <dev/sun/pfourreg.h> 102 1.22 jdc 103 1.19 jdc #if NWSDISPLAY > 0 104 1.19 jdc #include <dev/wscons/wsconsio.h> 105 1.19 jdc #include <dev/wsfont/wsfont.h> 106 1.19 jdc #include <dev/rasops/rasops.h> 107 1.19 jdc 108 1.19 jdc #include "opt_wsemul.h" 109 1.19 jdc #endif 110 1.19 jdc 111 1.28 tsutsui #include "ioconf.h" 112 1.1 pk 113 1.5 gehenna dev_type_open(bwtwoopen); 114 1.5 gehenna dev_type_ioctl(bwtwoioctl); 115 1.5 gehenna dev_type_mmap(bwtwommap); 116 1.5 gehenna 117 1.5 gehenna const struct cdevsw bwtwo_cdevsw = { 118 1.33 dholland .d_open = bwtwoopen, 119 1.33 dholland .d_close = nullclose, 120 1.33 dholland .d_read = noread, 121 1.33 dholland .d_write = nowrite, 122 1.33 dholland .d_ioctl = bwtwoioctl, 123 1.33 dholland .d_stop = nostop, 124 1.33 dholland .d_tty = notty, 125 1.33 dholland .d_poll = nopoll, 126 1.33 dholland .d_mmap = bwtwommap, 127 1.33 dholland .d_kqfilter = nokqfilter, 128 1.34 dholland .d_discard = nodiscard, 129 1.33 dholland .d_flag = D_OTHER 130 1.5 gehenna }; 131 1.1 pk 132 1.1 pk /* XXX we do not handle frame buffer interrupts (do not know how) */ 133 1.26 cegger static void bwtwounblank(device_t); 134 1.1 pk 135 1.1 pk /* frame buffer generic driver */ 136 1.1 pk static struct fbdriver bwtwofbdriver = { 137 1.6 jdolecek bwtwounblank, bwtwoopen, nullclose, bwtwoioctl, nopoll, bwtwommap, 138 1.6 jdolecek nokqfilter 139 1.1 pk }; 140 1.1 pk 141 1.19 jdc #if NWSDISPLAY > 0 142 1.19 jdc #ifdef RASTERCONSOLE 143 1.19 jdc #error RASTERCONSOLE and wsdisplay are mutually exclusive 144 1.19 jdc #endif 145 1.19 jdc 146 1.19 jdc struct wsscreen_descr bwtwo_defaultscreen = { 147 1.19 jdc "std", 148 1.19 jdc 0, 0, /* will be filled in -- XXX shouldn't, it's global */ 149 1.19 jdc NULL, /* textops */ 150 1.19 jdc 8, 16, /* font width/height */ 151 1.19 jdc 0, /* capabilities */ 152 1.19 jdc NULL /* modecookie */ 153 1.19 jdc }; 154 1.19 jdc 155 1.19 jdc static int bwtwo_ioctl(void *, void *, u_long, void *, int, struct lwp *); 156 1.19 jdc static paddr_t bwtwo_mmap(void *, void *, off_t, int); 157 1.19 jdc static void bwtwo_init_screen(void *, struct vcons_screen *, int, long *); 158 1.19 jdc 159 1.19 jdc struct wsdisplay_accessops bwtwo_accessops = { 160 1.19 jdc bwtwo_ioctl, 161 1.19 jdc bwtwo_mmap, 162 1.19 jdc NULL, /* alloc_screen */ 163 1.19 jdc NULL, /* free_screen */ 164 1.19 jdc NULL, /* show_screen */ 165 1.19 jdc NULL, /* load_font */ 166 1.19 jdc NULL, /* pollc */ 167 1.19 jdc NULL /* scroll */ 168 1.19 jdc }; 169 1.19 jdc 170 1.19 jdc const struct wsscreen_descr *_bwtwo_scrlist[] = { 171 1.19 jdc &bwtwo_defaultscreen 172 1.19 jdc }; 173 1.19 jdc 174 1.19 jdc struct wsscreen_list bwtwo_screenlist = { 175 1.19 jdc sizeof(_bwtwo_scrlist) / sizeof(struct wsscreen_descr *), 176 1.19 jdc _bwtwo_scrlist 177 1.19 jdc }; 178 1.19 jdc 179 1.19 jdc 180 1.19 jdc static struct vcons_screen bw2_console_screen; 181 1.19 jdc #endif /* NWSDISPLAY > 0 */ 182 1.19 jdc 183 1.1 pk int 184 1.23 dsl bwtwo_pfour_probe(void *vaddr, void *arg) 185 1.1 pk { 186 1.25 cegger cfdata_t cf = arg; 187 1.1 pk 188 1.1 pk switch (fb_pfour_id(vaddr)) { 189 1.1 pk case PFOUR_ID_BW: 190 1.1 pk case PFOUR_ID_COLOR8P1: /* bwtwo in ... */ 191 1.1 pk case PFOUR_ID_COLOR24: /* ...overlay plane */ 192 1.1 pk /* This is wrong; should be done in bwtwo_attach() */ 193 1.1 pk cf->cf_flags |= FB_PFOUR; 194 1.1 pk /* FALLTHROUGH */ 195 1.1 pk case PFOUR_NOTPFOUR: 196 1.1 pk return (1); 197 1.1 pk } 198 1.1 pk return (0); 199 1.1 pk } 200 1.1 pk 201 1.1 pk void 202 1.23 dsl bwtwoattach(struct bwtwo_softc *sc, const char *name, int isconsole) 203 1.1 pk { 204 1.1 pk struct fbdevice *fb = &sc->sc_fb; 205 1.19 jdc int isoverlay; 206 1.19 jdc #if NWSDISPLAY > 0 207 1.19 jdc struct wsemuldisplaydev_attach_args aa; 208 1.19 jdc struct rasops_info *ri = &bw2_console_screen.scr_ri; 209 1.31 jdc unsigned long defattr = 0; 210 1.19 jdc #endif 211 1.1 pk 212 1.1 pk /* Fill in the remaining fbdevice values */ 213 1.1 pk fb->fb_driver = &bwtwofbdriver; 214 1.27 tsutsui fb->fb_device = sc->sc_dev; 215 1.1 pk fb->fb_type.fb_type = FBTYPE_SUN2BW; 216 1.1 pk fb->fb_type.fb_cmsize = 0; 217 1.1 pk fb->fb_type.fb_size = fb->fb_type.fb_height * fb->fb_linebytes; 218 1.1 pk printf(": %s, %d x %d", name, 219 1.1 pk fb->fb_type.fb_width, fb->fb_type.fb_height); 220 1.1 pk 221 1.19 jdc /* Are we an overlay bw2? */ 222 1.19 jdc if ((fb->fb_flags & FB_PFOUR) == 0 || (sc->sc_ovtype == BWO_NONE)) 223 1.19 jdc isoverlay = 0; 224 1.19 jdc else 225 1.19 jdc isoverlay = 1; 226 1.19 jdc 227 1.1 pk /* Insure video is enabled */ 228 1.1 pk sc->sc_set_video(sc, 1); 229 1.1 pk 230 1.1 pk if (isconsole) { 231 1.1 pk printf(" (console)\n"); 232 1.1 pk #ifdef RASTERCONSOLE 233 1.1 pk /* 234 1.1 pk * XXX rcons doesn't seem to work properly on the overlay 235 1.1 pk * XXX plane. This is a temporary kludge until someone 236 1.1 pk * XXX fixes it. 237 1.1 pk */ 238 1.19 jdc if (!isoverlay) 239 1.1 pk fbrcons_init(fb); 240 1.1 pk #endif 241 1.1 pk } else 242 1.1 pk printf("\n"); 243 1.1 pk 244 1.19 jdc if (isoverlay) { 245 1.13 tsutsui const char *ovnam; 246 1.1 pk 247 1.1 pk switch (sc->sc_ovtype) { 248 1.1 pk case BWO_CGFOUR: 249 1.1 pk ovnam = "cgfour"; 250 1.1 pk break; 251 1.1 pk 252 1.1 pk case BWO_CGEIGHT: 253 1.1 pk ovnam = "cgeight"; 254 1.1 pk break; 255 1.1 pk 256 1.1 pk default: 257 1.1 pk ovnam = "unknown"; 258 1.1 pk break; 259 1.1 pk } 260 1.27 tsutsui printf("%s: %s overlay plane\n", 261 1.27 tsutsui device_xname(sc->sc_dev), ovnam); 262 1.1 pk } 263 1.1 pk 264 1.1 pk /* 265 1.1 pk * If we're on an overlay plane of a color framebuffer, 266 1.1 pk * then we don't force the issue in fb_attach() because 267 1.1 pk * we'd like the color framebuffer to actually be the 268 1.1 pk * "console framebuffer". We're only around to speed 269 1.1 pk * up rconsole. 270 1.1 pk */ 271 1.19 jdc if (isoverlay) 272 1.1 pk fb_attach(fb, 0); 273 1.1 pk else 274 1.1 pk fb_attach(fb, isconsole); 275 1.19 jdc 276 1.19 jdc #if NWSDISPLAY > 0 277 1.19 jdc sc->sc_width = fb->fb_type.fb_width; 278 1.19 jdc sc->sc_stride = fb->fb_type.fb_width/8; 279 1.19 jdc sc->sc_height = fb->fb_type.fb_height; 280 1.19 jdc 281 1.19 jdc /* setup rasops and so on for wsdisplay */ 282 1.19 jdc sc->sc_mode = WSDISPLAYIO_MODE_EMUL; 283 1.19 jdc 284 1.19 jdc vcons_init(&sc->vd, sc, &bwtwo_defaultscreen, &bwtwo_accessops); 285 1.19 jdc sc->vd.init_screen = bwtwo_init_screen; 286 1.19 jdc 287 1.19 jdc if(isconsole && !isoverlay) { 288 1.19 jdc /* we mess with bw2_console_screen only once */ 289 1.19 jdc vcons_init_screen(&sc->vd, &bw2_console_screen, 1, 290 1.19 jdc &defattr); 291 1.19 jdc bw2_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC; 292 1.21 jdc 293 1.19 jdc bwtwo_defaultscreen.textops = &ri->ri_ops; 294 1.19 jdc bwtwo_defaultscreen.capabilities = ri->ri_caps; 295 1.19 jdc bwtwo_defaultscreen.nrows = ri->ri_rows; 296 1.19 jdc bwtwo_defaultscreen.ncols = ri->ri_cols; 297 1.19 jdc sc->vd.active = &bw2_console_screen; 298 1.21 jdc wsdisplay_cnattach(&bwtwo_defaultscreen, ri, 0, 0, defattr); 299 1.19 jdc } else { 300 1.19 jdc /* 301 1.19 jdc * we're not the console so we just clear the screen and don't 302 1.19 jdc * set up any sort of text display 303 1.19 jdc */ 304 1.19 jdc if (bwtwo_defaultscreen.textops == NULL) { 305 1.19 jdc /* 306 1.19 jdc * ugly, but... 307 1.19 jdc * we want the console settings to win, so we only 308 1.19 jdc * touch anything when we find an untouched screen 309 1.19 jdc * definition. In this case we fill it from fb to 310 1.19 jdc * avoid problems in case no bwtwo is the console 311 1.19 jdc */ 312 1.19 jdc bwtwo_defaultscreen.textops = &ri->ri_ops; 313 1.19 jdc bwtwo_defaultscreen.capabilities = ri->ri_caps; 314 1.19 jdc bwtwo_defaultscreen.nrows = ri->ri_rows; 315 1.19 jdc bwtwo_defaultscreen.ncols = ri->ri_cols; 316 1.19 jdc } 317 1.19 jdc } 318 1.19 jdc 319 1.19 jdc aa.scrdata = &bwtwo_screenlist; 320 1.19 jdc if (isoverlay) 321 1.19 jdc aa.console = 0; 322 1.19 jdc else 323 1.19 jdc aa.console = isconsole; 324 1.19 jdc aa.accessops = &bwtwo_accessops; 325 1.19 jdc aa.accesscookie = &sc->vd; 326 1.38 thorpej config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE); 327 1.19 jdc #endif 328 1.19 jdc 329 1.1 pk } 330 1.1 pk 331 1.1 pk int 332 1.24 dsl bwtwoopen(dev_t dev, int flags, int mode, struct lwp *l) 333 1.1 pk { 334 1.1 pk int unit = minor(dev); 335 1.1 pk 336 1.18 drochner if (device_lookup(&bwtwo_cd, unit) == NULL) 337 1.1 pk return (ENXIO); 338 1.1 pk 339 1.1 pk return (0); 340 1.1 pk } 341 1.1 pk 342 1.1 pk int 343 1.23 dsl bwtwoioctl(dev_t dev, u_long cmd, void *data, int flags, struct lwp *l) 344 1.1 pk { 345 1.18 drochner struct bwtwo_softc *sc = device_lookup_private(&bwtwo_cd, minor(dev)); 346 1.1 pk 347 1.1 pk switch (cmd) { 348 1.1 pk 349 1.1 pk case FBIOGTYPE: 350 1.1 pk *(struct fbtype *)data = sc->sc_fb.fb_type; 351 1.1 pk break; 352 1.1 pk 353 1.1 pk case FBIOGVIDEO: 354 1.1 pk *(int *)data = sc->sc_get_video(sc); 355 1.1 pk break; 356 1.1 pk 357 1.1 pk case FBIOSVIDEO: 358 1.1 pk sc->sc_set_video(sc, (*(int *)data)); 359 1.1 pk break; 360 1.1 pk 361 1.1 pk default: 362 1.1 pk return (ENOTTY); 363 1.1 pk } 364 1.1 pk return (0); 365 1.1 pk } 366 1.1 pk 367 1.1 pk static void 368 1.26 cegger bwtwounblank(device_t dev) 369 1.1 pk { 370 1.18 drochner struct bwtwo_softc *sc = device_private(dev); 371 1.1 pk 372 1.1 pk sc->sc_set_video(sc, 1); 373 1.1 pk } 374 1.1 pk 375 1.1 pk /* 376 1.1 pk * Return the address that would map the given device at the given 377 1.1 pk * offset, allowing for the given protection, or return -1 for error. 378 1.1 pk */ 379 1.1 pk paddr_t 380 1.23 dsl bwtwommap(dev_t dev, off_t off, int prot) 381 1.1 pk { 382 1.18 drochner struct bwtwo_softc *sc = device_lookup_private(&bwtwo_cd, minor(dev)); 383 1.1 pk 384 1.1 pk if (off & PGOFSET) 385 1.1 pk panic("bwtwommap"); 386 1.1 pk 387 1.1 pk if (off >= sc->sc_fb.fb_type.fb_size) 388 1.1 pk return (-1); 389 1.1 pk 390 1.3 eeh return (bus_space_mmap(sc->sc_bustag, 391 1.3 eeh sc->sc_paddr, sc->sc_pixeloffset + off, 392 1.3 eeh prot, BUS_SPACE_MAP_LINEAR)); 393 1.1 pk } 394 1.19 jdc 395 1.19 jdc #if NWSDISPLAY > 0 396 1.19 jdc 397 1.19 jdc int 398 1.19 jdc bwtwo_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, 399 1.19 jdc struct lwp *l) 400 1.19 jdc { 401 1.19 jdc /* we'll probably need to add more stuff here */ 402 1.19 jdc struct vcons_data *vd = v; 403 1.19 jdc struct bwtwo_softc *sc = vd->cookie; 404 1.19 jdc struct wsdisplay_fbinfo *wdf; 405 1.19 jdc struct vcons_screen *ms = sc->vd.active; 406 1.35 macallan struct rasops_info *ri = &ms->scr_ri; 407 1.19 jdc switch (cmd) { 408 1.19 jdc case WSDISPLAYIO_GTYPE: 409 1.19 jdc *(u_int *)data = WSDISPLAY_TYPE_GENFB; 410 1.19 jdc return 0; 411 1.19 jdc case WSDISPLAYIO_GINFO: 412 1.19 jdc wdf = (void *)data; 413 1.19 jdc wdf->height = ri->ri_height; 414 1.19 jdc wdf->width = ri->ri_width; 415 1.19 jdc wdf->depth = ri->ri_depth; 416 1.19 jdc wdf->cmsize = 0; 417 1.19 jdc return 0; 418 1.19 jdc 419 1.19 jdc case WSDISPLAYIO_GETCMAP: 420 1.19 jdc return EINVAL; 421 1.19 jdc case WSDISPLAYIO_PUTCMAP: 422 1.19 jdc return EINVAL; 423 1.19 jdc 424 1.19 jdc case WSDISPLAYIO_SMODE: 425 1.19 jdc { 426 1.19 jdc int new_mode = *(int*)data; 427 1.19 jdc if (new_mode != sc->sc_mode) 428 1.19 jdc { 429 1.19 jdc sc->sc_mode = new_mode; 430 1.19 jdc if(new_mode == WSDISPLAYIO_MODE_EMUL) 431 1.19 jdc { 432 1.19 jdc vcons_redraw_screen(ms); 433 1.19 jdc } 434 1.19 jdc } 435 1.19 jdc } 436 1.36 macallan return 0; 437 1.36 macallan case WSDISPLAYIO_GET_FBINFO: 438 1.36 macallan { 439 1.36 macallan struct wsdisplayio_fbinfo *fbi = data; 440 1.36 macallan 441 1.36 macallan return wsdisplayio_get_fbinfo(&ms->scr_ri, fbi); 442 1.36 macallan } 443 1.19 jdc } 444 1.19 jdc return EPASSTHROUGH; 445 1.19 jdc } 446 1.19 jdc 447 1.19 jdc paddr_t 448 1.19 jdc bwtwo_mmap(void *v, void *vs, off_t offset, int prot) 449 1.19 jdc { 450 1.36 macallan struct vcons_data *vd = v; 451 1.36 macallan struct bwtwo_softc *sc = vd->cookie; 452 1.36 macallan 453 1.36 macallan if (offset < 0) return -1; 454 1.36 macallan if (offset >= sc->sc_fb.fb_type.fb_size) 455 1.36 macallan return -1; 456 1.36 macallan 457 1.36 macallan return bus_space_mmap(sc->sc_bustag, 458 1.36 macallan sc->sc_paddr, sc->sc_pixeloffset + offset, 459 1.36 macallan prot, BUS_SPACE_MAP_LINEAR); 460 1.19 jdc } 461 1.19 jdc 462 1.19 jdc void 463 1.19 jdc bwtwo_init_screen(void *cookie, struct vcons_screen *scr, 464 1.19 jdc int existing, long *defattr) 465 1.19 jdc { 466 1.19 jdc struct bwtwo_softc *sc = cookie; 467 1.19 jdc struct rasops_info *ri = &scr->scr_ri; 468 1.31 jdc char *bits; 469 1.19 jdc 470 1.19 jdc ri->ri_depth = 1; 471 1.19 jdc ri->ri_width = sc->sc_width; 472 1.19 jdc ri->ri_height = sc->sc_height; 473 1.19 jdc ri->ri_stride = sc->sc_stride; 474 1.21 jdc ri->ri_flg = RI_CENTER; 475 1.19 jdc 476 1.19 jdc ri->ri_bits = sc->sc_fb.fb_pixels; 477 1.21 jdc 478 1.31 jdc /* 479 1.31 jdc * Make sure that we set a maximum of 32 bits at a time, 480 1.31 jdc * otherwise we'll see VME write errors if this is a P4 BW2. 481 1.31 jdc */ 482 1.31 jdc for (bits = (char *) ri->ri_bits; 483 1.31 jdc bits < (char *) ri->ri_bits + ri->ri_stride * ri->ri_height; 484 1.32 joerg bits += 4) 485 1.31 jdc memset(bits, (*defattr >> 16) & 0xff, 4); 486 1.30 macallan rasops_init(ri, 0, 0); 487 1.19 jdc ri->ri_caps = 0; 488 1.19 jdc rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight, 489 1.19 jdc sc->sc_width / ri->ri_font->fontwidth); 490 1.19 jdc 491 1.19 jdc ri->ri_hw = scr; 492 1.19 jdc } 493 1.19 jdc 494 1.19 jdc #endif /* NWSDISPLAY > 0 */ 495