static void bwtwoattach_any(device_t parent, device_t self, void *aux) { struct bwtwosun2_softc *scsun2 = device_private(self); struct bwtwo_softc *sc = &scsun2->sc; struct mainbus_attach_args *ma = aux; struct fbdevice *fb = &sc->sc_fb; bus_space_handle_t bh; int isconsole; const char *name; sc->sc_dev = self; /* Remember cookies for bwtwo_mmap() */ sc->sc_bustag = ma->ma_bustag; sc->sc_paddr = ma->ma_paddr; fb->fb_flags = device_cfdata(self)->cf_flags; fb->fb_type.fb_depth = 1; fb_setsize_eeprom(fb, fb->fb_type.fb_depth, 1152, 900); isconsole = fb_is_console(0); /* A plain bwtwo */ sc->sc_reg = NULL; fb->fb_pfour = NULL; name = "bwtwo"; sc->sc_pixeloffset = BWREG_MEM; sc->sc_get_video = bwtwo_get_video_sun2; sc->sc_set_video = bwtwo_set_video_sun2; /* Map the registers. */ if (bus_space_map(ma->ma_bustag, ma->ma_paddr + BWREG_REG, sizeof(struct bwtworeg), 0, &scsun2->bh)) { printf("%s: cannot map regs\n", device_xname(self)); return; } if (isconsole) { int ramsize = fb->fb_type.fb_height * fb->fb_linebytes; if (bus_space_map(ma->ma_bustag, ma->ma_paddr + sc->sc_pixeloffset, ramsize, BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map pixels\n", device_xname(self)); return; } sc->sc_fb.fb_pixels = (char *)bh; } bwtwoattach(sc, name, isconsole); }
/* * Attach a display. We need to notice if it is the console, too. */ static void cgeightattach(struct device *parent, struct device *self, void *aux) { #if defined(SUN4) union obio_attach_args *uoba = aux; struct obio4_attach_args *oba = &uoba->uoba_oba4; struct cgeight_softc *sc = device_private(self); struct fbdevice *fb = &sc->sc_fb; bus_space_handle_t bh; volatile struct bt_regs *bt; int ramsize, i, isconsole; sc->sc_bustag = oba->oba_bustag; sc->sc_paddr = (bus_addr_t)oba->oba_paddr; /* Map the pfour register. */ if (bus_space_map(oba->oba_bustag, oba->oba_paddr, sizeof(uint32_t), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map pfour register\n", self->dv_xname); return; } fb->fb_pfour = (volatile uint32_t *)bh; fb->fb_driver = &cgeightfbdriver; fb->fb_device = &sc->sc_dev; fb->fb_type.fb_type = FBTYPE_MEMCOLOR; fb->fb_flags = device_cfdata(&sc->sc_dev)->cf_flags & FB_USERMASK; fb->fb_flags |= FB_PFOUR; ramsize = PFOUR_COLOR_OFF_END - PFOUR_COLOR_OFF_OVERLAY; fb->fb_type.fb_depth = 24; fb_setsize_eeprom(fb, fb->fb_type.fb_depth, 1152, 900); sc->sc_fb.fb_type.fb_cmsize = 256; sc->sc_fb.fb_type.fb_size = ramsize; printf(": cgeight/p4, %d x %d", fb->fb_type.fb_width, fb->fb_type.fb_height); isconsole = 0; if (CPU_ISSUN4) { struct eeprom *eep = (struct eeprom *)eeprom_va; /* * Assume this is the console if there's no eeprom info * to be found. */ if (eep == NULL || eep->eeConsole == EE_CONS_P4OPT) isconsole = fb_is_console(0); } #if 0 /* * We don't do any of the console handling here. Instead, * we let the bwtwo driver pick up the overlay plane and * use it instead. Rconsole should have better performance * with the 1-bit depth. * -- Jason R. Thorpe <*****@*****.**> */ /* * When the ROM has mapped in a cgfour display, the address * maps only the video RAM, so in any case we have to map the * registers ourselves. We only need the video RAM if we are * going to print characters via rconsole. */ if (isconsole) { /* XXX this is kind of a waste */ fb->fb_pixels = mapiodev(ca->ca_ra.ra_reg, PFOUR_COLOR_OFF_OVERLAY, ramsize); } #endif /* Map the Brooktree. */ if (bus_space_map(oba->oba_bustag, oba->oba_paddr + PFOUR_COLOR_OFF_CMAP, sizeof(struct fbcontrol), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map control registers\n", self->dv_xname); return; } sc->sc_fbc = (volatile struct fbcontrol *)bh; #if 0 /* XXX thorpej ??? */ /* tell the enable plane to look at the mono image */ memset(ca->ca_ra.ra_vaddr, 0xff, sc->sc_fb.fb_type.fb_width * sc->sc_fb.fb_type.fb_height / 8); #endif /* grab initial (current) color map */ bt = &sc->sc_fbc->fbc_dac; bt->bt_addr = 0; for (i = 0; i < 256 * 3 / 4; i++) sc->sc_cmap.cm_chip[i] = bt->bt_cmap; BT_INIT(bt, 0); #if 0 /* see above */ if (isconsole) { printf(" (console)\n"); #if defined(RASTERCONSOLE) && 0 /* XXX been told it doesn't work well. */ fbrcons_init(fb); #endif } else #endif /* 0 */ printf("\n"); /* * Even though we're not using rconsole, we'd still like * to notice if we're the console framebuffer. */ fb_attach(&sc->sc_fb, isconsole); #endif }
/* * Attach a display. */ static void cgsixattach(device_t parent, device_t self, void *aux) { struct cgsix_softc *sc = device_private(self); union obio_attach_args *uoba = aux; struct obio4_attach_args *oba; struct eeprom *eep = (struct eeprom *)eeprom_va; struct fbdevice *fb = &sc->sc_fb; bus_space_handle_t bh; int constype, isconsole; const char *name; sc->sc_dev = self; oba = &uoba->uoba_oba4; /* Remember cookies for cgsix_mmap() */ sc->sc_bustag = oba->oba_bustag; sc->sc_paddr = (bus_addr_t)oba->oba_paddr; fb->fb_device = sc->sc_dev; fb->fb_type.fb_type = FBTYPE_SUNFAST_COLOR; fb->fb_flags = device_cfdata(sc->sc_dev)->cf_flags & FB_USERMASK; fb->fb_type.fb_depth = 8; fb_setsize_eeprom(fb, fb->fb_type.fb_depth, 1152, 900); sc->sc_ramsize = 1024 * 1024; /* All our cgsix's are 1MB */ /* * Dunno what the PROM has mapped, though obviously it must have * the video RAM mapped. Just map what we care about for ourselves * (the FHC, THC, and Brooktree registers). */ if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_BT_OFFSET, sizeof(*sc->sc_bt), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map brooktree registers\n", device_xname(self)); return; } sc->sc_bt = (struct bt_regs *)bh; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_FHC_OFFSET, sizeof(*sc->sc_fhc), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map FHC registers\n", device_xname(self)); return; } sc->sc_fhc = (int *)bh; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_THC_OFFSET, sizeof(*sc->sc_thc), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map THC registers\n", device_xname(self)); return; } sc->sc_thc = (struct cg6_thc *)bh; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_TEC_OFFSET, sizeof(*sc->sc_tec), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map TEC registers\n", device_xname(self)); return; } sc->sc_tec = (struct cg6_tec_xxx *)bh; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_FBC_OFFSET, sizeof(*sc->sc_fbc), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map FBC registers\n", device_xname(self)); return; } sc->sc_fbc = (struct cg6_fbc *)bh; if (fb_pfour_id(sc->sc_fhc) == PFOUR_ID_FASTCOLOR) { fb->fb_flags |= FB_PFOUR; name = "cgsix/p4"; } else name = "cgsix"; constype = (fb->fb_flags & FB_PFOUR) ? EE_CONS_P4OPT : EE_CONS_COLOR; /* * Check to see if this is the console if there's no eeprom info * to be found, or if it's the correct framebuffer type. */ if (eep == NULL || eep->eeConsole == constype) isconsole = fb_is_console(0); else isconsole = 0; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + CGSIX_RAM_OFFSET, sc->sc_ramsize, BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map pixels\n", device_xname(self)); return; } sc->sc_fb.fb_pixels = (void *)bh; cg6attach(sc, name, isconsole); }
static void bwtwoattach_obio(device_t parent, device_t self, void *aux) { struct bwtwo_softc *sc = device_private(self); union obio_attach_args *uoba = aux; struct obio4_attach_args *oba; struct fbdevice *fb = &sc->sc_fb; struct eeprom *eep = (struct eeprom *)eeprom_va; bus_space_handle_t bh; int constype, isconsole; const char *name; sc->sc_dev = self; oba = &uoba->uoba_oba4; /* Remember cookies for bwtwo_mmap() */ sc->sc_bustag = oba->oba_bustag; sc->sc_paddr = (bus_addr_t)oba->oba_paddr; fb->fb_flags = device_cfdata(self)->cf_flags; fb->fb_type.fb_depth = 1; fb_setsize_eeprom(fb, fb->fb_type.fb_depth, 1152, 900); constype = (fb->fb_flags & FB_PFOUR) ? EE_CONS_P4OPT : EE_CONS_BW; if (eep == NULL || eep->eeConsole == constype) isconsole = fb_is_console(0); else isconsole = 0; if (fb->fb_flags & FB_PFOUR) { /* * Map the pfour control register. * Set pixel offset to appropriate overlay plane. */ name = "bwtwo/p4"; if (bus_space_map(oba->oba_bustag, oba->oba_paddr, sizeof(uint32_t), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map pfour register\n", device_xname(self)); return; } fb->fb_pfour = (uint32_t *)bh; sc->sc_reg = NULL; /* * Notice if this is an overlay plane on a color * framebuffer. Note that PFOUR_COLOR_OFF_OVERLAY * is the same as PFOUR_BW_OFF, but we use the * different names anyway. */ switch (PFOUR_ID(*fb->fb_pfour)) { case PFOUR_ID_COLOR8P1: sc->sc_ovtype = BWO_CGFOUR; sc->sc_pixeloffset = PFOUR_COLOR_OFF_OVERLAY; break; case PFOUR_ID_COLOR24: sc->sc_ovtype = BWO_CGEIGHT; sc->sc_pixeloffset = PFOUR_COLOR_OFF_OVERLAY; break; default: sc->sc_ovtype = BWO_NONE; sc->sc_pixeloffset = PFOUR_BW_OFF; break; } } else { /* A plain bwtwo */ if (bus_space_map(oba->oba_bustag, oba->oba_paddr + BWREG_REG, sizeof(struct fbcontrol), BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map control registers\n", device_xname(self)); return; } sc->sc_reg = (struct fbcontrol *)bh; fb->fb_pfour = NULL; name = "bwtwo"; sc->sc_pixeloffset = BWREG_MEM; } sc->sc_get_video = bwtwo_get_video_sun4; sc->sc_set_video = bwtwo_set_video_sun4; if (isconsole) { int ramsize = fb->fb_type.fb_height * fb->fb_linebytes; if (bus_space_map(oba->oba_bustag, oba->oba_paddr + sc->sc_pixeloffset, ramsize, BUS_SPACE_MAP_LINEAR, &bh) != 0) { printf("%s: cannot map pixels\n", device_xname(self)); return; } sc->sc_fb.fb_pixels = (char *)bh; } bwtwoattach(sc, name, isconsole); }