mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 09:46:20 +00:00
driver_manager: add fb_boot_drv support
This commit is contained in:
parent
13690ec898
commit
aec97b7da0
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user