diff options
Diffstat (limited to 'sys/dev/sbus/cgthree.c')
-rw-r--r-- | sys/dev/sbus/cgthree.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/sys/dev/sbus/cgthree.c b/sys/dev/sbus/cgthree.c index e799263e809..781bc89ef52 100644 --- a/sys/dev/sbus/cgthree.c +++ b/sys/dev/sbus/cgthree.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cgthree.c,v 1.19 2002/07/25 19:04:46 miod Exp $ */ +/* $OpenBSD: cgthree.c,v 1.20 2002/07/30 18:05:58 jason Exp $ */ /* * Copyright (c) 2001 Jason L. Wright (jason@thought.net) @@ -130,6 +130,7 @@ struct cgthree_softc { int sc_width, sc_height, sc_depth, sc_linebytes; union bt_cmap sc_cmap; struct rasops_info sc_rasops; + u_int sc_mode; }; struct wsscreen_descr cgthree_stdscreen = { @@ -309,7 +310,7 @@ cgthreeattach(parent, self, aux) int *ccolp, *crowp; cgthree_setcolor(sc, WSCOL_BLACK, 0, 0, 0); - cgthree_setcolor(sc, 255, 255, 255, 255); + cgthree_setcolor(sc, 255, 0, 0, 0); cgthree_setcolor(sc, WSCOL_RED, 255, 0, 0); cgthree_setcolor(sc, WSCOL_GREEN, 0, 255, 0); cgthree_setcolor(sc, WSCOL_BROWN, 154, 85, 46); @@ -360,6 +361,9 @@ cgthree_ioctl(v, cmd, data, flags, p) case WSDISPLAYIO_GTYPE: *(u_int *)data = WSDISPLAY_TYPE_UNKNOWN; break; + case WSDISPLAYIO_SMODE: + sc->sc_mode = *(u_int *)data; + break; case WSDISPLAYIO_GINFO: wdf = (void *)data; wdf->height = sc->sc_height; @@ -454,13 +458,28 @@ cgthree_mmap(v, offset, prot) { struct cgthree_softc *sc = v; - if (offset & PGOFSET) + if (offset & PGOFSET || offset < 0) return (-1); - if (offset >= 0 && offset < (sc->sc_linebytes * sc->sc_height)) + switch (sc->sc_mode) { + case WSDISPLAYIO_MODE_MAPPED: + if (offset >= NOOVERLAY) + offset -= NOOVERLAY; + else if (offset >= START) + offset -= START; + else + offset = 0; + if (offset >= sc->sc_linebytes * sc->sc_height) + return (-1); return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr, CGTHREE_VID_OFFSET + offset, prot, BUS_SPACE_MAP_LINEAR)); - + case WSDISPLAYIO_MODE_DUMBFB: + if (offset < (sc->sc_linebytes * sc->sc_height)) + return (bus_space_mmap(sc->sc_bustag, sc->sc_paddr, + CGTHREE_VID_OFFSET + offset, prot, + BUS_SPACE_MAP_LINEAR)); + break; + } return (-1); } |