diff options
author | Jason Wright <jason@cvs.openbsd.org> | 2002-03-31 17:34:16 +0000 |
---|---|---|
committer | Jason Wright <jason@cvs.openbsd.org> | 2002-03-31 17:34:16 +0000 |
commit | cf3885a7e2cad8f88ec46d49abf29cf90926ca49 (patch) | |
tree | 752c8c89c49ef53b5d75230ffd6811ae01a967ab | |
parent | 2dba0c0f5d8a7bf90d6d659b8566c1ffe32ef68f (diff) |
add a new mode to wsdisplay, WSDISPLAYIO_MODE_DUMBFB. This mode is
functionally equivalent what used to be WSDISPLAYIO_MODE_MAPPED, which now
means a "native" mapping.
vgafb_mmap() returns pci relative mappings in WSDISPLAYIO_MODE_MAPPED and
linear framebuffer mappings in WSDISPLAYIO_MODE_DUMBFB
-rw-r--r-- | sys/arch/sparc64/dev/vgafb.c | 74 | ||||
-rw-r--r-- | sys/dev/wscons/wsconsio.h | 3 | ||||
-rw-r--r-- | sys/dev/wscons/wsdisplay.c | 24 |
3 files changed, 58 insertions, 43 deletions
diff --git a/sys/arch/sparc64/dev/vgafb.c b/sys/arch/sparc64/dev/vgafb.c index 5bd27ef6686..ce3f036e334 100644 --- a/sys/arch/sparc64/dev/vgafb.c +++ b/sys/arch/sparc64/dev/vgafb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vgafb.c,v 1.13 2002/03/30 00:08:14 jason Exp $ */ +/* $OpenBSD: vgafb.c,v 1.14 2002/03/31 17:34:15 jason Exp $ */ /* * Copyright (c) 2001 Jason L. Wright (jason@thought.net) @@ -74,6 +74,7 @@ struct vgafb_softc { struct rcons sc_rcons; struct raster sc_raster; int sc_console; + u_int sc_mode; u_int8_t sc_cmap_red[256]; u_int8_t sc_cmap_green[256]; u_int8_t sc_cmap_blue[256]; @@ -269,6 +270,9 @@ vgafb_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; @@ -417,50 +421,48 @@ vgafb_mmap(v, off, prot) int prot; { struct vgafb_softc *sc = v; -#ifdef VGAFB_ALLOW_NATIVE bus_addr_t ba; bus_size_t bs; -#endif + paddr_t pa; + vaddr_t va; if (off & PGOFSET) return (-1); -#ifdef VGAFB_ALLOW_NATIVE - /* See if this is a native mapping of pixel memory */ - if ((pci_mem_find(sc->sc_pci_chip, sc->sc_pci_tag, sc->sc_mem_cf, - &ba, &bs, NULL) == 0) && - (off >= ba) && (off < (ba + bs))) { - return (bus_space_mmap(sc->sc_mem_t, ba, off - ba, prot, - BUS_SPACE_MAP_LINEAR)); - } - - /* See if this is a native mapping of memory mapped i/o */ - if ((pci_mem_find(sc->sc_pci_chip, sc->sc_pci_tag, sc->sc_mmio_cf, - &ba, &bs, NULL) == 0) && - (off >= ba) && (off < (ba + bs))) { - return (bus_space_mmap(sc->sc_mem_t, ba, off - ba, prot, - BUS_SPACE_MAP_LINEAR)); - } -#endif + switch (sc->sc_mode) { + case WSDISPLAYIO_MODE_MAPPED: + if ((pci_mem_find(sc->sc_pci_chip, sc->sc_pci_tag, + sc->sc_mem_cf, &ba, &bs, NULL) == 0) && + (off >= ba) && (off < (ba + bs))) + return (bus_space_mmap(sc->sc_mem_t, ba, off - ba, + prot, BUS_SPACE_MAP_LINEAR)); + + if ((pci_mem_find(sc->sc_pci_chip, sc->sc_pci_tag, + sc->sc_mmio_cf, &ba, &bs, NULL) == 0) && + (off >= ba) && (off < (ba + bs))) + return (bus_space_mmap(sc->sc_mem_t, ba, off - ba, + prot, BUS_SPACE_MAP_LINEAR)); + + if (sc->sc_rom_ptr != NULL && + off >= sc->sc_rom_addr && + off < sc->sc_rom_addr + sc->sc_rom_size) { + off -= sc->sc_rom_addr; + va = ((vaddr_t)sc->sc_rom_ptr) + off; + if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) + return (-1); + return (pa); + } + return (-1); - /* Lastly, this might be a request for a "dumb" framebuffer map */ - if (off >= 0 && off < sc->sc_mem_size) { - return (bus_space_mmap(sc->sc_mem_t, sc->sc_mem_addr, off, prot, - BUS_SPACE_MAP_LINEAR)); - } + case WSDISPLAYIO_MODE_DUMBFB: + if (off >= 0 && off < sc->sc_mem_size) + return (bus_space_mmap(sc->sc_mem_t, sc->sc_mem_addr, + off, prot, BUS_SPACE_MAP_LINEAR)); + return (-1); -#ifdef VGAFB_ALLOW_NATIVE - /* Don't allow mapping of the shadow rom right now... needs work */ - if (sc->sc_rom_ptr != NULL && - off >= sc->sc_rom_addr && - off < sc->sc_rom_addr + sc->sc_rom_size) { - off -= sc->sc_rom_addr; - va = ((vaddr_t)sc->sc_rom_ptr) + off; - if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) - return (-1); - return (pa); + default: + return (-1); } -#endif return (-1); } diff --git a/sys/dev/wscons/wsconsio.h b/sys/dev/wscons/wsconsio.h index d36a48966fe..1e3d98ea86f 100644 --- a/sys/dev/wscons/wsconsio.h +++ b/sys/dev/wscons/wsconsio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsconsio.h,v 1.15 2002/03/27 18:54:09 jbm Exp $ */ +/* $OpenBSD: wsconsio.h,v 1.16 2002/03/31 17:34:15 jason Exp $ */ /* $NetBSD: wsconsio.h,v 1.31.2.1 2000/07/07 09:49:17 hannken Exp $ */ /* @@ -314,6 +314,7 @@ struct wsdisplay_cursor { #define WSDISPLAYIO_SMODE _IOW('W', 76, u_int) #define WSDISPLAYIO_MODE_EMUL 0 /* emulation (text) mode */ #define WSDISPLAYIO_MODE_MAPPED 1 /* mapped (graphics) mode */ +#define WSDISPLAYIO_MODE_DUMBFB 2 /* mapped (graphics) fb mode */ struct wsdisplay_font { char name[WSFONT_NAME_SIZE]; diff --git a/sys/dev/wscons/wsdisplay.c b/sys/dev/wscons/wsdisplay.c index 50ac76f1cd5..e83ad68a370 100644 --- a/sys/dev/wscons/wsdisplay.c +++ b/sys/dev/wscons/wsdisplay.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsdisplay.c,v 1.41 2002/03/27 18:54:09 jbm Exp $ */ +/* $OpenBSD: wsdisplay.c,v 1.42 2002/03/31 17:34:15 jason Exp $ */ /* $NetBSD: wsdisplay.c,v 1.37.4.1 2000/06/30 16:27:53 simonb Exp $ */ /* @@ -98,6 +98,7 @@ struct wsscreen { #define SCR_OPEN 1 /* is it open? */ #define SCR_WAITACTIVE 2 /* someone waiting on activation */ #define SCR_GRAPHICS 4 /* graphics mode, no text (emulation) output */ +#define SCR_DUMBFB 8 /* in use as dumb framebuffer (iff SCR_GRAPHICS) */ const struct wscons_syncops *scr_syncops; void *scr_synccookie; @@ -1066,19 +1067,30 @@ wsdisplay_internal_ioctl(sc, scr, cmd, data, flag, p) switch (cmd) { case WSDISPLAYIO_GMODE: - *(u_int *)data = (scr->scr_flags & SCR_GRAPHICS ? - WSDISPLAYIO_MODE_MAPPED : WSDISPLAYIO_MODE_EMUL); + if (scr->scr_flags & SCR_GRAPHICS) { + if (scr->scr_flags & SCR_DUMBFB) + *(u_int *)data = WSDISPLAYIO_MODE_DUMBFB; + else + *(u_int *)data = WSDISPLAYIO_MODE_MAPPED; + } else + *(u_int *)data = WSDISPLAYIO_MODE_EMUL; return (0); case WSDISPLAYIO_SMODE: #define d (*(int *)data) - if (d != WSDISPLAYIO_MODE_EMUL && d != WSDISPLAYIO_MODE_MAPPED) + if (d != WSDISPLAYIO_MODE_EMUL && + d != WSDISPLAYIO_MODE_MAPPED && + d != WSDISPLAYIO_MODE_DUMBFB) return (EINVAL); if (WSSCREEN_HAS_EMULATOR(scr)) { scr->scr_flags &= ~SCR_GRAPHICS; - if (d == WSDISPLAYIO_MODE_MAPPED) { - scr->scr_flags |= SCR_GRAPHICS; + if (d == WSDISPLAYIO_MODE_MAPPED || + d == WSDISPLAYIO_MODE_DUMBFB) { + scr->scr_flags |= SCR_GRAPHICS | + ((d == WSDISPLAYIO_MODE_DUMBFB) ? + SCR_DUMBFB : 0); + /* * wsmoused cohabitation with X-Window support * X-Window is starting |