Module Name:    src
Committed By:   tsutsui
Date:           Sat Oct  4 16:58:17 UTC 2014

Modified Files:
        src/sys/arch/luna68k/dev: lunafb.c omrasops.c omrasopsvar.h

Log Message:
Pull LUNA's framebuffer improvements by Kenji Aoyama from OpenBSD/luna88k.

http://marc.info/?l=openbsd-cvs&m=141199909120631&w=2
>> Use raster(logic) operation, or ROP, function on LUNA frame buffer.
>> It makes 4bpp wscons putchar ~20% faster.

This Makes 4bpp wscons putchar ~30% on LUNA-II.

Also use the similar ROP in 1bpp putchar and cursor functions
and the 1bpp putchar is also ~5% faster.
While here, reduce diffs from OpenBSD a bit.

Tested on all 1bpp/4bpp/8bpp framebuffers.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/luna68k/dev/lunafb.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/luna68k/dev/omrasops.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/luna68k/dev/omrasopsvar.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/arch/luna68k/dev/lunafb.c
diff -u src/sys/arch/luna68k/dev/lunafb.c:1.35 src/sys/arch/luna68k/dev/lunafb.c:1.36
--- src/sys/arch/luna68k/dev/lunafb.c:1.35	Fri Jul 25 16:40:12 2014
+++ src/sys/arch/luna68k/dev/lunafb.c	Sat Oct  4 16:58:17 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: lunafb.c,v 1.35 2014/07/25 16:40:12 tsutsui Exp $ */
+/* $NetBSD: lunafb.c,v 1.36 2014/10/04 16:58:17 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: lunafb.c,v 1.35 2014/07/25 16:40:12 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lunafb.c,v 1.36 2014/10/04 16:58:17 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -75,11 +75,8 @@ struct bt458 {
 };
 
 #define	OMFB_RFCNT	0xB1000000	/* video h-origin/v-origin */
-#define	OMFB_PLANEMASK	0xB1040000	/* planemask register */
-#define	OMFB_FB_WADDR	0xB1080008	/* common plane */
-#define	OMFB_FB_RADDR	0xB10C0008	/* plane #0 */
-#define	OMFB_ROPFUNC	0xB12C0000	/* ROP function code */
 #define	OMFB_RAMDAC	0xC1100000	/* Bt454/Bt458 RAMDAC */
