svn commit: r274823 - in head/sys: boot/fdt/dts/mips dev/terasic/mtl mips/beri mips/conf

Brooks Davis brooks at FreeBSD.org
Fri Nov 21 21:34:23 UTC 2014


Author: brooks
Date: Fri Nov 21 21:34:19 2014
New Revision: 274823
URL: https://svnweb.freebsd.org/changeset/base/274823

Log:
  Merge from CheriBSD:
  
  commit 6d3c4c09226ad6bdd662e3e52489ef294a6ce298
      Add terasic_mtl vt(4) framebuffer driver
  
      terasic_mtl can be built with syscons(4) and vt(4) attachments, selected
      at compile time.
  
  commit 33240259b47a7c990a5a88a19f133a5600432a4c
      Clear terasic_mtl text buffer on attach
  
  commit d188c2d2412953f949624aa35cd07082830943c9
      Update terasic vt(4) driver for FreeBSD r269783
  
  commit d1cc54eee852fa4fc9d359d5bb2171d24ec73369
      Safety belt to ensure vt(4) fb parameters are correct
  
  commit 76e6d468ef45711d7952786095fc4791289ebb4b
      Improve terasic_mtl_vt fdt parsing
  
      - Use OF_getencprop to avoid need for explicit endian handling
        (submitted by ray at freebsd.org)
      - Check for expected length and correct pointer type
  
  commit 3e2524b8995ab66e8a9295e4c87cbc7126eeddf4
      Correct device_printf usage
  
  commit 9e53e3c8e0766414e25662c95b09cc51c92443b0
      Switch framebuffer to match host endianness
  
      Xorg and xf86-video-scfb work much better with a native-endian
      framebuffer.
  
  commit 0f49259d596321ed85288ac0e1fb4ee1c966df48
      Switch DE4 to vt(4) and enable kbdmux
  
  commit 5bc96ebc89db7d134ad478335090c8477c1677c7
      Add missing \n in device_printf calls
  
  Submitted by:	emaste
  Sponsored by:	DARPA, AFRL

Added:
  head/sys/dev/terasic/mtl/terasic_mtl_vt.c   (contents, props changed)
Modified:
  head/sys/boot/fdt/dts/mips/beripad-de4.dts
  head/sys/dev/terasic/mtl/terasic_mtl.c
  head/sys/dev/terasic/mtl/terasic_mtl.h
  head/sys/dev/terasic/mtl/terasic_mtl_fdt.c
  head/sys/dev/terasic/mtl/terasic_mtl_nexus.c
  head/sys/dev/terasic/mtl/terasic_mtl_reg.c
  head/sys/dev/terasic/mtl/terasic_mtl_text.c
  head/sys/mips/beri/files.beri
  head/sys/mips/conf/BERI_DE4_BASE

