Module Name:    src
Committed By:   martin
Date:           Wed Oct 13 16:07:41 UTC 2021

Modified Files:
        src/share/man/man4/man4.amiga [netbsd-9]: amidisplaycc.4
        src/sys/arch/amiga/dev [netbsd-9]: amidisplaycc.c

Log Message:
Pull up following revision(s) (requested by abs in ticket #1359):

        sys/arch/amiga/dev/amidisplaycc.c: revision 1.33
        share/man/man4/man4.amiga/amidisplaycc.4: revision 1.14
        sys/arch/amiga/dev/amidisplaycc.c: revision 1.35
        sys/arch/amiga/dev/amidisplaycc.c: revision 1.36

Implement the WSDISPLAYIO_GET_FBINFO ioctl, needed by X wsfb driver.

Add support for WSDISPLAYIO_MODE_DUMBFB to WSDISPLAYIO_SMODE.

Remove parentheses from return. No functional changes.

Update documentation to mention current status of X11


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.13.18.1 src/share/man/man4/man4.amiga/amidisplaycc.4
cvs rdiff -u -r1.32 -r1.32.4.1 src/sys/arch/amiga/dev/amidisplaycc.c

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

Modified files:

Index: src/share/man/man4/man4.amiga/amidisplaycc.4
diff -u src/share/man/man4/man4.amiga/amidisplaycc.4:1.13 src/share/man/man4/man4.amiga/amidisplaycc.4:1.13.18.1
--- src/share/man/man4/man4.amiga/amidisplaycc.4:1.13	Sun Feb  7 14:06:04 2016
+++ src/share/man/man4/man4.amiga/amidisplaycc.4	Wed Oct 13 16:07:41 2021
@@ -22,7 +22,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $NetBSD: amidisplaycc.4,v 1.13 2016/02/07 14:06:04 wiz Exp $
+.\" $NetBSD: amidisplaycc.4,v 1.13.18.1 2021/10/13 16:07:41 martin Exp $
 .Dd November 12, 2003
 .Dt AMIDISPLAYCC 4 amiga
 .Os
@@ -43,11 +43,9 @@ operate a text terminal with virtual scr
 It uses the Amiga abstract graphic driver (grfabs) functions for
 the low-level display management.
 .Pp
-Currently it does not support running X.
-It can however coexist well enough with grf0 to make possible running
-X the old way, but be warned, you cannot switch screens while
-in X and when quitting it, it seems to hang.
-Switching a screen then will bring up the text console.
+The X11 server works in monochrome mode using the
+.Xr wsfb 4
+driver.
 .Pp
 It supports foreground and background color, and the hilite (bold),
 underline, and reverse text attributes.

Index: src/sys/arch/amiga/dev/amidisplaycc.c
diff -u src/sys/arch/amiga/dev/amidisplaycc.c:1.32 src/sys/arch/amiga/dev/amidisplaycc.c:1.32.4.1
--- src/sys/arch/amiga/dev/amidisplaycc.c:1.32	Mon Sep  3 16:29:22 2018
+++ src/sys/arch/amiga/dev/amidisplaycc.c	Wed Oct 13 16:07:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: amidisplaycc.c,v 1.32 2018/09/03 16:29:22 riastradh Exp $ */
+/*	$NetBSD: amidisplaycc.c,v 1.32.4.1 2021/10/13 16:07:41 martin Exp $ */
 
 /*-
  * Copyright (c) 2000 Jukka Andberg.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amidisplaycc.c,v 1.32 2018/09/03 16:29:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amidisplaycc.c,v 1.32.4.1 2021/10/13 16:07:41 martin Exp $");
 
 /*
  * wscons interface to amiga custom chips. Contains the necessary functions
@@ -116,7 +116,9 @@ static int amidisplaycc_setemulcmap(stru
 static int amidisplaycc_cmapioctl(view_t *, u_long, struct wsdisplay_cmap *);
 static int amidisplaycc_setcmap(view_t *, struct wsdisplay_cmap *);
 static int amidisplaycc_getcmap(view_t *, struct wsdisplay_cmap *);
-static int amidisplaycc_gfxscreen(struct amidisplaycc_softc *, int);
+static int amidisplaycc_setgfxview(struct amidisplaycc_softc *, int);
+static void amidisplaycc_initgfxview(struct amidisplaycc_softc *);
+static int amidisplaycc_getfbinfo(struct amidisplaycc_softc *, struct wsdisplayio_fbinfo *);
 
 static int amidisplaycc_setfont(struct amidisplaycc_screen *, const char *);
 static const struct wsdisplay_font * amidisplaycc_getbuiltinfont(void);
@@ -365,8 +367,6 @@ amidisplaycc_cninit(struct consdev  * cd
 	int     x;
 	int     y;
 
-	/* Yeah, we got the console! */
-
 	/*
 	 * This will do the basic stuff we also need.
 	 */
@@ -403,11 +403,11 @@ amidisplaycc_match(device_t parent, cfda
 	char *name = aux;
 
 	if (matchname("amidisplaycc", name) == 0)
-		return (0);
+		return 0;
 
 	/* Allow only one of us. */
 	if (amidisplaycc_attached)
-		return (0);
+		return 0;
 
 	return 1;
 }
@@ -542,10 +542,10 @@ amidisplaycc_mapchar(void *screen, int c
 {
 	if (ch > 0 && ch < 256) {
 		*chp = ch;
-		return (5);
+		return 5;
 	}
 	*chp = ' ';
-	return (0);
+	return 0;
 }
 
 /*
@@ -1001,7 +1001,7 @@ amidisplaycc_allocattr(void *screen, int
 #endif
 	*attrp = MAKEATTR(newfg, newbg, flags);
 
-	return (0);
+	return 0;
 }
 
 int
@@ -1014,7 +1014,7 @@ amidisplaycc_ioctl(void *dp, void *vs, u
 
 	if (adp == NULL) {
 		printf("amidisplaycc_ioctl: adp==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 
 #define UINTDATA (*(u_int*)data)
@@ -1025,49 +1025,101 @@ amidisplaycc_ioctl(void *dp, void *vs, u
 	{
 	case WSDISPLAYIO_GTYPE:
 		UINTDATA = WSDISPLAY_TYPE_AMIGACC;
-		return (0);
+		return 0;
 
 	case WSDISPLAYIO_SVIDEO:
 		dprintf("amidisplaycc: WSDISPLAYIO_SVIDEO %s\n",
 			UINTDATA ? "On" : "Off");
 
-		return (amidisplaycc_setvideo(adp, UINTDATA));
+		return amidisplaycc_setvideo(adp, UINTDATA);
 
 	case WSDISPLAYIO_GVIDEO:
 		dprintf("amidisplaycc: WSDISPLAYIO_GVIDEO\n");
 		UINTDATA = adp->ison ?
 		    WSDISPLAYIO_VIDEO_ON : WSDISPLAYIO_VIDEO_OFF;
 
-		return (0);
+		return 0;
 
 	case WSDISPLAYIO_SMODE:
-		if (INTDATA == WSDISPLAYIO_MODE_EMUL)
-			return amidisplaycc_gfxscreen(adp, 0);
-		if (INTDATA == WSDISPLAYIO_MODE_MAPPED)
-			return amidisplaycc_gfxscreen(adp, 1);
-		return (EINVAL);
+		switch (INTDATA) {
+		case WSDISPLAYIO_MODE_EMUL:
+			return amidisplaycc_setgfxview(adp, 0);
+		case WSDISPLAYIO_MODE_MAPPED:
+		case WSDISPLAYIO_MODE_DUMBFB:
+			return amidisplaycc_setgfxview(adp, 1);
+		default:
+			return EINVAL;
+		}
 
 	case WSDISPLAYIO_GINFO:
 		FBINFO.width  = adp->gfxwidth;
 		FBINFO.height = adp->gfxheight;
 		FBINFO.depth  = adp->gfxdepth;
 		FBINFO.cmsize = 1 << FBINFO.depth;
-		return (0);
+		return 0;
 
 	case WSDISPLAYIO_PUTCMAP:
 	case WSDISPLAYIO_GETCMAP:
-		return (amidisplaycc_cmapioctl(adp->gfxview,
-					       cmd,
-					       (struct wsdisplay_cmap*)data));
+		return amidisplaycc_cmapioctl(adp->gfxview, cmd,
+					       (struct wsdisplay_cmap*)data);
+	case WSDISPLAYIO_GET_FBINFO:
+		amidisplaycc_initgfxview(adp);
+		return amidisplaycc_getfbinfo(adp, data);
 	}
 
-	return (EPASSTHROUGH);
+	return EPASSTHROUGH;
 
 #undef UINTDATA
 #undef INTDATA
 #undef FBINFO
 }
 
+static int
+amidisplaycc_getfbinfo(struct amidisplaycc_softc *adp, struct wsdisplayio_fbinfo *fbinfo)
+{
+	bmap_t *bm;
+
+	KASSERT(adp);
+
+	if (adp->gfxview == NULL) {
+		return ENOMEM;
+	}
+
+	bm = adp->gfxview->bitmap;
+	KASSERT(bm);
+
+	/* Depth 1 since current X wsfb driver doesn't support multiple bitplanes */
+	memset(fbinfo, 0, sizeof(*fbinfo));
+	fbinfo->fbi_fbsize = bm->bytes_per_row * bm->rows;
+	fbinfo->fbi_fboffset = 0;
+	fbinfo->fbi_width = bm->bytes_per_row * 8;
+	fbinfo->fbi_height = bm->rows;
+	fbinfo->fbi_stride = bm->bytes_per_row;
+	fbinfo->fbi_bitsperpixel = 1;
+	fbinfo->fbi_pixeltype = WSFB_CI;
+	fbinfo->fbi_flags = 0;
+	fbinfo->fbi_subtype.fbi_cmapinfo.cmap_entries = 1 << adp->gfxdepth;
+
+	return 0;
+}
+
+/*
+ * Initialize (but not display) the view used for graphics.
+ */
+static void
+amidisplaycc_initgfxview(struct amidisplaycc_softc *adp)
+{
+	dimen_t dimension;
+
+	if (adp->gfxview == NULL) {
+		/* First time here, create the screen */
+		dimension.width = adp->gfxwidth;
+		dimension.height = adp->gfxheight;
+		adp->gfxview = grf_alloc_view(NULL,
+			&dimension,
+			adp->gfxdepth);
+	}
+}
 
 /*
  * Switch to either emulation (text) or mapped (graphics) mode
@@ -1076,18 +1128,15 @@ amidisplaycc_ioctl(void *dp, void *vs, u
  *
  * Once the extra screen is created, it never goes away.
  */
-
 static int
-amidisplaycc_gfxscreen(struct amidisplaycc_softc *adp, int on)
+amidisplaycc_setgfxview(struct amidisplaycc_softc *adp, int on)
 {
-	dimen_t  dimension;
-
 	dprintf("amidisplaycc: switching to %s mode.\n",
 		on ? "mapped" : "emul");
 
 	/* Current mode same as requested mode? */
 	if ( (on > 0) == (adp->gfxon > 0) )
-		return (0);
+		return 0;
 
 	if (!on) {
 		/*
@@ -1101,26 +1150,11 @@ amidisplaycc_gfxscreen(struct amidisplay
 		else if (adp->gfxview)
 			grf_remove_view(adp->gfxview);
 
-		return (0);
+		return 0;
 	}
 
 	/* switch to mapped mode then */
-
-	if (adp->gfxview == NULL) {
-		/* First time here, create the screen */
-
-		dimension.width = adp->gfxwidth;
-		dimension.height = adp->gfxheight;
-
-		dprintf("amidisplaycc: preparing mapped screen %dx%dx%d\n",
-			dimension.width,
-			dimension.height,
-			adp->gfxdepth);
-
-		adp->gfxview = grf_alloc_view(NULL,
-					      &dimension,
-					      adp->gfxdepth);
-	}
+	amidisplaycc_initgfxview(adp);
 
 	if (adp->gfxview) {
 		adp->gfxon = 1;
@@ -1128,9 +1162,9 @@ amidisplaycc_gfxscreen(struct amidisplay
 		grf_display_view(adp->gfxview);
 	} else {
 		printf("amidisplaycc: failed to make mapped screen\n");
-		return (ENOMEM);
+		return ENOMEM;
 	}
-	return (0);
+	return 0;
 }
 
 /*
@@ -1212,9 +1246,9 @@ amidisplaycc_alloc_screen(void *dp, cons
 
 	/* Sanity checks because of fixed buffers */
 	if (depth > MAXDEPTH || maxcolor >= MAXCOLORS)
-		return (ENOMEM);
+		return ENOMEM;
 	if (screenp->nrows > MAXROWS)
-		return (ENOMEM);
+		return ENOMEM;
 
 	fontwidth = screenp->fontwidth;
 	fontheight = screenp->fontheight;
@@ -1229,7 +1263,7 @@ amidisplaycc_alloc_screen(void *dp, cons
 
 	view = grf_alloc_view(NULL, &dimension, depth);
 	if (view == NULL)
-		return (ENOMEM);
+		return ENOMEM;
 
 	/*
 	 * First screen gets the statically allocated console screen.
@@ -1348,7 +1382,7 @@ amidisplaycc_alloc_screen(void *dp, cons
 			scr->wsfont->name);
 	}
 
-	return (0);
+	return 0;
 }
 
 
@@ -1404,11 +1438,11 @@ amidisplaycc_show_screen(void *dp, void 
 
 	if (adp == NULL) {
 		dprintf("amidisplaycc_show_screen: adp==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 	if (scr == NULL) {
 		dprintf("amidisplaycc_show_screen: scr==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 
 	if (adp->gfxon) {
@@ -1421,7 +1455,7 @@ amidisplaycc_show_screen(void *dp, void 
 
 	grf_display_view(scr->view);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1447,7 +1481,7 @@ amidisplaycc_load_font(void *dp, void *c
 	if (font->data)
 	{
 		/* request to load the font, not supported */
-		return (EINVAL);
+		return EINVAL;
 	}
 	else
 	{
@@ -1466,11 +1500,11 @@ amidisplaycc_setvideo(struct amidisplayc
 
 	if (adp == NULL) {
 		dprintf("amidisplaycc_setvideo: adp==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 	if (adp->currentscreen == NULL) {
 		dprintf("amidisplaycc_setvideo: adp->currentscreen==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 
 	/* select graphics or emulation screen */
@@ -1494,7 +1528,7 @@ amidisplaycc_setvideo(struct amidisplayc
 		adp->ison = 0;
 	}
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1517,10 +1551,10 @@ amidisplaycc_cmapioctl(view_t *view, u_l
 	if (cmap->index >= MAXCOLORS ||
 	    cmap->count > MAXCOLORS ||
 	    cmap->index + cmap->count > MAXCOLORS)
-		return (EINVAL);
+		return EINVAL;
 
 	if (cmap->count == 0)
-		return (0);
+		return 0;
 
 	tmpcmap.index = cmap->index;
 	tmpcmap.count = cmap->count;
@@ -1533,15 +1567,15 @@ amidisplaycc_cmapioctl(view_t *view, u_l
 
 		err = copyin(cmap->red, cmred, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
 		err = copyin(cmap->green, cmgrn, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
 		err = copyin(cmap->blue, cmblu, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
 		return amidisplaycc_setcmap(view, &tmpcmap);
 
@@ -1549,26 +1583,26 @@ amidisplaycc_cmapioctl(view_t *view, u_l
 
 		err = amidisplaycc_getcmap(view, &tmpcmap);
 		if (err)
-			return (err);
+			return err;
 
 		/* copy data to user space */
 
 		err = copyout(cmred, cmap->red, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
 		err = copyout(cmgrn, cmap->green, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
 		err = copyout(cmblu, cmap->blue, cmap->count);
 		if (err)
-			return (err);
+			return err;
 
-		return (0);
+		return 0;
 
 	} else
-		return (EPASSTHROUGH);
+		return EPASSTHROUGH;
 }
 
 /*
@@ -1608,7 +1642,7 @@ amidisplaycc_setemulcmap(struct amidispl
 
 	rc = amidisplaycc_getcmap(scr->view, &tmpcmap);
 	if (rc)
-		return (rc);
+		return rc;
 
 	for (i = cmap->index ; i < cmap->index + cmap->count ; i++) {
 
@@ -1619,9 +1653,9 @@ amidisplaycc_setemulcmap(struct amidispl
 
 	rc = amidisplaycc_setcmap(scr->view, &tmpcmap);
 	if (rc)
-		return (rc);
+		return rc;
 
-	return (0);
+	return 0;
 }
 
 
@@ -1641,11 +1675,11 @@ amidisplaycc_setcmap(view_t *view, struc
 	colormap_t  cm;
 
 	if (view == NULL)
-		return (EINVAL);
+		return EINVAL;
 
 	if (!cmap || !cmap->red || !cmap->green || !cmap->blue) {
 		dprintf("amidisplaycc_setcmap: other==NULL\n");
-		return (EINVAL);
+		return EINVAL;
 	}
 
 	index  = cmap->index;
@@ -1653,10 +1687,10 @@ amidisplaycc_setcmap(view_t *view, struc
 	colors = (1 << view->bitmap->depth);
 
 	if (count > colors || index >= colors || index + count > colors)
-		return (EINVAL);
+		return EINVAL;
 
 	if (count == 0)
-		return (0);
+		return 0;
 
 	cm.entry = cmentries;
 	cm.first = index;
@@ -1669,7 +1703,7 @@ amidisplaycc_setcmap(view_t *view, struc
 
 	err = grf_get_colormap(view, &cm);
 	if (err)
-		return (err);
+		return err;
 
 	/*
 	 * The palette entries from wscons contain 8 bits per gun.
@@ -1705,7 +1739,7 @@ amidisplaycc_setcmap(view_t *view, struc
 				 cmap->green[c] +
 				 cmap->blue[c]) / 3 / grey_div);
 	} else
-		return (EINVAL); /* Hmhh */
+		return EINVAL; /* Hmhh */
 
 	/*
 	 * Now we have a new colormap that contains all the entries. Set
@@ -1716,7 +1750,7 @@ amidisplaycc_setcmap(view_t *view, struc
 	if (err)
 		return err;
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1735,20 +1769,20 @@ amidisplaycc_getcmap(view_t *view, struc
 	colormap_t  cm;
 
 	if (view == NULL)
-		return (EINVAL);
+		return EINVAL;
 
 	if (!cmap || !cmap->red || !cmap->green || !cmap->blue)
-		return (EINVAL);
+		return EINVAL;
 
 	index  = cmap->index;
 	count  = cmap->count;
 	colors = (1 << view->bitmap->depth);
 
 	if (count > colors || index >= colors || index + count > colors)
-		return (EINVAL);
+		return EINVAL;
 
 	if (count == 0)
-		return (0);
+		return 0;
 
 	cm.entry = cmentries;
 	cm.first = index;
@@ -1756,7 +1790,7 @@ amidisplaycc_getcmap(view_t *view, struc
 
 	err = grf_get_colormap(view, &cm);
 	if (err)
-		return (err);
+		return err;
 
 	/*
 	 * Copy color data to wscons-style structure. Translate to
@@ -1791,9 +1825,9 @@ amidisplaycc_getcmap(view_t *view, struc
 				CM_GET_GREY(cm.entry[index+c]);
 		}
 	} else
-		return (EINVAL);
+		return EINVAL;
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1823,11 +1857,11 @@ amidisplaycc_setfont(struct amidisplaycc
 		WSFONT_FIND_BITMAP);
 
 	if (wsfontcookie == -1)
-		return (EINVAL);
+		return EINVAL;
 
 	/* Suitable font found. Now lock it. */
 	if (wsfont_lock(wsfontcookie, &wsfont))
-		return (EINVAL);
+		return EINVAL;
 
 	KASSERT(wsfont);
 
@@ -1837,7 +1871,7 @@ amidisplaycc_setfont(struct amidisplaycc
 	scr->wsfont = wsfont;
 	scr->wsfontcookie = wsfontcookie;
 	
-	return (0);
+	return 0;
 }
 
 /*
@@ -1910,7 +1944,7 @@ amidisplaycc_cnputc(dev_t cd, int ch)
 int
 amidisplaycc_cngetc(dev_t cd)
 {
-	return (0);
+	return 0;
 }
 
 /* ARGSUSED */

Reply via email to