+
 #define	OMFB_SIZE	(0xB1300000 - 0xB1080000 + PAGE_SIZE)
 
 struct hwcmap {

Index: src/sys/arch/luna68k/dev/omrasops.c
diff -u src/sys/arch/luna68k/dev/omrasops.c:1.18 src/sys/arch/luna68k/dev/omrasops.c:1.19
--- src/sys/arch/luna68k/dev/omrasops.c:1.18	Sun Sep 28 05:00:56 2014
+++ src/sys/arch/luna68k/dev/omrasops.c	Sat Oct  4 16:58:17 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: omrasops.c,v 1.18 2014/09/28 05:00:56 tsutsui Exp $ */
+/* $NetBSD: omrasops.c,v 1.19 2014/10/04 16:58:17 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: omrasops.c,v 1.18 2014/09/28 05:00:56 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: omrasops.c,v 1.19 2014/10/04 16:58:17 tsutsui Exp $");
 
 /*
  * Designed speficically for 'm68k bitorder';
@@ -78,13 +78,6 @@ static int	omrasops_init(struct rasops_i
 #define	ALIGNMASK	(0x1f)
 #define	BYTESDONE	(4)
 
-#define	W(p) (*(uint32_t *)(p))
-#define	R(p) (*(uint32_t *)((uint8_t *)(p) + 0x40000))
-#define	P0(p) (*(uint32_t *)((uint8_t *)(p) + 0x40000))
-#define	P1(p) (*(uint32_t *)((uint8_t *)(p) + 0x80000))
-#define	P2(p) (*(uint32_t *)((uint8_t *)(p) + 0xc0000))
-#define	P3(p) (*(uint32_t *)((uint8_t *)(p) + 0x100000))
-
 /*
  * macros to handle unaligned bit copy ops.
  * See src/sys/dev/rasops/rasops_mask.h for MI version.
@@ -96,13 +89,13 @@ static int	omrasops_init(struct rasops_i
 #define	FASTGETBITS(psrc, x, w, dst)					\
 	asm("bfextu %3{%1:%2},%0"					\
 	    : "=d" (dst) 						\
-	    : "di" (x), "di" (w), "o" ((uint32_t *)(psrc)))
+	    : "di" (x), "di" (w), "o" (*(uint32_t *)(psrc)))
 
 /* luna68k version PUTBITS() that puts w bits from bit x at pdst memory */
 /* XXX this macro assumes (x + w) <= 32 to handle unaligned residual bits */
 #define	FASTPUTBITS(src, x, w, pdst)					\
 	asm("bfins %3,%0{%1:%2}"					\
-	    : "+o" ((uint32_t *)(pdst))					\
+	    : "+o" (*(uint32_t *)(pdst))				\
 	    : "di" (x), "di" (w), "d" (src)				\
 	    : "memory" );
 
@@ -137,16 +130,23 @@ om1_putchar(void *cookie, int row, int s
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	if (width <= BLITWIDTH) {
 		lmask &= rmask;
+		/* set lmask as ROP mask value, with THROUGH mode */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = lmask;
+
 		while (height > 0) {
 			glyph = 0;
 			for (i = ri->ri_font->stride; i != 0; i--)
 				glyph = (glyph << 8) | *fb++;
 			glyph <<= (4 - ri->ri_font->stride) * NBBY;
 			glyph = (glyph >> align) ^ inverse;
-			P0(p) = (P0(p) & ~lmask) | (glyph & lmask);
+
+			*W(p) = glyph;
+
 			p += scanspan;
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	} else {
 		uint8_t *q = p;
 		uint32_t lhalf, rhalf;
@@ -157,14 +157,26 @@ om1_putchar(void *cookie, int row, int s
 				glyph = (glyph << 8) | *fb++;
 			glyph <<= (4 - ri->ri_font->stride) * NBBY;
 			lhalf = (glyph >> align) ^ inverse;
-			P0(p) = (P0(p) & ~lmask) | (lhalf & lmask);
+			/* set lmask as ROP mask value, with THROUGH mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] =
+			    lmask;
+			
+			*W(p) = lhalf;
+
 			p += BYTESDONE;
+
 			rhalf = (glyph << (BLITWIDTH - align)) ^ inverse;
-			P0(p) = (rhalf & rmask) | (P0(p) & ~rmask);
+			/* set rmask as ROP mask value, with THROUGH mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] =
+			    rmask;
+
+			*W(p) = rhalf;
 
 			p = (q += scanspan);
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	}
 }
 
@@ -201,8 +213,15 @@ om4_putchar(void *cookie, int row, int s
 	width = ri->ri_font->fontwidth + align;
 	lmask = ALL1BITS >> align;
 	rmask = ALL1BITS << (-width & ALIGNMASK);
+
+	/* select all planes for later ROP function target */
+	*(volatile uint32_t *)OMFB_PLANEMASK = 0xff;
+
 	if (width <= BLITWIDTH) {
 		lmask &= rmask;
+		/* set lmask as ROP mask value, with THROUGH mode */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = lmask;
+
 		while (height > 0) {
 			glyph = 0;
 			for (i = ri->ri_font->stride; i != 0; i--)
@@ -210,21 +229,25 @@ om4_putchar(void *cookie, int row, int s
 			glyph <<= (4 - ri->ri_font->stride) * NBBY;
 			glyph = (glyph >> align);
 			glyphbg = glyph ^ ALL1BITS;
+
 			fgpat = glyph   & fgmask0;
 			bgpat = glyphbg & bgmask0;
-			P0(p) = (P0(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P0(p) = (fgpat | bgpat);
 			fgpat = glyph   & fgmask1;
 			bgpat = glyphbg & bgmask1;
-			P1(p) = (P1(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P1(p) = (fgpat | bgpat);
 			fgpat = glyph   & fgmask2;
 			bgpat = glyphbg & bgmask2;
-			P2(p) = (P2(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P2(p) = (fgpat | bgpat);
 			fgpat = glyph   & fgmask3;
 			bgpat = glyphbg & bgmask3;
-			P3(p) = (P3(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P3(p) = (fgpat | bgpat);
+
 			p += scanspan;
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	} else {
 		uint8_t *q = p;
 		uint32_t lhalf, rhalf;
@@ -237,38 +260,52 @@ om4_putchar(void *cookie, int row, int s
 			glyph <<= (4 - ri->ri_font->stride) * NBBY;
 			lhalf = (glyph >> align);
 			lhalfbg = lhalf ^ ALL1BITS;
+			/* set lmask as ROP mask value, with THROUGH mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] =
+			    lmask;
+
 			fgpat = lhalf   & fgmask0;
 			bgpat = lhalfbg & bgmask0;
-			P0(p) = (P0(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P0(p) = (fgpat | bgpat);
 			fgpat = lhalf   & fgmask1;
 			bgpat = lhalfbg & bgmask1;
-			P1(p) = (P1(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P1(p) = (fgpat | bgpat);
 			fgpat = lhalf   & fgmask2;
 			bgpat = lhalfbg & bgmask2;
-			P2(p) = (P2(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P2(p) = (fgpat | bgpat);
 			fgpat = lhalf   & fgmask3;
 			bgpat = lhalfbg & bgmask3;
-			P3(p) = (P3(p) & ~lmask) | ((fgpat | bgpat) & lmask);
+			*P3(p) = (fgpat | bgpat);
+
 			p += BYTESDONE;
+
 			rhalf = (glyph << (BLITWIDTH - align));
 			rhalfbg = rhalf ^ ALL1BITS;
+			/* set rmask as ROP mask value, with THROUGH mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] =
+			    rmask;
+
 			fgpat = rhalf   & fgmask0;
 			bgpat = rhalfbg & bgmask0;
-			P0(p) = ((fgpat | bgpat) & rmask) | (P0(p) & ~rmask);
+			*P0(p) = (fgpat | bgpat);
 			fgpat = rhalf   & fgmask1;
 			bgpat = rhalfbg & bgmask1;
-			P1(p) = ((fgpat | bgpat) & rmask) | (P1(p) & ~rmask);
+			*P1(p) = (fgpat | bgpat);
 			fgpat = rhalf   & fgmask2;
 			bgpat = rhalfbg & bgmask2;
-			P2(p) = ((fgpat | bgpat) & rmask) | (P2(p) & ~rmask);
+			*P2(p) = (fgpat | bgpat);
 			fgpat = rhalf   & fgmask3;
 			bgpat = rhalfbg & bgmask3;
-			P3(p) = ((fgpat | bgpat) & rmask) | (P3(p) & ~rmask);
+			*P3(p) = (fgpat | bgpat);
 
 			p = (q += scanspan);
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	}
+	/* select plane #0 only; XXX need this ? */
+	*(volatile uint32_t *)OMFB_PLANEMASK = 0x01;
 }
 
 static void
@@ -295,22 +332,22 @@ om1_erasecols(void *cookie, int row, int
 		lmask &= rmask;
 		fill  &= lmask;
 		while (height > 0) {
-			P0(p) = (P0(p) & ~lmask) | fill;
+			*P0(p) = (*P0(p) & ~lmask) | fill;
 			p += scanspan;
 			height--;
 		}
 	} else {
 		uint8_t *q = p;
 		while (height > 0) {
-			P0(p) = (P0(p) & ~lmask) | (fill & lmask);
+			*P0(p) = (*P0(p) & ~lmask) | (fill & lmask);
 			width -= 2 * BLITWIDTH;
 			while (width > 0) {
 				p += BYTESDONE;
-				P0(p) = fill;
+				*P0(p) = fill;
 				width -= BLITWIDTH;
 			}
 			p += BYTESDONE;
-			P0(p) = (fill & rmask) | (P0(p) & ~rmask);
+			*P0(p) = (fill & rmask) | (*P0(p) & ~rmask);
 
 			p = (q += scanspan);
 			width = w + align;
@@ -350,34 +387,34 @@ om4_erasecols(void *cookie, int row, int
 		fill2 &= lmask;
 		fill3 &= lmask;
 		while (height > 0) {
-			P0(p) = (P0(p) & ~lmask) | fill0;
-			P1(p) = (P1(p) & ~lmask) | fill1;
-			P2(p) = (P2(p) & ~lmask) | fill2;
-			P3(p) = (P3(p) & ~lmask) | fill3;
+			*P0(p) = (*P0(p) & ~lmask) | fill0;
+			*P1(p) = (*P1(p) & ~lmask) | fill1;
+			*P2(p) = (*P2(p) & ~lmask) | fill2;
+			*P3(p) = (*P3(p) & ~lmask) | fill3;
 			p += scanspan;
 			height--;
 		}
 	} else {
 		uint8_t *q = p;
 		while (height > 0) {
-			P0(p) = (P0(p) & ~lmask) | (fill0 & lmask);
-			P1(p) = (P1(p) & ~lmask) | (fill1 & lmask);
-			P2(p) = (P2(p) & ~lmask) | (fill2 & lmask);
-			P3(p) = (P3(p) & ~lmask) | (fill3 & lmask);
+			*P0(p) = (*P0(p) & ~lmask) | (fill0 & lmask);
+			*P1(p) = (*P1(p) & ~lmask) | (fill1 & lmask);
+			*P2(p) = (*P2(p) & ~lmask) | (fill2 & lmask);
+			*P3(p) = (*P3(p) & ~lmask) | (fill3 & lmask);
 			width -= 2 * BLITWIDTH;
 			while (width > 0) {
 				p += BYTESDONE;
-				P0(p) = fill0;
-				P1(p) = fill1;
-				P2(p) = fill2;
-				P3(p) = fill3;
+				*P0(p) = fill0;
+				*P1(p) = fill1;
+				*P2(p) = fill2;
+				*P3(p) = fill3;
 				width -= BLITWIDTH;
 			}
 			p += BYTESDONE;
-			P0(p) = (fill0 & rmask) | (P0(p) & ~rmask);
-			P1(p) = (fill1 & rmask) | (P1(p) & ~rmask);
-			P2(p) = (fill2 & rmask) | (P2(p) & ~rmask);
-			P3(p) = (fill3 & rmask) | (P3(p) & ~rmask);
+			*P0(p) = (fill0 & rmask) | (*P0(p) & ~rmask);
+			*P1(p) = (fill1 & rmask) | (*P1(p) & ~rmask);
+			*P2(p) = (fill2 & rmask) | (*P2(p) & ~rmask);
+			*P3(p) = (fill3 & rmask) | (*P3(p) & ~rmask);
 
 			p = (q += scanspan);
 			width = w + align;
@@ -405,15 +442,15 @@ om1_eraserows(void *cookie, int startrow
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	q = p;
 	while (height > 0) {
-		P0(p) = fill;				/* always aligned */
+		*P0(p) = fill;				/* always aligned */
 		width -= 2 * BLITWIDTH;
 		while (width > 0) {
 			p += BYTESDONE;
-			P0(p) = fill;
+			*P0(p) = fill;
 			width -= BLITWIDTH;
 		}
 		p += BYTESDONE;
-		P0(p) = (fill & rmask) | (P0(p) & ~rmask);
+		*P0(p) = (fill & rmask) | (*P0(p) & ~rmask);
 		p = (q += scanspan);
 		width = w;
 		height--;
@@ -443,24 +480,24 @@ om4_eraserows(void *cookie, int startrow
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	q = p;
 	while (height > 0) {
-		P0(p) = fill0;				/* always aligned */
-		P1(p) = fill1;
-		P2(p) = fill2;
-		P3(p) = fill3;
+		*P0(p) = fill0;				/* always aligned */
+		*P1(p) = fill1;
+		*P2(p) = fill2;
+		*P3(p) = fill3;
 		width -= 2 * BLITWIDTH;
 		while (width > 0) {
 			p += BYTESDONE;
-			P0(p) = fill0;
-			P1(p) = fill1;
-			P2(p) = fill2;
-			P3(p) = fill3;
+			*P0(p) = fill0;
+			*P1(p) = fill1;
+			*P2(p) = fill2;
+			*P3(p) = fill3;
 			width -= BLITWIDTH;
 		}
 		p += BYTESDONE;
-		P0(p) = (fill0 & rmask) | (P0(p) & ~rmask);
-		P1(p) = (fill1 & rmask) | (P1(p) & ~rmask);
-		P2(p) = (fill2 & rmask) | (P2(p) & ~rmask);
-		P3(p) = (fill3 & rmask) | (P3(p) & ~rmask);
+		*P0(p) = (fill0 & rmask) | (*P0(p) & ~rmask);
+		*P1(p) = (fill1 & rmask) | (*P1(p) & ~rmask);
+		*P2(p) = (fill2 & rmask) | (*P2(p) & ~rmask);
+		*P3(p) = (fill3 & rmask) | (*P3(p) & ~rmask);
 		p = (q += scanspan);
 		width = w;
 		height--;
@@ -490,15 +527,15 @@ om1_copyrows(void *cookie, int srcrow, i
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	q = p;
 	while (height > 0) {
-		P0(p + offset) = P0(p);			/* always aligned */
+		*P0(p + offset) = *P0(p);		/* always aligned */
 		width -= 2 * BLITWIDTH;
 		while (width > 0) {
 			p += BYTESDONE;
-			P0(p + offset) = P0(p);
+			*P0(p + offset) = *P0(p);
 			width -= BLITWIDTH;
 		}
 		p += BYTESDONE;
-		P0(p + offset) = (P0(p) & rmask) | (P0(p + offset) & ~rmask);
+		*P0(p + offset) = (*P0(p) & rmask) | (*P0(p + offset) & ~rmask);
 
 		p = (q += scanspan);
 		width = w;
@@ -529,24 +566,24 @@ om4_copyrows(void *cookie, int srcrow, i
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	q = p;
 	while (height > 0) {
-		P0(p + offset) = P0(p);			/* always aligned */
-		P1(p + offset) = P1(p);
-		P2(p + offset) = P2(p);
-		P3(p + offset) = P3(p);
+		*P0(p + offset) = *P0(p);		/* always aligned */
+		*P1(p + offset) = *P1(p);
+		*P2(p + offset) = *P2(p);
+		*P3(p + offset) = *P3(p);
 		width -= 2 * BLITWIDTH;
 		while (width > 0) {
 			p += BYTESDONE;
-			P0(p + offset) = P0(p);
-			P1(p + offset) = P1(p);
-			P2(p + offset) = P2(p);
-			P3(p + offset) = P3(p);
+			*P0(p + offset) = *P0(p);
+			*P1(p + offset) = *P1(p);
+			*P2(p + offset) = *P2(p);
+			*P3(p + offset) = *P3(p);
 			width -= BLITWIDTH;
 		}
 		p += BYTESDONE;
-		P0(p + offset) = (P0(p) & rmask) | (P0(p + offset) & ~rmask);
-		P1(p + offset) = (P1(p) & rmask) | (P1(p + offset) & ~rmask);
-		P2(p + offset) = (P2(p) & rmask) | (P2(p + offset) & ~rmask);
-		P3(p + offset) = (P3(p) & rmask) | (P3(p + offset) & ~rmask);
+		*P0(p + offset) = (*P0(p) & rmask) | (*P0(p + offset) & ~rmask);
+		*P1(p + offset) = (*P1(p) & rmask) | (*P1(p + offset) & ~rmask);
+		*P2(p + offset) = (*P2(p) & rmask) | (*P2(p + offset) & ~rmask);
+		*P3(p + offset) = (*P3(p) & rmask) | (*P3(p + offset) & ~rmask);
 
 		p = (q += scanspan);
 		width = w;
@@ -628,7 +665,7 @@ om1_copycols(void *cookie, int startrow,
 
 			for (cnt = full; cnt; cnt--) {
 				GETBITS(P0(sp), sboff, 32, tmp);
-				P0(dp) = tmp;
+				*P0(dp) = tmp;
 				sp += BYTESDONE;
 				dp += BYTESDONE;
 			}
@@ -666,7 +703,7 @@ om1_copycols(void *cookie, int startrow,
 				sp -= BYTESDONE;
 				dp -= BYTESDONE;
 				GETBITS(P0(sp), sboff, 32, tmp);
-				P0(dp) = tmp;
+				*P0(dp) = tmp;
 			}
 
 			if (lmask != 0) {
@@ -770,13 +807,13 @@ om4_copycols(void *cookie, int startrow,
 
 			for (cnt = full; cnt; cnt--) {
 				GETBITS(P0(sp), sboff, 32, tmp);
-				P0(dp) = tmp;
+				*P0(dp) = tmp;
 				GETBITS(P1(sp), sboff, 32, tmp);
-				P1(dp) = tmp;
+				*P1(dp) = tmp;
 				GETBITS(P2(sp), sboff, 32, tmp);
-				P2(dp) = tmp;
+				*P2(dp) = tmp;
 				GETBITS(P3(sp), sboff, 32, tmp);
-				P3(dp) = tmp;
+				*P3(dp) = tmp;
 				sp += BYTESDONE;
 				dp += BYTESDONE;
 			}
@@ -826,13 +863,13 @@ om4_copycols(void *cookie, int startrow,
 				sp -= BYTESDONE;
 				dp -= BYTESDONE;
 				GETBITS(P0(sp), sboff, 32, tmp);
-				P0(dp) = tmp;
+				*P0(dp) = tmp;
 				GETBITS(P1(sp), sboff, 32, tmp);
-				P1(dp) = tmp;
+				*P1(dp) = tmp;
 				GETBITS(P2(sp), sboff, 32, tmp);
-				P2(dp) = tmp;
+				*P2(dp) = tmp;
 				GETBITS(P3(sp), sboff, 32, tmp);
-				P3(dp) = tmp;
+				*P3(dp) = tmp;
 			}
 
 			if (lmask != 0) {
@@ -891,7 +928,7 @@ om1_cursor(void *cookie, int on, int row
 	struct rasops_info *ri = cookie;
 	uint8_t *p;
 	int scanspan, startx, height, width, align, y;
-	uint32_t lmask, rmask, image;
+	uint32_t lmask, rmask;
 
 	if (!on) {
 		/* make sure it's on */
@@ -918,25 +955,35 @@ om1_cursor(void *cookie, int on, int row
 	rmask = ALL1BITS << (-width & ALIGNMASK);
 	if (width <= BLITWIDTH) {
 		lmask &= rmask;
+		/* set lmask as ROP mask value, with INV2 mode */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = lmask;
+
 		while (height > 0) {
-			image = P0(p);
-			P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
+			*P0(p) = ALL1BITS;
 			p += scanspan;
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	} else {
 		uint8_t *q = p;
 
 		while (height > 0) {
-			image = P0(p);
-			P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
+			/* set lmask as ROP mask value, with INV2 mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = lmask;
+			*W(p) = ALL1BITS;
+
 			p += BYTESDONE;
-			image = P0(p);
-			P0(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask);
+
+			/* set lmask as ROP mask value, with INV2 mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = rmask;
+			*W(p) = ALL1BITS;
 
 			p = (q += scanspan);
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	}
 	ri->ri_flg ^= RI_CURSOR;
 }
@@ -947,7 +994,7 @@ om4_cursor(void *cookie, int on, int row
 	struct rasops_info *ri = cookie;
 	uint8_t *p;
 	int scanspan, startx, height, width, align, y;
-	uint32_t lmask, rmask, image;
+	uint32_t lmask, rmask;
 
 	if (!on) {
 		/* make sure it's on */
@@ -972,46 +1019,45 @@ om4_cursor(void *cookie, int on, int row
 	width = ri->ri_font->fontwidth + align;
 	lmask = ALL1BITS >> align;
 	rmask = ALL1BITS << (-width & ALIGNMASK);
+
+	/* select all planes for later ROP function target */
+	*(volatile uint32_t *)OMFB_PLANEMASK = 0xff;
+
 	if (width <= BLITWIDTH) {
 		lmask &= rmask;
+		/* set lmask as ROP mask value, with INV2 mode */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = lmask;
+
 		while (height > 0) {
-			image = P0(p);
-			P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P1(p);
-			P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P2(p);
-			P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P3(p);
-			P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
+			*W(p) = ALL1BITS;
 			p += scanspan;
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	} else {
 		uint8_t *q = p;
 
 		while (height > 0) {
-			image = P0(p);
-			P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P1(p);
-			P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P2(p);
-			P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
-			image = P3(p);
-			P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask);
+			/* set lmask as ROP mask value, with INV2 mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = lmask;
+			*W(p) = ALL1BITS;
+
 			p += BYTESDONE;
-			image = P0(p);
-			P0(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask);
-			image = P1(p);
-			P1(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask);
-			image = P2(p);
-			P2(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask);
-			image = P3(p);
-			P3(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask);
+
+			/* set rmask as ROP mask value, with INV2 mode */
+			((volatile uint32_t *)OMFB_ROPFUNC)[ROP_INV2] = rmask;
+			*W(p) = ALL1BITS;
 
 			p = (q += scanspan);
 			height--;
 		}
+		/* reset mask value */
+		((volatile uint32_t *)OMFB_ROPFUNC)[ROP_THROUGH] = ALL1BITS;
 	}
+	/* select plane #0 only; XXX need this ? */
+	*(volatile uint32_t *)OMFB_PLANEMASK = 0x01;
+
 	ri->ri_flg ^= RI_CURSOR;
 }
 

Index: src/sys/arch/luna68k/dev/omrasopsvar.h
diff -u src/sys/arch/luna68k/dev/omrasopsvar.h:1.2 src/sys/arch/luna68k/dev/omrasopsvar.h:1.3
--- src/sys/arch/luna68k/dev/omrasopsvar.h:1.2	Sat Dec 28 09:17:23 2013
+++ src/sys/arch/luna68k/dev/omrasopsvar.h	Sat Oct  4 16:58:17 2014
@@ -1,30 +1,69 @@
-/* $NetBSD: omrasopsvar.h,v 1.2 2013/12/28 09:17:23 tsutsui Exp $ */
+/* $NetBSD: omrasopsvar.h,v 1.3 2014/10/04 16:58:17 tsutsui Exp $ */
+/*
+ * Copyright (c) 2013 Kenji Aoyama
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Base addresses of LUNA's frame buffer
+ * XXX: We consider only 1bpp and 4bpp for now
+ */
 
-/*-
- * Copyright (c) 2012 The NetBSD Foundation, Inc.
- * All rights reserved.
+#define OMFB_PLANEMASK	0xB1040000	/* BMSEL register */
+#define OMFB_FB_WADDR	0xB1080008	/* common plane */
+#define OMFB_FB_RADDR	0xB10C0008	/* plane #0 */
+#define OMFB_ROPFUNC	0xB12C0000	/* common ROP function */
+
+/*
+ * Helper macros
+ */
+#define W(addr)  ((uint32_t *)(addr))
+#define R(addr)  ((uint32_t *)((uint8_t *)(addr) +  0x40000))
+#define P0(addr) ((uint32_t *)((uint8_t *)(addr) +  0x40000))
+#define P1(addr) ((uint32_t *)((uint8_t *)(addr) +  0x80000))
+#define P2(addr) ((uint32_t *)((uint8_t *)(addr) +  0xC0000))
+#define P3(addr) ((uint32_t *)((uint8_t *)(addr) + 0x100000))
+
+/*
+ * ROP function
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
+ * LUNA's frame buffer uses Hitach HM53462 video RAM, which has raster
+ * (logic) operation, or ROP, function.  To use ROP function on LUNA, write
+ * a 32bit `mask' value to the specified address corresponding to each ROP
+ * logic.
  *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * D: the data writing to the video RAM
+ * M: the data already stored on the video RAM
  */
 
+/* operation		index	the video RAM contents will be */
+#define ROP_ZERO	 0	/* all 0	*/
+#define ROP_AND1	 1	/* D & M	*/ 
+#define ROP_AND2	 2	/* ~D & M	*/
+/* Not used on LUNA	 3			*/
+#define ROP_AND3	 4	/* D & ~M	*/
+#define ROP_THROUGH	 5	/* D		*/
+#define ROP_EOR		 6	/* (~D & M) | (D & ~M)	*/
+#define ROP_OR1		 7	/* D | M	*/
+#define ROP_NOR		 8	/* ~D | ~M	*/
+#define ROP_ENOR	 9	/* (D & M) | (~D & ~M)	*/
+#define ROP_INV1	10	/* ~D		*/
+#define ROP_OR2		11	/* ~D | M	*/
+#define ROP_INV2	12	/* ~M		*/
+#define ROP_OR3		13	/* D | ~M	*/
+#define ROP_NAND	14	/* ~D | ~M	*/
+#define ROP_ONE		15	/* all 1	*/
+
 int omrasops1_init(struct rasops_info *, int, int);
 int omrasops4_init(struct rasops_info *, int, int);

Reply via email to