Module Name:    src
Committed By:   macallan
Date:           Tue Dec  9 07:42:50 UTC 2014

Modified Files:
        src/sys/dev/pci: pm2fb.c

Log Message:
begin to address PR 49229:
- program aperture endianness to match host, now xf86-video-wsfb works as
  expected
- properly restore the colour map when er-entering terminal emulation


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/pci/pm2fb.c

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/pci/pm2fb.c
diff -u src/sys/dev/pci/pm2fb.c:1.25 src/sys/dev/pci/pm2fb.c:1.26
--- src/sys/dev/pci/pm2fb.c:1.25	Wed Oct  9 17:18:23 2013
+++ src/sys/dev/pci/pm2fb.c	Tue Dec  9 07:42:50 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pm2fb.c,v 1.25 2013/10/09 17:18:23 macallan Exp $	*/
+/*	$NetBSD: pm2fb.c,v 1.26 2014/12/09 07:42:50 macallan Exp $	*/
 
 /*
  * Copyright (c) 2009, 2012 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.25 2013/10/09 17:18:23 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.26 2014/12/09 07:42:50 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -123,7 +123,7 @@ static void	pm2fb_init_screen(void *, st
 
 static int	pm2fb_putcmap(struct pm2fb_softc *, struct wsdisplay_cmap *);
 static int 	pm2fb_getcmap(struct pm2fb_softc *, struct wsdisplay_cmap *);
-static void	pm2fb_restore_palette(struct pm2fb_softc *);
+static void	pm2fb_init_palette(struct pm2fb_softc *);
 static int 	pm2fb_putpalreg(struct pm2fb_softc *, uint8_t, uint8_t,
 			    uint8_t, uint8_t);
 
@@ -283,9 +283,7 @@ pm2fb_attach(device_t parent, device_t s
 	prop_dictionary_t	dict;
 	unsigned long		defattr;
 	bool			is_console;
-	int 			i, j;
 	uint32_t		flags;
-	uint8_t			cmap[768];
 
 	sc->sc_pc = pa->pa_pc;
 	sc->sc_pcitag = pa->pa_tag;
@@ -359,7 +357,7 @@ pm2fb_attach(device_t parent, device_t s
 	vcons_init(&sc->vd, sc, &sc->sc_defaultscreen_descr,
 	    &pm2fb_accessops);
 	sc->vd.init_screen = pm2fb_init_screen;
-	
+
 	/* init engine here */
 	pm2fb_init(sc);
 
@@ -416,16 +414,8 @@ pm2fb_attach(device_t parent, device_t s
 			   defattr);
 	}
 
-	j = 0;
-	rasops_get_cmap(ri, cmap, sizeof(cmap));
-	for (i = 0; i < 256; i++) {
-		sc->sc_cmap_red[i] = cmap[j];
-		sc->sc_cmap_green[i] = cmap[j + 1];
-		sc->sc_cmap_blue[i] = cmap[j + 2];
-		pm2fb_putpalreg(sc, i, cmap[j], cmap[j + 1], cmap[j + 2]);
-		j += 3;
-	}
-
+	pm2fb_init_palette(sc);
+	
 	aa.console = is_console;
 	aa.scrdata = &sc->sc_screenlist;
 	aa.accessops = &pm2fb_accessops;
@@ -509,7 +499,7 @@ pm2fb_ioctl(void *v, void *vs, u_long cm
 				}
 				/* then initialize the drawing engine */
 				pm2fb_init(sc);
-				pm2fb_restore_palette(sc);
+				pm2fb_init_palette(sc);
 				/* clean out the glyph cache */
 				glyphcache_wipe(&sc->sc_gc);
 				/* and redraw everything */
@@ -685,13 +675,19 @@ pm2fb_getcmap(struct pm2fb_softc *sc, st
 }
 
 static void
-pm2fb_restore_palette(struct pm2fb_softc *sc)
+pm2fb_init_palette(struct pm2fb_softc *sc)
 {
-	int i;
+	struct rasops_info *ri = &sc->sc_console_screen.scr_ri;
+	int i, j = 0;
+	uint8_t cmap[768];
 
-	for (i = 0; i < (1 << sc->sc_depth); i++) {
-		pm2fb_putpalreg(sc, i, sc->sc_cmap_red[i],
-		    sc->sc_cmap_green[i], sc->sc_cmap_blue[i]);
+	rasops_get_cmap(ri, cmap, sizeof(cmap));
+	for (i = 0; i < 256; i++) {
+		sc->sc_cmap_red[i] = cmap[j];
+		sc->sc_cmap_green[i] = cmap[j + 1];
+		sc->sc_cmap_blue[i] = cmap[j + 2];
+		pm2fb_putpalreg(sc, i, cmap[j], cmap[j + 1], cmap[j + 2]);
+		j += 3;
 	}
 }
 
@@ -748,8 +744,15 @@ pm2fb_init(struct pm2fb_softc *sc)
 {
 	pm2fb_flush_engine(sc);
 
-	pm2fb_wait(sc, 8);
+	pm2fb_wait(sc, 9);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_SCREEN_BASE, 0);
+	/* set aperture endianness */
+#if BYTE_ORDER == BIG_ENDIAN
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_APERTURE1_CONTROL,
+		PM2_AP_BYTESWAP | PM2_AP_HALFWORDSWAP);	
+#else
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_APERTURE1_CONTROL, 0);
+#endif	
 #if 0
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_BYPASS_MASK, 
 		0xffffffff);

Reply via email to