/*ARGSUSED*/ int grfopen(dev_t dev, int flags, int devtype, struct lwp *l) { struct grf_softc *gp; if (GRFUNIT(dev) >= NGRF || (gp = grfsp[GRFUNIT(dev)]) == NULL) return(ENXIO); if ((gp->g_flags & GF_ALIVE) == 0) return(ENXIO); if ((gp->g_flags & (GF_OPEN|GF_EXCLUDE)) == (GF_OPEN|GF_EXCLUDE)) return(EBUSY); return(0); }
/*ARGSUSED*/ int grfopen(dev_t dev, int flags, int mode, struct lwp *l) { struct grf_softc *gp; int error = 0; gp = device_lookup_private(&grf_cd, GRFUNIT(dev)); if (gp == NULL) return ENXIO; if ((gp->g_flags & GF_ALIVE) == 0) return ENXIO; if ((gp->g_flags & (GF_OPEN|GF_EXCLUDE)) == (GF_OPEN|GF_EXCLUDE)) return EBUSY; /* * First open. * XXX: always put in graphics mode. */ error = 0; if ((gp->g_flags & GF_OPEN) == 0) { gp->g_flags |= GF_OPEN; error = grfon(gp); } return error; }
/*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; }
/*ARGSUSED*/ int grfclose(dev_t dev, int flags, int mode, struct lwp *l) { struct grf_softc *gp; gp = grfsp[GRFUNIT(dev)]; (void)grfoff(dev); gp->g_flags &= GF_ALIVE; return(0); }
/*ARGSUSED*/ int grfclose(dev_t dev, int flags, int mode, struct lwp *l) { struct grf_softc *gp = device_lookup_private(&grf_cd, GRFUNIT(dev)); if ((gp->g_flags & GF_ALIVE) == 0) return ENXIO; (void) grfoff(gp); gp->g_flags &= GF_ALIVE; return 0; }
/* * Standard device ops */ int grfopen(dev_t dev, int flag, int mode, struct lwp *l) { struct grf_softc *sc; int unit = GRFUNIT(dev); int rv = 0; if (grf_softc == NULL || unit >= numgrf) return ENXIO; sc = &grf_softc[unit]; if (sc->mfb_sc == NULL) rv = ENXIO; return rv; }
int grfclose(dev_t dev, int flag, int mode, struct lwp *l) { struct grf_softc *sc; int unit = GRFUNIT(dev); int rv = 0; if (grf_softc == NULL || unit >= numgrf) return ENXIO; sc = &grf_softc[unit]; if (sc->mfb_sc != NULL) macfb_clear(sc->mfb_sc->sc_dc); /* clear the display */ else rv = ENXIO; return rv; }
paddr_t grfmmap(dev_t dev, off_t off, int prot) { struct grf_softc *sc; struct macfb_devconfig *dc; int unit = GRFUNIT(dev); 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; if ((u_int)off < m68k_round_page(dc->dc_offset + dc->dc_size)) return m68k_btop(dc->dc_paddr + off); return (-1); }
/* * map the contents of a graphics display card into process' * memory space. */ paddr_t grfmmap(dev_t dev, off_t off, int prot) { struct grf_softc *gp; struct grfinfo *gi; gp = grfsp[GRFUNIT(dev)]; gi = &gp->g_display; /* * control registers */ if (off >= 0 && off < gi->gd_regsize) return(((paddr_t)gi->gd_regaddr + off) >> PGSHIFT); /* * frame buffer */ if (off >= gi->gd_regsize && off < gi->gd_regsize+gi->gd_fbsize) { off -= gi->gd_regsize; return(((paddr_t)gi->gd_fbaddr + off) >> PGSHIFT); }
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; }
/*ARGSUSED*/ int grfioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct grf_softc *gp; int error; gp = grfsp[GRFUNIT(dev)]; error = 0; switch (cmd) { case OGRFIOCGINFO: /* argl.. no bank-member.. */ memcpy(data, (void *)&gp->g_display, sizeof(struct grfinfo)-4); break; case GRFIOCGINFO: memcpy(data, (void *)&gp->g_display, sizeof(struct grfinfo)); break; case GRFIOCON: error = grfon(dev); break; case GRFIOCOFF: error = grfoff(dev); break; case GRFIOCSINFO: error = grfsinfo(dev, (struct grfdyninfo *) data); break; case GRFGETVMODE: return(gp->g_mode(gp, GM_GRFGETVMODE, data, 0, 0)); case GRFSETVMODE: error = gp->g_mode(gp, GM_GRFSETVMODE, data, 0, 0); if (error == 0 && gp->g_itedev && !(gp->g_flags & GF_GRFON)) ite_reinit(gp->g_itedev); break; case GRFGETNUMVM: return(gp->g_mode(gp, GM_GRFGETNUMVM, data, 0, 0)); /* * these are all hardware dependent, and have to be resolved * in the respective driver. */ case GRFIOCPUTCMAP: case GRFIOCGETCMAP: case GRFIOCSSPRITEPOS: case GRFIOCGSPRITEPOS: case GRFIOCSSPRITEINF: case GRFIOCGSPRITEINF: case GRFIOCGSPRITEMAX: case GRFIOCBITBLT: case GRFIOCSETMON: case GRFTOGGLE: /* Toggles between Cirrus boards and native ECS on Amiga. 15/11/94 ill */ /* * We need the minor dev number to get the overlay/image * information for grf_ul. */ return(gp->g_mode(gp, GM_GRFIOCTL, data, cmd, dev)); case GRFIOCBLANK: /* blank ioctl, IOCON/OFF will turn ite on */ case FBIOSVIDEO: error = gp->g_mode(gp, GM_GRFIOCTL, data, GRFIOCBLANK, dev); if (!error) gp->g_blank = *(int *)data; return (error); case FBIOGVIDEO: *(int *)data = gp->g_blank; return (0); default: #if NVIEW > 0 /* * check to see whether it's a command recognized by the * view code if the unit is 0 * XXX */ if (GRFUNIT(dev) == 0) { extern const struct cdevsw view_cdevsw; return((*view_cdevsw.d_ioctl)(dev, cmd, data, flag, l)); } #endif error = EPASSTHROUGH; break; } return(error); }
/*ARGSUSED*/ paddr_t grfmmap(dev_t dev, off_t off, int prot) { return grfaddr(device_lookup_private(&grf_cd, GRFUNIT(dev)), off); }