Index: head/sys/dev/vt/hw/efifb/efifb.c =================================================================== --- head/sys/dev/vt/hw/efifb/efifb.c +++ head/sys/dev/vt/hw/efifb/efifb.c @@ -37,6 +37,9 @@ #include #include #include +#include +#include +#include #include "opt_platform.h" @@ -179,3 +182,53 @@ 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); Index: head/sys/dev/vt/hw/vga/vt_vga.c =================================================================== --- head/sys/dev/vt/hw/vga/vt_vga.c +++ head/sys/dev/vt/hw/vga/vt_vga.c @@ -36,6 +36,9 @@ #include #include #include +#include +#include +#include #include #include @@ -56,6 +59,7 @@ 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 @@ vd->vd_height = VT_VGA_HEIGHT; } vga_initialize(vd, textmode); + sc->vga_enabled = true; return (CN_INTERNAL); } @@ -1241,3 +1246,53 @@ /* 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);