From aec97b7da0f4b2b1be633a877b4f8a1797f11122 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 25 Oct 2017 22:30:32 +0200 Subject: [PATCH] driver_manager: add fb_boot_drv support --- .../recipes/pkg/drivers_managed-pc/archives | 1 + repos/gems/src/app/driver_manager/main.cc | 74 ++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/repos/gems/recipes/pkg/drivers_managed-pc/archives b/repos/gems/recipes/pkg/drivers_managed-pc/archives index c5a5c8a7a..44f4ebf35 100644 --- a/repos/gems/recipes/pkg/drivers_managed-pc/archives +++ b/repos/gems/recipes/pkg/drivers_managed-pc/archives @@ -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 diff --git a/repos/gems/src/app/driver_manager/main.cc b/repos/gems/src/app/driver_manager/main.cc index 098fb21be..36b87e70f 100644 --- a/repos/gems/src/app/driver_manager/main.cc +++ b/repos/gems/src/app/driver_manager/main.cc @@ -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(xml); + xml.node("route", [&] () { + _gen_config_route(xml, "fb_drv.config"); + _gen_default_parent_route(xml); + }); + }); + _gen_forwarded_service(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; Constructible _vesa_fb_driver; + Constructible _boot_fb_driver; Constructible _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
_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);