Modified: head/sys/boot/fdt/dts/mips/beripad-de4.dts
==============================================================================
--- head/sys/boot/fdt/dts/mips/beripad-de4.dts	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/boot/fdt/dts/mips/beripad-de4.dts	Fri Nov 21 21:34:19 2014	(r274823)
@@ -216,6 +216,7 @@
 
 		touchscreen at 70400000 {
 			compatible = "sri-cambridge,mtl";
+			panel-size = < 800 480 >;
 			reg = <0x70400000 0x1000
 			       0x70000000 0x177000
 			       0x70177000 0x2000>;

Modified: head/sys/dev/terasic/mtl/terasic_mtl.c
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl.c	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -31,11 +31,14 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_syscons.h"
+
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/condvar.h>
 #include <sys/conf.h>
 #include <sys/consio.h>				/* struct vt_mode */
+#include <sys/endian.h>
 #include <sys/fbio.h>				/* video_adapter_t */
 #include <sys/kernel.h>
 #include <sys/lock.h>
@@ -53,8 +56,8 @@ __FBSDID("$FreeBSD$");
 /*
  * Device driver for the Terasic Multitouch LCD (MTL).  Three separate
  * sub-drivers that support, respectively, access to device control registers,
- * the pixel frame buffer, and the text frame buffer.  The last of these is
- * also hooked up to syscons.
+ * the pixel frame buffer, and the text frame buffer.  The pixel frame buffer
+ * is hooked up to vt(4), and the text frame buffer to syscons(4). 
  *
  * Eventually, the frame buffer control registers and touch screen input FIFO
  * will end up being separate sub-drivers as well.
@@ -81,16 +84,27 @@ terasic_mtl_attach(struct terasic_mtl_so
 	if (error)
 		goto error;
 	/*
-	 * XXXRW: Once we've attached syscons, we can't detach it, so do it
-	 * last.
+	 * XXXRW: Once we've attached syscons or vt, we can't detach it, so do
+	 * it last.
 	 */
+#if defined(DEV_VT)
+	terasic_mtl_reg_pixel_endian_set(sc, BYTE_ORDER == BIG_ENDIAN);
+	error = terasic_mtl_fbd_attach(sc);
+	if (error)
+		goto error;
+	terasic_mtl_blend_pixel_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
+	terasic_mtl_blend_textfg_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
+	terasic_mtl_blend_textbg_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
+#endif
+#if defined(DEV_SC)
 	error = terasic_mtl_syscons_attach(sc);
 	if (error)
 		goto error;
-	terasic_mtl_blend_default_set(sc, TERASIC_MTL_COLOR_BLACK);
 	terasic_mtl_blend_pixel_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
 	terasic_mtl_blend_textfg_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
 	terasic_mtl_blend_textbg_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
+#endif
+	terasic_mtl_blend_default_set(sc, TERASIC_MTL_COLOR_BLACK);
 	return (0);
 error:
 	terasic_mtl_text_detach(sc);
@@ -103,8 +117,13 @@ void
 terasic_mtl_detach(struct terasic_mtl_softc *sc)
 {
 
-	/* XXXRW: syscons can't detach, but we try anyway, only to panic. */
+	/* XXXRW: syscons and vt can't detach, but try anyway, only to panic. */
+#if defined(DEV_SC)
 	terasic_mtl_syscons_detach(sc);
+#endif
+#if defined(DEV_VT)
+	terasic_mtl_fbd_detach(sc);
+#endif
 
 	/* All other aspects of the driver can detach just fine. */
 	terasic_mtl_text_detach(sc);

Modified: head/sys/dev/terasic/mtl/terasic_mtl.h
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl.h	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl.h	Fri Nov 21 21:34:19 2014	(r274823)
@@ -33,13 +33,17 @@
 #ifndef _DEV_TERASIC_MTL_H_
 #define	_DEV_TERASIC_MTL_H_
 
+#include "opt_syscons.h"
+
 struct terasic_mtl_softc {
+#if defined(DEV_SC)
 	/*
 	 * syscons requires that its video_adapter_t be at the front of the
 	 * softc, so place syscons fields first, which we otherwise would
 	 * probably not do.
 	 */
 	video_adapter_t	 mtl_va;
+#endif
 
 	/*
 	 * Bus-related fields.
@@ -62,7 +66,8 @@ struct terasic_mtl_softc {
 	int		 mtl_reg_rid;
 
 	/*
-	 * Graphics frame buffer device -- mappable from userspace.
+	 * Graphics frame buffer device -- mappable from userspace, and used
+	 * by the vt framebuffer interface.
 	 */
 	struct cdev	*mtl_pixel_cdev;
 	struct resource	*mtl_pixel_res;
@@ -76,6 +81,11 @@ struct terasic_mtl_softc {
 	struct resource	*mtl_text_res;
 	int		 mtl_text_rid;
 	uint16_t	*mtl_text_soft;
+
+	/*
+	 * Framebuffer hookup for vt(4).
+	 */
+	struct fb_info	 mtl_fb_info;
 };
 
 #define	TERASIC_MTL_LOCK(sc)		mtx_lock(&(sc)->mtl_lock)
@@ -106,6 +116,7 @@ struct terasic_mtl_softc {
 /*
  * Constants to help interpret various control registers.
  */
+#define	TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP	0x10000000
 #define	TERASIC_MTL_BLEND_DEFAULT_MASK		0x0f000000
 #define	TERASIC_MTL_BLEND_DEFAULT_SHIFT		24
 #define	TERASIC_MTL_BLEND_PIXEL_MASK		0x00ff0000
@@ -148,6 +159,12 @@ struct terasic_mtl_softc {
 #define	TERASIC_MTL_TEXTFRAMEBUF_ATTR_SHIFT	8
 
 /*
+ * Framebuffer constants.
+ */
+#define	TERASIC_MTL_FB_WIDTH		800
+#define	TERASIC_MTL_FB_HEIGHT		640
+
+/*
  * Alpha-blending constants.
  */
 #define	TERASIC_MTL_ALPHA_TRANSPARENT	0
@@ -164,6 +181,8 @@ extern devclass_t	terasic_mtl_devclass;
 /*
  * Sub-driver setup routines.
  */
+int	terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc);
+void	terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc);
 int	terasic_mtl_pixel_attach(struct terasic_mtl_softc *sc);
 void	terasic_mtl_pixel_detach(struct terasic_mtl_softc *sc);
 int	terasic_mtl_reg_attach(struct terasic_mtl_softc *sc);
@@ -202,6 +221,8 @@ void	terasic_mtl_blend_textfg_set(struct
 	    uint8_t alpha);
 void	terasic_mtl_blend_textbg_set(struct terasic_mtl_softc *sc,
 	    uint8_t alpha);
+void	terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc,
+	    int endian_swap);
 
 /*
  * Text frame buffer I/O routines.

Modified: head/sys/dev/terasic/mtl/terasic_mtl_fdt.c
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl_fdt.c	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl_fdt.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/terasic/mtl/terasic_mtl.h>
 
+#include "fb_if.h"
+
 static int
 terasic_mtl_fdt_probe(device_t dev)
 {
@@ -94,12 +96,12 @@ terasic_mtl_fdt_attach(device_t dev)
 		goto error;
 	}
 	if (rman_get_start(sc->mtl_reg_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper register address");
+		device_printf(dev, "improper register address\n");
 		error = ENXIO;
 		goto error;
 	}
 	if (rman_get_size(sc->mtl_reg_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper register size");
+		device_printf(dev, "improper register size\n");
 		error = ENXIO;
 		goto error;
 	}
@@ -117,12 +119,12 @@ terasic_mtl_fdt_attach(device_t dev)
 		goto error;
 	}
 	if (rman_get_start(sc->mtl_pixel_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper pixel address");
+		device_printf(dev, "improper pixel address\n");
 		error = ENXIO;
 		goto error;
 	}
 	if (rman_get_size(sc->mtl_pixel_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper pixel size");
+		device_printf(dev, "improper pixel size\n");
 		error = ENXIO;
 		goto error;
 	}
@@ -140,12 +142,12 @@ terasic_mtl_fdt_attach(device_t dev)
 		goto error;
 	}
 	if (rman_get_start(sc->mtl_text_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper text address");
+		device_printf(dev, "improper text address\n");
 		error = ENXIO;
 		goto error;
 	}
 	if (rman_get_size(sc->mtl_text_res) % PAGE_SIZE != 0) {
-		device_printf(dev, "improper text size");
+		device_printf(dev, "improper text size\n");
 		error = ENXIO;
 		goto error;
 	}
@@ -186,10 +188,20 @@ terasic_mtl_fdt_detach(device_t dev)
 	return (0);
 }
 
+static struct fb_info *
+terasic_mtl_fb_getinfo(device_t dev)
+{
+        struct terasic_mtl_softc *sc;
+
+        sc = device_get_softc(dev);
+        return (&sc->mtl_fb_info);
+}
+
 static device_method_t terasic_mtl_fdt_methods[] = {
 	DEVMETHOD(device_probe,		terasic_mtl_fdt_probe),
 	DEVMETHOD(device_attach,	terasic_mtl_fdt_attach),
 	DEVMETHOD(device_detach,	terasic_mtl_fdt_detach),
+	DEVMETHOD(fb_getinfo,		terasic_mtl_fb_getinfo),
 	{ 0, 0 }
 };
 

Modified: head/sys/dev/terasic/mtl/terasic_mtl_nexus.c
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl_nexus.c	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl_nexus.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/terasic/mtl/terasic_mtl.h>
 
+#include "fb_if.h"
+
 static int
 terasic_mtl_nexus_probe(device_t dev)
 {
@@ -76,36 +78,36 @@ terasic_mtl_nexus_attach(device_t dev)
 	 */
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "reg_maddr", &reg_maddr) != 0 || (reg_maddr % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper register address");
+		device_printf(dev, "improper register address\n");
 		return (ENXIO);
 	}
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "reg_msize", &reg_msize) != 0 || (reg_msize % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper register size");
+		device_printf(dev, "improper register size\n");
 		return (ENXIO);
 	}
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "pixel_maddr", &pixel_maddr) != 0 ||
 	    (pixel_maddr % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper pixel frame buffer address");
+		device_printf(dev, "improper pixel frame buffer address\n");
 		return (ENXIO);
 	}
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "pixel_msize", &pixel_msize) != 0 ||
 	    (pixel_msize % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper pixel frame buffer size");
+		device_printf(dev, "improper pixel frame buffer size\n");
 		return (ENXIO);
 	}
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "text_maddr", &text_maddr) != 0 ||
 	    (text_maddr % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper text frame buffer address");
+		device_printf(dev, "improper text frame buffer address\n");
 		return (ENXIO);
 	}
 	if (resource_long_value(device_get_name(dev), device_get_unit(dev),
 	    "text_msize", &text_msize) != 0 ||
 	    (text_msize % PAGE_SIZE != 0)) {
-		device_printf(dev, "improper text frame buffer size");
+		device_printf(dev, "improper text frame buffer size\n");
 		return (ENXIO);
 	}
 
