Module Name:    src
Committed By:   macallan
Date:           Thu Nov 11 19:37:30 UTC 2021

Modified Files:
        src/sys/dev/sbus: mgx.c mgxreg.h

Log Message:
provide an endian-flipped view of the framebuffer via mmap() if we know how
for now this is sparc64 only


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/sbus/mgx.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/sbus/mgxreg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/sbus/mgx.c
diff -u src/sys/dev/sbus/mgx.c:1.19 src/sys/dev/sbus/mgx.c:1.20
--- src/sys/dev/sbus/mgx.c:1.19	Sun Oct 31 05:31:12 2021
+++ src/sys/dev/sbus/mgx.c	Thu Nov 11 19:37:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: mgx.c,v 1.19 2021/10/31 05:31:12 macallan Exp $ */
+/*	$NetBSD: mgx.c,v 1.20 2021/11/11 19:37:30 macallan Exp $ */
 
 /*-
  * Copyright (c) 2014 Michael Lorenz
@@ -29,7 +29,7 @@
 /* a console driver for the SSB 4096V-MGX graphics card */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mgx.c,v 1.19 2021/10/31 05:31:12 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mgx.c,v 1.20 2021/11/11 19:37:30 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1112,11 +1112,19 @@ mgx_mmap(void *v, void *vs, off_t offset
 {
 	struct vcons_data *vd = v;
 	struct mgx_softc *sc = vd->cookie;
+	uint32_t flags = BUS_SPACE_MAP_LINEAR;
+
+#ifdef BUS_SPACE_MAP_LITTLE
+	if (offset & MGX_FLIPOFFSET) {
+		offset &= ~MGX_FLIPOFFSET;
+		flags |= BUS_SPACE_MAP_LITTLE;
+	}
+#endif
 
 	/* regular fb mapping at 0 */
 	if ((offset >= 0) && (offset < sc->sc_fbsize)) {
 		return bus_space_mmap(sc->sc_tag, sc->sc_paddr,
-		    offset, prot, BUS_SPACE_MAP_LINEAR);
+		    offset, prot, flags);
 	}
 
 	/*
@@ -1262,11 +1270,19 @@ paddr_t
 mgxmmap(dev_t dev, off_t offset, int prot)
 {
 	struct mgx_softc *sc = device_lookup_private(&mgx_cd, minor(dev));
+	uint32_t flags = BUS_SPACE_MAP_LINEAR;
+
+#ifdef BUS_SPACE_MAP_LITTLE
+	if (offset & MGX_FLIPOFFSET) {
+		offset &= ~MGX_FLIPOFFSET;
+		flags |= BUS_SPACE_MAP_LITTLE;
+	}
+#endif
 
 	/* regular fb mapping at 0 */
 	if ((offset >= 0) && (offset < sc->sc_fbsize)) {
 		return bus_space_mmap(sc->sc_tag, sc->sc_paddr,
-		    offset, prot, BUS_SPACE_MAP_LINEAR);
+		    offset, prot, flags);
 	}
 
 	/*

Index: src/sys/dev/sbus/mgxreg.h
diff -u src/sys/dev/sbus/mgxreg.h:1.6 src/sys/dev/sbus/mgxreg.h:1.7
--- src/sys/dev/sbus/mgxreg.h:1.6	Sat Oct 30 05:37:39 2021
+++ src/sys/dev/sbus/mgxreg.h	Thu Nov 11 19:37:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: mgxreg.h,v 1.6 2021/10/30 05:37:39 macallan Exp $ */
+/*	$NetBSD: mgxreg.h,v 1.7 2021/11/11 19:37:30 macallan Exp $ */
 
 /* register definitions based on OpenBSD's atxxreg.h: */
 
@@ -30,8 +30,9 @@
 #ifndef MGX_REG_H
 #define MGX_REG_H
 
-#define MGX_FBOFFSET  0x00000000
-#define MGX_BLTOFFSET 0x00800000
+#define MGX_FBOFFSET 	0x00000000
+#define MGX_BLTOFFSET 	0x00800000
+#define MGX_FLIPOFFSET	0x01000000
 
 #define VGA_BASE 0x3c0
 #define CRTC_INDEX	0x3d4

Reply via email to