Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Dec 2014 16:46:08 +0000 (UTC)
From:      Roger Pau Monné <royger@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r276064 - in head/sys/dev/vt/hw: efifb vga
Message-ID:  <201412221646.sBMGk8dT031200@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: royger
Date: Mon Dec 22 16:46:07 2014
New Revision: 276064
URL: https://svnweb.freebsd.org/changeset/base/276064

Log:
  vt: register the memory regions used by the vt drivers
  
  Current VT drivers don't register the memory regions they use with the
  nexus. This patch makes vt_vga and vt_efifb register the memory regions they
  use.
  
  This is needed (at least) for Xen support, since the FreeBSD kernel will try
  to use the holes in the memory map to map memory from other domains and
  setup it's grant table.
  
  Sponsored by:		Citrix Systems R&D
  Reported by:		sbruno
  Tested by:		emaste
  Reviewed by:		ray
  PR:			195537
  Differential Revision:	https://reviews.freebsd.org/D1291

Modified:
  head/sys/dev/vt/hw/efifb/efifb.c
  head/sys/dev/vt/hw/vga/vt_vga.c

Modified: head/sys/dev/vt/hw/efifb/efifb.c
==============================================================================
--- head/sys/dev/vt/hw/efifb/efifb.c	Mon Dec 22 16:38:29 2014	(r276063)
+++ head/sys/dev/vt/hw/efifb/efifb.c	Mon Dec 22 16:46:07 2014	(r276064)
@@ -37,6 +37,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/fbio.h>
 #include <sys/linker.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/rman.h>
 
 #include "opt_platform.h"
 
@@ -179,3 +182,53 @@ vt_efifb_remap(void *xinfo)
 	    info->fb_size, VM_MEMATTR_WRITE_COMBINING);
 }
 
+/* Dummy NewBus functions to reserve the resources used by the efifb driver */
+static void
+vtefifb_identify(driver_t *driver, device_t parent)
+{
+
+	if (local_info.fb_pbase == 0 || local_info.fb_size == 0)
+		return;
+
+	if (BUS_ADD_CHILD(parent, 0, driver->name, 0) == NULL)
+		panic("Unable to attach vt_efifb console");
+}
+
+static int
+vtefifb_probe(device_t dev)
+{
+
+	device_set_desc(dev, "vt_efifb driver");
+	return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+vtefifb_attach(device_t dev)
+{
+	struct resource *pseudo_phys_res;
+	int res_id;
+
+	res_id = 0;
+	pseudo_phys_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
+	    &res_id, local_info.fb_pbase,
+	    local_info.fb_pbase + local_info.fb_size,
+	    local_info.fb_size, RF_ACTIVE);
+	if (pseudo_phys_res == NULL)
+		panic("Unable to reserve vt_efifb memory");
+	return (0);
+}
+
+/*-------------------- Private Device Attachment Data  -----------------------*/
+static device_method_t vtefifb_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_identify,	vtefifb_identify),
+	DEVMETHOD(device_probe,         vtefifb_probe),
+	DEVMETHOD(device_attach,        vtefifb_attach),
+
+	DEVMETHOD_END
+};
+
+DEFINE_CLASS_0(vtefifb, vtefifb_driver, vtefifb_methods, 0);
+devclass_t vtefifb_devclass;
+
+DRIVER_MODULE(vtefifb, nexus, vtefifb_driver, vtefifb_devclass, NULL, NULL);

Modified: head/sys/dev/vt/hw/vga/vt_vga.c
==============================================================================
--- head/sys/dev/vt/hw/vga/vt_vga.c	Mon Dec 22 16:38:29 2014	(r276063)
+++ head/sys/dev/vt/hw/vga/vt_vga.c	Mon Dec 22 16:46:07 2014	(r276064)
@@ -36,6 +36,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/rman.h>
 
 #include <dev/vt/vt.h>
 #include <dev/vt/hw/vga/vt_vga_reg.h>
@@ -56,6 +59,7 @@ struct vga_softc {
 	bus_space_handle_t	 vga_reg_handle;
 	int			 vga_wmode;
 	term_color_t		 vga_curfg, vga_curbg;
+	boolean_t		 vga_enabled;
 };
 
 /* Convenience macros. */
@@ -1228,6 +1232,7 @@ vga_init(struct vt_device *vd)
 		vd->vd_height = VT_VGA_HEIGHT;
 	}
 	vga_initialize(vd, textmode);
+	sc->vga_enabled = true;
 
 	return (CN_INTERNAL);
 }
@@ -1241,3 +1246,53 @@ vga_postswitch(struct vt_device *vd)
 	/* Ask vt(9) to update chars on visible area. */
 	vd->vd_flags |= VDF_INVALID;
 }
+
+/* Dummy NewBus functions to reserve the resources used by the vt_vga driver */
+static void
+vtvga_identify(driver_t *driver, device_t parent)
+{
+
+	if (!vga_conssoftc.vga_enabled)
+		return;
+
+	if (BUS_ADD_CHILD(parent, 0, driver->name, 0) == NULL)
+		panic("Unable to attach vt_vga console");
+}
+
+static int
+vtvga_probe(device_t dev)
+{
+
+	device_set_desc(dev, "vt_vga driver");
+	return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+vtvga_attach(device_t dev)
+{
+	struct resource *pseudo_phys_res;
+	int res_id;
+
+	res_id = 0;
+	pseudo_phys_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
+	    &res_id, VGA_MEM_BASE, VGA_MEM_BASE + VGA_MEM_SIZE,
+	    VGA_MEM_SIZE, RF_ACTIVE);
+	if (pseudo_phys_res == NULL)
+		panic("Unable to reserve vt_vga memory");
+	return (0);
+}
+
+/*-------------------- Private Device Attachment Data  -----------------------*/
+static device_method_t vtvga_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_identify,	vtvga_identify),
+	DEVMETHOD(device_probe,         vtvga_probe),
+	DEVMETHOD(device_attach,        vtvga_attach),
+
+	DEVMETHOD_END
+};
+
+DEFINE_CLASS_0(vtvga, vtvga_driver, vtvga_methods, 0);
+devclass_t vtvga_devclass;
+
+DRIVER_MODULE(vtvga, nexus, vtvga_driver, vtvga_devclass, NULL, NULL);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412221646.sBMGk8dT031200>