@@ -177,10 +179,20 @@ terasic_mtl_nexus_detach(device_t dev)
 	return (0);
 }
 
+static struct fb_info *
+terasic_mtl_fb_getinfo(device_t dev)
+{
+	struct terasic_mtl_softc *sc;
+
+	sc = device_get_softc(dev);
+	return (&sc->mtl_fb_info);
+}
+
 static device_method_t terasic_mtl_nexus_methods[] = {
 	DEVMETHOD(device_probe,		terasic_mtl_nexus_probe),
 	DEVMETHOD(device_attach,	terasic_mtl_nexus_attach),
 	DEVMETHOD(device_detach,	terasic_mtl_nexus_detach),
+	DEVMETHOD(fb_getinfo,		terasic_mtl_fb_getinfo),
 	{ 0, 0 }
 };
 

Modified: head/sys/dev/terasic/mtl/terasic_mtl_reg.c
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl_reg.c	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl_reg.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -205,6 +205,21 @@ terasic_mtl_blend_textbg_set(struct tera
 }
 
 void
+terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc, int endian_swap)
+{
+	uint32_t v;
+
+	TERASIC_MTL_LOCK(sc);
+	terasic_mtl_reg_blend_get(sc, &v);
+	if (endian_swap)
+		v |= TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP;
+	else
+		v &= ~TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP;
+	terasic_mtl_reg_blend_set(sc, v);
+	TERASIC_MTL_UNLOCK(sc);
+}
+
+void
 terasic_mtl_reg_textcursor_get(struct terasic_mtl_softc *sc, uint8_t *colp,
     uint8_t *rowp)
 {
@@ -232,7 +247,7 @@ void
 terasic_mtl_reg_blank(struct terasic_mtl_softc *sc)
 {
 
-	device_printf(sc->mtl_dev, "%s: not yet", __func__);
+	device_printf(sc->mtl_dev, "%s: not yet\n", __func__);
 }
 
 void

Modified: head/sys/dev/terasic/mtl/terasic_mtl_text.c
==============================================================================
--- head/sys/dev/terasic/mtl/terasic_mtl_text.c	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/dev/terasic/mtl/terasic_mtl_text.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -158,6 +158,7 @@ int
 terasic_mtl_text_attach(struct terasic_mtl_softc *sc)
 {
 	uint32_t v;
+	u_int offset;
 
 	terasic_mtl_reg_textframebufaddr_get(sc, &v);
 	if (v != TERASIC_MTL_TEXTFRAMEBUF_EXPECTED_ADDR) {
@@ -165,6 +166,9 @@ terasic_mtl_text_attach(struct terasic_m
 		    "address (%08x); cannot attach\n", __func__, v);
 		return (ENXIO);
 	}
+	for (offset = 0; offset < rman_get_size(sc->mtl_text_res);
+	    offset += sizeof(uint16_t))
+		bus_write_2(sc->mtl_text_res, offset, 0);
 
 	sc->mtl_text_cdev = make_dev(&terasic_mtl_text_cdevsw, sc->mtl_unit,
 	    UID_ROOT, GID_WHEEL, 0400, "mtl_text%d", sc->mtl_unit);

Added: head/sys/dev/terasic/mtl/terasic_mtl_vt.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/terasic/mtl/terasic_mtl_vt.c	Fri Nov 21 21:34:19 2014	(r274823)
@@ -0,0 +1,133 @@
+/*-
+ * Copyright (c) 2014 Ed Maste
+ * All rights reserved.
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
+ * ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/fbio.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <dev/terasic/mtl/terasic_mtl.h>
+
+#include <dev/vt/colors/vt_termcolors.h>
+
+/*
+ * Terasic Multitouch LCD (MTL) vt(4) framebuffer driver.
+ */
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+static int
+terasic_mtl_fbd_panel_info(struct terasic_mtl_softc *sc, struct fb_info *info)
+{
+	phandle_t node;
+	pcell_t dts_value[2];
+	int len;
+
+	if ((node = ofw_bus_get_node(sc->mtl_dev)) == -1)
+		return (ENXIO);
+
+	/* panel size */
+	if ((len = OF_getproplen(node, "panel-size")) != sizeof(dts_value))
+		return (ENXIO);
+	OF_getencprop(node, "panel-size", dts_value, len);
+	info->fb_width = dts_value[0];
+	info->fb_height = dts_value[1];
+	info->fb_bpp = info->fb_depth = 32;
+	info->fb_stride = info->fb_width * (info->fb_depth / 8);
+
+	/*
+	 * Safety belt to ensure framebuffer params are as expected.  May be
+	 * removed when we have full confidence in fdt / hints params.
+	 */
+	if (info->fb_width != TERASIC_MTL_FB_WIDTH ||
+	    info->fb_height != TERASIC_MTL_FB_HEIGHT ||
+	    info->fb_stride != 3200 ||
+	    info->fb_bpp != 32 || info->fb_depth != 32) {
+		device_printf(sc->mtl_dev,
+		    "rejecting invalid panel params width=%u height=%u\n",
+		    (unsigned)info->fb_width, (unsigned)info->fb_height);
+		return (EINVAL);
+	}
+
+	return (0);
+}
+
+int
+terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc)
+{
+	struct fb_info *info;
+	device_t fbd;
+
+	info = &sc->mtl_fb_info;
+	info->fb_name = device_get_nameunit(sc->mtl_dev);
+	info->fb_pbase = rman_get_start(sc->mtl_pixel_res);
+	info->fb_size = rman_get_size(sc->mtl_pixel_res);
+	info->fb_vbase = (intptr_t)pmap_mapdev(info->fb_pbase, info->fb_size);
+	if (terasic_mtl_fbd_panel_info(sc, info) != 0) {
+		device_printf(sc->mtl_dev, "using default panel params\n");
+		info->fb_bpp = info->fb_depth = 32;
+		info->fb_width = 800;
+		info->fb_height = 480;
+		info->fb_stride = info->fb_width * (info->fb_depth / 8);
+	}
+
+	fbd = device_add_child(sc->mtl_dev, "fbd",
+	    device_get_unit(sc->mtl_dev));
+	if (fbd == NULL) {
+		device_printf(sc->mtl_dev, "Failed to attach fbd child\n");
+		return (ENXIO);
+	}
+	if (device_probe_and_attach(fbd) != 0) {
+		device_printf(sc->mtl_dev,
+		    "Failed to attach fbd device\n");
+		return (ENXIO);
+	}
+	return (0);
+}
+
+void
+terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc)
+{
+	panic("%s: detach not implemented", __func__);
+}
+
+extern device_t fbd_driver;
+extern devclass_t fbd_devclass;
+DRIVER_MODULE(fbd, terasic_mtl, fbd_driver, fbd_devclass, 0, 0);

