diff options
Diffstat (limited to 'sys/dev/vt/hw/vga/vt_vga.c')
-rw-r--r-- | sys/dev/vt/hw/vga/vt_vga.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/dev/vt/hw/vga/vt_vga.c b/sys/dev/vt/hw/vga/vt_vga.c index abddbf5..7f35053 100644 --- a/sys/dev/vt/hw/vga/vt_vga.c +++ b/sys/dev/vt/hw/vga/vt_vga.c @@ -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); |