Module Name:    src
Committed By:   macallan
Date:           Tue May 23 10:20:12 UTC 2023

Modified Files:
        src/sys/arch/sparc/dev: cgfourteen.c

Log Message:
use macros compatible with xf86-video-suncg14 to issue SX instructions
much more readable, alignment weirdness is handled automatically and code is
interchangable


To generate a diff of this commit:
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/sparc/dev/cgfourteen.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/arch/sparc/dev/cgfourteen.c
diff -u src/sys/arch/sparc/dev/cgfourteen.c:1.93 src/sys/arch/sparc/dev/cgfourteen.c:1.94
--- src/sys/arch/sparc/dev/cgfourteen.c:1.93	Wed May 25 21:01:04 2022
+++ src/sys/arch/sparc/dev/cgfourteen.c	Tue May 23 10:20:12 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: cgfourteen.c,v 1.93 2022/05/25 21:01:04 macallan Exp $ */
+/*	$NetBSD: cgfourteen.c,v 1.94 2023/05/23 10:20:12 macallan Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -168,6 +168,19 @@ static void cg14_copycols(void *, int, i
 static void cg14_erasecols(void *, int, int, int, long);
 static void cg14_copyrows(void *, int, int, int);
 static void cg14_eraserows(void *, int, int, long);
+
+/* 
+ * issue ALU instruction:
+ * sxi(OPCODE, srcA, srcB, dest, count)
+ */
+#define sxi(inst, a, b, d, cnt) sx_write(sc->sc_sx, SX_INSTRUCTIONS, inst((a), (b), (d), (cnt)))
+
+/*
+ * issue memory referencing instruction:
+ * sxm(OPCODE, address, start register, count)
+ */
+#define sxm(inst, addr, reg, count) sta((addr) & ~7, ASI_SX, inst((reg), (count), (addr) & 7))
+
 #endif /* NSX > 0 */
 
 #endif
@@ -358,7 +371,7 @@ cgfourteenattach(device_t parent, device
 		    sc->sc_fbaddr, 0, 0, 0) & 0xfffff000;
 		aprint_normal_dev(sc->sc_dev, "using %s\n", 
 		    device_xname(sc->sc_sx->sc_dev));
