void cgeightattach(struct device *parent, struct device *self, void *args) { struct cgeight_softc *sc = (struct cgeight_softc *)self; struct confargs *ca = args; int node = 0; volatile struct bt_regs *bt; int isconsole = 0; /* Map the pfour register. */ SET(sc->sc_sunfb.sf_flags, FB_PFOUR); sc->sc_sunfb.sf_pfour = (volatile u_int32_t *) mapiodev(ca->ca_ra.ra_reg, 0, sizeof(u_int32_t)); if (cputyp == CPU_SUN4) { 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->ee_diag.eed_console == EED_CONS_P4) isconsole = 1; } /* Map the Brooktree. */ sc->sc_fbc = (volatile struct fbcontrol *) mapiodev(ca->ca_ra.ra_reg, PFOUR_COLOR_OFF_CMAP, sizeof(struct fbcontrol)); sc->sc_phys = ca->ca_ra.ra_reg[0]; /* enable video */ fb_pfour_burner(sc, 1, 0); bt = &sc->sc_fbc->fbc_dac; BT_INIT(bt, 0); fb_setsize(&sc->sc_sunfb, 1, 1152, 900, node, ca->ca_bustype); sc->sc_sunfb.sf_ro.ri_hw = sc; /* * Map the overlay and overlay enable planes. */ sc->sc_enable = (volatile u_char *)mapiodev(ca->ca_ra.ra_reg, PFOUR_COLOR_OFF_ENABLE, round_page(sc->sc_sunfb.sf_fbsize)); sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg, PFOUR_COLOR_OFF_OVERLAY, round_page(sc->sc_sunfb.sf_fbsize)); cgeight_reset(sc, WSDISPLAYIO_MODE_EMUL); printf(": p4, %dx%d", sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height); fbwscons_init(&sc->sc_sunfb, isconsole); if (isconsole) fbwscons_console_init(&sc->sc_sunfb, -1); fbwscons_attach(&sc->sc_sunfb, &cgeight_accessops, isconsole); }
void cgthreeattach(struct device *parent, struct device *self, void *args) { struct cgthree_softc *sc = (struct cgthree_softc *)self; struct confargs *ca = args; int node, pri, isrdi = 0, i; volatile struct bt_regs *bt; int isconsole; char *nam; pri = ca->ca_ra.ra_intr[0].int_pri; printf(" pri %d: ", pri); node = ca->ca_ra.ra_node; if (strcmp(ca->ca_ra.ra_name, "cgRDI") == 0) { isrdi = 1; nam = "cgRDI"; } else nam = getpropstring(node, "model"); if (nam != NULL && *nam != '\0') printf("%s, ", nam); isconsole = node == fbnode; sc->sc_fbc = (volatile struct fbcontrol *) mapiodev(ca->ca_ra.ra_reg, CG3REG_REG, sizeof(struct fbcontrol)); /* Transfer video magic to board, if it's not running */ if (isrdi == 0 && (sc->sc_fbc->fbc_ctrl & FBC_TIMING) == 0) for (i = 0; i < sizeof(cg3_videoctrl)/sizeof(cg3_videoctrl[0]); i++) { volatile struct fbcontrol *fbc = sc->sc_fbc; if (cg3_videoctrl[i].sense == 0xff || (fbc->fbc_status & FBS_MSENSE) == cg3_videoctrl[i].sense) { int j; #ifdef DEBUG printf(" (setting video ctrl)"); #endif for (j = 0; j < 12; j++) fbc->fbc_vcontrol[j] = cg3_videoctrl[i].vctrl[j]; fbc->fbc_ctrl |= FBC_TIMING; break; } } sc->sc_phys = ca->ca_ra.ra_reg[0]; sc->sc_ih.ih_fun = cgthree_intr; sc->sc_ih.ih_arg = sc; intr_establish(pri, &sc->sc_ih, IPL_FB, self->dv_xname); /* enable video */ cgthree_burner(sc, 1, 0); bt = &sc->sc_fbc->fbc_dac; BT_INIT(bt, 0); fb_setsize(&sc->sc_sunfb, 8, 1152, 900, node, ca->ca_bustype); sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg, CG3REG_MEM, round_page(sc->sc_sunfb.sf_fbsize)); sc->sc_sunfb.sf_ro.ri_hw = sc; printf("%dx%d\n", sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height); /* * If the framebuffer width is under 1024x768, which is the case for * some clones on laptops, as well as with the VS10-EK, switch from * the PROM font to the more adequate 8x16 font here. * However, we need to adjust two things in this case: * - the display row should be overrided from the current PROM metrics, * to prevent us from overwriting the last few lines of text. * - if the 80x34 screen would make a large margin appear around it, * choose to clear the screen rather than keeping old prom output in * the margins. * XXX there should be a rasops "clear margins" feature */ fbwscons_init(&sc->sc_sunfb, isconsole && (sc->sc_sunfb.sf_width >= 1024) ? 0 : RI_CLEAR); fbwscons_setcolormap(&sc->sc_sunfb, cgthree_setcolor); if (isconsole) { fbwscons_console_init(&sc->sc_sunfb, sc->sc_sunfb.sf_width >= 1024 ? -1 : 0); } fbwscons_attach(&sc->sc_sunfb, &cgthree_accessops, 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 }
void cgthreeattach(struct cgthree_softc *sc, const char *name, int isconsole) { int i; struct fbdevice *fb = &sc->sc_fb; struct wsemuldisplaydev_attach_args aa; struct rasops_info *ri = &cg3_console_screen.scr_ri; unsigned long defattr; volatile struct fbcontrol *fbc = sc->sc_fbc; volatile struct bt_regs *bt = &fbc->fbc_dac; fb->fb_driver = &cgthreefbdriver; fb->fb_type.fb_cmsize = 256; fb->fb_type.fb_size = fb->fb_type.fb_height * fb->fb_linebytes; printf(": %s, %d x %d", name, fb->fb_type.fb_width, fb->fb_type.fb_height); /* Transfer video magic to board, if it's not running */ if ((fbc->fbc_ctrl & FBC_TIMING) == 0) { int sense = (fbc->fbc_status & FBS_MSENSE); /* Search table for video timings fitting this monitor */ for (i = 0; i < sizeof(cg3_videoctrl)/sizeof(cg3_videoctrl[0]); i++) { int j; if (sense != cg3_videoctrl[i].sense) continue; printf(" setting video ctrl"); for (j = 0; j < 12; j++) fbc->fbc_vcontrol[j] = cg3_videoctrl[i].vctrl[j]; fbc->fbc_ctrl |= FBC_TIMING; break; } } /* make sure we are not blanked */ cgthree_set_video(sc, 1); BT_INIT(bt, 0); if (isconsole) { printf(" (console)\n"); } else printf("\n"); fb_attach(fb, isconsole); sc->sc_width = fb->fb_type.fb_width; sc->sc_stride = fb->fb_type.fb_width; sc->sc_height = fb->fb_type.fb_height; /* setup rasops and so on for wsdisplay */ sc->sc_mode = WSDISPLAYIO_MODE_EMUL; vcons_init(&sc->vd, sc, &cgthree_defaultscreen, &cgthree_accessops); sc->vd.init_screen = cgthree_init_screen; if(isconsole) { /* we mess with cg3_console_screen only once */ vcons_init_screen(&sc->vd, &cg3_console_screen, 1, &defattr); memset(sc->sc_fb.fb_pixels, (defattr >> 16) & 0xff, sc->sc_stride * sc->sc_height); cg3_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC; cgthree_defaultscreen.textops = &ri->ri_ops; cgthree_defaultscreen.capabilities = ri->ri_caps; cgthree_defaultscreen.nrows = ri->ri_rows; cgthree_defaultscreen.ncols = ri->ri_cols; sc->vd.active = &cg3_console_screen; wsdisplay_cnattach(&cgthree_defaultscreen, ri, 0, 0, defattr); vcons_replay_msgbuf(&cg3_console_screen); } else { /* * we're not the console so we just clear the screen and don't * set up any sort of text display */ }
void cgfourattach(struct device *parent, struct device *self, void *args) { struct cgfour_softc *sc = (struct cgfour_softc *)self; struct confargs *ca = args; int node = 0; volatile struct bt_regs *bt; int isconsole = 0; printf(": p4"); /* Map the pfour register. */ SET(sc->sc_sunfb.sf_flags, FB_PFOUR); sc->sc_sunfb.sf_pfour = (volatile u_int32_t *) mapiodev(ca->ca_ra.ra_reg, 0, sizeof(u_int32_t)); if (cputyp == CPU_SUN4) { 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 = 1; } /* * 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. */ sc->sc_phys = ca->ca_ra.ra_reg[0]; /* enable video */ fb_pfour_burner(sc, 1, 0); bt = &sc->sc_fbc->fbc_dac; BT_INIT(bt, 24); /* * XXX should initialize the enable plane, instead of expecting the * PROM to do so for us */ fb_setsize(&sc->sc_sunfb, 8, 1152, 900, node, ca->ca_bustype); /* * XXX this only maps the color plane, not the overlay or the enable * planes */ sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg, PFOUR_COLOR_OFF_COLOR, round_page(sc->sc_sunfb.sf_fbsize)); sc->sc_sunfb.sf_ro.ri_hw = sc; fbwscons_init(&sc->sc_sunfb, isconsole ? 0 : RI_CLEAR); fbwscons_setcolormap(&sc->sc_sunfb, cgfour_setcolor); printf(", %dx%d\n", sc->sc_sunfb.sf_width, sc->sc_sunfb.sf_height); if (isconsole) { fbwscons_console_init(&sc->sc_sunfb, -1); } fbwscons_attach(&sc->sc_sunfb, &cgfour_accessops, isconsole); }