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>