1 1.73 thorpej /* $NetBSD: ofb.c,v 1.73 2023/12/20 15:29:04 thorpej Exp $ */ 2 1.1 tsubai 3 1.1 tsubai /* 4 1.1 tsubai * Copyright (c) 1995, 1996 Carnegie-Mellon University. 5 1.1 tsubai * All rights reserved. 6 1.1 tsubai * 7 1.1 tsubai * Author: Chris G. Demetriou 8 1.1 tsubai * 9 1.1 tsubai * Permission to use, copy, modify and distribute this software and 10 1.1 tsubai * its documentation is hereby granted, provided that both the copyright 11 1.1 tsubai * notice and this permission notice appear in all copies of the 12 1.1 tsubai * software, derivative works or modified versions, and any portions 13 1.1 tsubai * thereof, and that both notices appear in supporting documentation. 14 1.1 tsubai * 15 1.1 tsubai * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 1.1 tsubai * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17 1.1 tsubai * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 1.1 tsubai * 19 1.1 tsubai * Carnegie Mellon requests users of this software to return to 20 1.1 tsubai * 21 1.1 tsubai * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU 22 1.1 tsubai * School of Computer Science 23 1.1 tsubai * Carnegie Mellon University 24 1.1 tsubai * Pittsburgh PA 15213-3890 25 1.1 tsubai * 26 1.1 tsubai * any improvements or extensions that they make and grant Carnegie the 27 1.1 tsubai * rights to redistribute these changes. 28 1.1 tsubai */ 29 1.36 lukem 30 1.36 lukem #include <sys/cdefs.h> 31 1.73 thorpej __KERNEL_RCSID(0, "$NetBSD: ofb.c,v 1.73 2023/12/20 15:29:04 thorpej Exp $"); 32 1.1 tsubai 33 1.1 tsubai #include <sys/param.h> 34 1.1 tsubai #include <sys/buf.h> 35 1.1 tsubai #include <sys/conf.h> 36 1.1 tsubai #include <sys/device.h> 37 1.1 tsubai #include <sys/ioctl.h> 38 1.1 tsubai #include <sys/kernel.h> 39 1.1 tsubai #include <sys/systm.h> 40 1.49 elad #include <sys/kauth.h> 41 1.59 ad #include <sys/lwp.h> 42 1.1 tsubai 43 1.3 tsubai #include <dev/pci/pcidevs.h> 44 1.1 tsubai #include <dev/pci/pcireg.h> 45 1.1 tsubai #include <dev/pci/pcivar.h> 46 1.27 nathanw #include <dev/pci/pciio.h> 47 1.1 tsubai 48 1.1 tsubai #include <dev/wscons/wsconsio.h> 49 1.1 tsubai #include <dev/wscons/wsdisplayvar.h> 50 1.11 tsubai #include <dev/rasops/rasops.h> 51 1.45 macallan #include <dev/wsfont/wsfont.h> 52 1.1 tsubai 53 1.20 matt #include <dev/ofw/openfirm.h> 54 1.13 tsubai #include <dev/ofw/ofw_pci.h> 55 1.13 tsubai 56 1.67 dyoung #include <sys/bus.h> 57 1.20 matt #include <machine/autoconf.h> 58 1.1 tsubai #include <machine/grfioctl.h> 59 1.37 matt 60 1.52 macallan #include <dev/wscons/wsdisplay_vconsvar.h> 61 1.1 tsubai 62 1.63 garbled #include <powerpc/oea/ofw_rasconsvar.h> 63 1.1 tsubai 64 1.52 macallan struct ofb_softc { 65 1.69 chs device_t sc_dev; 66 1.52 macallan 67 1.52 macallan pci_chipset_tag_t sc_pc; 68 1.52 macallan pcitag_t sc_pcitag; 69 1.52 macallan bus_space_tag_t sc_memt; 70 1.52 macallan bus_space_tag_t sc_iot; 71 1.52 macallan 72 1.52 macallan u_int32_t sc_addrs[30]; /* "assigned-addresses" storage */ 73 1.52 macallan u_char sc_cmap_red[256]; 74 1.52 macallan u_char sc_cmap_green[256]; 75 1.52 macallan u_char sc_cmap_blue[256]; 76 1.52 macallan 77 1.52 macallan int sc_node, sc_ih, sc_mode; 78 1.52 macallan paddr_t sc_fbaddr; 79 1.61 macallan uint32_t sc_fbsize; 80 1.61 macallan 81 1.52 macallan struct vcons_data vd; 82 1.52 macallan }; 83 1.18 tsubai 84 1.66 matt static int ofbmatch(device_t, cfdata_t, void *); 85 1.66 matt static void ofbattach(device_t, device_t, void *); 86 1.1 tsubai 87 1.69 chs CFATTACH_DECL_NEW(ofb, sizeof(struct ofb_softc), 88 1.32 thorpej ofbmatch, ofbattach, NULL, NULL); 89 1.1 tsubai 90 1.1 tsubai const struct wsscreen_descr *_ofb_scrlist[] = { 91 1.63 garbled &rascons_stdscreen, 92 1.1 tsubai /* XXX other formats, graphics screen? */ 93 1.1 tsubai }; 94 1.1 tsubai 95 1.1 tsubai struct wsscreen_list ofb_screenlist = { 96 1.1 tsubai sizeof(_ofb_scrlist) / sizeof(struct wsscreen_descr *), _ofb_scrlist 97 1.1 tsubai }; 98 1.1 tsubai 99 1.56 christos static int ofb_ioctl(void *, void *, u_long, void *, int, struct lwp *); 100 1.48 jmmv static paddr_t ofb_mmap(void *, void *, off_t, int); 101 1.45 macallan 102 1.45 macallan static void ofb_init_screen(void *, struct vcons_screen *, int, long *); 103 1.1 tsubai 104 1.1 tsubai struct wsdisplay_accessops ofb_accessops = { 105 1.1 tsubai ofb_ioctl, 106 1.1 tsubai ofb_mmap, 107 1.45 macallan NULL, /* vcons_alloc_screen */ 108 1.45 macallan NULL, /* vcons_free_screen */ 109 1.45 macallan NULL, /* vcons_show_screen */ 110 1.45 macallan NULL /* load_font */ 111 1.1 tsubai }; 112 1.1 tsubai 113 1.45 macallan static void ofb_putpalreg(struct ofb_softc *, int, uint8_t, uint8_t, 114 1.45 macallan uint8_t); 115 1.45 macallan 116 1.45 macallan static int ofb_getcmap(struct ofb_softc *, struct wsdisplay_cmap *); 117 1.45 macallan static int ofb_putcmap(struct ofb_softc *, struct wsdisplay_cmap *); 118 1.45 macallan static void ofb_init_cmap(struct ofb_softc *); 119 1.57 macallan static int ofb_drm_print(void *, const char *); 120 1.11 tsubai 121 1.45 macallan extern const u_char rasops_cmap[768]; 122 1.1 tsubai 123 1.52 macallan extern int console_node; 124 1.52 macallan extern int console_instance; 125 1.52 macallan 126 1.45 macallan static int 127 1.66 matt ofbmatch(device_t parent, cfdata_t match, void *aux) 128 1.1 tsubai { 129 1.1 tsubai struct pci_attach_args *pa = aux; 130 1.1 tsubai 131 1.3 tsubai if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_APPLE && 132 1.11 tsubai PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_APPLE_CONTROL) 133 1.3 tsubai return 1; 134 1.1 tsubai 135 1.3 tsubai if (PCI_CLASS(pa->pa_class) == PCI_CLASS_DISPLAY) 136 1.3 tsubai return 1; 137 1.3 tsubai 138 1.3 tsubai return 0; 139 1.1 tsubai } 140 1.1 tsubai 141 1.44 macallan static void 142 1.66 matt ofbattach(device_t parent, device_t self, void *aux) 143 1.1 tsubai { 144 1.66 matt struct ofb_softc *sc = device_private(self); 145 1.1 tsubai struct pci_attach_args *pa = aux; 146 1.1 tsubai struct wsemuldisplaydev_attach_args a; 147 1.63 garbled struct rasops_info *ri = &rascons_console_screen.scr_ri; 148 1.45 macallan long defattr; 149 1.52 macallan int console, node, sub; 150 1.5 tsubai char devinfo[256]; 151 1.1 tsubai 152 1.69 chs sc->sc_dev = self; 153 1.69 chs 154 1.53 macallan pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof(devinfo)); 155 1.53 macallan printf(": %s\n", devinfo); 156 1.53 macallan 157 1.53 macallan if (console_node == 0) 158 1.53 macallan return; 159 1.53 macallan 160 1.46 macallan node = pcidev_to_ofdev(pa->pa_pc, pa->pa_tag); 161 1.46 macallan console = (node == console_node); 162 1.47 macallan if (!console) { 163 1.47 macallan /* check if any of the childs matches */ 164 1.47 macallan sub = OF_child(node); 165 1.47 macallan while ((sub != 0) && (sub != console_node)) { 166 1.47 macallan sub = OF_peer(sub); 167 1.47 macallan } 168 1.47 macallan if (sub == console_node) { 169 1.55 thorpej console = true; 170 1.47 macallan } 171 1.47 macallan } 172 1.46 macallan 173 1.42 macallan sc->sc_memt = pa->pa_memt; 174 1.42 macallan sc->sc_iot = pa->pa_iot; 175 1.45 macallan sc->sc_pc = pa->pa_pc; 176 1.45 macallan sc->sc_pcitag = pa->pa_tag; 177 1.45 macallan sc->sc_mode = WSDISPLAYIO_MODE_EMUL; 178 1.46 macallan 179 1.46 macallan if (!console) 180 1.46 macallan return; 181 1.45 macallan 182 1.63 garbled vcons_init(&sc->vd, sc, &rascons_stdscreen, &ofb_accessops); 183 1.45 macallan sc->vd.init_screen = ofb_init_screen; 184 1.45 macallan 185 1.52 macallan sc->sc_node = console_node; 186 1.1 tsubai 187 1.52 macallan sc->sc_ih = console_instance; 188 1.63 garbled vcons_init_screen(&sc->vd, &rascons_console_screen, 1, &defattr); 189 1.63 garbled rascons_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC; 190 1.52 macallan 191 1.69 chs printf("%s: %d x %d, %dbpp\n", device_xname(self), 192 1.52 macallan ri->ri_width, ri->ri_height, ri->ri_depth); 193 1.45 macallan 194 1.45 macallan sc->sc_fbaddr = 0; 195 1.45 macallan if (OF_getprop(sc->sc_node, "address", &sc->sc_fbaddr, 4) != 4) 196 1.58 macallan OF_interpret("frame-buffer-adr", 0, 1, &sc->sc_fbaddr); 197 1.45 macallan if (sc->sc_fbaddr == 0) { 198 1.45 macallan printf("%s: Unable to find the framebuffer address.\n", 199 1.69 chs device_xname(sc->sc_dev)); 200 1.45 macallan return; 201 1.1 tsubai } 202 1.61 macallan sc->sc_fbsize = round_page(ri->ri_stride * ri->ri_height); 203 1.61 macallan 204 1.16 tsubai /* XXX */ 205 1.45 macallan if (OF_getprop(sc->sc_node, "assigned-addresses", sc->sc_addrs, 206 1.16 tsubai sizeof(sc->sc_addrs)) == -1) { 207 1.45 macallan sc->sc_node = OF_parent(sc->sc_node); 208 1.45 macallan OF_getprop(sc->sc_node, "assigned-addresses", sc->sc_addrs, 209 1.16 tsubai sizeof(sc->sc_addrs)); 210 1.16 tsubai } 211 1.13 tsubai 212 1.52 macallan ofb_init_cmap(sc); 213 1.1 tsubai 214 1.1 tsubai a.console = console; 215 1.1 tsubai a.scrdata = &ofb_screenlist; 216 1.1 tsubai a.accessops = &ofb_accessops; 217 1.45 macallan a.accesscookie = &sc->vd; 218 1.1 tsubai 219 1.71 thorpej config_found(self, &a, wsemuldisplaydevprint, 220 1.72 thorpej CFARGS(.iattr = "wsemuldisplaydev")); 221 1.71 thorpej 222 1.71 thorpej config_found(self, aux, ofb_drm_print, 223 1.72 thorpej CFARGS(.iattr = "drm")); 224 1.57 macallan } 225 1.57 macallan 226 1.57 macallan static int 227 1.57 macallan ofb_drm_print(void *aux, const char *pnp) 228 1.57 macallan { 229 1.57 macallan if (pnp) 230 1.57 macallan aprint_normal("direct rendering for %s", pnp); 231 1.57 macallan return (UNSUPP); 232 1.1 tsubai } 233 1.1 tsubai 234 1.44 macallan static void 235 1.45 macallan ofb_init_screen(void *cookie, struct vcons_screen *scr, 236 1.45 macallan int existing, long *defattr) 237 1.1 tsubai { 238 1.45 macallan struct ofb_softc *sc = cookie; 239 1.45 macallan struct rasops_info *ri = &scr->scr_ri; 240 1.45 macallan 241 1.63 garbled if (scr != &rascons_console_screen) { 242 1.63 garbled rascons_init_rasops(sc->sc_node, ri); 243 1.45 macallan } 244 1.45 macallan } 245 1.1 tsubai 246 1.45 macallan static int 247 1.56 christos ofb_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, struct lwp *l) 248 1.1 tsubai { 249 1.45 macallan struct vcons_data *vd = v; 250 1.45 macallan struct ofb_softc *sc = vd->cookie; 251 1.1 tsubai struct wsdisplay_fbinfo *wdf; 252 1.45 macallan struct vcons_screen *ms = vd->active; 253 1.1 tsubai struct grfinfo *gm; 254 1.1 tsubai 255 1.1 tsubai switch (cmd) { 256 1.1 tsubai case WSDISPLAYIO_GTYPE: 257 1.1 tsubai *(u_int *)data = WSDISPLAY_TYPE_PCIMISC; /* XXX ? */ 258 1.1 tsubai return 0; 259 1.1 tsubai 260 1.1 tsubai case WSDISPLAYIO_GINFO: 261 1.45 macallan /* we won't get here without any screen anyway */ 262 1.45 macallan if (ms != NULL) { 263 1.45 macallan wdf = (void *)data; 264 1.61 macallan wdf->height = ms->scr_ri.ri_height; 265 1.61 macallan wdf->width = ms->scr_ri.ri_width; 266 1.45 macallan wdf->depth = ms->scr_ri.ri_depth; 267 1.45 macallan wdf->cmsize = 256; 268 1.45 macallan return 0; 269 1.45 macallan } else 270 1.45 macallan return ENODEV; 271 1.1 tsubai 272 1.11 tsubai case WSDISPLAYIO_GETCMAP: 273 1.11 tsubai return ofb_getcmap(sc, (struct wsdisplay_cmap *)data); 274 1.11 tsubai 275 1.1 tsubai case WSDISPLAYIO_PUTCMAP: 276 1.11 tsubai return ofb_putcmap(sc, (struct wsdisplay_cmap *)data); 277 1.1 tsubai 278 1.1 tsubai /* XXX There are no way to know framebuffer pa from a user program. */ 279 1.1 tsubai case GRFIOCGINFO: 280 1.45 macallan if (ms != NULL) { 281 1.45 macallan gm = (void *)data; 282 1.45 macallan memset(gm, 0, sizeof(struct grfinfo)); 283 1.56 christos gm->gd_fbaddr = (void *)sc->sc_fbaddr; 284 1.45 macallan gm->gd_fbrowbytes = ms->scr_ri.ri_stride; 285 1.45 macallan return 0; 286 1.45 macallan } else 287 1.45 macallan return ENODEV; 288 1.60 macallan case WSDISPLAYIO_LINEBYTES: 289 1.60 macallan { 290 1.60 macallan *(int *)data = ms->scr_ri.ri_stride; 291 1.60 macallan return 0; 292 1.60 macallan } 293 1.45 macallan case WSDISPLAYIO_SMODE: 294 1.45 macallan { 295 1.45 macallan int new_mode = *(int*)data; 296 1.45 macallan if (new_mode != sc->sc_mode) 297 1.45 macallan { 298 1.45 macallan sc->sc_mode = new_mode; 299 1.45 macallan if (new_mode == WSDISPLAYIO_MODE_EMUL) 300 1.45 macallan { 301 1.45 macallan ofb_init_cmap(sc); 302 1.45 macallan vcons_redraw_screen(ms); 303 1.45 macallan } 304 1.45 macallan } 305 1.45 macallan } 306 1.1 tsubai return 0; 307 1.27 nathanw /* PCI config read/write passthrough. */ 308 1.27 nathanw case PCI_IOC_CFGREAD: 309 1.27 nathanw case PCI_IOC_CFGWRITE: 310 1.27 nathanw return (pci_devioctl(sc->sc_pc, sc->sc_pcitag, 311 1.43 christos cmd, data, flag, l)); 312 1.1 tsubai } 313 1.26 atatat return EPASSTHROUGH; 314 1.1 tsubai } 315 1.1 tsubai 316 1.44 macallan static paddr_t 317 1.48 jmmv ofb_mmap(void *v, void *vs, off_t offset, int prot) 318 1.1 tsubai { 319 1.45 macallan struct vcons_data *vd = v; 320 1.45 macallan struct ofb_softc *sc = vd->cookie; 321 1.13 tsubai u_int32_t *ap = sc->sc_addrs; 322 1.13 tsubai int i; 323 1.13 tsubai 324 1.45 macallan if (vd->active == NULL) { 325 1.69 chs printf("%s: no active screen.\n", device_xname(sc->sc_dev)); 326 1.45 macallan return -1; 327 1.45 macallan } 328 1.45 macallan 329 1.42 macallan /* framebuffer at offset 0 */ 330 1.61 macallan if ((offset >= 0) && (offset < sc->sc_fbsize)) 331 1.61 macallan return bus_space_mmap(sc->sc_memt, sc->sc_fbaddr, offset, prot, 332 1.61 macallan BUS_SPACE_MAP_LINEAR); 333 1.13 tsubai 334 1.42 macallan /* 335 1.42 macallan * restrict all other mappings to processes with superuser privileges 336 1.42 macallan * or the kernel itself 337 1.42 macallan */ 338 1.68 elad if (kauth_authorize_machdep(kauth_cred_get(), KAUTH_MACHDEP_UNMANAGEDMEM, 339 1.68 elad NULL, NULL, NULL, NULL) != 0) { 340 1.69 chs printf("%s: mmap() rejected.\n", device_xname(sc->sc_dev)); 341 1.64 elad return -1; 342 1.42 macallan } 343 1.42 macallan 344 1.42 macallan /* let them mmap() 0xa0000 - 0xbffff if it's not covered above */ 345 1.42 macallan #ifdef OFB_FAKE_VGA_FB 346 1.42 macallan if (offset >=0xa0000 && offset < 0xbffff) 347 1.45 macallan return sc->sc_fbaddr + offset - 0xa0000; 348 1.42 macallan #endif 349 1.42 macallan 350 1.42 macallan /* allow to map our IO space */ 351 1.42 macallan if ((offset >= 0xf2000000) && (offset < 0xf2800000)) { 352 1.42 macallan return bus_space_mmap(sc->sc_iot, offset-0xf2000000, 0, prot, 353 1.42 macallan BUS_SPACE_MAP_LINEAR); 354 1.42 macallan } 355 1.42 macallan 356 1.13 tsubai for (i = 0; i < 6; i++) { 357 1.13 tsubai switch (ap[0] & OFW_PCI_PHYS_HI_SPACEMASK) { 358 1.13 tsubai case OFW_PCI_PHYS_HI_SPACE_MEM32: 359 1.42 macallan if (offset >= ap[2] && offset < ap[2] + ap[4]) 360 1.42 macallan return bus_space_mmap(sc->sc_memt, offset, 0, 361 1.42 macallan prot, BUS_SPACE_MAP_LINEAR); 362 1.13 tsubai } 363 1.13 tsubai ap += 5; 364 1.13 tsubai } 365 1.13 tsubai return -1; 366 1.1 tsubai } 367 1.1 tsubai 368 1.44 macallan static int 369 1.44 macallan ofb_getcmap(struct ofb_softc *sc, struct wsdisplay_cmap *cm) 370 1.11 tsubai { 371 1.11 tsubai u_int index = cm->index; 372 1.11 tsubai u_int count = cm->count; 373 1.11 tsubai int error; 374 1.11 tsubai 375 1.11 tsubai if (index >= 256 || count > 256 || index + count > 256) 376 1.11 tsubai return EINVAL; 377 1.11 tsubai 378 1.11 tsubai error = copyout(&sc->sc_cmap_red[index], cm->red, count); 379 1.11 tsubai if (error) 380 1.11 tsubai return error; 381 1.11 tsubai error = copyout(&sc->sc_cmap_green[index], cm->green, count); 382 1.11 tsubai if (error) 383 1.11 tsubai return error; 384 1.11 tsubai error = copyout(&sc->sc_cmap_blue[index], cm->blue, count); 385 1.11 tsubai if (error) 386 1.11 tsubai return error; 387 1.8 tsubai 388 1.1 tsubai return 0; 389 1.1 tsubai } 390 1.1 tsubai 391 1.45 macallan int 392 1.44 macallan ofb_putcmap(struct ofb_softc *sc, struct wsdisplay_cmap *cm) 393 1.1 tsubai { 394 1.25 jdolecek u_int index = cm->index; 395 1.25 jdolecek u_int count = cm->count; 396 1.38 chs int i, error; 397 1.38 chs u_char rbuf[256], gbuf[256], bbuf[256]; 398 1.1 tsubai u_char *r, *g, *b; 399 1.1 tsubai 400 1.1 tsubai if (cm->index >= 256 || cm->count > 256 || 401 1.1 tsubai (cm->index + cm->count) > 256) 402 1.1 tsubai return EINVAL; 403 1.38 chs error = copyin(cm->red, &rbuf[index], count); 404 1.38 chs if (error) 405 1.38 chs return error; 406 1.38 chs error = copyin(cm->green, &gbuf[index], count); 407 1.38 chs if (error) 408 1.38 chs return error; 409 1.38 chs error = copyin(cm->blue, &bbuf[index], count); 410 1.38 chs if (error) 411 1.38 chs return error; 412 1.38 chs 413 1.38 chs memcpy(&sc->sc_cmap_red[index], &rbuf[index], count); 414 1.38 chs memcpy(&sc->sc_cmap_green[index], &gbuf[index], count); 415 1.38 chs memcpy(&sc->sc_cmap_blue[index], &bbuf[index], count); 416 1.1 tsubai 417 1.1 tsubai r = &sc->sc_cmap_red[index]; 418 1.1 tsubai g = &sc->sc_cmap_green[index]; 419 1.1 tsubai b = &sc->sc_cmap_blue[index]; 420 1.1 tsubai for (i = 0; i < count; i++) { 421 1.45 macallan OF_call_method_1("color!", sc->sc_ih, 4, *r, *g, *b, index); 422 1.1 tsubai r++, g++, b++, index++; 423 1.1 tsubai } 424 1.1 tsubai return 0; 425 1.1 tsubai } 426 1.45 macallan 427 1.45 macallan static void 428 1.45 macallan ofb_putpalreg(struct ofb_softc *sc, int idx, uint8_t r, uint8_t g, uint8_t b) 429 1.45 macallan { 430 1.45 macallan if ((idx<0) || (idx > 255)) 431 1.45 macallan return; 432 1.52 macallan if (sc != NULL) { 433 1.52 macallan OF_call_method_1("color!", sc->sc_ih, 4, r, g, b, idx); 434 1.52 macallan sc->sc_cmap_red[idx] = r; 435 1.52 macallan sc->sc_cmap_green[idx] = g; 436 1.52 macallan sc->sc_cmap_blue[idx] = b; 437 1.52 macallan } else { 438 1.52 macallan OF_call_method_1("color!", console_instance, 4, r, g, b, idx); 439 1.52 macallan } 440 1.45 macallan } 441 1.45 macallan 442 1.45 macallan static void 443 1.45 macallan ofb_init_cmap(struct ofb_softc *sc) 444 1.45 macallan { 445 1.70 chs int i; 446 1.70 chs 447 1.45 macallan /* mess with the palette only when we're running in 8 bit */ 448 1.63 garbled if (rascons_console_screen.scr_ri.ri_depth == 8) { 449 1.45 macallan for (i = 0; i < 256; i++) { 450 1.52 macallan ofb_putpalreg(sc, i, rasops_cmap[(i * 3) + 0], 451 1.52 macallan rasops_cmap[(i * 3) + 1], 452 1.52 macallan rasops_cmap[(i * 3) + 2]); 453 1.45 macallan } 454 1.45 macallan } 455 1.45 macallan } 456