void fbwscons_attach(struct sunfb *sf, struct wsdisplay_accessops *op, int isconsole) { struct wsemuldisplaydev_attach_args waa; if (isconsole == 0) { /* done in wsdisplay_cnattach() earlier if console */ fb_initwsd(sf); } else { /* remember screen burner routine */ fb_burner = op->burn_screen; fb_cookie = sf; } sf->sf_scrlist[0] = &sf->sf_wsd; sf->sf_wsl.nscreens = 1; sf->sf_wsl.screens = (const struct wsscreen_descr **)sf->sf_scrlist; waa.console = isconsole; waa.scrdata = &sf->sf_wsl; waa.accessops = op; waa.accesscookie = sf; waa.defaultscreens = 0; config_found(&sf->sf_dev, &waa, wsemuldisplaydevprint); }
void fbwscons_console_init(struct sunfb *sf, int row) { struct rasops_info *ri = &sf->sf_ro; long defattr; if (CPU_ISSUN4 || romgetcursoraddr(&sf->sf_crowp, &sf->sf_ccolp)) sf->sf_ccolp = sf->sf_crowp = NULL; if (sf->sf_ccolp != NULL) ri->ri_ccol = *sf->sf_ccolp; if (row < 0) { if (sf->sf_crowp != NULL) ri->ri_crow = *sf->sf_crowp; else /* assume last row */ ri->ri_crow = ri->ri_rows - 1; } else { /* * If we force the display row, this is because the screen * has been cleared or the font has been changed. * In this case, choose not to keep pointers to the PROM * cursor position, as the values are likely to be inaccurate * upon shutdown... */ sf->sf_crowp = sf->sf_ccolp = NULL; ri->ri_crow = row; } /* * Scale back rows and columns if the font would not otherwise * fit on this display. Without this we would panic later. */ if (ri->ri_crow >= ri->ri_rows) ri->ri_crow = ri->ri_rows - 1; if (ri->ri_ccol >= ri->ri_cols) ri->ri_ccol = ri->ri_cols - 1; /* * Take care of updating the PROM cursor position as well if we can. */ if (ri->ri_updatecursor == NULL && (sf->sf_ccolp != NULL || sf->sf_crowp != NULL)) ri->ri_updatecursor = fb_updatecursor; if (ISSET(ri->ri_caps, WSSCREEN_WSCOLORS)) ri->ri_ops.alloc_attr(ri, WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, &defattr); else ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr); fb_initwsd(sf); wsdisplay_cnattach(&sf->sf_wsd, ri, ri->ri_ccol, ri->ri_crow, defattr); }