summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2002-03-31 17:34:16 +0000
committerJason Wright <jason@cvs.openbsd.org>2002-03-31 17:34:16 +0000
commitcf3885a7e2cad8f88ec46d49abf29cf90926ca49 (patch)
tree752c8c89c49ef53b5d75230ffd6811ae01a967ab
parent2dba0c0f5d8a7bf90d6d659b8566c1ffe32ef68f (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.c74
-rw-r--r--sys/dev/wscons/wsconsio.h3
-rw-r--r--sys/dev/wscons/wsdisplay.c24
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