-		aprint_debug_dev(sc->sc_dev, "fb paddr: %08x\n",
+		aprint_normal_dev(sc->sc_dev, "fb paddr: %08x\n",
 		    sc->sc_fb_paddr);
 		sx_write(sc->sc_sx, SX_PAGE_BOUND_LOWER, sc->sc_fb_paddr);
 		sx_write(sc->sc_sx, SX_PAGE_BOUND_UPPER,
@@ -379,7 +392,7 @@ cgfourteenattach(device_t parent, device
  * the last close. This kind of nonsense is needed to give screenblank
  * a fighting chance of working.
  */
-
+ 
 int
 cgfourteenopen(dev_t dev, int flags, int mode, struct lwp *l)
 {
@@ -567,8 +580,9 @@ cgfourteenmmap(dev_t dev, off_t off, int
 			0, prot, BUS_SPACE_MAP_LINEAR));
 	} else if (off >= CG14_SXIO_VOFF &&
 		   off < (CG14_SXIO_VOFF + 0x03ffffff)) {
+		off -= CG14_SXIO_VOFF;
 		return (bus_space_mmap(sc->sc_sx->sc_tag, 0x800000000LL,
-			sc->sc_fb_paddr + (off - CG14_SXIO_VOFF),
+			sc->sc_fb_paddr + off,
 			prot, BUS_SPACE_MAP_LINEAR));
 #endif
 	} else
@@ -1204,20 +1218,20 @@ cg14_rectfill(struct cgfourteen_softc *s
 		pptr = addr;
 		cnt = wi;
 		if (pre) {
-			sta(pptr & ~7, ASI_SX, SX_STBS(8, pre - 1, pptr & 7));
+			sxm(SX_STBS, pptr, 8, pre - 1);
 			pptr += pre;
 			cnt -= pre;
 		}
 		/* now do the aligned pixels in 32bit chunks */
 		while(cnt > 3) {
 			words = uimin(32, cnt >> 2);
-			sta(pptr & ~7, ASI_SX, SX_STS(8, words - 1, pptr & 7));
+			sxm(SX_STS, pptr, 8, words - 1);
 			pptr += words << 2;
 			cnt -= words << 2;
 		}
 		/* do any remaining pixels byte-wise again */
 		if (cnt > 0)
-			sta(pptr & ~7, ASI_SX, SX_STBS(8, cnt - 1, pptr & 7));
+			sxm(SX_STBS, pptr, 8, cnt - 1);
 		addr += stride;
 	}
 }
@@ -1275,28 +1289,25 @@ cg14_invert(struct cgfourteen_softc *sc,
 	for (line = 0; line < he; line++) {
 		pptr = addr;
 		/* load a whole scanline */
-		sta(pptr & ~7, ASI_SX, SX_LD(8, words - 1, pptr & 7));
+		sxm(SX_LD, pptr, 8, words - 1);
 		reg = 8;
 		if (pre) {
 			cg14_set_mask(sc, lmask);
-			sx_write(sc->sc_sx, SX_INSTRUCTIONS,
-			    SX_ROPB(8, 8, 40, 0));
+			sxi(SX_ROPB, 8, 8, 40, 0);
 			reg++;
 		}
 		if (cnt > 0) {
 			cg14_set_mask(sc, 0xffffffff);
 			/* XXX handle cnt > 16 */
-			sx_write(sc->sc_sx, SX_INSTRUCTIONS,
-			    SX_ROP(reg, reg, reg + 32, cnt - 1));
+			sxi(SX_ROP, reg, reg, reg + 32, cnt - 1);
 			reg += cnt;
 		}
 		if (post) {
 			cg14_set_mask(sc, rmask);
-			sx_write(sc->sc_sx, SX_INSTRUCTIONS,
-			    SX_ROPB(reg, 7, reg + 32, 0));
+			sxi(SX_ROPB, reg, 7, reg + 32, 0);
 			reg++;
 		}
-		sta(pptr & ~7, ASI_SX, SX_ST(40, words - 1, pptr & 7));		
+		sxm(SX_ST, pptr, 40, words - 1);		
 		addr += stride;
 	}
 }
@@ -1307,7 +1318,7 @@ cg14_slurp(int reg, uint32_t addr, int c
 	int num;
 	while (cnt > 0) {
 		num = uimin(32, cnt);
-		sta(addr & ~7, ASI_SX, SX_LD(reg, num - 1, addr & 7));
+		sxm(SX_LD, addr, reg, num - 1);
 		cnt -= num;
 		reg += num;
 		addr += (num << 2);
@@ -1320,7 +1331,7 @@ cg14_spit(int reg, uint32_t addr, int cn
 	int num;
 	while (cnt > 0) {
 		num = uimin(32, cnt);
-		sta(addr & ~7, ASI_SX, SX_ST(reg, num - 1, addr & 7));
+		sxm(SX_ST, addr, reg, num - 1);
 		cnt -= num;
 		reg += num;
 		addr += (num << 2);
@@ -1355,10 +1366,8 @@ cg14_bitblt(void *cookie, int xs, int ys
 			dptr = daddr;
 			cnt = wi;
 			if (pre > 0) {
-				sta(sptr & ~7, ASI_SX,
-				    SX_LDB(32, pre - 1, sptr & 7));
-				sta(dptr & ~7, ASI_SX,
-				    SX_STB(32, pre - 1, dptr & 7));
+				sxm(SX_LDB, sptr, 32, pre - 1);
+				sxm(SX_STB, dptr, 32, pre - 1);
 				cnt -= pre;
 				sptr += pre;
 				dptr += pre;
@@ -1373,10 +1382,8 @@ cg14_bitblt(void *cookie, int xs, int ys
 				cnt -= num << 2;
 			}
 			if (cnt > 0) {
-				sta(sptr & ~7, ASI_SX,
-				    SX_LDB(32, cnt - 1, sptr & 7));
-				sta(dptr & ~7, ASI_SX,
-				    SX_STB(32, cnt - 1, dptr & 7));
+				sxm(SX_LDB, sptr, 32, cnt - 1);
+				sxm(SX_STB, dptr, 32, cnt - 1);
 			}
 			saddr += skip;
 			daddr += skip;
@@ -1389,17 +1396,15 @@ cg14_bitblt(void *cookie, int xs, int ys
 			dptr = daddr;
 			cnt = wi;
 			while(cnt > 31) {
-				sta(sptr & ~7, ASI_SX, SX_LDB(32, 31, sptr & 7));
-				sta(dptr & ~7, ASI_SX, SX_STB(32, 31, dptr & 7));
+				sxm(SX_LDB, sptr, 32, 31);
+				sxm(SX_STB, dptr, 32, 31);
 				sptr += 32;
 				dptr += 32;
 				cnt -= 32;
 			}
 			if (cnt > 0) {
-				sta(sptr & ~7, ASI_SX,
-				    SX_LDB(32, cnt - 1, sptr & 7));
-				sta(dptr & ~7, ASI_SX,
-				    SX_STB(32, cnt - 1, dptr & 7));
+				sxm(SX_LDB, sptr, 32, cnt - 1);
+				sxm(SX_STB, dptr, 32, cnt - 1);
 			}
 			saddr += skip;
 			daddr += skip;
@@ -1444,22 +1449,22 @@ cg14_bitblt_gc(void *cookie, int xs, int
 	
 	for (line = 0; line < he; line++) {
 		/* read source line, in all quads */
-		sta(saddr & ~7, ASI_SX, SX_LDUQ0(8, swi - 1, saddr & 7));
+		sxm(SX_LDUQ0, saddr, 8, swi - 1);
 		/* now write it out */
 		dd = daddr;
 		r = dreg;
 		if (in > 0) {
-			sta(dd & ~7, ASI_SX, SX_STB(r, in - 1, dd & 7));
+			sxm(SX_STB, dd, r, in - 1);
 			dd += in;
 			r += in;
 		}
 		if (q > 0) {
-			sta(dd & ~7, ASI_SX, SX_STUQ0(r, q - 1, dd & 7));
+			sxm(SX_STUQ0, dd, r, q - 1);
 			r += q << 2;
 			dd += q << 2;
 		}
 		if (out > 0) {
-			sta(dd & ~7, ASI_SX, SX_STB(r, out - 1, dd & 7));
+			sxm(SX_STB, dd, r, out - 1);
 		}
 		saddr += stride;
 		daddr += stride;
@@ -1518,7 +1523,7 @@ cg14_putchar(void *cookie, int row, int 
 			for (i = 0; i < he; i++) {
 				reg = *data8;
 				cg14_set_mask(sc, reg << 24);
-				sta(addr & ~7, ASI_SX, SX_STBS(8, wi - 1, addr & 7));
+				sxm(SX_STBS, addr, 8, wi - 1);
 				data8++;
 				addr += stride;
 			}
@@ -1530,7 +1535,7 @@ cg14_putchar(void *cookie, int row, int 
 			for (i = 0; i < he; i++) {
 				reg = *data16;
 				cg14_set_mask(sc, reg << 16);
-				sta(addr & ~7, ASI_SX, SX_STBS(8, wi - 1, addr & 7));
+				sxm(SX_STBS, addr, 8, wi - 1);
 				data16++;
 				addr += stride;
 			}
@@ -1679,20 +1684,20 @@ cg14_putchar_aa(void *cookie, int row, i
 		cnt = wi;
 		if (in != 0) {
 			in = 4 - in;	/* pixels to write until aligned */
-			sta(next & ~7, ASI_SX, SX_STB(8, in - 1, next & 7));
+			sxm(SX_STB, next, 8, in - 1);
 			next += in;
 			reg = 8 + in;
 			cnt -= in;
 		}
 		q = cnt >> 2;	/* number of writes we can do in quads */
 		if (q > 0) {
-			sta(next & ~7, ASI_SX, SX_STUQ0(reg, q - 1, next & 7));
+			sxm(SX_STUQ0, next, reg, q - 1);
 			next += (q << 2);
 			cnt -= (q << 2);
 			reg += (q << 2);
 		}
 		if (cnt > 0) {
-			sta(next & ~7, ASI_SX, SX_STB(reg, cnt - 1, next & 7));
+			sxm(SX_STB, next, reg, cnt - 1);
 		}
 			
 		addr += stride;

Reply via email to