grfdev_attach(sc, init, regs, sw)
grfdev_attach(sc, init, regs, sw, isw)
grfdev_attach(sc, init, regs, sw)	struct grfdev_softc *sc;	int (*init) __P((struct grf_data *, int, caddr_t));	caddr_t regs;	struct grfsw *sw;{	struct grfdev_attach_args ga;	struct grf_data *gp;	int isconsole;	isconsole = (sc->sc_scode == conscode);	if (isconsole) 		sc->sc_data = gp = &grf_cn;	else {		sc->sc_data = gp =		    (struct grf_data *)malloc(sizeof(struct grf_data),		    M_DEVBUF, M_NOWAIT);		if (sc->sc_data == NULL) {			printf("\n%s: can't allocate grf data\n",			    sc->sc_dev.dv_xname);			return;		}		bzero(sc->sc_data, sizeof(struct grf_data));		/* Initialize the framebuffer hardware. */		if ((*init)(sc->sc_data, sc->sc_scode, regs) == 0) {			printf("\n%s: init failed\n",			    sc->sc_dev.dv_xname);			free(sc->sc_data, M_DEVBUF);			return;		}		gp->g_flags = GF_ALIVE;		gp->g_sw = sw;		gp->g_display.gd_id = gp->g_sw->gd_swid;	}	/* Announce ourselves. */	printf(": %d x %d ", gp->g_display.gd_dwidth,	    gp->g_display.gd_dheight);	if (gp->g_display.gd_colors == 2)		printf("monochrome");	else		printf("%d color", gp->g_display.gd_colors);	printf(" %s display\n", gp->g_sw->gd_desc);	/* Attach a grf. */	ga.ga_scode = sc->sc_scode;	/* XXX */	ga.ga_isconsole = isconsole;	ga.ga_data = (void *)sc->sc_data;	(void)config_found(&sc->sc_dev, &ga, grfdevprint);}