driver_manager: add fb_boot_drv support

This commit is contained in:
Alexander Boettcher 2017-10-25 22:30:32 +02:00 committed by Christian Helmuth
parent 13690ec898
commit aec97b7da0
2 changed files with 74 additions and 1 deletions

View File

@ -5,6 +5,7 @@ _/src/usb_drv
_/src/usb_block_drv
_/src/vesa_drv
_/src/intel_fb_drv
_/src/boot_fb_drv
_/src/ahci_drv
_/src/fs_report
_/src/fs_rom

View File

@ -33,6 +33,7 @@ namespace Driver_manager {
struct Device_driver;
struct Intel_fb_driver;
struct Vesa_fb_driver;
struct Boot_fb_driver;
struct Ahci_driver;
struct Priority { int value; };
@ -156,6 +157,47 @@ struct Driver_manager::Vesa_fb_driver : Device_driver
};
struct Driver_manager::Boot_fb_driver : Device_driver
{
Ram_quota const _ram_quota;
struct Mode
{
unsigned _width = 0, _height = 0, _bpp = 0;
Mode() { }
Mode(Xml_node node)
:
_width (node.attribute_value("width", 0U)),
_height(node.attribute_value("height", 0U)),
_bpp (node.attribute_value("bpp", 0U))
{ }
size_t num_bytes() const { return _width * _height * _bpp/8 + 512*1024; }
bool valid() const { return _width*_height*_bpp != 0; }
};
Boot_fb_driver(Mode const mode) : _ram_quota(Ram_quota{mode.num_bytes()}) { }
void generate_start_node(Xml_generator &xml) const override
{
xml.node("start", [&] () {
_gen_common_start_node_content(xml, "fb_boot_drv", "fb_boot_drv",
_ram_quota, Cap_quota{100},
Priority{-1});
_gen_provides_node<Framebuffer::Session>(xml);
xml.node("route", [&] () {
_gen_config_route(xml, "fb_drv.config");
_gen_default_parent_route(xml);
});
});
_gen_forwarded_service<Framebuffer::Session>(xml, "fb_boot_drv");
}
};
struct Driver_manager::Ahci_driver : Device_driver
{
void generate_start_node(Xml_generator &xml) const override
@ -203,6 +245,7 @@ struct Driver_manager::Main : Block_devices_generator
{
Env &_env;
Attached_rom_dataspace _platform { _env, "platform_info" };
Attached_rom_dataspace _init_state { _env, "init_state" };
Attached_rom_dataspace _usb_devices { _env, "usb_devices" };
Attached_rom_dataspace _pci_devices { _env, "pci_devices" };
@ -214,8 +257,18 @@ struct Driver_manager::Main : Block_devices_generator
Constructible<Intel_fb_driver> _intel_fb_driver;
Constructible<Vesa_fb_driver> _vesa_fb_driver;
Constructible<Boot_fb_driver> _boot_fb_driver;
Constructible<Ahci_driver> _ahci_driver;
Boot_fb_driver::Mode _boot_fb_mode() const
{
try {
Xml_node fb = _platform.xml().sub_node("boot").sub_node("framebuffer");
return Boot_fb_driver::Mode(fb);
} catch (...) { }
return Boot_fb_driver::Mode();
}
void _handle_pci_devices_update();
Signal_handler<Main> _pci_devices_update_handler {
@ -269,10 +322,16 @@ void Driver_manager::Main::_handle_pci_devices_update()
{
_pci_devices.update();
/* decide about fb not before the first valid pci report is available */
if (!_pci_devices.valid())
return;
bool has_vga = false;
bool has_intel_graphics = false;
bool has_ahci = false;
Boot_fb_driver::Mode const boot_fb_mode = _boot_fb_mode();
_pci_devices.xml().for_each_sub_node([&] (Xml_node device) {
uint16_t const vendor_id = device.attribute_value("vendor_id", 0UL);
@ -297,11 +356,21 @@ void Driver_manager::Main::_handle_pci_devices_update()
if (!_intel_fb_driver.constructed() && has_intel_graphics) {
_intel_fb_driver.construct();
_vesa_fb_driver.destruct();
_boot_fb_driver.destruct();
_generate_init_config(_init_config);
}
if (!_vesa_fb_driver.constructed() && has_vga && !has_intel_graphics) {
if (!_boot_fb_driver.constructed() && boot_fb_mode.valid() && !has_intel_graphics) {
_intel_fb_driver.destruct();
_vesa_fb_driver.destruct();
_boot_fb_driver.construct(boot_fb_mode);
_generate_init_config(_init_config);
}
if (!_vesa_fb_driver.constructed() && has_vga && !has_intel_graphics &&
!boot_fb_mode.valid()) {
_intel_fb_driver.destruct();
_boot_fb_driver.destruct();
_vesa_fb_driver.construct();
_generate_init_config(_init_config);
}
@ -358,6 +427,9 @@ void Driver_manager::Main::_generate_init_config(Reporter &init_config) const
if (_vesa_fb_driver.constructed())
_vesa_fb_driver->generate_start_node(xml);
if (_boot_fb_driver.constructed())
_boot_fb_driver->generate_start_node(xml);
if (_ahci_driver.constructed())
_ahci_driver->generate_start_node(xml);