Beispiel #1
0
/*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;
}
Beispiel #2
0
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;
}