Modified: head/sys/mips/beri/files.beri
==============================================================================
--- head/sys/mips/beri/files.beri	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/mips/beri/files.beri	Fri Nov 21 21:34:19 2014	(r274823)
@@ -16,8 +16,9 @@ dev/terasic/mtl/terasic_mtl_fdt.c	option
 dev/terasic/mtl/terasic_mtl_nexus.c	optional terasic_mtl
 dev/terasic/mtl/terasic_mtl_pixel.c	optional terasic_mtl
 dev/terasic/mtl/terasic_mtl_reg.c	optional terasic_mtl
-dev/terasic/mtl/terasic_mtl_syscons.c	optional terasic_mtl
+dev/terasic/mtl/terasic_mtl_syscons.c	optional terasic_mtl sc
 dev/terasic/mtl/terasic_mtl_text.c	optional terasic_mtl
+dev/terasic/mtl/terasic_mtl_vt.c	optional terasic_mtl vt
 mips/beri/beri_machdep.c		standard
 mips/beri/beri_pic.c			optional fdt
 mips/beri/beri_simplebus.c		optional fdt

Modified: head/sys/mips/conf/BERI_DE4_BASE
==============================================================================
--- head/sys/mips/conf/BERI_DE4_BASE	Fri Nov 21 21:30:08 2014	(r274822)
+++ head/sys/mips/conf/BERI_DE4_BASE	Fri Nov 21 21:34:19 2014	(r274823)
@@ -33,7 +33,8 @@ device		cfi
 device		cfid
 options 	CFI_SUPPORT_STRATAFLASH
 options 	ATSE_CFI_HACK
-device		sc
+device		vt
+device		kbdmux
 
 device		uart
 


More information about the svn-src-all mailing list