/*ARGSUSED*/ int grfioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { int unit = GRFUNIT(dev); struct grf_softc *gp = device_lookup_private(&grf_cd, GRFUNIT(dev)); int error; if ((gp->g_flags & GF_ALIVE) == 0) return ENXIO; error = 0; switch (cmd) { case GRFIOCGINFO: memcpy(data, (void *)&gp->g_display, sizeof(struct grfinfo)); break; case GRFIOCON: error = grfon(gp); break; case GRFIOCOFF: error = grfoff(gp); break; case GRFIOCMAP: error = grfmap(dev, (void **)data, l->l_proc); break; case GRFIOCUNMAP: error = grfunmap(dev, *(void **)data, l->l_proc); break; case GRFSETVMODE: error = (*gp->g_sw->gd_mode)(gp, GM_GRFSETVMODE, data); if (error == 0) ite_reinit(unit); break; default: error = EINVAL; break; } return error; }
int grfioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct grf_softc *sc; struct macfb_devconfig *dc; #if defined(GRF_COMPAT) || (NGRF > 0) struct grfinfo *gd; #endif /* GRF_COMPAT || (NGRF > 0) */ struct grfmode *gm; int unit = GRFUNIT(dev); int rv; if (grf_softc == NULL || unit >= numgrf) return ENXIO; sc = &grf_softc[unit]; if (sc->mfb_sc == NULL) return ENXIO; dc = sc->mfb_sc->sc_dc; switch (cmd) { #if defined(GRF_COMPAT) || (NGRF > 0) case GRFIOCGINFO: gd = (struct grfinfo *)data; memset(gd, 0, sizeof(struct grfinfo)); gd->gd_fbaddr = (void *)dc->dc_paddr; gd->gd_fbsize = dc->dc_size; gd->gd_colors = (short)(1 << dc->dc_depth); gd->gd_planes = (short)dc->dc_depth; gd->gd_fbwidth = dc->dc_wid; gd->gd_fbheight = dc->dc_ht; gd->gd_fbrowbytes = dc->dc_rowbytes; gd->gd_dwidth = dc->dc_raster.width; gd->gd_dheight = dc->dc_raster.height; rv = 0; break; #endif /* GRF_COMPAT || (NGRF > 0) */ case GRFIOCON: case GRFIOCOFF: /* Nothing to do */ rv = 0; break; #if defined(GRF_COMPAT) || (NGRF > 0) case GRFIOCMAP: rv = grfmap(dev, sc->mfb_sc, (void **)data, l->l_proc); break; case GRFIOCUNMAP: rv = grfunmap(dev, sc->mfb_sc, *(void **)data, l->l_proc); break; #endif /* GRF_COMPAT || (NGRF > 0) */ case GRFIOCGMODE: gm = (struct grfmode *)data; memset(gm, 0, sizeof(struct grfmode)); gm->fbbase = (char *)dc->dc_vaddr; gm->fbsize = dc->dc_size; gm->fboff = dc->dc_offset; gm->rowbytes = dc->dc_rowbytes; gm->width = dc->dc_wid; gm->height = dc->dc_ht; gm->psize = dc->dc_depth; rv = 0; break; case GRFIOCLISTMODES: case GRFIOCGETMODE: case GRFIOCSETMODE: /* NONE of these operations are (officially) supported. */ default: rv = EINVAL; break; } return rv; }